//# 3 errors, 1,417 messages
//#
/*
    //#Main.java:1:1: class: com.dmdirc.Main$2
    //#Main.java:1:1: method: com.dmdirc.Main$2.com.dmdirc.Main$2__static_init
    //#Main.java:1:1: class: com.dmdirc.Main$1
    //#Main.java:1:1: method: com.dmdirc.Main$1.com.dmdirc.Main$1__static_init
    //#Main.java:1:1: class: com.dmdirc.Main
    //#Main.java:1:1: method: com.dmdirc.Main.com.dmdirc.Main__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;

import com.dmdirc.actions.ActionManager;
import com.dmdirc.actions.CoreActionType;
import com.dmdirc.commandline.CommandLineParser;
import com.dmdirc.commandparser.CommandManager;
import com.dmdirc.config.ConfigManager;
import com.dmdirc.config.IdentityManager;
import com.dmdirc.logger.DMDircExceptionHandler;
import com.dmdirc.logger.ErrorLevel;
import com.dmdirc.logger.Logger;
import com.dmdirc.plugins.PluginManager;
import com.dmdirc.plugins.Service;
import com.dmdirc.ui.themes.ThemeManager;
import com.dmdirc.ui.interfaces.UIController;
import com.dmdirc.ui.NoUIDialog;
import com.dmdirc.updater.UpdateChecker;
import com.dmdirc.util.resourcemanager.ResourceManager;

import java.awt.GraphicsEnvironment;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Handler;
import java.util.logging.Level;

/**
 * Main class, handles initialisation.
 *
 * @author chris
 */
public final class Main {

    /** Feedback nag delay. */
    private static final int FEEDBACK_DELAY = 30 * 60 * 1000;

    /** The UI to use for the client. */
    private static UIController controller;

    /** The config dir to use for the client. */
    private static String configdir;

    /**
     * Prevents creation of main.
     */
    private Main() {
    //#Main.java:71: method: void com.dmdirc.Main.com.dmdirc.Main()
    }
    //#Main.java:72: end of method: void com.dmdirc.Main.com.dmdirc.Main()

    /**
     * Entry procedure.
     *
     * @param args the command line arguments
     */
    public static void main(final String[] args) {
        try {
            init(args);
    //#Main.java:81: method: void com.dmdirc.Main.main(String[])
    //#Main.java:81: Warning: call too complex - analysis skipped
    //#    call on void init(String[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void main(String[])
    //#    unanalyzed callee: void init(String[])
    //#input(void main(String[])): args
    //#input(void main(String[])): com.dmdirc.logger.ErrorLevel.FATAL
    //#presumption(void main(String[])): init'ed(com.dmdirc.logger.ErrorLevel.FATAL)
        } catch (Throwable ex) {
            Logger.appError(ErrorLevel.FATAL, "Exception while initialising", ex);
    //#Main.java:83: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:appError(ErrorLevel, String, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void main(String[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:appError(ErrorLevel, String, Throwable)
        }
    }
    //#Main.java:85: end of method: void com.dmdirc.Main.main(String[])
    
    /**
     * Initialises the client.
     * 
     * @param args The command line arguments
     */
    private static void init(final String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new DMDircExceptionHandler());
    //#Main.java:93: method: void com.dmdirc.Main.init(String[])
    //#Main.java:93: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.DMDircExceptionHandler()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.logger.DMDircExceptionHandler()
    //#Main.java:93: Warning: suspicious precondition
    //#    The precondition for com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    suspicious precondition index: [6]
    //#    Attribs:  Soft
    //#Main.java:93: Warning: suspicious precondition
    //#    The precondition for com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    suspicious precondition index: [9]
    //#    Attribs:  Soft
    //#Main.java:93: Warning: suspicious precondition
    //#    The precondition for com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    suspicious precondition index: [10]
    //#    Attribs:  Soft
    //#Main.java:93: Warning: suspicious precondition
    //#    The precondition for com/dmdirc/actions/wrappers/PerformWrapper.me.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    suspicious precondition index: [17]
    //#input(void init(String[])): "."._tainted
    //#input(void init(String[])): ".DMDirc"._tainted
    //#input(void init(String[])): ": "._tainted
    //#input(void init(String[])): "DMDirc"._tainted
    //#input(void init(String[])): "I.O error when creating actions directory: "._tainted
    //#input(void init(String[])): "I.O error when loading action: "._tainted
    //#input(void init(String[])): "Library"._tainted
    //#input(void init(String[])): "Preferences"._tainted
    //#input(void init(String[])): "Unable to parse action file: "._tainted
    //#input(void init(String[])): "_"._tainted
    //#input(void init(String[])): "actions"._tainted
    //#input(void init(String[])): "plugins"._tainted
    //#input(void init(String[])): "tabcompletion"._tainted
    //#input(void init(String[])): "ui"._tainted
    //#input(void init(String[])): args
    //#input(void init(String[])): com.dmdirc.actions.CoreActionComparison__static_init.new CoreActionComparison[](CoreActionComparison__static_init#13).length
    //#input(void init(String[])): com.dmdirc.actions.CoreActionComparison__static_init.new CoreActionComparison[](CoreActionComparison__static_init#13)[0..12]
    //#input(void init(String[])): com.dmdirc.actions.CoreActionComponent__static_init.new CoreActionComponent[](CoreActionComponent__static_init#28).length
    //#input(void init(String[])): com.dmdirc.actions.CoreActionComponent__static_init.new CoreActionComponent[](CoreActionComponent__static_init#28)[0..27]
    //#input(void init(String[])): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#1).__Tag
    //#input(void init(String[])): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#1).type
    //#input(void init(String[])): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74).length
    //#input(void init(String[])): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73]
    //#input(void init(String[])): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].__Tag
    //#input(void init(String[])): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type
    //#input(void init(String[])): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag
    //#input(void init(String[])): com.dmdirc.actions.metatypes.ClientEvents__static_init.new ClientEvents(ClientEvents__static_init#1).__Tag
    //#input(void init(String[])): com.dmdirc.logger.ErrorLevel.LOW
    //#input(void init(String[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void init(String[])): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/FrameContainer.java.awt.Color.BLACK
    //#input(void init(String[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/GlobalWindow.com.dmdirc.commandparser.CommandType.TYPE_GLOBAL
    //#input(void init(String[])): com/dmdirc/GlobalWindow.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void init(String[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void init(String[])): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void init(String[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void init(String[])): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void init(String[])): com/dmdirc/ServerManager.me.servers
    //#input(void init(String[])): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/actions/Action.__Descendant_Table[com/dmdirc/actions/Action]
    //#input(void init(String[])): com/dmdirc/actions/Action.__Descendant_Table[others]
    //#input(void init(String[])): com/dmdirc/actions/Action.__Dispatch_Table.getConditions()Ljava/util/List;
    //#input(void init(String[])): com/dmdirc/actions/Action.__Dispatch_Table.getTriggers()[Lcom/dmdirc/actions/interfaces/ActionType;
    //#input(void init(String[])): com/dmdirc/actions/Action.__Dispatch_Table.loadActionFromConfig()V
    //#input(void init(String[])): com/dmdirc/actions/Action.com.dmdirc.logger.ErrorLevel.HIGH
    //#input(void init(String[])): com/dmdirc/actions/Action.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void init(String[])): com/dmdirc/actions/Action.java.io.File.separator
    //#input(void init(String[])): com/dmdirc/actions/Action.java.io.File.separator._tainted
    //#input(void init(String[])): com/dmdirc/actions/ActionCondition.__Descendant_Table[com/dmdirc/actions/ActionCondition]
    //#input(void init(String[])): com/dmdirc/actions/ActionCondition.__Descendant_Table[others]
    //#input(void init(String[])): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getArg()I
    //#input(void init(String[])): com/dmdirc/actions/ActionCondition.__Dispatch_Table.getTarget()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/ActionGroup]
    //#input(void init(String[])): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/AliasWrapper]
    //#input(void init(String[])): com/dmdirc/actions/ActionGroup.__Descendant_Table[com/dmdirc/actions/wrappers/PerformWrapper]
    //#input(void init(String[])): com/dmdirc/actions/ActionGroup.__Descendant_Table[others]
    //#input(void init(String[])): com/dmdirc/actions/ActionGroup.__Dispatch_Table.clear()V
    //#input(void init(String[])): com/dmdirc/actions/ActionGroup.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/ActionGroup.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.actionComparisons
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.actionComponents
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.actionTypeGroups
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.actionTypes
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.actions
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.com.dmdirc.logger.ErrorLevel.HIGH
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.groups
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void init(String[])): com/dmdirc/actions/ActionManager.listeners
    //#input(void init(String[])): com/dmdirc/actions/CoreActionComparison.$VALUES
    //#input(void init(String[])): com/dmdirc/actions/CoreActionComponent.$VALUES
    //#input(void init(String[])): com/dmdirc/actions/CoreActionType.$VALUES
    //#input(void init(String[])): com/dmdirc/actions/CoreActionType.CLIENT_CLOSED
    //#input(void init(String[])): com/dmdirc/actions/CoreActionType.CLIENT_OPENED
    //#input(void init(String[])): com/dmdirc/actions/CoreActionType.UNKNOWN_COMMAND
    //#input(void init(String[])): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void init(String[])): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void init(String[])): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void init(String[])): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void init(String[])): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void init(String[])): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void init(String[])): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void init(String[])): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void init(String[])): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.__Class_Obj.__Lock
    //#input(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.clear()V
    //#input(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.me
    //#input(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.me.__Tag
    //#input(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.me.aliases
    //#input(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.me.name
    //#input(void init(String[])): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.clear()V
    //#input(void init(String[])): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void init(String[])): com/dmdirc/actions/wrappers/PerformWrapper.__Dispatch_Table.remove(Lcom/dmdirc/actions/Action;)V
    //#input(void init(String[])): com/dmdirc/actions/wrappers/PerformWrapper.me
    //#input(void init(String[])): com/dmdirc/actions/wrappers/PerformWrapper.me.__Tag
    //#input(void init(String[])): com/dmdirc/actions/wrappers/PerformWrapper.me.name
    //#input(void init(String[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void init(String[])): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void init(String[])): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void init(String[])): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getGroup()Ljava/lang/String;
    //#input(void init(String[])): configdir
    //#input(void init(String[])): configdir._tainted
    //#input(void init(String[])): controller
    //#input(void init(String[])): java.util.logging.Level.OFF
    //#output(void init(String[])): com/dmdirc/GlobalWindow.globalWindow
    //#output(void init(String[])): com/dmdirc/ServerManager.me
    //#output(void init(String[])): com/dmdirc/actions/wrappers/AliasWrapper.me
    //#output(void init(String[])): configdir
    //#output(void init(String[])): java.lang.StringBuilder:toString(...)._tainted
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1) num objects
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1).__Tag
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1).actions
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1).aliases
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1).author
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1).component
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1).description
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1).name
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1).settings
    //#output(void init(String[])): new AliasWrapper(getAliasWrapper#1).version
    //#output(void init(String[])): new ArrayList(ActionGroup#1) num objects
    //#output(void init(String[])): new ArrayList(AliasWrapper#1) num objects
    //#output(void init(String[])): new ArrayList(ServerManager#1) num objects
    //#output(void init(String[])): new FrameContainer$IconChanger(FrameContainer#2) num objects
    //#output(void init(String[])): new FrameContainer$IconChanger(FrameContainer#2).__Tag
    //#output(void init(String[])): new FrameContainer$IconChanger(FrameContainer#2).this$0
    //#output(void init(String[])): new GlobalWindow(init#1*) num objects
    //#output(void init(String[])): new GlobalWindow(init#1*).__Tag
    //#output(void init(String[])): new GlobalWindow(init#1*).changer
    //#output(void init(String[])): new GlobalWindow(init#1*).config
    //#output(void init(String[])): new GlobalWindow(init#1*).icon
    //#output(void init(String[])): new GlobalWindow(init#1*).listeners
    //#output(void init(String[])): new GlobalWindow(init#1*).notification
    //#output(void init(String[])): new GlobalWindow(init#1*).tabCompleter
    //#output(void init(String[])): new GlobalWindow(init#1*).window
    //#output(void init(String[])): new HashMap(ActionGroup#2) num objects
    //#output(void init(String[])): new ListenerList(FrameContainer#1) num objects
    //#output(void init(String[])): new ListenerList(FrameContainer#1).__Lock
    //#output(void init(String[])): new ServerManager(getServerManager#1) num objects
    //#output(void init(String[])): new ServerManager(getServerManager#1).__Tag
    //#output(void init(String[])): new ServerManager(getServerManager#1).servers
    //#output(void init(String[])): new TabCompleter(GlobalWindow#1) num objects
    //#new obj(void init(String[])): java.lang.StringBuilder:toString(...)
    //#new obj(void init(String[])): new AliasWrapper(getAliasWrapper#1)
    //#new obj(void init(String[])): new ArrayList(ActionGroup#1)
    //#new obj(void init(String[])): new ArrayList(AliasWrapper#1)
    //#new obj(void init(String[])): new ArrayList(ServerManager#1)
    //#new obj(void init(String[])): new FrameContainer$IconChanger(FrameContainer#2)
    //#new obj(void init(String[])): new GlobalWindow(init#1*)
    //#new obj(void init(String[])): new HashMap(ActionGroup#2)
    //#new obj(void init(String[])): new ListenerList(FrameContainer#1)
    //#new obj(void init(String[])): new ServerManager(getServerManager#1)
    //#new obj(void init(String[])): new TabCompleter(GlobalWindow#1)
    //#pre[12] (void init(String[])): init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[16] (void init(String[])): com/dmdirc/actions/wrappers/PerformWrapper.me != null
    //#pre[17] (void init(String[])): com/dmdirc/actions/wrappers/PerformWrapper.me.__Tag in {com/dmdirc/actions/ActionGroup, com/dmdirc/actions/wrappers/AliasWrapper, com/dmdirc/actions/wrappers/PerformWrapper}
    //#pre[23] (void init(String[])): init'ed(com/dmdirc/actions/wrappers/AliasWrapper.me)
    //#pre[2] (void init(String[])): (soft) init'ed(com.dmdirc.actions.CoreActionComparison__static_init.new CoreActionComparison[](CoreActionComparison__static_init#13)[0..12])
    //#pre[3] (void init(String[])): (soft) init'ed(com.dmdirc.actions.CoreActionComponent__static_init.new CoreActionComponent[](CoreActionComponent__static_init#28)[0..27])
    //#pre[4] (void init(String[])): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#1).type != null
    //#pre[5] (void init(String[])): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73] != null
    //#pre[6] (void init(String[])): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[7] (void init(String[])): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type != null
    //#pre[8] (void init(String[])): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type != null
    //#pre[9] (void init(String[])): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#pre[10] (void init(String[])): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType[](CoreActionType__static_init#74)[0..73].type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#pre[20] (void init(String[])): (soft) controller != null
    //#pre[22] (void init(String[])): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#pre[24] (void init(String[])): (soft) init'ed(configdir)
    //#presumption(void init(String[])): arr$.length@95 <= 4_294_967_295
    //#presumption(void init(String[])): arr$[i$]@95 != null
    //#presumption(void init(String[])): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@120 != null
    //#presumption(void init(String[])): com.dmdirc.plugins.PluginManager:getPluginManager(...)@108 != null
    //#presumption(void init(String[])): java.lang.Runtime:getRuntime(...)@140 != null
    //#presumption(void init(String[])): init'ed(java.util.logging.Level.OFF)
    //#presumption(void init(String[])): java.util.logging.Logger:getHandlers(...)@95 != null
    //#presumption(void init(String[])): java.util.logging.Logger:getLogger(...)@95 != null
    //#post(void init(String[])): com/dmdirc/GlobalWindow.globalWindow == One-of{old com/dmdirc/GlobalWindow.globalWindow, &new GlobalWindow(init#1*)}
    //#post(void init(String[])): possibly_updated(com/dmdirc/ServerManager.me)
    //#post(void init(String[])): init'ed(com/dmdirc/actions/wrappers/AliasWrapper.me)
    //#post(void init(String[])): init'ed(configdir)
    //#post(void init(String[])): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1) num objects == 0
    //#post(void init(String[])): new ArrayList(ActionGroup#1) num objects == 0
    //#post(void init(String[])): new ArrayList(AliasWrapper#1) num objects == 0
    //#post(void init(String[])): new HashMap(ActionGroup#2) num objects == 0
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1) num objects <= 1
    //#post(void init(String[])): new ArrayList(ActionGroup#1) num objects == new AliasWrapper(getAliasWrapper#1) num objects
    //#post(void init(String[])): new ArrayList(AliasWrapper#1) num objects == new AliasWrapper(getAliasWrapper#1) num objects
    //#post(void init(String[])): new HashMap(ActionGroup#2) num objects == new AliasWrapper(getAliasWrapper#1) num objects
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1).__Tag == com/dmdirc/actions/wrappers/AliasWrapper
    //#post(void init(String[])): init'ed(new AliasWrapper(getAliasWrapper#1).__Tag)
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1).actions == &new ArrayList(ActionGroup#1)
    //#post(void init(String[])): init'ed(new AliasWrapper(getAliasWrapper#1).actions)
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1).aliases == &new ArrayList(AliasWrapper#1)
    //#post(void init(String[])): init'ed(new AliasWrapper(getAliasWrapper#1).aliases)
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1).author == null
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1).description == null
    //#post(void init(String[])): init'ed(new AliasWrapper(getAliasWrapper#1).author)
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1).component == -1
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1).version == -1
    //#post(void init(String[])): init'ed(new AliasWrapper(getAliasWrapper#1).component)
    //#post(void init(String[])): init'ed(new AliasWrapper(getAliasWrapper#1).description)
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1).name == &"aliases"
    //#post(void init(String[])): init'ed(new AliasWrapper(getAliasWrapper#1).name)
    //#post(void init(String[])): new AliasWrapper(getAliasWrapper#1).settings == &new HashMap(ActionGroup#2)
    //#post(void init(String[])): init'ed(new AliasWrapper(getAliasWrapper#1).settings)
    //#post(void init(String[])): init'ed(new AliasWrapper(getAliasWrapper#1).version)
    //#post(void init(String[])): init'ed(new ArrayList(ServerManager#1) num objects)
    //#post(void init(String[])): new ArrayList(ServerManager#1) num objects == undefined
    //#post(void init(String[])): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void init(String[])): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void init(String[])): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1) num objects
    //#post(void init(String[])): new FrameContainer$IconChanger(FrameContainer#2) num objects <= 1
    //#post(void init(String[])): new GlobalWindow(init#1*) num objects == new FrameContainer$IconChanger(FrameContainer#2) num objects
    //#post(void init(String[])): new ListenerList(FrameContainer#1) num objects == new FrameContainer$IconChanger(FrameContainer#2) num objects
    //#post(void init(String[])): new TabCompleter(GlobalWindow#1) num objects == new FrameContainer$IconChanger(FrameContainer#2) num objects
    //#post(void init(String[])): init'ed(new FrameContainer$IconChanger(FrameContainer#2).__Tag)
    //#post(void init(String[])): init'ed(new FrameContainer$IconChanger(FrameContainer#2).this$0)
    //#post(void init(String[])): init'ed(new GlobalWindow(init#1*).__Tag)
    //#post(void init(String[])): init'ed(new GlobalWindow(init#1*).changer)
    //#post(void init(String[])): init'ed(new GlobalWindow(init#1*).config)
    //#post(void init(String[])): init'ed(new GlobalWindow(init#1*).icon)
    //#post(void init(String[])): init'ed(new GlobalWindow(init#1*).listeners)
    //#post(void init(String[])): init'ed(new GlobalWindow(init#1*).notification)
    //#post(void init(String[])): init'ed(new GlobalWindow(init#1*).tabCompleter)
    //#post(void init(String[])): init'ed(new GlobalWindow(init#1*).window)
    //#post(void init(String[])): init'ed(new ListenerList(FrameContainer#1).__Lock)
    //#post(void init(String[])): init'ed(new ServerManager(getServerManager#1) num objects)
    //#post(void init(String[])): init'ed(new ServerManager(getServerManager#1).__Tag)
    //#post(void init(String[])): init'ed(new ServerManager(getServerManager#1).servers)
    //#post(void init(String[])): new ServerManager(getServerManager#1).servers == undefined
    //#post(void init(String[])): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.System:getenv
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourcesStartingWithAsBytes
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void init(String[])): Effects-of-calling:getConfigDir
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void init(String[])): Effects-of-calling:java.io.File
    //#unanalyzed(void init(String[])): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void init(String[])): Effects-of-calling:java.io.File:mkdirs
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void init(String[])): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:resourceToFile
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.plugins.PluginManager:getServicesByType
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.List:isEmpty
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.plugins.PluginManager:getPossiblePluginInfos
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.config.ConfigManager:getOption
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.plugins.Service:getName
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.plugins.Service:activate
    //#unanalyzed(void init(String[])): Effects-of-calling:java.awt.GraphicsEnvironment:isHeadless
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.NoUIDialog:displayBlocking
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionBool
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.config.IdentityManager:getConfigIdentity
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.config.Identity:setOption
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:showFirstRunWizard
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Timer
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.TimerTask
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Timer:schedule
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(void init(String[])): Effects-of-calling:getType
    //#unanalyzed(void init(String[])): Effects-of-calling:getGroup
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.MapList:add
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void init(String[])): Effects-of-calling:values
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.actions.ActionGroup
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void init(String[])): Effects-of-calling:java.io.File:getName
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void init(String[])): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.actions.Action
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.updater.components.ActionGroupComponent
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.MapList:clear
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void init(String[])): Effects-of-calling:remove
    //#unanalyzed(void init(String[])): Effects-of-calling:getTriggers
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void init(String[])): Effects-of-calling:getCommandName
    //#unanalyzed(void init(String[])): Effects-of-calling:getTabCompleter
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:removeEntry
    //#unanalyzed(void init(String[])): Effects-of-calling:getConditions
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Map:clear
    //#unanalyzed(void init(String[])): Effects-of-calling:java.io.File:createNewFile
    //#unanalyzed(void init(String[])): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void init(String[])): Effects-of-calling:trigger
    //#unanalyzed(void init(String[])): Effects-of-calling:getArity
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void init(String[])): Effects-of-calling:triggerActions
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.WritableFrameContainer
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.input.TabCompleter
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandNames
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:addEntries
    //#unanalyzed(void init(String[])): Effects-of-calling:getUI
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getInputWindow
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:setTitle
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getInputHandler
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.input.InputHandler:setTabCompleter
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.WindowManager:addWindow
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:open
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.ConfigFile
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.ConfigFile:read
    //#unanalyzed(void init(String[])): Effects-of-calling:loadActionFromConfig
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.InvalidConfigFileException:getMessage
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.List:size
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void init(String[])): Effects-of-calling:readTerm
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void init(String[])): Effects-of-calling:parseStack
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void init(String[])): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void init(String[])): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void init(String[])): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void init(String[])): Effects-of-calling:getServer
    //#unanalyzed(void init(String[])): Effects-of-calling:getState
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void init(String[])): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void init(String[])): Effects-of-calling:get
    //#unanalyzed(void init(String[])): Effects-of-calling:getArgTypes
    //#unanalyzed(void init(String[])): Effects-of-calling:test
    //#unanalyzed(void init(String[])): Effects-of-calling:evaluate
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void init(String[])): Effects-of-calling:getFrame
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void init(String[])): Effects-of-calling:java.util.List:get
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void init(String[])): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.FrameContainer
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void init(String[])): Effects-of-calling:com.dmdirc.util.ListenerList

        for (Handler handler : java.util.logging.Logger.getLogger("").getHandlers()) {
            handler.setLevel(Level.OFF); // Needs to be changed to enable debugging
        }

        // Enable finer debugging for specific components like so:
        //java.util.logging.Logger.getLogger("com.dmdirc.plugins").setLevel(Level.ALL);

        IdentityManager.loadVersion();
    //#Main.java:102: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.IdentityManager:loadVersion()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.config.IdentityManager:loadVersion()

        final CommandLineParser clp = new CommandLineParser(args);
    //#Main.java:104: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.commandline.CommandLineParser(String[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.commandline.CommandLineParser(String[])
        
        IdentityManager.load();
    //#Main.java:106: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.IdentityManager:load()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.config.IdentityManager:load()

        final PluginManager pm = PluginManager.getPluginManager();
    //#Main.java:108: Warning: method not available - call not analyzed
    //#    call on PluginManager com.dmdirc.plugins.PluginManager:getPluginManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: PluginManager com.dmdirc.plugins.PluginManager:getPluginManager()
        
        ThemeManager.loadThemes();
    //#Main.java:110: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.themes.ThemeManager:loadThemes()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.ui.themes.ThemeManager:loadThemes()

        clp.applySettings();
    //#Main.java:112: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.commandline.CommandLineParser:applySettings()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.commandline.CommandLineParser:applySettings()

        CommandManager.initCommands();
    //#Main.java:114: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.commandparser.CommandManager:initCommands()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.commandparser.CommandManager:initCommands()

        for (String service : new String[]{"ui", "tabcompletion"}) {
            ensureExists(pm, service);
        }

        loadUI(pm, IdentityManager.getGlobalConfig());
    //#Main.java:120: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()

        doFirstRun();

        ActionManager.init();

        pm.doAutoLoad();
    //#Main.java:126: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.plugins.PluginManager:doAutoLoad()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.plugins.PluginManager:doAutoLoad()

        ActionManager.loadActions();

        getUI().getMainWindow();
    //#Main.java:130: Warning: method not available - call not analyzed
    //#    call on MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()

        ActionManager.processEvent(CoreActionType.CLIENT_OPENED, null);
    //#Main.java:132: ?!precondition failure
    //#    com/dmdirc/actions/ActionManager.processEvent: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    basic block: bb_7
    //#    assertion: (soft) undefined in {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    callee: void com/dmdirc/actions/ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#    callee assertion: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    callee file: ActionManager.java
    //#    callee precondition index: [29]
    //#    callee srcpos: 365
    //#    VN: undefined
    //#    Expected: {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp

        UpdateChecker.init();
    //#Main.java:134: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.updater.UpdateChecker:init()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.updater.UpdateChecker:init()

        clp.processArguments();
    //#Main.java:136: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.commandline.CommandLineParser:processArguments()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void init(String[])
    //#    unanalyzed callee: void com.dmdirc.commandline.CommandLineParser:processArguments()

        GlobalWindow.init();

        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    //#Main.java:140: method: void com.dmdirc.Main$1.com.dmdirc.Main$1()
    //#Main.java:140: end of method: void com.dmdirc.Main$1.com.dmdirc.Main$1()
            /** {@inheritDoc} */
            @Override
            public void run() {
                ActionManager.processEvent(CoreActionType.CLIENT_CLOSED, null);
    //#Main.java:144: method: void com.dmdirc.Main$1.run()
    //#Main.java:144: ?!precondition failure
    //#    com/dmdirc/actions/ActionManager.processEvent: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Main$1
    //#    method: void run()
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) undefined in {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    callee: void com/dmdirc/actions/ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#    callee assertion: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    callee file: ActionManager.java
    //#    callee precondition index: [29]
    //#    callee srcpos: 365
    //#    VN: undefined
    //#    Expected: {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp
    //#input(void run()): " ["._tainted
    //#input(void run()): "->"._tainted
    //#input(void run()): "Illegal server state transition&#10;&#10;"._tainted
    //#input(void run()): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1).length
    //#input(void run()): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295]
    //#input(void run()): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#7).transitions
    //#input(void run()): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#9).transitions
    //#input(void run()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#2).__Tag
    //#input(void run()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#2).type
    //#input(void run()): com.dmdirc.actions.metatypes.ClientEvents__static_init.new ClientEvents(ClientEvents__static_init#1).__Tag
    //#input(void run()): com/dmdirc/Channel.__Descendant_Table[com/dmdirc/Channel]
    //#input(void run()): com/dmdirc/Channel.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/Channel.__Dispatch_Table.close()V
    //#input(void run()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/Channel.__Dispatch_Table.resetWindow()V
    //#input(void run()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void run()): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/Invite.__Descendant_Table[com/dmdirc/Invite]
    //#input(void run()): com/dmdirc/Invite.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/Query.__Descendant_Table[com/dmdirc/Query]
    //#input(void run()): com/dmdirc/Query.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/Query.__Dispatch_Table.close()V
    //#input(void run()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/Server$4.$SwitchMap$com$dmdirc$ServerState
    //#input(void run()): com/dmdirc/Server.DOMAIN_GENERAL
    //#input(void run()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void run()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/Server.__Dispatch_Table.disconnect(Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/Server.__Dispatch_Table.removeInvite(Lcom/dmdirc/Invite;)V
    //#input(void run()): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void run()): com/dmdirc/ServerManager.me
    //#input(void run()): com/dmdirc/ServerManager.me.servers
    //#input(void run()): com/dmdirc/ServerManager.me.servers.__Lock
    //#input(void run()): com/dmdirc/ServerState.CONNECTED
    //#input(void run()): com/dmdirc/ServerState.DISCONNECTED
    //#input(void run()): com/dmdirc/ServerState.DISCONNECTING
    //#input(void run()): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void run()): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/ServerStatus.__Dispatch_Table.addHistoryEntry(Lcom/dmdirc/ServerState;Lcom/dmdirc/ServerState;)V
    //#input(void run()): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void run()): com/dmdirc/ServerStatus.__Dispatch_Table.getTransitionHistory()Ljava/lang/String;
    //#input(void run()): com/dmdirc/ServerStatus.__Dispatch_Table.transition(Lcom/dmdirc/ServerState;)V
    //#input(void run()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void run()): com/dmdirc/actions/ActionManager.listeners
    //#input(void run()): com/dmdirc/actions/CoreActionType.CLIENT_CLOSED
    //#input(void run()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void run()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void run()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void run()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void run()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void run()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void run()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void run()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void run()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void run()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void run()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#output(void run()): com/dmdirc/ServerManager.me
    //#output(void run()): new ArrayList(ServerManager#1) num objects
    //#output(void run()): new ArrayList(ServerManager#1).__Lock
    //#output(void run()): new ServerManager(getServerManager#1) num objects
    //#output(void run()): new ServerManager(getServerManager#1).__Tag
    //#output(void run()): new ServerManager(getServerManager#1).servers
    //#new obj(void run()): new ArrayList(ServerManager#1)
    //#new obj(void run()): new ServerManager(getServerManager#1)
    //#pre[4] (void run()): init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[5] (void run()): init'ed(com/dmdirc/ServerManager.me)
    //#pre[1] (void run()): (soft) init'ed(com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295])
    //#pre[2] (void run()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#2).type != null
    //#presumption(void run()): getServerManager(...).servers != null
    //#post(void run()): com/dmdirc/ServerManager.me == One-of{old com/dmdirc/ServerManager.me, &new ServerManager(getServerManager#1)}
    //#post(void run()): com/dmdirc/ServerManager.me != null
    //#post(void run()): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void run()): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void run()): new ArrayList(ServerManager#1) num objects == undefined
    //#post(void run()): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void run()): new ArrayList(ServerManager#1).__Lock == new ArrayList(ServerManager#1) num objects
    //#post(void run()): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1) num objects
    //#post(void run()): init'ed(new ArrayList(ServerManager#1).__Lock)
    //#post(void run()): new ServerManager(getServerManager#1).__Tag == com/dmdirc/ServerManager
    //#post(void run()): new ServerManager(getServerManager#1).servers == &new ArrayList(ServerManager#1)
    //#post(void run()): new ServerManager(getServerManager#1).servers == undefined
    //#post(void run()): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void run()): Effects-of-calling:getType
    //#unanalyzed(void run()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void run()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void run()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void run()): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void run()): Effects-of-calling:trigger
    //#unanalyzed(void run()): Effects-of-calling:getArity
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void run()): Effects-of-calling:triggerActions
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void run()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void run()): Effects-of-calling:disconnect
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void run()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void run()): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void run()): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void run()): Effects-of-calling:readTerm
    //#unanalyzed(void run()): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void run()): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void run()): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void run()): Effects-of-calling:parseStack
    //#unanalyzed(void run()): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void run()): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void run()): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void run()): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void run()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void run()): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void run()): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void run()): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void run()): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void run()): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void run()): Effects-of-calling:getServer
    //#unanalyzed(void run()): Effects-of-calling:getState
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void run()): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void run()): Effects-of-calling:get
    //#unanalyzed(void run()): Effects-of-calling:getArgTypes
    //#unanalyzed(void run()): Effects-of-calling:test
    //#unanalyzed(void run()): Effects-of-calling:evaluate
    //#unanalyzed(void run()): Effects-of-calling:getUI
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void run()): Effects-of-calling:getFrame
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void run()): Effects-of-calling:java.util.List:get
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void run()): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.interfaces.InviteListener:inviteExpired
    //#unanalyzed(void run()): Effects-of-calling:setIcon
    //#unanalyzed(void run()): Effects-of-calling:getConfigManager
    //#unanalyzed(void run()): Effects-of-calling:updateIcon
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionBool
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.parser.irc.ServerInfo:getSSL
    //#unanalyzed(void run()): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void run()): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ServerState:ordinal
    //#unanalyzed(void run()): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.util.RollingList:getList
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ServerState:name
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Thread:currentThread
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Thread:getStackTrace
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StackTraceElement:toString
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Thread:getName
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void run()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Object:notifyAll
    //#unanalyzed(void run()): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void run()): Effects-of-calling:removeInvites
    //#unanalyzed(void run()): Effects-of-calling:clearChannels
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Thread:interrupt
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:disconnect
    //#unanalyzed(void run()): Effects-of-calling:closeChannels
    //#unanalyzed(void run()): Effects-of-calling:closeQueries
    //#unanalyzed(void run()): Effects-of-calling:close
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:updateNames
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.ui.interfaces.Window:close
                ServerManager.getServerManager().disconnectAll("Unexpected shutdown");
                IdentityManager.save();
    //#Main.java:146: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.IdentityManager:save()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main$1
    //#    method: void run()
    //#    unanalyzed callee: void com.dmdirc.config.IdentityManager:save()
            }
    //#Main.java:147: end of method: void com.dmdirc.Main$1.run()
        }, "Shutdown thread"));        
    }
    //#Main.java:149: end of method: void com.dmdirc.Main.init(String[])

    /**
     * Ensures that there is at least one provider of the specified
     * service type by extracting matching core plugins. Plugins must be named
     * so that their file name starts with the service type, and then an
     * underscore.
     *
     * @param pm The plugin manager to use to access services
     * @param serviceType The type of service that should exist
     */
    public static void ensureExists(final PluginManager pm, final String serviceType) {
        if (pm.getServicesByType(serviceType).isEmpty()) {
    //#Main.java:161: method: void com.dmdirc.Main.ensureExists(PluginManager, String)
    //#Main.java:161: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.plugins.PluginManager:getServicesByType(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void ensureExists(PluginManager, String)
    //#    unanalyzed callee: List com.dmdirc.plugins.PluginManager:getServicesByType(String)
    //#input(void ensureExists(PluginManager, String)): "."._tainted
    //#input(void ensureExists(PluginManager, String)): ".DMDirc"._tainted
    //#input(void ensureExists(PluginManager, String)): "DMDirc"._tainted
    //#input(void ensureExists(PluginManager, String)): "Library"._tainted
    //#input(void ensureExists(PluginManager, String)): "Preferences"._tainted
    //#input(void ensureExists(PluginManager, String)): "_"._tainted
    //#input(void ensureExists(PluginManager, String)): "plugins"._tainted
    //#input(void ensureExists(PluginManager, String)): com.dmdirc.logger.ErrorLevel.LOW
    //#input(void ensureExists(PluginManager, String)): configdir
    //#input(void ensureExists(PluginManager, String)): configdir._tainted
    //#input(void ensureExists(PluginManager, String)): pm
    //#input(void ensureExists(PluginManager, String)): serviceType
    //#input(void ensureExists(PluginManager, String)): serviceType._tainted
    //#output(void ensureExists(PluginManager, String)): configdir
    //#output(void ensureExists(PluginManager, String)): java.lang.StringBuilder:toString(...)._tainted
    //#new obj(void ensureExists(PluginManager, String)): java.lang.StringBuilder:toString(...)
    //#pre[3] (void ensureExists(PluginManager, String)): pm != null
    //#pre[2] (void ensureExists(PluginManager, String)): (soft) init'ed(configdir)
    //#presumption(void ensureExists(PluginManager, String)): com.dmdirc.plugins.PluginManager:getServicesByType(...)@161 != null
    //#post(void ensureExists(PluginManager, String)): init'ed(configdir)
    //#post(void ensureExists(PluginManager, String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.System:getenv
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourcesStartingWithAsBytes
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.io.File
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.io.File:mkdirs
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:resourceToFile
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void ensureExists(PluginManager, String)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#test_vector(void ensureExists(PluginManager, String)): java.util.List:isEmpty(...)@161: {0}, {1}
            extractCorePlugins(serviceType + "_");
            pm.getPossiblePluginInfos(true);
    //#Main.java:163: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.plugins.PluginManager:getPossiblePluginInfos(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void ensureExists(PluginManager, String)
    //#    unanalyzed callee: List com.dmdirc.plugins.PluginManager:getPossiblePluginInfos(bool)
        }
    }
    //#Main.java:165: end of method: void com.dmdirc.Main.ensureExists(PluginManager, String)

    /**
     * Attempts to find and activate a service which provides a UI that we
     * can use.
     *
     * @param pm The plugin manager to use to load plugins
     * @param cm The config manager to use to retrieve settings
     */
    protected static void loadUI(final PluginManager pm, final ConfigManager cm) {
        final List<Service> uis = pm.getServicesByType("ui");
    //#Main.java:175: method: void com.dmdirc.Main.loadUI(PluginManager, ConfigManager)
    //#Main.java:175: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.plugins.PluginManager:getServicesByType(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void loadUI(PluginManager, ConfigManager)
    //#    unanalyzed callee: List com.dmdirc.plugins.PluginManager:getServicesByType(String)
    //#input(void loadUI(PluginManager, ConfigManager)): cm
    //#input(void loadUI(PluginManager, ConfigManager)): pm
    //#pre[1] (void loadUI(PluginManager, ConfigManager)): cm != null
    //#pre[2] (void loadUI(PluginManager, ConfigManager)): pm != null
    //#presumption(void loadUI(PluginManager, ConfigManager)): com.dmdirc.plugins.PluginManager:getServicesByType(...)@175 != null
    //#presumption(void loadUI(PluginManager, ConfigManager)): com.dmdirc.plugins.Service:getName(...)@180 != null
    //#presumption(void loadUI(PluginManager, ConfigManager)): java.awt.GraphicsEnvironment:isHeadless(...)@192 == 0
    //#presumption(void loadUI(PluginManager, ConfigManager)): java.util.Iterator:next(...)@179 != null
    //#presumption(void loadUI(PluginManager, ConfigManager)): java.util.Iterator:next(...)@186 != null
    //#test_vector(void loadUI(PluginManager, ConfigManager)): com.dmdirc.plugins.Service:activate(...)@180: {0}, {1}
    //#test_vector(void loadUI(PluginManager, ConfigManager)): com.dmdirc.plugins.Service:activate(...)@187: {0}, {1}
    //#test_vector(void loadUI(PluginManager, ConfigManager)): java.lang.String:equals(...)@180: {0}, {1}
    //#test_vector(void loadUI(PluginManager, ConfigManager)): java.util.Iterator:hasNext(...)@179: {0}, {1}
    //#test_vector(void loadUI(PluginManager, ConfigManager)): java.util.Iterator:hasNext(...)@186: {0}, {1}
        final String desired = cm.getOption("general", "ui");
    //#Main.java:176: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void loadUI(PluginManager, ConfigManager)
    //#    unanalyzed callee: String com.dmdirc.config.ConfigManager:getOption(String, String)

        // First try: go for our desired service type
        for (Service service : uis) {
            if (service.getName().equals(desired) && service.activate()) {
    //#Main.java:180: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.plugins.Service:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void loadUI(PluginManager, ConfigManager)
    //#    unanalyzed callee: String com.dmdirc.plugins.Service:getName()
    //#Main.java:180: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.plugins.Service:activate()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void loadUI(PluginManager, ConfigManager)
    //#    unanalyzed callee: bool com.dmdirc.plugins.Service:activate()
                return;
            }
        }

        // Second try: go for any service type
        for (Service service : uis) {
            if (service.activate()) {
    //#Main.java:187: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.plugins.Service:activate()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void loadUI(PluginManager, ConfigManager)
    //#    unanalyzed callee: bool com.dmdirc.plugins.Service:activate()
                return;
            }
        }

        if (!GraphicsEnvironment.isHeadless()) {
            // Show a dialog informing the user that no UI was found.
            NoUIDialog.displayBlocking();
    //#Main.java:194: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.NoUIDialog:displayBlocking()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void loadUI(PluginManager, ConfigManager)
    //#    unanalyzed callee: void com.dmdirc.ui.NoUIDialog:displayBlocking()
            return;
        }

        // Can't find any
        throw new IllegalStateException("No UIs could be loaded");
    //#Main.java:199: end of method: void com.dmdirc.Main.loadUI(PluginManager, ConfigManager)
    }
    
    /**
     * Executes the first run or migration wizards as required.
     */
    private static void doFirstRun() {
        if (IdentityManager.getGlobalConfig().getOptionBool("general", "firstRun")) {
    //#Main.java:206: method: void com.dmdirc.Main.doFirstRun()
    //#Main.java:206: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void doFirstRun()
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#Main.java:206: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void doFirstRun()
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#input(void doFirstRun()): controller
    //#pre[1] (void doFirstRun()): (soft) controller != null
    //#presumption(void doFirstRun()): com.dmdirc.config.IdentityManager:getConfigIdentity(...)@207 != null
    //#presumption(void doFirstRun()): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@206 != null
    //#unanalyzed(void doFirstRun()): Effects-of-calling:java.util.TimerTask
    //#test_vector(void doFirstRun()): com.dmdirc.config.ConfigManager:getOptionBool(...)@206: {0}, {1}
            IdentityManager.getConfigIdentity().setOption("general", "firstRun", "false");
    //#Main.java:207: Warning: method not available - call not analyzed
    //#    call on Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void doFirstRun()
    //#    unanalyzed callee: Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#Main.java:207: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.Identity:setOption(String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void doFirstRun()
    //#    unanalyzed callee: void com.dmdirc.config.Identity:setOption(String, String, String)
            getUI().showFirstRunWizard();
    //#Main.java:208: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.UIController:showFirstRunWizard()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void doFirstRun()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.UIController:showFirstRunWizard()
            new Timer().schedule(new TimerTask() {
    //#Main.java:209: method: void com.dmdirc.Main$2.com.dmdirc.Main$2()
    //#input(void com.dmdirc.Main$2()): this
    //#Main.java:209: end of method: void com.dmdirc.Main$2.com.dmdirc.Main$2()

                /** {@inheritDoc} */
                @Override
                public void run() {
                    getUI().showFeedbackNag();
    //#Main.java:214: method: void com.dmdirc.Main$2.run()
    //#Main.java:214: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.UIController:showFeedbackNag()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main$2
    //#    method: void run()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.UIController:showFeedbackNag()
    //#input(void run()): com/dmdirc/Main.controller
    //#pre[1] (void run()): com/dmdirc/Main.controller != null
                }
    //#Main.java:215: end of method: void com.dmdirc.Main$2.run()
            }, FEEDBACK_DELAY);
        }
    }
    //#Main.java:218: end of method: void com.dmdirc.Main.doFirstRun()

    /**
     * Quits the client nicely, with the default closing message.
     */
    public static void quit() {
        quit(0);
    //#Main.java:224: method: void com.dmdirc.Main.quit()
    //#input(void quit()): " ["._tainted
    //#input(void quit()): "->"._tainted
    //#input(void quit()): "Illegal server state transition&#10;&#10;"._tainted
    //#input(void quit()): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1).length
    //#input(void quit()): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295]
    //#input(void quit()): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#7).transitions
    //#input(void quit()): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#9).transitions
    //#input(void quit()): com/dmdirc/Channel.__Descendant_Table[com/dmdirc/Channel]
    //#input(void quit()): com/dmdirc/Channel.__Descendant_Table[others]
    //#input(void quit()): com/dmdirc/Channel.__Dispatch_Table.close()V
    //#input(void quit()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/Channel.__Dispatch_Table.resetWindow()V
    //#input(void quit()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void quit()): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void quit()): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/Invite.__Descendant_Table[com/dmdirc/Invite]
    //#input(void quit()): com/dmdirc/Invite.__Descendant_Table[others]
    //#input(void quit()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/Query.__Descendant_Table[com/dmdirc/Query]
    //#input(void quit()): com/dmdirc/Query.__Descendant_Table[others]
    //#input(void quit()): com/dmdirc/Query.__Dispatch_Table.close()V
    //#input(void quit()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/Server$4.$SwitchMap$com$dmdirc$ServerState
    //#input(void quit()): com/dmdirc/Server.DOMAIN_GENERAL
    //#input(void quit()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void quit()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void quit()): com/dmdirc/Server.__Dispatch_Table.disconnect(Ljava/lang/String;)V
    //#input(void quit()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/Server.__Dispatch_Table.removeInvite(Lcom/dmdirc/Invite;)V
    //#input(void quit()): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void quit()): com/dmdirc/ServerManager.me
    //#input(void quit()): com/dmdirc/ServerManager.me.servers
    //#input(void quit()): com/dmdirc/ServerState.CONNECTED
    //#input(void quit()): com/dmdirc/ServerState.DISCONNECTED
    //#input(void quit()): com/dmdirc/ServerState.DISCONNECTING
    //#input(void quit()): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void quit()): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void quit()): com/dmdirc/ServerStatus.__Dispatch_Table.addHistoryEntry(Lcom/dmdirc/ServerState;Lcom/dmdirc/ServerState;)V
    //#input(void quit()): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void quit()): com/dmdirc/ServerStatus.__Dispatch_Table.getTransitionHistory()Ljava/lang/String;
    //#input(void quit()): com/dmdirc/ServerStatus.__Dispatch_Table.transition(Lcom/dmdirc/ServerState;)V
    //#input(void quit()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#output(void quit()): com/dmdirc/ServerManager.me
    //#output(void quit()): new ArrayList(ServerManager#1) num objects
    //#output(void quit()): new ArrayList(ServerManager#1).__Lock
    //#output(void quit()): new ServerManager(getServerManager#1) num objects
    //#output(void quit()): new ServerManager(getServerManager#1).__Tag
    //#output(void quit()): new ServerManager(getServerManager#1).servers
    //#new obj(void quit()): new ArrayList(ServerManager#1)
    //#new obj(void quit()): new ServerManager(getServerManager#1)
    //#pre[1] (void quit()): init'ed(com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295])
    //#pre[4] (void quit()): init'ed(com/dmdirc/ServerManager.me)
    //#post(void quit()): com/dmdirc/ServerManager.me == One-of{old com/dmdirc/ServerManager.me, &new ServerManager(getServerManager#1)}
    //#post(void quit()): com/dmdirc/ServerManager.me != null
    //#post(void quit()): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void quit()): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void quit()): new ArrayList(ServerManager#1).__Lock == undefined
    //#post(void quit()): new ArrayList(ServerManager#1).__Lock == 0, if init'ed
    //#post(void quit()): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1).__Lock
    //#post(void quit()): new ServerManager(getServerManager#1).servers == undefined
    //#post(void quit()): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOption
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void quit()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void quit()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void quit()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void quit()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void quit()): Effects-of-calling:disconnect
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void quit()): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.interfaces.InviteListener:inviteExpired
    //#unanalyzed(void quit()): Effects-of-calling:setIcon
    //#unanalyzed(void quit()): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void quit()): Effects-of-calling:getConfigManager
    //#unanalyzed(void quit()): Effects-of-calling:updateIcon
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionBool
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.parser.irc.ServerInfo:getSSL
    //#unanalyzed(void quit()): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void quit()): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.ServerState:ordinal
    //#unanalyzed(void quit()): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.util.RollingList:getList
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.ServerState:name
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.Thread:currentThread
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.Thread:getStackTrace
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.StackTraceElement:toString
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.Thread:getName
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void quit()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.Object:notifyAll
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void quit()): Effects-of-calling:removeInvites
    //#unanalyzed(void quit()): Effects-of-calling:clearChannels
    //#unanalyzed(void quit()): Effects-of-calling:java.lang.Thread:interrupt
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:disconnect
    //#unanalyzed(void quit()): Effects-of-calling:closeChannels
    //#unanalyzed(void quit()): Effects-of-calling:closeQueries
    //#unanalyzed(void quit()): Effects-of-calling:close
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:updateNames
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void quit()): Effects-of-calling:getFrame
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void quit()): Effects-of-calling:com.dmdirc.ui.interfaces.Window:close
    }
    //#Main.java:225: end of method: void com.dmdirc.Main.quit()
    
    /**
     * Quits the client nicely, with the default closing message.
     * 
     * @param exitCode This is the exit code that will be returned to the 
     *                  operating system when the client exits
     */
    public static void quit(final int exitCode) {
        quit(IdentityManager.getGlobalConfig().getOption("general", 
    //#Main.java:234: method: void com.dmdirc.Main.quit(int)
    //#Main.java:234: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void quit(int)
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#Main.java:234: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void quit(int)
    //#    unanalyzed callee: String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#input(void quit(int)): " ["._tainted
    //#input(void quit(int)): "->"._tainted
    //#input(void quit(int)): "Illegal server state transition&#10;&#10;"._tainted
    //#input(void quit(int)): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1).length
    //#input(void quit(int)): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295]
    //#input(void quit(int)): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#7).transitions
    //#input(void quit(int)): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#9).transitions
    //#input(void quit(int)): com/dmdirc/Channel.__Descendant_Table[com/dmdirc/Channel]
    //#input(void quit(int)): com/dmdirc/Channel.__Descendant_Table[others]
    //#input(void quit(int)): com/dmdirc/Channel.__Dispatch_Table.close()V
    //#input(void quit(int)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/Channel.__Dispatch_Table.resetWindow()V
    //#input(void quit(int)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void quit(int)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/Invite.__Descendant_Table[com/dmdirc/Invite]
    //#input(void quit(int)): com/dmdirc/Invite.__Descendant_Table[others]
    //#input(void quit(int)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/Query.__Descendant_Table[com/dmdirc/Query]
    //#input(void quit(int)): com/dmdirc/Query.__Descendant_Table[others]
    //#input(void quit(int)): com/dmdirc/Query.__Dispatch_Table.close()V
    //#input(void quit(int)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/Server$4.$SwitchMap$com$dmdirc$ServerState
    //#input(void quit(int)): com/dmdirc/Server.DOMAIN_GENERAL
    //#input(void quit(int)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void quit(int)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void quit(int)): com/dmdirc/Server.__Dispatch_Table.disconnect(Ljava/lang/String;)V
    //#input(void quit(int)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/Server.__Dispatch_Table.removeInvite(Lcom/dmdirc/Invite;)V
    //#input(void quit(int)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void quit(int)): com/dmdirc/ServerManager.me
    //#input(void quit(int)): com/dmdirc/ServerManager.me.servers
    //#input(void quit(int)): com/dmdirc/ServerState.CONNECTED
    //#input(void quit(int)): com/dmdirc/ServerState.DISCONNECTED
    //#input(void quit(int)): com/dmdirc/ServerState.DISCONNECTING
    //#input(void quit(int)): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void quit(int)): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void quit(int)): com/dmdirc/ServerStatus.__Dispatch_Table.addHistoryEntry(Lcom/dmdirc/ServerState;Lcom/dmdirc/ServerState;)V
    //#input(void quit(int)): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void quit(int)): com/dmdirc/ServerStatus.__Dispatch_Table.getTransitionHistory()Ljava/lang/String;
    //#input(void quit(int)): com/dmdirc/ServerStatus.__Dispatch_Table.transition(Lcom/dmdirc/ServerState;)V
    //#input(void quit(int)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(int)): exitCode
    //#output(void quit(int)): com/dmdirc/ServerManager.me
    //#output(void quit(int)): new ArrayList(ServerManager#1) num objects
    //#output(void quit(int)): new ArrayList(ServerManager#1).__Lock
    //#output(void quit(int)): new ServerManager(getServerManager#1) num objects
    //#output(void quit(int)): new ServerManager(getServerManager#1).__Tag
    //#output(void quit(int)): new ServerManager(getServerManager#1).servers
    //#new obj(void quit(int)): new ArrayList(ServerManager#1)
    //#new obj(void quit(int)): new ServerManager(getServerManager#1)
    //#pre[1] (void quit(int)): init'ed(com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295])
    //#pre[5] (void quit(int)): init'ed(com/dmdirc/ServerManager.me)
    //#presumption(void quit(int)): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@234 != null
    //#post(void quit(int)): com/dmdirc/ServerManager.me == One-of{old com/dmdirc/ServerManager.me, &new ServerManager(getServerManager#1)}
    //#post(void quit(int)): com/dmdirc/ServerManager.me != null
    //#post(void quit(int)): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void quit(int)): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void quit(int)): new ArrayList(ServerManager#1).__Lock == undefined
    //#post(void quit(int)): new ArrayList(ServerManager#1).__Lock == 0, if init'ed
    //#post(void quit(int)): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1).__Lock
    //#post(void quit(int)): new ServerManager(getServerManager#1).servers == undefined
    //#post(void quit(int)): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void quit(int)): Effects-of-calling:disconnect
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.interfaces.InviteListener:inviteExpired
    //#unanalyzed(void quit(int)): Effects-of-calling:setIcon
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void quit(int)): Effects-of-calling:getConfigManager
    //#unanalyzed(void quit(int)): Effects-of-calling:updateIcon
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionBool
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.parser.irc.ServerInfo:getSSL
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.ServerState:ordinal
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.util.RollingList:getList
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.ServerState:name
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.Thread:currentThread
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.Thread:getStackTrace
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.StackTraceElement:toString
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.Thread:getName
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void quit(int)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.Object:notifyAll
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void quit(int)): Effects-of-calling:removeInvites
    //#unanalyzed(void quit(int)): Effects-of-calling:clearChannels
    //#unanalyzed(void quit(int)): Effects-of-calling:java.lang.Thread:interrupt
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:disconnect
    //#unanalyzed(void quit(int)): Effects-of-calling:closeChannels
    //#unanalyzed(void quit(int)): Effects-of-calling:closeQueries
    //#unanalyzed(void quit(int)): Effects-of-calling:close
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:updateNames
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void quit(int)): Effects-of-calling:getFrame
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void quit(int)): Effects-of-calling:com.dmdirc.ui.interfaces.Window:close
                "closemessage"), exitCode);
    }
    //#Main.java:236: end of method: void com.dmdirc.Main.quit(int)

    /**
     * Quits the client nicely.
     *
     * @param reason The quit reason to send
     */
    public static void quit(final String reason) {
        quit(reason, 0);
    //#Main.java:244: method: void com.dmdirc.Main.quit(String)
    //#input(void quit(String)): " ["._tainted
    //#input(void quit(String)): "->"._tainted
    //#input(void quit(String)): "Illegal server state transition&#10;&#10;"._tainted
    //#input(void quit(String)): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1).length
    //#input(void quit(String)): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295]
    //#input(void quit(String)): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#7).transitions
    //#input(void quit(String)): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#9).transitions
    //#input(void quit(String)): com/dmdirc/Channel.__Descendant_Table[com/dmdirc/Channel]
    //#input(void quit(String)): com/dmdirc/Channel.__Descendant_Table[others]
    //#input(void quit(String)): com/dmdirc/Channel.__Dispatch_Table.close()V
    //#input(void quit(String)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/Channel.__Dispatch_Table.resetWindow()V
    //#input(void quit(String)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void quit(String)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/Invite.__Descendant_Table[com/dmdirc/Invite]
    //#input(void quit(String)): com/dmdirc/Invite.__Descendant_Table[others]
    //#input(void quit(String)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/Query.__Descendant_Table[com/dmdirc/Query]
    //#input(void quit(String)): com/dmdirc/Query.__Descendant_Table[others]
    //#input(void quit(String)): com/dmdirc/Query.__Dispatch_Table.close()V
    //#input(void quit(String)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/Server$4.$SwitchMap$com$dmdirc$ServerState
    //#input(void quit(String)): com/dmdirc/Server.DOMAIN_GENERAL
    //#input(void quit(String)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void quit(String)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void quit(String)): com/dmdirc/Server.__Dispatch_Table.disconnect(Ljava/lang/String;)V
    //#input(void quit(String)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/Server.__Dispatch_Table.removeInvite(Lcom/dmdirc/Invite;)V
    //#input(void quit(String)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void quit(String)): com/dmdirc/ServerManager.me
    //#input(void quit(String)): com/dmdirc/ServerManager.me.servers
    //#input(void quit(String)): com/dmdirc/ServerState.CONNECTED
    //#input(void quit(String)): com/dmdirc/ServerState.DISCONNECTED
    //#input(void quit(String)): com/dmdirc/ServerState.DISCONNECTING
    //#input(void quit(String)): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void quit(String)): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void quit(String)): com/dmdirc/ServerStatus.__Dispatch_Table.addHistoryEntry(Lcom/dmdirc/ServerState;Lcom/dmdirc/ServerState;)V
    //#input(void quit(String)): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void quit(String)): com/dmdirc/ServerStatus.__Dispatch_Table.getTransitionHistory()Ljava/lang/String;
    //#input(void quit(String)): com/dmdirc/ServerStatus.__Dispatch_Table.transition(Lcom/dmdirc/ServerState;)V
    //#input(void quit(String)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String)): reason
    //#output(void quit(String)): com/dmdirc/ServerManager.me
    //#output(void quit(String)): new ArrayList(ServerManager#1) num objects
    //#output(void quit(String)): new ArrayList(ServerManager#1).__Lock
    //#output(void quit(String)): new ServerManager(getServerManager#1) num objects
    //#output(void quit(String)): new ServerManager(getServerManager#1).__Tag
    //#output(void quit(String)): new ServerManager(getServerManager#1).servers
    //#new obj(void quit(String)): new ArrayList(ServerManager#1)
    //#new obj(void quit(String)): new ServerManager(getServerManager#1)
    //#pre[1] (void quit(String)): init'ed(com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295])
    //#pre[4] (void quit(String)): init'ed(com/dmdirc/ServerManager.me)
    //#post(void quit(String)): com/dmdirc/ServerManager.me == One-of{old com/dmdirc/ServerManager.me, &new ServerManager(getServerManager#1)}
    //#post(void quit(String)): com/dmdirc/ServerManager.me != null
    //#post(void quit(String)): new ArrayList(ServerManager#1) num objects <= 1
    //#post(void quit(String)): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void quit(String)): new ArrayList(ServerManager#1).__Lock == undefined
    //#post(void quit(String)): new ArrayList(ServerManager#1).__Lock == 0, if init'ed
    //#post(void quit(String)): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1).__Lock
    //#post(void quit(String)): new ServerManager(getServerManager#1).servers == undefined
    //#post(void quit(String)): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void quit(String)): Effects-of-calling:disconnect
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.interfaces.InviteListener:inviteExpired
    //#unanalyzed(void quit(String)): Effects-of-calling:setIcon
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void quit(String)): Effects-of-calling:getConfigManager
    //#unanalyzed(void quit(String)): Effects-of-calling:updateIcon
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionBool
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.parser.irc.ServerInfo:getSSL
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.ServerState:ordinal
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.util.RollingList:getList
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.ServerState:name
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Thread:currentThread
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Thread:getStackTrace
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.StackTraceElement:toString
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Thread:getName
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Object:notifyAll
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void quit(String)): Effects-of-calling:removeInvites
    //#unanalyzed(void quit(String)): Effects-of-calling:clearChannels
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Thread:interrupt
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:disconnect
    //#unanalyzed(void quit(String)): Effects-of-calling:closeChannels
    //#unanalyzed(void quit(String)): Effects-of-calling:closeQueries
    //#unanalyzed(void quit(String)): Effects-of-calling:close
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:updateNames
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void quit(String)): Effects-of-calling:getFrame
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void quit(String)): Effects-of-calling:com.dmdirc.ui.interfaces.Window:close
    }
    //#Main.java:245: end of method: void com.dmdirc.Main.quit(String)
    
    /**
     * Quits the client nicely.
     *
     * @param reason The quit reason to send
     * @param exitCode This is the exit code that will be returned to the 
     *                  operating system when the client exits
     */
    public static void quit(final String reason, final int exitCode) {
        ServerManager.getServerManager().disconnectAll(reason);
    //#Main.java:255: method: void com.dmdirc.Main.quit(String, int)
    //#Main.java:255: ?never returns: method always exits the program: void quit(String, int).
    //#input(void quit(String, int)): " ["._tainted
    //#input(void quit(String, int)): "->"._tainted
    //#input(void quit(String, int)): "Illegal server state transition&#10;&#10;"._tainted
    //#input(void quit(String, int)): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1).length
    //#input(void quit(String, int)): com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295]
    //#input(void quit(String, int)): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#7).transitions
    //#input(void quit(String, int)): com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#9).transitions
    //#input(void quit(String, int)): com/dmdirc/Channel.__Descendant_Table[com/dmdirc/Channel]
    //#input(void quit(String, int)): com/dmdirc/Channel.__Descendant_Table[others]
    //#input(void quit(String, int)): com/dmdirc/Channel.__Dispatch_Table.close()V
    //#input(void quit(String, int)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/Channel.__Dispatch_Table.resetWindow()V
    //#input(void quit(String, int)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void quit(String, int)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/Invite.__Descendant_Table[com/dmdirc/Invite]
    //#input(void quit(String, int)): com/dmdirc/Invite.__Descendant_Table[others]
    //#input(void quit(String, int)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/Query.__Descendant_Table[com/dmdirc/Query]
    //#input(void quit(String, int)): com/dmdirc/Query.__Descendant_Table[others]
    //#input(void quit(String, int)): com/dmdirc/Query.__Dispatch_Table.close()V
    //#input(void quit(String, int)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/Server$4.$SwitchMap$com$dmdirc$ServerState
    //#input(void quit(String, int)): com/dmdirc/Server.DOMAIN_GENERAL
    //#input(void quit(String, int)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void quit(String, int)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void quit(String, int)): com/dmdirc/Server.__Dispatch_Table.disconnect(Ljava/lang/String;)V
    //#input(void quit(String, int)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/Server.__Dispatch_Table.removeInvite(Lcom/dmdirc/Invite;)V
    //#input(void quit(String, int)): com/dmdirc/ServerManager.__Class_Obj.__Lock
    //#input(void quit(String, int)): com/dmdirc/ServerManager.me
    //#input(void quit(String, int)): com/dmdirc/ServerManager.me.servers
    //#input(void quit(String, int)): com/dmdirc/ServerManager.me.servers.__Lock
    //#input(void quit(String, int)): com/dmdirc/ServerState.CONNECTED
    //#input(void quit(String, int)): com/dmdirc/ServerState.DISCONNECTED
    //#input(void quit(String, int)): com/dmdirc/ServerState.DISCONNECTING
    //#input(void quit(String, int)): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void quit(String, int)): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void quit(String, int)): com/dmdirc/ServerStatus.__Dispatch_Table.addHistoryEntry(Lcom/dmdirc/ServerState;Lcom/dmdirc/ServerState;)V
    //#input(void quit(String, int)): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void quit(String, int)): com/dmdirc/ServerStatus.__Dispatch_Table.getTransitionHistory()Ljava/lang/String;
    //#input(void quit(String, int)): com/dmdirc/ServerStatus.__Dispatch_Table.transition(Lcom/dmdirc/ServerState;)V
    //#input(void quit(String, int)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void quit(String, int)): reason
    //#output(void quit(String, int)): com/dmdirc/ServerManager.me
    //#output(void quit(String, int)): new ArrayList(ServerManager#1) num objects
    //#output(void quit(String, int)): new ArrayList(ServerManager#1).__Lock
    //#output(void quit(String, int)): new ServerManager(getServerManager#1) num objects
    //#output(void quit(String, int)): new ServerManager(getServerManager#1).__Tag
    //#output(void quit(String, int)): new ServerManager(getServerManager#1).servers
    //#new obj(void quit(String, int)): new ArrayList(ServerManager#1)
    //#new obj(void quit(String, int)): new ServerManager(getServerManager#1)
    //#pre[1] (void quit(String, int)): init'ed(com.dmdirc.Server$4__static_init.new int[](Server$4__static_init#1)[0..4_294_967_295])
    //#pre[2] (void quit(String, int)): init'ed(com/dmdirc/ServerManager.me)
    //#presumption(void quit(String, int)): getServerManager(...).servers != null
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void quit(String, int)): Effects-of-calling:disconnect
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.interfaces.InviteListener:inviteExpired
    //#unanalyzed(void quit(String, int)): Effects-of-calling:setIcon
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void quit(String, int)): Effects-of-calling:getConfigManager
    //#unanalyzed(void quit(String, int)): Effects-of-calling:updateIcon
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionBool
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.parser.irc.ServerInfo:getSSL
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.ServerState:ordinal
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.util.RollingList:getList
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.ServerState:name
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.Thread:currentThread
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.Thread:getStackTrace
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.StackTraceElement:toString
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.Thread:getName
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.Object:notifyAll
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void quit(String, int)): Effects-of-calling:removeInvites
    //#unanalyzed(void quit(String, int)): Effects-of-calling:clearChannels
    //#unanalyzed(void quit(String, int)): Effects-of-calling:java.lang.Thread:interrupt
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:disconnect
    //#unanalyzed(void quit(String, int)): Effects-of-calling:closeChannels
    //#unanalyzed(void quit(String, int)): Effects-of-calling:closeQueries
    //#unanalyzed(void quit(String, int)): Effects-of-calling:close
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:updateNames
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void quit(String, int)): Effects-of-calling:getFrame
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void quit(String, int)): Effects-of-calling:com.dmdirc.ui.interfaces.Window:close

        System.exit(exitCode);
    }
    //#Main.java:258: end of method: void com.dmdirc.Main.quit(String, int)

    /**
     * Retrieves the UI controller that's being used by the client.
     *
     * @return The client's UI controller
     */
    public static UIController getUI() {
        return controller;
    //#Main.java:266: method: UIController com.dmdirc.Main.getUI()
    //#input(UIController getUI()): controller
    //#output(UIController getUI()): return_value
    //#pre[1] (UIController getUI()): init'ed(controller)
    //#post(UIController getUI()): return_value == controller
    //#post(UIController getUI()): init'ed(return_value)
    //#Main.java:266: end of method: UIController com.dmdirc.Main.getUI()
    }

    /**
     * Sets the UI controller that should be used by this client.
     *
     * @param newController The new UI Controller
     */
    public static synchronized void setUI(final UIController newController) {
        if (controller == null) {
    //#Main.java:275: method: void com.dmdirc.Main.setUI(UIController)
    //#input(void setUI(UIController)): __Class_Obj.__Lock
    //#input(void setUI(UIController)): controller
    //#input(void setUI(UIController)): newController
    //#output(void setUI(UIController)): controller
    //#pre[2] (void setUI(UIController)): controller == null
    //#post(void setUI(UIController)): controller == newController
    //#post(void setUI(UIController)): init'ed(controller)
            controller = newController;
        } else {
            throw new IllegalStateException("User interface is already set");
        }
    }
    //#Main.java:280: end of method: void com.dmdirc.Main.setUI(UIController)

    /**
     * Returns the application's config directory.
     *
     * @return configuration directory
     */
    public static String getConfigDir() {
        if (configdir == null) {
    //#Main.java:288: method: String com.dmdirc.Main.getConfigDir()
    //#input(String getConfigDir()): ".DMDirc"._tainted
    //#input(String getConfigDir()): "DMDirc"._tainted
    //#input(String getConfigDir()): "Library"._tainted
    //#input(String getConfigDir()): "Preferences"._tainted
    //#input(String getConfigDir()): configdir
    //#output(String getConfigDir()): configdir
    //#output(String getConfigDir()): java.lang.StringBuilder:toString(...)._tainted
    //#output(String getConfigDir()): return_value
    //#new obj(String getConfigDir()): java.lang.StringBuilder:toString(...)
    //#pre[1] (String getConfigDir()): init'ed(configdir)
    //#presumption(String getConfigDir()): java.lang.System:getProperty(...)@290 != null
    //#post(String getConfigDir()): configdir == One-of{old configdir, &java.lang.StringBuilder:toString(...)}
    //#post(String getConfigDir()): configdir != null
    //#post(String getConfigDir()): return_value == configdir
    //#post(String getConfigDir()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#test_vector(String getConfigDir()): configdir: Inverse{null}, Addr_Set{null}
    //#test_vector(String getConfigDir()): java.lang.String:startsWith(...)@291: {0}, {1}
    //#test_vector(String getConfigDir()): java.lang.String:startsWith(...)@294: {0}, {1}
    //#test_vector(String getConfigDir()): java.lang.System:getenv(...)@295: Inverse{null}, Addr_Set{null}
            final String fs = System.getProperty("file.separator");
            final String osName = System.getProperty("os.name");
            if (osName.startsWith("Mac OS")) {
                configdir = System.getProperty("user.home") + fs + "Library"
                        + fs + "Preferences" + fs + "DMDirc" + fs;
            } else if (osName.startsWith("Windows")) {
                if (System.getenv("APPDATA") == null) {
                    configdir = System.getProperty("user.home") + fs + "DMDirc" + fs;
                } else {
                    configdir = System.getenv("APPDATA") + fs + "DMDirc" + fs;
                }
            } else {
                configdir = System.getProperty("user.home") + fs + ".DMDirc" + fs;
            }
        }

        return configdir;
    //#Main.java:305: end of method: String com.dmdirc.Main.getConfigDir()
    }

    /**
     * Sets the config directory for this client.
     *
     * @param newdir The new configuration directory
     */
    public static void setConfigDir(final String newdir) {
        configdir = newdir;
    //#Main.java:314: method: void com.dmdirc.Main.setConfigDir(String)
    //#input(void setConfigDir(String)): newdir
    //#output(void setConfigDir(String)): configdir
    //#post(void setConfigDir(String)): configdir == newdir
    //#post(void setConfigDir(String)): init'ed(configdir)
    }
    //#Main.java:315: end of method: void com.dmdirc.Main.setConfigDir(String)

    /**
     * Extracts plugins bundled with DMDirc to the user's profile's plugin
     * directory.
     *
     * @param prefix If non-null, only plugins whose file name starts with
     * this prefix will be extracted.
     */
    public static void extractCorePlugins(final String prefix) {
        final Map<String, byte[]> resources = ResourceManager.getResourceManager()
    //#Main.java:325: method: void com.dmdirc.Main.extractCorePlugins(String)
    //#Main.java:325: Warning: method not available - call not analyzed
    //#    call on ResourceManager com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void extractCorePlugins(String)
    //#    unanalyzed callee: ResourceManager com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager()
    //#Main.java:325: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.resourcemanager.ResourceManager:getResourcesStartingWithAsBytes(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void extractCorePlugins(String)
    //#    unanalyzed callee: Map com.dmdirc.util.resourcemanager.ResourceManager:getResourcesStartingWithAsBytes(String)
    //#input(void extractCorePlugins(String)): "."._tainted
    //#input(void extractCorePlugins(String)): ".DMDirc"._tainted
    //#input(void extractCorePlugins(String)): "DMDirc"._tainted
    //#input(void extractCorePlugins(String)): "Library"._tainted
    //#input(void extractCorePlugins(String)): "Preferences"._tainted
    //#input(void extractCorePlugins(String)): "plugins"._tainted
    //#input(void extractCorePlugins(String)): com.dmdirc.logger.ErrorLevel.LOW
    //#input(void extractCorePlugins(String)): configdir
    //#input(void extractCorePlugins(String)): configdir._tainted
    //#input(void extractCorePlugins(String)): prefix
    //#output(void extractCorePlugins(String)): configdir
    //#output(void extractCorePlugins(String)): java.lang.StringBuilder:toString(...)._tainted
    //#new obj(void extractCorePlugins(String)): java.lang.StringBuilder:toString(...)
    //#pre[2] (void extractCorePlugins(String)): (soft) init'ed(configdir)
    //#presumption(void extractCorePlugins(String)): init'ed(com.dmdirc.logger.ErrorLevel.LOW)
    //#presumption(void extractCorePlugins(String)): com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager(...)@325 != null
    //#presumption(void extractCorePlugins(String)): com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager(...)@348 != null
    //#presumption(void extractCorePlugins(String)): com.dmdirc.util.resourcemanager.ResourceManager:getResourcesStartingWithAsBytes(...)@325 != null
    //#presumption(void extractCorePlugins(String)): java.lang.String:lastIndexOf(...)@343 <= 4_294_967_294
    //#presumption(void extractCorePlugins(String)): java.util.Iterator:next(...)@327 != null
    //#presumption(void extractCorePlugins(String)): java.util.Map:entrySet(...)@327 != null
    //#presumption(void extractCorePlugins(String)): java.util.Map_Entry:getKey(...)@329 != null
    //#presumption(void extractCorePlugins(String)): java.util.Map_Entry:getKey(...)@332 != null
    //#post(void extractCorePlugins(String)): init'ed(configdir)
    //#post(void extractCorePlugins(String)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#unanalyzed(void extractCorePlugins(String)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void extractCorePlugins(String)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void extractCorePlugins(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void extractCorePlugins(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void extractCorePlugins(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void extractCorePlugins(String)): Effects-of-calling:java.lang.System:getenv
    //#test_vector(void extractCorePlugins(String)): prefix: Addr_Set{null}, Inverse{null}
    //#test_vector(void extractCorePlugins(String)): java.io.File:exists(...)@339: {1}, {0}
    //#test_vector(void extractCorePlugins(String)): java.io.File:isDirectory(...)@347: {1}, {0}
    //#test_vector(void extractCorePlugins(String)): java.lang.String:startsWith(...)@332: {1}, {0}
    //#test_vector(void extractCorePlugins(String)): java.util.Iterator:hasNext(...)@327: {0}, {1}
                .getResourcesStartingWithAsBytes("plugins");
        for (Map.Entry<String, byte[]> resource : resources.entrySet()) {
            try {
                final String resourceName = Main.getConfigDir() + "plugins"
                        + resource.getKey().substring(7);

                if (prefix != null && !resource.getKey().substring(8).startsWith(prefix)) {
                    continue;
                }

                final File newDir = new File(resourceName.substring(0,
                        resourceName.lastIndexOf('/')) + "/");

                if (!newDir.exists()) {
                    newDir.mkdirs();
                }

                final File newFile = new File(newDir,
                        resourceName.substring(resourceName.lastIndexOf('/') + 1,
                        resourceName.length()));

                if (!newFile.isDirectory()) {
                    ResourceManager.getResourceManager().
    //#Main.java:348: Warning: method not available - call not analyzed
    //#    call on ResourceManager com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void extractCorePlugins(String)
    //#    unanalyzed callee: ResourceManager com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager()
    //#Main.java:348: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.resourcemanager.ResourceManager:resourceToFile(byte[], File)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void extractCorePlugins(String)
    //#    unanalyzed callee: void com.dmdirc.util.resourcemanager.ResourceManager:resourceToFile(byte[], File)
                            resourceToFile(resource.getValue(), newFile);
                }
            } catch (IOException ex) {
                Logger.userError(ErrorLevel.LOW, "Failed to extract plugins", ex);
    //#Main.java:352: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Main
    //#    method: void extractCorePlugins(String)
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String, Throwable)
            }
        }
    }
    //#Main.java:355: end of method: void com.dmdirc.Main.extractCorePlugins(String)

}
    //#output(com.dmdirc.Main$2__static_init): __Descendant_Table[com/dmdirc/Main$2]
    //#output(com.dmdirc.Main$2__static_init): __Dispatch_Table.run()V
    //#post(com.dmdirc.Main$2__static_init): __Descendant_Table[com/dmdirc/Main$2] == &__Dispatch_Table
    //#post(com.dmdirc.Main$2__static_init): __Dispatch_Table.run()V == &run
    //#Main.java:: end of method: com.dmdirc.Main$2.com.dmdirc.Main$2__static_init
    //#Main.java:: end of class: com.dmdirc.Main$2
    //#output(com.dmdirc.Main$1__static_init): __Descendant_Table[com/dmdirc/Main$1]
    //#output(com.dmdirc.Main$1__static_init): __Dispatch_Table.run()V
    //#post(com.dmdirc.Main$1__static_init): __Descendant_Table[com/dmdirc/Main$1] == &__Dispatch_Table
    //#post(com.dmdirc.Main$1__static_init): __Dispatch_Table.run()V == &run
    //#Main.java:: end of method: com.dmdirc.Main$1.com.dmdirc.Main$1__static_init
    //#Main.java:: end of class: com.dmdirc.Main$1
    //#output(com.dmdirc.Main__static_init): __Descendant_Table[com/dmdirc/Main]
    //#post(com.dmdirc.Main__static_init): __Descendant_Table[com/dmdirc/Main] == &__Dispatch_Table
    //#Main.java:: end of method: com.dmdirc.Main.com.dmdirc.Main__static_init
    //#Main.java:: end of class: com.dmdirc.Main
