UNPKG

projen

Version:

CDK for software projects

886 lines • 178 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DirectivesConfigurationConfigType = exports.CheckerConfigurationWebappSecurityAggressivenessLevel = exports.CommitConfigurationLocalFormat = exports.CommitConfigurationConnectUploadArtifacts = exports.CommitConfigurationConnectScm = exports.CommitConfigurationConnectOnNewCert = exports.LanguagesConfigurationInclude = exports.LanguagesConfigurationExclude = exports.SigmaConfigurationEnableCheckSet = exports.AnalyzeConnectConfigurationUploadArtifacts = exports.AnalysisConfigurationMode = exports.AnalysisConfigurationLocation = exports.AnalysisConfigurationAggressivenessLevel = void 0;
exports.toJson_PolarisCoveritySchema = toJson_PolarisCoveritySchema;
exports.toJson_AnalysisConfiguration = toJson_AnalysisConfiguration;
exports.toJson_CachingConfiguration = toJson_CachingConfiguration;
exports.toJson_CaptureConfiguration = toJson_CaptureConfiguration;
exports.toJson_CommitConfiguration = toJson_CommitConfiguration;
exports.toJson_CheckerConfiguration = toJson_CheckerConfiguration;
exports.toJson_CodingStandardConfiguration = toJson_CodingStandardConfiguration;
exports.toJson_AnalyzeConnectConfiguration = toJson_AnalyzeConnectConfiguration;
exports.toJson_DirectivesConfiguration = toJson_DirectivesConfiguration;
exports.toJson_AnalyzeFilesConfiguration = toJson_AnalyzeFilesConfiguration;
exports.toJson_JobsConfiguration = toJson_JobsConfiguration;
exports.toJson_ParseWarningsConfiguration = toJson_ParseWarningsConfiguration;
exports.toJson_SigmaConfiguration = toJson_SigmaConfiguration;
exports.toJson_CompilerConfiguration = toJson_CompilerConfiguration;
exports.toJson_CovTranslateConfiguration = toJson_CovTranslateConfiguration;
exports.toJson_FilesConfiguration = toJson_FilesConfiguration;
exports.toJson_LanguagesConfiguration = toJson_LanguagesConfiguration;
exports.toJson_ImportScmConfiguration = toJson_ImportScmConfiguration;
exports.toJson_BuildConfiguration = toJson_BuildConfiguration;
exports.toJson_CommitConfigurationConnect = toJson_CommitConfigurationConnect;
exports.toJson_CommitConfigurationSrm = toJson_CommitConfigurationSrm;
exports.toJson_CommitConfigurationLocal = toJson_CommitConfigurationLocal;
exports.toJson_CheckerConfigurationWebappSecurity = toJson_CheckerConfigurationWebappSecurity;
exports.toJson_SpecificCodingStandardConfiguration = toJson_SpecificCodingStandardConfiguration;
exports.toJson_DirectivesConfigurationConfig = toJson_DirectivesConfigurationConfig;
exports.toJson_ParallelTranslateConfiguration = toJson_ParallelTranslateConfiguration;
exports.toJson_WebappArchiveConfiguration = toJson_WebappArchiveConfiguration;
exports.toJson_SnapshotConfiguration = toJson_SnapshotConfiguration;
exports.toJson_CommitConfigurationConnectTriage = toJson_CommitConfigurationConnectTriage;
exports.toJson_ResolvedCodingStandardConfiguration = toJson_ResolvedCodingStandardConfiguration;
exports.toJson_CodingStandardDeviation = toJson_CodingStandardDeviation;
/**
 * Converts an object of type 'PolarisCoveritySchema' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_PolarisCoveritySchema(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'analyze': toJson_AnalysisConfiguration(obj.analyze),
        'caching': toJson_CachingConfiguration(obj.caching),
        'capture': toJson_CaptureConfiguration(obj.capture),
        'commit': toJson_CommitConfiguration(obj.commit),
        'version': obj.version,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'AnalysisConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_AnalysisConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'aggressiveness-level': obj.aggressivenessLevel,
        'c-cpp-fnptr': obj.cCppFnptr,
        'c-cpp-virtual': obj.cCppVirtual,
        'callgraph-metrics': obj.callgraphMetrics,
        'checkers': toJson_CheckerConfiguration(obj.checkers),
        'coding-standards': toJson_CodingStandardConfiguration(obj.codingStandards),
        'connect': toJson_AnalyzeConnectConfiguration(obj.connect),
        'constraint-fpp': obj.constraintFpp,
        'cov-analyze-args': obj.covAnalyzeArgs?.map(y => y),
        'cov-collect-models-args': obj.covCollectModelsArgs?.map(y => y),
        'directives': obj.directives?.map(y => toJson_DirectivesConfiguration(y)),
        'files': toJson_AnalyzeFilesConfiguration(obj.files),
        'jobs': obj.jobs?.map(y => toJson_JobsConfiguration(y)),
        'location': obj.location,
        'mode': obj.mode,
        'model-file': obj.modelFile,
        'one-tu-per-psf': obj.oneTuPerPsf,
        'output-model-file': obj.outputModelFile,
        'parse-warnings': toJson_ParseWarningsConfiguration(obj.parseWarnings),
        'scan-transparency': obj.scanTransparency,
        'sigma': toJson_SigmaConfiguration(obj.sigma),
        'trust': obj.trust,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CachingConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CachingConfiguration(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 'CaptureConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CaptureConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'build-command-inference': obj.buildCommandInference,
        'compiler-configuration': toJson_CompilerConfiguration(obj.compilerConfiguration),
        'cov-translate': toJson_CovTranslateConfiguration(obj.covTranslate),
        'emit-complementary-info': obj.emitComplementaryInfo,
        'encoding': obj.encoding,
        'failure-threshold-percent': obj.failureThresholdPercent,
        'files': toJson_FilesConfiguration(obj.files),
        'force-dependency-resolution': obj.forceDependencyResolution,
        'languages': toJson_LanguagesConfiguration(obj.languages),
        'import-scm': toJson_ImportScmConfiguration(obj.importScm),
        'minimal-classpath-emit': obj.minimalClasspathEmit,
        'record-with-source': obj.recordWithSource,
        'security-da': obj.securityDa,
        'build-capture': toJson_BuildConfiguration(obj.buildCapture),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CommitConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CommitConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'connect': toJson_CommitConfigurationConnect(obj.connect),
        'srm': toJson_CommitConfigurationSrm(obj.srm),
        'local': toJson_CommitConfigurationLocal(obj.local),
    };
    // 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 */
/**
 * Specifies the aggressiveness level for the analysis. The aggressiveness level causes the analysis to make more or less aggressive assumptions during the analysis where the higher the aggressiveness level the more defects are reported.
 *
 * @schema AnalysisConfigurationAggressivenessLevel
 */
var AnalysisConfigurationAggressivenessLevel;
(function (AnalysisConfigurationAggressivenessLevel) {
    /** low */
    AnalysisConfigurationAggressivenessLevel["LOW"] = "low";
    /** medium */
    AnalysisConfigurationAggressivenessLevel["MEDIUM"] = "medium";
    /** high */
    AnalysisConfigurationAggressivenessLevel["HIGH"] = "high";
})(AnalysisConfigurationAggressivenessLevel || (exports.AnalysisConfigurationAggressivenessLevel = AnalysisConfigurationAggressivenessLevel = {}));
/**
 * Converts an object of type 'CheckerConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CheckerConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'all': obj.all,
        'all-security': obj.allSecurity,
        'android-security': obj.androidSecurity,
        'audit': obj.audit,
        'brakeman': obj.brakeman,
        'c-family-security': obj.cFamilySecurity,
        'checker-config': obj.checkerConfig,
        'codexm': obj.codexm?.map(y => y),
        'concurrency': obj.concurrency,
        'default': obj.default,
        'pmd': obj.pmd,
        'recommended-security-checkers': obj.recommendedSecurityCheckers,
        'rule': obj.rule,
        'webapp-security': toJson_CheckerConfigurationWebappSecurity(obj.webappSecurity),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CodingStandardConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CodingStandardConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'autosarcpp14': toJson_SpecificCodingStandardConfiguration(obj.autosarcpp14),
        'cert-c': toJson_SpecificCodingStandardConfiguration(obj.certC),
        'cert-c-recommendation': toJson_SpecificCodingStandardConfiguration(obj.certCRecommendation),
        'cert-cpp': toJson_SpecificCodingStandardConfiguration(obj.certCpp),
        'cert-java': toJson_SpecificCodingStandardConfiguration(obj.certJava),
        'hyundai-c': toJson_SpecificCodingStandardConfiguration(obj.hyundaiC),
        'hyundai-cpp': toJson_SpecificCodingStandardConfiguration(obj.hyundaiCpp),
        'hyundai-java': toJson_SpecificCodingStandardConfiguration(obj.hyundaiJava),
        'ignore-deviated-findings': obj.ignoreDeviatedFindings,
        'iso-ts17961': toJson_SpecificCodingStandardConfiguration(obj.isoTs17961),
        'misrac2004': toJson_SpecificCodingStandardConfiguration(obj.misrac2004),
        'misrac2012': toJson_SpecificCodingStandardConfiguration(obj.misrac2012),
        'misrac2023': toJson_SpecificCodingStandardConfiguration(obj.misrac2023),
        'misracpp2008': toJson_SpecificCodingStandardConfiguration(obj.misracpp2008),
        'misracpp2023': toJson_SpecificCodingStandardConfiguration(obj.misracpp2023),
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'AnalyzeConnectConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_AnalyzeConnectConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'auth-key-file': obj.authKeyFile,
        'ca-certs-file': obj.caCertsFile,
        'proxy-client-cert-file': obj.proxyClientCertFile,
        'proxy-client-key-file': obj.proxyClientKeyFile,
        'proxy-url': obj.proxyUrl,
        'upload-artifacts': obj.uploadArtifacts,
        'url': obj.url,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'DirectivesConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_DirectivesConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'config': toJson_DirectivesConfigurationConfig(obj.config),
        'file': obj.file,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'AnalyzeFilesConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_AnalyzeFilesConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'exclude-glob': obj.excludeGlob,
        'exclude-regex': obj.excludeRegex,
        'include-files': obj.includeFiles,
        'include-glob': obj.includeGlob,
        'include-list-file': obj.includeListFile,
        'include-regex': obj.includeRegex,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'JobsConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_JobsConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'auto': obj.auto,
        'count': obj.count,
        'max': obj.max,
        'override-worker-limit': obj.overrideWorkerLimit,
    };
    // 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 */
/**
 * Specifies whether the analysis should be done locally, in Coverity Connect, or in Software Risk Manager. The possible values are as follows: connect - Run the analysis in the Coverity Connect job farm; srm - Run the analysis in the Software Risk Manager job farm; local - Run the analysis locally
 *
 * @schema AnalysisConfigurationLocation
 */
var AnalysisConfigurationLocation;
(function (AnalysisConfigurationLocation) {
    /** local */
    AnalysisConfigurationLocation["LOCAL"] = "local";
    /** connect */
    AnalysisConfigurationLocation["CONNECT"] = "connect";
    /** srm */
    AnalysisConfigurationLocation["SRM"] = "srm";
})(AnalysisConfigurationLocation || (exports.AnalysisConfigurationLocation = AnalysisConfigurationLocation = {}));
/**
 * Analysis mode: "pfi" (perfect fidelity incremental) for complete analysis; or "hfi" (high fidelity incremental) for analysis of only specific files specified by analyze.files settings, omitting any other files which may have been incidentally captured by the build. An "hfi" analysis can be faster but may produce results which are incomplete or inconsistent, due to the lack of context, and should be used only when speed is more important than accuracy.
 *
 * @schema AnalysisConfigurationMode
 */
var AnalysisConfigurationMode;
(function (AnalysisConfigurationMode) {
    /** hfi */
    AnalysisConfigurationMode["HFI"] = "hfi";
    /** pfi */
    AnalysisConfigurationMode["PFI"] = "pfi";
})(AnalysisConfigurationMode || (exports.AnalysisConfigurationMode = AnalysisConfigurationMode = {}));
/**
 * Converts an object of type 'ParseWarningsConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_ParseWarningsConfiguration(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 'SigmaConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_SigmaConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enable-check-set': obj.enableCheckSet?.map(y => y),
        'malicious-url-patterns-file': obj.maliciousUrlPatternsFile?.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 'CompilerConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CompilerConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'cov-configure': obj.covConfigure?.map(y => y?.map(y => y)),
        'file': obj.file,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CovTranslateConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CovTranslateConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'command': obj.command,
        'cov-build-args': obj.covBuildArgs?.map(y => y),
        'defer-decomp': obj.deferDecomp,
        'parallel-translate': toJson_ParallelTranslateConfiguration(obj.parallelTranslate),
        'scan-transparency': obj.scanTransparency,
    };
    // 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 = {
        'emit-minified-js': obj.emitMinifiedJs,
        'exclude-glob': obj.excludeGlob,
        'exclude-regex': obj.excludeRegex,
        'include-dirs': obj.includeDirs?.map(y => y),
        'include-glob': obj.includeGlob,
        'include-list-file': obj.includeListFile,
        'include-regex': obj.includeRegex,
        'java-version': obj.javaVersion,
        'library-dirs': obj.libraryDirs?.map(y => y),
        'library-files': obj.libraryFiles?.map(y => y),
        'webapp-archives': obj.webappArchives?.map(y => toJson_WebappArchiveConfiguration(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 'LanguagesConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_LanguagesConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'exclude': obj.exclude?.map(y => y),
        'include': obj.include?.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 'ImportScmConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_ImportScmConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'cov-import-scm-args': obj.covImportScmArgs?.map(y => y),
        'filename-regex': obj.filenameRegex,
        'ms-delay': obj.msDelay,
        'scm': obj.scm,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'BuildConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_BuildConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'aspnet-compiler': obj.aspnetCompiler,
        'bazel': obj.bazel,
        'build-command': obj.buildCommand,
        'clean-command': obj.cleanCommand,
        'cov-build-args': obj.covBuildArgs?.map(y => y),
        'defer-decomp': obj.deferDecomp,
        'instrument': obj.instrument,
        'parallel-translate': toJson_ParallelTranslateConfiguration(obj.parallelTranslate),
        'scan-transparency': obj.scanTransparency,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CommitConfigurationConnect' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CommitConfigurationConnect(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'auth-key-file': obj.authKeyFile,
        'ca-certs-file': obj.caCertsFile,
        'comparison-only': obj.comparisonOnly,
        'comparison-report': obj.comparisonReport,
        'cov-commit-defects-args': obj.covCommitDefectsArgs?.map(y => y),
        'description': obj.description,
        'on-new-cert': obj.onNewCert,
        'project': obj.project,
        'proxy-client-cert-file': obj.proxyClientCertFile,
        'proxy-client-key-file': obj.proxyClientKeyFile,
        'proxy-url': obj.proxyUrl,
        'scm': obj.scm,
        'snapshot': toJson_SnapshotConfiguration(obj.snapshot),
        'stream': obj.stream,
        'triage': toJson_CommitConfigurationConnectTriage(obj.triage),
        'upload-artifacts': obj.uploadArtifacts,
        'url': obj.url,
        'version': obj.version,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CommitConfigurationSrm' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CommitConfigurationSrm(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'branch': obj.branch,
        'parent-branch': obj.parentBranch,
        'project-name': obj.projectName,
        'project-id': obj.projectId,
        'token-file': obj.tokenFile,
        'url': obj.url,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CommitConfigurationLocal' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CommitConfigurationLocal(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'path': obj.path,
        'format': obj.format,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CheckerConfigurationWebappSecurity' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CheckerConfigurationWebappSecurity(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'aggressiveness-level': obj.aggressivenessLevel,
        '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 'SpecificCodingStandardConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_SpecificCodingStandardConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'config': toJson_ResolvedCodingStandardConfiguration(obj.config),
        'file': obj.file,
        'pre-canned': obj.preCanned,
    };
    // 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 */
/**
 * Artifacts to upload following analysis when the analysis location is Connect.
 *
 * @schema AnalyzeConnectConfigurationUploadArtifacts
 */
var AnalyzeConnectConfigurationUploadArtifacts;
(function (AnalyzeConnectConfigurationUploadArtifacts) {
    /** All */
    AnalyzeConnectConfigurationUploadArtifacts["ALL"] = "All";
    /** LogsOnly */
    AnalyzeConnectConfigurationUploadArtifacts["LOGS_ONLY"] = "LogsOnly";
    /** None */
    AnalyzeConnectConfigurationUploadArtifacts["NONE"] = "None";
    /** OnFailure */
    AnalyzeConnectConfigurationUploadArtifacts["ON_FAILURE"] = "OnFailure";
})(AnalyzeConnectConfigurationUploadArtifacts || (exports.AnalyzeConnectConfigurationUploadArtifacts = AnalyzeConnectConfigurationUploadArtifacts = {}));
/**
 * Converts an object of type 'DirectivesConfigurationConfig' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_DirectivesConfigurationConfig(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'directives': obj.directives?.map(y => y),
        'format_version': obj.formatVersion,
        'language': obj.language,
        'type': obj.type,
    };
    // 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 SigmaConfigurationEnableCheckSet
 */
var SigmaConfigurationEnableCheckSet;
(function (SigmaConfigurationEnableCheckSet) {
    /** all */
    SigmaConfigurationEnableCheckSet["ALL"] = "all";
    /** cis */
    SigmaConfigurationEnableCheckSet["CIS"] = "cis";
    /** default */
    SigmaConfigurationEnableCheckSet["DEFAULT"] = "default";
    /** empty */
    SigmaConfigurationEnableCheckSet["EMPTY"] = "empty";
})(SigmaConfigurationEnableCheckSet || (exports.SigmaConfigurationEnableCheckSet = SigmaConfigurationEnableCheckSet = {}));
/**
 * Converts an object of type 'ParallelTranslateConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_ParallelTranslateConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'enabled': obj.enabled,
        'processes': obj.processes,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'WebappArchiveConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_WebappArchiveConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'path': obj.path,
        'validate-webapp': obj.validateWebapp,
    };
    // 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 LanguagesConfigurationExclude
 */
var LanguagesConfigurationExclude;
(function (LanguagesConfigurationExclude) {
    /** apex */
    LanguagesConfigurationExclude["APEX"] = "apex";
    /** c-family */
    LanguagesConfigurationExclude["C_HYPHEN_FAMILY"] = "c-family";
    /** csharp */
    LanguagesConfigurationExclude["CSHARP"] = "csharp";
    /** dart */
    LanguagesConfigurationExclude["DART"] = "dart";
    /** go */
    LanguagesConfigurationExclude["GO"] = "go";
    /** java */
    LanguagesConfigurationExclude["JAVA"] = "java";
    /** javascript */
    LanguagesConfigurationExclude["JAVASCRIPT"] = "javascript";
    /** kotlin */
    LanguagesConfigurationExclude["KOTLIN"] = "kotlin";
    /** php */
    LanguagesConfigurationExclude["PHP"] = "php";
    /** python */
    LanguagesConfigurationExclude["PYTHON"] = "python";
    /** ruby */
    LanguagesConfigurationExclude["RUBY"] = "ruby";
    /** swift */
    LanguagesConfigurationExclude["SWIFT"] = "swift";
    /** vb */
    LanguagesConfigurationExclude["VB"] = "vb";
    /** configuration */
    LanguagesConfigurationExclude["CONFIGURATION"] = "configuration";
})(LanguagesConfigurationExclude || (exports.LanguagesConfigurationExclude = LanguagesConfigurationExclude = {}));
/**
 * @schema LanguagesConfigurationInclude
 */
var LanguagesConfigurationInclude;
(function (LanguagesConfigurationInclude) {
    /** apex */
    LanguagesConfigurationInclude["APEX"] = "apex";
    /** c-family */
    LanguagesConfigurationInclude["C_HYPHEN_FAMILY"] = "c-family";
    /** csharp */
    LanguagesConfigurationInclude["CSHARP"] = "csharp";
    /** dart */
    LanguagesConfigurationInclude["DART"] = "dart";
    /** go */
    LanguagesConfigurationInclude["GO"] = "go";
    /** java */
    LanguagesConfigurationInclude["JAVA"] = "java";
    /** javascript */
    LanguagesConfigurationInclude["JAVASCRIPT"] = "javascript";
    /** kotlin */
    LanguagesConfigurationInclude["KOTLIN"] = "kotlin";
    /** php */
    LanguagesConfigurationInclude["PHP"] = "php";
    /** python */
    LanguagesConfigurationInclude["PYTHON"] = "python";
    /** ruby */
    LanguagesConfigurationInclude["RUBY"] = "ruby";
    /** swift */
    LanguagesConfigurationInclude["SWIFT"] = "swift";
    /** vb */
    LanguagesConfigurationInclude["VB"] = "vb";
    /** configuration */
    LanguagesConfigurationInclude["CONFIGURATION"] = "configuration";
})(LanguagesConfigurationInclude || (exports.LanguagesConfigurationInclude = LanguagesConfigurationInclude = {}));
/**
 * Indicates whether to trust self-signed certificates presented by Coverity Connect that are not currently trusted.
 *
 * @schema CommitConfigurationConnectOnNewCert
 */
var CommitConfigurationConnectOnNewCert;
(function (CommitConfigurationConnectOnNewCert) {
    /** trust */
    CommitConfigurationConnectOnNewCert["TRUST"] = "trust";
    /** distrust */
    CommitConfigurationConnectOnNewCert["DISTRUST"] = "distrust";
})(CommitConfigurationConnectOnNewCert || (exports.CommitConfigurationConnectOnNewCert = CommitConfigurationConnectOnNewCert = {}));
/**
 * The name of the source control management system.
 *
 * @schema CommitConfigurationConnectScm
 */
var CommitConfigurationConnectScm;
(function (CommitConfigurationConnectScm) {
    /** ads */
    CommitConfigurationConnectScm["ADS"] = "ads";
    /** clearcase */
    CommitConfigurationConnectScm["CLEARCASE"] = "clearcase";
    /** cvs */
    CommitConfigurationConnectScm["CVS"] = "cvs";
    /** git */
    CommitConfigurationConnectScm["GIT"] = "git";
    /** hg */
    CommitConfigurationConnectScm["HG"] = "hg";
    /** perforce */
    CommitConfigurationConnectScm["PERFORCE"] = "perforce";
    /** plastic */
    CommitConfigurationConnectScm["PLASTIC"] = "plastic";
    /** plastic-distributed */
    CommitConfigurationConnectScm["PLASTIC_HYPHEN_DISTRIBUTED"] = "plastic-distributed";
    /** svn */
    CommitConfigurationConnectScm["SVN"] = "svn";
    /** tfs */
    CommitConfigurationConnectScm["TFS"] = "tfs";
})(CommitConfigurationConnectScm || (exports.CommitConfigurationConnectScm = CommitConfigurationConnectScm = {}));
/**
 * Converts an object of type 'SnapshotConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_SnapshotConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'date': obj.date,
        'id': obj.id,
        'reference': obj.reference,
    };
    // filter undefined values
    return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
 * Converts an object of type 'CommitConfigurationConnectTriage' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CommitConfigurationConnectTriage(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'new-defect-owner': obj.newDefectOwner,
        'new-defect-owner-limit': obj.newDefectOwnerLimit,
        'set-new-defect-owner': obj.setNewDefectOwner,
    };
    // 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 */
/**
 * Artifacts to upload following analysis when the analysis location is Connect.
 *
 * @schema CommitConfigurationConnectUploadArtifacts
 */
var CommitConfigurationConnectUploadArtifacts;
(function (CommitConfigurationConnectUploadArtifacts) {
    /** All */
    CommitConfigurationConnectUploadArtifacts["ALL"] = "All";
    /** LogsOnly */
    CommitConfigurationConnectUploadArtifacts["LOGS_ONLY"] = "LogsOnly";
    /** None */
    CommitConfigurationConnectUploadArtifacts["NONE"] = "None";
    /** OnFailure */
    CommitConfigurationConnectUploadArtifacts["ON_FAILURE"] = "OnFailure";
})(CommitConfigurationConnectUploadArtifacts || (exports.CommitConfigurationConnectUploadArtifacts = CommitConfigurationConnectUploadArtifacts = {}));
/**
 * Format in which to save defects. Either "html" or "json".
 *
 * @schema CommitConfigurationLocalFormat
 */
var CommitConfigurationLocalFormat;
(function (CommitConfigurationLocalFormat) {
    /** html */
    CommitConfigurationLocalFormat["HTML"] = "html";
    /** json */
    CommitConfigurationLocalFormat["JSON"] = "json";
})(CommitConfigurationLocalFormat || (exports.CommitConfigurationLocalFormat = CommitConfigurationLocalFormat = {}));
/**
 * Sets the web application checkers aggressiveness level.
 *
 * @schema CheckerConfigurationWebappSecurityAggressivenessLevel
 */
var CheckerConfigurationWebappSecurityAggressivenessLevel;
(function (CheckerConfigurationWebappSecurityAggressivenessLevel) {
    /** low */
    CheckerConfigurationWebappSecurityAggressivenessLevel["LOW"] = "low";
    /** medium */
    CheckerConfigurationWebappSecurityAggressivenessLevel["MEDIUM"] = "medium";
    /** high */
    CheckerConfigurationWebappSecurityAggressivenessLevel["HIGH"] = "high";
})(CheckerConfigurationWebappSecurityAggressivenessLevel || (exports.CheckerConfigurationWebappSecurityAggressivenessLevel = CheckerConfigurationWebappSecurityAggressivenessLevel = {}));
/**
 * Converts an object of type 'ResolvedCodingStandardConfiguration' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_ResolvedCodingStandardConfiguration(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'deviations': obj.deviations?.map(y => toJson_CodingStandardDeviation(y)),
        'title': obj.title,
        'version': obj.version,
    };
    // 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 */
/**
 * Must be the string "Coverity analysis configuration".
 *
 * @schema DirectivesConfigurationConfigType
 */
var DirectivesConfigurationConfigType;
(function (DirectivesConfigurationConfigType) {
    /** Coverity analysis configuration */
    DirectivesConfigurationConfigType["COVERITY_ANALYSIS_CONFIGURATION"] = "Coverity analysis configuration";
})(DirectivesConfigurationConfigType || (exports.DirectivesConfigurationConfigType = DirectivesConfigurationConfigType = {}));
/**
 * Converts an object of type 'CodingStandardDeviation' to JSON representation.
 * @internal
 */
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_CodingStandardDeviation(obj) {
    if (obj === undefined) {
        return undefined;
    }
    const result = {
        'deviation': obj.deviation,
        'reason': obj.reason,
    };
    // 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 */
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY292ZXJpdHktY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvbGFyaXMvY292ZXJpdHktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNDQSxvRUFXQztBQXlLRCxvRUE0QkM7QUFzQkQsa0VBT0M7QUE2R0Qsa0VBb0JDO0FBb0NELGdFQVNDO0FBOEhELGtFQW9CQztBQXNIRCxnRkFxQkM7QUE4REQsZ0ZBYUM7QUEyQkQsd0VBUUM7QUF1REQsNEVBWUM7QUF5Q0QsNERBVUM7QUE4Q0QsOEVBT0M7QUEyQkQsOERBUUM7QUEyQkQsb0VBUUM7QUFrREQsNEVBV0M7QUEwRkQsOERBaUJDO0FBMkJELHNFQVFDO0FBeUNELHNFQVVDO0FBOEVELDhEQWVDO0FBNklELDhFQXdCQztBQXlERCxzRUFZQztBQTZCRCwwRUFRQztBQTZCRCw4RkFRQztBQWtDRCxnR0FTQztBQTJERCxvRkFVQztBQXlDRCxzRkFRQztBQTJCRCw4RUFRQztBQThJRCxvRUFTQztBQW9DRCwwRkFTQztBQTRFRCxnR0FTQztBQXFDRCx3RUFRQztBQXJyRUQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDRCQUE0QixDQUFDLEdBQXNDO0lBQ2pGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDcEQsU0FBUyxFQUFFLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDbkQsU0FBUyxFQUFFLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDbkQsUUFBUSxFQUFFLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDaEQsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3ZCLENBQUM7SUFDRiwwQkFBMEI7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QUFDRCxvRkFBb0Y7QUFFcEY7Ozs7R0FJRztBQUNILElBQVksaUNBR1g7QUFIRCxXQUFZLGlDQUFpQztJQUMzQyxzQ0FBc0M7SUFDdEMsd0dBQW1FLENBQUE7QUFDckUsQ0FBQyxFQUhXLGlDQUFpQyxpREFBakMsaUNBQWlDLFFBRzVDO0FBcUJEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw4QkFBOEIsQ0FBQyxHQUF3QztJQUNyRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFdBQVcsRUFBRSxHQUFHLENBQUMsU0FBUztRQUMxQixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07S0FDckIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBQ0Qsb0ZBQW9GIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibm9kZSAuL3Byb2plbi5qc1wiLlxuLyoqXG4gKiBAc2NoZW1hIFBvbGFyaXNDb3Zlcml0eVNjaGVtYVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvbGFyaXNDb3Zlcml0eVNjaGVtYSB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIFBvbGFyaXNDb3Zlcml0eVNjaGVtYSNhbmFseXplXG4gICAqL1xuICByZWFkb25seSBhbmFseXplPzogQW5hbHlzaXNDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFBvbGFyaXNDb3Zlcml0eVNjaGVtYSNjYWNoaW5nXG4gICAqL1xuICByZWFkb25seSBjYWNoaW5nPzogQ2FjaGluZ0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUG9sYXJpc0NvdmVyaXR5U2NoZW1hI2NhcHR1cmVcbiAgICovXG4gIHJlYWRvbmx5IGNhcHR1cmU/OiBDYXB0dXJlQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBQb2xhcmlzQ292ZXJpdHlTY2hlbWEjY29tbWl0XG4gICAqL1xuICByZWFkb25seSBjb21taXQ6IENvbW1pdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGluIHVzZS5cbiAgICpcbiAgICogQHNjaGVtYSBQb2xhcmlzQ292ZXJpdHlTY2hlbWEjdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUG9sYXJpc0NvdmVyaXR5U2NoZW1hJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUG9sYXJpc0NvdmVyaXR5U2NoZW1hKG9iajogUG9sYXJpc0NvdmVyaXR5U2NoZW1hIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYW5hbHl6ZSc6IHRvSnNvbl9BbmFseXNpc0NvbmZpZ3VyYXRpb24ob2JqLmFuYWx5emUpLFxuICAgICdjYWNoaW5nJzogdG9Kc29uX0NhY2hpbmdDb25maWd1cmF0aW9uKG9iai5jYWNoaW5nKSxcbiAgICAnY2FwdHVyZSc6IHRvSnNvbl9DYXB0dXJlQ29uZmlndXJhdGlvbihvYmouY2FwdHVyZSksXG4gICAgJ2NvbW1pdCc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uKG9iai5jb21taXQpLFxuICAgICd2ZXJzaW9uJzogb2JqLnZlcnNpb24sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgaG93IHRoZSBwcm9qZWN0IHNob3VsZCBiZSBhbmFseXplZC5cbiAqXG4gKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXNpc0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBhZ2dyZXNzaXZlbmVzcyBsZXZlbCBmb3IgdGhlIGFuYWx5c2lzLiBUaGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgY2F1c2VzIHRoZSBhbmFseXNpcyB0byBtYWtlIG1vcmUgb3IgbGVzcyBhZ2dyZXNzaXZlIGFzc3VtcHRpb25zIGR1cmluZyB0aGUgYW5hbHlzaXMgd2hlcmUgdGhlIGhpZ2hlciB0aGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgdGhlIG1vcmUgZGVmZWN0cyBhcmUgcmVwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNhZ2dyZXNzaXZlbmVzcy1sZXZlbFxuICAgKi9cbiAgcmVhZG9ubHkgYWdncmVzc2l2ZW5lc3NMZXZlbD86IEFuYWx5c2lzQ29uZmlndXJhdGlvbkFnZ3Jlc3NpdmVuZXNzTGV2ZWw7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgYW5hbHlzaXMgb2YgY2FsbHMgdG8gZnVuY3Rpb24gcG9pbnRlcnMgZm9yIGRlZmVjdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNjLWNwcC1mbnB0clxuICAgKi9cbiAgcmVhZG9ubHkgY0NwcEZucHRyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBmdWxsIHZpcnR1YWwtY2FsbCByZXNvbHV0aW9uIGZvciBDKysuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNjLWNwcC12aXJ0dWFsXG4gICAqL1xuICByZWFkb25seSBjQ3BwVmlydHVhbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgY2FsbGdyYXBoIG1ldHJpY3Mgb3V0cHV0IGluIHRoZSBpbnRlcm1lZGlhdGUgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jY2FsbGdyYXBoLW1ldHJpY3NcbiAgICovXG4gIHJlYWRvbmx5IGNhbGxncmFwaE1ldHJpY3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBubyBjaGVja2VyIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWVkLCB0aGUgQ0xJIHdpbGwgZW5hYmxlIGEgc2V0IG9mIGNoZWNrZXJzIGJhc2VkIG9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgY2FwdHVyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNjaGVja2Vyc1xuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2tlcnM/OiBDaGVja2VyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogSWYgc3BlY2lmaWVkLCB0aGUgYW5hbHlzaXMgd2lsbCBzY2FuIHRoZSBjb2RlIGZvciBjb21wbGlhbmNlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29kaW5nIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24uIElmIHRoaXMgY29uZmlndXJhdGlvbiBpcyBwcmVzZW50LCB0aGUgY2FwdHVyZSBcImVtaXQtY29tcGxlbWVudGFyeS1pbmZvXCIgZmxhZyB3aWxsIGJlIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jY29kaW5nLXN0YW5kYXJkc1xuICAgKi9cbiAgcmVhZG9ubHkgY29kaW5nU3RhbmRhcmRzPzogQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb3Zlcml0eSBDb25uZWN0IGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gcGVyZm9ybWluZyBhbmFseXNpcyBpbiBDb3Zlcml0eSBDb25uZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jY29ubmVjdFxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdD86IEFuYWx5emVDb25uZWN0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBhZGRpdGlvbmFsIGZpbHRlcmluZyBvZiBkZWZlY3RzIGJ5IHVzaW5nIGFuIGFkZGl0aW9uYWwgZmFsc2UtcGF0aCBwcnVuZXIuIElmIHNldCB0byB0cnVlLCB0aGUgY29uc3RyYWludCBGUFAgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI2NvbnN0cmFpbnQtZnBwXG4gICAqL1xuICByZWFkb25seSBjb25zdHJhaW50RnBwPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBjb3YtYW5hbHl6ZSB3aGVuIGRvaW5nIGFuYWx5c2lzLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jY292LWFuYWx5emUtYXJnc1xuICAgKi9cbiAgcmVhZG9ubHkgY292QW5hbHl6ZUFyZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBjb3YtY29sbGVjdC1tb2RlbHMgZm9sbG93aW5nIGFuYWx5c2lzIHdoZW4gXCJvdXRwdXQtbW9kZWwtZmlsZVwiIGlzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI2Nvdi1jb2xsZWN0LW1vZGVscy1hcmdzXG4gICAqL1xuICByZWFkb25seSBjb3ZDb2xsZWN0TW9kZWxzQXJncz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgZGlyZWN0aXZlcyB0byB1c2UgZm9yIHRoZSBhbmFseXNpcywgaW5jbHVkaW5nIGZvciB3ZWIgYXBwbGljYXRpb24gc2VjdXJpdHkgYW5hbHlzaXMuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNkaXJlY3RpdmVzXG4gICAqL1xuICByZWFkb25seSBkaXJlY3RpdmVzPzogRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoaWNoIGZpbGVzIHRvIGFuYWx5emUgd2hlbiB0aGUgXCJhbmFseXplLm1vZGVcIiBzZXR0aW5nIGlzIFwiaGZpXCIuIEFuYWx5c2lzIHdpbGwgYmUgcGVyZm9ybWVkIGZvciBvbmx5IHRoZXNlIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGZpbGVzPzogQW5hbHl6ZUZpbGVzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFuYWx5c2lzIHdvcmtlciBwYXJhbGxlbGlzbS5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI2pvYnNcbiAgICovXG4gIHJlYWRvbmx5IGpvYnM/OiBKb2JzQ29uZmlndXJhdGlvbltdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgYW5hbHlzaXMgc2hvdWxkIGJlIGRvbmUgbG9jYWxseSwgaW4gQ292ZXJpdHkgQ29ubmVjdCwgb3IgaW4gU29mdHdhcmUgUmlzayBNYW5hZ2VyLiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSBhcyBmb2xsb3dzOiBjb25uZWN0IC0gUnVuIHRoZSBhbmFseXNpcyBpbiB0aGUgQ292ZXJpdHkgQ29ubmVjdCBqb2IgZmFybTsgc3JtIC0gUnVuIHRoZSBhbmFseXNpcyBpbiB0aGUgU29mdHdhcmUgUmlzayBNYW5hZ2VyIGpvYiBmYXJtOyBsb2NhbCAtIFJ1biB0aGUgYW5hbHlzaXMgbG9jYWxseVxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jbG9jYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogQW5hbHlzaXNDb25maWd1cmF0aW9uTG9jYXRpb247XG5cbiAgLyoqXG4gICAqIEFuYWx5c2lzIG1vZGU6IFwicGZpXCIgKHBlcmZlY3QgZmlkZWxpdHkgaW5jcmVtZW50YWwpIGZvciBjb21wbGV0ZSBhbmFseXNpczsgb3IgXCJoZmlcIiAoaGlnaCBmaWRlbGl0eSBpbmNyZW1lbnRhbCkgZm9yIGFuYWx5c2lzIG9mIG9ubHkgc3BlY2lmaWMgZmlsZXMgc3BlY2lmaWVkIGJ5IGFuYWx5emUuZmlsZXMgc2V0dGluZ3MsIG9taXR0aW5nIGFueSBvdGhlciBmaWxlcyB3aGljaCBtYXkgaGF2ZSBiZWVuIGluY2lkZW50YWxseSBjYXB0dXJlZCBieSB0aGUgYnVpbGQuIEFuIFwiaGZpXCIgYW5hbHlzaXMgY2FuIGJlIGZhc3RlciBidXQgbWF5IHByb2R1Y2UgcmVzdWx0cyB3aGljaCBhcmUgaW5jb21wbGV0ZSBvciBpbmNvbnNpc3RlbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBjb250ZXh0LCBhbmQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHNwZWVkIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gYWNjdXJhY3kuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNtb2RlXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogQW5hbHlzaXNDb25maWd1cmF0aW9uTW9kZTtcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIGZ1bmN0aW9uIG1vZGVscy4gVGhpcyBvdmVycmlkZXMgbW9kZWxzIHNwZWNpZmllZCBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiBcImNvbmZpZy91c2VyX21vZGVscy54bWxkYlwiLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jbW9kZWwtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZWxGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdG8gdHJ1ZSwgb25seSBvbmUgVFUgKHRyYW5zbGF0aW9uIHVuaXQpIHdpbGwgYmUgYW5hbHl6ZWQgcGVyIHNvdXJjZSBmaWxlIG5hbWUuIElmIHNldCB0byBmYWxzZSwgYWxsIHRyYW5zbGF0aW9uIHVuaXRzIHdpbGwgYmUgYW5hbHl6ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNvbmUtdHUtcGVyLXBzZlxuICAgKi9cbiAgcmVhZG9ubHkgb25lVHVQZXJQc2Y/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPdXRwdXQgZmlsZSB0byB3aGljaCBmdW5jdGlvbiBtb2RlbHMgZm9yIHRoZSBwcm9qZWN0IHNob3VsZCBiZSB3cml0dGVuIGZvbGxvd2luZyBhbmFseXNpcy5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI291dHB1dC1tb2RlbC1maWxlXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRNb2RlbEZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgcGFyc2Ugd2FybmluZ3MgYXJlIGhhbmRsZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNwYXJzZS13YXJuaW5nc1xuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VXYXJuaW5ncz86IFBhcnNlV2FybmluZ3NDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgdGhlIGNvbGxlY3Rpb24gb2Ygc2NhbiB0cmFuc3BhcmVuY3kgZGF0YSBmb3IgYW5hbHlzaXMuIFRoaXMgc2V0dGluZyBtdXN0IGJlIGVuYWJsZWQgaWYgdGhlIENvdmVyaXR5IENvbm5lY3QgaW5zdGFuY2UgaGFzICdzY2FuLnRyYW5zcGFyZW5jeS5lbmFibGVkPXRydWUnIGluIGl0cyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jc2Nhbi10cmFuc3BhcmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHNjYW5UcmFuc3BhcmVuY3k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgU2lnbWEgYW5hbHlzaXMuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNzaWdtYVxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbWE/OiBTaWdtYUNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBtYXAgZnJvbSB0cnVzdCBvcHRpb24gbmFtZSB0byBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHBhcnRpY3VsYXIgdHJ1c3QgcHJvcGVydHkgc2hvdWxkIGJlIHRydXN0ZWQgb3IgZGlzdHJ1c3RlZC4gVGhlIHRydXN0IG9wdGlvbiBcImFsbFwiIGNvbnRyb2xzIHdoZXRoZXIgYWxsIHRydXN0IG9wdGlvbnMgc2hvdWxkIGJlIHRydXN0ZWQgb3IgZGlzdHJ1c3RlZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI3RydXN0XG4gICAqL1xuICByZWFkb25seSB0cnVzdD86IGFueTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQW5hbHlzaXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQW5hbHlzaXNDb25maWd1cmF0aW9uKG9iajogQW5hbHlzaXNDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWdncmVzc2l2ZW5lc3MtbGV2ZWwnOiBvYmouYWdncmVzc2l2ZW5lc3NMZXZlbCxcbiAgICAnYy1jcHAtZm5wdHInOiBvYmouY0NwcEZucHRyLFxuICAgICdjLWNwcC12aXJ0dWFsJzogb2JqLmNDcHBWaXJ0dWFsLFxuICAgICdjYWxsZ3JhcGgtbWV0cmljcyc6IG9iai5jYWxsZ3JhcGhNZXRyaWNzLFxuICAgICdjaGVja2Vycyc6IHRvSnNvbl9DaGVja2VyQ29uZmlndXJhdGlvbihvYmouY2hlY2tlcnMpLFxuICAgICdjb2Rpbmctc3RhbmRhcmRzJzogdG9Kc29uX0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouY29kaW5nU3RhbmRhcmRzKSxcbiAgICAnY29ubmVjdCc6IHRvSnNvbl9BbmFseXplQ29ubmVjdENvbmZpZ3VyYXRpb24ob2JqLmNvbm5lY3QpLFxuICAgICdjb25zdHJhaW50LWZwcCc6IG9iai5jb25zdHJhaW50RnBwLFxuICAgICdjb3YtYW5hbHl6ZS1hcmdzJzogb2JqLmNvdkFuYWx5emVBcmdzPy5tYXAoeSA9PiB5KSxcbiAgICAnY292LWNvbGxlY3QtbW9kZWxzLWFyZ3MnOiBvYmouY292Q29sbGVjdE1vZGVsc0FyZ3M/Lm1hcCh5ID0+IHkpLFxuICAgICdkaXJlY3RpdmVzJzogb2JqLmRpcmVjdGl2ZXM/Lm1hcCh5ID0+IHRvSnNvbl9EaXJlY3RpdmVzQ29uZmlndXJhdGlvbih5KSksXG4gICAgJ2ZpbGVzJzogdG9Kc29uX0FuYWx5emVGaWxlc0NvbmZpZ3VyYXRpb24ob2JqLmZpbGVzKSxcbiAgICAnam9icyc6IG9iai5qb2JzPy5tYXAoeSA9PiB0b0pzb25fSm9ic0NvbmZpZ3VyYXRpb24oeSkpLFxuICAgICdsb2NhdGlvbic6IG9iai5sb2NhdGlvbixcbiAgICAnbW9kZSc6IG9iai5tb2RlLFxuICAgICdtb2RlbC1maWxlJzogb2JqLm1vZGVsRmlsZSxcbiAgICAnb25lLXR1LXBlci1wc2YnOiBvYmoub25lVHVQZXJQc2YsXG4gICAgJ291dHB1dC1tb2RlbC1maWxlJzogb2JqLm91dHB1dE1vZGVsRmlsZSxcbiAgICAncGFyc2Utd2FybmluZ3MnOiB0b0pzb25fUGFyc2VXYXJuaW5nc0NvbmZpZ3VyYXRpb24ob2JqLnBhcnNlV2FybmluZ3MpLFxuICAgICdzY2FuLXRyYW5zcGFyZW5jeSc6IG9iai5zY2FuVHJhbnNwYXJlbmN5LFxuICAgICdzaWdtYSc6IHRvSnNvbl9TaWdtYUNvbmZpZ3VyYXRpb24ob2JqLnNpZ21hKSxcbiAgICAndHJ1c3QnOiBvYmoudHJ1c3QsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgaG93IHRoZSBDTEkgc2hvdWxkIGhhbmRsZSBjYWNoaW5nIHdoZW4gcGVyZm9ybWluZyBjYXB0dXJlL2FuYWx5c2lzLlxuICpcbiAqIEBzY2hlbWEgY2FjaGluZy1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGluZ0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQSB0cnVlIHZhbHVlIGluZGljYXRlcyBjYWNoaW5nIHdpbGwgYmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgcmVtb3RlIGFuYWx5c2lzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhY2hpbmctY29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ2FjaGluZ0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9DYWNoaW5nQ29uZmlndXJhdGlvbihvYmo6IENhY2hpbmdDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIGhvdyB0aGUgcHJvamVjdCBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKlxuICogQHNjaGVtYSBjYXB0dXJlLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBidWlsZCBjb21tYW5kIGluZmVyZW5jZS4gSWYgYnVpbGQgY29tbWFuZCBpbmZlcmVuY2UgaXMgZGlzYWJsZWQgYW5kIG5vIGJ1aWxkIGNvbW1hbmQgaXMgcHJvdmlkZWQgdGhlbiBubyBhdHRlbXB0IGF0IGJ1aWxkIGNhcHR1cmUgd2lsbCBiZSBtYWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNidWlsZC1jb21tYW5kLWluZmVyZW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kSW5mZXJlbmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoaWNoIGNvbXBpbGVycyB0byBjb25maWd1cmUuIEJ5IGRlZmF1bHQsIHRlbXBsYXRlIGNvbXBpbGVycyBhcmUgY29uZmlndXJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBjYXB0dXJlLWNvbmZpZ3VyYXRpb24jY29tcGlsZXItY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGlsZXJDb25maWd1cmF0aW9uPzogQ29tcGlsZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNjb3YtdHJhbnNsYXRlXG4gICAqL1xuICByZWFkb25seSBjb3ZUcmFuc2xhdGU/OiBDb3ZUcmFuc2xhdGVDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBlbWl0IHByb2Nlc3MgbmVlZGVkIGZvciB0aGUgY29tcGxpYW5jZSBjaGVja2Vycy4gSWYgYSBcImNvZGluZy1zdGFuZGFyZHNcIiBjb25maWd1cmF0aW9uIGlzIHByZXNlbnQgdGhlbiB0aGlzIGZsYWcgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNlbWl0LWNvbXBsZW1lbnRhcnktaW5mb1xuICAgKi9cbiAgcmVhZG9ubHkgZW1pdENvbXBsZW1lbnRhcnlJbmZvPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiBwYXJzaW5nIGFuZCBlbWl0dGluZyB0aGUgc291cmNlIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNlbmNvZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZW5jb2Rpbmc/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWluaW11bSBwZXJjZW50YWdlIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBjYXB0dXJlZCBpbiBvcmRlciB0byBwcm9jZWVkIHdpdGggdGhlIGFuYWx5c2lzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNmYWlsdXJlLXRocmVzaG9sZC1wZXJjZW50XG4gICAqL1xuICByZWFkb25seSBmYWlsdXJlVGhyZXNob2xkUGVyY2VudD86IG51bWJlcjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoaWNoIG5vbi1jb21waWxlZCBmaWxlcyB0byBjYXB0dXJlLiBCeSBkZWZhdWx0LCBhbGwgZmlsZXMgYXJlIGNhcHR1cmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsZXM/OiBGaWxlc0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJlc29sdXRpb24gb2YgTWF2ZW4sIEdyYWRsZSBhbmQgTVNCdWlsZCBkZXBlbmRlbmNpZXMgZXZlbiBpZiB0aGlzIGlzIG5vdCBuZWVkZWQgYmFzZWQgb24gdGhlIGRldGVjdGVkIHNvdXJjZSBsYW5ndWFnZXMgaW4gdGhlIHByb2plY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgY2FwdHVyZS1jb25maWd1cmF0aW9uI2ZvcmNlLWRlcGVuZGVuY3ktcmVzb2x1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VEZXBlbmRlbmN5UmVzb2x1dGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGljaCBsYW5ndWFnZXMgdG8gaW5jbHVkZSBvciBleGNsdWRlIGZvciBjYXB0dXJlLiBCeSBkZWZhdWx0LCBhbGwgbGFuZ3VhZ2VzIGFyZSBjYXB0dXJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBjYXB0dXJlLWNvbmZpZ3VyYXRpb24jbGFuZ3VhZ2VzXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZXM/OiBMYW5ndWFnZXNDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRvIGltcG9ydCBkYXRhIGFib3V0IHNvdXJjZSBmaWxlIGNoYW5nZXMgZnJvbSB0aGUgc291cmNlIGNvbnRyb2wgbWFuYWdlbWVudCBzeXN0ZW0uXG4gICAqXG4gICAqIEBzY2hlbWEgY2FwdHVyZS1jb25maWd1cmF0aW9uI2ltcG9ydC1zY21cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydFNjbT86IEltcG9ydFNjbUNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGxpbWl0IHRoZSBncm91cCBvZiBlbWl0dGVkIEpBUiBmaWxlcyB0byB0aG9zZSBuZWVkZWQgZm9yIGNvbXBpbGF0aW9uIG9mIHRoZSBKYXZhIGZpbGVzLiBUaGUgZGVmYXVsdCBiZWhhdmlvciB3aXRob3V0IHRoaXMgb3B0aW9uIGlzIHRvIGVtaXQgYWxsIHRoZSBKQVIgZmlsZXMgaW4gdGhlIGNsYXNzcGF0aCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgcmVmZXJlbmNlZCBieSBhIEphdmEgZmlsZSBpbiB0aGUgY29tcGlsYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY2FwdHVyZS1jb25maWd1cmF0aW9uI21pbmltYWwtY2xhc3NwYXRoLWVtaXRcbiAgICovXG4gIHJlYWRvbmx5IG1pbmltYWxDbGFzc3BhdGhFbWl0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gZG8gYSBjb21wbGV0ZSBjYXB0dXJlIG9yIGEgcmVjb3JkIHdpdGggc291cmNlIGNhcHR1cmUuXG4gICAqXG4gICAqIEBzY2hlbWEgY2FwdHVyZS1jb25maWd1cmF0aW9uI3JlY29yZC13aXRoLXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3JkV2l0aFNvdXJjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgc2VjdXJpdHkgZHluYW1pYyBhbmFseXNpcy4gSWYgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0KSwgc2VjdXJpdHkgZHluYW1pYyBhbmFseXNpcyBpcyBydW4gYXMgcGFydCBvZiB0aGUgY2FwdHVyZSBzdGVwLiBJZiBzZXQgdG8gZmFsc2UsIHNlY3VyaXR5IGR5bmFtaWMgYW5hbHlzaXMgaXMgbm90IHJ1bi5cbiAgICpcbiAgICogQHNjaGVtYSBjYXB0dXJlLWNvbmZpZ3VyYXRpb24jc2VjdXJpdHktZGFcbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5RGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNidWlsZC1jYXB0dXJlXG4gICAqL1xuICByZWFkb25seSBidWlsZENhcHR1cmU/OiBCdWlsZENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0NhcHR1cmVDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ2FwdHVyZUNvbmZpZ3VyYXRpb24ob2JqOiBDYXB0dXJlQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2J1aWxkLWNvbW1hbmQtaW5mZXJlbmNlJzogb2JqLmJ1aWxkQ29tbWFuZEluZmVyZW5jZSxcbiAgICAnY29tcGlsZXItY29uZmlndXJhdGlvbic6IHRvSnNvbl9Db21waWxlckNvbmZpZ3VyYXRpb24ob2JqLmNvbXBpbGVyQ29uZmlndXJhdGlvbiksXG4gICAgJ2Nvdi10cmFuc2xhdGUnOiB0b0pzb25fQ292VHJhbnNsYXRlQ29uZmlndXJhdGlvbihvYmouY292VHJhbnNsYXRlKSxcbiAgICAnZW1pdC1jb21wbGVtZW50YXJ5LWluZm8nOiBvYmouZW1pdENvbXBsZW1lbnRhcnlJbmZvLFxuICAgICdlbmNvZGluZyc6IG9iai5lbmNvZGluZyxcbiAgICAnZmFpbHVyZS10aHJlc2hvbGQtcGVyY2VudCc6IG9iai5mYWlsdXJlVGhyZXNob2xkUGVyY2VudCxcbiAgICAnZmlsZXMnOiB0b0pzb25fRmlsZXNDb25maWd1cmF0aW9uKG9iai5maWxlcyksXG4gICAgJ2ZvcmNlLWRlcGVuZGVuY3ktcmVzb2x1dGlvbic6IG9iai5mb3JjZURlcGVuZGVuY3lSZXNvbHV0aW9uLFxuICAgICdsYW5ndWFnZXMnOiB0b0pzb25fTGFuZ3VhZ2VzQ29uZmlndXJhdGlvbihvYmoubGFuZ3VhZ2VzKSxcbiAgICAnaW1wb3J0LXNjbSc6IHRvSnNvbl9JbXBvcnRTY21Db25maWd1cmF0aW9uKG9iai5pbXBvcnRTY20pLFxuICAgICdtaW5pbWFsLWNsYXNzcGF0aC1lbWl0Jzogb2JqLm1pbmltYWxDbGFzc3BhdGhFbWl0LFxuICAgICdyZWNvcmQtd2l0aC1zb3VyY2UnOiBvYmoucmVjb3JkV2l0aFNvdXJjZSxcbiAgICAnc2VjdXJpdHktZGEnOiBvYmouc2VjdXJpdHlEYSxcbiAgICAnYnVpbGQtY2FwdHVyZSc6IHRvSnNvbl9CdWlsZENvbmZpZ3VyYXRpb24ob2JqLmJ1aWxkQ2FwdHVyZSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hlcmUgdGhlIGFuYWx5c2lzIHJlc3VsdHMgc2hvdWxkIGJlIHNlbnQuXG4gKlxuICogQHNjaGVtYSBjb21taXQtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1pdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ292ZXJpdHkgQ29ubmVjdCBjb25maWd1cmF0aW9uIHRvIHVzZSB3aGVuIGNvbW1pdHRpbmcgZGVmZWN0cyB0byBDb3Zlcml0eSBDb25uZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbW1pdC1jb25maWd1cmF0aW9uI2Nvbm5lY3RcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Q/OiBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdDtcblxuICAvKipcbiAgICogU29mdHdhcmUgUmlzayBNYW5hZ2VyIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc3RvcmluZyBkZWZlY3RzIGluIFNvZnR3YXJlIFJpc2sgTWFuYWdlci5cbiAgICpcbiAgICogQHNjaGVtYSBjb21taXQtY29uZmlndXJhdGlvbiNzcm1cbiAgICovXG4gIHJlYWRvbmx5IHNybT86IENvbW1pdENvbmZpZ3VyYXRpb25Tcm07XG5cbiAgLyoqXG4gICAqIExvY2FsIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2F2aW5nIGRlZmVjdHMgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbW1pdC1jb25maWd1cmF0aW9uI2xvY2FsXG4gICAqL1xuICByZWFkb25seSBsb2NhbD86IENvbW1pdENvbmZpZ3VyYXRpb25Mb2NhbDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29tbWl0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvbW1pdENvbmZpZ3VyYXRpb24ob2JqOiBDb21taXRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29ubmVjdCc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uQ29ubmVjdChvYmouY29ubmVjdCksXG4gICAgJ3NybSc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uU3JtKG9iai5zcm0pLFxuICAgICdsb2NhbCc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uTG9jYWwob2JqLmxvY2FsKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgZm9yIHRoZSBhbmFseXNpcy4gVGhlIGFnZ3Jlc3NpdmVuZXNzIGxldmVsIGNhdXNlcyB0aGUgYW5hbHlzaXMgdG8gbWFrZSBtb3JlIG9yIGxlc3MgYWdncmVzc2l2ZSBhc3N1bXB0aW9ucyBkdXJpbmcgdGhlIGFuYWx5c2lzIHdoZXJlIHRoZSBoaWdoZXIgdGhlIGFnZ3Jlc3NpdmVuZXNzIGxldmVsIHRoZSBtb3JlIGRlZmVjdHMgYXJlIHJlcG9ydGVkLlxuICpcbiAqIEBzY2hlbWEgQW5hbHlzaXNDb25maWd1cmF0aW9uQWdncmVzc2l2ZW5lc3NMZXZlbFxuICovXG5leHBvcnQgZW51bSBBbmFseXNpc0NvbmZpZ3VyYXRpb25BZ2dyZXNzaXZlbmVzc0xldmVsIHtcbiAgLyoqIGxvdyAqL1xuICBMT1cgPSBcImxvd1wiLFxuICAvKiogbWVkaXVtICovXG4gIE1FRElVTSA9IFwibWVkaXVtXCIsXG4gIC8qKiBoaWdoICovXG4gIEhJR0ggPSBcImhpZ2hcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGFsbCBjaGVja2VycyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jYWxsXG4gICAqL1xuICByZWFkb25seSBhbGw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbGwgc2VjdXJpdHkgY2hlY2tlcnMgc2hvdWxkIGJlIGVuYWJsZWQuIFRoaXMgaW5jbHVkZXMgdGhlIFNlY3VyaXR5LCBBbmRyb2lkIFNlY3VyaXR5LCBhbmQgV2ViIEFwcCBTZWN1cml0eSBjYXRlZ29yaWVzLCBhbmQgb3RoZXIgc2VjdXJpdHkgY2hlY2tlcnMgdGhhdCByZXF1aXJlIGV4cGxpY2l0IGVuYWJsZW1lbnQuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI2FsbC1zZWN1cml0eVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsU2VjdXJpdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyBhbmRyb2lkIHNlY3VyaXR5IGNoZWNrZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvbiNhbmRyb2lkLXNlY3VyaXR5XG4gICAqL1xuICByZWFkb25seSBhbmRyb2lkU2VjdXJpdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIGF1ZGl0IGNoZWNrZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvbiNhdWRpdFxuICAgKi9cbiAgcmVhZG9ubHkgYXVkaXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYnJha2VtYW4gY2hlY2tlcnMgc2hvdWxkIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI2JyYWtlbWFuXG4gICAqL1xuICByZWFkb25seSBicmFrZW1hbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgQywgQysrLCBPYmplY3RpdmUtQywgT2JqZWN0aXZlLUMrKyBzZWN1cml0eS1yZWxhdGVkIGNoZWNrZXJzIHRoYXQgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI2MtZmFtaWx5LXNlY3VyaXR5XG4gICAqL1xuICByZWFkb25seSBjRmFtaWx5U2VjdXJpdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNYXAgZnJvbSBjaGVja2VyIG5hbWUgdG8gY29uZmlndXJhdGlvbiBmb3IgdGhlIGNoZWNrZXIuXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjaGVja2VyIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdCBhbmQgYWxsb3dzIHVzZXJzIHRvIHNldCBvcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjaGVja2VyLlxuICAgKlxuICAgKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvbiNjaGVja2VyLWNvbmZpZ1xuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2tlckNvbmZpZz86IGFueTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIENvZGVYTSAoLmN4bSkgZmlsZXMgdG8gdXNlIGluIHRoZSBhbmFseXNpcy5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jY29kZXhtXG4gICAqL1xuICByZWFkb25seSBjb2RleG0/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRW5hYmxlcyBDLCBDKysgY29uY3VycmVuY3kgY2hlY2tlcnMgdGhhdCBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jY29uY3VycmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSBkZWZhdWx0IHNldCBvZiBjaGVja2Vycy4gSWYgc2V0IHRvIHRydWUsIHRoZSBkZWZhdWx0IHNldCBvZiBjaGVja2VycyBpcyBlbmFibGVkLiBTZXQgdG8gZmFsc2UgdG8gZ2V0IG1vcmUgY29udHJvbCBvdmVyIHdoaWNoIGNoZWNrZXJzIGFyZSBlbmFibGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvbiNkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBQTUQgZm9yIEFwZXggYW5hbHlzaXMuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI3BtZFxuICAgKi9cbiAgcmVhZG9ubHkgcG1kPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyByZWNvbW1lbmRlZCBzZWN1cml0eSBjaGVja2Vycy5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jcmVjb21tZW5kZWQtc2VjdXJpdHktY2hlY2tlcnNcbiAgICovXG4gIHJlYWRvbmx5IHJlY29tbWVuZGVkU2VjdXJpdHlDaGVja2Vycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgQywgQysrIHJ1bGUgY2hlY2tlcnMuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI3J1bGVcbiAgICovXG4gIHJlYWRvbmx5IHJ1bGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHdlYiBhcHBsaWNhdGlvbiBzZWN1cml0eSBhbmFseXNpcyBzaG91bGQgYmUgZG9uZS5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jd2ViYXBwLXNlY3VyaXR5XG4gICAqL1xuICByZWFkb25seSB3ZWJhcHBTZWN1cml0eT86IENoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0NoZWNrZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ2hlY2tlckNvbmZpZ3VyYXRpb24ob2JqOiBDaGVja2VyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FsbCc6IG9iai5hbGwsXG4gICAgJ2FsbC1zZWN1cml0eSc6IG9iai5hbGxTZWN1cml0eSxcbiAgICAnYW5kcm9pZC1zZWN1cml0eSc6IG9iai5hbmRyb2lkU2VjdXJpdHksXG4gICAgJ2F1ZGl0Jzogb2JqLmF1ZGl0LFxuICAgICdicmFrZW1hbic6IG9iai5icmFrZW1hbixcbiAgICAnYy1mYW1pbHktc2VjdXJpdHknOiBvYmouY0ZhbWlseVNlY3VyaXR5LFxuICAgICdjaGVja2VyLWNvbmZpZyc6IG9iai5jaGVja2VyQ29uZmlnLFxuICAgICdjb2RleG0nOiBvYmouY29kZXhtPy5tYXAoeSA9PiB5KSxcbiAgICAnY29uY3VycmVuY3knOiBvYmouY29uY3VycmVuY3ksXG4gICAgJ2RlZmF1bHQnOiBvYmouZGVmYXVsdCxcbiAgICAncG1kJzogb2JqLnBtZCxcbiAgICAncmVjb21tZW5kZWQtc2VjdXJpdHktY2hlY2tlcnMnOiBvYmoucmVjb21tZW5kZWRTZWN1cml0eUNoZWNrZXJzLFxuICAgICdydWxlJzogb2JqLnJ1bGUsXG4gICAgJ3dlYmFwcC1zZWN1cml0eSc6IHRvSnNvbl9DaGVja2VyQ29uZmlndXJhdGlvbldlYmFwcFNlY3VyaXR5KG9iai53ZWJhcHBTZWN1cml0eSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgQVVUT1NBUiBjb2RlIGNvbXBsaWFuY2UgY2hlY2tpbmcgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI2F1dG9zYXJjcHAxNFxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b3NhcmNwcDE0PzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgQ0VSVC1DIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jY2VydC1jXG4gICAqL1xuICByZWFkb25seSBjZXJ0Qz86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIENFUlQtQyBSZWNvbW1lbmRhdGlvbiBjb2RlIGNvbXBsaWFuY2UgY2hlY2tpbmcgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI2NlcnQtYy1yZWNvbW1lbmRhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2VydENSZWNvbW1lbmRhdGlvbj86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIENFUlQtQ1BQIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jY2VydC1jcHBcbiAgICovXG4gIHJlYWRvbmx5IGNlcnRDcHA/OiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBDRVJULUphdmEgY29kZSBjb21wbGlhbmNlIGNoZWNraW5nIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNjZXJ0LWphdmFcbiAgICovXG4gIHJlYWRvbmx5IGNlcnRKYXZhPzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgSFlVTkRBSS1DIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jaHl1bmRhaS1jXG4gICAqL1xuICByZWFkb25seSBoeXVuZGFpQz86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIEhZVU5EQUktQ1BQIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jaHl1bmRhaS1jcHBcbiAgICovXG4gIHJlYWRvbmx5IGh5dW5kYWlDcHA/OiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBIWVVOREFJLUphdmEgY29kZSBjb21wbGlhbmNlIGNoZWNraW5nIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNoeXVuZGFpLWphdmFcbiAgICovXG4gIHJlYWRvbmx5IGh5dW5kYWlKYXZhPzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byB0cnVlLCBhbnkgZGVmZWN0cyBmb3VuZCBpbiBjb2RlIGFubm90YXRlZCB1c2luZyB0aGUgI3ByYWdtYSBDb3Zlcml0eSBjb21wbGlhbmNlIGRpcmVjdGl2ZSB3aWxsIG5vdCBiZSByZXBvcnRlZCBpbiBDb3Zlcml0eSBDb25uZWN0LiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVmZWN0cyB0aGF0IHdlcmUgc3VwcHJlc3NlZCBjYW4gdGhlbiBiZSBmb3VuZCBpbiB0d28gZmlsZXM6IGRldmlhdGlvbnMudHh0IGRldmlhdGlvbnMtd2FybmluZ3MudHh0XG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jaWdub3JlLWRldmlhdGVkLWZpbmRpbmdzXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVEZXZpYXRlZEZpbmRpbmdzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBJU08gVFMgMTc5NjEgY29kZSBjb21wbGlhbmNlIGNoZWNraW5nIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNpc28tdHMxNzk2MVxuICAgKi9cbiAgcmVhZG9ubHkgaXNvVHMxNzk2MT86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIE1JU1JBIEMgMjAwNCBjb2RlIGNvbXBsaWFuY2UgY2hlY2tpbmcgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI21pc3JhYzIwMDRcbiAgICovXG4gIHJlYWRvbmx5IG1pc3JhYzIwMDQ/OiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBNSVNSQSBDIDIwMTIgY29kZSBjb21wbGlhbmNlIGNoZWNraW5nIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNtaXNyYWMyMDEyXG4gICAqL1xuICByZWFkb25seSBtaXNyYWMyMDEyPzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgTUlTUkEgQyAyMDIzIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jbWlzcmFjMjAyM1xuICAgKi9cbiAgcmVhZG9ubHkgbWlzcmFjMjAyMz86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIE1JU1JBIEMrKyAyMDA4IGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jbWlzcmFjcHAyMDA4XG4gICAqL1xuICByZWFkb25seSBtaXNyYWNwcDIwMDg/OiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBNSVNSQSBDKysgMjAyMyBjb2RlIGNvbXBsaWFuY2UgY2hlY2tpbmcgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI21pc3JhY3BwMjAyM1xuICAgKi9cbiAgcmVhZG9ubHkgbWlzcmFjcHAyMDIzPzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmo6IENvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F1dG9zYXJjcHAxNCc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouYXV0b3NhcmNwcDE0KSxcbiAgICAnY2VydC1jJzogdG9Kc29uX1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iai5jZXJ0QyksXG4gICAgJ2NlcnQtYy1yZWNvbW1lbmRhdGlvbic6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouY2VydENSZWNvbW1lbmRhdGlvbiksXG4gICAgJ2NlcnQtY3BwJzogdG9Kc29uX1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iai5jZXJ0Q3BwKSxcbiAgICAnY2VydC1qYXZhJzogdG9Kc29uX1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iai5jZXJ0SmF2YSksXG4gICAgJ2h5dW5kYWktYyc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouaHl1bmRhaUMpLFxuICAgICdoeXVuZGFpLWNwcCc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouaHl1bmRhaUNwcCksXG4gICAgJ2h5dW5kYWktamF2YSc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouaHl1bmRhaUphdmEpLFxuICAgICdpZ25vcmUtZGV2aWF0ZWQtZmluZGluZ3MnOiBvYmouaWdub3JlRGV2aWF0ZWRGaW5kaW5ncyxcbiAgICAnaXNvLXRzMTc5NjEnOiB0b0pzb25fU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ob2JqLmlzb1RzMTc5NjEpLFxuICAgICdtaXNyYWMyMDA0JzogdG9Kc29uX1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iai5taXNyYWMyMDA0KSxcbiAgICAnbWlzcmFjMjAxMic6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmoubWlzcmFjMjAxMiksXG4gICAgJ21pc3JhYzIwMjMnOiB0b0pzb25fU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ob2JqLm1pc3JhYzIwMjMpLFxuICAgICdtaXNyYWNwcDIwMDgnOiB0b0pzb25fU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ob2JqLm1pc3JhY3BwMjAwOCksXG4gICAgJ21pc3JhY3BwMjAyMyc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmoubWlzcmFjcHAyMDIzKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgYW5hbHl6ZS1jb25uZWN0LWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXplQ29ubmVjdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGF1dGhlbnRpY2F0aW9uIGtleSBmaWxlIHRvIHVzZSB3aGVuIGF1dGhlbnRpY2F0aW5nIHRvIENvdmVyaXR5IENvbm5lY3QgdG8gcGVyZm9ybSBhbmFseXNpcy4gQnkgZGVmYXVsdCwgdGhlIGZpbGUgbG9jYXRlZCBhdCAkSE9NRS8uY292ZXJpdHkvYWstPGhvc3RuYW1lPi08cG9ydD4gaXMgdXNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXplLWNvbm5lY3QtY29uZmlndXJhdGlvbiNhdXRoLWtleS1maWxlXG4gICAqL1xuICByZWFkb25seSBhdXRoS2V5RmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIGFkZGl0aW9uYWwgY2VydGlmaWNhdGVzIHRvIHRydXN0IGluIGFkZGl0aW9uIHRvIHRoZSBvbmVzIGluIHRoZSBzeXN0ZW0gY2VydGlmaWNhdGUgc3RvcmUgYW5kIHRoZSBDb3Zlcml0eSBURlQgc3RvcmUuIEJ5IGRlZmF1bHQgc3lzdGVtIENBIGNlcnRpZmljYXRlcyBhcmUgdXNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXplLWNvbm5lY3QtY29uZmlndXJhdGlvbiNjYS1jZXJ0cy1maWxlXG4gICAqL1xuICByZWFkb25seSBjYUNlcnRzRmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgaW4gUEVNIGZvcm1hdCwgdGhhdCBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSBwcm94eSB3aGVuIG1ha2luZyBhIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHl6ZS1jb25uZWN0LWNvbmZpZ3VyYXRpb24jcHJveHktY2xpZW50LWNlcnQtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlDbGllbnRDZXJ0RmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgcHJpdmF0ZSBrZXkgaW4gUEVNIGZvcm1hdCwgZm9yIHRoZSBwcm94eS1jbGllbnQtY2VydC1maWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtY29ubmVjdC1jb25maWd1cmF0aW9uI3Byb3h5LWNsaWVudC1rZXktZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlDbGllbnRLZXlGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVUkwgZm9yIGEgZm9yd2FyZCBwcm94eSB0byB1c2Ugd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggQ292ZXJpdHkgQ29ubmVjdC4gIE11c3QgYmUgYW4gaHR0cHMgVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtY29ubmVjdC1jb25maWd1cmF0aW9uI3Byb3h5LXVybFxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFydGlmYWN0cyB0byB1cGxvYWQgZm9sbG93aW5nIGFuYWx5c2lzIHdoZW4gdGhlIGFuYWx5c2lzIGxvY2F0aW9uIGlzIENvbm5lY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHl6ZS1jb25uZWN0LWNvbmZpZ3VyYXRpb24jdXBsb2FkLWFydGlmYWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgdXBsb2FkQXJ0aWZhY3RzPzogQW5hbHl6ZUNvbm5lY3RDb25maWd1cmF0aW9uVXBsb2FkQXJ0aWZhY3RzO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBVUkwgb2Ygd2hlcmUgdG8gcGVyZm9ybSBDb3Zlcml0eSBDb25uZWN0IGFuYWx5c2lzLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtY29ubmVjdC1jb25maWd1cmF0aW9uI3VybFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0FuYWx5emVDb25uZWN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0FuYWx5emVDb25uZWN0Q29uZmlndXJhdGlvbihvYmo6IEFuYWx5emVDb25uZWN0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F1dGgta2V5LWZpbGUnOiBvYmouYXV0aEtleUZpbGUsXG4gICAgJ2NhLWNlcnRzLWZpbGUnOiBvYmouY2FDZXJ0c0ZpbGUsXG4gICAgJ3Byb3h5LWNsaWVudC1jZXJ0LWZpbGUnOiBvYmoucHJveHlDbGllbnRDZXJ0RmlsZSxcbiAgICAncHJveHktY2xpZW50LWtleS1maWxlJzogb2JqLnByb3h5Q2xpZW50S2V5RmlsZSxcbiAgICAncHJveHktdXJsJzogb2JqLnByb3h5VXJsLFxuICAgICd1cGxvYWQtYXJ0aWZhY3RzJzogb2JqLnVwbG9hZEFydGlmYWN0cyxcbiAgICAndXJsJzogb2JqLnVybCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgZGlyZWN0aXZlcy1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU2VjdXJpdHkgZGlyZWN0aXZlcyBjb25maWd1cmF0aW9uIHRvIHVzZSBkdXJpbmcgdGhlIGFuYWx5c2lzLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJmaWxlXCIga2V5IGFuZCBpcyBzcGVjaWZpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgd2FudHMgdG8gaW4tbGluZSB0aGUgc2VjdXJpdHkgZGlyZWN0aXZlcyBjb25maWd1cmF0aW9uIGluIHRoZSBmaWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIGRpcmVjdGl2ZXMtY29uZmlndXJhdGlvbiNjb25maWdcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZz86IERpcmVjdGl2ZXNDb25maWd1cmF0aW9uQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBGaWxlIGNvbnRhaW5pbmcgc2VjdXJpdHkgZGlyZWN0aXZlcyB0byB1c2UgZHVyaW5nIHRoZSBhbmFseXNpcy4gVGhpcyBrZXkgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIFwiY29uZmlnXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIGRpcmVjdGl2ZXMtY29uZmlndXJhdGlvbiNmaWxlXG4gICAqL1xuICByZWFkb25seSBmaWxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdEaXJlY3RpdmVzQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0RpcmVjdGl2ZXNDb25maWd1cmF0aW9uKG9iajogRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWcnOiB0b0pzb25fRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWcob2JqLmNvbmZpZyksXG4gICAgJ2ZpbGUnOiBvYmouZmlsZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgYW5hbHl6ZS1maWxlcy1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHl6ZUZpbGVzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBHbG9iIHBhdHRlcm4gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gZXhjbHVkZSBmcm9tIGFuYWx5c2lzLiBOb3RlIHRoYXQgYW55IGluY2x1ZGUgZ2xvYiBwYXR0ZXJucyBhbmQgcmVndWxhciBleHByZXNzaW9ucyBhcmUgcHJvY2Vzc2VkIHByaW9yIHRvIGhhbmRsaW5nIGV4Y2x1ZGUgZ2xvYiBwYXR0ZXJucyBhbmQgcmVndWxhciBleHByZXNzaW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXplLWZpbGVzLWNvbmZpZ3VyYXRpb24jZXhjbHVkZS1nbG9iXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlR2xvYj86IHN0cmluZztcblxuICAvKipcbiAgICogUmVndWxhciBleHByZXNzaW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBzZXQgb2Ygc291cmNlIGZpbGVzIHRvIGV4Y2x1ZGUgZnJvbSBhbmFseXNpcy4gTm90ZSB0aGF0IGFueSBpbmNsdWRlIGdsb2IgcGF0dGVybnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHByb2Nlc3NlZCBwcmlvciB0byBoYW5kbGluZyBleGNsdWRlIGdsb2IgcGF0dGVybnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHl6ZS1maWxlcy1jb25maWd1cmF0aW9uI2V4Y2x1ZGUtcmVnZXhcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVSZWdleD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aHMgb2Ygc291cmNlIGZpbGVzIHRvIGFuYWx5emUuIEluY2x1ZGUgYW5kIGV4Y2x1ZGUgZ2xvYiBwYXR0ZXJucyBhbmQgcmVndWxhciBleHByZXNzaW9ucyBhcmUgYXBwbGllZCB0byBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlc2UgZmlsZXMgYXJlIGFjdHVhbGx5IGFuYWx5emVkLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtZmlsZXMtY29uZmlndXJhdGlvbiNpbmNsdWRlLWZpbGVzXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRmlsZXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdsb2IgcGF0dGVybiB0aGF0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHNvdXJjZSBmaWxlcyB0byBhbmFseXplLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtZmlsZXMtY29uZmlndXJhdGlvbiNpbmNsdWRlLWdsb2JcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVHbG9iPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWxlIGNvbnRhaW5pbmcgdGhlIHBhdGhzIG9mIHNvdXJjZSBmaWxlcyB0byBhbmFseXplLCBvbmUgcGVyIGxpbmUuIEluY2x1ZGUgYW5kIGV4Y2x1ZGUgZ2xvYiBwYXR0ZXJucyBhbmQgcmVndWxhciBleHByZXNzaW9ucyBhcmUgYXBwbGllZCB0byBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlc2UgZmlsZXMgYXJlIGFjdHVhbGx5IGFuYWx5emVkLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtZmlsZXMtY29uZmlndXJhdGlvbiNpbmNsdWRlLWxpc3QtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUxpc3RGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gYW5hbHl6ZS5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXplLWZpbGVzLWNvbmZpZ3VyYXRpb24jaW5jbHVkZS1yZWdleFxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZVJlZ2V4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdBbmFseXplRmlsZXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQW5hbHl6ZUZpbGVzQ29uZmlndXJhdGlvbihvYmo6IEFuYWx5emVGaWxlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdleGNsdWRlLWdsb2InOiBvYmouZXhjbHVkZUdsb2IsXG4gICAgJ2V4Y2x1ZGUtcmVnZXgnOiBvYmouZXhjbHVkZVJlZ2V4LFxuICAgICdpbmNsdWRlLWZpbGVzJzogb2JqLmluY2x1ZGVGaWxlcyxcbiAgICAnaW5jbHVkZS1nbG9iJzogb2JqLmluY2x1ZGVHbG9iLFxuICAgICdpbmNsdWRlLWxpc3QtZmlsZSc6IG9iai5pbmNsdWRlTGlzdEZpbGUsXG4gICAgJ2luY2x1ZGUtcmVnZXgnOiBvYmouaW5jbHVkZVJlZ2V4LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBqb2JzLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgbnVtYmVyIG9mIGFuYWx5c2lzIHdvcmtlcnMgdG8gcnVuIGluIHBhcmFsbGVsIGlzIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IGFuZCBudW1iZXIgb2YgbG9naWNhbCBwcm9jZXNzb3JzIGluIHRoZSBtYWNoaW5lLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciBhIG5vbi1GbGV4bmV0IGxpY2Vuc2UuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImNvdW50XCIgYW5kIFwibWF4XCIga2V5cy5cbiAgICpcbiAgICogQHNjaGVtYSBqb2JzLWNvbmZpZ3VyYXRpb24jYXV0b1xuICAgKi9cbiAgcmVhZG9ubHkgYXV0bz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBhbmFseXNpcyB3b3JrZXJzIHRvIHJ1biBpbiBwYXJhbGxlbC4gVGhpcyBrZXkgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIFwiYXV0b1wiIGFuZCBcIm1heFwiIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgam9icy1jb25maWd1cmF0aW9uI2NvdW50XG4gICAqL1xuICByZWFkb25seSBjb3VudD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgYW5hbHlzaXMgd29ya2VyIHRvIHJ1biBpbiBwYXJhbGxlbCwgc3ViamVjdCB0byBsaW1pdHMgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgYW5kIG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMgaW4gdGhlIG1hY2hpbmUuIEEgdmFsdWUgb2YgOCBpcyB0aGUgZGVmYXVsdCBmb3IgYSBGbGV4bmV0IGxpY2Vuc2UuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImF1dG9cIiBhbmQgXCJjb3VudFwiIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgam9icy1jb25maWd1cmF0aW9uI21heFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG51bWJlciBvZiBhbmFseXNpcyB3b3JrZXJzIHRvIGV4Y2VlZCB0aGUgcmVjb21tZW5kZWQgdmFsdWUuIFRoaXMga2V5IG1heSBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgXCJjb3VudFwiIGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBqb2JzLWNvbmZpZ3VyYXRpb24jb3ZlcnJpZGUtd29ya2VyLWxpbWl0XG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZVdvcmtlckxpbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSm9ic0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kb2JzQ29uZmlndXJhdGlvbihvYmo6IEpvYnNDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXV0byc6IG9iai5hdXRvLFxuICAgICdjb3VudCc6IG9iai5jb3VudCxcbiAgICAnbWF4Jzogb2JqLm1heCxcbiAgICAnb3ZlcnJpZGUtd29ya2VyLWxpbWl0Jzogb2JqLm92ZXJyaWRlV29ya2VyTGltaXQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgYW5hbHlzaXMgc2hvdWxkIGJlIGRvbmUgbG9jYWxseSwgaW4gQ292ZXJpdHkgQ29ubmVjdCwgb3IgaW4gU29mdHdhcmUgUmlzayBNYW5hZ2VyLiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSBhcyBmb2xsb3dzOiBjb25uZWN0IC0gUnVuIHRoZSBhbmFseXNpcyBpbiB0aGUgQ292ZXJpdHkgQ29ubmVjdCBqb2IgZmFybTsgc3JtIC0gUnVuIHRoZSBhbmFseXNpcyBpbiB0aGUgU29mdHdhcmUgUmlzayBNYW5hZ2VyIGpvYiBmYXJtOyBsb2NhbCAtIFJ1biB0aGUgYW5hbHlzaXMgbG9jYWxseVxuICpcbiAqIEBzY2hlbWEgQW5hbHlzaXNDb25maWd1cmF0aW9uTG9jYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gQW5hbHlzaXNDb25maWd1cmF0aW9uTG9jYXRpb24ge1xuICAvKiogbG9jYWwgKi9cbiAgTE9DQUwgPSBcImxvY2FsXCIsXG4gIC8qKiBjb25uZWN0ICovXG4gIENPTk5FQ1QgPSBcImNvbm5lY3RcIixcbiAgLyoqIHNybSAqL1xuICBTUk0gPSBcInNybVwiLFxufVxuXG4vKipcbiAqIEFuYWx5c2lzIG1vZGU6IFwicGZpXCIgKHBlcmZlY3QgZmlkZWxpdHkgaW5jcmVtZW50YWwpIGZvciBjb21wbGV0ZSBhbmFseXNpczsgb3IgXCJoZmlcIiAoaGlnaCBmaWRlbGl0eSBpbmNyZW1lbnRhbCkgZm9yIGFuYWx5c2lzIG9mIG9ubHkgc3BlY2lmaWMgZmlsZXMgc3BlY2lmaWVkIGJ5IGFuYWx5emUuZmlsZXMgc2V0dGluZ3MsIG9taXR0aW5nIGFueSBvdGhlciBmaWxlcyB3aGljaCBtYXkgaGF2ZSBiZWVuIGluY2lkZW50YWxseSBjYXB0dXJlZCBieSB0aGUgYnVpbGQuIEFuIFwiaGZpXCIgYW5hbHlzaXMgY2FuIGJlIGZhc3RlciBidXQgbWF5IHByb2R1Y2UgcmVzdWx0cyB3aGljaCBhcmUgaW5jb21wbGV0ZSBvciBpbmNvbnNpc3RlbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBjb250ZXh0LCBhbmQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHNwZWVkIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gYWNjdXJhY3kuXG4gKlxuICogQHNjaGVtYSBBbmFseXNpc0NvbmZpZ3VyYXRpb25Nb2RlXG4gKi9cbmV4cG9ydCBlbnVtIEFuYWx5c2lzQ29uZmlndXJhdGlvbk1vZGUge1xuICAvKiogaGZpICovXG4gIEhGSSA9IFwiaGZpXCIsXG4gIC8qKiBwZmkgKi9cbiAgUEZJID0gXCJwZmlcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIHBhcnNlLXdhcm5pbmdzLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZVdhcm5pbmdzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIHBhcnNlIHdhcm5pbmdzLCByZWNvdmVyeSB3YXJuaW5ncywgYW5kIHNlbWFudGljIHdhcm5pbmdzIHRoYXQgYXJlIHByb2R1Y2VkIGJ5IHRoZSBjb3YtYnVpbGQgY29tbWFuZCBzbyB0aGF0IHRoZXkgYXBwZWFyIGFzIGRlZmVjdHMgaW4gQ292ZXJpdHkgQ29ubmVjdC4gQnkgZGVmYXVsdCwgdGhpcyBpcyBkaXNhYmxlZCBpZiB0aGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgaXMgbG93LCBhbmQgZW5hYmxlZCBpZiB0aGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgaXMgbWVkaXVtIG9yIGhpZ2guXG4gICAqXG4gICAqIEBzY2hlbWEgcGFyc2Utd2FybmluZ3MtY29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUGFyc2VXYXJuaW5nc0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9QYXJzZVdhcm5pbmdzQ29uZmlndXJhdGlvbihvYmo6IFBhcnNlV2FybmluZ3NDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBzaWdtYS1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbWFDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgY2hlY2sgc2V0cyB0byBlbmFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgc2lnbWEtY29uZmlndXJhdGlvbiNlbmFibGUtY2hlY2stc2V0XG4gICAqL1xuICByZWFkb25seSBlbmFibGVDaGVja1NldD86IFNpZ21hQ29uZmlndXJhdGlvbkVuYWJsZUNoZWNrU2V0W107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZmlsZXMgY29udGFpbmluZyBtYWxpY2lvdXMgVVJMIHBhdHRlcm5zLlxuICAgKlxuICAgKiBAc2NoZW1hIHNpZ21hLWNvbmZpZ3VyYXRpb24jbWFsaWNpb3VzLXVybC1wYXR0ZXJucy1maWxlXG4gICAqL1xuICByZWFkb25seSBtYWxpY2lvdXNVcmxQYXR0ZXJuc0ZpbGU/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2lnbWFDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2lnbWFDb25maWd1cmF0aW9uKG9iajogU2lnbWFDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlLWNoZWNrLXNldCc6IG9iai5lbmFibGVDaGVja1NldD8ubWFwKHkgPT4geSksXG4gICAgJ21hbGljaW91cy11cmwtcGF0dGVybnMtZmlsZSc6IG9iai5tYWxpY2lvdXNVcmxQYXR0ZXJuc0ZpbGU/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBjb21waWxlci1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gXCJjb3YtY29uZmlndXJlXCIgdG8gZ2VuZXJhdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGR1cmluZyBjYXB0dXJlLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJmaWxlXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbXBpbGVyLWNvbmZpZ3VyYXRpb24jY292LWNvbmZpZ3VyZVxuICAgKi9cbiAgcmVhZG9ubHkgY292Q29uZmlndXJlPzogc3RyaW5nW11bXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgcHJlLWdlbmVyYXRlZCBjb21waWxlciBjb25maWd1cmF0aW9uIGZpbGUgdG8gdXNlLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJjb3YtY29uZmlndXJlXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbXBpbGVyLWNvbmZpZ3VyYXRpb24jZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29tcGlsZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ29tcGlsZXJDb25maWd1cmF0aW9uKG9iajogQ29tcGlsZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY292LWNvbmZpZ3VyZSc6IG9iai5jb3ZDb25maWd1cmU/Lm1hcCh5ID0+IHk/Lm1hcCh5ID0+IHkpKSxcbiAgICAnZmlsZSc6IG9iai5maWxlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29tbWFuZCB0byBpbnZva2UgdGhhdCB3aWxsIGludm9rZSBcImNvdi10cmFuc2xhdGVcIiB0byBjYXB0dXJlIHRoZSBwcm9qZWN0LlxuICpcbiAqIEBzY2hlbWEgY292LXRyYW5zbGF0ZS1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ292VHJhbnNsYXRlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGlzIGtleSBzcGVjaWZpZXMgYSBjb21tYW5kIHRvIGludm9rZSB0aGF0IHdpbGwgaW52b2tlIFwiY292LXRyYW5zbGF0ZVwiIGluIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIGlzIGRvaW5nIGEgXCJjb3YtdHJhbnNsYXRlXCIgY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBjb3YtdHJhbnNsYXRlLWNvbmZpZ3VyYXRpb24jY29tbWFuZFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGNvdi1idWlsZCB3aGVuIGludm9raW5nIHRoZSBwcm92aWRlZCBjb21tYW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvdi10cmFuc2xhdGUtY29uZmlndXJhdGlvbiNjb3YtYnVpbGQtYXJnc1xuICAgKi9cbiAgcmVhZG9ubHkgY292QnVpbGRBcmdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBidWlsZCBzaG91bGQgb25seSByZWNvcmQgdGhlIGRlY29tcGlsYXRpb25zIG9mIGJ5dGUgY29kZSBkdXJpbmcgdGhlIGJ1aWxkIGFuZCBub3QgYXR0ZW1wdCB0byBkZWNvbXBpbGUgYW5kIGVtaXQgdGhlIGJ5dGUgY29kZS4gRHVyaW5nIHRoZSBhbmFseXNpcyBwaGFzZSwgY292LWJ1aWxkIHdpbGwgYmUgcmVydW4gd2l0aCAtLXJlcGxheS1kZWNvbXAgdG8gZGVjb21waWxlIGFuZCBlbWl0IHRoZSBieXRlIGNvZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgY292LXRyYW5zbGF0ZS1jb25maWd1cmF0aW9uI2RlZmVyLWRlY29tcFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmZXJEZWNvbXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRvIHBhcmFsbGVsaXplIHRyYW5zbGF0aW9uIG9mIEMgYW5kIEMrKyBjb2RlLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvdi10cmFuc2xhdGUtY29uZmlndXJhdGlvbiNwYXJhbGxlbC10cmFuc2xhdGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFsbGVsVHJhbnNsYXRlPzogUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgdGhlIGNvbGxlY3Rpb24gb2Ygc2NhbiB0cmFuc3BhcmVuY3kgZGF0YSBmb3IgY292LXRyYW5zbGF0ZSBjYXB0dXJlLiBUaGlzIHNldHRpbmcgbXVzdCBiZSBlbmFibGVkIGlmIHRoZSBDb3Zlcml0eSBDb25uZWN0IGluc3RhbmNlIGhhcyAnc2Nhbi50cmFuc3BhcmVuY3kuZW5hYmxlZD10cnVlJyBpbiBpdHMgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb3YtdHJhbnNsYXRlLWNvbmZpZ3VyYXRpb24jc2Nhbi10cmFuc3BhcmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHNjYW5UcmFuc3BhcmVuY3k/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdDb3ZUcmFuc2xhdGVDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ292VHJhbnNsYXRlQ29uZmlndXJhdGlvbihvYmo6IENvdlRyYW5zbGF0ZUNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb21tYW5kJzogb2JqLmNvbW1hbmQsXG4gICAgJ2Nvdi1idWlsZC1hcmdzJzogb2JqLmNvdkJ1aWxkQXJncz8ubWFwKHkgPT4geSksXG4gICAgJ2RlZmVyLWRlY29tcCc6IG9iai5kZWZlckRlY29tcCxcbiAgICAncGFyYWxsZWwtdHJhbnNsYXRlJzogdG9Kc29uX1BhcmFsbGVsVHJhbnNsYXRlQ29uZmlndXJhdGlvbihvYmoucGFyYWxsZWxUcmFuc2xhdGUpLFxuICAgICdzY2FuLXRyYW5zcGFyZW5jeSc6IG9iai5zY2FuVHJhbnNwYXJlbmN5LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZXNDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBjYXB0dXJlIG9mIG1pbmlmaWVkIEphdmFTY3JpcHQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiNlbWl0LW1pbmlmaWVkLWpzXG4gICAqL1xuICByZWFkb25seSBlbWl0TWluaWZpZWRKcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEdsb2IgcGF0dGVybiB0aGF0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHNvdXJjZSBmaWxlcyB0byBleGNsdWRlIGZyb20gY2FwdHVyZS4gTm90ZSB0aGF0IGFueSBpbmNsdWRlIGdsb2IgcGF0dGVybnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHByb2Nlc3NlZCBwcmlvciB0byBoYW5kbGluZyBleGNsdWRlIGdsb2IgcGF0dGVybnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiNleGNsdWRlLWdsb2JcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVHbG9iPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gZXhjbHVkZSBmcm9tIGNhcHR1cmUuIE5vdGUgdGhhdCBhbnkgaW5jbHVkZSBnbG9iIHBhdHRlcm5zIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBwcm9jZXNzZWQgcHJpb3IgdG8gaGFuZGxpbmcgZXhjbHVkZSBnbG9iIHBhdHRlcm5zIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIGZpbGVzLWNvbmZpZ3VyYXRpb24jZXhjbHVkZS1yZWdleFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZVJlZ2V4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGRpcmVjdG9yeSBiYXNlbmFtZXMgdG8gaW5jbHVkZSBmb3IgY2FwdHVyZSwgd2hpY2ggd291bGQgbm9ybWFsbHkgaGF2ZSBiZWVuIGV4Y2x1ZGVkLiBCeSBkZWZhdWx0LCBkaXJlY3RvcmllcyBuYW1lZCBcInZlbmRvclwiIG9yIFwibm9kZV9tb2R1bGVzXCIgYXJlIGV4Y2x1ZGVkLCBhcyBhcmUgZGlyZWN0b3JpZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBcIi5cIlxuICAgKlxuICAgKiBAc2NoZW1hIGZpbGVzLWNvbmZpZ3VyYXRpb24jaW5jbHVkZS1kaXJzXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRGlycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBHbG9iIHBhdHRlcm4gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uI2luY2x1ZGUtZ2xvYlxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUdsb2I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbGUgY29udGFpbmluZyB0aGUgcGF0aHMgb2Ygc291cmNlIGZpbGVzIHRvIGNhcHR1cmUsIG9uZSBwZXIgbGluZS4gSW5jbHVkZSBhbmQgZXhjbHVkZSBnbG9iIHBhdHRlcm5zIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBhcHBsaWVkIHRvIGRldGVybWluZSB3aGljaCBvZiB0aGVzZSBmaWxlcyBhcmUgYWN0dWFsbHkgY2FwdHVyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiNpbmNsdWRlLWxpc3QtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUxpc3RGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uI2luY2x1ZGUtcmVnZXhcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVSZWdleD86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBKYXZhIHZlcnNpb24gdG8gdXNlIHdoZW4gcGFyc2luZyBhbmQgZW1pdHRpbmcgSmF2YSBzb3VyY2UgZmlsZXMgd2l0aCBidWlsZGxlc3MgY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uI2phdmEtdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgamF2YVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gbG9vayBpbiBmb3IgZGVwZW5kZW5jaWVzIHRvIHVzZSBkdXJpbmcgY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uI2xpYnJhcnktZGlyc1xuICAgKi9cbiAgcmVhZG9ubHkgbGlicmFyeURpcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBmaWxlIGRlcGVuZGVuY2llcyB0byB1c2UgZHVyaW5nIGNhcHR1cmUuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiNsaWJyYXJ5LWZpbGVzXG4gICAqL1xuICByZWFkb25seSBsaWJyYXJ5RmlsZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHdlYi1hcHBsaWNhdGlvbiBhcmNoaXZlcyBzaG91bGQgYmUgY2FwdHVyZWQuIEJ5IGRlZmF1bHQgYWxsIHdlYmFwcCBhcmNoaXZlcyBhcmUgY2FwdHVyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiN3ZWJhcHAtYXJjaGl2ZXNcbiAgICovXG4gIHJlYWRvbmx5IHdlYmFwcEFyY2hpdmVzPzogV2ViYXBwQXJjaGl2ZUNvbmZpZ3VyYXRpb25bXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnRmlsZXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fRmlsZXNDb25maWd1cmF0aW9uKG9iajogRmlsZXNDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW1pdC1taW5pZmllZC1qcyc6IG9iai5lbWl0TWluaWZpZWRKcyxcbiAgICAnZXhjbHVkZS1nbG9iJzogb2JqLmV4Y2x1ZGVHbG9iLFxuICAgICdleGNsdWRlLXJlZ2V4Jzogb2JqLmV4Y2x1ZGVSZWdleCxcbiAgICAnaW5jbHVkZS1kaXJzJzogb2JqLmluY2x1ZGVEaXJzPy5tYXAoeSA9PiB5KSxcbiAgICAnaW5jbHVkZS1nbG9iJzogb2JqLmluY2x1ZGVHbG9iLFxuICAgICdpbmNsdWRlLWxpc3QtZmlsZSc6IG9iai5pbmNsdWRlTGlzdEZpbGUsXG4gICAgJ2luY2x1ZGUtcmVnZXgnOiBvYmouaW5jbHVkZVJlZ2V4LFxuICAgICdqYXZhLXZlcnNpb24nOiBvYmouamF2YVZlcnNpb24sXG4gICAgJ2xpYnJhcnktZGlycyc6IG9iai5saWJyYXJ5RGlycz8ubWFwKHkgPT4geSksXG4gICAgJ2xpYnJhcnktZmlsZXMnOiBvYmoubGlicmFyeUZpbGVzPy5tYXAoeSA9PiB5KSxcbiAgICAnd2ViYXBwLWFyY2hpdmVzJzogb2JqLndlYmFwcEFyY2hpdmVzPy5tYXAoeSA9PiB0b0pzb25fV2ViYXBwQXJjaGl2ZUNvbmZpZ3VyYXRpb24oeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBsYW5ndWFnZXMtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhbmd1YWdlc0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBsYW5ndWFnZXMgZm9yIHdoaWNoIHRoZSBzb3VyY2UgY29kZSBzaG91bGQgYmUgZXhjbHVkZWQgaW4gdGhlIGNhcHR1cmUuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImluY2x1ZGVcIiBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgbGFuZ3VhZ2VzLWNvbmZpZ3VyYXRpb24jZXhjbHVkZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZT86IExhbmd1YWdlc0NvbmZpZ3VyYXRpb25FeGNsdWRlW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbGFuZ3VhZ2VzIGZvciB3aGljaCB0aGUgc291cmNlIGNvZGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBjYXB0dXJlLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJleGNsdWRlXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIGxhbmd1YWdlcy1jb25maWd1cmF0aW9uI2luY2x1ZGVcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGU/OiBMYW5ndWFnZXNDb25maWd1cmF0aW9uSW5jbHVkZVtdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdMYW5ndWFnZXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fTGFuZ3VhZ2VzQ29uZmlndXJhdGlvbihvYmo6IExhbmd1YWdlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdleGNsdWRlJzogb2JqLmV4Y2x1ZGU/Lm1hcCh5ID0+IHkpLFxuICAgICdpbmNsdWRlJzogb2JqLmluY2x1ZGU/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBpbXBvcnQtc2NtLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbXBvcnRTY21Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gY292LWltcG9ydC1zY20gZm9sbG93aW5nIGNhcHR1cmUuXG4gICAqXG4gICAqIEBzY2hlbWEgaW1wb3J0LXNjbS1jb25maWd1cmF0aW9uI2Nvdi1pbXBvcnQtc2NtLWFyZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNvdkltcG9ydFNjbUFyZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUmVndWxhciBleHByZXNzaW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBzZXQgb2YgZmlsZXMgZm9yIHdoaWNoIHRvIGltcG9ydCBjaGFuZ2UgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgaW1wb3J0LXNjbS1jb25maWd1cmF0aW9uI2ZpbGVuYW1lLXJlZ2V4XG4gICAqL1xuICByZWFkb25seSBmaWxlbmFtZVJlZ2V4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBjYWxscyB0byB0aGUgdW5kZXJseWluZyBTQ00uXG4gICAqXG4gICAqIEBzY2hlbWEgaW1wb3J0LXNjbS1jb25maWd1cmF0aW9uI21zLWRlbGF5XG4gICAqL1xuICByZWFkb25seSBtc0RlbGF5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGNvbnRyb2wgbWFuYWdlbWVudCBzeXN0ZW0uXG4gICAqXG4gICAqIEBzY2hlbWEgaW1wb3J0LXNjbS1jb25maWd1cmF0aW9uI3NjbVxuICAgKi9cbiAgcmVhZG9ubHkgc2NtPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdJbXBvcnRTY21Db25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSW1wb3J0U2NtQ29uZmlndXJhdGlvbihvYmo6IEltcG9ydFNjbUNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb3YtaW1wb3J0LXNjbS1hcmdzJzogb2JqLmNvdkltcG9ydFNjbUFyZ3M/Lm1hcCh5ID0+IHkpLFxuICAgICdmaWxlbmFtZS1yZWdleCc6IG9iai5maWxlbmFtZVJlZ2V4LFxuICAgICdtcy1kZWxheSc6IG9iai5tc0RlbGF5LFxuICAgICdzY20nOiBvYmouc2NtLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoYXQgYnVpbGQgY2FwdHVyZSBzaG91bGQgYmUgdXNlZCB0byBjYXB0dXJlIHRoZSBwcm9qZWN0IGFuZCBwcm92aWRlcyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiB0byB1c2UuIElmIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBjb250YWlucyBjb21waWxlZCBzb3VyY2UgZmlsZXMgdGhlbiBhdXRvbWF0aWMgYnVpbGQgY2FwdHVyZSB3aWxsIGJlIHVzZWQgdG8gY2FwdHVyZSBjb21waWxlZCBzb3VyY2UgZmlsZXMgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5LlxuICpcbiAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b21hdGljIGludm9jYXRpb24gb2YgQXNwbmV0X2NvbXBpbGVyLmV4ZSBmb3IgYW55IEFTUC5ORVQgNCBhbmQgZWFybGllciBXZWIgYXBwbGljYXRpb25zIHRoYXQgYXJlIGRldGVjdGVkIGluIHRoZSBidWlsZC4gVGhlIG91dHB1dCBvZiBBc3BuZXRfY29tcGlsZXIuZXhlIGlzIHJlcXVpcmVkIGJ5IHRoZSBDIyBhbmQgVmlzdWFsIEJhc2ljIHNlY3VyaXR5IGNoZWNrZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIGJ1aWxkLWNvbmZpZ3VyYXRpb24jYXNwbmV0LWNvbXBpbGVyXG4gICAqL1xuICByZWFkb25seSBhc3BuZXRDb21waWxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBCYXplbCBjYXB0dXJlLlxuICAgKlxuICAgKiBAc2NoZW1hIGJ1aWxkLWNvbmZpZ3VyYXRpb24jYmF6ZWxcbiAgICovXG4gIHJlYWRvbmx5IGJhemVsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGJ1aWxkIGNvbW1hbmQgd2lsbCBiZSBpbnZva2VkIHRvIHVzZSBidWlsZCBjYXB0dXJlIHRvIGNhcHR1cmUgdGhlIHByb2plY3QuIEEgYnVpbGQgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZSB3aWxsIG92ZXJyaWRlIHRoaXMgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBidWlsZC1jb25maWd1cmF0aW9uI2J1aWxkLWNvbW1hbmRcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY2xlYW4gY29tbWFuZCB3aWxsIGJlIGludm9rZWQgcHJpb3IgdG8gZG9pbmcgYnVpbGQgY2FwdHVyZSB0byBjYXB0dXJlIHRoZSBwcm9qZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIGJ1aWxkLWNvbmZpZ3VyYXRpb24jY2xlYW4tY29tbWFuZFxuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW5Db21tYW5kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGNvdi1idWlsZCB3aGVuIGRvaW5nIGJ1aWxkIGNhcHR1cmUuXG4gICAqXG4gICAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvbiNjb3YtYnVpbGQtYXJnc1xuICAgKi9cbiAgcmVhZG9ubHkgY292QnVpbGRBcmdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBidWlsZCBzaG91bGQgb25seSByZWNvcmQgdGhlIGRlY29tcGlsYXRpb25zIG9mIGJ5dGUgY29kZSBkdXJpbmcgdGhlIGJ1aWxkIGFuZCBub3QgYXR0ZW1wdCB0byBkZWNvbXBpbGUgYW5kIGVtaXQgdGhlIGJ5dGUgY29kZS4gRHVyaW5nIHRoZSBhbmFseXNpcyBwaGFzZSwgY292LWJ1aWxkIHdpbGwgYmUgcmVydW4gd2l0aCAtLXJlcGxheS1kZWNvbXAgdG8gZGVjb21waWxlIGFuZCBlbWl0IHRoZSBieXRlIGNvZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvbiNkZWZlci1kZWNvbXBcbiAgICovXG4gIHJlYWRvbmx5IGRlZmVyRGVjb21wPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHRoZSBpbnN0cnVtZW50YXRpb24gbW9kZSBpbnN0ZWFkIG9mIHRoZSBkZWJ1Z2dlci4gRm9yIGNlcnRhaW4gYnVpbGRzLCB0aGlzIGNvbmZpZ3VyYXRpb24gY2FuIHNpZ25pZmljYW50bHkgaW1wcm92ZSBidWlsZCB0aW1lcy4gVGhpcyBzZXR0aW5nIGlzIGFwcGxpY2FibGUgb25seSBvbiBXaW5kb3dzLlxuICAgKlxuICAgKiBAc2NoZW1hIGJ1aWxkLWNvbmZpZ3VyYXRpb24jaW5zdHJ1bWVudFxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdHJ1bWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdG8gcGFyYWxsZWxpemUgdHJhbnNsYXRpb24gb2YgQyBhbmQgQysrIGNvZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvbiNwYXJhbGxlbC10cmFuc2xhdGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFsbGVsVHJhbnNsYXRlPzogUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgdGhlIGNvbGxlY3Rpb24gb2Ygc2NhbiB0cmFuc3BhcmVuY3kgZGF0YSBmb3IgYnVpbGQgY2FwdHVyZS4gVGhpcyBzZXR0aW5nIG11c3QgYmUgZW5hYmxlZCBpZiB0aGUgQ292ZXJpdHkgQ29ubmVjdCBpbnN0YW5jZSBoYXMgJ3NjYW4udHJhbnNwYXJlbmN5LmVuYWJsZWQ9dHJ1ZScgaW4gaXRzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvbiNzY2FuLXRyYW5zcGFyZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgc2NhblRyYW5zcGFyZW5jeT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1aWxkQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1aWxkQ29uZmlndXJhdGlvbihvYmo6IEJ1aWxkQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FzcG5ldC1jb21waWxlcic6IG9iai5hc3BuZXRDb21waWxlcixcbiAgICAnYmF6ZWwnOiBvYmouYmF6ZWwsXG4gICAgJ2J1aWxkLWNvbW1hbmQnOiBvYmouYnVpbGRDb21tYW5kLFxuICAgICdjbGVhbi1jb21tYW5kJzogb2JqLmNsZWFuQ29tbWFuZCxcbiAgICAnY292LWJ1aWxkLWFyZ3MnOiBvYmouY292QnVpbGRBcmdzPy5tYXAoeSA9PiB5KSxcbiAgICAnZGVmZXItZGVjb21wJzogb2JqLmRlZmVyRGVjb21wLFxuICAgICdpbnN0cnVtZW50Jzogb2JqLmluc3RydW1lbnQsXG4gICAgJ3BhcmFsbGVsLXRyYW5zbGF0ZSc6IHRvSnNvbl9QYXJhbGxlbFRyYW5zbGF0ZUNvbmZpZ3VyYXRpb24ob2JqLnBhcmFsbGVsVHJhbnNsYXRlKSxcbiAgICAnc2Nhbi10cmFuc3BhcmVuY3knOiBvYmouc2NhblRyYW5zcGFyZW5jeSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIENvdmVyaXR5IENvbm5lY3QgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb21taXR0aW5nIGRlZmVjdHMgdG8gQ292ZXJpdHkgQ29ubmVjdC5cbiAqXG4gKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3Qge1xuICAvKipcbiAgICogVGhlIGF1dGhlbnRpY2F0aW9uIGtleSBmaWxlIHRvIHVzZSB3aGVuIGF1dGhlbnRpY2F0aW5nIHRvIENvdmVyaXR5IENvbm5lY3QgdG8gY29tbWl0IGRlZmVjdHMuIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGxvY2F0ZWQgYXQgJEhPTUUvLmNvdmVyaXR5L2FrLTxob3N0bmFtZT4tPHBvcnQ+IGlzIHVzZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjYXV0aC1rZXktZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aEtleUZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbGUgY29udGFpbmluZyBhZGRpdGlvbmFsIGNlcnRpZmljYXRlcyB0byB0cnVzdCBpbiBhZGRpdGlvbiB0byB0aGUgb25lcyBpbiB0aGUgc3lzdGVtIGNlcnRpZmljYXRlIHN0b3JlIGFuZCB0aGUgQ292ZXJpdHkgVEZUIHN0b3JlLiBCeSBkZWZhdWx0IHN5c3RlbSBDQSBjZXJ0aWZpY2F0ZXMgYXJlIHVzZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjY2EtY2VydHMtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FDZXJ0c0ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGFuYWx5c2lzIHJlc3VsdHMgd2lsbCBub3QgYmUgY29tbWl0dGVkIHRvIENvdmVyaXR5IENvbm5lY3QuICBJbnN0ZWFkLCByZXN1bHRzIGNvbXBhcmVkIHRvIGEgcmVmZXJlbmNlIHNuYXBzaG90IG1heSBiZSBzYXZlZCBsb2NhbGx5IGFzIHNwZWNpZmllZCBieSB0aGUgXCJjb21taXQubG9jYWxcIiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCNjb21wYXJpc29uLW9ubHlcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhcmlzb25Pbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3V0cHV0IGZpbGUgdG8gd2hpY2ggYW5hbHlzaXMgcmVzdWx0cyBzaG91bGQgYmUgd3JpdHRlbiBpbnN0ZWFkIG9mIGJlaW5nIGNvbW1pdHRlZCB0byBDb3Zlcml0eSBDb25uZWN0LiBUaGUgb3V0cHV0IGluY2x1ZGVzIGEgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZSBsYXRlc3Qgc25hcHNob3QgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I2NvbXBhcmlzb24tcmVwb3J0XG4gICAqL1xuICByZWFkb25seSBjb21wYXJpc29uUmVwb3J0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIFwiY292LWNvbW1pdC1kZWZlY3RzXCIgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjY292LWNvbW1pdC1kZWZlY3RzLWFyZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNvdkNvbW1pdERlZmVjdHNBcmdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSBjb21taXR0ZWQgc25hcHNob3QuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB0cnVzdCBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMgcHJlc2VudGVkIGJ5IENvdmVyaXR5IENvbm5lY3QgdGhhdCBhcmUgbm90IGN1cnJlbnRseSB0cnVzdGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I29uLW5ldy1jZXJ0XG4gICAqL1xuICByZWFkb25seSBvbk5ld0NlcnQ/OiBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdE9uTmV3Q2VydDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSBuZXcgc3RyZWFtLiBJZ25vcmVkIHdoZW4gc3RyZWFtIGNyZWF0aW9uIGlzIG5vdCBuZWVkZWQuIEJ5IGRlZmF1bHQgdGhlIHN0cmVhbSBuYW1lIGlzIHVzZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjcHJvamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdD86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgaW4gUEVNIGZvcm1hdCwgdGhhdCBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSBwcm94eSB3aGVuIG1ha2luZyBhIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjcHJveHktY2xpZW50LWNlcnQtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlDbGllbnRDZXJ0RmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgcHJpdmF0ZSBrZXkgaW4gUEVNIGZvcm1hdCwgZm9yIHRoZSBwcm94eS1jbGllbnQtY2VydC1maWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I3Byb3h5LWNsaWVudC1rZXktZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlDbGllbnRLZXlGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVUkwgZm9yIGEgZm9yd2FyZCBwcm94eSB0byB1c2Ugd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggQ292ZXJpdHkgQ29ubmVjdC4gIE11c3QgYmUgYW4gaHR0cHMgVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I3Byb3h5LXVybFxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgY29udHJvbCBtYW5hZ2VtZW50IHN5c3RlbS5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCNzY21cbiAgICovXG4gIHJlYWRvbmx5IHNjbT86IENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0U2NtO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRvIHNlbGVjdCBhIHJlZmVyZW5jZSBzbmFwc2hvdCB0byB1c2UgZm9yIGEgY29tcGFyaXNvbiByZXBvcnQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3Qjc25hcHNob3RcbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90PzogU25hcHNob3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RyZWFtIHRvIGNvbW1pdCB0aGUgcmVzdWx0cyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCNzdHJlYW1cbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IG5ldyBkZWZlY3RzIHNob3VsZCBiZSBoYW5kbGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I3RyaWFnZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJpYWdlPzogQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RUcmlhZ2U7XG5cbiAgLyoqXG4gICAqIEFydGlmYWN0cyB0byB1cGxvYWQgZm9sbG93aW5nIGFuYWx5c2lzIHdoZW4gdGhlIGFuYWx5c2lzIGxvY2F0aW9uIGlzIENvbm5lY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjdXBsb2FkLWFydGlmYWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgdXBsb2FkQXJ0aWZhY3RzPzogQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RVcGxvYWRBcnRpZmFjdHM7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIFVSTCBvZiB3aGVyZSB0byBjb21taXQgdGhlIENvdmVyaXR5IENvbm5lY3QgcmVzdWx0cy5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCN1cmxcbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHByb2plY3QgdmVyc2lvbiBmb3IgdGhlIGNvbW1pdHRlZCBzbmFwc2hvdC5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCN2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0KG9iajogQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhdXRoLWtleS1maWxlJzogb2JqLmF1dGhLZXlGaWxlLFxuICAgICdjYS1jZXJ0cy1maWxlJzogb2JqLmNhQ2VydHNGaWxlLFxuICAgICdjb21wYXJpc29uLW9ubHknOiBvYmouY29tcGFyaXNvbk9ubHksXG4gICAgJ2NvbXBhcmlzb24tcmVwb3J0Jzogb2JqLmNvbXBhcmlzb25SZXBvcnQsXG4gICAgJ2Nvdi1jb21taXQtZGVmZWN0cy1hcmdzJzogb2JqLmNvdkNvbW1pdERlZmVjdHNBcmdzPy5tYXAoeSA9PiB5KSxcbiAgICAnZGVzY3JpcHRpb24nOiBvYmouZGVzY3JpcHRpb24sXG4gICAgJ29uLW5ldy1jZXJ0Jzogb2JqLm9uTmV3Q2VydCxcbiAgICAncHJvamVjdCc6IG9iai5wcm9qZWN0LFxuICAgICdwcm94eS1jbGllbnQtY2VydC1maWxlJzogb2JqLnByb3h5Q2xpZW50Q2VydEZpbGUsXG4gICAgJ3Byb3h5LWNsaWVudC1rZXktZmlsZSc6IG9iai5wcm94eUNsaWVudEtleUZpbGUsXG4gICAgJ3Byb3h5LXVybCc6IG9iai5wcm94eVVybCxcbiAgICAnc2NtJzogb2JqLnNjbSxcbiAgICAnc25hcHNob3QnOiB0b0pzb25fU25hcHNob3RDb25maWd1cmF0aW9uKG9iai5zbmFwc2hvdCksXG4gICAgJ3N0cmVhbSc6IG9iai5zdHJlYW0sXG4gICAgJ3RyaWFnZSc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZShvYmoudHJpYWdlKSxcbiAgICAndXBsb2FkLWFydGlmYWN0cyc6IG9iai51cGxvYWRBcnRpZmFjdHMsXG4gICAgJ3VybCc6IG9iai51cmwsXG4gICAgJ3ZlcnNpb24nOiBvYmoudmVyc2lvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNvZnR3YXJlIFJpc2sgTWFuYWdlciBjb25maWd1cmF0aW9uIHRvIHVzZSB3aGVuIHN0b3JpbmcgZGVmZWN0cyBpbiBTb2Z0d2FyZSBSaXNrIE1hbmFnZXIuXG4gKlxuICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Q29uZmlndXJhdGlvblNybSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnJhbmNoIHRvIGFzc29jaWF0ZSB0aGUgYW5hbHlzaXMgcmVzdWx0cyB3aXRoIGluIFNvZnR3YXJlIFJpc2sgTWFuYWdlci5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtI2JyYW5jaFxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGJyYW5jaCBvZiB0aGUgYWN0dWFsIGJyYW5jaC5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtI3BhcmVudC1icmFuY2hcbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudEJyYW5jaD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gYXNzb2NpYXRlIHRoZSBhbmFseXNpcyByZXN1bHRzIHdpdGggaW4gU29mdHdhcmUgUmlzayBNYW5hZ2VyLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Tcm0jcHJvamVjdC1uYW1lXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBwcm9qZWN0IHRvIGFzc29jaWF0ZSB0aGUgYW5hbHlzaXMgcmVzdWx0cyB3aXRoIGluIFNvZnR3YXJlIFJpc2sgTWFuYWdlci5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtI3Byb2plY3QtaWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3RJZD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmVhZCB0aGUgU29mdHdhcmUgUmlzayBNYW5hZ2VyIEFQSSBrZXkgZnJvbS4gQnkgZGVmYXVsdCwgdGhlIGZpbGUgbG9jYXRlZCBhdCAkSE9NRS8uYnJpZGdlL3NybS10b2tlbi50eHQgaXMgdXNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtI3Rva2VuLWZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHRva2VuRmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgU29mdHdhcmUgUmlzayBNYW5hZ2VyIHRvIHVzZSBmb3IgdGhlIGFuYWx5c2lzIChpZiBkb2luZyBhIHJlbW90ZSBhbmFseXNpcykgYW5kIHRoZSBhbmFseXNpcyByZXN1bHRzLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Tcm0jdXJsXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29tbWl0Q29uZmlndXJhdGlvblNybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvbW1pdENvbmZpZ3VyYXRpb25Tcm0ob2JqOiBDb21taXRDb25maWd1cmF0aW9uU3JtIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnJhbmNoJzogb2JqLmJyYW5jaCxcbiAgICAncGFyZW50LWJyYW5jaCc6IG9iai5wYXJlbnRCcmFuY2gsXG4gICAgJ3Byb2plY3QtbmFtZSc6IG9iai5wcm9qZWN0TmFtZSxcbiAgICAncHJvamVjdC1pZCc6IG9iai5wcm9qZWN0SWQsXG4gICAgJ3Rva2VuLWZpbGUnOiBvYmoudG9rZW5GaWxlLFxuICAgICd1cmwnOiBvYmoudXJsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogTG9jYWwgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBzYXZpbmcgZGVmZWN0cyB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uTG9jYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21taXRDb25maWd1cmF0aW9uTG9jYWwge1xuICAvKipcbiAgICogRGlyZWN0b3J5IChmb3IgXCJodG1sXCIgZm9ybWF0KSBvciBmaWxlIChmb3IgXCJqc29uXCIgZm9ybWF0KSBpbiB3aGljaCB0byBzYXZlIGRlZmVjdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsI3BhdGhcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogRm9ybWF0IGluIHdoaWNoIHRvIHNhdmUgZGVmZWN0cy4gRWl0aGVyIFwiaHRtbFwiIG9yIFwianNvblwiLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Mb2NhbCNmb3JtYXRcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdD86IENvbW1pdENvbmZpZ3VyYXRpb25Mb2NhbEZvcm1hdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsKG9iajogQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICdmb3JtYXQnOiBvYmouZm9ybWF0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIGhvdyB3ZWIgYXBwbGljYXRpb24gc2VjdXJpdHkgYW5hbHlzaXMgc2hvdWxkIGJlIGRvbmUuXG4gKlxuICogQHNjaGVtYSBDaGVja2VyQ29uZmlndXJhdGlvbldlYmFwcFNlY3VyaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlckNvbmZpZ3VyYXRpb25XZWJhcHBTZWN1cml0eSB7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB3ZWIgYXBwbGljYXRpb24gY2hlY2tlcnMgYWdncmVzc2l2ZW5lc3MgbGV2ZWwuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2hlY2tlckNvbmZpZ3VyYXRpb25XZWJhcHBTZWN1cml0eSNhZ2dyZXNzaXZlbmVzcy1sZXZlbFxuICAgKi9cbiAgcmVhZG9ubHkgYWdncmVzc2l2ZW5lc3NMZXZlbD86IENoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHlBZ2dyZXNzaXZlbmVzc0xldmVsO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBjaGVja2VycyB0aGF0IGFyZSB1c2VkIGZvciB3ZWIgYXBwbGljYXRpb24gc2VjdXJpdHkgYW5hbHlzaXMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2hlY2tlckNvbmZpZ3VyYXRpb25XZWJhcHBTZWN1cml0eSNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ2hlY2tlckNvbmZpZ3VyYXRpb25XZWJhcHBTZWN1cml0eScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHkob2JqOiBDaGVja2VyQ29uZmlndXJhdGlvbldlYmFwcFNlY3VyaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWdncmVzc2l2ZW5lc3MtbGV2ZWwnOiBvYmouYWdncmVzc2l2ZW5lc3NMZXZlbCxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBzcGVjaWZpYy1jb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoaXMga2V5IHNwZWNpZmllcyB0aGUgY29kaW5nIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnaXZlbiBjb2Rpbmcgc3RhbmRhcmQuIFRoZSBhY3R1YWwgdHlwZSBvZiB0aGlzIGtleSBpcyBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBjb2Rpbmcgc3RhbmRhcmQuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImZpbGVcIiBrZXkuIEEgdGVtcG9yYXJ5IGNvbmZpZ3VyYXRpb24gZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCBjb250YWluaW5nIHRoZSBpbi1saW5lIGNvbmZpZ3VyYXRpb24gYW5kIHRoZW4gcGFzc2VkIHRvIFwiY292LWFuYWx5emVcIiB1c2luZyB0aGUgXCItLWNvZGluZy1zdGFuZGFyZC1jb25maWcgPGNvbmZpZ19maWxlPlwiIG9wdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBzcGVjaWZpYy1jb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNjb25maWdcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZz86IFJlc29sdmVkQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGlzIHNwZWNpZmllcyB0aGUgZmlsZW5hbWUgY29udGFpbmluZyB0aGUgY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGNvZGluZyBzdGFuZGFyZC4gVGhpcyBrZXkgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIFwiY29uZmlnXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIHNwZWNpZmljLWNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI2ZpbGVcbiAgICovXG4gIHJlYWRvbmx5IGZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoaXMga2V5IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIFwicHJlLWNhbm5lZFwiIGNvZGluZyBzdGFuZGFyZCBjb25maWd1cmF0aW9uIHRvIHVzZS4gVGhlIGF2YWlsYWJsZSBwcmUtY2FubmVkIGNvZGluZyBzdGFuZGFyZCBjb25maWd1cmF0aW9ucyBkZXBlbmQgb24gdGhlIGNvZGluZyBzdGFuZGFyZCBpbiBxdWVzdGlvbi4gUmVmZXIgdG8gQ292ZXJpdHkncyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBcInByZS1jYW5uZWRcIiBjb25maWd1cmF0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBzcGVjaWZpYy1jb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNwcmUtY2FubmVkXG4gICAqL1xuICByZWFkb25seSBwcmVDYW5uZWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ob2JqOiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NvbmZpZyc6IHRvSnNvbl9SZXNvbHZlZENvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouY29uZmlnKSxcbiAgICAnZmlsZSc6IG9iai5maWxlLFxuICAgICdwcmUtY2FubmVkJzogb2JqLnByZUNhbm5lZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEFydGlmYWN0cyB0byB1cGxvYWQgZm9sbG93aW5nIGFuYWx5c2lzIHdoZW4gdGhlIGFuYWx5c2lzIGxvY2F0aW9uIGlzIENvbm5lY3QuXG4gKlxuICogQHNjaGVtYSBBbmFseXplQ29ubmVjdENvbmZpZ3VyYXRpb25VcGxvYWRBcnRpZmFjdHNcbiAqL1xuZXhwb3J0IGVudW0gQW5hbHl6ZUNvbm5lY3RDb25maWd1cmF0aW9uVXBsb2FkQXJ0aWZhY3RzIHtcbiAgLyoqIEFsbCAqL1xuICBBTEwgPSBcIkFsbFwiLFxuICAvKiogTG9nc09ubHkgKi9cbiAgTE9HU19PTkxZID0gXCJMb2dzT25seVwiLFxuICAvKiogTm9uZSAqL1xuICBOT05FID0gXCJOb25lXCIsXG4gIC8qKiBPbkZhaWx1cmUgKi9cbiAgT05fRkFJTFVSRSA9IFwiT25GYWlsdXJlXCIsXG59XG5cbi8qKlxuICogU2VjdXJpdHkgZGlyZWN0aXZlcyBjb25maWd1cmF0aW9uIHRvIHVzZSBkdXJpbmcgdGhlIGFuYWx5c2lzLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJmaWxlXCIga2V5IGFuZCBpcyBzcGVjaWZpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgd2FudHMgdG8gaW4tbGluZSB0aGUgc2VjdXJpdHkgZGlyZWN0aXZlcyBjb25maWd1cmF0aW9uIGluIHRoZSBmaWxlLlxuICpcbiAqIEBzY2hlbWEgRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVzQ29uZmlndXJhdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgcGFydGljdWxhciBhbmFseXNpcyBiZWhhdmlvci5cbiAgICpcbiAgICogQHNjaGVtYSBEaXJlY3RpdmVzQ29uZmlndXJhdGlvbkNvbmZpZyNkaXJlY3RpdmVzXG4gICAqL1xuICByZWFkb25seSBkaXJlY3RpdmVzOiBhbnlbXTtcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgZGlyZWN0aXZlcyBmb3JtYXQuXG4gICAqXG4gICAqIEBzY2hlbWEgRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWcjZm9ybWF0X3ZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdFZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExhbmd1YWdlIG9yIGxhbmd1YWdlIGZhbWlseSB0byB3aGljaCBkaXJlY3RpdmVzIGFwcGx5LlxuICAgKlxuICAgKiBAc2NoZW1hIERpcmVjdGl2ZXNDb25maWd1cmF0aW9uQ29uZmlnI2xhbmd1YWdlXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNdXN0IGJlIHRoZSBzdHJpbmcgXCJDb3Zlcml0eSBhbmFseXNpcyBjb25maWd1cmF0aW9uXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWcjdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IERpcmVjdGl2ZXNDb25maWd1cmF0aW9uQ29uZmlnVHlwZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9EaXJlY3RpdmVzQ29uZmlndXJhdGlvbkNvbmZpZyhvYmo6IERpcmVjdGl2ZXNDb25maWd1cmF0aW9uQ29uZmlnIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGlyZWN0aXZlcyc6IG9iai5kaXJlY3RpdmVzPy5tYXAoeSA9PiB5KSxcbiAgICAnZm9ybWF0X3ZlcnNpb24nOiBvYmouZm9ybWF0VmVyc2lvbixcbiAgICAnbGFuZ3VhZ2UnOiBvYmoubGFuZ3VhZ2UsXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgU2lnbWFDb25maWd1cmF0aW9uRW5hYmxlQ2hlY2tTZXRcbiAqL1xuZXhwb3J0IGVudW0gU2lnbWFDb25maWd1cmF0aW9uRW5hYmxlQ2hlY2tTZXQge1xuICAvKiogYWxsICovXG4gIEFMTCA9IFwiYWxsXCIsXG4gIC8qKiBjaXMgKi9cbiAgQ0lTID0gXCJjaXNcIixcbiAgLyoqIGRlZmF1bHQgKi9cbiAgREVGQVVMVCA9IFwiZGVmYXVsdFwiLFxuICAvKiogZW1wdHkgKi9cbiAgRU1QVFkgPSBcImVtcHR5XCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBwYXJhbGxlbC10cmFuc2xhdGUtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFsbGVsVHJhbnNsYXRlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciBjb3YtdHJhbnNsYXRlIHBhcmFsbGVsaXphdGlvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQHNjaGVtYSBwYXJhbGxlbC10cmFuc2xhdGUtY29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY292LWVtaXQgcHJvY2Vzc2VzIHRvIGJlIHJ1biBpbiBwYXJhbGxlbCBieSBjb3YtdHJhbnNsYXRlIHdoZW4gbXVsdGlwbGUgZmlsZXMgYXJlIHNlZW4gb24gYSBzaW5nbGUgbmF0aXZlIGNvbXBpbGVyIGludm9jYXRpb24uIEEgdmFsdWUgb2YgMCB3aWxsIHVzZSB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycyBpbiB0aGUgbWFjaGluZS5cbiAgICpcbiAgICogQHNjaGVtYSBwYXJhbGxlbC10cmFuc2xhdGUtY29uZmlndXJhdGlvbiNwcm9jZXNzZXNcbiAgICovXG4gIHJlYWRvbmx5IHByb2Nlc3Nlcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uKG9iajogUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdwcm9jZXNzZXMnOiBvYmoucHJvY2Vzc2VzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSB3ZWJhcHAtYXJjaGl2ZS1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViYXBwQXJjaGl2ZUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmaWxlIG9yIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleHBsb2RlZCB3ZWIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgd2ViYXBwLWFyY2hpdmUtY29uZmlndXJhdGlvbiNwYXRoXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgd2ViLWFwcCBzaG91bGQgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQgaXMgdmFsaWQgZHVyaW5nIGNhcHR1cmUuIFRoZSB2YWxpZGF0aW9uIGNoZWNrIGNoZWNrcyB0aGF0IHRoZXJlIGlzIGEgXCIvV0VCLUlORi93ZWIueG1sXCIgZmlsZSBhbmQgdGhhdCA+IDIwJSBvZiBjbGFzc2VzIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIHdlcmUgY2FwdHVyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgd2ViYXBwLWFyY2hpdmUtY29uZmlndXJhdGlvbiN2YWxpZGF0ZS13ZWJhcHBcbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRlV2ViYXBwPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnV2ViYXBwQXJjaGl2ZUNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9XZWJhcHBBcmNoaXZlQ29uZmlndXJhdGlvbihvYmo6IFdlYmFwcEFyY2hpdmVDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICd2YWxpZGF0ZS13ZWJhcHAnOiBvYmoudmFsaWRhdGVXZWJhcHAsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIExhbmd1YWdlc0NvbmZpZ3VyYXRpb25FeGNsdWRlXG4gKi9cbmV4cG9ydCBlbnVtIExhbmd1YWdlc0NvbmZpZ3VyYXRpb25FeGNsdWRlIHtcbiAgLyoqIGFwZXggKi9cbiAgQVBFWCA9IFwiYXBleFwiLFxuICAvKiogYy1mYW1pbHkgKi9cbiAgQ19IWVBIRU5fRkFNSUxZID0gXCJjLWZhbWlseVwiLFxuICAvKiogY3NoYXJwICovXG4gIENTSEFSUCA9IFwiY3NoYXJwXCIsXG4gIC8qKiBkYXJ0ICovXG4gIERBUlQgPSBcImRhcnRcIixcbiAgLyoqIGdvICovXG4gIEdPID0gXCJnb1wiLFxuICAvKiogamF2YSAqL1xuICBKQVZBID0gXCJqYXZhXCIsXG4gIC8qKiBqYXZhc2NyaXB0ICovXG4gIEpBVkFTQ1JJUFQgPSBcImphdmFzY3JpcHRcIixcbiAgLyoqIGtvdGxpbiAqL1xuICBLT1RMSU4gPSBcImtvdGxpblwiLFxuICAvKiogcGhwICovXG4gIFBIUCA9IFwicGhwXCIsXG4gIC8qKiBweXRob24gKi9cbiAgUFlUSE9OID0gXCJweXRob25cIixcbiAgLyoqIHJ1YnkgKi9cbiAgUlVCWSA9IFwicnVieVwiLFxuICAvKiogc3dpZnQgKi9cbiAgU1dJRlQgPSBcInN3aWZ0XCIsXG4gIC8qKiB2YiAqL1xuICBWQiA9IFwidmJcIixcbiAgLyoqIGNvbmZpZ3VyYXRpb24gKi9cbiAgQ09ORklHVVJBVElPTiA9IFwiY29uZmlndXJhdGlvblwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgTGFuZ3VhZ2VzQ29uZmlndXJhdGlvbkluY2x1ZGVcbiAqL1xuZXhwb3J0IGVudW0gTGFuZ3VhZ2VzQ29uZmlndXJhdGlvbkluY2x1ZGUge1xuICAvKiogYXBleCAqL1xuICBBUEVYID0gXCJhcGV4XCIsXG4gIC8qKiBjLWZhbWlseSAqL1xuICBDX0hZUEhFTl9GQU1JTFkgPSBcImMtZmFtaWx5XCIsXG4gIC8qKiBjc2hhcnAgKi9cbiAgQ1NIQVJQID0gXCJjc2hhcnBcIixcbiAgLyoqIGRhcnQgKi9cbiAgREFSVCA9IFwiZGFydFwiLFxuICAvKiogZ28gKi9cbiAgR08gPSBcImdvXCIsXG4gIC8qKiBqYXZhICovXG4gIEpBVkEgPSBcImphdmFcIixcbiAgLyoqIGphdmFzY3JpcHQgKi9cbiAgSkFWQVNDUklQVCA9IFwiamF2YXNjcmlwdFwiLFxuICAvKioga290bGluICovXG4gIEtPVExJTiA9IFwia290bGluXCIsXG4gIC8qKiBwaHAgKi9cbiAgUEhQID0gXCJwaHBcIixcbiAgLyoqIHB5dGhvbiAqL1xuICBQWVRIT04gPSBcInB5dGhvblwiLFxuICAvKiogcnVieSAqL1xuICBSVUJZID0gXCJydWJ5XCIsXG4gIC8qKiBzd2lmdCAqL1xuICBTV0lGVCA9IFwic3dpZnRcIixcbiAgLyoqIHZiICovXG4gIFZCID0gXCJ2YlwiLFxuICAvKiogY29uZmlndXJhdGlvbiAqL1xuICBDT05GSUdVUkFUSU9OID0gXCJjb25maWd1cmF0aW9uXCIsXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdHJ1c3Qgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzIHByZXNlbnRlZCBieSBDb3Zlcml0eSBDb25uZWN0IHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgdHJ1c3RlZC5cbiAqXG4gKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0T25OZXdDZXJ0XG4gKi9cbmV4cG9ydCBlbnVtIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0T25OZXdDZXJ0IHtcbiAgLyoqIHRydXN0ICovXG4gIFRSVVNUID0gXCJ0cnVzdFwiLFxuICAvKiogZGlzdHJ1c3QgKi9cbiAgRElTVFJVU1QgPSBcImRpc3RydXN0XCIsXG59XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBjb250cm9sIG1hbmFnZW1lbnQgc3lzdGVtLlxuICpcbiAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RTY21cbiAqL1xuZXhwb3J0IGVudW0gQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RTY20ge1xuICAvKiogYWRzICovXG4gIEFEUyA9IFwiYWRzXCIsXG4gIC8qKiBjbGVhcmNhc2UgKi9cbiAgQ0xFQVJDQVNFID0gXCJjbGVhcmNhc2VcIixcbiAgLyoqIGN2cyAqL1xuICBDVlMgPSBcImN2c1wiLFxuICAvKiogZ2l0ICovXG4gIEdJVCA9IFwiZ2l0XCIsXG4gIC8qKiBoZyAqL1xuICBIRyA9IFwiaGdcIixcbiAgLyoqIHBlcmZvcmNlICovXG4gIFBFUkZPUkNFID0gXCJwZXJmb3JjZVwiLFxuICAvKiogcGxhc3RpYyAqL1xuICBQTEFTVElDID0gXCJwbGFzdGljXCIsXG4gIC8qKiBwbGFzdGljLWRpc3RyaWJ1dGVkICovXG4gIFBMQVNUSUNfSFlQSEVOX0RJU1RSSUJVVEVEID0gXCJwbGFzdGljLWRpc3RyaWJ1dGVkXCIsXG4gIC8qKiBzdm4gKi9cbiAgU1ZOID0gXCJzdm5cIixcbiAgLyoqIHRmcyAqL1xuICBURlMgPSBcInRmc1wiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgc25hcHNob3QtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNuYXBzaG90Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBEYXRlIGFuZCB0aW1lIG9mIHNuYXBzaG90IHRvIHVzZSBmb3IgY29tcGFyaXNvbiByZXBvcnQuIFRoZSB2YWx1ZSBzaG91bGQgYmUgb2YgdGhlIGZvcm0gXCJZWVlZLU1NLUREVGhoOm1tOnNzXCIgd2hlcmUgZGF0ZSBhbmQgdGltZSBhcmUgc2VwYXJhdGVkIGJ5IGEgXCJUXCIsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSB0aW1lIHpvbmUgc3BlY2lmaWNhdGlvbiBjb25zaXN0aW5nIG9mIGVpdGhlciBcIlpcIiBkZW5vdGluZyBVVEMgb3IgYSBcIitcIiBvciBcIi1cIiBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgY29sb24tc2VwYXJhdGVkIGhvdXJzIGFuZCBtaW51dGVzIGVhc3Qgb2YgVVRDLiBFeGFtcGxlOiBcIjIwMjMtMTItMjdUMTM6MjE6MDUtMDg6MDBcIi4gSWYgbm8gdGltZSB6b25lIGlzIHNwZWNpZmllZCwgdGhlIGxvY2FsIHRpbWUgem9uZSBpcyBhc3N1bWVkLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJpZFwiIGFuZCBcInJlZmVyZW5jZVwiIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgc25hcHNob3QtY29uZmlndXJhdGlvbiNkYXRlXG4gICAqL1xuICByZWFkb25seSBkYXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRCBvZiBzbmFwc2hvdCB0byB1c2UgZm9yIGNvbXBhcmlzb24gcmVwb3J0LiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJkYXRlXCIgYW5kIFwicmVmZXJlbmNlXCIga2V5cy5cbiAgICpcbiAgICogQHNjaGVtYSBzbmFwc2hvdC1jb25maWd1cmF0aW9uI2lkXG4gICAqL1xuICByZWFkb25seSBpZD86IG51bWJlcjtcblxuICAvKipcbiAgICogT25lIG9mIFwiaWRpclwiLCBcImxhdGVzdFwiLCBvciBcInNjbVwiLiBcImlkaXJcIiB3aWxsIHVzZSB0aGUgc25hcHNob3QgY3JlYXRlZCBjbG9zZXN0IHRvLCBidXQgbm90IGFmdGVyLCB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUgaW50ZXJtZWRpYXRlIGRpcmVjdG9yeS4gXCJsYXRlc3RcIiB3aWxsIHVzZSB0aGUgc25hcHNob3Qgd2l0aCB0aGUgbGF0ZXN0IGNvZGUtdmVyc2lvbiBkYXRlIGluIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBcInNjbVwiIHdpbGwgcXVlcnkgdGhlIFNDTSB0byBkZXRlcm1pbmUgdGhlIHZlcnNpb24gdGhhdCB3YXMgbW9zdCByZWNlbnRseSBjaGVja2VkIG91dCBvciB1cGRhdGVkLCBhbmQgdGhlbiB1c2UgdGhlIGNsb3Nlc3Qgc25hcHNob3QuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImRhdGVcIiBhbmQgXCJpZFwiIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgc25hcHNob3QtY29uZmlndXJhdGlvbiNyZWZlcmVuY2VcbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZT86IGFueTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU25hcHNob3RDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU25hcHNob3RDb25maWd1cmF0aW9uKG9iajogU25hcHNob3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGF0ZSc6IG9iai5kYXRlLFxuICAgICdpZCc6IG9iai5pZCxcbiAgICAncmVmZXJlbmNlJzogb2JqLnJlZmVyZW5jZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyBob3cgbmV3IGRlZmVjdHMgc2hvdWxkIGJlIGhhbmRsZWQuXG4gKlxuICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VHJpYWdlIHtcbiAgLyoqXG4gICAqIFVzZXIgdG8gd2hvbSBhbnkgbmV3IGRlZmVjdHMgd2lsbCBiZSBhc3NpZ25lZC4gVGhlIHNwZWNpZmllZCB1c2VyIG11c3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgQ292ZXJpdHkgQ29ubmVjdCBkYXRhYmFzZS4gVGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZSNuZXctZGVmZWN0LW93bmVyXG4gICAqL1xuICByZWFkb25seSBuZXdEZWZlY3RPd25lcj86IHN0cmluZztcblxuICAvKipcbiAgICogTGltaXQgb24gdGhlIG51bWJlciBvZiBkZWZlY3RzIHRvIGFzc2lnbiB0byB0aGUgc3BlY2lmaWVkIHVzZXIuIElmIHRoZSBudW1iZXIgb2YgZGlzY292ZXJlZCBkZWZlY3RzIGlzIG1vcmUgdGhhbiB0aGUgbGltaXQsIHRoZW4gbm8gYXNzaWdubWVudCBpcyBkb25lLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VHJpYWdlI25ldy1kZWZlY3Qtb3duZXItbGltaXRcbiAgICovXG4gIHJlYWRvbmx5IG5ld0RlZmVjdE93bmVyTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBvd25lciBmb3IgbmV3bHkgZGV0ZWN0ZWQgZGVmZWN0cyB0aGF0IGV4aXN0IGxvY2FsbHkgaXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdXNlci5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZSNzZXQtbmV3LWRlZmVjdC1vd25lclxuICAgKi9cbiAgcmVhZG9ubHkgc2V0TmV3RGVmZWN0T3duZXI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VHJpYWdlKG9iajogQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RUcmlhZ2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduZXctZGVmZWN0LW93bmVyJzogb2JqLm5ld0RlZmVjdE93bmVyLFxuICAgICduZXctZGVmZWN0LW93bmVyLWxpbWl0Jzogb2JqLm5ld0RlZmVjdE93bmVyTGltaXQsXG4gICAgJ3NldC1uZXctZGVmZWN0LW93bmVyJzogb2JqLnNldE5ld0RlZmVjdE93bmVyLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQXJ0aWZhY3RzIHRvIHVwbG9hZCBmb2xsb3dpbmcgYW5hbHlzaXMgd2hlbiB0aGUgYW5hbHlzaXMgbG9jYXRpb24gaXMgQ29ubmVjdC5cbiAqXG4gKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VXBsb2FkQXJ0aWZhY3RzXG4gKi9cbmV4cG9ydCBlbnVtIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VXBsb2FkQXJ0aWZhY3RzIHtcbiAgLyoqIEFsbCAqL1xuICBBTEwgPSBcIkFsbFwiLFxuICAvKiogTG9nc09ubHkgKi9cbiAgTE9HU19PTkxZID0gXCJMb2dzT25seVwiLFxuICAvKiogTm9uZSAqL1xuICBOT05FID0gXCJOb25lXCIsXG4gIC8qKiBPbkZhaWx1cmUgKi9cbiAgT05fRkFJTFVSRSA9IFwiT25GYWlsdXJlXCIsXG59XG5cbi8qKlxuICogRm9ybWF0IGluIHdoaWNoIHRvIHNhdmUgZGVmZWN0cy4gRWl0aGVyIFwiaHRtbFwiIG9yIFwianNvblwiLlxuICpcbiAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsRm9ybWF0XG4gKi9cbmV4cG9ydCBlbnVtIENvbW1pdENvbmZpZ3VyYXRpb25Mb2NhbEZvcm1hdCB7XG4gIC8qKiBodG1sICovXG4gIEhUTUwgPSBcImh0bWxcIixcbiAgLyoqIGpzb24gKi9cbiAgSlNPTiA9IFwianNvblwiLFxufVxuXG4vKipcbiAqIFNldHMgdGhlIHdlYiBhcHBsaWNhdGlvbiBjaGVja2VycyBhZ2dyZXNzaXZlbmVzcyBsZXZlbC5cbiAqXG4gKiBAc2NoZW1hIENoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHlBZ2dyZXNzaXZlbmVzc0xldmVsXG4gKi9cbmV4cG9ydCBlbnVtIENoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHlBZ2dyZXNzaXZlbmVzc0xldmVsIHtcbiAgLyoqIGxvdyAqL1xuICBMT1cgPSBcImxvd1wiLFxuICAvKiogbWVkaXVtICovXG4gIE1FRElVTSA9IFwibWVkaXVtXCIsXG4gIC8qKiBoaWdoICovXG4gIEhJR0ggPSBcImhpZ2hcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIHJlc29sdmVkLWNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogTGlzdCBvZiBkZXZpYXRpb25zIGZvciB0aGlzIHN0YW5kYXJkLlxuICAgKlxuICAgKiBAc2NoZW1hIHJlc29sdmVkLWNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI2RldmlhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRldmlhdGlvbnM/OiBDb2RpbmdTdGFuZGFyZERldmlhdGlvbltdO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoaXMgY29kZSBjb21wbGlhbmNlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgcmVzb2x2ZWQtY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jdGl0bGVcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhpcyBjb2RlIGNvbXBsaWFuY2UgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSByZXNvbHZlZC1jb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiN2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdSZXNvbHZlZENvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1Jlc29sdmVkQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iajogUmVzb2x2ZWRDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkZXZpYXRpb25zJzogb2JqLmRldmlhdGlvbnM/Lm1hcCh5ID0+IHRvSnNvbl9Db2RpbmdTdGFuZGFyZERldmlhdGlvbih5KSksXG4gICAgJ3RpdGxlJzogb2JqLnRpdGxlLFxuICAgICd2ZXJzaW9uJzogb2JqLnZlcnNpb24sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBNdXN0IGJlIHRoZSBzdHJpbmcgXCJDb3Zlcml0eSBhbmFseXNpcyBjb25maWd1cmF0aW9uXCIuXG4gKlxuICogQHNjaGVtYSBEaXJlY3RpdmVzQ29uZmlndXJhdGlvbkNvbmZpZ1R5cGVcbiAqL1xuZXhwb3J0IGVudW0gRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWdUeXBlIHtcbiAgLyoqIENvdmVyaXR5IGFuYWx5c2lzIGNvbmZpZ3VyYXRpb24gKi9cbiAgQ09WRVJJVFlfQU5BTFlTSVNfQ09ORklHVVJBVElPTiA9IFwiQ292ZXJpdHkgYW5hbHlzaXMgY29uZmlndXJhdGlvblwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWRldmlhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGluZ1N0YW5kYXJkRGV2aWF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBydWxlIHRvIGRldmlhdGUgZnJvbS5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtZGV2aWF0aW9uI2RldmlhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWFzb24gdGhhdCB0aGUgcnVsZSBpcyBiZWluZyBkZXZpYXRlZCBmcm9tLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1kZXZpYXRpb24jcmVhc29uXG4gICAqL1xuICByZWFkb25seSByZWFzb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29kaW5nU3RhbmRhcmREZXZpYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Db2RpbmdTdGFuZGFyZERldmlhdGlvbihvYmo6IENvZGluZ1N0YW5kYXJkRGV2aWF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGV2aWF0aW9uJzogb2JqLmRldmlhdGlvbixcbiAgICAncmVhc29uJzogb2JqLnJlYXNvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuIl19