UNPKG

projen

Version:

CDK for software projects

1,108 lines • 207 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.JsonTrailingCommas = exports.JsTrailingCommas = exports.Semicolons = exports.QuoteProperties = exports.OperatorLinebreak = exports.ArrowParentheses = exports.WhitespaceSensitivity = exports.SelfCloseVoidElements = exports.QuoteStyle = exports.PresetConfig = exports.VcsClientKind = exports.RuleDomainValue = exports.JsxRuntime = exports.LineEnding = exports.IndentStyle = exports.Expand = exports.AttributePosition = void 0;
exports.toJson_BiomeConfiguration = toJson_BiomeConfiguration;
exports.toJson_AssistConfiguration = toJson_AssistConfiguration;
exports.toJson_CssConfiguration = toJson_CssConfiguration;
exports.toJson_FilesConfiguration = toJson_FilesConfiguration;
exports.toJson_FormatterConfiguration = toJson_FormatterConfiguration;
exports.toJson_GraphqlConfiguration = toJson_GraphqlConfiguration;
exports.toJson_GritConfiguration = toJson_GritConfiguration;
exports.toJson_HtmlConfiguration = toJson_HtmlConfiguration;
exports.toJson_JsConfiguration = toJson_JsConfiguration;
exports.toJson_JsonConfiguration = toJson_JsonConfiguration;
exports.toJson_LinterConfiguration = toJson_LinterConfiguration;
exports.toJson_OverridePattern = toJson_OverridePattern;
exports.toJson_VcsConfiguration = toJson_VcsConfiguration;
exports.toJson_Actions = toJson_Actions;
exports.toJson_CssAssistConfiguration = toJson_CssAssistConfiguration;
exports.toJson_CssFormatterConfiguration = toJson_CssFormatterConfiguration;
exports.toJson_CssLinterConfiguration = toJson_CssLinterConfiguration;
exports.toJson_CssParserConfiguration = toJson_CssParserConfiguration;
exports.toJson_GraphqlAssistConfiguration = toJson_GraphqlAssistConfiguration;
exports.toJson_GraphqlFormatterConfiguration = toJson_GraphqlFormatterConfiguration;
exports.toJson_GraphqlLinterConfiguration = toJson_GraphqlLinterConfiguration;
exports.toJson_GritAssistConfiguration = toJson_GritAssistConfiguration;
exports.toJson_GritFormatterConfiguration = toJson_GritFormatterConfiguration;
exports.toJson_GritLinterConfiguration = toJson_GritLinterConfiguration;
exports.toJson_HtmlAssistConfiguration = toJson_HtmlAssistConfiguration;
exports.toJson_HtmlFormatterConfiguration = toJson_HtmlFormatterConfiguration;
exports.toJson_HtmlLinterConfiguration = toJson_HtmlLinterConfiguration;
exports.toJson_HtmlParserConfiguration = toJson_HtmlParserConfiguration;
exports.toJson_JsAssistConfiguration = toJson_JsAssistConfiguration;
exports.toJson_JsFormatterConfiguration = toJson_JsFormatterConfiguration;
exports.toJson_JsLinterConfiguration = toJson_JsLinterConfiguration;
exports.toJson_JsParserConfiguration = toJson_JsParserConfiguration;
exports.toJson_JsResolverConfiguration = toJson_JsResolverConfiguration;
exports.toJson_JsonAssistConfiguration = toJson_JsonAssistConfiguration;
exports.toJson_JsonFormatterConfiguration = toJson_JsonFormatterConfiguration;
exports.toJson_JsonLinterConfiguration = toJson_JsonLinterConfiguration;
exports.toJson_JsonParserConfiguration = toJson_JsonParserConfiguration;
exports.toJson_Rules = toJson_Rules;
exports.toJson_OverrideAssistConfiguration = toJson_OverrideAssistConfiguration;
exports.toJson_OverrideFilesConfiguration = toJson_OverrideFilesConfiguration;
exports.toJson_OverrideFormatterConfiguration = toJson_OverrideFormatterConfiguration;
exports.toJson_OverrideLinterConfiguration = toJson_OverrideLinterConfiguration;
exports.toJson_Source = toJson_Source;
/**
 * Converts an object of type 'BiomeConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_BiomeConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        '$schema': obj.schema,
        'assist': toJson_AssistConfiguration(obj.assist),
        'css': toJson_CssConfiguration(obj.css),
        'extends': obj.extends?.map(y => y),
        'files': toJson_FilesConfiguration(obj.files),
        'formatter': toJson_FormatterConfiguration(obj.formatter),
        'graphql': toJson_GraphqlConfiguration(obj.graphql),
        'grit': toJson_GritConfiguration(obj.grit),
        'html': toJson_HtmlConfiguration(obj.html),
        'javascript': toJson_JsConfiguration(obj.javascript),
        'json': toJson_JsonConfiguration(obj.json),
        'linter': toJson_LinterConfiguration(obj.linter),
        'overrides': obj.overrides?.map(y => toJson_OverridePattern(y)),
        'plugins': obj.plugins?.map(y => y),
        'root': obj.root,
        'vcs': toJson_VcsConfiguration(obj.vcs),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'AssistConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_AssistConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'actions': toJson_Actions(obj.actions),
        'enabled': obj.enabled,
        'includes': obj.includes?.map(y => y),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CssConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CssConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'assist': toJson_CssAssistConfiguration(obj.assist),
        'formatter': toJson_CssFormatterConfiguration(obj.formatter),
        'globals': obj.globals?.map(y => y),
        'linter': toJson_CssLinterConfiguration(obj.linter),
        'parser': toJson_CssParserConfiguration(obj.parser),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'FilesConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_FilesConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'experimentalScannerIgnores': obj.experimentalScannerIgnores?.map(y => y),
        'ignoreUnknown': obj.ignoreUnknown,
        'includes': obj.includes?.map(y => y),
        'maxSize': obj.maxSize,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'FormatterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_FormatterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'attributePosition': obj.attributePosition,
        'bracketSameLine': obj.bracketSameLine,
        'bracketSpacing': obj.bracketSpacing,
        'delimiterSpacing': obj.delimiterSpacing,
        'enabled': obj.enabled,
        'expand': obj.expand,
        'formatWithErrors': obj.formatWithErrors,
        'includes': obj.includes?.map(y => y),
        'indentStyle': obj.indentStyle,
        'indentWidth': obj.indentWidth,
        'lineEnding': obj.lineEnding,
        'lineWidth': obj.lineWidth,
        'trailingNewline': obj.trailingNewline,
        'useEditorconfig': obj.useEditorconfig,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'GraphqlConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_GraphqlConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'assist': toJson_GraphqlAssistConfiguration(obj.assist),
        'formatter': toJson_GraphqlFormatterConfiguration(obj.formatter),
        'linter': toJson_GraphqlLinterConfiguration(obj.linter),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'GritConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_GritConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'assist': toJson_GritAssistConfiguration(obj.assist),
        'formatter': toJson_GritFormatterConfiguration(obj.formatter),
        'linter': toJson_GritLinterConfiguration(obj.linter),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'HtmlConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_HtmlConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'assist': toJson_HtmlAssistConfiguration(obj.assist),
        'experimentalFullSupportEnabled': obj.experimentalFullSupportEnabled,
        'formatter': toJson_HtmlFormatterConfiguration(obj.formatter),
        'linter': toJson_HtmlLinterConfiguration(obj.linter),
        'parser': toJson_HtmlParserConfiguration(obj.parser),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'assist': toJson_JsAssistConfiguration(obj.assist),
        'experimentalEmbeddedSnippetsEnabled': obj.experimentalEmbeddedSnippetsEnabled,
        'formatter': toJson_JsFormatterConfiguration(obj.formatter),
        'globals': obj.globals?.map(y => y),
        'jsxRuntime': obj.jsxRuntime,
        'linter': toJson_JsLinterConfiguration(obj.linter),
        'parser': toJson_JsParserConfiguration(obj.parser),
        'resolver': toJson_JsResolverConfiguration(obj.resolver),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsonConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsonConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'assist': toJson_JsonAssistConfiguration(obj.assist),
        'formatter': toJson_JsonFormatterConfiguration(obj.formatter),
        'linter': toJson_JsonLinterConfiguration(obj.linter),
        'parser': toJson_JsonParserConfiguration(obj.parser),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'LinterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_LinterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'domains': ((obj.domains) === undefined) ? undefined : (Object.entries(obj.domains).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
        'enabled': obj.enabled,
        'includes': obj.includes?.map(y => y),
        'rules': toJson_Rules(obj.rules),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'OverridePattern' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_OverridePattern(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'assist': toJson_OverrideAssistConfiguration(obj.assist),
        'css': toJson_CssConfiguration(obj.css),
        'files': toJson_OverrideFilesConfiguration(obj.files),
        'formatter': toJson_OverrideFormatterConfiguration(obj.formatter),
        'graphql': toJson_GraphqlConfiguration(obj.graphql),
        'grit': toJson_GritConfiguration(obj.grit),
        'html': toJson_HtmlConfiguration(obj.html),
        'includes': obj.includes?.map(y => y),
        'javascript': toJson_JsConfiguration(obj.javascript),
        'json': toJson_JsonConfiguration(obj.json),
        'linter': toJson_OverrideLinterConfiguration(obj.linter),
        'plugins': obj.plugins?.map(y => y),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'VcsConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_VcsConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'clientKind': obj.clientKind,
        'defaultBranch': obj.defaultBranch,
        'enabled': obj.enabled,
        'root': obj.root,
        'useIgnoreFile': obj.useIgnoreFile,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'Actions' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_Actions(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'preset': obj.preset,
        'recommended': obj.recommended,
        'source': toJson_Source(obj.source),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CssAssistConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CssAssistConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CssFormatterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CssFormatterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'delimiterSpacing': obj.delimiterSpacing,
        'enabled': obj.enabled,
        'indentStyle': obj.indentStyle,
        'indentWidth': obj.indentWidth,
        'lineEnding': obj.lineEnding,
        'lineWidth': obj.lineWidth,
        'quoteStyle': obj.quoteStyle,
        'trailingNewline': obj.trailingNewline,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CssLinterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CssLinterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CssParserConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CssParserConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'allowWrongLineComments': obj.allowWrongLineComments,
        'cssModules': obj.cssModules,
        'tailwindDirectives': obj.tailwindDirectives,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
/**
 * @schema AttributePosition
 */
var AttributePosition;
(function (AttributePosition) {
    /** auto */
    AttributePosition["AUTO"] = "auto";
    /** multiline */
    AttributePosition["MULTILINE"] = "multiline";
})(AttributePosition || (exports.AttributePosition = AttributePosition = {}));
/**
 * @schema Expand
 */
var Expand;
(function (Expand) {
    /** Objects are expanded when the first property has a leading newline. Arrays remain on one
  line if they fit. (auto) */
    Expand["AUTO"] = "auto";
    /** Objects and arrays are always expanded. (always) */
    Expand["ALWAYS"] = "always";
    /** Objects and arrays remain on one line if they fit. (never) */
    Expand["NEVER"] = "never";
})(Expand || (exports.Expand = Expand = {}));
/**
 * @schema IndentStyle
 */
var IndentStyle;
(function (IndentStyle) {
    /** Indent with Tab (tab) */
    IndentStyle["TAB"] = "tab";
    /** Indent with Space (space) */
    IndentStyle["SPACE"] = "space";
})(IndentStyle || (exports.IndentStyle = IndentStyle = {}));
/**
 * @schema LineEnding
 */
var LineEnding;
(function (LineEnding) {
    /** Line Feed only (\n), common on Linux and macOS as well as inside git repos (lf) */
    LineEnding["LF"] = "lf";
    /** Carriage Return + Line Feed characters (\r\n), common on Windows (crlf) */
    LineEnding["CRLF"] = "crlf";
    /** Carriage Return character only (\r), used very rarely (cr) */
    LineEnding["CR"] = "cr";
    /** Automatically use CRLF on Windows and LF on other platforms (auto) */
    LineEnding["AUTO"] = "auto";
})(LineEnding || (exports.LineEnding = LineEnding = {}));
/**
 * Converts an object of type 'GraphqlAssistConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_GraphqlAssistConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'GraphqlFormatterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_GraphqlFormatterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'bracketSpacing': obj.bracketSpacing,
        'enabled': obj.enabled,
        'indentStyle': obj.indentStyle,
        'indentWidth': obj.indentWidth,
        'lineEnding': obj.lineEnding,
        'lineWidth': obj.lineWidth,
        'quoteStyle': obj.quoteStyle,
        'trailingNewline': obj.trailingNewline,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'GraphqlLinterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_GraphqlLinterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'GritAssistConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_GritAssistConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'GritFormatterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_GritFormatterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
        'indentStyle': obj.indentStyle,
        'indentWidth': obj.indentWidth,
        'lineEnding': obj.lineEnding,
        'lineWidth': obj.lineWidth,
        'trailingNewline': obj.trailingNewline,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'GritLinterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_GritLinterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'HtmlAssistConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_HtmlAssistConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'HtmlFormatterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_HtmlFormatterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'attributePosition': obj.attributePosition,
        'bracketSameLine': obj.bracketSameLine,
        'enabled': obj.enabled,
        'indentScriptAndStyle': obj.indentScriptAndStyle,
        'indentStyle': obj.indentStyle,
        'indentWidth': obj.indentWidth,
        'lineEnding': obj.lineEnding,
        'lineWidth': obj.lineWidth,
        'selfCloseVoidElements': obj.selfCloseVoidElements,
        'trailingNewline': obj.trailingNewline,
        'whitespaceSensitivity': obj.whitespaceSensitivity,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'HtmlLinterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_HtmlLinterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'HtmlParserConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_HtmlParserConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'interpolation': obj.interpolation,
        'vue': obj.vue,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsAssistConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsAssistConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsFormatterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsFormatterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'arrowParentheses': obj.arrowParentheses,
        'attributePosition': obj.attributePosition,
        'bracketSameLine': obj.bracketSameLine,
        'bracketSpacing': obj.bracketSpacing,
        'delimiterSpacing': obj.delimiterSpacing,
        'enabled': obj.enabled,
        'expand': obj.expand,
        'indentStyle': obj.indentStyle,
        'indentWidth': obj.indentWidth,
        'jsxQuoteStyle': obj.jsxQuoteStyle,
        'lineEnding': obj.lineEnding,
        'lineWidth': obj.lineWidth,
        'operatorLinebreak': obj.operatorLinebreak,
        'quoteProperties': obj.quoteProperties,
        'quoteStyle': obj.quoteStyle,
        'semicolons': obj.semicolons,
        'trailingCommas': obj.trailingCommas,
        'trailingNewline': obj.trailingNewline,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
/**
 * Indicates the type of runtime or transformation used for interpreting JSX.
 *
 * @schema JsxRuntime
 */
var JsxRuntime;
(function (JsxRuntime) {
    /** Indicates a modern or native JSX environment, that doesn't require
  special handling by Biome. (transparent) */
    JsxRuntime["TRANSPARENT"] = "transparent";
    /** Indicates a classic React environment that requires the `React` import.
  
  Corresponds to the `react` value for the `jsx` option in TypeScript's
  `tsconfig.json`.
  
  This option should only be necessary if you cannot upgrade to a React
  version that supports the new JSX runtime. For more information about
  the old vs. new JSX runtime, please see:
  <https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html> (reactClassic) */
    JsxRuntime["REACT_CLASSIC"] = "reactClassic";
})(JsxRuntime || (exports.JsxRuntime = JsxRuntime = {}));
/**
 * Converts an object of type 'JsLinterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsLinterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsParserConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsParserConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'gritMetavariables': obj.gritMetavariables,
        'jsxEverywhere': obj.jsxEverywhere,
        'unsafeParameterDecoratorsEnabled': obj.unsafeParameterDecoratorsEnabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsResolverConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsResolverConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'experimentalPnpmCatalogs': obj.experimentalPnpmCatalogs,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsonAssistConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsonAssistConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsonFormatterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsonFormatterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'bracketSpacing': obj.bracketSpacing,
        'delimiterSpacing': obj.delimiterSpacing,
        'enabled': obj.enabled,
        'expand': obj.expand,
        'indentStyle': obj.indentStyle,
        'indentWidth': obj.indentWidth,
        'lineEnding': obj.lineEnding,
        'lineWidth': obj.lineWidth,
        'trailingCommas': obj.trailingCommas,
        'trailingNewline': obj.trailingNewline,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsonLinterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsonLinterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JsonParserConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JsonParserConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'allowComments': obj.allowComments,
        'allowTrailingCommas': obj.allowTrailingCommas,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
/**
 * @schema RuleDomainValue
 */
var RuleDomainValue;
(function (RuleDomainValue) {
    /** Enables all the rules that belong to this domain (all) */
    RuleDomainValue["ALL"] = "all";
    /** Disables all the rules that belong to this domain (none) */
    RuleDomainValue["NONE"] = "none";
    /** Enables only the recommended rules for this domain (recommended) */
    RuleDomainValue["RECOMMENDED"] = "recommended";
})(RuleDomainValue || (exports.RuleDomainValue = RuleDomainValue = {}));
/**
 * Converts an object of type 'Rules' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_Rules(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'a11y': obj.a11Y,
        'complexity': obj.complexity,
        'correctness': obj.correctness,
        'nursery': obj.nursery,
        'performance': obj.performance,
        'preset': obj.preset,
        'recommended': obj.recommended,
        'security': obj.security,
        'style': obj.style,
        'suspicious': obj.suspicious,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'OverrideAssistConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_OverrideAssistConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'actions': toJson_Actions(obj.actions),
        'enabled': obj.enabled,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'OverrideFilesConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_OverrideFilesConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'maxSize': obj.maxSize,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'OverrideFormatterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_OverrideFormatterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'attributePosition': obj.attributePosition,
        'bracketSameLine': obj.bracketSameLine,
        'bracketSpacing': obj.bracketSpacing,
        'delimiterSpacing': obj.delimiterSpacing,
        'enabled': obj.enabled,
        'expand': obj.expand,
        'formatWithErrors': obj.formatWithErrors,
        'indentSize': obj.indentSize,
        'indentStyle': obj.indentStyle,
        'indentWidth': obj.indentWidth,
        'lineEnding': obj.lineEnding,
        'lineWidth': obj.lineWidth,
        'trailingCommas': obj.trailingCommas,
        'trailingNewline': obj.trailingNewline,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'OverrideLinterConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_OverrideLinterConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'domains': ((obj.domains) === undefined) ? undefined : (Object.entries(obj.domains).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
        'enabled': obj.enabled,
        'rules': toJson_Rules(obj.rules),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
/**
 * Integration with Git as the version control client.
 *
 * @schema VcsClientKind
 */
var VcsClientKind;
(function (VcsClientKind) {
    /** git */
    VcsClientKind["GIT"] = "git";
})(VcsClientKind || (exports.VcsClientKind = VcsClientKind = {}));
/**
 * A preset configuration for enabling a set of rules.
 *
 * @schema PresetConfig
 */
var PresetConfig;
(function (PresetConfig) {
    /** recommended */
    PresetConfig["RECOMMENDED"] = "recommended";
    /** all */
    PresetConfig["ALL"] = "all";
    /** none */
    PresetConfig["NONE"] = "none";
})(PresetConfig || (exports.PresetConfig = PresetConfig = {}));
/**
 * Converts an object of type 'Source' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_Source(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'noDuplicateClasses': obj.noDuplicateClasses,
        'organizeImports': obj.organizeImports,
        'preset': obj.preset,
        'recommended': obj.recommended,
        'useSortedAttributes': obj.useSortedAttributes,
        'useSortedEnumMembers': obj.useSortedEnumMembers,
        'useSortedInterfaceMembers': obj.useSortedInterfaceMembers,
        'useSortedKeys': obj.useSortedKeys,
        'useSortedPackageJson': obj.useSortedPackageJson,
        'useSortedProperties': obj.useSortedProperties,
        'useSortedSelectionSet': obj.useSortedSelectionSet,
        'useSortedTypeFields': obj.useSortedTypeFields,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
/**
 * @schema QuoteStyle
 */
var QuoteStyle;
(function (QuoteStyle) {
    /** double */
    QuoteStyle["DOUBLE"] = "double";
    /** single */
    QuoteStyle["SINGLE"] = "single";
})(QuoteStyle || (exports.QuoteStyle = QuoteStyle = {}));
/**
 * Controls whether void-elements should be self closed
 *
 * @schema SelfCloseVoidElements
 */
var SelfCloseVoidElements;
(function (SelfCloseVoidElements) {
    /** The `/` inside void elements is removed by the formatter (never) */
    SelfCloseVoidElements["NEVER"] = "never";
    /** The `/` inside void elements is always added (always) */
    SelfCloseVoidElements["ALWAYS"] = "always";
})(SelfCloseVoidElements || (exports.SelfCloseVoidElements = SelfCloseVoidElements = {}));
/**
 * Whitespace sensitivity for HTML formatting.
 *
 * The following two cases won't produce the same output:
 *
 * |                |      html      |    output    |
 * | -------------- | :------------: | :----------: |
 * | with spaces    | `1<b> 2 </b>3` | 1<b> 2 </b>3 |
 * | without spaces |  `1<b>2</b>3`  |  1<b>2</b>3  |
 *
 * This happens because whitespace is significant in inline elements.
 *
 * As a consequence of this, the formatter must format blocks that look like this (assume a small line width, <20):
 * ```html
 * <span>really long content</span>
 * ```
 * as this, where the content hugs the tags:
 * ```html
 * <span
 * >really long content</span
 * >
 * ```
 *
 * Note that this is only necessary for inline elements. Block elements do not have this restriction.
 *
 * @schema WhitespaceSensitivity
 */
var WhitespaceSensitivity;
(function (WhitespaceSensitivity) {
    /** The formatter considers whitespace significant for elements that have an "inline" display style by default in
  browser's user agent style sheets. (css) */
    WhitespaceSensitivity["CSS"] = "css";
    /** Leading and trailing whitespace in content is considered significant for all elements.
  
  The formatter should leave at least one whitespace character if whitespace is present.
  Otherwise, if there is no whitespace, it should not add any after `>` or before `<`. In other words, if there's no whitespace, the text content should hug the tags.
  
  Example of text hugging the tags:
  ```html
  <b
      >content</b
  >
  ``` (strict) */
    WhitespaceSensitivity["STRICT"] = "strict";
    /** Whitespace is considered insignificant. The formatter is free to remove or add whitespace as it sees fit. (ignore) */
    WhitespaceSensitivity["IGNORE"] = "ignore";
})(WhitespaceSensitivity || (exports.WhitespaceSensitivity = WhitespaceSensitivity = {}));
/**
 * @schema ArrowParentheses
 */
var ArrowParentheses;
(function (ArrowParentheses) {
    /** always */
    ArrowParentheses["ALWAYS"] = "always";
    /** asNeeded */
    ArrowParentheses["AS_NEEDED"] = "asNeeded";
})(ArrowParentheses || (exports.ArrowParentheses = ArrowParentheses = {}));
/**
 * @schema OperatorLinebreak
 */
var OperatorLinebreak;
(function (OperatorLinebreak) {
    /** The operator is placed after the expression (after) */
    OperatorLinebreak["AFTER"] = "after";
    /** The operator is placed before the expression (before) */
    OperatorLinebreak["BEFORE"] = "before";
})(OperatorLinebreak || (exports.OperatorLinebreak = OperatorLinebreak = {}));
/**
 * @schema QuoteProperties
 */
var QuoteProperties;
(function (QuoteProperties) {
    /** asNeeded */
    QuoteProperties["AS_NEEDED"] = "asNeeded";
    /** preserve */
    QuoteProperties["PRESERVE"] = "preserve";
})(QuoteProperties || (exports.QuoteProperties = QuoteProperties = {}));
/**
 * @schema Semicolons
 */
var Semicolons;
(function (Semicolons) {
    /** always */
    Semicolons["ALWAYS"] = "always";
    /** asNeeded */
    Semicolons["AS_NEEDED"] = "asNeeded";
})(Semicolons || (exports.Semicolons = Semicolons = {}));
/**
 * Print trailing commas wherever possible in multi-line comma-separated syntactic structures for JavaScript/TypeScript files.
 *
 * @schema JsTrailingCommas
 */
var JsTrailingCommas;
(function (JsTrailingCommas) {
    /** all */
    JsTrailingCommas["ALL"] = "all";
    /** es5 */
    JsTrailingCommas["ES5"] = "es5";
    /** none */
    JsTrailingCommas["NONE"] = "none";
})(JsTrailingCommas || (exports.JsTrailingCommas = JsTrailingCommas = {}));
/**
 * Print trailing commas wherever possible in multi-line comma-separated syntactic structures for JSON files.
 *
 * @schema JsonTrailingCommas
 */
var JsonTrailingCommas;
(function (JsonTrailingCommas) {
    /** none */
    JsonTrailingCommas["NONE"] = "none";
    /** all */
    JsonTrailingCommas["ALL"] = "all";
})(JsonTrailingCommas || (exports.JsonTrailingCommas = JsonTrailingCommas = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvbWUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2phdmFzY3JpcHQvYmlvbWUvYmlvbWUtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQThIQSw4REFzQkM7QUFtQ0QsZ0VBU0M7QUFrREQsMERBV0M7QUFpREQsOERBVUM7QUE2SUQsc0VBb0JDO0FBb0NELGtFQVNDO0FBb0NELDREQVNDO0FBa0RELDREQVdDO0FBeUVELHdEQWNDO0FBMkNELDREQVVDO0FBMENELGdFQVVDO0FBa0dELHdEQWtCQztBQTBERCwwREFXQztBQWdDRCx3Q0FTQztBQXNCRCxzRUFPQztBQWlGRCw0RUFjQztBQXNCRCxzRUFPQztBQXFDRCxzRUFTQztBQXFFRCw4RUFPQztBQTJFRCxvRkFjQztBQXNCRCw4RUFPQztBQXNCRCx3RUFPQztBQTJERCw4RUFZQztBQXNCRCx3RUFPQztBQXNCRCx3RUFPQztBQXlHRCw4RUFpQkM7QUFzQkQsd0VBT0M7QUFrQ0Qsd0VBUUM7QUFzQkQsb0VBT0M7QUEyS0QsMEVBd0JDO0FBMkNELG9FQU9DO0FBMENELG9FQVNDO0FBNkNELHdFQU9DO0FBc0JELHdFQU9DO0FBa0dELDhFQWdCQztBQXNCRCx3RUFPQztBQTZCRCx3RUFRQztBQStFRCxvQ0FnQkM7QUEyQkQsZ0ZBUUM7QUFvQkQsOEVBT0M7QUF3SUQsc0ZBb0JDO0FBa0NELGdGQVNDO0FBcUlELHNDQWtCQztBQXRzRkQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHlCQUF5QixDQUFDLEdBQW1DO0lBQzNFLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNO1FBQ3JCLFFBQVEsRUFBRSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2hELEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ3ZDLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuQyxPQUFPLEVBQUUseUJBQXlCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUM3QyxXQUFXLEVBQUUsNkJBQTZCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUN6RCxTQUFTLEVBQUUsMkJBQTJCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUNuRCxNQUFNLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMxQyxNQUFNLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMxQyxZQUFZLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNwRCxNQUFNLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMxQyxRQUFRLEVBQUUsMEJBQTBCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxXQUFXLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2hCLEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0tBQ3hDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQThCRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsMEJBQTBCLENBQUMsR0FBb0M7SUFDN0UsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixTQUFTLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDdEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN0QyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUE2Q0Q7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHVCQUF1QixDQUFDLEdBQWlDO0lBQ3ZFLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsUUFBUSxFQUFFLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDbkQsV0FBVyxFQUFFLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDNUQsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25DLFFBQVEsRUFBRSw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ25ELFFBQVEsRUFBRSw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0tBQ3BELENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQTRDRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IseUJBQXlCLENBQUMsR0FBbUM7SUFDM0UsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYiw0QkFBNEIsRUFBRSxHQUFHLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLGVBQWUsRUFBRSxHQUFHLENBQUMsYUFBYTtRQUNsQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3ZCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXdJRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsNkJBQTZCLENBQUMsR0FBdUM7SUFDbkYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixtQkFBbUIsRUFBRSxHQUFHLENBQUMsaUJBQWlCO1FBQzFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxlQUFlO1FBQ3RDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxjQUFjO1FBQ3BDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0I7UUFDeEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTTtRQUNwQixrQkFBa0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCO1FBQ3hDLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDOUIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQzlCLFlBQVksRUFBRSxHQUFHLENBQUMsVUFBVTtRQUM1QixXQUFXLEVBQUUsR0FBRyxDQUFDLFNBQVM7UUFDMUIsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGVBQWU7UUFDdEMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGVBQWU7S0FDdkMsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBK0JEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiwyQkFBMkIsQ0FBQyxHQUFxQztJQUMvRSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFFBQVEsRUFBRSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3ZELFdBQVcsRUFBRSxvQ0FBb0MsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2hFLFFBQVEsRUFBRSxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0tBQ3hELENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQStCRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isd0JBQXdCLENBQUMsR0FBa0M7SUFDekUsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixRQUFRLEVBQUUsOEJBQThCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNwRCxXQUFXLEVBQUUsaUNBQWlDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUM3RCxRQUFRLEVBQUUsOEJBQThCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztLQUNyRCxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUE2Q0Q7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHdCQUF3QixDQUFDLEdBQWtDO0lBQ3pFLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsUUFBUSxFQUFFLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDcEQsZ0NBQWdDLEVBQUUsR0FBRyxDQUFDLDhCQUE4QjtRQUNwRSxXQUFXLEVBQUUsaUNBQWlDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUM3RCxRQUFRLEVBQUUsOEJBQThCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNwRCxRQUFRLEVBQUUsOEJBQThCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztLQUNyRCxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFvRUQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHNCQUFzQixDQUFDLEdBQWdDO0lBQ3JFLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsUUFBUSxFQUFFLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDbEQscUNBQXFDLEVBQUUsR0FBRyxDQUFDLG1DQUFtQztRQUM5RSxXQUFXLEVBQUUsK0JBQStCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUMzRCxTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1FBQzVCLFFBQVEsRUFBRSw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2xELFFBQVEsRUFBRSw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2xELFVBQVUsRUFBRSw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0tBQ3pELENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXNDRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isd0JBQXdCLENBQUMsR0FBa0M7SUFDekUsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixRQUFRLEVBQUUsOEJBQThCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNwRCxXQUFXLEVBQUUsaUNBQWlDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUM3RCxRQUFRLEVBQUUsOEJBQThCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNwRCxRQUFRLEVBQUUsOEJBQThCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztLQUNyRCxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFxQ0Q7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDBCQUEwQixDQUFDLEdBQW9DO0lBQzdFLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlKLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsT0FBTyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0tBQ2pDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQTZGRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isc0JBQXNCLENBQUMsR0FBZ0M7SUFDckUsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixRQUFRLEVBQUUsa0NBQWtDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUN4RCxLQUFLLEVBQUUsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUN2QyxPQUFPLEVBQUUsaUNBQWlDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNyRCxXQUFXLEVBQUUscUNBQXFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUNqRSxTQUFTLEVBQUUsMkJBQTJCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUNuRCxNQUFNLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMxQyxNQUFNLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMxQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsWUFBWSxFQUFFLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDcEQsTUFBTSxFQUFFLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDMUMsUUFBUSxFQUFFLGtDQUFrQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDeEQsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3BDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXFERDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsdUJBQXVCLENBQUMsR0FBaUM7SUFDdkUsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDNUIsZUFBZSxFQUFFLEdBQUcsQ0FBQyxhQUFhO1FBQ2xDLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUk7UUFDaEIsZUFBZSxFQUFFLEdBQUcsQ0FBQyxhQUFhO0tBQ25DLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQTJCRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsY0FBYyxDQUFDLEdBQXdCO0lBQ3JELElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1FBQ3BCLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM5QixRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7S0FDcEMsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBaUJEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw2QkFBNkIsQ0FBQyxHQUF1QztJQUNuRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztLQUN2QixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUE0RUQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLGdDQUFnQyxDQUFDLEdBQTBDO0lBQ3pGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2Isa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtRQUN4QyxTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDdEIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQzlCLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM5QixZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDNUIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1FBQzFCLFlBQVksRUFBRSxHQUFHLENBQUMsVUFBVTtRQUM1QixpQkFBaUIsRUFBRSxHQUFHLENBQUMsZUFBZTtLQUN2QyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFpQkQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDZCQUE2QixDQUFDLEdBQXVDO0lBQ25GLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3ZCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWdDRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsNkJBQTZCLENBQUMsR0FBdUM7SUFDbkYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYix3QkFBd0IsRUFBRSxHQUFHLENBQUMsc0JBQXNCO1FBQ3BELFlBQVksRUFBRSxHQUFHLENBQUMsVUFBVTtRQUM1QixvQkFBb0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO0tBQzdDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQUNELG9GQUFvRjtBQUVwRjs7R0FFRztBQUNILElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUMzQixXQUFXO0lBQ1gsa0NBQWEsQ0FBQTtJQUNiLGdCQUFnQjtJQUNoQiw0Q0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBTFcsaUJBQWlCLGlDQUFqQixpQkFBaUIsUUFLNUI7QUFFRDs7R0FFRztBQUNILElBQVksTUFRWDtBQVJELFdBQVksTUFBTTtJQUNoQjs2QkFDeUI7SUFDekIsdUJBQWEsQ0FBQTtJQUNiLHVEQUF1RDtJQUN2RCwyQkFBaUIsQ0FBQTtJQUNqQixpRUFBaUU7SUFDakUseUJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBUlcsTUFBTSxzQkFBTixNQUFNLFFBUWpCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFdBS1g7QUFMRCxXQUFZLFdBQVc7SUFDckIsNEJBQTRCO0lBQzVCLDBCQUFXLENBQUE7SUFDWCxnQ0FBZ0M7SUFDaEMsOEJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBTFcsV0FBVywyQkFBWCxXQUFXLFFBS3RCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFVBU1g7QUFURCxXQUFZLFVBQVU7SUFDcEIsc0ZBQXNGO0lBQ3RGLHVCQUFTLENBQUE7SUFDVCw4RUFBOEU7SUFDOUUsMkJBQWEsQ0FBQTtJQUNiLGlFQUFpRTtJQUNqRSx1QkFBUyxDQUFBO0lBQ1QseUVBQXlFO0lBQ3pFLDJCQUFhLENBQUE7QUFDZixDQUFDLEVBVFcsVUFBVSwwQkFBVixVQUFVLFFBU3JCO0FBZ0JEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixpQ0FBaUMsQ0FBQyxHQUEyQztJQUMzRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztLQUN2QixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFzRUQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLG9DQUFvQyxDQUFDLEdBQThDO0lBQ2pHLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDcEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM5QixhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDOUIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1FBQzVCLFdBQVcsRUFBRSxHQUFHLENBQUMsU0FBUztRQUMxQixZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDNUIsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGVBQWU7S0FDdkMsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBaUJEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixpQ0FBaUMsQ0FBQyxHQUEyQztJQUMzRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztLQUN2QixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFpQkQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDhCQUE4QixDQUFDLEdBQXdDO0lBQ3JGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3ZCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXNERDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsaUNBQWlDLENBQUMsR0FBMkM7SUFDM0YsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDdEIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQzlCLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM5QixZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDNUIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1FBQzFCLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxlQUFlO0tBQ3ZDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWlCRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsOEJBQThCLENBQUMsR0FBd0M7SUFDckYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87S0FDdkIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBaUJEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw4QkFBOEIsQ0FBQyxHQUF3QztJQUNyRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztLQUN2QixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFvR0Q7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLGlDQUFpQyxDQUFDLEdBQTJDO0lBQzNGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLGlCQUFpQjtRQUMxQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsZUFBZTtRQUN0QyxTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDdEIsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLG9CQUFvQjtRQUNoRCxhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDOUIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQzlCLFlBQVksRUFBRSxHQUFHLENBQUMsVUFBVTtRQUM1QixXQUFXLEVBQUUsR0FBRyxDQUFDLFNBQVM7UUFDMUIsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLHFCQUFxQjtRQUNsRCxpQkFBaUIsRUFBRSxHQUFHLENBQUMsZUFBZTtRQUN0Qyx1QkFBdUIsRUFBRSxHQUFHLENBQUMscUJBQXFCO0tBQ25ELENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWlCRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsOEJBQThCLENBQUMsR0FBd0M7SUFDckYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87S0FDdkIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBNkJEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw4QkFBOEIsQ0FBQyxHQUF3QztJQUNyRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGVBQWUsRUFBRSxHQUFHLENBQUMsYUFBYTtRQUNsQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7S0FDZixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFpQkQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDRCQUE0QixDQUFDLEdBQXNDO0lBQ2pGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3ZCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXNLRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsK0JBQStCLENBQUMsR0FBeUM7SUFDdkYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixrQkFBa0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCO1FBQ3hDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxpQkFBaUI7UUFDMUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGVBQWU7UUFDdEMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDcEMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtRQUN4QyxTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDdEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1FBQ3BCLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM5QixhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDOUIsZUFBZSxFQUFFLEdBQUcsQ0FBQyxhQUFhO1FBQ2xDLFlBQVksRUFBRSxHQUFHLENBQUMsVUFBVTtRQUM1QixXQUFXLEVBQUUsR0FBRyxDQUFDLFNBQVM7UUFDMUIsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLGlCQUFpQjtRQUMxQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsZUFBZTtRQUN0QyxZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDNUIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1FBQzVCLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxjQUFjO1FBQ3BDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxlQUFlO0tBQ3ZDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQUNELG9GQUFvRjtBQUVwRjs7OztHQUlHO0FBQ0gsSUFBWSxVQWNYO0FBZEQsV0FBWSxVQUFVO0lBQ3BCOzZDQUN5QztJQUN6Qyx5Q0FBMkIsQ0FBQTtJQUMzQjs7Ozs7Ozs7dUdBUW1HO0lBQ25HLDRDQUE4QixDQUFBO0FBQ2hDLENBQUMsRUFkVyxVQUFVLDBCQUFWLFVBQVUsUUFjckI7QUFnQkQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDRCQUE0QixDQUFDLEdBQXNDO0lBQ2pGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3ZCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXFDRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsNEJBQTRCLENBQUMsR0FBc0M7SUFDakYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixtQkFBbUIsRUFBRSxHQUFHLENBQUMsaUJBQWlCO1FBQzFDLGVBQWUsRUFBRSxHQUFHLENBQUMsYUFBYTtRQUNsQyxrQ0FBa0MsRUFBRSxHQUFHLENBQUMsZ0NBQWdDO0tBQ3pFLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXdDRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsOEJBQThCLENBQUMsR0FBd0M7SUFDckYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYiwwQkFBMEIsRUFBRSxHQUFHLENBQUMsd0JBQXdCO0tBQ3pELENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWlCRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsOEJBQThCLENBQUMsR0FBd0M7SUFDckYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87S0FDdkIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBNkZEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixpQ0FBaUMsQ0FBQyxHQUEyQztJQUMzRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxjQUFjO1FBQ3BDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0I7UUFDeEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTTtRQUNwQixhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDOUIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQzlCLFlBQVksRUFBRSxHQUFHLENBQUMsVUFBVTtRQUM1QixXQUFXLEVBQUUsR0FBRyxDQUFDLFNBQVM7UUFDMUIsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDcEMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGVBQWU7S0FDdkMsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBaUJEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw4QkFBOEIsQ0FBQyxHQUF3QztJQUNyRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztLQUN2QixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUF3QkQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDhCQUE4QixDQUFDLEdBQXdDO0lBQ3JGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsZUFBZSxFQUFFLEdBQUcsQ0FBQyxhQUFhO1FBQ2xDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxtQkFBbUI7S0FDL0MsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBQ0Qsb0ZBQW9GO0FBRXBGOztHQUVHO0FBQ0gsSUFBWSxlQU9YO0FBUEQsV0FBWSxlQUFlO0lBQ3pCLDZEQUE2RDtJQUM3RCw4QkFBVyxDQUFBO0lBQ1gsK0RBQStEO0lBQy9ELGdDQUFhLENBQUE7SUFDYix1RUFBdUU7SUFDdkUsOENBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQVBXLGVBQWUsK0JBQWYsZUFBZSxRQU8xQjtBQTZERDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsWUFBWSxDQUFDLEdBQXNCO0lBQ2pELElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2hCLFlBQVksRUFBRSxHQUFHLENBQUMsVUFBVTtRQUM1QixhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDOUIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM5QixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07UUFDcEIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQzlCLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN4QixPQUFPLEVBQUUsR0FBRyxDQUFDLEtBQUs7UUFDbEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVO0tBQzdCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXNCRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isa0NBQWtDLENBQUMsR0FBNEM7SUFDN0YsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixTQUFTLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDdEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3ZCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWVEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixpQ0FBaUMsQ0FBQyxHQUEyQztJQUMzRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztLQUN2QixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFtSUQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHFDQUFxQyxDQUFDLEdBQStDO0lBQ25HLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLGlCQUFpQjtRQUMxQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsZUFBZTtRQUN0QyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsY0FBYztRQUNwQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCO1FBQ3hDLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07UUFDcEIsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtRQUN4QyxZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDNUIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQzlCLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM5QixZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDNUIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1FBQzFCLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxjQUFjO1FBQ3BDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxlQUFlO0tBQ3ZDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQTZCRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isa0NBQWtDLENBQUMsR0FBNEM7SUFDN0YsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixTQUFTLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUosU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztLQUNqQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0Y7QUFFcEY7Ozs7R0FJRztBQUNILElBQVksYUFHWDtBQUhELFdBQVksYUFBYTtJQUN2QixVQUFVO0lBQ1YsNEJBQVcsQ0FBQTtBQUNiLENBQUMsRUFIVyxhQUFhLDZCQUFiLGFBQWEsUUFHeEI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxZQU9YO0FBUEQsV0FBWSxZQUFZO0lBQ3RCLGtCQUFrQjtJQUNsQiwyQ0FBMkIsQ0FBQTtJQUMzQixVQUFVO0lBQ1YsMkJBQVcsQ0FBQTtJQUNYLFdBQVc7SUFDWCw2QkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQVBXLFlBQVksNEJBQVosWUFBWSxRQU92QjtBQXVHRDs7O0dBR0c7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsYUFBYSxDQUFDLEdBQXVCO0lBQ25ELElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2Isb0JBQW9CLEVBQUUsR0FBRyxDQUFDLGtCQUFrQjtRQUM1QyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsZUFBZTtRQUN0QyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07UUFDcEIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1FBQzlCLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxtQkFBbUI7UUFDOUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLG9CQUFvQjtRQUNoRCwyQkFBMkIsRUFBRSxHQUFHLENBQUMseUJBQXlCO1FBQzFELGVBQWUsRUFBRSxHQUFHLENBQUMsYUFBYTtRQUNsQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsb0JBQW9CO1FBQ2hELHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxtQkFBbUI7UUFDOUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLHFCQUFxQjtRQUNsRCxxQkFBcUIsRUFBRSxHQUFHLENBQUMsbUJBQW1CO0tBQy9DLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQUNELG9GQUFvRjtBQUVwRjs7R0FFRztBQUNILElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQixhQUFhO0lBQ2IsK0JBQWlCLENBQUE7SUFDakIsYUFBYTtJQUNiLCtCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFMVyxVQUFVLDBCQUFWLFVBQVUsUUFLckI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxxQkFLWDtBQUxELFdBQVkscUJBQXFCO0lBQy9CLHVFQUF1RTtJQUN2RSx3Q0FBZSxDQUFBO0lBQ2YsNERBQTREO0lBQzVELDBDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFMVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQUtoQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILElBQVkscUJBa0JYO0FBbEJELFdBQVkscUJBQXFCO0lBQy9COzZDQUN5QztJQUN6QyxvQ0FBVyxDQUFBO0lBQ1g7Ozs7Ozs7Ozs7aUJBVWE7SUFDYiwwQ0FBaUIsQ0FBQTtJQUNqQix5SEFBeUg7SUFDekgsMENBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQWxCVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQWtCaEM7QUFFRDs7R0FFRztBQUNILElBQVksZ0JBS1g7QUFMRCxXQUFZLGdCQUFnQjtJQUMxQixhQUFhO0lBQ2IscUNBQWlCLENBQUE7SUFDakIsZUFBZTtJQUNmLDBDQUFzQixDQUFBO0FBQ3hCLENBQUMsRUFMVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUszQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxpQkFLWDtBQUxELFdBQVksaUJBQWlCO0lBQzNCLDBEQUEwRDtJQUMxRCxvQ0FBZSxDQUFBO0lBQ2YsNERBQTREO0lBQzVELHNDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFMVyxpQkFBaUIsaUNBQWpCLGlCQUFpQixRQUs1QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxlQUtYO0FBTEQsV0FBWSxlQUFlO0lBQ3pCLGVBQWU7SUFDZix5Q0FBc0IsQ0FBQTtJQUN0QixlQUFlO0lBQ2Ysd0NBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUxXLGVBQWUsK0JBQWYsZUFBZSxRQUsxQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxVQUtYO0FBTEQsV0FBWSxVQUFVO0lBQ3BCLGFBQWE7SUFDYiwrQkFBaUIsQ0FBQTtJQUNqQixlQUFlO0lBQ2Ysb0NBQXNCLENBQUE7QUFDeEIsQ0FBQyxFQUxXLFVBQVUsMEJBQVYsVUFBVSxRQUtyQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLGdCQU9YO0FBUEQsV0FBWSxnQkFBZ0I7SUFDMUIsVUFBVTtJQUNWLCtCQUFXLENBQUE7SUFDWCxVQUFVO0lBQ1YsK0JBQVcsQ0FBQTtJQUNYLFdBQVc7SUFDWCxpQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQVBXLGdCQUFnQixnQ0FBaEIsZ0JBQWdCLFFBTzNCO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1QixXQUFXO0lBQ1gsbUNBQWEsQ0FBQTtJQUNiLFVBQVU7SUFDVixpQ0FBVyxDQUFBO0FBQ2IsQ0FBQyxFQUxXLGtCQUFrQixrQ0FBbEIsa0JBQWtCLFFBSzdCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibm9kZSAuL3Byb2plbi5qc1wiLlxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBjb250YWluZWQgaW4gYGJpb21lLmpzb25gLlxuICpcbiAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmlvbWVDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEEgZmllbGQgZm9yIHRoZSBKU09OIHNjaGVtYSBzcGVjaWZpY2F0aW9uOiBodHRwczovL2pzb24tc2NoZW1hLm9yZy9cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jJHNjaGVtYVxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZW1hPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYXNzaXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogQXNzaXN0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBzcGVjaWZpYyB0byBDU1MuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2Nzc1xuICAgKi9cbiAgcmVhZG9ubHkgY3NzPzogQ3NzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHBhdGhzIHRvIG90aGVyIEpTT04gZmlsZXMsIHVzZWQgdG8gZXh0ZW5kIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2V4dGVuZHNcbiAgICovXG4gIHJlYWRvbmx5IGV4dGVuZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgaGFuZGxpbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGZpbGVzPzogRmlsZXNDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0dGVyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogRm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBzcGVjaWZpYyB0byBHcmFwaFFMLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNncmFwaHFsXG4gICAqL1xuICByZWFkb25seSBncmFwaHFsPzogR3JhcGhxbENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gR3JpdFFMLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNncml0XG4gICAqL1xuICByZWFkb25seSBncml0PzogR3JpdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gSFRNTC5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgaHRtbD86IEh0bWxDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIEphdmFTY3JpcHQuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2phdmFzY3JpcHRcbiAgICovXG4gIHJlYWRvbmx5IGphdmFzY3JpcHQ/OiBKc0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gSlNPTi5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24janNvblxuICAgKi9cbiAgcmVhZG9ubHkganNvbj86IEpzb25Db25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGludGVyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2xpbnRlclxuICAgKi9cbiAgcmVhZG9ubHkgbGludGVyPzogTGludGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGdyYW51bGFyIHBhdHRlcm5zIGFwcGxpZWQgb25seSB0byBhIHN1YnNldCBvZiBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jb3ZlcnJpZGVzXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBPdmVycmlkZVBhdHRlcm5bXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBwbHVnaW5zIHRvIGxvYWQuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI3BsdWdpbnNcbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbnM/OiBhbnlbXTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgaXMgYXQgdGhlIHJvb3Qgb2YgYSBCaW9tZVxuICAgKiBwcm9qZWN0LiBCeSBkZWZhdWx0LCB0aGlzIGlzIGB0cnVlYC5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jcm9vdFxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIGNvbnRyb2wgaW50ZWdyYXRpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jdmNzXG4gICAqL1xuICByZWFkb25seSB2Y3M/OiBWY3NDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCaW9tZUNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CaW9tZUNvbmZpZ3VyYXRpb24ob2JqOiBCaW9tZUNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICckc2NoZW1hJzogb2JqLnNjaGVtYSxcbiAgICAnYXNzaXN0JzogdG9Kc29uX0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2Nzcyc6IHRvSnNvbl9Dc3NDb25maWd1cmF0aW9uKG9iai5jc3MpLFxuICAgICdleHRlbmRzJzogb2JqLmV4dGVuZHM/Lm1hcCh5ID0+IHkpLFxuICAgICdmaWxlcyc6IHRvSnNvbl9GaWxlc0NvbmZpZ3VyYXRpb24ob2JqLmZpbGVzKSxcbiAgICAnZm9ybWF0dGVyJzogdG9Kc29uX0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2dyYXBocWwnOiB0b0pzb25fR3JhcGhxbENvbmZpZ3VyYXRpb24ob2JqLmdyYXBocWwpLFxuICAgICdncml0JzogdG9Kc29uX0dyaXRDb25maWd1cmF0aW9uKG9iai5ncml0KSxcbiAgICAnaHRtbCc6IHRvSnNvbl9IdG1sQ29uZmlndXJhdGlvbihvYmouaHRtbCksXG4gICAgJ2phdmFzY3JpcHQnOiB0b0pzb25fSnNDb25maWd1cmF0aW9uKG9iai5qYXZhc2NyaXB0KSxcbiAgICAnanNvbic6IHRvSnNvbl9Kc29uQ29uZmlndXJhdGlvbihvYmouanNvbiksXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9MaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICAgICdvdmVycmlkZXMnOiBvYmoub3ZlcnJpZGVzPy5tYXAoeSA9PiB0b0pzb25fT3ZlcnJpZGVQYXR0ZXJuKHkpKSxcbiAgICAncGx1Z2lucyc6IG9iai5wbHVnaW5zPy5tYXAoeSA9PiB5KSxcbiAgICAncm9vdCc6IG9iai5yb290LFxuICAgICd2Y3MnOiB0b0pzb25fVmNzQ29uZmlndXJhdGlvbihvYmoudmNzKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgQXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogV2hldGhlciBCaW9tZSBzaG91bGQgZmFpbCBpbiBDTEkgaWYgdGhlIGFzc2lzdCB3ZXJlIG5vdCBhcHBsaWVkIHRvIHRoZSBjb2RlLlxuICAgKlxuICAgKiBAc2NoZW1hIEFzc2lzdENvbmZpZ3VyYXRpb24jYWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9ucz86IEFjdGlvbnM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgQmlvbWUgc2hvdWxkIGVuYWJsZSBhc3Npc3QgdmlhIExTUCBhbmQgQ0xJLlxuICAgKlxuICAgKiBAc2NoZW1hIEFzc2lzdENvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBnbG9iIHBhdHRlcm5zLiBCaW9tZSB3aWxsIGluY2x1ZGUgZmlsZXMvZm9sZGVycyB0aGF0IHdpbGxcbiAgICogbWF0Y2ggdGhlc2UgcGF0dGVybnMuXG4gICAqXG4gICAqIEBzY2hlbWEgQXNzaXN0Q29uZmlndXJhdGlvbiNpbmNsdWRlc1xuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBBc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWN0aW9ucyc6IHRvSnNvbl9BY3Rpb25zKG9iai5hY3Rpb25zKSxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdpbmNsdWRlcyc6IG9iai5pbmNsdWRlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIGFwcGxpZWQgdG8gQ1NTIGZpbGVzLlxuICpcbiAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENzc0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ1NTIGFzc2lzdCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0NvbmZpZ3VyYXRpb24jYXNzaXN0XG4gICAqL1xuICByZWFkb25seSBhc3Npc3Q/OiBDc3NBc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDU1MgZm9ybWF0dGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvbiNmb3JtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IENzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENTUyBnbG9iYWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0NvbmZpZ3VyYXRpb24jZ2xvYmFsc1xuICAgKi9cbiAgcmVhZG9ubHkgZ2xvYmFscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDU1MgbGludGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IENzc0xpbnRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENTUyBwYXJzaW5nIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvbiNwYXJzZXJcbiAgICovXG4gIHJlYWRvbmx5IHBhcnNlcj86IENzc1BhcnNlckNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Nzc0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Dc3NDb25maWd1cmF0aW9uKG9iajogQ3NzQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fzc2lzdCc6IHRvSnNvbl9Dc3NBc3Npc3RDb25maWd1cmF0aW9uKG9iai5hc3Npc3QpLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnZ2xvYmFscyc6IG9iai5nbG9iYWxzPy5tYXAoeSA9PiB5KSxcbiAgICAnbGludGVyJzogdG9Kc29uX0Nzc0xpbnRlckNvbmZpZ3VyYXRpb24ob2JqLmxpbnRlciksXG4gICAgJ3BhcnNlcic6IHRvSnNvbl9Dc3NQYXJzZXJDb25maWd1cmF0aW9uKG9iai5wYXJzZXIpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIGZpbGUgaGFuZGxpbmcgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAc2NoZW1hIEZpbGVzQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiAqKkRlcHJlY2F0ZWQ6KiogUGxlYXNlIHVzZSBfZm9yY2UtaWdub3JlIHN5bnRheF8gaW4gYGZpbGVzLmluY2x1ZGVzYFxuICAgKiBpbnN0ZWFkOiA8aHR0cHM6Ly9iaW9tZWpzLmRldi9yZWZlcmVuY2UvY29uZmlndXJhdGlvbi8jZmlsZXNpbmNsdWRlcz5cbiAgICpcbiAgICogU2V0IG9mIGZpbGUgYW5kIGZvbGRlciBuYW1lcyB0aGF0IHNob3VsZCBiZSB1bmNvbmRpdGlvbmFsbHkgaWdub3JlZCBieVxuICAgKiBCaW9tZSdzIHNjYW5uZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgRmlsZXNDb25maWd1cmF0aW9uI2V4cGVyaW1lbnRhbFNjYW5uZXJJZ25vcmVzXG4gICAqL1xuICByZWFkb25seSBleHBlcmltZW50YWxTY2FubmVySWdub3Jlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQcmV2ZW50cyBCaW9tZSBmcm9tIGVtaXR0aW5nIGRpYWdub3N0aWNzIGZvciB1bnJlY29nbml6ZWQgZmlsZSB0eXBlcy5cbiAgICpcbiAgICogQHNjaGVtYSBGaWxlc0NvbmZpZ3VyYXRpb24jaWdub3JlVW5rbm93blxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlVW5rbm93bj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBnbG9iIHBhdHRlcm5zLiBCaW9tZSBoYW5kbGVzIG9ubHkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRoYXQgbWF0Y2ggdGhlc2VcbiAgICogcGF0dGVybnMuXG4gICAqXG4gICAqIEBzY2hlbWEgRmlsZXNDb25maWd1cmF0aW9uI2luY2x1ZGVzXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBzb3VyY2UgZmlsZSBzaXplIGluIGJ5dGVzLiBCaW9tZSBpZ25vcmVzIGxhcmdlciBmaWxlcy4gRGVmYXVsdHMgdG8gYDEgTWlCYC5cbiAgICpcbiAgICogQGRlZmF1bHQgMSBNaUJgLlxuICAgKiBAc2NoZW1hIEZpbGVzQ29uZmlndXJhdGlvbiNtYXhTaXplXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdGaWxlc0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9GaWxlc0NvbmZpZ3VyYXRpb24ob2JqOiBGaWxlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdleHBlcmltZW50YWxTY2FubmVySWdub3Jlcyc6IG9iai5leHBlcmltZW50YWxTY2FubmVySWdub3Jlcz8ubWFwKHkgPT4geSksXG4gICAgJ2lnbm9yZVVua25vd24nOiBvYmouaWdub3JlVW5rbm93bixcbiAgICAnaW5jbHVkZXMnOiBvYmouaW5jbHVkZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdtYXhTaXplJzogb2JqLm1heFNpemUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBHZW5lcmljIG9wdGlvbnMgYXBwbGllZCB0byBhbGwgZmlsZXNcbiAqXG4gKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGUgcG9zaXRpb24gc3R5bGUgaW4gSFRNTC1saWtlIGxhbmd1YWdlcy4gRGVmYXVsdHMgdG8gYGF1dG9gLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhdXRvYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2F0dHJpYnV0ZVBvc2l0aW9uXG4gICAqL1xuICByZWFkb25seSBhdHRyaWJ1dGVQb3NpdGlvbj86IEF0dHJpYnV0ZVBvc2l0aW9uO1xuXG4gIC8qKlxuICAgKiBQbGFjZXMgdGhlIGA+YCBvZiBhIG11bHRpbGluZSBIVE1MIG9yIEpTWCBlbGVtZW50IGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgbGluZSBpbnN0ZWFkIG9mIG9uXG4gICAqIHRoZSBuZXh0IGxpbmUuIFNlbGYtY2xvc2luZyBlbGVtZW50cyBhcmUgdW5hZmZlY3RlZC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNhbWVMaW5lXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U2FtZUxpbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluc2VydCBzcGFjZXMgaW5zaWRlIGJyYWNlcyBpbiBvYmplY3QgbGl0ZXJhbHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZWAuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNicmFja2V0U3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgYnJhY2tldFNwYWNpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBzcGFjZXMgaW1tZWRpYXRlbHkgaW5zaWRlIHN1cHBvcnRlZCBkZWxpbWl0ZXJzIHdoZW4gdGhlaXIgY29udGVudCBmaXRzIG9uIG9uZSBsaW5lLlxuICAgKiBJdCBkb2Vzbid0IGFkZCBzcGFjZXMgYmVmb3JlIG9wZW5pbmcgZGVsaW1pdGVycyBvciBpbnNpZGUgZW1wdHkgZGVsaW1pdGVycy5cbiAgICpcbiAgICogVGhlIGFmZmVjdGVkIGRlbGltaXRlcnMgdmFyeSBieSBsYW5ndWFnZS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZGVsaW1pdGVyU3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgZGVsaW1pdGVyU3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGZvcm1hdHRlZCBvbiBvbmUgbGluZSBvciBtdWx0aXBsZSBsaW5lcy5cbiAgICpcbiAgICogYGF1dG9gIGZvcm1hdHMgb2JqZWN0cyBvbiBtdWx0aXBsZSBsaW5lcyBpZiB0aGUgZmlyc3QgcHJvcGVydHkgaGFzIGEgbmV3bGluZSwgYW5kIGFycmF5cyBvblxuICAgKiBvbmUgbGluZSBpZiB0aGV5IGZpdC5cbiAgICpcbiAgICogYGFsd2F5c2AgZm9ybWF0cyBhcnJheXMgYW5kIG9iamVjdHMgb24gbXVsdGlwbGUgbGluZXMuXG4gICAqXG4gICAqIGBuZXZlcmAgZm9ybWF0cyBhcnJheXMgYW5kIG9iamVjdHMgb24gb25lIGxpbmUgaWYgdGhleSBmaXQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBhdXRvYC5cbiAgICpcbiAgICogV2hlbiBmb3JtYXR0aW5nIGBwYWNrYWdlLmpzb25gLCBCaW9tZSB1c2VzIGBhbHdheXNgIHVubGVzcyBjb25maWd1cmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYXV0b2AuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNleHBhbmRcbiAgICovXG4gIHJlYWRvbmx5IGV4cGFuZD86IEV4cGFuZDtcblxuICAvKipcbiAgICogQWxsb3dzIGZvcm1hdHRpbmcgZmlsZXMgdGhhdCBjb250YWluIHN5bnRheCBlcnJvcnMgd2hlbiBzZXQgdG8gYHRydWVgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNmb3JtYXRXaXRoRXJyb3JzXG4gICAqL1xuICByZWFkb25seSBmb3JtYXRXaXRoRXJyb3JzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGdsb2IgcGF0dGVybnMuIFRoZSBmb3JtYXR0ZXIgd2lsbCBpbmNsdWRlIGZpbGVzL2ZvbGRlcnMgdGhhdCB3aWxsXG4gICAqIG1hdGNoIHRoZXNlIHBhdHRlcm5zLlxuICAgKlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5jbHVkZXNcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFVzZXMgdGFicyBvciBzcGFjZXMgZm9yIGluZGVudGF0aW9uLiBEZWZhdWx0cyB0byBgdGFiYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGFiYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGguIERlZmF1bHRzIHRvIGAyYC5cbiAgICpcbiAgICogQGRlZmF1bHQgMmAuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGxpbmUgZW5kaW5nLiBgYXV0b2AgdXNlcyB0aGUgcGxhdGZvcm0gY29udmVudGlvbi4gRGVmYXVsdHMgdG8gYGxmYC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGZgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZUVuZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGluZUVuZGluZz86IExpbmVFbmRpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGxpbmUgd2lkdGguIERlZmF1bHRzIHRvIGA4MGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDgwYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFkZCBhIHRyYWlsaW5nIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gRGVmYXVsdHMgdG8gYHRydWVgOyBkaXNhYmxpbmdcbiAgICogdGhpcyBvcHRpb24gY2FuIGNhdXNlIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aCBvdGhlciB0b29scy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZWA7IGRpc2FibGluZ1xuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jdHJhaWxpbmdOZXdsaW5lXG4gICAqL1xuICByZWFkb25seSB0cmFpbGluZ05ld2xpbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2VzIGAuZWRpdG9yY29uZmlnYCBmaWxlcyB0byBjb25maWd1cmUgdGhlIGZvcm1hdHRlci4gU2V0dGluZ3MgaW4gYGJpb21lLmpzb25gIG9yXG4gICAqIGBiaW9tZS5qc29uY2Agb3ZlcnJpZGUgYC5lZGl0b3Jjb25maWdgIHNldHRpbmdzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN1c2VFZGl0b3Jjb25maWdcbiAgICovXG4gIHJlYWRvbmx5IHVzZUVkaXRvcmNvbmZpZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Gb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F0dHJpYnV0ZVBvc2l0aW9uJzogb2JqLmF0dHJpYnV0ZVBvc2l0aW9uLFxuICAgICdicmFja2V0U2FtZUxpbmUnOiBvYmouYnJhY2tldFNhbWVMaW5lLFxuICAgICdicmFja2V0U3BhY2luZyc6IG9iai5icmFja2V0U3BhY2luZyxcbiAgICAnZGVsaW1pdGVyU3BhY2luZyc6IG9iai5kZWxpbWl0ZXJTcGFjaW5nLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2V4cGFuZCc6IG9iai5leHBhbmQsXG4gICAgJ2Zvcm1hdFdpdGhFcnJvcnMnOiBvYmouZm9ybWF0V2l0aEVycm9ycyxcbiAgICAnaW5jbHVkZXMnOiBvYmouaW5jbHVkZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAndHJhaWxpbmdOZXdsaW5lJzogb2JqLnRyYWlsaW5nTmV3bGluZSxcbiAgICAndXNlRWRpdG9yY29uZmlnJzogb2JqLnVzZUVkaXRvcmNvbmZpZyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgYXBwbGllZCB0byBHcmFwaFFMIGZpbGVzLlxuICpcbiAqIEBzY2hlbWEgR3JhcGhxbENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmFwaHFsQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBHcmFwaFFMIGFzc2lzdCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxDb25maWd1cmF0aW9uI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogR3JhcGhxbEFzc2lzdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEdyYXBoUUwgZm9ybWF0dGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JhcGhxbENvbmZpZ3VyYXRpb24jZm9ybWF0dGVyXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogR3JhcGhRTCBsaW50ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IEdyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcmFwaHFsQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyYXBocWxDb25maWd1cmF0aW9uKG9iajogR3JhcGhxbENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhc3Npc3QnOiB0b0pzb25fR3JhcGhxbEFzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9HcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnbGludGVyJzogdG9Kc29uX0dyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyBhcHBsaWVkIHRvIEdyaXRRTCBmaWxlcy5cbiAqXG4gKiBAc2NoZW1hIEdyaXRDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JpdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogR3JpdFFMIGFzc2lzdCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyaXRDb25maWd1cmF0aW9uI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogR3JpdEFzc2lzdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEdyaXRRTCBmb3JtYXR0ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0Q29uZmlndXJhdGlvbiNmb3JtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IEdyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBHcml0UUwgbGludGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdENvbmZpZ3VyYXRpb24jbGludGVyXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBHcml0TGludGVyQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnR3JpdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Hcml0Q29uZmlndXJhdGlvbihvYmo6IEdyaXRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXNzaXN0JzogdG9Kc29uX0dyaXRBc3Npc3RDb25maWd1cmF0aW9uKG9iai5hc3Npc3QpLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9Hcml0TGludGVyQ29uZmlndXJhdGlvbihvYmoubGludGVyKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgYXBwbGllZCB0byBIVE1MIGZpbGVzLlxuICpcbiAqIEBzY2hlbWEgSHRtbENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdG1sQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBIVE1MIGFzc2lzdCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxDb25maWd1cmF0aW9uI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogSHRtbEFzc2lzdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgZnVsbCBzdXBwb3J0IGZvciBIVE1MLCBWdWUsIFN2ZWx0ZSwgYW5kIEFzdHJvIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxDb25maWd1cmF0aW9uI2V4cGVyaW1lbnRhbEZ1bGxTdXBwb3J0RW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZXJpbWVudGFsRnVsbFN1cHBvcnRFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSFRNTCBmb3JtYXR0ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sQ29uZmlndXJhdGlvbiNmb3JtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIVE1MIGxpbnRlciBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxDb25maWd1cmF0aW9uI2xpbnRlclxuICAgKi9cbiAgcmVhZG9ubHkgbGludGVyPzogSHRtbExpbnRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEhUTUwgcGFyc2luZyBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxDb25maWd1cmF0aW9uI3BhcnNlclxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VyPzogSHRtbFBhcnNlckNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0h0bWxDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSHRtbENvbmZpZ3VyYXRpb24ob2JqOiBIdG1sQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fzc2lzdCc6IHRvSnNvbl9IdG1sQXNzaXN0Q29uZmlndXJhdGlvbihvYmouYXNzaXN0KSxcbiAgICAnZXhwZXJpbWVudGFsRnVsbFN1cHBvcnRFbmFibGVkJzogb2JqLmV4cGVyaW1lbnRhbEZ1bGxTdXBwb3J0RW5hYmxlZCxcbiAgICAnZm9ybWF0dGVyJzogdG9Kc29uX0h0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iai5mb3JtYXR0ZXIpLFxuICAgICdsaW50ZXInOiB0b0pzb25fSHRtbExpbnRlckNvbmZpZ3VyYXRpb24ob2JqLmxpbnRlciksXG4gICAgJ3BhcnNlcic6IHRvSnNvbl9IdG1sUGFyc2VyQ29uZmlndXJhdGlvbihvYmoucGFyc2VyKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgc2V0IG9mIG9wdGlvbnMgYXBwbGllZCB0byB0aGUgSmF2YVNjcmlwdCBmaWxlc1xuICpcbiAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEFzc2lzdCBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogSnNBc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHN1cHBvcnQgZm9yIGVtYmVkZGluZyBzbmlwcGV0cy5cbiAgICpcbiAgICogQHNjaGVtYSBKc0NvbmZpZ3VyYXRpb24jZXhwZXJpbWVudGFsRW1iZWRkZWRTbmlwcGV0c0VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4cGVyaW1lbnRhbEVtYmVkZGVkU25pcHBldHNFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9ybWF0dGluZyBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZ2xvYmFsIGJpbmRpbmdzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIGFuYWx5emVyc1xuICAgKlxuICAgKiBJZiBkZWZpbmVkIGhlcmUsIHRoZXkgc2hvdWxkIG5vdCBlbWl0IGRpYWdub3N0aWNzLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvbiNnbG9iYWxzXG4gICAqL1xuICByZWFkb25seSBnbG9iYWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgdHlwZSBvZiBydW50aW1lIG9yIHRyYW5zZm9ybWF0aW9uIHVzZWQgZm9yIGludGVycHJldGluZyBKU1guXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI2pzeFJ1bnRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGpzeFJ1bnRpbWU/OiBKc3hSdW50aW1lO1xuXG4gIC8qKlxuICAgKiBMaW50ZXIgb3B0aW9uc1xuICAgKlxuICAgKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IEpzTGludGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogUGFyc2luZyBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI3BhcnNlclxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VyPzogSnNQYXJzZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNb2R1bGUvZGVwZW5kZW5jeSByZXNvbHZlciBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI3Jlc29sdmVyXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlcj86IEpzUmVzb2x2ZXJDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc0NvbmZpZ3VyYXRpb24ob2JqOiBKc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhc3Npc3QnOiB0b0pzb25fSnNBc3Npc3RDb25maWd1cmF0aW9uKG9iai5hc3Npc3QpLFxuICAgICdleHBlcmltZW50YWxFbWJlZGRlZFNuaXBwZXRzRW5hYmxlZCc6IG9iai5leHBlcmltZW50YWxFbWJlZGRlZFNuaXBwZXRzRW5hYmxlZCxcbiAgICAnZm9ybWF0dGVyJzogdG9Kc29uX0pzRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnZ2xvYmFscyc6IG9iai5nbG9iYWxzPy5tYXAoeSA9PiB5KSxcbiAgICAnanN4UnVudGltZSc6IG9iai5qc3hSdW50aW1lLFxuICAgICdsaW50ZXInOiB0b0pzb25fSnNMaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICAgICdwYXJzZXInOiB0b0pzb25fSnNQYXJzZXJDb25maWd1cmF0aW9uKG9iai5wYXJzZXIpLFxuICAgICdyZXNvbHZlcic6IHRvSnNvbl9Kc1Jlc29sdmVyQ29uZmlndXJhdGlvbihvYmoucmVzb2x2ZXIpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyBhcHBsaWVkIHRvIEpTT04gZmlsZXNcbiAqXG4gKiBAc2NoZW1hIEpzb25Db25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQXNzaXN0IG9wdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBKc29uQ29uZmlndXJhdGlvbiNhc3Npc3RcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lzdD86IEpzb25Bc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBGb3JtYXR0aW5nIG9wdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBKc29uQ29uZmlndXJhdGlvbiNmb3JtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMaW50aW5nIG9wdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBKc29uQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IEpzb25MaW50ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBQYXJzaW5nIG9wdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBKc29uQ29uZmlndXJhdGlvbiNwYXJzZXJcbiAgICovXG4gIHJlYWRvbmx5IHBhcnNlcj86IEpzb25QYXJzZXJDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc29uQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzb25Db25maWd1cmF0aW9uKG9iajogSnNvbkNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhc3Npc3QnOiB0b0pzb25fSnNvbkFzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9Kc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnbGludGVyJzogdG9Kc29uX0pzb25MaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICAgICdwYXJzZXInOiB0b0pzb25fSnNvblBhcnNlckNvbmZpZ3VyYXRpb24ob2JqLnBhcnNlciksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIExpbnRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB3aGVyZSB0aGUga2V5cyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBkb21haW5zLCBhbmQgdGhlIHZhbHVlcyBhcmUgYGFsbGAsIGByZWNvbW1lbmRlZGAsIG9yIGBub25lYC5cbiAgICpcbiAgICogQHNjaGVtYSBMaW50ZXJDb25maWd1cmF0aW9uI2RvbWFpbnNcbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbnM/OiB7IFtrZXk6IHN0cmluZ106IFJ1bGVEb21haW5WYWx1ZSB9O1xuXG4gIC8qKlxuICAgKiBpZiBgZmFsc2VgLCBpdCBkaXNhYmxlcyB0aGUgZmVhdHVyZSBhbmQgdGhlIGxpbnRlciB3b24ndCBiZSBleGVjdXRlZC4gYHRydWVgIGJ5IGRlZmF1bHRcbiAgICpcbiAgICogQHNjaGVtYSBMaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucy4gVGhlIGFuYWx5emVyIHdpbGwgaGFuZGxlIG9ubHkgdGhvc2UgZmlsZXMvZm9sZGVycyB0aGF0IHdpbGxcbiAgICogbWF0Y2ggdGhlc2UgcGF0dGVybnMuXG4gICAqXG4gICAqIEBzY2hlbWEgTGludGVyQ29uZmlndXJhdGlvbiNpbmNsdWRlc1xuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBydWxlc1xuICAgKlxuICAgKiBAc2NoZW1hIExpbnRlckNvbmZpZ3VyYXRpb24jcnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVzPzogUnVsZXM7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0xpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9MaW50ZXJDb25maWd1cmF0aW9uKG9iajogTGludGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2RvbWFpbnMnOiAoKG9iai5kb21haW5zKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmouZG9tYWlucykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW5jbHVkZXMnOiBvYmouaW5jbHVkZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdydWxlcyc6IHRvSnNvbl9SdWxlcyhvYmoucnVsZXMpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVycmlkZVBhdHRlcm4ge1xuICAvKipcbiAgICogU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIEpzb24gbGFuZ3VhZ2VcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jYXNzaXN0XG4gICAqL1xuICByZWFkb25seSBhc3Npc3Q/OiBPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBDU1MgbGFuZ3VhZ2VcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jY3NzXG4gICAqL1xuICByZWFkb25seSBjc3M/OiBDc3NDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciB0aGUgZmlsZXN5c3RlbVxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsZXM/OiBPdmVycmlkZUZpbGVzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIEpzb24gbGFuZ3VhZ2VcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jZm9ybWF0dGVyXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBHcmFwaHFsIGxhbmd1YWdlXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2dyYXBocWxcbiAgICovXG4gIHJlYWRvbmx5IGdyYXBocWw/OiBHcmFwaHFsQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIEdyaXRRTCBsYW5ndWFnZVxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNncml0XG4gICAqL1xuICByZWFkb25seSBncml0PzogR3JpdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBHcml0UUwgbGFuZ3VhZ2VcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgaHRtbD86IEh0bWxDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucy4gQmlvbWUgd2lsbCBpbmNsdWRlIGZpbGVzL2ZvbGRlcnMgdGhhdCB3aWxsXG4gICAqIG1hdGNoIHRoZXNlIHBhdHRlcm5zLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNpbmNsdWRlc1xuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIEphdmFTY3JpcHQgbGFuZ3VhZ2VcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jamF2YXNjcmlwdFxuICAgKi9cbiAgcmVhZG9ubHkgamF2YXNjcmlwdD86IEpzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIEpzb24gbGFuZ3VhZ2VcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4janNvblxuICAgKi9cbiAgcmVhZG9ubHkganNvbj86IEpzb25Db25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciB0aGUgSnNvbiBsYW5ndWFnZVxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IE92ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgYWRkaXRpb25hbCBwbHVnaW5zXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI3BsdWdpbnNcbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbnM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnT3ZlcnJpZGVQYXR0ZXJuJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fT3ZlcnJpZGVQYXR0ZXJuKG9iajogT3ZlcnJpZGVQYXR0ZXJuIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXNzaXN0JzogdG9Kc29uX092ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbihvYmouYXNzaXN0KSxcbiAgICAnY3NzJzogdG9Kc29uX0Nzc0NvbmZpZ3VyYXRpb24ob2JqLmNzcyksXG4gICAgJ2ZpbGVzJzogdG9Kc29uX092ZXJyaWRlRmlsZXNDb25maWd1cmF0aW9uKG9iai5maWxlcyksXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9PdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2dyYXBocWwnOiB0b0pzb25fR3JhcGhxbENvbmZpZ3VyYXRpb24ob2JqLmdyYXBocWwpLFxuICAgICdncml0JzogdG9Kc29uX0dyaXRDb25maWd1cmF0aW9uKG9iai5ncml0KSxcbiAgICAnaHRtbCc6IHRvSnNvbl9IdG1sQ29uZmlndXJhdGlvbihvYmouaHRtbCksXG4gICAgJ2luY2x1ZGVzJzogb2JqLmluY2x1ZGVzPy5tYXAoeSA9PiB5KSxcbiAgICAnamF2YXNjcmlwdCc6IHRvSnNvbl9Kc0NvbmZpZ3VyYXRpb24ob2JqLmphdmFzY3JpcHQpLFxuICAgICdqc29uJzogdG9Kc29uX0pzb25Db25maWd1cmF0aW9uKG9iai5qc29uKSxcbiAgICAnbGludGVyJzogdG9Kc29uX092ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbihvYmoubGludGVyKSxcbiAgICAncGx1Z2lucyc6IG9iai5wbHVnaW5zPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNldHRpbmdzIGZvciBpbnRlZ3JhdGluZyBCaW9tZSB3aXRoIHZlcnNpb24gY29udHJvbC5cbiAqXG4gKiBAc2NoZW1hIFZjc0NvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWY3NDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIGNvbnRyb2wgY2xpZW50LlxuICAgKlxuICAgKiBAc2NoZW1hIFZjc0NvbmZpZ3VyYXRpb24jY2xpZW50S2luZFxuICAgKi9cbiAgcmVhZG9ubHkgY2xpZW50S2luZD86IFZjc0NsaWVudEtpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0J3MgZGVmYXVsdCBicmFuY2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmNzQ29uZmlndXJhdGlvbiNkZWZhdWx0QnJhbmNoXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QnJhbmNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIEJpb21lIHNob3VsZCBpbnRlZ3JhdGUgd2l0aCB0aGUgdmVyc2lvbiBjb250cm9sIGNsaWVudC5cbiAgICpcbiAgICogQHNjaGVtYSBWY3NDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgQmlvbWUgY2hlY2tzIGZvciB2ZXJzaW9uIGNvbnRyb2wgZmlsZXMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBgYmlvbWUuanNvbmAgb3IgYGJpb21lLmpzb25jYC4gSWYgbm8gY29uZmlndXJhdGlvbiBpc1xuICAgKiBmb3VuZCwgQmlvbWUgdXNlcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICpcbiAgICogSWYgbmVpdGhlciBkaXJlY3RvcnkgaXMgYXZhaWxhYmxlLCBCaW9tZSBkaXNhYmxlcyB2ZXJzaW9uIGNvbnRyb2wgaW50ZWdyYXRpb24gYW5kIGVtaXRzIGFcbiAgICogZGlhZ25vc3RpYy5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGBiaW9tZS5qc29uYCBvciBgYmlvbWUuanNvbmNgLiBJZiBubyBjb25maWd1cmF0aW9uIGlzXG4gICAqIEBzY2hlbWEgVmNzQ29uZmlndXJhdGlvbiNyb290XG4gICAqL1xuICByZWFkb25seSByb290Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgQmlvbWUgaWdub3JlcyBmaWxlcyBsaXN0ZWQgaW4gYC5naXRpZ25vcmVgLCBgLmlnbm9yZWAsIGFuZCBHaXQncyBsb2NhbFxuICAgKiBleGNsdWRlIGZpbGUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmNzQ29uZmlndXJhdGlvbiN1c2VJZ25vcmVGaWxlXG4gICAqL1xuICByZWFkb25seSB1c2VJZ25vcmVGaWxlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmNzQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1Zjc0NvbmZpZ3VyYXRpb24ob2JqOiBWY3NDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xpZW50S2luZCc6IG9iai5jbGllbnRLaW5kLFxuICAgICdkZWZhdWx0QnJhbmNoJzogb2JqLmRlZmF1bHRCcmFuY2gsXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncm9vdCc6IG9iai5yb290LFxuICAgICd1c2VJZ25vcmVGaWxlJzogb2JqLnVzZUlnbm9yZUZpbGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIEFjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhY3Rpb25zIHByZXNldCB0byB1c2UuXG4gICAqXG4gICAqIEBzY2hlbWEgQWN0aW9ucyNwcmVzZXRcbiAgICovXG4gIHJlYWRvbmx5IHByZXNldD86IFByZXNldENvbmZpZztcblxuICAvKipcbiAgICogSXQgZW5hYmxlcyB0aGUgYXNzaXN0IGFjdGlvbnMgcmVjb21tZW5kZWQgYnkgQmlvbWUuIGB0cnVlYCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBAc2NoZW1hIEFjdGlvbnMjcmVjb21tZW5kZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlY29tbWVuZGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBBY3Rpb25zI3NvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlPzogU291cmNlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdBY3Rpb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQWN0aW9ucyhvYmo6IEFjdGlvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwcmVzZXQnOiBvYmoucHJlc2V0LFxuICAgICdyZWNvbW1lbmRlZCc6IG9iai5yZWNvbW1lbmRlZCxcbiAgICAnc291cmNlJzogdG9Kc29uX1NvdXJjZShvYmouc291cmNlKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IENTUyBhc3Npc3QgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIENzc0Fzc2lzdENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDc3NBc3Npc3RDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIGFzc2lzdCBhY3Rpb25zIGZvciBDU1MgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQXNzaXN0Q29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ3NzQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Nzc0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBDc3NBc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIENTUyBmb3JtYXR0ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIENzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHNwYWNlcyBpbnNpZGUgQ1NTIHBhcmVudGhlc2VzIGFuZCBzcXVhcmUgYnJhY2tldHMgd2hlbiB0aGVpciBjb250ZW50IGZpdHMgb24gb25lXG4gICAqIGxpbmUuIFdoZW4gZW5hYmxlZCwgYHJnYigwLCAwLCAwKWAgYmVjb21lcyBgcmdiKCAwLCAwLCAwIClgIGFuZCBgW2RhdGEtYXR0cl1gIGJlY29tZXNcbiAgICogYFsgZGF0YS1hdHRyIF1gLiBFbXB0eSBkZWxpbWl0ZXJzIGFyZSB1bmNoYW5nZWQuXG4gICAqXG4gICAqIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGRlbGltaXRlciBzcGFjaW5nIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNkZWxpbWl0ZXJTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBkZWxpbWl0ZXJTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgdGhlIGZvcm1hdHRlciBmb3IgQ1NTIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGluZGVudCBzdHlsZSBhcHBsaWVkIHRvIENTUyBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBpbmRlbnRhdGlvbiBzdHlsZS5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGggYXBwbGllZCB0byBDU1MgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZVxuICAgKiBnbG9iYWwgaW5kZW50YXRpb24gd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGVuZGluZyBhcHBsaWVkIHRvIENTUyBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBsaW5lIHdpZHRoIGZvciBDU1MgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogbGluZSB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBxdW90ZXMgdXNlZCBpbiBDU1MgY29kZS4gRGVmYXVsdHMgdG8gYGRvdWJsZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRvdWJsZWAuXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNxdW90ZVN0eWxlXG4gICAqL1xuICByZWFkb25seSBxdW90ZVN0eWxlPzogUXVvdGVTdHlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIHRyYWlsaW5nIG5ld2xpbmUgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Nzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqOiBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGVsaW1pdGVyU3BhY2luZyc6IG9iai5kZWxpbWl0ZXJTcGFjaW5nLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2luZGVudFN0eWxlJzogb2JqLmluZGVudFN0eWxlLFxuICAgICdpbmRlbnRXaWR0aCc6IG9iai5pbmRlbnRXaWR0aCxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICdxdW90ZVN0eWxlJzogb2JqLnF1b3RlU3R5bGUsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgQ1NTIGxpbnRlciBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgQ3NzTGludGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENzc0xpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ29udHJvbHMgdGhlIGxpbnRlciBmb3IgQ1NTIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0xpbnRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Nzc0xpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Dc3NMaW50ZXJDb25maWd1cmF0aW9uKG9iajogQ3NzTGludGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBDU1MgcGFyc2VyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBDc3NQYXJzZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3NzUGFyc2VyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBBbGxvd3MgY29tbWVudHMgdG8gYXBwZWFyIG9uIGluY29ycmVjdCBsaW5lcyBpbiBgLmNzc2AgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzUGFyc2VyQ29uZmlndXJhdGlvbiNhbGxvd1dyb25nTGluZUNvbW1lbnRzXG4gICAqL1xuICByZWFkb25seSBhbGxvd1dyb25nTGluZUNvbW1lbnRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBwYXJzaW5nIG9mIENTUyBNb2R1bGVzLXNwZWNpZmljIGZlYXR1cmVzLiBFbmFibGUgdGhpcyBmZWF0dXJlIG9ubHlcbiAgICogd2hlbiB5b3VyIGZpbGVzIGRvbid0IGVuZCBpbiBgLm1vZHVsZS5jc3NgLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc1BhcnNlckNvbmZpZ3VyYXRpb24jY3NzTW9kdWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgY3NzTW9kdWxlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgcGFyc2luZyBvZiBUYWlsd2luZCBDU1MgNC4wIGRpcmVjdGl2ZXMgYW5kIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NQYXJzZXJDb25maWd1cmF0aW9uI3RhaWx3aW5kRGlyZWN0aXZlc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFpbHdpbmREaXJlY3RpdmVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ3NzUGFyc2VyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Nzc1BhcnNlckNvbmZpZ3VyYXRpb24ob2JqOiBDc3NQYXJzZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWxsb3dXcm9uZ0xpbmVDb21tZW50cyc6IG9iai5hbGxvd1dyb25nTGluZUNvbW1lbnRzLFxuICAgICdjc3NNb2R1bGVzJzogb2JqLmNzc01vZHVsZXMsXG4gICAgJ3RhaWx3aW5kRGlyZWN0aXZlcyc6IG9iai50YWlsd2luZERpcmVjdGl2ZXMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIEF0dHJpYnV0ZVBvc2l0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIEF0dHJpYnV0ZVBvc2l0aW9uIHtcbiAgLyoqIGF1dG8gKi9cbiAgQVVUTyA9IFwiYXV0b1wiLFxuICAvKiogbXVsdGlsaW5lICovXG4gIE1VTFRJTElORSA9IFwibXVsdGlsaW5lXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBFeHBhbmRcbiAqL1xuZXhwb3J0IGVudW0gRXhwYW5kIHtcbiAgLyoqIE9iamVjdHMgYXJlIGV4cGFuZGVkIHdoZW4gdGhlIGZpcnN0IHByb3BlcnR5IGhhcyBhIGxlYWRpbmcgbmV3bGluZS4gQXJyYXlzIHJlbWFpbiBvbiBvbmVcbmxpbmUgaWYgdGhleSBmaXQuIChhdXRvKSAqL1xuICBBVVRPID0gXCJhdXRvXCIsXG4gIC8qKiBPYmplY3RzIGFuZCBhcnJheXMgYXJlIGFsd2F5cyBleHBhbmRlZC4gKGFsd2F5cykgKi9cbiAgQUxXQVlTID0gXCJhbHdheXNcIixcbiAgLyoqIE9iamVjdHMgYW5kIGFycmF5cyByZW1haW4gb24gb25lIGxpbmUgaWYgdGhleSBmaXQuIChuZXZlcikgKi9cbiAgTkVWRVIgPSBcIm5ldmVyXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBJbmRlbnRTdHlsZVxuICovXG5leHBvcnQgZW51bSBJbmRlbnRTdHlsZSB7XG4gIC8qKiBJbmRlbnQgd2l0aCBUYWIgKHRhYikgKi9cbiAgVEFCID0gXCJ0YWJcIixcbiAgLyoqIEluZGVudCB3aXRoIFNwYWNlIChzcGFjZSkgKi9cbiAgU1BBQ0UgPSBcInNwYWNlXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBMaW5lRW5kaW5nXG4gKi9cbmV4cG9ydCBlbnVtIExpbmVFbmRpbmcge1xuICAvKiogTGluZSBGZWVkIG9ubHkgKFxcbiksIGNvbW1vbiBvbiBMaW51eCBhbmQgbWFjT1MgYXMgd2VsbCBhcyBpbnNpZGUgZ2l0IHJlcG9zIChsZikgKi9cbiAgTEYgPSBcImxmXCIsXG4gIC8qKiBDYXJyaWFnZSBSZXR1cm4gKyBMaW5lIEZlZWQgY2hhcmFjdGVycyAoXFxyXFxuKSwgY29tbW9uIG9uIFdpbmRvd3MgKGNybGYpICovXG4gIENSTEYgPSBcImNybGZcIixcbiAgLyoqIENhcnJpYWdlIFJldHVybiBjaGFyYWN0ZXIgb25seSAoXFxyKSwgdXNlZCB2ZXJ5IHJhcmVseSAoY3IpICovXG4gIENSID0gXCJjclwiLFxuICAvKiogQXV0b21hdGljYWxseSB1c2UgQ1JMRiBvbiBXaW5kb3dzIGFuZCBMRiBvbiBvdGhlciBwbGF0Zm9ybXMgKGF1dG8pICovXG4gIEFVVE8gPSBcImF1dG9cIixcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyBHcmFwaFFMIGFzc2lzdCBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgR3JhcGhxbEFzc2lzdENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmFwaHFsQXNzaXN0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb250cm9scyBhc3Npc3QgYWN0aW9ucyBmb3IgR3JhcGhRTCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsQXNzaXN0Q29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnR3JhcGhxbEFzc2lzdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9HcmFwaHFsQXNzaXN0Q29uZmlndXJhdGlvbihvYmo6IEdyYXBocWxBc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEdyYXBoUUwgZm9ybWF0dGVyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5zZXJ0IHNwYWNlcyBpbnNpZGUgYnJhY2VzIGluIG9iamVjdCBsaXRlcmFscy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogYnJhY2tldCBzcGFjaW5nIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNwYWNpbmdcbiAgICovXG4gIHJlYWRvbmx5IGJyYWNrZXRTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgdGhlIGZvcm1hdHRlciBmb3IgR3JhcGhRTCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGluZGVudCBzdHlsZSBhcHBsaWVkIHRvIEdyYXBoUUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGluZGVudGF0aW9uIHN0eWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGggYXBwbGllZCB0byBHcmFwaFFMIGZpbGVzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBpbmRlbnRhdGlvblxuICAgKiB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGVuZGluZyBhcHBsaWVkIHRvIEdyYXBoUUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGxpbmUgZW5kaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBsaW5lIHdpZHRoIGZvciBHcmFwaFFMIGZpbGVzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBsaW5lIHdpZHRoLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBxdW90ZXMgdXNlZCBpbiBHcmFwaFFMIGNvZGUuIERlZmF1bHRzIHRvIGBkb3VibGVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkb3VibGVgLlxuICAgKiBAc2NoZW1hIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3F1b3RlU3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IHF1b3RlU3R5bGU/OiBRdW90ZVN0eWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFkZCBhIHRyYWlsaW5nIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogdHJhaWxpbmcgbmV3bGluZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9HcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmo6IEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnJhY2tldFNwYWNpbmcnOiBvYmouYnJhY2tldFNwYWNpbmcsXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW5kZW50U3R5bGUnOiBvYmouaW5kZW50U3R5bGUsXG4gICAgJ2luZGVudFdpZHRoJzogb2JqLmluZGVudFdpZHRoLFxuICAgICdsaW5lRW5kaW5nJzogb2JqLmxpbmVFbmRpbmcsXG4gICAgJ2xpbmVXaWR0aCc6IG9iai5saW5lV2lkdGgsXG4gICAgJ3F1b3RlU3R5bGUnOiBvYmoucXVvdGVTdHlsZSxcbiAgICAndHJhaWxpbmdOZXdsaW5lJzogb2JqLnRyYWlsaW5nTmV3bGluZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBHcmFwaFFMIGxpbnRlciBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgR3JhcGhxbExpbnRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmFwaHFsTGludGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgbGludGVyIGZvciBHcmFwaFFMIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcmFwaHFsTGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uKG9iajogR3JhcGhxbExpbnRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyBHcml0UUwgYXNzaXN0IGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBHcml0QXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyaXRBc3Npc3RDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIGFzc2lzdCBhY3Rpb25zIGZvciBHcml0UUwgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEFzc2lzdENvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0dyaXRBc3Npc3RDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fR3JpdEFzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBHcml0QXNzaXN0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBHcml0UUwgZm9ybWF0dGVyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSBmb3JtYXR0ZXIgZm9yIEdyaXRRTCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGluZGVudCBzdHlsZSBhcHBsaWVkIHRvIEdyaXRRTCBmaWxlcy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgaW5kZW50YXRpb24gc3R5bGUuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50U3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFN0eWxlPzogSW5kZW50U3R5bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnRhdGlvbiB3aWR0aCBhcHBsaWVkIHRvIEdyaXRRTCBmaWxlcy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgaW5kZW50YXRpb25cbiAgICogd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50V2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBlbmRpbmcgYXBwbGllZCB0byBHcml0UUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGxpbmUgZW5kaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBsaW5lIHdpZHRoIGZvciBHcml0UUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGxpbmUgd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiB0cmFpbGluZyBuZXdsaW5lIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jdHJhaWxpbmdOZXdsaW5lXG4gICAqL1xuICByZWFkb25seSB0cmFpbGluZ05ld2xpbmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2luZGVudFN0eWxlJzogb2JqLmluZGVudFN0eWxlLFxuICAgICdpbmRlbnRXaWR0aCc6IG9iai5pbmRlbnRXaWR0aCxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICd0cmFpbGluZ05ld2xpbmUnOiBvYmoudHJhaWxpbmdOZXdsaW5lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEdyaXRRTCBsaW50ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEdyaXRMaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JpdExpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ29udHJvbHMgdGhlIGxpbnRlciBmb3IgR3JpdFFMIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyaXRMaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcml0TGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyaXRMaW50ZXJDb25maWd1cmF0aW9uKG9iajogR3JpdExpbnRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyBIVE1MIGFzc2lzdCBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgSHRtbEFzc2lzdENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdG1sQXNzaXN0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb250cm9scyBhc3Npc3QgYWN0aW9ucyBmb3IgSFRNTCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxBc3Npc3RDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdIdG1sQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0h0bWxBc3Npc3RDb25maWd1cmF0aW9uKG9iajogSHRtbEFzc2lzdENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgSFRNTCBmb3JtYXR0ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGF0dHJpYnV0ZSBwb3NpdGlvbiBzdHlsZSBpbiBIVE1MIGVsZW1lbnRzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBhdHRyaWJ1dGVcbiAgICogcG9zaXRpb24gc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNhdHRyaWJ1dGVQb3NpdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXR0cmlidXRlUG9zaXRpb24/OiBBdHRyaWJ1dGVQb3NpdGlvbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwbGFjZSB0aGUgY2xvc2luZyBicmFja2V0IG9mIGEgbXVsdGlsaW5lIEhUTUwgdGFnIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgbGluZVxuICAgKiBpbnN0ZWFkIG9mIG9uIGl0cyBvd24gbGluZS4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgYGJyYWNrZXRTYW1lTGluZWAgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNicmFja2V0U2FtZUxpbmVcbiAgICovXG4gIHJlYWRvbmx5IGJyYWNrZXRTYW1lTGluZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSBmb3JtYXR0ZXIgZm9yIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmRlbnQgYDxzY3JpcHQ+YCBhbmQgYDxzdHlsZT5gIHRhZ3MgaW4gSFRNTCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50U2NyaXB0QW5kU3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFNjcmlwdEFuZFN0eWxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGluZGVudCBzdHlsZSBhcHBsaWVkIHRvIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogaW5kZW50YXRpb24gc3R5bGUuXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50U3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFN0eWxlPzogSW5kZW50U3R5bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnRhdGlvbiB3aWR0aCBhcHBsaWVkIHRvIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZVxuICAgKiBnbG9iYWwgaW5kZW50YXRpb24gd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50V2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBlbmRpbmcgYXBwbGllZCB0byBIVE1MIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIGxpbmUgZW5kaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBsaW5lIHdpZHRoIGZvciBIVE1MIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIGxpbmUgd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgdm9pZCBlbGVtZW50cyBhcmUgc2VsZi1jbG9zZWQuIERlZmF1bHRzIHRvIGBuZXZlcmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IG5ldmVyYC5cbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNzZWxmQ2xvc2VWb2lkRWxlbWVudHNcbiAgICovXG4gIHJlYWRvbmx5IHNlbGZDbG9zZVZvaWRFbGVtZW50cz86IFNlbGZDbG9zZVZvaWRFbGVtZW50cztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIFVubGlrZSBvdGhlciBsYW5ndWFnZS1zcGVjaWZpY1xuICAgKiB0cmFpbGluZyBuZXdsaW5lIHNldHRpbmdzLCB0aGlzIG9wdGlvbiBkZWZhdWx0cyB0byBgdHJ1ZWAgaW5zdGVhZCBvZiBpbmhlcml0aW5nIHRoZSBnbG9iYWxcbiAgICogc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWNjb3VudCBmb3Igd2hpdGVzcGFjZSBzZW5zaXRpdml0eSB3aGVuIGZvcm1hdHRpbmcgSFRNTCBhbmQgbGFuZ3VhZ2VzIHRoYXRcbiAgICogZXh0ZW5kIGl0LiBEZWZhdWx0cyB0byBgY3NzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgY3NzYC5cbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN3aGl0ZXNwYWNlU2Vuc2l0aXZpdHlcbiAgICovXG4gIHJlYWRvbmx5IHdoaXRlc3BhY2VTZW5zaXRpdml0eT86IFdoaXRlc3BhY2VTZW5zaXRpdml0eTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9IdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmo6IEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXR0cmlidXRlUG9zaXRpb24nOiBvYmouYXR0cmlidXRlUG9zaXRpb24sXG4gICAgJ2JyYWNrZXRTYW1lTGluZSc6IG9iai5icmFja2V0U2FtZUxpbmUsXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW5kZW50U2NyaXB0QW5kU3R5bGUnOiBvYmouaW5kZW50U2NyaXB0QW5kU3R5bGUsXG4gICAgJ2luZGVudFN0eWxlJzogb2JqLmluZGVudFN0eWxlLFxuICAgICdpbmRlbnRXaWR0aCc6IG9iai5pbmRlbnRXaWR0aCxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICdzZWxmQ2xvc2VWb2lkRWxlbWVudHMnOiBvYmouc2VsZkNsb3NlVm9pZEVsZW1lbnRzLFxuICAgICd0cmFpbGluZ05ld2xpbmUnOiBvYmoudHJhaWxpbmdOZXdsaW5lLFxuICAgICd3aGl0ZXNwYWNlU2Vuc2l0aXZpdHknOiBvYmoud2hpdGVzcGFjZVNlbnNpdGl2aXR5LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEhUTUwgbGludGVyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBIdG1sTGludGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0bWxMaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSBsaW50ZXIgZm9yIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sTGludGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSHRtbExpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9IdG1sTGludGVyQ29uZmlndXJhdGlvbihvYmo6IEh0bWxMaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEhUTUwgcGFyc2VyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBIdG1sUGFyc2VyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0bWxQYXJzZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcGFyc2luZyBkb3VibGUgdGV4dCBleHByZXNzaW9ucyBzdWNoIGFzIGB7eyBleHByZXNzaW9uIH19YCBpbnNpZGUgYC5odG1sYCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sUGFyc2VyQ29uZmlndXJhdGlvbiNpbnRlcnBvbGF0aW9uXG4gICAqL1xuICByZWFkb25seSBpbnRlcnBvbGF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBwYXJzaW5nIFZ1ZSBzeW50YXggKGB2LWlmYCwgYHYtYmluZGAsIGV0Yy4pIGluIGAuaHRtbGAgZmlsZXMuIEVuYWJsaW5nIHRoaXMgb3B0aW9uXG4gICAqIGFsc28gZW5hYmxlcyBgaW50ZXJwb2xhdGlvbmAgaW1wbGljaXRseS5cbiAgICpcbiAgICogQmlvbWUgd2lsbCBhbHJlYWR5IGF1dG9tYXRpY2FsbHkgZW5hYmxlIFZ1ZSBwYXJzaW5nIGluIGAudnVlYCBmaWxlcywgc28geW91IHByb2JhYmx5IGRvbid0IG5lZWRcbiAgICogdG8gZW5hYmxlIHRoaXMgb3B0aW9uLiBUaGlzIG9ubHkgYWZmZWN0cyBgLmh0bWxgIGZpbGVzLCBhbmQgZG9lcyBub3QgY2hhbmdlIGhvdyBgLnZ1ZWAsIGAuc3ZlbHRlYCxcbiAgICogb3IgYC5hc3Ryb2AgZmlsZXMgYXJlIHBhcnNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sUGFyc2VyQ29uZmlndXJhdGlvbiN2dWVcbiAgICovXG4gIHJlYWRvbmx5IHZ1ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0h0bWxQYXJzZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSHRtbFBhcnNlckNvbmZpZ3VyYXRpb24ob2JqOiBIdG1sUGFyc2VyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2ludGVycG9sYXRpb24nOiBvYmouaW50ZXJwb2xhdGlvbixcbiAgICAndnVlJzogb2JqLnZ1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEFzc2lzdCBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSBKYXZhU2NyaXB0IGFzc2lzdFxuICpcbiAqIEBzY2hlbWEgSnNBc3Npc3RDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNBc3Npc3RDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIGFzc2lzdCBhY3Rpb25zIGZvciBKYXZhU2NyaXB0IGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNBc3Npc3RDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc0Fzc2lzdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBKc0Fzc2lzdENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBGb3JtYXR0aW5nIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEphdmFTY3JpcHQgZmlsZXNcbiAqXG4gKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFkZCBwYXJlbnRoZXNlcyBhcm91bmQgYXJyb3cgZnVuY3Rpb24gcGFyYW1ldGVycy4gRGVmYXVsdHMgdG8gYGFsd2F5c2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFsd2F5c2AuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2Fycm93UGFyZW50aGVzZXNcbiAgICovXG4gIHJlYWRvbmx5IGFycm93UGFyZW50aGVzZXM/OiBBcnJvd1BhcmVudGhlc2VzO1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlIHBvc2l0aW9uIHN0eWxlIGluIEpTWCBlbGVtZW50cy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgYXR0cmlidXRlXG4gICAqIHBvc2l0aW9uIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2F0dHJpYnV0ZVBvc2l0aW9uXG4gICAqL1xuICByZWFkb25seSBhdHRyaWJ1dGVQb3NpdGlvbj86IEF0dHJpYnV0ZVBvc2l0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGh1ZyB0aGUgY2xvc2luZyBicmFja2V0IG9mIG11bHRpbGluZSBIVE1ML0pTWCB0YWdzIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QgbGluZSxcbiAgICogcmF0aGVyIHRoYW4gYmVpbmcgYWxvbmUgb24gdGhlIGZvbGxvd2luZyBsaW5lLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBicmFja2V0XG4gICAqIHBsYWNlbWVudCBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNicmFja2V0U2FtZUxpbmVcbiAgICovXG4gIHJlYWRvbmx5IGJyYWNrZXRTYW1lTGluZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5zZXJ0IHNwYWNlcyBpbnNpZGUgYnJhY2VzIGluIG9iamVjdCBsaXRlcmFscy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogYnJhY2tldCBzcGFjaW5nIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHNwYWNlcyBpbW1lZGlhdGVseSBpbnNpZGUgc3VwcG9ydGVkIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZGVsaW1pdGVycyB3aGVuIHRoZWlyXG4gICAqIGNvbnRlbnQgZml0cyBvbiBvbmUgbGluZS4gSXQgZG9lc24ndCBhZGQgc3BhY2VzIGJlZm9yZSBvcGVuaW5nIGRlbGltaXRlcnMgb3IgaW5zaWRlIGVtcHR5XG4gICAqIGRlbGltaXRlcnMuXG4gICAqXG4gICAqIEl0IGFmZmVjdHMgcGFyZW50aGVzZXMsIHNxdWFyZSBicmFja2V0cywgdGVtcGxhdGUgaW50ZXJwb2xhdGlvbnMsIFR5cGVTY3JpcHQgYW5nbGUgYnJhY2tldHMsXG4gICAqIEpTWCBleHByZXNzaW9uIGJyYWNlcywgYW5kIGxvZ2ljYWwgTk9ULiBJbiBvcGVyYXRvciBjaGFpbnMsIG9ubHkgdGhlIGZpbmFsIG9wZXJhdG9yIHJlY2VpdmVzXG4gICAqIGEgZm9sbG93aW5nIHNwYWNlLlxuICAgKlxuICAgKiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBkZWxpbWl0ZXIgc3BhY2luZyBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNkZWxpbWl0ZXJTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBkZWxpbWl0ZXJTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgdGhlIGZvcm1hdHRlciBmb3IgSmF2YVNjcmlwdCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlcyB0aGUgc2FtZSBgYXV0b2AsIGBhbHdheXNgLCBhbmQgYG5ldmVyYCBiZWhhdmlvciBhcyB0aGUgZ2xvYmFsIGV4cGFuc2lvbiBzZXR0aW5nLlxuICAgKlxuICAgKiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBleHBhbnNpb24gc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jZXhwYW5kXG4gICAqL1xuICByZWFkb25seSBleHBhbmQ/OiBFeHBhbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnQgc3R5bGUgYXBwbGllZCB0byBKYXZhU2NyaXB0IGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGVcbiAgICogZ2xvYmFsIGluZGVudGF0aW9uIHN0eWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50U3R5bGU/OiBJbmRlbnRTdHlsZTtcblxuICAvKipcbiAgICogVGhlIGluZGVudGF0aW9uIHdpZHRoIGFwcGxpZWQgdG8gSmF2YVNjcmlwdCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCxcbiAgICogaW5oZXJpdHMgdGhlIGdsb2JhbCBpbmRlbnRhdGlvbiB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50V2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBxdW90ZXMgdXNlZCBpbiBKU1guIERlZmF1bHRzIHRvIGBkb3VibGVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkb3VibGVgLlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNqc3hRdW90ZVN0eWxlXG4gICAqL1xuICByZWFkb25seSBqc3hRdW90ZVN0eWxlPzogUXVvdGVTdHlsZTtcblxuICAvKipcbiAgICogVGhlIGxpbmUgZW5kaW5nIGFwcGxpZWQgdG8gSmF2YVNjcmlwdCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlXG4gICAqIGdsb2JhbCBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZUVuZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGluZUVuZGluZz86IExpbmVFbmRpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGxpbmUgd2lkdGggYXBwbGllZCB0byBKYXZhU2NyaXB0IGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LFxuICAgKiBpbmhlcml0cyB0aGUgZ2xvYmFsIGxpbmUgd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIGJyZWFraW5nIGJpbmFyeSBleHByZXNzaW9ucyBpbnRvIG11bHRpcGxlIGxpbmVzLCB3aGV0aGVyIHRvIGJyZWFrIHRoZW0gYmVmb3JlIG9yIGFmdGVyXG4gICAqIHRoZSBiaW5hcnkgb3BlcmF0b3IuIERlZmF1bHRzIHRvIGBhZnRlcmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFmdGVyYC5cbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jb3BlcmF0b3JMaW5lYnJlYWtcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yTGluZWJyZWFrPzogT3BlcmF0b3JMaW5lYnJlYWs7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZW4gb2JqZWN0IHByb3BlcnRpZXMgYXJlIHF1b3RlZC4gRGVmYXVsdHMgdG8gYGFzTmVlZGVkYCBpbiBjb25maWd1cmF0aW9uXG4gICAqIChgYXMtbmVlZGVkYCBvbiB0aGUgQ0xJKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYXNOZWVkZWRgIGluIGNvbmZpZ3VyYXRpb25cbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jcXVvdGVQcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBxdW90ZVByb3BlcnRpZXM/OiBRdW90ZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHF1b3RlcyB1c2VkIGluIEphdmFTY3JpcHQgY29kZS4gRGVmYXVsdHMgdG8gYGRvdWJsZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRvdWJsZWAuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3F1b3RlU3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IHF1b3RlU3R5bGU/OiBRdW90ZVN0eWxlO1xuXG4gIC8qKlxuICAgKiBQcmludHMgc2VtaWNvbG9ucyBhZnRlciBldmVyeSBzdGF0ZW1lbnQgb3Igb25seSB3aGVyZSBuZWVkZWQgdG8gYXZvaWQgYXV0b21hdGljIHNlbWljb2xvblxuICAgKiBpbnNlcnRpb24gaGF6YXJkcy4gRGVmYXVsdHMgdG8gYGFsd2F5c2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFsd2F5c2AuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3NlbWljb2xvbnNcbiAgICovXG4gIHJlYWRvbmx5IHNlbWljb2xvbnM/OiBTZW1pY29sb25zO1xuXG4gIC8qKlxuICAgKiBQcmludHMgdHJhaWxpbmcgY29tbWFzIHdoZXJldmVyIHBvc3NpYmxlIGluIG11bHRpbGluZSBjb21tYS1zZXBhcmF0ZWQgc3RydWN0dXJlcy4gRGVmYXVsdHNcbiAgICogdG8gYGFsbGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFsbGAuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nQ29tbWFzXG4gICAqL1xuICByZWFkb25seSB0cmFpbGluZ0NvbW1hcz86IEpzVHJhaWxpbmdDb21tYXM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiB0cmFpbGluZyBuZXdsaW5lIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXJyb3dQYXJlbnRoZXNlcyc6IG9iai5hcnJvd1BhcmVudGhlc2VzLFxuICAgICdhdHRyaWJ1dGVQb3NpdGlvbic6IG9iai5hdHRyaWJ1dGVQb3NpdGlvbixcbiAgICAnYnJhY2tldFNhbWVMaW5lJzogb2JqLmJyYWNrZXRTYW1lTGluZSxcbiAgICAnYnJhY2tldFNwYWNpbmcnOiBvYmouYnJhY2tldFNwYWNpbmcsXG4gICAgJ2RlbGltaXRlclNwYWNpbmcnOiBvYmouZGVsaW1pdGVyU3BhY2luZyxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdleHBhbmQnOiBvYmouZXhwYW5kLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2pzeFF1b3RlU3R5bGUnOiBvYmouanN4UXVvdGVTdHlsZSxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICdvcGVyYXRvckxpbmVicmVhayc6IG9iai5vcGVyYXRvckxpbmVicmVhayxcbiAgICAncXVvdGVQcm9wZXJ0aWVzJzogb2JqLnF1b3RlUHJvcGVydGllcyxcbiAgICAncXVvdGVTdHlsZSc6IG9iai5xdW90ZVN0eWxlLFxuICAgICdzZW1pY29sb25zJzogb2JqLnNlbWljb2xvbnMsXG4gICAgJ3RyYWlsaW5nQ29tbWFzJzogb2JqLnRyYWlsaW5nQ29tbWFzLFxuICAgICd0cmFpbGluZ05ld2xpbmUnOiBvYmoudHJhaWxpbmdOZXdsaW5lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIHJ1bnRpbWUgb3IgdHJhbnNmb3JtYXRpb24gdXNlZCBmb3IgaW50ZXJwcmV0aW5nIEpTWC5cbiAqXG4gKiBAc2NoZW1hIEpzeFJ1bnRpbWVcbiAqL1xuZXhwb3J0IGVudW0gSnN4UnVudGltZSB7XG4gIC8qKiBJbmRpY2F0ZXMgYSBtb2Rlcm4gb3IgbmF0aXZlIEpTWCBlbnZpcm9ubWVudCwgdGhhdCBkb2Vzbid0IHJlcXVpcmVcbnNwZWNpYWwgaGFuZGxpbmcgYnkgQmlvbWUuICh0cmFuc3BhcmVudCkgKi9cbiAgVFJBTlNQQVJFTlQgPSBcInRyYW5zcGFyZW50XCIsXG4gIC8qKiBJbmRpY2F0ZXMgYSBjbGFzc2ljIFJlYWN0IGVudmlyb25tZW50IHRoYXQgcmVxdWlyZXMgdGhlIGBSZWFjdGAgaW1wb3J0LlxuXG5Db3JyZXNwb25kcyB0byB0aGUgYHJlYWN0YCB2YWx1ZSBmb3IgdGhlIGBqc3hgIG9wdGlvbiBpbiBUeXBlU2NyaXB0J3NcbmB0c2NvbmZpZy5qc29uYC5cblxuVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGlmIHlvdSBjYW5ub3QgdXBncmFkZSB0byBhIFJlYWN0XG52ZXJzaW9uIHRoYXQgc3VwcG9ydHMgdGhlIG5ldyBKU1ggcnVudGltZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXRcbnRoZSBvbGQgdnMuIG5ldyBKU1ggcnVudGltZSwgcGxlYXNlIHNlZTpcbjxodHRwczovL2xlZ2FjeS5yZWFjdGpzLm9yZy9ibG9nLzIwMjAvMDkvMjIvaW50cm9kdWNpbmctdGhlLW5ldy1qc3gtdHJhbnNmb3JtLmh0bWw+IChyZWFjdENsYXNzaWMpICovXG4gIFJFQUNUX0NMQVNTSUMgPSBcInJlYWN0Q2xhc3NpY1wiLFxufVxuXG4vKipcbiAqIExpbnRlciBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSBKYXZhU2NyaXB0IGxpbnRlclxuICpcbiAqIEBzY2hlbWEgSnNMaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNMaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSBsaW50ZXIgZm9yIEphdmFTY3JpcHQgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBKc0xpbnRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzTGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzTGludGVyQ29uZmlndXJhdGlvbihvYmo6IEpzTGludGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBKYXZhU2NyaXB0IHBhcnNlciBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgSnNQYXJzZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNQYXJzZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcGFyc2luZyBvZiBHcml0IG1ldGF2YXJpYWJsZXMuXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBKc1BhcnNlckNvbmZpZ3VyYXRpb24jZ3JpdE1ldGF2YXJpYWJsZXNcbiAgICovXG4gIHJlYWRvbmx5IGdyaXRNZXRhdmFyaWFibGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBlbmFibGVkLCBmaWxlcyBzdWNoIGFzIGAuanNgLCBgLm1qc2AsIGFuZCBgLmNqc2AgbWF5IGNvbnRhaW4gSlNYIHN5bnRheC4gRGVmYXVsdHMgdG9cbiAgICogYHRydWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBKc1BhcnNlckNvbmZpZ3VyYXRpb24janN4RXZlcnl3aGVyZVxuICAgKi9cbiAgcmVhZG9ubHkganN4RXZlcnl3aGVyZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEl0IGVuYWJsZXMgdGhlIGV4cGVyaW1lbnRhbCBhbmQgdW5zYWZlIHBhcnNpbmcgb2YgcGFyYW1ldGVyIGRlY29yYXRvcnNcbiAgICpcbiAgICogVGhlc2UgZGVjb3JhdG9ycyBiZWxvbmcgdG8gYW4gb2xkIHByb3Bvc2FsLCBhbmQgdGhleSBhcmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNQYXJzZXJDb25maWd1cmF0aW9uI3Vuc2FmZVBhcmFtZXRlckRlY29yYXRvcnNFbmFibGVkXG4gICAqL1xuICByZWFkb25seSB1bnNhZmVQYXJhbWV0ZXJEZWNvcmF0b3JzRW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzUGFyc2VyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzUGFyc2VyQ29uZmlndXJhdGlvbihvYmo6IEpzUGFyc2VyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2dyaXRNZXRhdmFyaWFibGVzJzogb2JqLmdyaXRNZXRhdmFyaWFibGVzLFxuICAgICdqc3hFdmVyeXdoZXJlJzogb2JqLmpzeEV2ZXJ5d2hlcmUsXG4gICAgJ3Vuc2FmZVBhcmFtZXRlckRlY29yYXRvcnNFbmFibGVkJzogb2JqLnVuc2FmZVBhcmFtZXRlckRlY29yYXRvcnNFbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogUmVzb2x2ZXIgb3B0aW9ucyBzcGVjaWZpYyB0byBKYXZhU2NyaXB0IGZpbGVzXG4gKlxuICogQHNjaGVtYSBKc1Jlc29sdmVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzUmVzb2x2ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcG5wbSB3b3Jrc3BhY2UgY2F0YWxvZyByZXNvbHV0aW9uIGZvciBKYXZhU2NyaXB0IHBhY2thZ2UgbWFuaWZlc3RzLlxuICAgKlxuICAgKiBPcHQtaW46XG4gICAqIC0gU2V0IGBqYXZhc2NyaXB0LnJlc29sdmVyLmV4cGVyaW1lbnRhbFBucG1DYXRhbG9nc2AgdG8gYHRydWVgLlxuICAgKlxuICAgKiBTY29wZTpcbiAgICogLSBSZXNvbHZlcyBgY2F0YWxvZzpgIGFuZCBgY2F0YWxvZzo8bmFtZT5gIGRlcGVuZGVuY3kgdmVyc2lvbnMgZnJvbVxuICAgKiBgcGFja2FnZS5qc29uYC5cbiAgICogLSBBcHBsaWVzIHRvIGBkZXBlbmRlbmNpZXNgLCBgZGV2RGVwZW5kZW5jaWVzYCwgYW5kIGBwZWVyRGVwZW5kZW5jaWVzYC5cbiAgICpcbiAgICogRmFpbC1zYWZlIGJlaGF2aW9yOlxuICAgKiAtIElmIGBwbnBtLXdvcmtzcGFjZS55YW1sYCBpcyBtaXNzaW5nLCB1bnJlYWRhYmxlLCBvciBjYW5ub3QgYmUgcGFyc2VkLFxuICAgKiBCaW9tZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yIChhcyBpZiB0aGlzIG9wdGlvblxuICAgKiB3ZXJlIGRpc2FibGVkKS5cbiAgICogLSBVbmtub3duIGtleXMgYW5kIHVuc3VwcG9ydGVkIHZhbHVlIHNoYXBlcyBpbiBgcG5wbS13b3Jrc3BhY2UueWFtbGAgYXJlXG4gICAqIGlnbm9yZWQuXG4gICAqXG4gICAqIExpbWl0YXRpb25zOlxuICAgKiAtIE9ubHkgYHBucG0td29ya3NwYWNlLnlhbWxgIGlzIHJlYWQuXG4gICAqIC0gQmlvbWUgb25seSByZWFkcyB0b3AtbGV2ZWwgYGNhdGFsb2dgIC8gYGNhdGFsb2dzYCBtYXBwaW5ncyBhbmQgc2NhbGFyXG4gICAqIHN0cmluZyBlbnRyaWVzLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgSnNSZXNvbHZlckNvbmZpZ3VyYXRpb24jZXhwZXJpbWVudGFsUG5wbUNhdGFsb2dzXG4gICAqL1xuICByZWFkb25seSBleHBlcmltZW50YWxQbnBtQ2F0YWxvZ3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc1Jlc29sdmVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzUmVzb2x2ZXJDb25maWd1cmF0aW9uKG9iajogSnNSZXNvbHZlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdleHBlcmltZW50YWxQbnBtQ2F0YWxvZ3MnOiBvYmouZXhwZXJpbWVudGFsUG5wbUNhdGFsb2dzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQXNzaXN0IG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEpTT04gbGludGVyXG4gKlxuICogQHNjaGVtYSBKc29uQXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Bc3Npc3RDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIGFzc2lzdCBhY3Rpb25zIGZvciBKU09OIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkFzc2lzdENvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzb25Bc3Npc3RDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNvbkFzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBKc29uQXNzaXN0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluc2VydCBzcGFjZXMgaW5zaWRlIGJyYWNlcyBpbiBvYmplY3QgbGl0ZXJhbHMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIGJyYWNrZXQgc3BhY2luZyBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHNwYWNlcyBpbnNpZGUgSlNPTiBzcXVhcmUgYnJhY2tldHMgd2hlbiB0aGVpciBjb250ZW50IGZpdHMgb24gb25lIGxpbmUuIFdoZW5cbiAgICogZW5hYmxlZCwgYFsxLCAyLCAzXWAgYmVjb21lcyBgWyAxLCAyLCAzIF1gLiBFbXB0eSBicmFja2V0cyBhcmUgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBkZWxpbWl0ZXIgc3BhY2luZyBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2RlbGltaXRlclNwYWNpbmdcbiAgICovXG4gIHJlYWRvbmx5IGRlbGltaXRlclNwYWNpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgZm9ybWF0dGVyIGZvciBKU09OIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZXMgdGhlIHNhbWUgYGF1dG9gLCBgYWx3YXlzYCwgYW5kIGBuZXZlcmAgYmVoYXZpb3IgYXMgdGhlIGdsb2JhbCBleHBhbnNpb24gc2V0dGluZy5cbiAgICpcbiAgICogSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgZXhwYW5zaW9uIHNldHRpbmcuXG4gICAqXG4gICAqIFdoZW4gZm9ybWF0dGluZyBgcGFja2FnZS5qc29uYCwgQmlvbWUgdXNlcyBgYWx3YXlzYCB1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZXhwYW5kXG4gICAqL1xuICByZWFkb25seSBleHBhbmQ/OiBFeHBhbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnQgc3R5bGUgYXBwbGllZCB0byBKU09OIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIGluZGVudGF0aW9uIHN0eWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGggYXBwbGllZCB0byBKU09OIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGVcbiAgICogZ2xvYmFsIGluZGVudGF0aW9uIHdpZHRoLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFdpZHRoXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgZW5kaW5nIGFwcGxpZWQgdG8gSlNPTiBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lRW5kaW5nXG4gICAqL1xuICByZWFkb25seSBsaW5lRW5kaW5nPzogTGluZUVuZGluZztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbGluZSB3aWR0aCBhcHBsaWVkIHRvIEpTT04gYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZVxuICAgKiBnbG9iYWwgbGluZSB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lV2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogUHJpbnRzIHRyYWlsaW5nIGNvbW1hcyB3aGVyZXZlciBwb3NzaWJsZSBpbiBtdWx0aWxpbmUgY29tbWEtc2VwYXJhdGVkIHN0cnVjdHVyZXMuIERlZmF1bHRzXG4gICAqIHRvIGBub25lYC5cbiAgICpcbiAgICogQGRlZmF1bHQgbm9uZWAuXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jdHJhaWxpbmdDb21tYXNcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nQ29tbWFzPzogSnNvblRyYWlsaW5nQ29tbWFzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFkZCBhIHRyYWlsaW5nIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogdHJhaWxpbmcgbmV3bGluZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmo6IEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnJhY2tldFNwYWNpbmcnOiBvYmouYnJhY2tldFNwYWNpbmcsXG4gICAgJ2RlbGltaXRlclNwYWNpbmcnOiBvYmouZGVsaW1pdGVyU3BhY2luZyxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdleHBhbmQnOiBvYmouZXhwYW5kLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAndHJhaWxpbmdDb21tYXMnOiBvYmoudHJhaWxpbmdDb21tYXMsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBMaW50ZXIgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgSlNPTiBsaW50ZXJcbiAqXG4gKiBAc2NoZW1hIEpzb25MaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkxpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ29udHJvbHMgdGhlIGxpbnRlciBmb3IgSlNPTiBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25MaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc29uTGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzb25MaW50ZXJDb25maWd1cmF0aW9uKG9iajogSnNvbkxpbnRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgSlNPTiBwYXJzZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEpzb25QYXJzZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvblBhcnNlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQWxsb3dzIHBhcnNpbmcgY29tbWVudHMgaW4gYC5qc29uYCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uUGFyc2VyQ29uZmlndXJhdGlvbiNhbGxvd0NvbW1lbnRzXG4gICAqL1xuICByZWFkb25seSBhbGxvd0NvbW1lbnRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWxsb3dzIHBhcnNpbmcgdHJhaWxpbmcgY29tbWFzIGluIGAuanNvbmAgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvblBhcnNlckNvbmZpZ3VyYXRpb24jYWxsb3dUcmFpbGluZ0NvbW1hc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dUcmFpbGluZ0NvbW1hcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzb25QYXJzZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNvblBhcnNlckNvbmZpZ3VyYXRpb24ob2JqOiBKc29uUGFyc2VyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FsbG93Q29tbWVudHMnOiBvYmouYWxsb3dDb21tZW50cyxcbiAgICAnYWxsb3dUcmFpbGluZ0NvbW1hcyc6IG9iai5hbGxvd1RyYWlsaW5nQ29tbWFzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBSdWxlRG9tYWluVmFsdWVcbiAqL1xuZXhwb3J0IGVudW0gUnVsZURvbWFpblZhbHVlIHtcbiAgLyoqIEVuYWJsZXMgYWxsIHRoZSBydWxlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRvbWFpbiAoYWxsKSAqL1xuICBBTEwgPSBcImFsbFwiLFxuICAvKiogRGlzYWJsZXMgYWxsIHRoZSBydWxlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRvbWFpbiAobm9uZSkgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxuICAvKiogRW5hYmxlcyBvbmx5IHRoZSByZWNvbW1lbmRlZCBydWxlcyBmb3IgdGhpcyBkb21haW4gKHJlY29tbWVuZGVkKSAqL1xuICBSRUNPTU1FTkRFRCA9IFwicmVjb21tZW5kZWRcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIFJ1bGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZXMge1xuICAvKipcbiAgICogQHNjaGVtYSBSdWxlcyNhMTF5XG4gICAqL1xuICByZWFkb25seSBhMTFZPzogYW55O1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVzI2NvbXBsZXhpdHlcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBsZXhpdHk/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZXMjY29ycmVjdG5lc3NcbiAgICovXG4gIHJlYWRvbmx5IGNvcnJlY3RuZXNzPzogYW55O1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVzI251cnNlcnlcbiAgICovXG4gIHJlYWRvbmx5IG51cnNlcnk/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZXMjcGVyZm9ybWFuY2VcbiAgICovXG4gIHJlYWRvbmx5IHBlcmZvcm1hbmNlPzogYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgcnVsZSBwcmVzZXRzIHRvIHVzZS5cbiAgICpcbiAgICogQHNjaGVtYSBSdWxlcyNwcmVzZXRcbiAgICovXG4gIHJlYWRvbmx5IHByZXNldD86IFByZXNldENvbmZpZztcblxuICAvKipcbiAgICogSXQgZW5hYmxlcyB0aGUgbGludCBydWxlcyByZWNvbW1lbmRlZCBieSBCaW9tZS4gYHRydWVgIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBzY2hlbWEgUnVsZXMjcmVjb21tZW5kZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlY29tbWVuZGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlcyNzZWN1cml0eVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHk/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZXMjc3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IHN0eWxlPzogYW55O1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVzI3N1c3BpY2lvdXNcbiAgICovXG4gIHJlYWRvbmx5IHN1c3BpY2lvdXM/OiBhbnk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1J1bGVzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUnVsZXMob2JqOiBSdWxlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2ExMXknOiBvYmouYTExWSxcbiAgICAnY29tcGxleGl0eSc6IG9iai5jb21wbGV4aXR5LFxuICAgICdjb3JyZWN0bmVzcyc6IG9iai5jb3JyZWN0bmVzcyxcbiAgICAnbnVyc2VyeSc6IG9iai5udXJzZXJ5LFxuICAgICdwZXJmb3JtYW5jZSc6IG9iai5wZXJmb3JtYW5jZSxcbiAgICAncHJlc2V0Jzogb2JqLnByZXNldCxcbiAgICAncmVjb21tZW5kZWQnOiBvYmoucmVjb21tZW5kZWQsXG4gICAgJ3NlY3VyaXR5Jzogb2JqLnNlY3VyaXR5LFxuICAgICdzdHlsZSc6IG9iai5zdHlsZSxcbiAgICAnc3VzcGljaW91cyc6IG9iai5zdXNwaWNpb3VzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogTGlzdCBvZiBhY3Rpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVBc3Npc3RDb25maWd1cmF0aW9uI2FjdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbnM/OiBBY3Rpb25zO1xuXG4gIC8qKlxuICAgKiBpZiBgZmFsc2VgLCBpdCBkaXNhYmxlcyB0aGUgZmVhdHVyZSBhbmQgdGhlIGFzc2lzdCB3b24ndCBiZSBleGVjdXRlZC4gYHRydWVgIGJ5IGRlZmF1bHRcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ092ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX092ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbihvYmo6IE92ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FjdGlvbnMnOiB0b0pzb25fQWN0aW9ucyhvYmouYWN0aW9ucyksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgT3ZlcnJpZGVGaWxlc0NvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVycmlkZUZpbGVzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBGaWxlIHNpemUgbGltaXQgaW4gYnl0ZXNcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZpbGVzQ29uZmlndXJhdGlvbiNtYXhTaXplXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdPdmVycmlkZUZpbGVzQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX092ZXJyaWRlRmlsZXNDb25maWd1cmF0aW9uKG9iajogT3ZlcnJpZGVGaWxlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXhTaXplJzogb2JqLm1heFNpemUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlIHBvc2l0aW9uIHN0eWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNhdHRyaWJ1dGVQb3NpdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXR0cmlidXRlUG9zaXRpb24/OiBBdHRyaWJ1dGVQb3NpdGlvbjtcblxuICAvKipcbiAgICogUHV0IHRoZSBgPmAgb2YgYSBtdWx0aS1saW5lIEhUTUwgb3IgSlNYIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBsaW5lIGluc3RlYWQgb2YgYmVpbmcgYWxvbmUgb24gdGhlIG5leHQgbGluZSAoZG9lcyBub3QgYXBwbHkgdG8gc2VsZiBjbG9zaW5nIGVsZW1lbnRzKS5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNhbWVMaW5lXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U2FtZUxpbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluc2VydCBzcGFjZXMgYXJvdW5kIGJyYWNrZXRzIGluIG9iamVjdCBsaXRlcmFscy4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZS5cbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNwYWNpbmdcbiAgICovXG4gIHJlYWRvbmx5IGJyYWNrZXRTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgc3BhY2VzIGltbWVkaWF0ZWx5IGluc2lkZSBzdXBwb3J0ZWQgZGVsaW1pdGVycyB3aGVuIHRoZWlyIGNvbnRlbnQgZml0cyBvbiBvbmUgbGluZS5cbiAgICogSXQgZG9lc24ndCBhZGQgc3BhY2VzIGJlZm9yZSBvcGVuaW5nIGRlbGltaXRlcnMgb3IgaW5zaWRlIGVtcHR5IGRlbGltaXRlcnMuXG4gICAqXG4gICAqIFRoZSBhZmZlY3RlZCBkZWxpbWl0ZXJzIHZhcnkgYnkgbGFuZ3VhZ2UuIElmIHVuc2V0LCB1c2VzIHRoZSBjb25maWd1cmVkIGZvcm1hdHRlciBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNkZWxpbWl0ZXJTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBkZWxpbWl0ZXJTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBmb3JtYXR0ZWQgb24gb25lIGxpbmUgb3IgbXVsdGlwbGUgbGluZXMuXG4gICAqXG4gICAqIGBhdXRvYCBmb3JtYXRzIG9iamVjdHMgb24gbXVsdGlwbGUgbGluZXMgaWYgdGhlIGZpcnN0IHByb3BlcnR5IGhhcyBhIG5ld2xpbmUsIGFuZCBhcnJheXMgb25cbiAgICogb25lIGxpbmUgaWYgdGhleSBmaXQuXG4gICAqXG4gICAqIGBhbHdheXNgIGZvcm1hdHMgYXJyYXlzIGFuZCBvYmplY3RzIG9uIG11bHRpcGxlIGxpbmVzLlxuICAgKlxuICAgKiBgbmV2ZXJgIGZvcm1hdHMgYXJyYXlzIGFuZCBvYmplY3RzIG9uIG9uZSBsaW5lIGlmIHRoZXkgZml0LlxuICAgKlxuICAgKiBJZiB1bnNldCwgdXNlcyB0aGUgY29uZmlndXJlZCBmb3JtYXR0ZXIgc2V0dGluZy5cbiAgICpcbiAgICogV2hlbiBmb3JtYXR0aW5nIGBwYWNrYWdlLmpzb25gLCBCaW9tZSB1c2VzIGBhbHdheXNgIHVubGVzcyBjb25maWd1cmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZXhwYW5kXG4gICAqL1xuICByZWFkb25seSBleHBhbmQ/OiBFeHBhbmQ7XG5cbiAgLyoqXG4gICAqIFN0b3JlcyB3aGV0aGVyIGZvcm1hdHRpbmcgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcHJvY2VlZCBpZiBhIGdpdmVuIGZpbGVcbiAgICogaGFzIHN5bnRheCBlcnJvcnNcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZm9ybWF0V2l0aEVycm9yc1xuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0V2l0aEVycm9ycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBpbmRlbnRhdGlvbiwgMiBieSBkZWZhdWx0IChkZXByZWNhdGVkLCB1c2UgYGluZGVudC13aWR0aGApXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFNpemVcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnQgc3R5bGUuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgaW5kZW50YXRpb24sIDIgYnkgZGVmYXVsdFxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGxpbmUgZW5kaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lRW5kaW5nXG4gICAqL1xuICByZWFkb25seSBsaW5lRW5kaW5nPzogTGluZUVuZGluZztcblxuICAvKipcbiAgICogV2hhdCdzIHRoZSBtYXggd2lkdGggb2YgYSBsaW5lLiBEZWZhdWx0cyB0byA4MC5cbiAgICpcbiAgICogQGRlZmF1bHQgODAuXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQcmludCB0cmFpbGluZyBjb21tYXMgd2hlcmV2ZXIgcG9zc2libGUgaW4gbXVsdGktbGluZSBjb21tYS1zZXBhcmF0ZWQgc3ludGFjdGljIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nQ29tbWFzXG4gICAqL1xuICByZWFkb25seSB0cmFpbGluZ0NvbW1hcz86IEpzVHJhaWxpbmdDb21tYXM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgaXMgKipoaWdobHkgZGlzY291cmFnZWQqKiBiZWNhdXNlIGl0IGNvdWxkIGNhdXNlIG1hbnkgcHJvYmxlbXMgd2l0aCBvdGhlciB0b29sczpcbiAgICogLSBodHRwczovL3Rob3VnaHRib3QuY29tL2Jsb2cvbm8tbmV3bGluZS1hdC1lbmQtb2YtZmlsZVxuICAgKiAtIGh0dHBzOi8vY2FsbG1lcnlhbi5tZWRpdW0uY29tL25vLW5ld2xpbmUtYXQtZW5kLW9mLWZpbGUtbmF2aWdhdGluZy1naXRzLXdhcm5pbmctZm9yLWFuZHJvaWQtZGV2ZWxvcGVycy1hZjE0ZTczZGQ4MDRcbiAgICogLSBodHRwczovL3VuaXguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzM0NTU0OC9ob3ctdG8tY2F0LWZpbGVzLXRvZ2V0aGVyLWFkZGluZy1taXNzaW5nLW5ld2xpbmVzLWF0LWVuZC1vZi1zb21lLWZpbGVzXG4gICAqXG4gICAqIERpc2FibGUgdGhlIG9wdGlvbiBhdCB5b3VyIG93biByaXNrLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlLlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ092ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX092ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmo6IE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F0dHJpYnV0ZVBvc2l0aW9uJzogb2JqLmF0dHJpYnV0ZVBvc2l0aW9uLFxuICAgICdicmFja2V0U2FtZUxpbmUnOiBvYmouYnJhY2tldFNhbWVMaW5lLFxuICAgICdicmFja2V0U3BhY2luZyc6IG9iai5icmFja2V0U3BhY2luZyxcbiAgICAnZGVsaW1pdGVyU3BhY2luZyc6IG9iai5kZWxpbWl0ZXJTcGFjaW5nLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2V4cGFuZCc6IG9iai5leHBhbmQsXG4gICAgJ2Zvcm1hdFdpdGhFcnJvcnMnOiBvYmouZm9ybWF0V2l0aEVycm9ycyxcbiAgICAnaW5kZW50U2l6ZSc6IG9iai5pbmRlbnRTaXplLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAndHJhaWxpbmdDb21tYXMnOiBvYmoudHJhaWxpbmdDb21tYXMsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIE92ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHJ1bGVzXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVMaW50ZXJDb25maWd1cmF0aW9uI2RvbWFpbnNcbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbnM/OiB7IFtrZXk6IHN0cmluZ106IFJ1bGVEb21haW5WYWx1ZSB9O1xuXG4gIC8qKlxuICAgKiBpZiBgZmFsc2VgLCBpdCBkaXNhYmxlcyB0aGUgZmVhdHVyZSBhbmQgdGhlIGxpbnRlciB3b24ndCBiZSBleGVjdXRlZC4gYHRydWVgIGJ5IGRlZmF1bHRcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcnVsZXNcbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb24jcnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVzPzogUnVsZXM7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ092ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX092ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbihvYmo6IE92ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2RvbWFpbnMnOiAoKG9iai5kb21haW5zKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmouZG9tYWlucykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncnVsZXMnOiB0b0pzb25fUnVsZXMob2JqLnJ1bGVzKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEludGVncmF0aW9uIHdpdGggR2l0IGFzIHRoZSB2ZXJzaW9uIGNvbnRyb2wgY2xpZW50LlxuICpcbiAqIEBzY2hlbWEgVmNzQ2xpZW50S2luZFxuICovXG5leHBvcnQgZW51bSBWY3NDbGllbnRLaW5kIHtcbiAgLyoqIGdpdCAqL1xuICBHSVQgPSBcImdpdFwiLFxufVxuXG4vKipcbiAqIEEgcHJlc2V0IGNvbmZpZ3VyYXRpb24gZm9yIGVuYWJsaW5nIGEgc2V0IG9mIHJ1bGVzLlxuICpcbiAqIEBzY2hlbWEgUHJlc2V0Q29uZmlnXG4gKi9cbmV4cG9ydCBlbnVtIFByZXNldENvbmZpZyB7XG4gIC8qKiByZWNvbW1lbmRlZCAqL1xuICBSRUNPTU1FTkRFRCA9IFwicmVjb21tZW5kZWRcIixcbiAgLyoqIGFsbCAqL1xuICBBTEwgPSBcImFsbFwiLFxuICAvKiogbm9uZSAqL1xuICBOT05FID0gXCJub25lXCIsXG59XG5cbi8qKlxuICogQSBsaXN0IG9mIHJ1bGVzIHRoYXQgYmVsb25nIHRvIHRoaXMgZ3JvdXBcbiAqXG4gKiBAc2NoZW1hIFNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZW1vdmUgZHVwbGljYXRlIENTUyBjbGFzc2VzLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy9uby1kdXBsaWNhdGUtY2xhc3Nlc1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSNub0R1cGxpY2F0ZUNsYXNzZXNcbiAgICovXG4gIHJlYWRvbmx5IG5vRHVwbGljYXRlQ2xhc3Nlcz86IGFueTtcblxuICAvKipcbiAgICogU29ydHMgaW1wb3J0cyBhbmQgZXhwb3J0cyBpbiB5b3VyIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL29yZ2FuaXplLWltcG9ydHNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2Ujb3JnYW5pemVJbXBvcnRzXG4gICAqL1xuICByZWFkb25seSBvcmdhbml6ZUltcG9ydHM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgYSBwYXJ0aWN1bGFyIHJ1bGUgcHJlc2V0XG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3ByZXNldFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlc2V0PzogUHJlc2V0Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSByZWNvbW1lbmRlZCBydWxlcyBmb3IgdGhpcyBncm91cFxuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSNyZWNvbW1lbmRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb21tZW5kZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmZvcmNlIGF0dHJpYnV0ZSBzb3J0aW5nIGluIEhUTUwgZWxlbWVudHMuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1zb3J0ZWQtYXR0cmlidXRlc1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSN1c2VTb3J0ZWRBdHRyaWJ1dGVzXG4gICAqL1xuICByZWFkb25seSB1c2VTb3J0ZWRBdHRyaWJ1dGVzPzogYW55O1xuXG4gIC8qKlxuICAgKiBTb3J0IHRoZSBtZW1iZXJzIG9mIGFuIGVudW0gaW4gbmF0dXJhbCBvcmRlci5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLXNvcnRlZC1lbnVtLW1lbWJlcnNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlU29ydGVkRW51bU1lbWJlcnNcbiAgICovXG4gIHJlYWRvbmx5IHVzZVNvcnRlZEVudW1NZW1iZXJzPzogYW55O1xuXG4gIC8qKlxuICAgKiBTb3J0IGludGVyZmFjZSBtZW1iZXJzIGJ5IGtleS5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLXNvcnRlZC1pbnRlcmZhY2UtbWVtYmVyc1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSN1c2VTb3J0ZWRJbnRlcmZhY2VNZW1iZXJzXG4gICAqL1xuICByZWFkb25seSB1c2VTb3J0ZWRJbnRlcmZhY2VNZW1iZXJzPzogYW55O1xuXG4gIC8qKlxuICAgKiBTb3J0IHRoZSBrZXlzIG9mIGEgSlNPTiBvYmplY3QgaW4gbmF0dXJhbCBvcmRlci5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLXNvcnRlZC1rZXlzXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZVNvcnRlZEtleXNcbiAgICovXG4gIHJlYWRvbmx5IHVzZVNvcnRlZEtleXM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIE9yZ2FuaXplIHBhY2thZ2UuanNvbiBmaWVsZHMgYWNjb3JkaW5nIHRvIGVzdGFibGlzaGVkIGNvbnZlbnRpb25zLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2Utc29ydGVkLXBhY2thZ2UtanNvblxuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSN1c2VTb3J0ZWRQYWNrYWdlSnNvblxuICAgKi9cbiAgcmVhZG9ubHkgdXNlU29ydGVkUGFja2FnZUpzb24/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEVuZm9yY2Ugb3JkZXJpbmcgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIG5lc3RlZCBydWxlcy5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLXNvcnRlZC1wcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZVNvcnRlZFByb3BlcnRpZXNcbiAgICovXG4gIHJlYWRvbmx5IHVzZVNvcnRlZFByb3BlcnRpZXM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFNvcnQgR3JhcGhRTCBzZWxlY3Rpb24gc2V0cy5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLXNvcnRlZC1zZWxlY3Rpb24tc2V0XG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZVNvcnRlZFNlbGVjdGlvblNldFxuICAgKi9cbiAgcmVhZG9ubHkgdXNlU29ydGVkU2VsZWN0aW9uU2V0PzogYW55O1xuXG4gIC8qKlxuICAgKiBTb3J0IGZpZWxkcyBpbiBHcmFwaFFMIHR5cGUgZGVmaW5pdGlvbnMgYWxwaGFiZXRpY2FsbHkuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1zb3J0ZWQtdHlwZS1maWVsZHNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlU29ydGVkVHlwZUZpZWxkc1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlU29ydGVkVHlwZUZpZWxkcz86IGFueTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU291cmNlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU291cmNlKG9iajogU291cmNlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbm9EdXBsaWNhdGVDbGFzc2VzJzogb2JqLm5vRHVwbGljYXRlQ2xhc3NlcyxcbiAgICAnb3JnYW5pemVJbXBvcnRzJzogb2JqLm9yZ2FuaXplSW1wb3J0cyxcbiAgICAncHJlc2V0Jzogb2JqLnByZXNldCxcbiAgICAncmVjb21tZW5kZWQnOiBvYmoucmVjb21tZW5kZWQsXG4gICAgJ3VzZVNvcnRlZEF0dHJpYnV0ZXMnOiBvYmoudXNlU29ydGVkQXR0cmlidXRlcyxcbiAgICAndXNlU29ydGVkRW51bU1lbWJlcnMnOiBvYmoudXNlU29ydGVkRW51bU1lbWJlcnMsXG4gICAgJ3VzZVNvcnRlZEludGVyZmFjZU1lbWJlcnMnOiBvYmoudXNlU29ydGVkSW50ZXJmYWNlTWVtYmVycyxcbiAgICAndXNlU29ydGVkS2V5cyc6IG9iai51c2VTb3J0ZWRLZXlzLFxuICAgICd1c2VTb3J0ZWRQYWNrYWdlSnNvbic6IG9iai51c2VTb3J0ZWRQYWNrYWdlSnNvbixcbiAgICAndXNlU29ydGVkUHJvcGVydGllcyc6IG9iai51c2VTb3J0ZWRQcm9wZXJ0aWVzLFxuICAgICd1c2VTb3J0ZWRTZWxlY3Rpb25TZXQnOiBvYmoudXNlU29ydGVkU2VsZWN0aW9uU2V0LFxuICAgICd1c2VTb3J0ZWRUeXBlRmllbGRzJzogb2JqLnVzZVNvcnRlZFR5cGVGaWVsZHMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIFF1b3RlU3R5bGVcbiAqL1xuZXhwb3J0IGVudW0gUXVvdGVTdHlsZSB7XG4gIC8qKiBkb3VibGUgKi9cbiAgRE9VQkxFID0gXCJkb3VibGVcIixcbiAgLyoqIHNpbmdsZSAqL1xuICBTSU5HTEUgPSBcInNpbmdsZVwiLFxufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgdm9pZC1lbGVtZW50cyBzaG91bGQgYmUgc2VsZiBjbG9zZWRcbiAqXG4gKiBAc2NoZW1hIFNlbGZDbG9zZVZvaWRFbGVtZW50c1xuICovXG5leHBvcnQgZW51bSBTZWxmQ2xvc2VWb2lkRWxlbWVudHMge1xuICAvKiogVGhlIGAvYCBpbnNpZGUgdm9pZCBlbGVtZW50cyBpcyByZW1vdmVkIGJ5IHRoZSBmb3JtYXR0ZXIgKG5ldmVyKSAqL1xuICBORVZFUiA9IFwibmV2ZXJcIixcbiAgLyoqIFRoZSBgL2AgaW5zaWRlIHZvaWQgZWxlbWVudHMgaXMgYWx3YXlzIGFkZGVkIChhbHdheXMpICovXG4gIEFMV0FZUyA9IFwiYWx3YXlzXCIsXG59XG5cbi8qKlxuICogV2hpdGVzcGFjZSBzZW5zaXRpdml0eSBmb3IgSFRNTCBmb3JtYXR0aW5nLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgdHdvIGNhc2VzIHdvbid0IHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0OlxuICpcbiAqIHwgICAgICAgICAgICAgICAgfCAgICAgIGh0bWwgICAgICB8ICAgIG91dHB1dCAgICB8XG4gKiB8IC0tLS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLTogfCA6LS0tLS0tLS0tLTogfFxuICogfCB3aXRoIHNwYWNlcyAgICB8IGAxPGI+IDIgPC9iPjNgIHwgMTxiPiAyIDwvYj4zIHxcbiAqIHwgd2l0aG91dCBzcGFjZXMgfCAgYDE8Yj4yPC9iPjNgICB8ICAxPGI+MjwvYj4zICB8XG4gKlxuICogVGhpcyBoYXBwZW5zIGJlY2F1c2Ugd2hpdGVzcGFjZSBpcyBzaWduaWZpY2FudCBpbiBpbmxpbmUgZWxlbWVudHMuXG4gKlxuICogQXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzLCB0aGUgZm9ybWF0dGVyIG11c3QgZm9ybWF0IGJsb2NrcyB0aGF0IGxvb2sgbGlrZSB0aGlzIChhc3N1bWUgYSBzbWFsbCBsaW5lIHdpZHRoLCA8MjApOlxuICogYGBgaHRtbFxuICogPHNwYW4+cmVhbGx5IGxvbmcgY29udGVudDwvc3Bhbj5cbiAqIGBgYFxuICogYXMgdGhpcywgd2hlcmUgdGhlIGNvbnRlbnQgaHVncyB0aGUgdGFnczpcbiAqIGBgYGh0bWxcbiAqIDxzcGFuXG4gKiA+cmVhbGx5IGxvbmcgY29udGVudDwvc3BhblxuICogPlxuICogYGBgXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIGlubGluZSBlbGVtZW50cy4gQmxvY2sgZWxlbWVudHMgZG8gbm90IGhhdmUgdGhpcyByZXN0cmljdGlvbi5cbiAqXG4gKiBAc2NoZW1hIFdoaXRlc3BhY2VTZW5zaXRpdml0eVxuICovXG5leHBvcnQgZW51bSBXaGl0ZXNwYWNlU2Vuc2l0aXZpdHkge1xuICAvKiogVGhlIGZvcm1hdHRlciBjb25zaWRlcnMgd2hpdGVzcGFjZSBzaWduaWZpY2FudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGFuIFwiaW5saW5lXCIgZGlzcGxheSBzdHlsZSBieSBkZWZhdWx0IGluXG5icm93c2VyJ3MgdXNlciBhZ2VudCBzdHlsZSBzaGVldHMuIChjc3MpICovXG4gIENTUyA9IFwiY3NzXCIsXG4gIC8qKiBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGluIGNvbnRlbnQgaXMgY29uc2lkZXJlZCBzaWduaWZpY2FudCBmb3IgYWxsIGVsZW1lbnRzLlxuXG5UaGUgZm9ybWF0dGVyIHNob3VsZCBsZWF2ZSBhdCBsZWFzdCBvbmUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaWYgd2hpdGVzcGFjZSBpcyBwcmVzZW50LlxuT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBubyB3aGl0ZXNwYWNlLCBpdCBzaG91bGQgbm90IGFkZCBhbnkgYWZ0ZXIgYD5gIG9yIGJlZm9yZSBgPGAuIEluIG90aGVyIHdvcmRzLCBpZiB0aGVyZSdzIG5vIHdoaXRlc3BhY2UsIHRoZSB0ZXh0IGNvbnRlbnQgc2hvdWxkIGh1ZyB0aGUgdGFncy5cblxuRXhhbXBsZSBvZiB0ZXh0IGh1Z2dpbmcgdGhlIHRhZ3M6XG5gYGBodG1sXG48YlxuICAgID5jb250ZW50PC9iXG4+XG5gYGAgKHN0cmljdCkgKi9cbiAgU1RSSUNUID0gXCJzdHJpY3RcIixcbiAgLyoqIFdoaXRlc3BhY2UgaXMgY29uc2lkZXJlZCBpbnNpZ25pZmljYW50LiBUaGUgZm9ybWF0dGVyIGlzIGZyZWUgdG8gcmVtb3ZlIG9yIGFkZCB3aGl0ZXNwYWNlIGFzIGl0IHNlZXMgZml0LiAoaWdub3JlKSAqL1xuICBJR05PUkUgPSBcImlnbm9yZVwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgQXJyb3dQYXJlbnRoZXNlc1xuICovXG5leHBvcnQgZW51bSBBcnJvd1BhcmVudGhlc2VzIHtcbiAgLyoqIGFsd2F5cyAqL1xuICBBTFdBWVMgPSBcImFsd2F5c1wiLFxuICAvKiogYXNOZWVkZWQgKi9cbiAgQVNfTkVFREVEID0gXCJhc05lZWRlZFwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgT3BlcmF0b3JMaW5lYnJlYWtcbiAqL1xuZXhwb3J0IGVudW0gT3BlcmF0b3JMaW5lYnJlYWsge1xuICAvKiogVGhlIG9wZXJhdG9yIGlzIHBsYWNlZCBhZnRlciB0aGUgZXhwcmVzc2lvbiAoYWZ0ZXIpICovXG4gIEFGVEVSID0gXCJhZnRlclwiLFxuICAvKiogVGhlIG9wZXJhdG9yIGlzIHBsYWNlZCBiZWZvcmUgdGhlIGV4cHJlc3Npb24gKGJlZm9yZSkgKi9cbiAgQkVGT1JFID0gXCJiZWZvcmVcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIFF1b3RlUHJvcGVydGllc1xuICovXG5leHBvcnQgZW51bSBRdW90ZVByb3BlcnRpZXMge1xuICAvKiogYXNOZWVkZWQgKi9cbiAgQVNfTkVFREVEID0gXCJhc05lZWRlZFwiLFxuICAvKiogcHJlc2VydmUgKi9cbiAgUFJFU0VSVkUgPSBcInByZXNlcnZlXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBTZW1pY29sb25zXG4gKi9cbmV4cG9ydCBlbnVtIFNlbWljb2xvbnMge1xuICAvKiogYWx3YXlzICovXG4gIEFMV0FZUyA9IFwiYWx3YXlzXCIsXG4gIC8qKiBhc05lZWRlZCAqL1xuICBBU19ORUVERUQgPSBcImFzTmVlZGVkXCIsXG59XG5cbi8qKlxuICogUHJpbnQgdHJhaWxpbmcgY29tbWFzIHdoZXJldmVyIHBvc3NpYmxlIGluIG11bHRpLWxpbmUgY29tbWEtc2VwYXJhdGVkIHN5bnRhY3RpYyBzdHJ1Y3R1cmVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgZmlsZXMuXG4gKlxuICogQHNjaGVtYSBKc1RyYWlsaW5nQ29tbWFzXG4gKi9cbmV4cG9ydCBlbnVtIEpzVHJhaWxpbmdDb21tYXMge1xuICAvKiogYWxsICovXG4gIEFMTCA9IFwiYWxsXCIsXG4gIC8qKiBlczUgKi9cbiAgRVM1ID0gXCJlczVcIixcbiAgLyoqIG5vbmUgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG4vKipcbiAqIFByaW50IHRyYWlsaW5nIGNvbW1hcyB3aGVyZXZlciBwb3NzaWJsZSBpbiBtdWx0aS1saW5lIGNvbW1hLXNlcGFyYXRlZCBzeW50YWN0aWMgc3RydWN0dXJlcyBmb3IgSlNPTiBmaWxlcy5cbiAqXG4gKiBAc2NoZW1hIEpzb25UcmFpbGluZ0NvbW1hc1xuICovXG5leHBvcnQgZW51bSBKc29uVHJhaWxpbmdDb21tYXMge1xuICAvKiogbm9uZSAqL1xuICBOT05FID0gXCJub25lXCIsXG4gIC8qKiBhbGwgKi9cbiAgQUxMID0gXCJhbGxcIixcbn1cbiJdfQ==