//# 19 errors, 944 messages
//#
/*
    //#ActionSubstitutor.java:1:1: class: com.dmdirc.actions.ActionSubstitutor
    //#ActionSubstitutor.java:1:1: method: com.dmdirc.actions.ActionSubstitutor.com.dmdirc.actions.ActionSubstitutor__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.actions;

import com.dmdirc.actions.interfaces.ActionType;
import com.dmdirc.actions.interfaces.ActionComponent;
import com.dmdirc.FrameContainer;
import com.dmdirc.Server;
import com.dmdirc.ServerState;
import com.dmdirc.config.IdentityManager;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Handles the substitution of variables into action targets and responses.
 *
 * @author Chris
 */
public class ActionSubstitutor {
    
    /** The action type this substitutor is for. */
    private final ActionType type;
    
    /**
     * Creates a new substitutor for the specified action type.
     *
     * @param type The action type this substitutor is for
     */
    public ActionSubstitutor(final ActionType type) {
    //#ActionSubstitutor.java:51: method: void com.dmdirc.actions.ActionSubstitutor.com.dmdirc.actions.ActionSubstitutor(ActionType)
    //#input(void com.dmdirc.actions.ActionSubstitutor(ActionType)): this
    //#input(void com.dmdirc.actions.ActionSubstitutor(ActionType)): type
    //#output(void com.dmdirc.actions.ActionSubstitutor(ActionType)): this.type
    //#post(void com.dmdirc.actions.ActionSubstitutor(ActionType)): this.type == type
    //#post(void com.dmdirc.actions.ActionSubstitutor(ActionType)): init'ed(this.type)
        this.type = type;
    }
    //#ActionSubstitutor.java:53: end of method: void com.dmdirc.actions.ActionSubstitutor.com.dmdirc.actions.ActionSubstitutor(ActionType)
    
    /**
     * Retrieves a list of global config variables that will be substituted.
     * Note: does not include initial $.
     *
     * @return A list of global variable names that will be substituted
     */
    public Set<String> getConfigSubstitutions() {
        return IdentityManager.getGlobalConfig().getOptions("actions").keySet();
    //#ActionSubstitutor.java:62: method: Set com.dmdirc.actions.ActionSubstitutor.getConfigSubstitutions()
    //#ActionSubstitutor.java:62: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Set getConfigSubstitutions()
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#ActionSubstitutor.java:62: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.config.ConfigManager:getOptions(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Set getConfigSubstitutions()
    //#    unanalyzed callee: Map com.dmdirc.config.ConfigManager:getOptions(String)
    //#output(Set getConfigSubstitutions()): return_value
    //#presumption(Set getConfigSubstitutions()): com.dmdirc.config.ConfigManager:getOptions(...)@62 != null
    //#presumption(Set getConfigSubstitutions()): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@62 != null
    //#post(Set getConfigSubstitutions()): init'ed(return_value)
    //#ActionSubstitutor.java:62: end of method: Set com.dmdirc.actions.ActionSubstitutor.getConfigSubstitutions()
    }
    
    /**
     * Substitutes in config variables into the specified target.
     *
     * @param target The StringBuilder to modify
     */
    private void doConfigSubstitutions(final StringBuilder target) {
        for (Map.Entry<String, String> option 
                : IdentityManager.getGlobalConfig().getOptions("actions").entrySet()) {
    //#ActionSubstitutor.java:72: method: void com.dmdirc.actions.ActionSubstitutor.doConfigSubstitutions(StringBuilder)
    //#ActionSubstitutor.java:72: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doConfigSubstitutions(StringBuilder)
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#ActionSubstitutor.java:72: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.config.ConfigManager:getOptions(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doConfigSubstitutions(StringBuilder)
    //#    unanalyzed callee: Map com.dmdirc.config.ConfigManager:getOptions(String)
    //#input(void doConfigSubstitutions(StringBuilder)): "$"._tainted
    //#input(void doConfigSubstitutions(StringBuilder)): target
    //#input(void doConfigSubstitutions(StringBuilder)): this
    //#pre[1] (void doConfigSubstitutions(StringBuilder)): (soft) target != null
    //#presumption(void doConfigSubstitutions(StringBuilder)): com.dmdirc.config.ConfigManager:getOptions(...)@72 != null
    //#presumption(void doConfigSubstitutions(StringBuilder)): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@72 != null
    //#presumption(void doConfigSubstitutions(StringBuilder)): java.util.Iterator:next(...)@72 != null
    //#presumption(void doConfigSubstitutions(StringBuilder)): java.util.Map:entrySet(...)@72 != null
    //#unanalyzed(void doConfigSubstitutions(StringBuilder)): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void doConfigSubstitutions(StringBuilder)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void doConfigSubstitutions(StringBuilder)): Effects-of-calling:java.lang.StringBuilder:replace
    //#test_vector(void doConfigSubstitutions(StringBuilder)): java.util.Iterator:hasNext(...)@72: {0}, {1}
            doReplacement(target, "$" + option.getKey(), option.getValue());
        }
    }
    //#ActionSubstitutor.java:75: end of method: void com.dmdirc.actions.ActionSubstitutor.doConfigSubstitutions(StringBuilder)
    
    /**
     * Retrieves a list of substitutions derived from argument and component
     * combinations, along with a corresponding friendly name for them.
     * Note: does not include initial $.
     *
     * @return A map of component substitution names and their descriptions
     */
    public Map<String, String> getComponentSubstitutions() {
        final Map<String, String> res = new HashMap<String, String>();
    //#ActionSubstitutor.java:85: method: Map com.dmdirc.actions.ActionSubstitutor.getComponentSubstitutions()
    //#ActionSubstitutor.java:85: Warning: suspicious precondition
    //#    The precondition for this.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    suspicious precondition index: [3]
    //#ActionSubstitutor.java:85: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    suspicious precondition index: [6]
    //#    Attribs:  Soft
    //#ActionSubstitutor.java:85: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    suspicious precondition index: [7]
    //#    Attribs:  Soft
    //#input(Map getComponentSubstitutions()): "'s "._tainted
    //#input(Map getComponentSubstitutions()): "."._tainted
    //#input(Map getComponentSubstitutions()): "{"._tainted
    //#input(Map getComponentSubstitutions()): "}"._tainted
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/ActionManager.actionComponents
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgNames()[Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgNames()[Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgNames()[Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgNames()[Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgNames()[Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgNames()[Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgNames()[Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(Map getComponentSubstitutions()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgNames()[Ljava/lang/String;
    //#input(Map getComponentSubstitutions()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getComponentSubstitutions()): this
    //#input(Map getComponentSubstitutions()): this.type
    //#input(Map getComponentSubstitutions()): this.type.__Tag
    //#input(Map getComponentSubstitutions()): this.type.type
    //#input(Map getComponentSubstitutions()): this.type.type.__Tag
    //#output(Map getComponentSubstitutions()): new HashMap(getComponentSubstitutions#1) num objects
    //#output(Map getComponentSubstitutions()): return_value
    //#new obj(Map getComponentSubstitutions()): new HashMap(getComponentSubstitutions#1)
    //#pre[2] (Map getComponentSubstitutions()): this.type != null
    //#pre[3] (Map getComponentSubstitutions()): this.type.__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[4] (Map getComponentSubstitutions()): (soft) this.type.type != null
    //#pre[5] (Map getComponentSubstitutions()): (soft) this.type.type != null
    //#pre[6] (Map getComponentSubstitutions()): (soft) this.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}
    //#pre[7] (Map getComponentSubstitutions()): (soft) this.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}
    //#presumption(Map getComponentSubstitutions()): arr$.length@88 <= 4_294_967_295
    //#presumption(Map getComponentSubstitutions()): getArgNames(...).length@91 >= 1
    //#presumption(Map getComponentSubstitutions()): arr$.length@88 <= getArgNames(...).length@91
    //#presumption(Map getComponentSubstitutions()): getArgNames(...)@91 != null
    //#presumption(Map getComponentSubstitutions()): getArgTypes(...)@88 != null
    //#presumption(Map getComponentSubstitutions()): java.util.Iterator:next(...)@89 != null
    //#post(Map getComponentSubstitutions()): return_value == &new HashMap(getComponentSubstitutions#1)
    //#post(Map getComponentSubstitutions()): new HashMap(getComponentSubstitutions#1) num objects == 1
    //#unanalyzed(Map getComponentSubstitutions()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(Map getComponentSubstitutions()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(Map getComponentSubstitutions()): Effects-of-calling:java.util.List:add
    //#unanalyzed(Map getComponentSubstitutions()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(Map getComponentSubstitutions()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(Map getComponentSubstitutions()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(Map getComponentSubstitutions()): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(Map getComponentSubstitutions()): Effects-of-calling:appliesTo
    //#test_vector(Map getComponentSubstitutions()): java.util.Iterator:hasNext(...)@89: {0}, {1}
        
        int i = 0;
        for (Class myClass : type.getType().getArgTypes()) {
    //#ActionSubstitutor.java:88: ?use of default init
    //#    init'ed(getType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getType(...).__Tag)
    //#    VN: getType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionSubstitutor.java:88: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ActionSubstitutor.java:88: Warning: call too complex - analysis skipped
    //#    call on Class[] getArgTypes()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    unanalyzed callee: Class[] getArgTypes()
            for (ActionComponent comp : ActionManager.getCompatibleComponents(myClass)) {
    //#ActionSubstitutor.java:89: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    basic block: bb_9
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
                final String key = "{" + i + "." + comp.toString() + "}";
                final String desc = type.getType().getArgNames()[i] + "'s " + comp.getName();
    //#ActionSubstitutor.java:91: ?use of default init
    //#    init'ed(getType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    basic block: bb_8
    //#    assertion: init'ed(getType(...).__Tag)
    //#    VN: getType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionSubstitutor.java:91: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    basic block: bb_8
    //#    assertion: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ActionSubstitutor.java:91: Warning: call too complex - analysis skipped
    //#    call on String[] getArgNames()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    unanalyzed callee: String[] getArgNames()
    //#ActionSubstitutor.java:91: Warning: call too complex - analysis skipped
    //#    call on String getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getComponentSubstitutions()
    //#    unanalyzed callee: String getName()
                
                res.put(key, desc);
            }
            
            i++;
        }
        
        return res;
    //#ActionSubstitutor.java:99: end of method: Map com.dmdirc.actions.ActionSubstitutor.getComponentSubstitutions()
    }
    
    /**
     * Substitutes in component-style substitutions.
     *
     * @param target The stringbuilder to be changed
     * @param args The arguments passed for this action type
     */
    private void doComponentSubstitutions(final StringBuilder target, final Object ... args) {
        int i = 0;
    //#ActionSubstitutor.java:109: method: void com.dmdirc.actions.ActionSubstitutor.doComponentSubstitutions(StringBuilder, Object[])
    //#ActionSubstitutor.java:109: Warning: suspicious precondition
    //#    The precondition for this.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doComponentSubstitutions(StringBuilder, Object[])
    //#    suspicious precondition index: [7]
    //#ActionSubstitutor.java:109: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doComponentSubstitutions(StringBuilder, Object[])
    //#    suspicious precondition index: [10]
    //#    Attribs:  Soft
    //#ActionSubstitutor.java:109: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doComponentSubstitutions(StringBuilder, Object[])
    //#    suspicious precondition index: [11]
    //#    Attribs:  Soft
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): "${"._tainted
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): "."._tainted
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): "}"._tainted
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): args
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): args.length
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): args[0..4_294_967_295]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/ActionManager.actionComponents
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): target
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): this
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): this.type
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): this.type.__Tag
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): this.type.type
    //#input(void doComponentSubstitutions(StringBuilder, Object[])): this.type.type.__Tag
    //#pre[6] (void doComponentSubstitutions(StringBuilder, Object[])): this.type != null
    //#pre[7] (void doComponentSubstitutions(StringBuilder, Object[])): this.type.__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[1] (void doComponentSubstitutions(StringBuilder, Object[])): (soft) args != null
    //#pre[3] (void doComponentSubstitutions(StringBuilder, Object[])): (soft) init'ed(args[0..4_294_967_295])
    //#pre[4] (void doComponentSubstitutions(StringBuilder, Object[])): (soft) target != null
    //#pre[8] (void doComponentSubstitutions(StringBuilder, Object[])): (soft) this.type.type != null
    //#pre[9] (void doComponentSubstitutions(StringBuilder, Object[])): (soft) this.type.type != null
    //#pre[10] (void doComponentSubstitutions(StringBuilder, Object[])): (soft) this.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}
    //#pre[11] (void doComponentSubstitutions(StringBuilder, Object[])): (soft) this.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}
    //#presumption(void doComponentSubstitutions(StringBuilder, Object[])): arr$.length@110 <= 4_294_967_295
    //#presumption(void doComponentSubstitutions(StringBuilder, Object[])): arr$.length@110 <= args.length
    //#presumption(void doComponentSubstitutions(StringBuilder, Object[])): getArgTypes(...)@110 != null
    //#presumption(void doComponentSubstitutions(StringBuilder, Object[])): java.util.Iterator:next(...)@112 != null
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void doComponentSubstitutions(StringBuilder, Object[])): Effects-of-calling:appliesTo
    //#test_vector(void doComponentSubstitutions(StringBuilder, Object[])): args[0..4_294_967_295]: Addr_Set{null}, Inverse{null}
    //#test_vector(void doComponentSubstitutions(StringBuilder, Object[])): get(...)@114: Addr_Set{null}, Inverse{null}
    //#test_vector(void doComponentSubstitutions(StringBuilder, Object[])): java.util.Iterator:hasNext(...)@112: {0}, {1}
        for (Class myClass : type.getType().getArgTypes()) {
    //#ActionSubstitutor.java:110: ?use of default init
    //#    init'ed(getType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doComponentSubstitutions(StringBuilder, Object[])
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getType(...).__Tag)
    //#    VN: getType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionSubstitutor.java:110: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doComponentSubstitutions(StringBuilder, Object[])
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ActionSubstitutor.java:110: Warning: call too complex - analysis skipped
    //#    call on Class[] getArgTypes()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doComponentSubstitutions(StringBuilder, Object[])
    //#    unanalyzed callee: Class[] getArgTypes()
            if (args[i] != null) {
                for (ActionComponent comp : ActionManager.getCompatibleComponents(myClass)) {
    //#ActionSubstitutor.java:112: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doComponentSubstitutions(StringBuilder, Object[])
    //#    basic block: bb_12
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
                    final String needle = "${" + i + "." + comp.toString() + "}";
                    final Object replacement = comp.get(args[i]);
    //#ActionSubstitutor.java:114: Warning: call too complex - analysis skipped
    //#    call on Object get(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doComponentSubstitutions(StringBuilder, Object[])
    //#    unanalyzed callee: Object get(Object)

                    if (replacement != null) {
                        doReplacement(target, needle, replacement.toString());
                    }
                }
            }
            
            i++;
        }
    }
    //#ActionSubstitutor.java:124: end of method: void com.dmdirc.actions.ActionSubstitutor.doComponentSubstitutions(StringBuilder, Object[])
    
    /**
     * Retrieves a list of server substitutions, if this action type supports
     * them.
     * Note: does not include initial $.
     *
     * @return A map of server substitution names and their descriptions.
     */
    public Map<String, String> getServerSubstitutions() {
        final Map<String, String> res = new HashMap<String, String>();
    //#ActionSubstitutor.java:134: method: Map com.dmdirc.actions.ActionSubstitutor.getServerSubstitutions()
    //#ActionSubstitutor.java:134: Warning: suspicious precondition
    //#    The precondition for this.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getServerSubstitutions()
    //#    suspicious precondition index: [3]
    //#ActionSubstitutor.java:134: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getServerSubstitutions()
    //#    suspicious precondition index: [6]
    //#    Attribs:  Soft
    //#ActionSubstitutor.java:134: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getServerSubstitutions()
    //#    suspicious precondition index: [7]
    //#    Attribs:  Soft
    //#input(Map getServerSubstitutions()): "The connection's "._tainted
    //#input(Map getServerSubstitutions()): "{"._tainted
    //#input(Map getServerSubstitutions()): "}"._tainted
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/ActionManager.actionComponents
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(Map getServerSubstitutions()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(Map getServerSubstitutions()): this
    //#input(Map getServerSubstitutions()): this.type
    //#input(Map getServerSubstitutions()): this.type.__Tag
    //#input(Map getServerSubstitutions()): this.type.type
    //#input(Map getServerSubstitutions()): this.type.type.__Tag
    //#output(Map getServerSubstitutions()): new HashMap(getServerSubstitutions#1) num objects
    //#output(Map getServerSubstitutions()): return_value
    //#new obj(Map getServerSubstitutions()): new HashMap(getServerSubstitutions#1)
    //#pre[2] (Map getServerSubstitutions()): this.type != null
    //#pre[3] (Map getServerSubstitutions()): this.type.__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[4] (Map getServerSubstitutions()): (soft) this.type.type != null
    //#pre[5] (Map getServerSubstitutions()): (soft) this.type.type != null
    //#pre[6] (Map getServerSubstitutions()): (soft) this.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}
    //#pre[7] (Map getServerSubstitutions()): (soft) this.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}
    //#presumption(Map getServerSubstitutions()): getCompatibleComponents(...)@137 init'ed
    //#presumption(Map getServerSubstitutions()): java.util.Iterator:next(...)@137 != null
    //#post(Map getServerSubstitutions()): return_value == &new HashMap(getServerSubstitutions#1)
    //#post(Map getServerSubstitutions()): new HashMap(getServerSubstitutions#1) num objects == 1
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:getType
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:getArgTypes
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:java.lang.Class:getSuperclass
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:java.util.List:add
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(Map getServerSubstitutions()): Effects-of-calling:appliesTo
    //#test_vector(Map getServerSubstitutions()): java.util.Iterator:hasNext(...)@137: {0}, {1}
        
        if (hasFrameContainer()) {
            for (ActionComponent comp : ActionManager.getCompatibleComponents(Server.class)) {
    //#ActionSubstitutor.java:137: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getServerSubstitutions()
    //#    basic block: bb_7
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
                final String key = "{" + comp.toString() + "}";
                final String desc = "The connection's " + comp.getName();
    //#ActionSubstitutor.java:139: Warning: call too complex - analysis skipped
    //#    call on String getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: Map getServerSubstitutions()
    //#    unanalyzed callee: String getName()
                
                res.put(key, desc);
            }
        }
        
        return res;
    //#ActionSubstitutor.java:145: end of method: Map com.dmdirc.actions.ActionSubstitutor.getServerSubstitutions()
    }
    
    /**
     * Substitutes in server substitutions.
     *
     * @param target The stringbuilder to be changed
     * @param args The arguments passed for this action type
     */
    private void doServerSubstitutions(final StringBuilder target, final Object ... args) {
        if (args.length > 0 && args[0] instanceof FrameContainer) {
    //#ActionSubstitutor.java:155: method: void com.dmdirc.actions.ActionSubstitutor.doServerSubstitutions(StringBuilder, Object[])
    //#ActionSubstitutor.java:155: Warning: suspicious precondition
    //#    The precondition for args[0].__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doServerSubstitutions(StringBuilder, Object[])
    //#    suspicious precondition index: [6]
    //#    Attribs:  Soft
    //#input(void doServerSubstitutions(StringBuilder, Object[])): "${"._tainted
    //#input(void doServerSubstitutions(StringBuilder, Object[])): "}"._tainted
    //#input(void doServerSubstitutions(StringBuilder, Object[])): args
    //#input(void doServerSubstitutions(StringBuilder, Object[])): args.length
    //#input(void doServerSubstitutions(StringBuilder, Object[])): args[0]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): args[0].__Tag
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/Channel.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/FrameContainer.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/Query.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/Raw.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/Server.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/ServerState.CONNECTED
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/ActionManager.actionComponents
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doServerSubstitutions(StringBuilder, Object[])): target
    //#input(void doServerSubstitutions(StringBuilder, Object[])): this
    //#pre[2] (void doServerSubstitutions(StringBuilder, Object[])): args != null
    //#pre[4] (void doServerSubstitutions(StringBuilder, Object[])): (soft) init'ed(args[0])
    //#pre[6] (void doServerSubstitutions(StringBuilder, Object[])): (soft) args[0].__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#pre[7] (void doServerSubstitutions(StringBuilder, Object[])): (soft) target != null
    //#presumption(void doServerSubstitutions(StringBuilder, Object[])): getCompatibleComponents(...)@164 init'ed
    //#presumption(void doServerSubstitutions(StringBuilder, Object[])): java.util.Iterator:next(...)@164 != null
    //#presumption(void doServerSubstitutions(StringBuilder, Object[])): server.__Tag@156 == com/dmdirc/Server
    //#presumption(void doServerSubstitutions(StringBuilder, Object[])): server.myState.__Tag@156 == com/dmdirc/ServerStatus
    //#presumption(void doServerSubstitutions(StringBuilder, Object[])): server.myState.state@156 != null
    //#presumption(void doServerSubstitutions(StringBuilder, Object[])): server.myState@156 != null
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void doServerSubstitutions(StringBuilder, Object[])): Effects-of-calling:appliesTo
    //#test_vector(void doServerSubstitutions(StringBuilder, Object[])): args.length: {0}, {1..+Inf}
    //#test_vector(void doServerSubstitutions(StringBuilder, Object[])): args[0]: Addr_Set{null}, Inverse{null}
    //#test_vector(void doServerSubstitutions(StringBuilder, Object[])): com.dmdirc.ServerState:equals(...)@160: {1}, {0}
    //#test_vector(void doServerSubstitutions(StringBuilder, Object[])): get(...)@166: Addr_Set{null}, Inverse{null}
    //#test_vector(void doServerSubstitutions(StringBuilder, Object[])): getServer(...)@156: Addr_Set{null}, Inverse{null}
            final Server server = ((FrameContainer) args[0]).getServer();
    //#ActionSubstitutor.java:156: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doServerSubstitutions(StringBuilder, Object[])
    //#    unanalyzed callee: Server getServer()
        
            if (server != null) {
                synchronized (server.getState()) {
                    if (!server.getState().equals(ServerState.CONNECTED)) {
    //#ActionSubstitutor.java:160: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.ServerState:equals(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doServerSubstitutions(StringBuilder, Object[])
    //#    unanalyzed callee: bool com.dmdirc.ServerState:equals(Object)
                        return;
                    }
                    
                    for (ActionComponent comp : ActionManager.getCompatibleComponents(Server.class)) {
    //#ActionSubstitutor.java:164: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doServerSubstitutions(StringBuilder, Object[])
    //#    basic block: bb_21
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
                        final String key = "${" + comp.toString() + "}";
                        final Object res = comp.get(((FrameContainer) args[0]).getServer());
    //#ActionSubstitutor.java:166: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doServerSubstitutions(StringBuilder, Object[])
    //#    unanalyzed callee: Server getServer()
    //#ActionSubstitutor.java:166: Warning: call too complex - analysis skipped
    //#    call on Object get(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doServerSubstitutions(StringBuilder, Object[])
    //#    unanalyzed callee: Object get(Object)

                        if (res != null) {
                            doReplacement(target, key, res.toString());
                        }
                    }
                }
            }
        }
    }
    //#ActionSubstitutor.java:175: end of method: void com.dmdirc.actions.ActionSubstitutor.doServerSubstitutions(StringBuilder, Object[])
    
    /**
     * Returns true if this action type's first argument is a frame container,
     * or descendent of one.
     *
     * @return True if this action type's first arg extends or is a FrameContainer
     */
    private boolean hasFrameContainer() {
        Class target = null;
    //#ActionSubstitutor.java:184: method: bool com.dmdirc.actions.ActionSubstitutor.hasFrameContainer()
    //#ActionSubstitutor.java:184: Warning: suspicious precondition
    //#    The precondition for this.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool hasFrameContainer()
    //#    suspicious precondition index: [3]
    //#ActionSubstitutor.java:184: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool hasFrameContainer()
    //#    suspicious precondition index: [6]
    //#    Attribs:  Soft
    //#ActionSubstitutor.java:184: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool hasFrameContainer()
    //#    suspicious precondition index: [7]
    //#    Attribs:  Soft
    //#input(bool hasFrameContainer()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(bool hasFrameContainer()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool hasFrameContainer()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool hasFrameContainer()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool hasFrameContainer()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool hasFrameContainer()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool hasFrameContainer()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool hasFrameContainer()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool hasFrameContainer()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool hasFrameContainer()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool hasFrameContainer()): this
    //#input(bool hasFrameContainer()): this.type
    //#input(bool hasFrameContainer()): this.type.__Tag
    //#input(bool hasFrameContainer()): this.type.type
    //#input(bool hasFrameContainer()): this.type.type.__Tag
    //#output(bool hasFrameContainer()): return_value
    //#pre[2] (bool hasFrameContainer()): this.type != null
    //#pre[3] (bool hasFrameContainer()): this.type.__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[4] (bool hasFrameContainer()): (soft) this.type.type != null
    //#pre[5] (bool hasFrameContainer()): (soft) this.type.type != null
    //#pre[6] (bool hasFrameContainer()): (soft) this.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}
    //#pre[7] (bool hasFrameContainer()): (soft) this.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}
    //#presumption(bool hasFrameContainer()): getArgTypes(...).length@187 >= 1
    //#presumption(bool hasFrameContainer()): getArgTypes(...)@186 != null
    //#presumption(bool hasFrameContainer()): getArgTypes(...)@187 != null
    //#post(bool hasFrameContainer()): init'ed(return_value)
    //#test_vector(bool hasFrameContainer()): getArgTypes(...).length@186: {0}, {1..+Inf}
        
        if (type.getType().getArgTypes().length > 0) {
    //#ActionSubstitutor.java:186: ?use of default init
    //#    init'ed(getType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool hasFrameContainer()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getType(...).__Tag)
    //#    VN: getType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionSubstitutor.java:186: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool hasFrameContainer()
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ActionSubstitutor.java:186: Warning: call too complex - analysis skipped
    //#    call on Class[] getArgTypes()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool hasFrameContainer()
    //#    unanalyzed callee: Class[] getArgTypes()
            target = type.getType().getArgTypes()[0];
    //#ActionSubstitutor.java:187: ?use of default init
    //#    init'ed(getType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool hasFrameContainer()
    //#    basic block: bb_2
    //#    assertion: init'ed(getType(...).__Tag)
    //#    VN: getType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionSubstitutor.java:187: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool hasFrameContainer()
    //#    basic block: bb_2
    //#    assertion: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ActionSubstitutor.java:187: Warning: call too complex - analysis skipped
    //#    call on Class[] getArgTypes()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool hasFrameContainer()
    //#    unanalyzed callee: Class[] getArgTypes()
            
            while (target != null && target != FrameContainer.class) {
                target = target.getSuperclass();
            }
        }
        
        return target == FrameContainer.class;
    //#ActionSubstitutor.java:194: end of method: bool com.dmdirc.actions.ActionSubstitutor.hasFrameContainer()
    }
    
    /**
     * Determines whether or not word substitutions will work for this action
     * type. Word substitutions take the form $1, $1-5, $6-, etc.
     *
     * @return True if word substitutions are supported, false otherwise.
     */
    public boolean usesWordSubstitutions() {
        return type.getType().getArgTypes().length > 2 && type.getType().getArgTypes()[2] == String[].class;
    //#ActionSubstitutor.java:204: method: bool com.dmdirc.actions.ActionSubstitutor.usesWordSubstitutions()
    //#ActionSubstitutor.java:204: ?use of default init
    //#    init'ed(getType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool usesWordSubstitutions()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getType(...).__Tag)
    //#    VN: getType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionSubstitutor.java:204: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool usesWordSubstitutions()
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ActionSubstitutor.java:204: Warning: call too complex - analysis skipped
    //#    call on Class[] getArgTypes()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool usesWordSubstitutions()
    //#    unanalyzed callee: Class[] getArgTypes()
    //#ActionSubstitutor.java:204: ?use of default init
    //#    init'ed(getType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool usesWordSubstitutions()
    //#    basic block: bb_2
    //#    assertion: init'ed(getType(...).__Tag)
    //#    VN: getType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionSubstitutor.java:204: ?null dereference
    //#    com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool usesWordSubstitutions()
    //#    basic block: bb_2
    //#    assertion: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag] != null
    //#    VN: com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[getType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ActionSubstitutor.java:204: Warning: suspicious precondition
    //#    The precondition for this.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool usesWordSubstitutions()
    //#    suspicious precondition index: [3]
    //#ActionSubstitutor.java:204: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool usesWordSubstitutions()
    //#    suspicious precondition index: [6]
    //#    Attribs:  Soft
    //#ActionSubstitutor.java:204: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: bool usesWordSubstitutions()
    //#    suspicious precondition index: [7]
    //#    Attribs:  Soft
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool usesWordSubstitutions()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool usesWordSubstitutions()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(bool usesWordSubstitutions()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(bool usesWordSubstitutions()): this
    //#input(bool usesWordSubstitutions()): this.type
    //#input(bool usesWordSubstitutions()): this.type.__Tag
    //#input(bool usesWordSubstitutions()): this.type.type
    //#input(bool usesWordSubstitutions()): this.type.type.__Tag
    //#output(bool usesWordSubstitutions()): return_value
    //#pre[2] (bool usesWordSubstitutions()): this.type != null
    //#pre[3] (bool usesWordSubstitutions()): this.type.__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[4] (bool usesWordSubstitutions()): (soft) this.type.type != null
    //#pre[5] (bool usesWordSubstitutions()): (soft) this.type.type != null
    //#pre[6] (bool usesWordSubstitutions()): (soft) this.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}
    //#pre[7] (bool usesWordSubstitutions()): (soft) this.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}
    //#presumption(bool usesWordSubstitutions()): getArgTypes(...).length@204 >= 3
    //#presumption(bool usesWordSubstitutions()): getArgTypes(...)@204 != null
    //#presumption(bool usesWordSubstitutions()): getArgTypes(...)@204 != null
    //#post(bool usesWordSubstitutions()): init'ed(return_value)
    //#ActionSubstitutor.java:204: end of method: bool com.dmdirc.actions.ActionSubstitutor.usesWordSubstitutions()
    }
    
    /**
     * Substitutes in word substitutions.
     *
     * @param target The stringbuilder to be changed
     * @param args The arguments passed for this action type
     */
    private void doWordSubstitutions(final StringBuilder target, final Object ... args) {
        if (args.length > 1) {
    //#ActionSubstitutor.java:214: method: void com.dmdirc.actions.ActionSubstitutor.doWordSubstitutions(StringBuilder, Object[])
    //#input(void doWordSubstitutions(StringBuilder, Object[])): "$"._tainted
    //#input(void doWordSubstitutions(StringBuilder, Object[])): "-"._tainted
    //#input(void doWordSubstitutions(StringBuilder, Object[])): args
    //#input(void doWordSubstitutions(StringBuilder, Object[])): args.length
    //#input(void doWordSubstitutions(StringBuilder, Object[])): args[1]
    //#input(void doWordSubstitutions(StringBuilder, Object[])): args[1]._tainted
    //#input(void doWordSubstitutions(StringBuilder, Object[])): args[1].length
    //#input(void doWordSubstitutions(StringBuilder, Object[])): args[2]
    //#input(void doWordSubstitutions(StringBuilder, Object[])): args[2]._tainted
    //#input(void doWordSubstitutions(StringBuilder, Object[])): args[2].length
    //#input(void doWordSubstitutions(StringBuilder, Object[])): target
    //#input(void doWordSubstitutions(StringBuilder, Object[])): this
    //#pre[2] (void doWordSubstitutions(StringBuilder, Object[])): args != null
    //#pre[4] (void doWordSubstitutions(StringBuilder, Object[])): (soft) init'ed(args[1])
    //#pre[6] (void doWordSubstitutions(StringBuilder, Object[])): (soft) args[1].length in {1..4_294_967_295}
    //#pre[8] (void doWordSubstitutions(StringBuilder, Object[])): (soft) init'ed(args[2])
    //#pre[12] (void doWordSubstitutions(StringBuilder, Object[])): (soft) args[2].length in {1..4_294_967_295}
    //#pre[14] (void doWordSubstitutions(StringBuilder, Object[])): (soft) target != null
    //#unanalyzed(void doWordSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void doWordSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void doWordSubstitutions(StringBuilder, Object[])): Effects-of-calling:java.lang.StringBuilder:replace
    //#test_vector(void doWordSubstitutions(StringBuilder, Object[])): args.length: {0,1}, {2}, {3..+Inf}
    //#test_vector(void doWordSubstitutions(StringBuilder, Object[])): java.lang.StringBuffer:length(...)@231: {-2_147_483_648..0}, {1..4_294_967_295}
            String[] words = null;
    //#ActionSubstitutor.java:215: Warning: unused assignment
    //#    Unused assignment into words
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doWordSubstitutions(StringBuilder, Object[])
    //#    Attribs:  Uncertain
            
            if (args.length > 2 && args[2] instanceof String[]) {
                words = (String[]) args[2];
            } else if (args.length > 2 && args[2] instanceof String) {
                words = ((String) args[2]).split(" ");
            } else if (args[1] instanceof String[]) {
                words = (String[]) args[1];
            } else if (args[1] instanceof String) {
                words = ((String) args[1]).split(" ");
            } else {
                return;
            }
            
            final StringBuffer compound = new StringBuffer();
            for (int i = words.length - 1; i >= 0; i--) {
    //#ActionSubstitutor.java:230: ?use of default init
    //#    init'ed(words.length)
    //#    severity: LOW
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doWordSubstitutions(StringBuilder, Object[])
    //#    basic block: bb_13
    //#    assertion: init'ed(words.length)
    //#    VN: words.length
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
                if (compound.length() > 0) {
                    compound.insert(0, ' ');
                }
                compound.insert(0, words[i]);
                
                doReplacement(target, "$" + (i + 1) + "-", compound.toString());
                doReplacement(target, "$" + (i + 1), words[i]);
            }
        }
    }
    //#ActionSubstitutor.java:240: end of method: void com.dmdirc.actions.ActionSubstitutor.doWordSubstitutions(StringBuilder, Object[])
    
    /**
     * Performs all applicable substitutions on the specified string, with the
     * specified arguments.
     *
     * @param target The string to be altered
     * @param args The arguments for the action type
     * @return The substituted string
     */
    public String doSubstitution(final String target, final Object ... args) {
        final StringBuilder res = new StringBuilder(target);
    //#ActionSubstitutor.java:251: method: String com.dmdirc.actions.ActionSubstitutor.doSubstitution(String, Object[])
    //#ActionSubstitutor.java:251: Warning: suspicious precondition
    //#    The precondition for args[0].__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: String doSubstitution(String, Object[])
    //#    suspicious precondition index: [4]
    //#    Attribs:  Soft
    //#ActionSubstitutor.java:251: Warning: suspicious precondition
    //#    The precondition for this.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: String doSubstitution(String, Object[])
    //#    suspicious precondition index: [18]
    //#ActionSubstitutor.java:251: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: String doSubstitution(String, Object[])
    //#    suspicious precondition index: [21]
    //#    Attribs:  Soft
    //#ActionSubstitutor.java:251: Warning: suspicious precondition
    //#    The precondition for this.type.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: String doSubstitution(String, Object[])
    //#    suspicious precondition index: [22]
    //#    Attribs:  Soft
    //#input(String doSubstitution(String, Object[])): "$"._tainted
    //#input(String doSubstitution(String, Object[])): "${"._tainted
    //#input(String doSubstitution(String, Object[])): "-"._tainted
    //#input(String doSubstitution(String, Object[])): "."._tainted
    //#input(String doSubstitution(String, Object[])): "}"._tainted
    //#input(String doSubstitution(String, Object[])): args
    //#input(String doSubstitution(String, Object[])): args.length
    //#input(String doSubstitution(String, Object[])): args[0]
    //#input(String doSubstitution(String, Object[])): args[0].__Tag
    //#input(String doSubstitution(String, Object[])): args[1]
    //#input(String doSubstitution(String, Object[])): args[1]._tainted
    //#input(String doSubstitution(String, Object[])): args[1].length
    //#input(String doSubstitution(String, Object[])): args[2]
    //#input(String doSubstitution(String, Object[])): args[2]._tainted
    //#input(String doSubstitution(String, Object[])): args[2].length
    //#input(String doSubstitution(String, Object[])): args[3..4_294_967_295]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/Channel.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/FrameContainer.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/Query.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/Raw.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/Server.__Descendant_Table[others]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/Server.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/ServerState.CONNECTED
    //#input(String doSubstitution(String, Object[])): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/ActionComponentChain.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/ActionManager.actionComponents
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(String doSubstitution(String, Object[])): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArgTypes()[Ljava/lang/Class;
    //#input(String doSubstitution(String, Object[])): target
    //#input(String doSubstitution(String, Object[])): target._tainted
    //#input(String doSubstitution(String, Object[])): this
    //#input(String doSubstitution(String, Object[])): this.type
    //#input(String doSubstitution(String, Object[])): this.type.__Tag
    //#input(String doSubstitution(String, Object[])): this.type.type
    //#input(String doSubstitution(String, Object[])): this.type.type.__Tag
    //#output(String doSubstitution(String, Object[])): java.lang.StringBuilder:toString(...)._tainted
    //#output(String doSubstitution(String, Object[])): return_value
    //#new obj(String doSubstitution(String, Object[])): java.lang.StringBuilder:toString(...)
    //#pre[1] (String doSubstitution(String, Object[])): args != null
    //#pre[17] (String doSubstitution(String, Object[])): this.type != null
    //#pre[18] (String doSubstitution(String, Object[])): this.type.__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[3] (String doSubstitution(String, Object[])): (soft) init'ed(args[0])
    //#pre[4] (String doSubstitution(String, Object[])): (soft) args[0].__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#pre[5] (String doSubstitution(String, Object[])): (soft) init'ed(args[1])
    //#pre[7] (String doSubstitution(String, Object[])): (soft) args[1].length in {1..4_294_967_295}
    //#pre[9] (String doSubstitution(String, Object[])): (soft) init'ed(args[2])
    //#pre[11] (String doSubstitution(String, Object[])): (soft) args[2].length in {1..4_294_967_295}
    //#pre[13] (String doSubstitution(String, Object[])): (soft) init'ed(args[3..4_294_967_295])
    //#pre[19] (String doSubstitution(String, Object[])): (soft) this.type.type != null
    //#pre[20] (String doSubstitution(String, Object[])): (soft) this.type.type != null
    //#pre[21] (String doSubstitution(String, Object[])): (soft) this.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}
    //#pre[22] (String doSubstitution(String, Object[])): (soft) this.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}
    //#post(String doSubstitution(String, Object[])): java.lang.StringBuilder:toString(...)._tainted == target._tainted
    //#post(String doSubstitution(String, Object[])): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(String doSubstitution(String, Object[])): return_value == &java.lang.StringBuilder:toString(...)
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.String:split
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:getServer
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:getState
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:get
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:getType
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:getArgTypes
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(String doSubstitution(String, Object[])): Effects-of-calling:appliesTo
        
        doConfigSubstitutions(res);
        doServerSubstitutions(res, args);
        doComponentSubstitutions(res, args);
        doWordSubstitutions(res, args);
        
        return res.toString();
    //#ActionSubstitutor.java:258: end of method: String com.dmdirc.actions.ActionSubstitutor.doSubstitution(String, Object[])
    }
    
    /**
     * Replaces all occurances of needle in haystack with replacement.
     *
     * @param haystack The stringbuilder that is to be modified
     * @param needle The search string
     * @param replacement The string to be substituted in
     */
    private void doReplacement(final StringBuilder haystack, final String needle,
            final String replacement) {
        int i = -1;
    //#ActionSubstitutor.java:270: method: void com.dmdirc.actions.ActionSubstitutor.doReplacement(StringBuilder, String, String)
    //#ActionSubstitutor.java:270: Warning: unused assignment
    //#    Unused assignment into i
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionSubstitutor
    //#    method: void doReplacement(StringBuilder, String, String)
    //#    Attribs:  Uncertain
    //#input(void doReplacement(StringBuilder, String, String)): haystack
    //#input(void doReplacement(StringBuilder, String, String)): needle
    //#input(void doReplacement(StringBuilder, String, String)): replacement
    //#pre[1] (void doReplacement(StringBuilder, String, String)): haystack != null
    //#pre[2] (void doReplacement(StringBuilder, String, String)): (soft) needle != null
    //#presumption(void doReplacement(StringBuilder, String, String)): java.lang.StringBuilder:indexOf(...)@273 + java.lang.String:length(...)@276 in {-2_147_483_648..4_294_967_295}
    //#test_vector(void doReplacement(StringBuilder, String, String)): java.lang.StringBuilder:indexOf(...)@273: {-1}, {-2_147_483_648..-2, 0..4_294_967_295}
        
        do {
            i = haystack.indexOf(needle);
            
            if (i != -1) {
                haystack.replace(i, i + needle.length(), replacement);
            }
        } while (i != -1);
    }
    //#ActionSubstitutor.java:279: end of method: void com.dmdirc.actions.ActionSubstitutor.doReplacement(StringBuilder, String, String)
    
}
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Descendant_Table[com/dmdirc/actions/ActionSubstitutor]
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doComponentSubstitutions(Ljava/lang/StringBuilder;[Ljava/lang/Object;)V
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doConfigSubstitutions(Ljava/lang/StringBuilder;)V
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doReplacement(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doServerSubstitutions(Ljava/lang/StringBuilder;[Ljava/lang/Object;)V
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doSubstitution(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doWordSubstitutions(Ljava/lang/StringBuilder;[Ljava/lang/Object;)V
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.getComponentSubstitutions()Ljava/util/Map;
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.getConfigSubstitutions()Ljava/util/Set;
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.getServerSubstitutions()Ljava/util/Map;
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.hasFrameContainer()Z
    //#output(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.usesWordSubstitutions()Z
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Descendant_Table[com/dmdirc/actions/ActionSubstitutor] == &__Dispatch_Table
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doComponentSubstitutions(Ljava/lang/StringBuilder;[Ljava/lang/Object;)V == &doComponentSubstitutions
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doConfigSubstitutions(Ljava/lang/StringBuilder;)V == &doConfigSubstitutions
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doReplacement(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V == &doReplacement
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doServerSubstitutions(Ljava/lang/StringBuilder;[Ljava/lang/Object;)V == &doServerSubstitutions
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doSubstitution(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; == &doSubstitution
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.doWordSubstitutions(Ljava/lang/StringBuilder;[Ljava/lang/Object;)V == &doWordSubstitutions
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.getComponentSubstitutions()Ljava/util/Map; == &getComponentSubstitutions
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.getConfigSubstitutions()Ljava/util/Set; == &getConfigSubstitutions
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.getServerSubstitutions()Ljava/util/Map; == &getServerSubstitutions
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.hasFrameContainer()Z == &hasFrameContainer
    //#post(com.dmdirc.actions.ActionSubstitutor__static_init): __Dispatch_Table.usesWordSubstitutions()Z == &usesWordSubstitutions
    //#ActionSubstitutor.java:: end of method: com.dmdirc.actions.ActionSubstitutor.com.dmdirc.actions.ActionSubstitutor__static_init
    //#ActionSubstitutor.java:: end of class: com.dmdirc.actions.ActionSubstitutor
