//# 10 errors, 557 messages
//#
/*
    //#ConfigSource.java:1:1: class: com.dmdirc.config.ConfigSource
    //#ConfigSource.java:1:1: method: com.dmdirc.config.ConfigSource.com.dmdirc.config.ConfigSource__static_init
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.config;

import com.dmdirc.ui.messages.ColourManager;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Defines methods to get options from a config source in various forms.
 *
 * @author chris
 */
public abstract class ConfigSource {
    //#ConfigSource.java:37: method: void com.dmdirc.config.ConfigSource.com.dmdirc.config.ConfigSource()
    //#ConfigSource.java:37: end of method: void com.dmdirc.config.ConfigSource.com.dmdirc.config.ConfigSource()

    /**
     * Retrieves the specified option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @return The value of the option
     */
    public abstract String getOption(final String domain, final String option);

    /**
     * Determines if this manager has the specified option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @return True iff the option exists, false otherwise.
     */
    protected abstract boolean hasOption(final String domain, final String option);

    /**
     * Determines if this manager has the specified String option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @since 0.6.3m1
     * @return True iff the option exists and is not empty, false otherwise
     */
    public boolean hasOptionString(final String domain, final String option) {
        return hasOption(domain, option) && !getOption(domain, option).isEmpty();
    //#ConfigSource.java:66: method: bool com.dmdirc.config.ConfigSource.hasOptionString(String, String)
    //#ConfigSource.java:66: ?null dereference
    //#    getOption(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: bool hasOptionString(String, String)
    //#    basic block: bb_2
    //#    assertion: getOption(...) != null
    //#    VN: getOption(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ConfigSource.java:66: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: bool hasOptionString(String, String)
    //#    suspicious precondition index: [7]
    //#input(bool hasOptionString(String, String)): "."._tainted
    //#input(bool hasOptionString(String, String)): "Config option not found: "._tainted
    //#input(bool hasOptionString(String, String)): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(bool hasOptionString(String, String)): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(bool hasOptionString(String, String)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool hasOptionString(String, String)): __Descendant_Table[others]
    //#input(bool hasOptionString(String, String)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionString(String, String)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionString(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionString(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionString(String, String)): com/dmdirc/config/ConfigManager.stats
    //#input(bool hasOptionString(String, String)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool hasOptionString(String, String)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(bool hasOptionString(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionString(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionString(String, String)): domain
    //#input(bool hasOptionString(String, String)): domain._tainted
    //#input(bool hasOptionString(String, String)): option
    //#input(bool hasOptionString(String, String)): option._tainted
    //#input(bool hasOptionString(String, String)): this
    //#input(bool hasOptionString(String, String)): this.__Tag
    //#input(bool hasOptionString(String, String)): this.file
    //#input(bool hasOptionString(String, String)): this.sources
    //#output(bool hasOptionString(String, String)): return_value
    //#pre[7] (bool hasOptionString(String, String)): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#presumption(bool hasOptionString(String, String)): java.util.Map:get(...)@336 != null
    //#post(bool hasOptionString(String, String)): init'ed(return_value)
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:hasOption
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:getOption
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(bool hasOptionString(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#ConfigSource.java:66: end of method: bool com.dmdirc.config.ConfigSource.hasOptionString(String, String)
    }

    /**
     * Determines if this manager has the specified integer option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @since 0.6.3m1
     * @return True iff the option exists and is parsable as an integer,
     * false otherwise.
     */
    public boolean hasOptionInt(final String domain, final String option) {
        if (hasOption(domain, option)) {
    //#ConfigSource.java:79: method: bool com.dmdirc.config.ConfigSource.hasOptionInt(String, String)
    //#ConfigSource.java:79: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: bool hasOptionInt(String, String)
    //#    suspicious precondition index: [7]
    //#input(bool hasOptionInt(String, String)): "."._tainted
    //#input(bool hasOptionInt(String, String)): "Config option not found: "._tainted
    //#input(bool hasOptionInt(String, String)): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(bool hasOptionInt(String, String)): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(bool hasOptionInt(String, String)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool hasOptionInt(String, String)): __Descendant_Table[others]
    //#input(bool hasOptionInt(String, String)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionInt(String, String)): __Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I
    //#input(bool hasOptionInt(String, String)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionInt(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionInt(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I
    //#input(bool hasOptionInt(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionInt(String, String)): com/dmdirc/config/ConfigManager.stats
    //#input(bool hasOptionInt(String, String)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool hasOptionInt(String, String)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(bool hasOptionInt(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionInt(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I
    //#input(bool hasOptionInt(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionInt(String, String)): domain
    //#input(bool hasOptionInt(String, String)): domain._tainted
    //#input(bool hasOptionInt(String, String)): option
    //#input(bool hasOptionInt(String, String)): option._tainted
    //#input(bool hasOptionInt(String, String)): this
    //#input(bool hasOptionInt(String, String)): this.__Tag
    //#input(bool hasOptionInt(String, String)): this.file
    //#input(bool hasOptionInt(String, String)): this.sources
    //#output(bool hasOptionInt(String, String)): return_value
    //#pre[7] (bool hasOptionInt(String, String)): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#post(bool hasOptionInt(String, String)): init'ed(return_value)
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:hasOption
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:getOption
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(bool hasOptionInt(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
            try {
                getOptionInt(domain, option);
                return true;
            } catch (NumberFormatException ex) {
                // Do nothing
            }
        }

        return false;
    //#ConfigSource.java:88: end of method: bool com.dmdirc.config.ConfigSource.hasOptionInt(String, String)
    }

    /**
     * Determines if this manager has the specified character option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @since 0.6.3m1
     * @return True iff the option exists and is parsable as a char,
     * false otherwise.
     */
    public boolean hasOptionChar(final String domain, final String option) {
        return hasOption(domain, option) && !getOption(domain, option).isEmpty();
    //#ConfigSource.java:101: method: bool com.dmdirc.config.ConfigSource.hasOptionChar(String, String)
    //#ConfigSource.java:101: ?null dereference
    //#    getOption(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: bool hasOptionChar(String, String)
    //#    basic block: bb_2
    //#    assertion: getOption(...) != null
    //#    VN: getOption(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ConfigSource.java:101: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: bool hasOptionChar(String, String)
    //#    suspicious precondition index: [7]
    //#input(bool hasOptionChar(String, String)): "."._tainted
    //#input(bool hasOptionChar(String, String)): "Config option not found: "._tainted
    //#input(bool hasOptionChar(String, String)): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(bool hasOptionChar(String, String)): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(bool hasOptionChar(String, String)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool hasOptionChar(String, String)): __Descendant_Table[others]
    //#input(bool hasOptionChar(String, String)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionChar(String, String)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionChar(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionChar(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionChar(String, String)): com/dmdirc/config/ConfigManager.stats
    //#input(bool hasOptionChar(String, String)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool hasOptionChar(String, String)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(bool hasOptionChar(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionChar(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionChar(String, String)): domain
    //#input(bool hasOptionChar(String, String)): domain._tainted
    //#input(bool hasOptionChar(String, String)): option
    //#input(bool hasOptionChar(String, String)): option._tainted
    //#input(bool hasOptionChar(String, String)): this
    //#input(bool hasOptionChar(String, String)): this.__Tag
    //#input(bool hasOptionChar(String, String)): this.file
    //#input(bool hasOptionChar(String, String)): this.sources
    //#output(bool hasOptionChar(String, String)): return_value
    //#pre[7] (bool hasOptionChar(String, String)): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#presumption(bool hasOptionChar(String, String)): java.util.Map:get(...)@336 != null
    //#post(bool hasOptionChar(String, String)): init'ed(return_value)
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:hasOption
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:getOption
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(bool hasOptionChar(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#ConfigSource.java:101: end of method: bool com.dmdirc.config.ConfigSource.hasOptionChar(String, String)
    }

    /**
     * Determines if this manager has the specified colour option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @since 0.6.3m1
     * @return True iff the option exists and is parsable as a colour,
     * false otherwise.
     */
    public boolean hasOptionColour(final String domain, final String option) {
        return getOptionColour(domain, option) != null;
    //#ConfigSource.java:114: method: bool com.dmdirc.config.ConfigSource.hasOptionColour(String, String)
    //#ConfigSource.java:114: ?precondition failure
    //#    com/dmdirc/config/ConfigSource.getOptionColour: (soft) init'ed(fallbacks[0])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: bool hasOptionColour(String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(undefined)
    //#    callee: Color com/dmdirc/config/ConfigSource.getOptionColour(String, String, String[])
    //#    callee assertion: (soft) init'ed(fallbacks[0])
    //#    callee file: ConfigSource.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 142
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
    //#ConfigSource.java:114: ?precondition failure
    //#    com/dmdirc/config/ConfigSource.getOptionColour: (soft) init'ed(fallbacks[1])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: bool hasOptionColour(String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(undefined)
    //#    callee: Color com/dmdirc/config/ConfigSource.getOptionColour(String, String, String[])
    //#    callee assertion: (soft) init'ed(fallbacks[1])
    //#    callee file: ConfigSource.java
    //#    callee precondition index: [7]
    //#    callee srcpos: 142
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
    //#ConfigSource.java:114: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: bool hasOptionColour(String, String)
    //#    suspicious precondition index: [7]
    //#input(bool hasOptionColour(String, String)): "."._tainted
    //#input(bool hasOptionColour(String, String)): "Config option not found: "._tainted
    //#input(bool hasOptionColour(String, String)): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(bool hasOptionColour(String, String)): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(bool hasOptionColour(String, String)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool hasOptionColour(String, String)): __Descendant_Table[others]
    //#input(bool hasOptionColour(String, String)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionColour(String, String)): __Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color;
    //#input(bool hasOptionColour(String, String)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionColour(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionColour(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color;
    //#input(bool hasOptionColour(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionColour(String, String)): com/dmdirc/config/ConfigManager.stats
    //#input(bool hasOptionColour(String, String)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool hasOptionColour(String, String)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(bool hasOptionColour(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool hasOptionColour(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color;
    //#input(bool hasOptionColour(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool hasOptionColour(String, String)): domain
    //#input(bool hasOptionColour(String, String)): domain._tainted
    //#input(bool hasOptionColour(String, String)): option
    //#input(bool hasOptionColour(String, String)): option._tainted
    //#input(bool hasOptionColour(String, String)): this
    //#input(bool hasOptionColour(String, String)): this.__Tag
    //#input(bool hasOptionColour(String, String)): this.file
    //#input(bool hasOptionColour(String, String)): this.sources
    //#output(bool hasOptionColour(String, String)): return_value
    //#pre[7] (bool hasOptionColour(String, String)): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#pre[9] (bool hasOptionColour(String, String)): this.sources != null
    //#post(bool hasOptionColour(String, String)): init'ed(return_value)
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:hasOption
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:getOption
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:getOptionColour
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.util.Arrays:copyOfRange
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:com.dmdirc.ui.messages.ColourManager:parseColour
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(bool hasOptionColour(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#ConfigSource.java:114: end of method: bool com.dmdirc.config.ConfigSource.hasOptionColour(String, String)
    }

    /**
     * Retrieves the specified option as a character.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @return The value of the option
     */
    public char getOptionChar(final String domain, final String option) {
        return getOption(domain, option).charAt(0);
    //#ConfigSource.java:125: method: char com.dmdirc.config.ConfigSource.getOptionChar(String, String)
    //#ConfigSource.java:125: ?null dereference
    //#    getOption(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: char getOptionChar(String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: getOption(...) != null
    //#    VN: getOption(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ConfigSource.java:125: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: char getOptionChar(String, String)
    //#    suspicious precondition index: [7]
    //#input(char getOptionChar(String, String)): "."._tainted
    //#input(char getOptionChar(String, String)): "Config option not found: "._tainted
    //#input(char getOptionChar(String, String)): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(char getOptionChar(String, String)): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(char getOptionChar(String, String)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(char getOptionChar(String, String)): __Descendant_Table[others]
    //#input(char getOptionChar(String, String)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(char getOptionChar(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(char getOptionChar(String, String)): com/dmdirc/config/ConfigManager.stats
    //#input(char getOptionChar(String, String)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(char getOptionChar(String, String)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(char getOptionChar(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(char getOptionChar(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(char getOptionChar(String, String)): domain
    //#input(char getOptionChar(String, String)): domain._tainted
    //#input(char getOptionChar(String, String)): option
    //#input(char getOptionChar(String, String)): option._tainted
    //#input(char getOptionChar(String, String)): this
    //#input(char getOptionChar(String, String)): this.__Tag
    //#input(char getOptionChar(String, String)): this.file
    //#input(char getOptionChar(String, String)): this.sources
    //#output(char getOptionChar(String, String)): return_value
    //#pre[7] (char getOptionChar(String, String)): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#presumption(char getOptionChar(String, String)): java.util.Map:get(...)@336 != null
    //#post(char getOptionChar(String, String)): init'ed(return_value)
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:hasOption
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:getOption
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(char getOptionChar(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#ConfigSource.java:125: end of method: char com.dmdirc.config.ConfigSource.getOptionChar(String, String)
    }
    
    /**
     * Retrieves a colour representation of the specified option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @param fallbacks An ordered array of further domains and options
     * (in pairs) to try if the specified domain/option isn't found
     * @return The colour representation of the option
     * @since 0.6.3m1
     */
    public Color getOptionColour(final String domain, final String option,
            final String ... fallbacks) {
        String value;

        if (!hasOption(domain, option) || (value = getOption(domain, option))
    //#ConfigSource.java:142: method: Color com.dmdirc.config.ConfigSource.getOptionColour(String, String, String[])
    //#ConfigSource.java:142: ?null dereference
    //#    getOption(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: Color getOptionColour(String, String, String[])
    //#    basic block: bb_2
    //#    assertion: getOption(...) != null
    //#    VN: getOption(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ConfigSource.java:142: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: Color getOptionColour(String, String, String[])
    //#    suspicious precondition index: [13]
    //#input(Color getOptionColour(String, String, String[])): "."._tainted
    //#input(Color getOptionColour(String, String, String[])): "Config option not found: "._tainted
    //#input(Color getOptionColour(String, String, String[])): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(Color getOptionColour(String, String, String[])): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(Color getOptionColour(String, String, String[])): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(Color getOptionColour(String, String, String[])): __Descendant_Table[others]
    //#input(Color getOptionColour(String, String, String[])): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Color getOptionColour(String, String, String[])): __Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color;
    //#input(Color getOptionColour(String, String, String[])): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(Color getOptionColour(String, String, String[])): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Color getOptionColour(String, String, String[])): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color;
    //#input(Color getOptionColour(String, String, String[])): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(Color getOptionColour(String, String, String[])): com/dmdirc/config/ConfigManager.stats
    //#input(Color getOptionColour(String, String, String[])): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(Color getOptionColour(String, String, String[])): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(Color getOptionColour(String, String, String[])): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Color getOptionColour(String, String, String[])): com/dmdirc/config/Identity.__Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color;
    //#input(Color getOptionColour(String, String, String[])): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(Color getOptionColour(String, String, String[])): domain
    //#input(Color getOptionColour(String, String, String[])): domain._tainted
    //#input(Color getOptionColour(String, String, String[])): fallbacks
    //#input(Color getOptionColour(String, String, String[])): fallbacks.length
    //#input(Color getOptionColour(String, String, String[])): fallbacks[0]
    //#input(Color getOptionColour(String, String, String[])): fallbacks[0]._tainted
    //#input(Color getOptionColour(String, String, String[])): fallbacks[1]
    //#input(Color getOptionColour(String, String, String[])): fallbacks[1]._tainted
    //#input(Color getOptionColour(String, String, String[])): option
    //#input(Color getOptionColour(String, String, String[])): option._tainted
    //#input(Color getOptionColour(String, String, String[])): this
    //#input(Color getOptionColour(String, String, String[])): this.__Tag
    //#input(Color getOptionColour(String, String, String[])): this.file
    //#input(Color getOptionColour(String, String, String[])): this.sources
    //#output(Color getOptionColour(String, String, String[])): return_value
    //#pre[13] (Color getOptionColour(String, String, String[])): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#pre[15] (Color getOptionColour(String, String, String[])): this.sources != null
    //#pre[3] (Color getOptionColour(String, String, String[])): (soft) fallbacks != null
    //#pre[4] (Color getOptionColour(String, String, String[])): (soft) fallbacks.length <= 4_294_967_295
    //#pre[5] (Color getOptionColour(String, String, String[])): (soft) init'ed(fallbacks[0])
    //#pre[7] (Color getOptionColour(String, String, String[])): (soft) init'ed(fallbacks[1])
    //#presumption(Color getOptionColour(String, String, String[])): java.util.Arrays:copyOfRange(...).length@144 <= 4_294_967_295
    //#presumption(Color getOptionColour(String, String, String[])): java.util.Arrays:copyOfRange(...)@144 != null
    //#presumption(Color getOptionColour(String, String, String[])): java.util.Map:get(...)@336 != null
    //#post(Color getOptionColour(String, String, String[])): init'ed(return_value)
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:hasOption
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.util.Map:get
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.util.Map:put
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:getOption
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:getOptionColour
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.util.Arrays:copyOfRange
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:com.dmdirc.ui.messages.ColourManager:parseColour
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(Color getOptionColour(String, String, String[])): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#test_vector(Color getOptionColour(String, String, String[])): java.lang.String:startsWith(...)@142: {0}, {1}
                .startsWith("false:")) {
            return fallbacks.length >= 2 ? getOptionColour(fallbacks[0], fallbacks[1],
                    Arrays.copyOfRange(fallbacks, 2, fallbacks.length)) : null;
        }
        return ColourManager.parseColour(value.startsWith("true:")
    //#ConfigSource.java:147: Warning: method not available - call not analyzed
    //#    call on Color com.dmdirc.ui.messages.ColourManager:parseColour(String, Color)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: Color getOptionColour(String, String, String[])
    //#    unanalyzed callee: Color com.dmdirc.ui.messages.ColourManager:parseColour(String, Color)
    //#ConfigSource.java:147: end of method: Color com.dmdirc.config.ConfigSource.getOptionColour(String, String, String[])
                ? value.substring(5) : value, null);
    }

    /**
     * Retrieves a boolean representation of the specified option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @return The boolean representation of the option
     */
    public boolean getOptionBool(final String domain, final String option) {
        return Boolean.parseBoolean(getOption(domain, option));
    //#ConfigSource.java:159: method: bool com.dmdirc.config.ConfigSource.getOptionBool(String, String)
    //#ConfigSource.java:159: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: bool getOptionBool(String, String)
    //#    suspicious precondition index: [7]
    //#input(bool getOptionBool(String, String)): "."._tainted
    //#input(bool getOptionBool(String, String)): "Config option not found: "._tainted
    //#input(bool getOptionBool(String, String)): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(bool getOptionBool(String, String)): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(bool getOptionBool(String, String)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool getOptionBool(String, String)): __Descendant_Table[others]
    //#input(bool getOptionBool(String, String)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool getOptionBool(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool getOptionBool(String, String)): com/dmdirc/config/ConfigManager.stats
    //#input(bool getOptionBool(String, String)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool getOptionBool(String, String)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(bool getOptionBool(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool getOptionBool(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool getOptionBool(String, String)): domain
    //#input(bool getOptionBool(String, String)): domain._tainted
    //#input(bool getOptionBool(String, String)): option
    //#input(bool getOptionBool(String, String)): option._tainted
    //#input(bool getOptionBool(String, String)): this
    //#input(bool getOptionBool(String, String)): this.__Tag
    //#input(bool getOptionBool(String, String)): this.file
    //#input(bool getOptionBool(String, String)): this.sources
    //#output(bool getOptionBool(String, String)): return_value
    //#pre[7] (bool getOptionBool(String, String)): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#post(bool getOptionBool(String, String)): init'ed(return_value)
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:hasOption
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:getOption
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(bool getOptionBool(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#ConfigSource.java:159: end of method: bool com.dmdirc.config.ConfigSource.getOptionBool(String, String)
    }

    /**
     * Retrieves a list representation of the specified option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @param trimEmpty Whether or not to trim empty lines
     * @return The list representation of the option
     */
    public List<String> getOptionList(final String domain, final String option,
            final boolean trimEmpty) {
        final List<String> res = new ArrayList<String>();
    //#ConfigSource.java:172: method: List com.dmdirc.config.ConfigSource.getOptionList(String, String, bool)
    //#ConfigSource.java:172: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: List getOptionList(String, String, bool)
    //#    suspicious precondition index: [7]
    //#input(List getOptionList(String, String, bool)): "."._tainted
    //#input(List getOptionList(String, String, bool)): "Config option not found: "._tainted
    //#input(List getOptionList(String, String, bool)): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(List getOptionList(String, String, bool)): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(List getOptionList(String, String, bool)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(List getOptionList(String, String, bool)): __Descendant_Table[others]
    //#input(List getOptionList(String, String, bool)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(List getOptionList(String, String, bool)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(List getOptionList(String, String, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(List getOptionList(String, String, bool)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(List getOptionList(String, String, bool)): com/dmdirc/config/ConfigManager.stats
    //#input(List getOptionList(String, String, bool)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(List getOptionList(String, String, bool)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(List getOptionList(String, String, bool)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(List getOptionList(String, String, bool)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(List getOptionList(String, String, bool)): domain
    //#input(List getOptionList(String, String, bool)): domain._tainted
    //#input(List getOptionList(String, String, bool)): option
    //#input(List getOptionList(String, String, bool)): option._tainted
    //#input(List getOptionList(String, String, bool)): this
    //#input(List getOptionList(String, String, bool)): this.__Tag
    //#input(List getOptionList(String, String, bool)): this.file
    //#input(List getOptionList(String, String, bool)): this.sources
    //#input(List getOptionList(String, String, bool)): trimEmpty
    //#output(List getOptionList(String, String, bool)): new ArrayList(getOptionList#1) num objects
    //#output(List getOptionList(String, String, bool)): return_value
    //#new obj(List getOptionList(String, String, bool)): new ArrayList(getOptionList#1)
    //#pre[7] (List getOptionList(String, String, bool)): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#presumption(List getOptionList(String, String, bool)): java.util.Map:get(...)@336 != null
    //#post(List getOptionList(String, String, bool)): return_value == &new ArrayList(getOptionList#1)
    //#post(List getOptionList(String, String, bool)): new ArrayList(getOptionList#1) num objects == 1
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:hasOption
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:getOption
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(List getOptionList(String, String, bool)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain

        if (hasOption(domain, option)) {
            for (String line : getOption(domain, option).split("\n")) {
    //#ConfigSource.java:175: ?null dereference
    //#    getOption(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: List getOptionList(String, String, bool)
    //#    basic block: bb_2
    //#    assertion: getOption(...) != null
    //#    VN: getOption(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ConfigSource.java:175: ?use of default init
    //#    init'ed(arr$.length)
    //#    severity: LOW
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: List getOptionList(String, String, bool)
    //#    basic block: bb_2
    //#    assertion: init'ed(arr$.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ConfigSource.java:175: ?use of default init
    //#    init'ed(len$)
    //#    severity: LOW
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: List getOptionList(String, String, bool)
    //#    basic block: bb_3
    //#    assertion: init'ed(len$)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ConfigSource.java:175: Warning: test always goes same way
    //#    Test predetermined because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: List getOptionList(String, String, bool)
    //#    from bb: bb_3
    //#    live edge: bb_3-->bb_8
    //#    tested vn: i$ - undefined
    //#    tested vn values: {0}
    //#ConfigSource.java:175: Warning: dead code
    //#    Dead code here because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: List getOptionList(String, String, bool)
    //#    dead bb: bb_4
    //#ConfigSource.java:175: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: List getOptionList(String, String, bool)
    //#    dead bb: bb_7
                if (!line.isEmpty() || !trimEmpty) {
                    res.add(line);
    //#ConfigSource.java:177: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: List getOptionList(String, String, bool)
    //#    dead bb: bb_6
                }
            }
        }

        return res;
    //#ConfigSource.java:182: end of method: List com.dmdirc.config.ConfigSource.getOptionList(String, String, bool)
    }

    /**
     * Retrieves a list representation of the specified option, trimming empty
     * lines by default.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @return The list representation of the option
     */
    public List<String> getOptionList(final String domain, final String option) {
        return getOptionList(domain, option, true);
    //#ConfigSource.java:194: method: List com.dmdirc.config.ConfigSource.getOptionList(String, String)
    //#ConfigSource.java:194: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: List getOptionList(String, String)
    //#    suspicious precondition index: [7]
    //#input(List getOptionList(String, String)): "."._tainted
    //#input(List getOptionList(String, String)): "Config option not found: "._tainted
    //#input(List getOptionList(String, String)): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(List getOptionList(String, String)): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(List getOptionList(String, String)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(List getOptionList(String, String)): __Descendant_Table[others]
    //#input(List getOptionList(String, String)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(List getOptionList(String, String)): __Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;Z)Ljava/util/List;
    //#input(List getOptionList(String, String)): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(List getOptionList(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(List getOptionList(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;Z)Ljava/util/List;
    //#input(List getOptionList(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(List getOptionList(String, String)): com/dmdirc/config/ConfigManager.stats
    //#input(List getOptionList(String, String)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(List getOptionList(String, String)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(List getOptionList(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(List getOptionList(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;Z)Ljava/util/List;
    //#input(List getOptionList(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(List getOptionList(String, String)): domain
    //#input(List getOptionList(String, String)): domain._tainted
    //#input(List getOptionList(String, String)): option
    //#input(List getOptionList(String, String)): option._tainted
    //#input(List getOptionList(String, String)): this
    //#input(List getOptionList(String, String)): this.__Tag
    //#input(List getOptionList(String, String)): this.file
    //#input(List getOptionList(String, String)): this.sources
    //#output(List getOptionList(String, String)): new ArrayList(getOptionList#1*) num objects
    //#output(List getOptionList(String, String)): return_value
    //#new obj(List getOptionList(String, String)): new ArrayList(getOptionList#1*)
    //#pre[7] (List getOptionList(String, String)): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#post(List getOptionList(String, String)): return_value == &new ArrayList(getOptionList#1*)
    //#post(List getOptionList(String, String)): new ArrayList(getOptionList#1*) num objects == 1
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:hasOption
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:getOption
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(List getOptionList(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#ConfigSource.java:194: end of method: List com.dmdirc.config.ConfigSource.getOptionList(String, String)
    }

    /**
     * Retrieves an integral representation of the specified option.
     *
     * @param domain The domain of the option
     * @param option The name of the option
     * @throws NumberFormatException If the setting can't be parsed
     * @return The integer representation of the option
     */
    public int getOptionInt(final String domain, final String option) {
        return Integer.parseInt(getOption(domain, option).trim());
    //#ConfigSource.java:206: method: int com.dmdirc.config.ConfigSource.getOptionInt(String, String)
    //#ConfigSource.java:206: ?null dereference
    //#    getOption(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: int getOptionInt(String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: getOption(...) != null
    //#    VN: getOption(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ConfigSource.java:206: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.config.ConfigSource
    //#    method: int getOptionInt(String, String)
    //#    suspicious precondition index: [7]
    //#input(int getOptionInt(String, String)): "."._tainted
    //#input(int getOptionInt(String, String)): "Config option not found: "._tainted
    //#input(int getOptionInt(String, String)): __Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(int getOptionInt(String, String)): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(int getOptionInt(String, String)): __Descendant_Table[com/dmdirc/config/Identity]
    //#input(int getOptionInt(String, String)): __Descendant_Table[others]
    //#input(int getOptionInt(String, String)): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(int getOptionInt(String, String)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(int getOptionInt(String, String)): com/dmdirc/config/ConfigManager.stats
    //#input(int getOptionInt(String, String)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(int getOptionInt(String, String)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(int getOptionInt(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(int getOptionInt(String, String)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(int getOptionInt(String, String)): domain
    //#input(int getOptionInt(String, String)): domain._tainted
    //#input(int getOptionInt(String, String)): option
    //#input(int getOptionInt(String, String)): option._tainted
    //#input(int getOptionInt(String, String)): this
    //#input(int getOptionInt(String, String)): this.__Tag
    //#input(int getOptionInt(String, String)): this.file
    //#input(int getOptionInt(String, String)): this.sources
    //#output(int getOptionInt(String, String)): return_value
    //#pre[7] (int getOptionInt(String, String)): this.__Tag in {com/dmdirc/config/ConfigManager, com/dmdirc/config/ConfigSource, com/dmdirc/config/Identity}
    //#presumption(int getOptionInt(String, String)): java.util.Map:get(...)@336 != null
    //#post(int getOptionInt(String, String)): init'ed(return_value)
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:hasOption
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:getOption
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(int getOptionInt(String, String)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#ConfigSource.java:206: end of method: int com.dmdirc.config.ConfigSource.getOptionInt(String, String)
    }

}
    //#output(com.dmdirc.config.ConfigSource__static_init): __Descendant_Table[com/dmdirc/config/ConfigSource]
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionBool(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionChar(Ljava/lang/String;Ljava/lang/String;)C
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color;
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;Z)Ljava/util/List;
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOptionChar(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOptionColour(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOptionInt(Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOptionString(Ljava/lang/String;Ljava/lang/String;)Z
    //#post(com.dmdirc.config.ConfigSource__static_init): __Descendant_Table[com/dmdirc/config/ConfigSource] == &__Dispatch_Table
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; == &getOption
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionBool(Ljava/lang/String;Ljava/lang/String;)Z == &getOptionBool
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionChar(Ljava/lang/String;Ljava/lang/String;)C == &getOptionChar
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionColour(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/awt/Color; == &getOptionColour
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionInt(Ljava/lang/String;Ljava/lang/String;)I == &getOptionInt
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;)Ljava/util/List; == &getOptionList
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.getOptionList(Ljava/lang/String;Ljava/lang/String;Z)Ljava/util/List; == &getOptionList
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z == &hasOption
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOptionChar(Ljava/lang/String;Ljava/lang/String;)Z == &hasOptionChar
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOptionColour(Ljava/lang/String;Ljava/lang/String;)Z == &hasOptionColour
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOptionInt(Ljava/lang/String;Ljava/lang/String;)Z == &hasOptionInt
    //#post(com.dmdirc.config.ConfigSource__static_init): __Dispatch_Table.hasOptionString(Ljava/lang/String;Ljava/lang/String;)Z == &hasOptionString
    //#ConfigSource.java:: end of method: com.dmdirc.config.ConfigSource.com.dmdirc.config.ConfigSource__static_init
    //#ConfigSource.java:: end of class: com.dmdirc.config.ConfigSource
