UNPKG

projen

Version:

CDK for software projects

220 lines • 33.2 kB
"use strict"; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.PoetryPyproject = exports.Poetry = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const TOML = require("@iarna/toml"); const component_1 = require("../component"); const dependencies_1 = require("../dependencies"); const task_runtime_1 = require("../task-runtime"); const toml_1 = require("../toml"); const util_1 = require("../util"); const pyproject_toml_file_1 = require("./pyproject-toml-file"); /** * Manage project dependencies, virtual environments, and packaging through the * poetry CLI tool. */ class Poetry extends component_1.Component { constructor(project, options) { super(project); this.pythonExec = options.pythonExec ?? "python"; this.installTask = project.addTask("install", { description: "Install dependencies and update lockfile", exec: "poetry update", }); this.installCiTask = project.addTask("install:ci", { description: "Install dependencies with frozen lockfile", exec: "poetry check --lock && poetry install", }); this.project.tasks.addEnvironment("VIRTUAL_ENV", // Create .venv on the first run if it doesn't already exist "$(poetry env info -p || poetry run poetry env info -p)"); this.project.tasks.addEnvironment("PATH", "$(echo $(poetry env info -p)/bin:$PATH)"); project.packageTask.exec("poetry build"); this.publishTestTask = project.addTask("publish:test", { description: "Uploads the package against a test PyPI endpoint.", exec: "poetry publish -r testpypi", }); this.publishTask = project.addTask("publish", { description: "Uploads the package to PyPI.", exec: "poetry publish", }); this.pyProject = new PoetryPyproject(project, { name: project.name, version: options.version, description: options.description ?? "", license: options.license, authors: [`${options.authorName} <${options.authorEmail}>`], homepage: options.homepage, classifiers: options.classifiers, ...options.poetryOptions, dependencies: () => this.synthDependencies(), devDependencies: () => this.synthDevDependencies(), }); new toml_1.TomlFile(project, "poetry.toml", { committed: false, obj: { repositories: { testpypi: { url: "https://test.pypi.org/legacy/", }, }, }, }); } synthDependencies() { const dependencies = {}; let pythonDefined = false; for (const pkg of this.project.deps.all) { if (pkg.name === "python") { pythonDefined = true; } if (pkg.type === dependencies_1.DependencyType.RUNTIME) { dependencies[pkg.name] = pkg.version ?? "*"; } } if (!pythonDefined) { // Python version must be defined for poetry projects. Default to ^3.8. dependencies.python = "^3.8"; } return this.permitDepsWithTomlInlineTables(dependencies); } synthDevDependencies() { const dependencies = {}; for (const pkg of this.project.deps.all) { if ([dependencies_1.DependencyType.DEVENV, dependencies_1.DependencyType.TEST].includes(pkg.type)) { dependencies[pkg.name] = pkg.version ?? "*"; } } return this.permitDepsWithTomlInlineTables(dependencies); } /** * Parses dependency values that may include TOML inline tables, converting them into JavaScript objects. * If a dependency value cannot be parsed as a TOML inline table (indicating it is a plain SemVer string), * it is left unchanged. This allows to support the full range of Poetry's dependency specification. * @see https://python-poetry.org/docs/dependency-specification/ * @see https://toml.io/en/v1.0.0#inline-table * * @example * // Given a `dependencies` object like this: * const dependencies = { * "mypackage": "{ version = '1.2.3', extras = ['extra1', 'extra2'] }", * "anotherpackage": "^2.3.4" * }; * // After parsing, the resulting object would be: * { * "mypackage": { * version: "1.2.3", * extras: ["extra1", "extra2"] * }, * "anotherpackage": "^2.3.4" * } * // Note: The value of `anotherpackage` remains unchanged as it is a plain SemVer string. * * @param dependencies An object where each key is a dependency name and each value is a string that might be * either a SemVer string or a TOML inline table string. * @returns A new object where each key is a dependency name and each value is either the original SemVer string * or the parsed JavaScript object representation of the TOML inline table. */ permitDepsWithTomlInlineTables(dependencies) { const parseTomlInlineTable = (dependencyValue) => { try { // Attempt parsing the `dependencyValue` as a TOML inline table return TOML.parse(`dependencyKey = ${dependencyValue}`).dependencyKey; } catch { // If parsing fails, treat the `dependencyValue` as a plain SemVer string return dependencyValue; } }; return Object.fromEntries(Object.entries(dependencies).map(([dependencyKey, dependencyValue]) => { return [dependencyKey, parseTomlInlineTable(dependencyValue)]; })); } /** * Adds a runtime dependency. * * @param spec Format `<module>@<semver>` */ addDependency(spec) { this.project.deps.addDependency(spec, dependencies_1.DependencyType.RUNTIME); } /** * Adds a dev dependency. * * @param spec Format `<module>@<semver>` */ addDevDependency(spec) { this.project.deps.addDependency(spec, dependencies_1.DependencyType.DEVENV); } /** * Initializes the virtual environment if it doesn't exist (called during post-synthesis). */ setupEnvironment() { const result = (0, util_1.execOrUndefined)("which poetry", { cwd: this.project.outdir, }); if (!result) { this.project.logger.info("Unable to setup an environment since poetry is not installed. Please install poetry (https://python-poetry.org/docs/) or use a different component for managing environments such as 'venv'."); } let envPath = (0, util_1.execOrUndefined)("poetry env info -p", { cwd: this.project.outdir, }); if (!envPath) { this.project.logger.info("Setting up a virtual environment..."); (0, util_1.exec)(`poetry env use ${this.pythonExec}`, { cwd: this.project.outdir }); envPath = (0, util_1.execOrUndefined)("poetry env info -p", { cwd: this.project.outdir, }); this.project.logger.info(`Environment successfully created (located in ${envPath}}).`); } } /** * Installs dependencies (called during post-synthesis). */ installDependencies() { this.project.logger.info("Installing dependencies..."); const runtime = new task_runtime_1.TaskRuntime(this.project.outdir); // If the pyproject.toml file has changed, update the lockfile prior to installation if (this.pyProject.file.changed) { runtime.runTask(this.installTask.name); } else { runtime.runTask(this.installCiTask.name); } } } exports.Poetry = Poetry; _a = JSII_RTTI_SYMBOL_1; Poetry[_a] = { fqn: "projen.python.Poetry", version: "0.98.32" }; /** * Represents configuration of a pyproject.toml file for a Poetry project. * * @see https://python-poetry.org/docs/pyproject/ */ class PoetryPyproject extends component_1.Component { constructor(scope, options) { super(scope); const { devDependencies, ...poetryConfig } = options; this.file = new pyproject_toml_file_1.PyprojectTomlFile(scope, { tool: { poetry: { ...(0, util_1.decamelizeKeysRecursively)(poetryConfig, { separator: "-" }), group: { dev: { dependencies: devDependencies, }, }, }, }, buildSystem: { requires: ["poetry-core"], buildBackend: "poetry.core.masonry.api", }, }); } } exports.PoetryPyproject = PoetryPyproject; _b = JSII_RTTI_SYMBOL_1; PoetryPyproject[_b] = { fqn: "projen.python.PoetryPyproject", version: "0.98.32" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B5dGhvbi9wb2V0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvQ0FBb0M7QUFNcEMsNENBQXlDO0FBQ3pDLGtEQUFpRDtBQUdqRCxrREFBOEM7QUFDOUMsa0NBQW1DO0FBQ25DLGtDQUEyRTtBQUMzRSwrREFBMEQ7QUFNMUQ7OztHQUdHO0FBQ0gsTUFBYSxNQUNYLFNBQVEscUJBQVM7SUFrQ2pCLFlBQVksT0FBZ0IsRUFBRSxPQUFzQjtRQUNsRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDO1FBRWpELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDNUMsV0FBVyxFQUFFLDBDQUEwQztZQUN2RCxJQUFJLEVBQUUsZUFBZTtTQUN0QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ2pELFdBQVcsRUFBRSwyQ0FBMkM7WUFDeEQsSUFBSSxFQUFFLHVDQUF1QztTQUM5QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQy9CLGFBQWE7UUFDYiw0REFBNEQ7UUFDNUQsd0RBQXdELENBQ3pELENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQy9CLE1BQU0sRUFDTix5Q0FBeUMsQ0FDMUMsQ0FBQztRQUVGLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7WUFDckQsV0FBVyxFQUFFLG1EQUFtRDtZQUNoRSxJQUFJLEVBQUUs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LHFCQUFTO0lBRzVDLFlBQVksS0FBaUIsRUFBRSxPQUErQjtRQUM1RCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXJELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSx1Q0FBaUIsQ0FBQyxLQUFLLEVBQUU7WUFDdkMsSUFBSSxFQUFFO2dCQUNKLE1BQU0sRUFBRTtvQkFDTixHQUFHLElBQUEsZ0NBQXlCLEVBQUMsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO29CQUM5RCxLQUFLLEVBQUU7d0JBQ0wsR0FBRyxFQUFFOzRCQUNILFlBQVksRUFBRSxlQUFlO3lCQUM5QjtxQkFDRjtpQkFDRjthQUNGO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLFFBQVEsRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDekIsWUFBWSxFQUFFLHlCQUF5QjthQUN4QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBeEJILDBDQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRPTUwgZnJvbSBcIkBpYXJuYS90b21sXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElQeXRob25EZXBzIH0gZnJvbSBcIi4vcHl0aG9uLWRlcHNcIjtcbmltcG9ydCB7IElQeXRob25FbnYgfSBmcm9tIFwiLi9weXRob24tZW52XCI7XG5pbXBvcnQgeyBJUHl0aG9uUGFja2FnaW5nLCBQeXRob25QYWNrYWdpbmdPcHRpb25zIH0gZnJvbSBcIi4vcHl0aG9uLXBhY2thZ2luZ1wiO1xuaW1wb3J0IHsgUHl0aG9uRXhlY3V0YWJsZU9wdGlvbnMgfSBmcm9tIFwiLi9weXRob24tcHJvamVjdFwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVR5cGUgfSBmcm9tIFwiLi4vZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcbmltcG9ydCB7IFRhc2sgfSBmcm9tIFwiLi4vdGFza1wiO1xuaW1wb3J0IHsgVGFza1J1bnRpbWUgfSBmcm9tIFwiLi4vdGFzay1ydW50aW1lXCI7XG5pbXBvcnQgeyBUb21sRmlsZSB9IGZyb20gXCIuLi90b21sXCI7XG5pbXBvcnQgeyBkZWNhbWVsaXplS2V5c1JlY3Vyc2l2ZWx5LCBleGVjLCBleGVjT3JVbmRlZmluZWQgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgUHlwcm9qZWN0VG9tbEZpbGUgfSBmcm9tIFwiLi9weXByb2plY3QtdG9tbC1maWxlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ldHJ5T3B0aW9uc1xuICBleHRlbmRzIFB5dGhvblBhY2thZ2luZ09wdGlvbnMsXG4gICAgUHl0aG9uRXhlY3V0YWJsZU9wdGlvbnMge31cblxuLyoqXG4gKiBNYW5hZ2UgcHJvamVjdCBkZXBlbmRlbmNpZXMsIHZpcnR1YWwgZW52aXJvbm1lbnRzLCBhbmQgcGFja2FnaW5nIHRocm91Z2ggdGhlXG4gKiBwb2V0cnkgQ0xJIHRvb2wuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2V0cnlcbiAgZXh0ZW5kcyBDb21wb25lbnRcbiAgaW1wbGVtZW50cyBJUHl0aG9uRGVwcywgSVB5dGhvbkVudiwgSVB5dGhvblBhY2thZ2luZ1xue1xuICAvKipcbiAgICogVGFzayBmb3IgdXBkYXRpbmcgdGhlIGxvY2tmaWxlIGFuZCBpbnN0YWxsaW5nIHByb2plY3QgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGluc3RhbGxUYXNrOiBUYXNrO1xuXG4gIC8qKlxuICAgKiBUYXNrIGZvciBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcyBhY2NvcmRpbmcgdG8gdGhlIGV4aXN0aW5nIGxvY2tmaWxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGluc3RhbGxDaVRhc2s6IFRhc2s7XG5cbiAgLyoqXG4gICAqIFRhc2sgZm9yIHB1Ymxpc2hpbmcgdGhlIHBhY2thZ2UgdG8gYSBwYWNrYWdlIHJlcG9zaXRvcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGlzaFRhc2s6IFRhc2s7XG5cbiAgLyoqXG4gICAqIFRhc2sgZm9yIHB1Ymxpc2hpbmcgdGhlIHBhY2thZ2UgdG8gdGhlIFRlc3QgUHlQSSByZXBvc2l0b3J5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHB1Ymxpc2hUZXN0VGFzazogVGFzaztcblxuICAvKipcbiAgICogUGF0aCB0byB0aGUgUHl0aG9uIGV4ZWN1dGFibGUgdG8gdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBweXRob25FeGVjOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGBweXByb2plY3QudG9tbGAgZmlsZSBmb3IgYSBQb2V0cnkgcHJvamVjdC5cbiAgICogVGhpcyBpbmNsdWRlcyBwYWNrYWdlIG1ldGFkYXRhLCBkZXBlbmRlbmNpZXMsIGFuZCBQb2V0cnktc3BlY2lmaWMgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHB5UHJvamVjdDogUG9ldHJ5UHlwcm9qZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IFBvZXRyeU9wdGlvbnMpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcbiAgICB0aGlzLnB5dGhvbkV4ZWMgPSBvcHRpb25zLnB5dGhvbkV4ZWMgPz8gXCJweXRob25cIjtcblxuICAgIHRoaXMuaW5zdGFsbFRhc2sgPSBwcm9qZWN0LmFkZFRhc2soXCJpbnN0YWxsXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkluc3RhbGwgZGVwZW5kZW5jaWVzIGFuZCB1cGRhdGUgbG9ja2ZpbGVcIixcbiAgICAgIGV4ZWM6IFwicG9ldHJ5IHVwZGF0ZVwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbnN0YWxsQ2lUYXNrID0gcHJvamVjdC5hZGRUYXNrKFwiaW5zdGFsbDpjaVwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJJbnN0YWxsIGRlcGVuZGVuY2llcyB3aXRoIGZyb3plbiBsb2NrZmlsZVwiLFxuICAgICAgZXhlYzogXCJwb2V0cnkgY2hlY2sgLS1sb2NrICYmIHBvZXRyeSBpbnN0YWxsXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2plY3QudGFza3MuYWRkRW52aXJvbm1lbnQoXG4gICAgICBcIlZJUlRVQUxfRU5WXCIsXG4gICAgICAvLyBDcmVhdGUgLnZlbnYgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAgICAgIFwiJChwb2V0cnkgZW52IGluZm8gLXAgfHwgcG9ldHJ5IHJ1biBwb2V0cnkgZW52IGluZm8gLXApXCJcbiAgICApO1xuICAgIHRoaXMucHJvamVjdC50YXNrcy5hZGRFbnZpcm9ubWVudChcbiAgICAgIFwiUEFUSFwiLFxuICAgICAgXCIkKGVjaG8gJChwb2V0cnkgZW52IGluZm8gLXApL2JpbjokUEFUSClcIlxuICAgICk7XG5cbiAgICBwcm9qZWN0LnBhY2thZ2VUYXNrLmV4ZWMoXCJwb2V0cnkgYnVpbGRcIik7XG5cbiAgICB0aGlzLnB1Ymxpc2hUZXN0VGFzayA9IHByb2plY3QuYWRkVGFzayhcInB1Ymxpc2g6dGVzdFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJVcGxvYWRzIHRoZSBwYWNrYWdlIGFnYWluc3QgYSB0ZXN0IFB5UEkgZW5kcG9pbnQuXCIsXG4gICAgICBleGVjOiBcInBvZXRyeSBwdWJsaXNoIC1yIHRlc3RweXBpXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLnB1Ymxpc2hUYXNrID0gcHJvamVjdC5hZGRUYXNrKFwicHVibGlzaFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJVcGxvYWRzIHRoZSBwYWNrYWdlIHRvIFB5UEkuXCIsXG4gICAgICBleGVjOiBcInBvZXRyeSBwdWJsaXNoXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLnB5UHJvamVjdCA9IG5ldyBQb2V0cnlQeXByb2plY3QocHJvamVjdCwge1xuICAgICAgbmFtZTogcHJvamVjdC5uYW1lLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24gPz8gXCJcIixcbiAgICAgIGxpY2Vuc2U6IG9wdGlvbnMubGljZW5zZSxcbiAgICAgIGF1dGhvcnM6IFtgJHtvcHRpb25zLmF1dGhvck5hbWV9IDwke29wdGlvbnMuYXV0aG9yRW1haWx9PmBdLFxuICAgICAgaG9tZXBhZ2U6IG9wdGlvbnMuaG9tZXBhZ2UsXG4gICAgICBjbGFzc2lmaWVyczogb3B0aW9ucy5jbGFzc2lmaWVycyxcbiAgICAgIC4uLm9wdGlvbnMucG9ldHJ5T3B0aW9ucyxcbiAgICAgIGRlcGVuZGVuY2llczogKCkgPT4gdGhpcy5zeW50aERlcGVuZGVuY2llcygpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiAoKSA9PiB0aGlzLnN5bnRoRGV2RGVwZW5kZW5jaWVzKCksXG4gICAgfSk7XG5cbiAgICBuZXcgVG9tbEZpbGUocHJvamVjdCwgXCJwb2V0cnkudG9tbFwiLCB7XG4gICAgICBjb21taXR0ZWQ6IGZhbHNlLFxuICAgICAgb2JqOiB7XG4gICAgICAgIHJlcG9zaXRvcmllczoge1xuICAgICAgICAgIHRlc3RweXBpOiB7XG4gICAgICAgICAgICB1cmw6IFwiaHR0cHM6Ly90ZXN0LnB5cGkub3JnL2xlZ2FjeS9cIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3ludGhEZXBlbmRlbmNpZXMoKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgbGV0IHB5dGhvbkRlZmluZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHBrZyBvZiB0aGlzLnByb2plY3QuZGVwcy5hbGwpIHtcbiAgICAgIGlmIChwa2cubmFtZSA9PT0gXCJweXRob25cIikge1xuICAgICAgICBweXRob25EZWZpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwa2cudHlwZSA9PT0gRGVwZW5kZW5jeVR5cGUuUlVOVElNRSkge1xuICAgICAgICBkZXBlbmRlbmNpZXNbcGtnLm5hbWVdID0gcGtnLnZlcnNpb24gPz8gXCIqXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcHl0aG9uRGVmaW5lZCkge1xuICAgICAgLy8gUHl0aG9uIHZlcnNpb24gbXVzdCBiZSBkZWZpbmVkIGZvciBwb2V0cnkgcHJvamVjdHMuIERlZmF1bHQgdG8gXjMuOC5cbiAgICAgIGRlcGVuZGVuY2llcy5weXRob24gPSBcIl4zLjhcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGVybWl0RGVwc1dpdGhUb21sSW5saW5lVGFibGVzKGRlcGVuZGVuY2llcyk7XG4gIH1cblxuICBwcml2YXRlIHN5bnRoRGV2RGVwZW5kZW5jaWVzKCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgcGtnIG9mIHRoaXMucHJvamVjdC5kZXBzLmFsbCkge1xuICAgICAgaWYgKFtEZXBlbmRlbmN5VHlwZS5ERVZFTlYsIERlcGVuZGVuY3lUeXBlLlRFU1RdLmluY2x1ZGVzKHBrZy50eXBlKSkge1xuICAgICAgICBkZXBlbmRlbmNpZXNbcGtnLm5hbWVdID0gcGtnLnZlcnNpb24gPz8gXCIqXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBlcm1pdERlcHNXaXRoVG9tbElubGluZVRhYmxlcyhkZXBlbmRlbmNpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBkZXBlbmRlbmN5IHZhbHVlcyB0aGF0IG1heSBpbmNsdWRlIFRPTUwgaW5saW5lIHRhYmxlcywgY29udmVydGluZyB0aGVtIGludG8gSmF2YVNjcmlwdCBvYmplY3RzLlxuICAgKiBJZiBhIGRlcGVuZGVuY3kgdmFsdWUgY2Fubm90IGJlIHBhcnNlZCBhcyBhIFRPTUwgaW5saW5lIHRhYmxlIChpbmRpY2F0aW5nIGl0IGlzIGEgcGxhaW4gU2VtVmVyIHN0cmluZyksXG4gICAqIGl0IGlzIGxlZnQgdW5jaGFuZ2VkLiBUaGlzIGFsbG93cyB0byBzdXBwb3J0IHRoZSBmdWxsIHJhbmdlIG9mIFBvZXRyeSdzIGRlcGVuZGVuY3kgc3BlY2lmaWNhdGlvbi5cbiAgICogQHNlZSBodHRwczovL3B5dGhvbi1wb2V0cnkub3JnL2RvY3MvZGVwZW5kZW5jeS1zcGVjaWZpY2F0aW9uL1xuICAgKiBAc2VlIGh0dHBzOi8vdG9tbC5pby9lbi92MS4wLjAjaW5saW5lLXRhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEdpdmVuIGEgYGRlcGVuZGVuY2llc2Agb2JqZWN0IGxpa2UgdGhpczpcbiAgICogY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgKiAgIFwibXlwYWNrYWdlXCI6IFwieyB2ZXJzaW9uID0gJzEuMi4zJywgZXh0cmFzID0gWydleHRyYTEnLCAnZXh0cmEyJ10gfVwiLFxuICAgKiAgIFwiYW5vdGhlcnBhY2thZ2VcIjogXCJeMi4zLjRcIlxuICAgKiB9O1xuICAgKiAvLyBBZnRlciBwYXJzaW5nLCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3b3VsZCBiZTpcbiAgICoge1xuICAgKiAgIFwibXlwYWNrYWdlXCI6IHtcbiAgICogICAgIHZlcnNpb246IFwiMS4yLjNcIixcbiAgICogICAgIGV4dHJhczogW1wiZXh0cmExXCIsIFwiZXh0cmEyXCJdXG4gICAqICAgfSxcbiAgICogICBcImFub3RoZXJwYWNrYWdlXCI6IFwiXjIuMy40XCJcbiAgICogfVxuICAgKiAvLyBOb3RlOiBUaGUgdmFsdWUgb2YgYGFub3RoZXJwYWNrYWdlYCByZW1haW5zIHVuY2hhbmdlZCBhcyBpdCBpcyBhIHBsYWluIFNlbVZlciBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgQW4gb2JqZWN0IHdoZXJlIGVhY2gga2V5IGlzIGEgZGVwZW5kZW5jeSBuYW1lIGFuZCBlYWNoIHZhbHVlIGlzIGEgc3RyaW5nIHRoYXQgbWlnaHQgYmVcbiAgICogZWl0aGVyIGEgU2VtVmVyIHN0cmluZyBvciBhIFRPTUwgaW5saW5lIHRhYmxlIHN0cmluZy5cbiAgICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdoZXJlIGVhY2gga2V5IGlzIGEgZGVwZW5kZW5jeSBuYW1lIGFuZCBlYWNoIHZhbHVlIGlzIGVpdGhlciB0aGUgb3JpZ2luYWwgU2VtVmVyIHN0cmluZ1xuICAgKiBvciB0aGUgcGFyc2VkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUT01MIGlubGluZSB0YWJsZS5cbiAgICovXG4gIHByaXZhdGUgcGVybWl0RGVwc1dpdGhUb21sSW5saW5lVGFibGVzKGRlcGVuZGVuY2llczoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgfSkge1xuICAgIGNvbnN0IHBhcnNlVG9tbElubGluZVRhYmxlID0gKGRlcGVuZGVuY3lWYWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBBdHRlbXB0IHBhcnNpbmcgdGhlIGBkZXBlbmRlbmN5VmFsdWVgIGFzIGEgVE9NTCBpbmxpbmUgdGFibGVcbiAgICAgICAgcmV0dXJuIFRPTUwucGFyc2UoYGRlcGVuZGVuY3lLZXkgPSAke2RlcGVuZGVuY3lWYWx1ZX1gKS5kZXBlbmRlbmN5S2V5O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElmIHBhcnNpbmcgZmFpbHMsIHRyZWF0IHRoZSBgZGVwZW5kZW5jeVZhbHVlYCBhcyBhIHBsYWluIFNlbVZlciBzdHJpbmdcbiAgICAgICAgcmV0dXJuIGRlcGVuZGVuY3lWYWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykubWFwKChbZGVwZW5kZW5jeUtleSwgZGVwZW5kZW5jeVZhbHVlXSkgPT4ge1xuICAgICAgICByZXR1cm4gW2RlcGVuZGVuY3lLZXksIHBhcnNlVG9tbElubGluZVRhYmxlKGRlcGVuZGVuY3lWYWx1ZSldO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBydW50aW1lIGRlcGVuZGVuY3kuXG4gICAqXG4gICAqIEBwYXJhbSBzcGVjIEZvcm1hdCBgPG1vZHVsZT5APHNlbXZlcj5gXG4gICAqL1xuICBwdWJsaWMgYWRkRGVwZW5kZW5jeShzcGVjOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb2plY3QuZGVwcy5hZGREZXBlbmRlbmN5KHNwZWMsIERlcGVuZGVuY3lUeXBlLlJVTlRJTUUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBkZXYgZGVwZW5kZW5jeS5cbiAgICpcbiAgICogQHBhcmFtIHNwZWMgRm9ybWF0IGA8bW9kdWxlPkA8c2VtdmVyPmBcbiAgICovXG4gIHB1YmxpYyBhZGREZXZEZXBlbmRlbmN5KHNwZWM6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdC5kZXBzLmFkZERlcGVuZGVuY3koc3BlYywgRGVwZW5kZW5jeVR5cGUuREVWRU5WKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCBpZiBpdCBkb2Vzbid0IGV4aXN0IChjYWxsZWQgZHVyaW5nIHBvc3Qtc3ludGhlc2lzKS5cbiAgICovXG4gIHB1YmxpYyBzZXR1cEVudmlyb25tZW50KCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNPclVuZGVmaW5lZChcIndoaWNoIHBvZXRyeVwiLCB7XG4gICAgICBjd2Q6IHRoaXMucHJvamVjdC5vdXRkaXIsXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRoaXMucHJvamVjdC5sb2dnZXIuaW5mbyhcbiAgICAgICAgXCJVbmFibGUgdG8gc2V0dXAgYW4gZW52aXJvbm1lbnQgc2luY2UgcG9ldHJ5IGlzIG5vdCBpbnN0YWxsZWQuIFBsZWFzZSBpbnN0YWxsIHBvZXRyeSAoaHR0cHM6Ly9weXRob24tcG9ldHJ5Lm9yZy9kb2NzLykgb3IgdXNlIGEgZGlmZmVyZW50IGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgZW52aXJvbm1lbnRzIHN1Y2ggYXMgJ3ZlbnYnLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBlbnZQYXRoID0gZXhlY09yVW5kZWZpbmVkKFwicG9ldHJ5IGVudiBpbmZvIC1wXCIsIHtcbiAgICAgIGN3ZDogdGhpcy5wcm9qZWN0Lm91dGRpcixcbiAgICB9KTtcbiAgICBpZiAoIWVudlBhdGgpIHtcbiAgICAgIHRoaXMucHJvamVjdC5sb2dnZXIuaW5mbyhcIlNldHRpbmcgdXAgYSB2aXJ0dWFsIGVudmlyb25tZW50Li4uXCIpO1xuICAgICAgZXhlYyhgcG9ldHJ5IGVudiB1c2UgJHt0aGlzLnB5dGhvbkV4ZWN9YCwgeyBjd2Q6IHRoaXMucHJvamVjdC5vdXRkaXIgfSk7XG4gICAgICBlbnZQYXRoID0gZXhlY09yVW5kZWZpbmVkKFwicG9ldHJ5IGVudiBpbmZvIC1wXCIsIHtcbiAgICAgICAgY3dkOiB0aGlzLnByb2plY3Qub3V0ZGlyLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnByb2plY3QubG9nZ2VyLmluZm8oXG4gICAgICAgIGBFbnZpcm9ubWVudCBzdWNjZXNzZnVsbHkgY3JlYXRlZCAobG9jYXRlZCBpbiAke2VudlBhdGh9fSkuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgZGVwZW5kZW5jaWVzIChjYWxsZWQgZHVyaW5nIHBvc3Qtc3ludGhlc2lzKS5cbiAgICovXG4gIHB1YmxpYyBpbnN0YWxsRGVwZW5kZW5jaWVzKCkge1xuICAgIHRoaXMucHJvamVjdC5sb2dnZXIuaW5mbyhcIkluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLi4uXCIpO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBuZXcgVGFza1J1bnRpbWUodGhpcy5wcm9qZWN0Lm91dGRpcik7XG4gICAgLy8gSWYgdGhlIHB5cHJvamVjdC50b21sIGZpbGUgaGFzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgbG9ja2ZpbGUgcHJpb3IgdG8gaW5zdGFsbGF0aW9uXG4gICAgaWYgKHRoaXMucHlQcm9qZWN0LmZpbGUuY2hhbmdlZCkge1xuICAgICAgcnVudGltZS5ydW5UYXNrKHRoaXMuaW5zdGFsbFRhc2submFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ1bnRpbWUucnVuVGFzayh0aGlzLmluc3RhbGxDaVRhc2submFtZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUG9ldHJ5LXNwZWNpZmljIG9wdGlvbnMuXG4gKiBAc2VlIGh0dHBzOi8vcHl0aG9uLXBvZXRyeS5vcmcvZG9jcy9weXByb2plY3QvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9ldHJ5UHlwcm9qZWN0T3B0aW9uc1dpdGhvdXREZXBzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhY2thZ2UgKHJlcXVpcmVkKS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIHBhY2thZ2UgKHJlcXVpcmVkKS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBhY2thZ2UgKHJlcXVpcmVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaWNlbnNlIG9mIHRoaXMgcGFja2FnZSBhcyBhbiBTUERYIGlkZW50aWZpZXIuXG4gICAqXG4gICAqIElmIHRoZSBwcm9qZWN0IGlzIHByb3ByaWV0YXJ5IGFuZCBkb2VzIG5vdCB1c2UgYSBzcGVjaWZpYyBsaWNlbnNlLCB5b3VcbiAgICogY2FuIHNldCB0aGlzIHZhbHVlIGFzIFwiUHJvcHJpZXRhcnlcIi5cbiAgICovXG4gIHJlYWRvbmx5IGxpY2Vuc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhdXRob3JzIG9mIHRoZSBwYWNrYWdlLiBNdXN0IGJlIGluIHRoZSBmb3JtIFwibmFtZSA8ZW1haWw+XCJcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogdGhlIG1haW50YWluZXJzIG9mIHRoZSBwYWNrYWdlLiBNdXN0IGJlIGluIHRoZSBmb3JtIFwibmFtZSA8ZW1haWw+XCJcbiAgICovXG4gIHJlYWRvbmx5IG1haW50YWluZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSByZWFkbWUgZmlsZSBvZiB0aGUgcGFja2FnZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlYWRtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBVUkwgdG8gdGhlIHdlYnNpdGUgb2YgdGhlIHByb2plY3QuXG4gICAqL1xuICByZWFkb25seSBob21lcGFnZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBVUkwgdG8gdGhlIHJlcG9zaXRvcnkgb2YgdGhlIHByb2plY3QuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIFVSTCB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3VtZW50YXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBrZXl3b3JkcyAobWF4OiA1KSB0aGF0IHRoZSBwYWNrYWdlIGlzIHJlbGF0ZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBrZXl3b3Jkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgUHlQSSB0cm92ZSBjbGFzc2lmaWVycyB0aGF0IGRlc2NyaWJlIHRoZSBwcm9qZWN0LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vcHlwaS5vcmcvY2xhc3NpZmllcnMvXG4gICAqL1xuICByZWFkb25seSBjbGFzc2lmaWVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgcGFja2FnZXMgYW5kIG1vZHVsZXMgdG8gaW5jbHVkZSBpbiB0aGUgZmluYWwgZGlzdHJpYnV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZXM/OiBhbnlbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHBhdHRlcm5zIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgcGFja2FnZS5cbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGU/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHBhdHRlcm5zIHRoYXQgd2lsbCBiZSBleGNsdWRlZCBpbiB0aGUgZmluYWwgcGFja2FnZS5cbiAgICpcbiAgICogSWYgYSBWQ1MgaXMgYmVpbmcgdXNlZCBmb3IgYSBwYWNrYWdlLCB0aGUgZXhjbHVkZSBmaWVsZCB3aWxsIGJlIHNlZWRlZCB3aXRoXG4gICAqIHRoZSBWQ1PigJkgaWdub3JlIHNldHRpbmdzICguZ2l0aWdub3JlIGZvciBnaXQgZm9yIGV4YW1wbGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NyaXB0cyBvciBleGVjdXRhYmxlcyB0aGF0IHdpbGwgYmUgaW5zdGFsbGVkIHdoZW4gaW5zdGFsbGluZyB0aGUgcGFja2FnZS5cbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdHM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4gIC8qKlxuICAgKiBTb3VyY2UgcmVnaXN0cmllcyBmcm9tIHdoaWNoIHBhY2thZ2VzIGFyZSByZXRyaWV2ZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U/OiBhbnlbXTtcblxuICAvKipcbiAgICogUGFja2FnZSBleHRyYXNcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfTtcblxuICAvKipcbiAgICogUGx1Z2lucy4gTXVzdCBiZSBzcGVjaWZpZWQgYXMgYSB0YWJsZS5cbiAgICogQHNlZSBodHRwczovL3RvbWwuaW8vZW4vdjEuMC4wI3RhYmxlXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5zPzogYW55O1xuXG4gIC8qKlxuICAgKiBQcm9qZWN0IGN1c3RvbSBVUkxzLCBpbiBhZGRpdGlvbiB0byBob21lcGFnZSwgcmVwb3NpdG9yeSBhbmQgZG9jdW1lbnRhdGlvbi5cbiAgICogRS5nLiBcIkJ1ZyBUcmFja2VyXCJcbiAgICovXG4gIHJlYWRvbmx5IHVybHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAvKipcbiAgICogUGFja2FnZSBtb2RlIChvcHRpb25hbCkuXG4gICAqIEBzZWUgaHR0cHM6Ly9weXRob24tcG9ldHJ5Lm9yZy9kb2NzL3B5cHJvamVjdC8jcGFja2FnZS1tb2RlXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQGV4YW1wbGUgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VNb2RlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQb2V0cnktc3BlY2lmaWMgb3B0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9weXRob24tcG9ldHJ5Lm9yZy9kb2NzL3B5cHJvamVjdC9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2V0cnlQeXByb2plY3RPcHRpb25zXG4gIGV4dGVuZHMgUG9ldHJ5UHlwcm9qZWN0T3B0aW9uc1dpdGhvdXREZXBzIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwcm9qZWN0LlxuICAgKlxuICAgKiBUaGUgcHl0aG9uIHZlcnNpb24gZm9yIHdoaWNoIHlvdXIgcGFja2FnZSBpcyBjb21wYXRpYmxlIGlzIGFsc28gcmVxdWlyZWQuXG4gICAqXG4gICAqIEBleGFtcGxlIHsgcmVxdWVzdHM6IFwiXjIuMTMuMFwiIH1cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llcz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBkZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwcm9qZWN0LlxuICAgKlxuICAgKiBAZXhhbXBsZSB7IHJlcXVlc3RzOiBcIl4yLjEzLjBcIiB9XG4gICAqL1xuICByZWFkb25seSBkZXZEZXBlbmRlbmNpZXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY29uZmlndXJhdGlvbiBvZiBhIHB5cHJvamVjdC50b21sIGZpbGUgZm9yIGEgUG9ldHJ5IHByb2plY3QuXG4gKlxuICogQHNlZSBodHRwczovL3B5dGhvbi1wb2V0cnkub3JnL2RvY3MvcHlwcm9qZWN0L1xuICovXG5leHBvcnQgY2xhc3MgUG9ldHJ5UHlwcm9qZWN0IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IGZpbGU6IFB5cHJvamVjdFRvbWxGaWxlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0LCBvcHRpb25zOiBQb2V0cnlQeXByb2plY3RPcHRpb25zKSB7XG4gICAgc3VwZXIoc2NvcGUpO1xuXG4gICAgY29uc3QgeyBkZXZEZXBlbmRlbmNpZXMsIC4uLnBvZXRyeUNvbmZpZyB9ID0gb3B0aW9ucztcblxuICAgIHRoaXMuZmlsZSA9IG5ldyBQeXByb2plY3RUb21sRmlsZShzY29wZSwge1xuICAgICAgdG9vbDoge1xuICAgICAgICBwb2V0cnk6IHtcbiAgICAgICAgICAuLi5kZWNhbWVsaXplS2V5c1JlY3Vyc2l2ZWx5KHBvZXRyeUNvbmZpZywgeyBzZXBhcmF0b3I6IFwiLVwiIH0pLFxuICAgICAgICAgIGdyb3VwOiB7XG4gICAgICAgICAgICBkZXY6IHtcbiAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYnVpbGRTeXN0ZW06IHtcbiAgICAgICAgcmVxdWlyZXM6IFtcInBvZXRyeS1jb3JlXCJdLFxuICAgICAgICBidWlsZEJhY2tlbmQ6IFwicG9ldHJ5LmNvcmUubWFzb25yeS5hcGlcIixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==