projen
Version:
CDK for software projects
187 lines • 44.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PyprojectTomlProjectDynamic = void 0;
exports.toJson_PyprojectToml = toJson_PyprojectToml;
exports.toJson_PyprojectTomlProject = toJson_PyprojectTomlProject;
exports.toJson_PyprojectTomlDependencyGroups = toJson_PyprojectTomlDependencyGroups;
exports.toJson_BuildSystem = toJson_BuildSystem;
exports.toJson_PyprojectTomlTool = toJson_PyprojectTomlTool;
exports.toJson_ProjectAuthor = toJson_ProjectAuthor;
/**
* Converts an object of type 'PyprojectToml' to JSON representation.
* @internal
*/
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_PyprojectToml(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
'project': toJson_PyprojectTomlProject(obj.project),
'dependency-groups': toJson_PyprojectTomlDependencyGroups(obj.dependencyGroups),
'build-system': toJson_BuildSystem(obj.buildSystem),
'tool': toJson_PyprojectTomlTool(obj.tool),
};
// filter undefined values
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
* Converts an object of type 'PyprojectTomlProject' to JSON representation.
* @internal
*/
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_PyprojectTomlProject(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
'name': obj.name,
'version': obj.version,
'description': obj.description,
'readme': obj.readme,
'requires-python': obj.requiresPython,
'license': obj.license,
'license-files': obj.licenseFiles?.map(y => y),
'authors': obj.authors?.map(y => toJson_ProjectAuthor(y)),
'maintainers': obj.maintainers?.map(y => toJson_ProjectAuthor(y)),
'keywords': obj.keywords?.map(y => y),
'classifiers': obj.classifiers?.map(y => y),
'urls': ((obj.urls) === undefined) ? undefined : (Object.entries(obj.urls).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
'scripts': ((obj.scripts) === undefined) ? undefined : (Object.entries(obj.scripts).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
'gui-scripts': ((obj.guiScripts) === undefined) ? undefined : (Object.entries(obj.guiScripts).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
'entry-points': obj.entryPoints,
'dependencies': obj.dependencies?.map(y => y),
'optional-dependencies': obj.optionalDependencies,
'import-names': obj.importNames?.map(y => y),
'import-namespaces': obj.importNamespaces?.map(y => y),
'dynamic': obj.dynamic?.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 'PyprojectTomlDependencyGroups' to JSON representation.
* @internal
*/
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_PyprojectTomlDependencyGroups(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
'dev': obj.dev?.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 'BuildSystem' to JSON representation.
* @internal
*/
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_BuildSystem(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
'requires': obj.requires?.map(y => y),
'build-backend': obj.buildBackend,
'backend-path': obj.backendPath?.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 'PyprojectTomlTool' to JSON representation.
* @internal
*/
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_PyprojectTomlTool(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
'black': obj.black,
'cibuildwheel': obj.cibuildwheel,
'mypy': obj.mypy,
'ruff': obj.ruff,
'ty': obj.ty,
'hatch': obj.hatch,
'maturin': obj.maturin,
'scikit-build': obj.scikitBuild,
'setuptools': obj.setuptools,
'setuptools_scm': obj.setuptoolsScm,
'poe': obj.poe,
'poetry': obj.poetry,
'pdm': obj.pdm,
'pyright': obj.pyright,
'pytest': obj.pytest,
'repo-review': obj.repoReview,
'taskipy': obj.taskipy,
'tombi': obj.tombi,
'tox': obj.tox,
'uv': obj.uv,
};
// filter undefined values
return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
}
/**
* Converts an object of type 'ProjectAuthor' to JSON representation.
* @internal
*/
/* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
function toJson_ProjectAuthor(obj) {
if (obj === undefined) {
return undefined;
}
const result = {
'name': obj.name,
'email': obj.email,
};
// 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 PyprojectTomlProjectDynamic
*/
var PyprojectTomlProjectDynamic;
(function (PyprojectTomlProjectDynamic) {
/** version */
PyprojectTomlProjectDynamic["VERSION"] = "version";
/** description */
PyprojectTomlProjectDynamic["DESCRIPTION"] = "description";
/** readme */
PyprojectTomlProjectDynamic["README"] = "readme";
/** requires-python */
PyprojectTomlProjectDynamic["REQUIRES_HYPHEN_PYTHON"] = "requires-python";
/** license */
PyprojectTomlProjectDynamic["LICENSE"] = "license";
/** license-files */
PyprojectTomlProjectDynamic["LICENSE_HYPHEN_FILES"] = "license-files";
/** authors */
PyprojectTomlProjectDynamic["AUTHORS"] = "authors";
/** maintainers */
PyprojectTomlProjectDynamic["MAINTAINERS"] = "maintainers";
/** keywords */
PyprojectTomlProjectDynamic["KEYWORDS"] = "keywords";
/** classifiers */
PyprojectTomlProjectDynamic["CLASSIFIERS"] = "classifiers";
/** urls */
PyprojectTomlProjectDynamic["URLS"] = "urls";
/** scripts */
PyprojectTomlProjectDynamic["SCRIPTS"] = "scripts";
/** gui-scripts */
PyprojectTomlProjectDynamic["GUI_HYPHEN_SCRIPTS"] = "gui-scripts";
/** entry-points */
PyprojectTomlProjectDynamic["ENTRY_HYPHEN_POINTS"] = "entry-points";
/** dependencies */
PyprojectTomlProjectDynamic["DEPENDENCIES"] = "dependencies";
/** optional-dependencies */
PyprojectTomlProjectDynamic["OPTIONAL_HYPHEN_DEPENDENCIES"] = "optional-dependencies";
/** import-names */
PyprojectTomlProjectDynamic["IMPORT_HYPHEN_NAMES"] = "import-names";
/** import-namespaces */
PyprojectTomlProjectDynamic["IMPORT_HYPHEN_NAMESPACES"] = "import-namespaces";
})(PyprojectTomlProjectDynamic || (exports.PyprojectTomlProjectDynamic = PyprojectTomlProjectDynamic = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHlwcm9qZWN0LXRvbWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHl0aG9uL3B5cHJvamVjdC10b21sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXVDQSxvREFVQztBQW9LRCxrRUEwQkM7QUFvQkQsb0ZBT0M7QUFvQ0QsZ0RBU0M7QUEySkQsNERBMEJDO0FBdUJELG9EQVFDO0FBemVEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixvQkFBb0IsQ0FBQyxHQUE4QjtJQUNqRSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFNBQVMsRUFBRSwyQkFBMkIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ25ELG1CQUFtQixFQUFFLG9DQUFvQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvRSxjQUFjLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUNuRCxNQUFNLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztLQUMzQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUErSkQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDJCQUEyQixDQUFDLEdBQXFDO0lBQy9FLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2hCLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDOUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1FBQ3BCLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxjQUFjO1FBQ3JDLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixlQUFlLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckosU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlKLGFBQWEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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c0JBQXNCO0lBQ3RCLHlFQUEwQyxDQUFBO0lBQzFDLGNBQWM7SUFDZCxrREFBbUIsQ0FBQTtJQUNuQixvQkFBb0I7SUFDcEIscUVBQXNDLENBQUE7SUFDdEMsY0FBYztJQUNkLGtEQUFtQixDQUFBO0lBQ25CLGtCQUFrQjtJQUNsQiwwREFBMkIsQ0FBQTtJQUMzQixlQUFlO0lBQ2Ysb0RBQXFCLENBQUE7SUFDckIsa0JBQWtCO0lBQ2xCLDBEQUEyQixDQUFBO0lBQzNCLFdBQVc7SUFDWCw0Q0FBYSxDQUFBO0lBQ2IsY0FBYztJQUNkLGtEQUFtQixDQUFBO0lBQ25CLGtCQUFrQjtJQUNsQixpRUFBa0MsQ0FBQTtJQUNsQyxtQkFBbUI7SUFDbkIsbUVBQW9DLENBQUE7SUFDcEMsbUJBQW1CO0lBQ25CLDREQUE2QixDQUFBO0lBQzdCLDRCQUE0QjtJQUM1QixxRkFBc0QsQ0FBQTtJQUN0RCxtQkFBbUI7SUFDbkIsbUVBQW9DLENBQUE7SUFDcEMsd0JBQXdCO0lBQ3hCLDZFQUE4QyxDQUFBO0FBQ2hELENBQUMsRUFyQ1csMkJBQTJCLDJDQUEzQiwyQkFBMkIsUUFxQ3RDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibm9kZSAuL3Byb2plbi5qc1wiLlxuLyoqXG4gKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQeXByb2plY3RUb21sIHtcbiAgLyoqXG4gICAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgbWV0YWRhdGE6IF9zdGF0aWNfIGFuZCBfZHluYW1pY18uXG4gICAqIC0gU3RhdGljIG1ldGFkYXRhIGlzIGxpc3RlZCBpbiB0aGUgYFtwcm9qZWN0XWAgdGFibGUgZGlyZWN0bHkgYW5kIGNhbm5vdCBiZSBzcGVjaWZpZWQgb3IgY2hhbmdlZCBieSBhIHRvb2wuXG4gICAqIC0gRHluYW1pYyBtZXRhZGF0YSBrZXkgbmFtZXMgYXJlIGxpc3RlZCBpbnNpZGUgdGhlIGBkeW5hbWljYCBrZXkgYW5kIHJlcHJlc2VudHMgbWV0YWRhdGEgdGhhdCBhIHRvb2wgd2lsbCBsYXRlciBwcm92aWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWwjcHJvamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdD86IFB5cHJvamVjdFRvbWxQcm9qZWN0O1xuXG4gIC8qKlxuICAgKiBOYW1lZCBncm91cHMgb2YgZGVwZW5kZW5jaWVzLCBzaW1pbGFyIHRvIGByZXF1aXJlbWVudHMudHh0YCBmaWxlcywgd2hpY2ggbGF1bmNoZXJzLCBJREVzLCBhbmQgb3RoZXIgdG9vbHMgY2FuIGZpbmQgYW5kIGlkZW50aWZ5IGJ5IG5hbWUuIEVhY2ggaXRlbSBpbiBgW2RlcGVuZGVuY3ktZ3JvdXBzXWAgaXMgZGVmaW5lZCBhcyBtYXBwaW5nIG9mIGdyb3VwIG5hbWUgdG8gbGlzdCBvZiBbZGVwZW5kZW5jeSBzcGVjaWZpZXJzXShodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zcGVjaWZpY2F0aW9ucy9kZXBlbmRlbmN5LXNwZWNpZmllcnMvKS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sI2RlcGVuZGVuY3ktZ3JvdXBzXG4gICAqL1xuICByZWFkb25seSBkZXBlbmRlbmN5R3JvdXBzPzogUHlwcm9qZWN0VG9tbERlcGVuZGVuY3lHcm91cHM7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbCNidWlsZC1zeXN0ZW1cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkU3lzdGVtPzogQnVpbGRTeXN0ZW07XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHRvb2wgdGhhdCBpcyB1c2VkIGJ5IHRoZSBwcm9qZWN0IGNhbiBoYXZlIHVzZXJzIHNwZWNpZnkgY29uZmlndXJhdGlvbiBkYXRhIGFzIGxvbmcgYXMgdGhleSB1c2UgYSBzdWItdGFibGUgd2l0aGluIGBbdG9vbF1gLiBHZW5lcmFsbHkgYSBwcm9qZWN0IGNhbiB1c2UgdGhlIHN1YnRhYmxlIGB0b29sLiROQU1FYCBpZiwgYW5kIG9ubHkgaWYsIHRoZXkgb3duIHRoZSBlbnRyeSBmb3IgYCROQU1FYCBpbiB0aGUgQ2hlZXNlc2hvcC9QeVBJLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWwjdG9vbFxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbD86IFB5cHJvamVjdFRvbWxUb29sO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdQeXByb2plY3RUb21sJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUHlwcm9qZWN0VG9tbChvYmo6IFB5cHJvamVjdFRvbWwgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwcm9qZWN0JzogdG9Kc29uX1B5cHJvamVjdFRvbWxQcm9qZWN0KG9iai5wcm9qZWN0KSxcbiAgICAnZGVwZW5kZW5jeS1ncm91cHMnOiB0b0pzb25fUHlwcm9qZWN0VG9tbERlcGVuZGVuY3lHcm91cHMob2JqLmRlcGVuZGVuY3lHcm91cHMpLFxuICAgICdidWlsZC1zeXN0ZW0nOiB0b0pzb25fQnVpbGRTeXN0ZW0ob2JqLmJ1aWxkU3lzdGVtKSxcbiAgICAndG9vbCc6IHRvSnNvbl9QeXByb2plY3RUb21sVG9vbChvYmoudG9vbCksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIG1ldGFkYXRhOiBfc3RhdGljXyBhbmQgX2R5bmFtaWNfLlxuICogLSBTdGF0aWMgbWV0YWRhdGEgaXMgbGlzdGVkIGluIHRoZSBgW3Byb2plY3RdYCB0YWJsZSBkaXJlY3RseSBhbmQgY2Fubm90IGJlIHNwZWNpZmllZCBvciBjaGFuZ2VkIGJ5IGEgdG9vbC5cbiAqIC0gRHluYW1pYyBtZXRhZGF0YSBrZXkgbmFtZXMgYXJlIGxpc3RlZCBpbnNpZGUgdGhlIGBkeW5hbWljYCBrZXkgYW5kIHJlcHJlc2VudHMgbWV0YWRhdGEgdGhhdCBhIHRvb2wgd2lsbCBsYXRlciBwcm92aWRlLlxuICpcbiAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFByb2plY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQeXByb2plY3RUb21sUHJvamVjdCB7XG4gIC8qKlxuICAgKiBWYWxpZCBuYW1lIGNvbnNpc3RzIG9ubHkgb2YgQVNDSUkgbGV0dGVycyBhbmQgbnVtYmVycywgcGVyaW9kLCB1bmRlcnNjb3JlIGFuZCBoeXBoZW4uIEl0IG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGEgbGV0dGVyIG9yIG51bWJlci5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIHByb2plY3QsIGFzIGRlZmluZWQgaW4gdGhlIFtWZXJzaW9uIHNwZWNpZmllciBzcGVjaWZpY2F0aW9uXShodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zcGVjaWZpY2F0aW9ucy92ZXJzaW9uLXNwZWNpZmllcnMvKSwgYW5kIHByZWZlcmFibHkgW2FscmVhZHkgbm9ybWFsaXplZF0oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvdmVyc2lvbi1zcGVjaWZpZXJzLyNub3JtYWxpemF0aW9uKS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCN2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdW1tYXJ5IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0IGluIG9uZSBsaW5lLiBUb29scyBtYXkgbm90IGFjY2VwdCBtdWx0aXBsZSBsaW5lcy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbHVlIGNhbiBiZSBhIHJlbGF0aXZlIHBhdGggdG8gdGV4dCAvIG1hcmtkb3duIChgLm1kYCBzdWZmaXgpIC8gcmVTdHJ1Y3R1cmVkVGV4dCAoYC5yc3RgIHN1ZmZpeCkgcmVhZG1lIGZpbGUsIG9yIGEgdGFibGUgd2l0aCBlaXRoZXI6XG4gICAqIC0gYGZpbGVgIGtleSBjb250YWluaW5nIHBhdGggb2YgYWZvcmVtZW50aW9uZWQgcmVhZG1lIGZpbGUsIG9yXG4gICAqIC0gYHRleHRgIGtleSBjb250YWluaW5nIHRoZSBmdWxsIHJlYWRtZSB0ZXh0IGVtYmVkZGVkIGluc2lkZSBgcHlwcm9qZWN0LnRvbWxgLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I3JlYWRtZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZG1lPzogYW55O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIFB5dGhvbiB2ZXJzaW9uKHMpIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBjb21wYXRpYmxlIHdpdGguIE11c3QgYmUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4gW1ZlcnNpb24gc3BlY2lmaWVyc10oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvdmVyc2lvbi1zcGVjaWZpZXJzLykuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFByb2plY3QjcmVxdWlyZXMtcHl0aG9uXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlc1B5dGhvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRm9yIG5vdyBpdCBpcyBhIHRhYmxlIHdpdGggZWl0aGVyOlxuICAgKiAtIGBmaWxlYCBrZXkgc3BlY2lmeWluZyBhIHJlbGF0aXZlIHBhdGggdG8gYSBsaWNlbnNlIGZpbGUsIG9yXG4gICAqIC0gYHRleHRgIGtleSBjb250YWluaW5nIGZ1bGwgbGljZW5zZSBjb250ZW50XG4gICAqXG4gICAqIE5ld2VyIHRvb2wgbWF5IGFjY2VwdCBhIHNpbmdsZSBbU1BEWCBsaWNlbnNlIGV4cHJlc3Npb25dKGh0dHBzOi8vc3BkeC5naXRodWIuaW8vc3BkeC1zcGVjL3YyLjIuMi9TUERYLWxpY2Vuc2UtZXhwcmVzc2lvbnMvKSBzdHJpbmcgaW5zdGVhZCBvZiBhIHRhYmxlLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2xpY2Vuc2VcbiAgICovXG4gIHJlYWRvbmx5IGxpY2Vuc2U/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFJlbGF0aXZlIHBhdGhzIG9yIGdsb2JzIHRvIHBhdGhzIG9mIGxpY2Vuc2UgZmlsZXMuIENhbiBiZSBhbiBlbXB0eSBsaXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2xpY2Vuc2UtZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGxpY2Vuc2VGaWxlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQZW9wbGUgb3Igb3JnYW5pemF0aW9ucyBjb25zaWRlcmVkIGFzICdhdXRob3JzJyBvZiB0aGUgcHJvamVjdC4gRWFjaCBhdXRob3IgaXMgYSB0YWJsZSB3aXRoIGBuYW1lYCBrZXksIGBlbWFpbGAga2V5LCBvciBib3RoLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2F1dGhvcnNcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcnM/OiBQcm9qZWN0QXV0aG9yW107XG5cbiAgLyoqXG4gICAqIFBlb3BsZSBvciBvcmdhbml6YXRpb25zIGNvbnNpZGVyZWQgYXMgJ21haW50YWluZXJzJyBvZiB0aGUgcHJvamVjdC4gRWFjaCBtYWludGFpbmVyIGlzIGEgdGFibGUgd2l0aCBgbmFtZWAga2V5LCBgZW1haWxgIGtleSwgb3IgYm90aC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNtYWludGFpbmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgbWFpbnRhaW5lcnM/OiBQcm9qZWN0QXV0aG9yW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2Yga2V5d29yZHMgb3IgdGFncyB0aGF0IGRlc2NyaWJlIHRoZSBwcm9qZWN0LiBUaGV5IGNvdWxkIGJlIHVzZWQgYnkgc2VhcmNoIGVuZ2luZXMgdG8gY2F0ZWdvcml6ZSB0aGUgcHJvamVjdC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNrZXl3b3Jkc1xuICAgKi9cbiAgcmVhZG9ubHkga2V5d29yZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBbVHJvdmUgY2xhc3NpZmllcnNdKGh0dHBzOi8vcHlwaS5vcmcvY2xhc3NpZmllcnMvKSB0aGF0IGRlc2NyaWJlIHRoZSBwcm9qZWN0LiBQeVBJIHVzZSB0aGUgY2xhc3NpZmllcnMgdG8gY2F0ZWdvcml6ZSBwcm9qZWN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNjbGFzc2lmaWVyc1xuICAgKi9cbiAgcmVhZG9ubHkgY2xhc3NpZmllcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGFibGUgY29uc2lzdGluZyBvbmUgb3IgbXVsdGlwbGUgYGxhYmVsOiBVUkxgIHBhaXJzLiBDb21tb24gaW5kZXhlcyBsaWtlIFB5UEkgdXNlcyBbd2VsbC1rbm93biBQcm9qZWN0IFVSTHNdKGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L3NwZWNpZmljYXRpb25zL3dlbGwta25vd24tcHJvamVjdC11cmxzLyN3ZWxsLWtub3duLWxhYmVscykgd2hlbiBwcmVzZW50aW5nIHByb2plY3QgcGFnZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFByb2plY3QjdXJsc1xuICAgKi9cbiAgcmVhZG9ubHkgdXJscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFRhYmxlIG9mIFtlbnRyeSBwb2ludHNdKGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L3NwZWNpZmljYXRpb25zL2VudHJ5LXBvaW50cy8pIHRoYXQgYWxsb3dzIHBhY2thZ2UgaW5zdGFsbGVycyB0byBjcmVhdGUgYSBjb21tYW5kLWxpbmUgd3JhcHBlciBmb3IuIEVhY2gga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gYmUgY3JlYXRlZCwgYW5kIGVhY2ggdmFsdWUgaXMgdGhlIGZ1bmN0aW9uIG9yIG9iamVjdCB0byBhbGwsIGluIGZvcm0gb2YgZWl0aGVyIGBpbXBvcnRhYmxlLm1vZHVsZWAgb3IgYGltcG9ydGFibGUubW9kdWxlOm9iamVjdC5hdHRyYC4gV2luZG93cyBwbGF0Zm9ybSB0cmVhdHMgYGNvbnNvbGVfc2NyaXB0c2Agc3BlY2lhbGx5IGluIHRoYXQgdGhleSBhcmUgd3JhcHBlZCBpbiBhIGNvbnNvbGUgZXhlY3V0YWJsZSwgc28gdGhleSBhcmUgYXR0YWNoZWQgdG8gYSBjb25zb2xlIGFuZCBjYW4gdXNlIGBzeXMuc3RkaW5gLCBgc3lzLnN0ZG91dGAgYW5kIGBzeXMuc3RkZXJyYCBmb3IgSS9PLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I3NjcmlwdHNcbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUYWJsZSBvZiBbZW50cnkgcG9pbnRzXShodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zcGVjaWZpY2F0aW9ucy9lbnRyeS1wb2ludHMvKSB0aGF0IGFsbG93cyBwYWNrYWdlIGluc3RhbGxlcnMgdG8gY3JlYXRlIGEgR1VJIHdyYXBwZXIgZm9yLiBFYWNoIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgc2NyaXB0IHRvIGJlIGNyZWF0ZWQsIGFuZCBlYWNoIHZhbHVlIGlzIHRoZSBmdW5jdGlvbiBvciBvYmplY3QgdG8gYWxsLCBpbiBmb3JtIG9mIGVpdGhlciBgaW1wb3J0YWJsZS5tb2R1bGVgIG9yIGBpbXBvcnRhYmxlLm1vZHVsZTpvYmplY3QuYXR0cmAuIFdpbmRvd3MgcGxhdGZvcm0gdHJlYXRzIGBndWlfc2NyaXB0c2Agc3BlY2lhbGx5IGluIHRoYXQgdGhleSBhcmUgd3JhcHBlZCBpbiBhIEdVSSBleGVjdXRhYmxlLCBzbyB0aGV5IGNhbiBiZSBzdGFydGVkIHdpdGhvdXQgYSBjb25zb2xlLCBidXQgY2Fubm90IHVzZSBzdGFuZGFyZCBzdHJlYW1zIHVubGVzcyBhcHBsaWNhdGlvbiBjb2RlIHJlZGlyZWN0cyB0aGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2d1aS1zY3JpcHRzXG4gICAqL1xuICByZWFkb25seSBndWlTY3JpcHRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogRXh0cmEgW2VudHJ5IHBvaW50IGdyb3Vwc10oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvZW50cnktcG9pbnRzLykgdGhhdCBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gbG9hZCBwbHVnaW5zLiBGb3IgZXhhbXBsZSwgUHlnbWVudHMgKGEgc3ludGF4IGhpZ2hsaWdodGluZyB0b29sKSBjYW4gdXNlIGFkZGl0aW9uYWwgc3R5bGVzIGZyb20gc2VwYXJhdGVseSBpbnN0YWxsZWQgcGFja2FnZXMgdGhyb3VnaCBgW3Byb2plY3QuZW50cnktcG9pbnRzLlwicHlnbWVudHMuc3R5bGVzXCJdYC4gRWFjaCBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIGVudHJ5LXBvaW50IGdyb3VwLCBhbmQgZWFjaCB2YWx1ZSBpcyBhIHRhYmxlIG9mIGVudHJ5IHBvaW50cy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNlbnRyeS1wb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5UG9pbnRzPzogYW55O1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBbZGVwZW5kZW5jeSBzcGVjaWZpZXJdKGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L3NwZWNpZmljYXRpb25zL2RlcGVuZGVuY3ktc3BlY2lmaWVycy8pIHN0cmluZ3MsIGVhY2ggcmVwcmVzZW50aW5nIGEgbWFuZGF0b3J5IGRlcGVuZGVudCBwYWNrYWdlIG9mIHRoZSBwcm9qZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2RlcGVuZGVuY2llc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEVhY2ggZW50cnkgaXMgYSBrZXkvdmFsdWUgcGFpciwgd2l0aCB0aGUga2V5IHNwZWNpZnlpbmcgW2V4dHJhIGZlYXR1cmUgbmFtZV0oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvY29yZS1tZXRhZGF0YS8jcHJvdmlkZXMtZXh0cmEtbXVsdGlwbGUtdXNlKSAoc3VjaCBhcyBgc29ja3NgIGluIGByZXF1ZXN0c1tzb2Nrc11gKSwgYW5kIHZhbHVlIGlzIGFuIGFycmF5IG9mIFtkZXBlbmRlbmN5IHNwZWNpZmllcl0oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvZGVwZW5kZW5jeS1zcGVjaWZpZXJzLykgc3RyaW5ncy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNvcHRpb25hbC1kZXBlbmRlbmNpZXNcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsRGVwZW5kZW5jaWVzPzogYW55O1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmdzIHNwZWNpZnlpbmcgdGhlIGltcG9ydCBuYW1lcyB0aGF0IHRoZSBwcm9qZWN0IGV4Y2x1c2l2ZWx5IHByb3ZpZGVzIHdoZW4gaW5zdGFsbGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2ltcG9ydC1uYW1lc1xuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0TmFtZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3RyaW5ncyBzcGVjaWZ5aW5nIHRoZSBpbXBvcnQgbmFtZXMgdGhhdCB0aGUgcHJvamVjdCBwcm92aWRlcyB3aGVuIGluc3RhbGxlZCwgYnV0IG5vdCBleGNsdXNpdmVseS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNpbXBvcnQtbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0TmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hpY2gga2V5cyBhcmUgaW50ZW50aW9uYWxseSB1bnNwZWNpZmllZCB1bmRlciBgW3Byb2plY3RdYCB0YWJsZSBzbyBidWlsZCBiYWNrZW5kIGNhbi93aWxsIHByb3ZpZGUgc3VjaCBtZXRhZGF0YSBkeW5hbWljYWxseS4gRWFjaCBrZXkgbXVzdCBiZSBsaXN0ZWQgb25seSBvbmNlLiBJdCBpcyBhbiBlcnJvciB0byBib3RoIGxpc3QgYSBrZXkgaW4gYGR5bmFtaWNgIGFuZCB1c2UgdGhlIGtleSBkaXJlY3RseSBpbiBgW3Byb2plY3RdYC5cbiAgICogT25lIG9mIHRoZSBtb3N0IGNvbW1vbiB1c2FnZSBpcyBgdmVyc2lvbmAsIHdoaWNoIGFsbG93cyBidWlsZCBiYWNrZW5kIHRvIHJldHJpZXZlIHByb2plY3QgdmVyc2lvbiBmcm9tIHNvdXJjZSBjb2RlIG9yIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gaW5zdGVhZCBvZiBoYXJkY29kaW5nIGl0IGluIGBweXByb2plY3QudG9tbGAuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFByb2plY3QjZHluYW1pY1xuICAgKi9cbiAgcmVhZG9ubHkgZHluYW1pYz86IFB5cHJvamVjdFRvbWxQcm9qZWN0RHluYW1pY1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdQeXByb2plY3RUb21sUHJvamVjdCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1B5cHJvamVjdFRvbWxQcm9qZWN0KG9iajogUHlwcm9qZWN0VG9tbFByb2plY3QgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3ZlcnNpb24nOiBvYmoudmVyc2lvbixcbiAgICAnZGVzY3JpcHRpb24nOiBvYmouZGVzY3JpcHRpb24sXG4gICAgJ3JlYWRtZSc6IG9iai5yZWFkbWUsXG4gICAgJ3JlcXVpcmVzLXB5dGhvbic6IG9iai5yZXF1aXJlc1B5dGhvbixcbiAgICAnbGljZW5zZSc6IG9iai5saWNlbnNlLFxuICAgICdsaWNlbnNlLWZpbGVzJzogb2JqLmxpY2Vuc2VGaWxlcz8ubWFwKHkgPT4geSksXG4gICAgJ2F1dGhvcnMnOiBvYmouYXV0aG9ycz8ubWFwKHkgPT4gdG9Kc29uX1Byb2plY3RBdXRob3IoeSkpLFxuICAgICdtYWludGFpbmVycyc6IG9iai5tYWludGFpbmVycz8ubWFwKHkgPT4gdG9Kc29uX1Byb2plY3RBdXRob3IoeSkpLFxuICAgICdrZXl3b3Jkcyc6IG9iai5rZXl3b3Jkcz8ubWFwKHkgPT4geSksXG4gICAgJ2NsYXNzaWZpZXJzJzogb2JqLmNsYXNzaWZpZXJzPy5tYXAoeSA9PiB5KSxcbiAgICAndXJscyc6ICgob2JqLnVybHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai51cmxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnc2NyaXB0cyc6ICgob2JqLnNjcmlwdHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5zY3JpcHRzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnZ3VpLXNjcmlwdHMnOiAoKG9iai5ndWlTY3JpcHRzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmouZ3VpU2NyaXB0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ2VudHJ5LXBvaW50cyc6IG9iai5lbnRyeVBvaW50cyxcbiAgICAnZGVwZW5kZW5jaWVzJzogb2JqLmRlcGVuZGVuY2llcz8ubWFwKHkgPT4geSksXG4gICAgJ29wdGlvbmFsLWRlcGVuZGVuY2llcyc6IG9iai5vcHRpb25hbERlcGVuZGVuY2llcyxcbiAgICAnaW1wb3J0LW5hbWVzJzogb2JqLmltcG9ydE5hbWVzPy5tYXAoeSA9PiB5KSxcbiAgICAnaW1wb3J0LW5hbWVzcGFjZXMnOiBvYmouaW1wb3J0TmFtZXNwYWNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2R5bmFtaWMnOiBvYmouZHluYW1pYz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBOYW1lZCBncm91cHMgb2YgZGVwZW5kZW5jaWVzLCBzaW1pbGFyIHRvIGByZXF1aXJlbWVudHMudHh0YCBmaWxlcywgd2hpY2ggbGF1bmNoZXJzLCBJREVzLCBhbmQgb3RoZXIgdG9vbHMgY2FuIGZpbmQgYW5kIGlkZW50aWZ5IGJ5IG5hbWUuIEVhY2ggaXRlbSBpbiBgW2RlcGVuZGVuY3ktZ3JvdXBzXWAgaXMgZGVmaW5lZCBhcyBtYXBwaW5nIG9mIGdyb3VwIG5hbWUgdG8gbGlzdCBvZiBbZGVwZW5kZW5jeSBzcGVjaWZpZXJzXShodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zcGVjaWZpY2F0aW9ucy9kZXBlbmRlbmN5LXNwZWNpZmllcnMvKS5cbiAqXG4gKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxEZXBlbmRlbmN5R3JvdXBzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHlwcm9qZWN0VG9tbERlcGVuZGVuY3lHcm91cHMge1xuICAvKipcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sRGVwZW5kZW5jeUdyb3VwcyNkZXZcbiAgICovXG4gIHJlYWRvbmx5IGRldj86IGFueVtdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdQeXByb2plY3RUb21sRGVwZW5kZW5jeUdyb3VwcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1B5cHJvamVjdFRvbWxEZXBlbmRlbmN5R3JvdXBzKG9iajogUHlwcm9qZWN0VG9tbERlcGVuZGVuY3lHcm91cHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkZXYnOiBvYmouZGV2Py5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlY2xhcmVzIGFueSBQeXRob24gbGV2ZWwgZGVwZW5kZW5jaWVzIHRoYXQgbXVzdCBiZSBpbnN0YWxsZWQgaW4gb3JkZXIgdG8gcnVuIHRoZSBwcm9qZWN04oCZcyBidWlsZCBzeXN0ZW0gc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIEBzY2hlbWEgQnVpbGRTeXN0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZFN5c3RlbSB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHN0cmluZ3MgZm9sbG93aW5nIHRoZSB2ZXJzaW9uIHNwZWNpZmllciBzcGVjaWZpY2F0aW9uLCByZXByZXNlbnRpbmcgZGVwZW5kZW5jaWVzIHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhlIGJ1aWxkIHN5c3RlbS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWlsZFN5c3RlbSNyZXF1aXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTdHJpbmcgaXMgZm9ybWF0dGVkIGZvbGxvd2luZyB0aGUgc2FtZSBgbW9kdWxlOm9iamVjdGAgc3ludGF4IGFzIGEgYHNldHVwdG9vbHNgIGVudHJ5IHBvaW50LiBJdOKAmXMgYWxzbyBsZWdhbCB0byBsZWF2ZSBvdXQgdGhlIGA6b2JqZWN0YCBwYXJ0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1aWxkU3lzdGVtI2J1aWxkLWJhY2tlbmRcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQmFja2VuZD86IHN0cmluZztcblxuICAvKipcbiAgICogbGlzdCBvZiBkaXJlY3RvcmllcyB0byBwcmVwZW5kIHRvIGBzeXMucGF0aGAgd2hlbiBsb2FkaW5nIHRoZSBidWlsZCBiYWNrZW5kLCByZWxhdGl2ZSB0byBwcm9qZWN0IHJvb3RcbiAgICpcbiAgICogQHNjaGVtYSBCdWlsZFN5c3RlbSNiYWNrZW5kLXBhdGhcbiAgICovXG4gIHJlYWRvbmx5IGJhY2tlbmRQYXRoPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1aWxkU3lzdGVtJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVpbGRTeXN0ZW0ob2JqOiBCdWlsZFN5c3RlbSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3JlcXVpcmVzJzogb2JqLnJlcXVpcmVzPy5tYXAoeSA9PiB5KSxcbiAgICAnYnVpbGQtYmFja2VuZCc6IG9iai5idWlsZEJhY2tlbmQsXG4gICAgJ2JhY2tlbmQtcGF0aCc6IG9iai5iYWNrZW5kUGF0aD8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBFdmVyeSB0b29sIHRoYXQgaXMgdXNlZCBieSB0aGUgcHJvamVjdCBjYW4gaGF2ZSB1c2VycyBzcGVjaWZ5IGNvbmZpZ3VyYXRpb24gZGF0YSBhcyBsb25nIGFzIHRoZXkgdXNlIGEgc3ViLXRhYmxlIHdpdGhpbiBgW3Rvb2xdYC4gR2VuZXJhbGx5IGEgcHJvamVjdCBjYW4gdXNlIHRoZSBzdWJ0YWJsZSBgdG9vbC4kTkFNRWAgaWYsIGFuZCBvbmx5IGlmLCB0aGV5IG93biB0aGUgZW50cnkgZm9yIGAkTkFNRWAgaW4gdGhlIENoZWVzZXNob3AvUHlQSS5cbiAqXG4gKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHlwcm9qZWN0VG9tbFRvb2wge1xuICAvKipcbiAgICogVGhlIHVuY29tcHJvbWlzaW5nIFB5dGhvbiBjb2RlIGZvcm1hdHRlci5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNibGFja1xuICAgKi9cbiAgcmVhZG9ubHkgYmxhY2s/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIFB5dGhvbiB3aGVlbHMgZm9yIGFsbCBwbGF0Zm9ybXMuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjY2lidWlsZHdoZWVsXG4gICAqL1xuICByZWFkb25seSBjaWJ1aWxkd2hlZWw/OiBhbnk7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHN0YXRpYyB0eXBpbmcgZm9yIFB5dGhvbi5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNteXB5XG4gICAqL1xuICByZWFkb25seSBteXB5PzogYW55O1xuXG4gIC8qKlxuICAgKiBBbiBleHRyZW1lbHkgZmFzdCBQeXRob24gbGludGVyIGFuZCBmb3JtYXR0ZXIsIHdyaXR0ZW4gaW4gUnVzdC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNydWZmXG4gICAqL1xuICByZWFkb25seSBydWZmPzogYW55O1xuXG4gIC8qKlxuICAgKiBBbiBleHRyZW1lbHkgZmFzdCBQeXRob24gdHlwZSBjaGVja2VyLCB3cml0dGVuIGluIFJ1c3QuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjdHlcbiAgICovXG4gIHJlYWRvbmx5IHR5PzogYW55O1xuXG4gIC8qKlxuICAgKiBNb2Rlcm4sIGV4dGVuc2libGUgUHl0aG9uIHByb2plY3QgbWFuYWdlbWVudC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNoYXRjaFxuICAgKi9cbiAgcmVhZG9ubHkgaGF0Y2g/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuZCBwdWJsaXNoIGNyYXRlcyB3aXRoIHB5bzMsIGNmZmkgYW5kIHVuaWZmaSBiaW5kaW5ncyBhcyB3ZWxsIGFzIHJ1c3QgYmluYXJpZXMgYXMgcHl0aG9uIHBhY2thZ2VzXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjbWF0dXJpblxuICAgKi9cbiAgcmVhZG9ubHkgbWF0dXJpbj86IGFueTtcblxuICAvKipcbiAgICogSW1wcm92ZWQgYnVpbGQgc3lzdGVtIGdlbmVyYXRvciBmb3IgUHl0aG9uIEMvQysrL0ZvcnRyYW4gZXh0ZW5zaW9uc1xuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sI3NjaWtpdC1idWlsZFxuICAgKi9cbiAgcmVhZG9ubHkgc2Npa2l0QnVpbGQ/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEVhc2lseSBkb3dubG9hZCwgYnVpbGQsIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgUHl0aG9uIHBhY2thZ2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sI3NldHVwdG9vbHNcbiAgICovXG4gIHJlYWRvbmx5IHNldHVwdG9vbHM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIE1hbmFnZSBQeXRob24gcGFja2FnZSB2ZXJzaW9ucyB1c2luZyBTQ00gKGUuZy4gR2l0KS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNzZXR1cHRvb2xzX3NjbVxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dXB0b29sc1NjbT86IGFueTtcblxuICAvKipcbiAgICogQSB0YXNrIHJ1bm5lciB0aGF0IHdvcmtzIHdlbGwgd2l0aCBweXByb2plY3QudG9tbCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNwb2VcbiAgICovXG4gIHJlYWRvbmx5IHBvZT86IGFueTtcblxuICAvKipcbiAgICogUHl0aG9uIGRlcGVuZGVuY3kgbWFuYWdlbWVudCBhbmQgcGFja2FnaW5nIG1hZGUgZWFzeS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNwb2V0cnlcbiAgICovXG4gIHJlYWRvbmx5IHBvZXRyeT86IGFueTtcblxuICAvKipcbiAgICogQSBtb2Rlcm4gUHl0aG9uIHBhY2thZ2UgbWFuYWdlciB3aXRoIFBFUCA2MjEgc3VwcG9ydC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNwZG1cbiAgICovXG4gIHJlYWRvbmx5IHBkbT86IGFueTtcblxuICAvKipcbiAgICogU3RhdGljIHR5cGUgY2hlY2tlciBmb3IgUHl0aG9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sI3B5cmlnaHRcbiAgICovXG4gIHJlYWRvbmx5IHB5cmlnaHQ/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFN0YW5kYXJkaXplZCBhdXRvbWF0ZWQgdGVzdGluZyBvZiBQeXRob24gcGFja2FnZXNcbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNweXRlc3RcbiAgICovXG4gIHJlYWRvbmx5IHB5dGVzdD86IGFueTtcblxuICAvKipcbiAgICogUmV2aWV3IGEgcmVwb3NpdG9yeSBmb3IgYmVzdCBwcmFjdGljZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjcmVwby1yZXZpZXdcbiAgICovXG4gIHJlYWRvbmx5IHJlcG9SZXZpZXc/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wbGVtZW50YXJ5IHRhc2sgcnVubmVyIGZvciBweXRob24uXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjdGFza2lweVxuICAgKi9cbiAgcmVhZG9ubHkgdGFza2lweT86IGFueTtcblxuICAvKipcbiAgICogVG9tYmkgaXMgYSB0b29sa2l0IGZvciBUT01MOyBwcm92aWRpbmcgYSBmb3JtYXR0ZXIvbGludGVyIGFuZCBsYW5ndWFnZSBzZXJ2ZXJcbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCN0b21iaVxuICAgKi9cbiAgcmVhZG9ubHkgdG9tYmk/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFN0YW5kYXJkaXplZCBhdXRvbWF0ZWQgdGVzdGluZyBvZiBQeXRob24gcGFja2FnZXNcbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCN0b3hcbiAgICovXG4gIHJlYWRvbmx5IHRveD86IGFueTtcblxuICAvKipcbiAgICogQW4gZXh0cmVtZWx5IGZhc3QgUHl0aG9uIHBhY2thZ2UgaW5zdGFsbGVyIGFuZCByZXNvbHZlciwgd3JpdHRlbiBpbiBSdXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sI3V2XG4gICAqL1xuICByZWFkb25seSB1dj86IGFueTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUHlwcm9qZWN0VG9tbFRvb2wnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9QeXByb2plY3RUb21sVG9vbChvYmo6IFB5cHJvamVjdFRvbWxUb29sIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYmxhY2snOiBvYmouYmxhY2ssXG4gICAgJ2NpYnVpbGR3aGVlbCc6IG9iai5jaWJ1aWxkd2hlZWwsXG4gICAgJ215cHknOiBvYmoubXlweSxcbiAgICAncnVmZic6IG9iai5ydWZmLFxuICAgICd0eSc6IG9iai50eSxcbiAgICAnaGF0Y2gnOiBvYmouaGF0Y2gsXG4gICAgJ21hdHVyaW4nOiBvYmoubWF0dXJpbixcbiAgICAnc2Npa2l0LWJ1aWxkJzogb2JqLnNjaWtpdEJ1aWxkLFxuICAgICdzZXR1cHRvb2xzJzogb2JqLnNldHVwdG9vbHMsXG4gICAgJ3NldHVwdG9vbHNfc2NtJzogb2JqLnNldHVwdG9vbHNTY20sXG4gICAgJ3BvZSc6IG9iai5wb2UsXG4gICAgJ3BvZXRyeSc6IG9iai5wb2V0cnksXG4gICAgJ3BkbSc6IG9iai5wZG0sXG4gICAgJ3B5cmlnaHQnOiBvYmoucHlyaWdodCxcbiAgICAncHl0ZXN0Jzogb2JqLnB5dGVzdCxcbiAgICAncmVwby1yZXZpZXcnOiBvYmoucmVwb1JldmlldyxcbiAgICAndGFza2lweSc6IG9iai50YXNraXB5LFxuICAgICd0b21iaSc6IG9iai50b21iaSxcbiAgICAndG94Jzogb2JqLnRveCxcbiAgICAndXYnOiBvYmoudXYsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIHByb2plY3RBdXRob3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0QXV0aG9yIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgcHJvamVjdEF1dGhvciNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIHByb2plY3RBdXRob3IjZW1haWxcbiAgICovXG4gIHJlYWRvbmx5IGVtYWlsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdQcm9qZWN0QXV0aG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUHJvamVjdEF1dGhvcihvYmo6IFByb2plY3RBdXRob3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ2VtYWlsJzogb2JqLmVtYWlsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdER5bmFtaWNcbiAqL1xuZXhwb3J0IGVudW0gUHlwcm9qZWN0VG9tbFByb2plY3REeW5hbWljIHtcbiAgLyoqIHZlcnNpb24gKi9cbiAgVkVSU0lPTiA9IFwidmVyc2lvblwiLFxuICAvKiogZGVzY3JpcHRpb24gKi9cbiAgREVTQ1JJUFRJT04gPSBcImRlc2NyaXB0aW9uXCIsXG4gIC8qKiByZWFkbWUgKi9cbiAgUkVBRE1FID0gXCJyZWFkbWVcIixcbiAgLyoqIHJlcXVpcmVzLXB5dGhvbiAqL1xuICBSRVFVSVJFU19IWVBIRU5fUFlUSE9OID0gXCJyZXF1aXJlcy1weXRob25cIixcbiAgLyoqIGxpY2Vuc2UgKi9cbiAgTElDRU5TRSA9IFwibGljZW5zZVwiLFxuICAvKiogbGljZW5zZS1maWxlcyAqL1xuICBMSUNFTlNFX0hZUEhFTl9GSUxFUyA9IFwibGljZW5zZS1maWxlc1wiLFxuICAvKiogYXV0aG9ycyAqL1xuICBBVVRIT1JTID0gXCJhdXRob3JzXCIsXG4gIC8qKiBtYWludGFpbmVycyAqL1xuICBNQUlOVEFJTkVSUyA9IFwibWFpbnRhaW5lcnNcIixcbiAgLyoqIGtleXdvcmRzICovXG4gIEtFWVdPUkRTID0gXCJrZXl3b3Jkc1wiLFxuICAvKiogY2xhc3NpZmllcnMgKi9cbiAgQ0xBU1NJRklFUlMgPSBcImNsYXNzaWZpZXJzXCIsXG4gIC8qKiB1cmxzICovXG4gIFVSTFMgPSBcInVybHNcIixcbiAgLyoqIHNjcmlwdHMgKi9cbiAgU0NSSVBUUyA9IFwic2NyaXB0c1wiLFxuICAvKiogZ3VpLXNjcmlwdHMgKi9cbiAgR1VJX0hZUEhFTl9TQ1JJUFRTID0gXCJndWktc2NyaXB0c1wiLFxuICAvKiogZW50cnktcG9pbnRzICovXG4gIEVOVFJZX0hZUEhFTl9QT0lOVFMgPSBcImVudHJ5LXBvaW50c1wiLFxuICAvKiogZGVwZW5kZW5jaWVzICovXG4gIERFUEVOREVOQ0lFUyA9IFwiZGVwZW5kZW5jaWVzXCIsXG4gIC8qKiBvcHRpb25hbC1kZXBlbmRlbmNpZXMgKi9cbiAgT1BUSU9OQUxfSFlQSEVOX0RFUEVOREVOQ0lFUyA9IFwib3B0aW9uYWwtZGVwZW5kZW5jaWVzXCIsXG4gIC8qKiBpbXBvcnQtbmFtZXMgKi9cbiAgSU1QT1JUX0hZUEhFTl9OQU1FUyA9IFwiaW1wb3J0LW5hbWVzXCIsXG4gIC8qKiBpbXBvcnQtbmFtZXNwYWNlcyAqL1xuICBJTVBPUlRfSFlQSEVOX05BTUVTUEFDRVMgPSBcImltcG9ydC1uYW1lc3BhY2VzXCIsXG59XG4iXX0=