@nikovirtala/projen-constructs 0.3.75 → 0.3.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +5 -5
- package/docs/api/classes/AwsCdkConstructLibraryProject.html +1 -1
- package/docs/api/classes/AwsCdkTypeScriptAppProject.html +1 -1
- package/docs/api/classes/JsiiProject.html +1 -1
- package/docs/api/classes/TypeScriptProject.html +1 -1
- package/lib/components/bundle-lambda-function-code.js +3 -3
- package/lib/components/colima.js +1 -1
- package/lib/components/homebrew.js +1 -1
- package/lib/components/lambda-function-construct-generator.js +1 -1
- package/lib/components/localstack.js +1 -1
- package/lib/components/mise.js +1 -1
- package/lib/components/typedoc.js +1 -1
- package/lib/components/vitest.js +1 -1
- package/lib/project-generator.d.ts +5 -0
- package/lib/project-generator.js +21 -9
- package/lib/projects/awscdk-construct-library.generated.js +4 -4
- package/lib/projects/awscdk-typescript-app.generated.js +4 -4
- package/lib/projects/jsii.generated.js +4 -4
- package/lib/projects/typescript.generated.js +4 -4
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -16123,7 +16123,7 @@
|
|
|
16123
16123
|
},
|
|
16124
16124
|
"locationInModule": {
|
|
16125
16125
|
"filename": "src/project-generator.ts",
|
|
16126
|
-
"line":
|
|
16126
|
+
"line": 574
|
|
16127
16127
|
},
|
|
16128
16128
|
"parameters": [
|
|
16129
16129
|
{
|
|
@@ -16149,7 +16149,7 @@
|
|
|
16149
16149
|
"kind": "class",
|
|
16150
16150
|
"locationInModule": {
|
|
16151
16151
|
"filename": "src/project-generator.ts",
|
|
16152
|
-
"line":
|
|
16152
|
+
"line": 561
|
|
16153
16153
|
},
|
|
16154
16154
|
"methods": [
|
|
16155
16155
|
{
|
|
@@ -16160,7 +16160,7 @@
|
|
|
16160
16160
|
},
|
|
16161
16161
|
"locationInModule": {
|
|
16162
16162
|
"filename": "src/project-generator.ts",
|
|
16163
|
-
"line":
|
|
16163
|
+
"line": 752
|
|
16164
16164
|
},
|
|
16165
16165
|
"name": "preSynthesize",
|
|
16166
16166
|
"overrides": "projen.Component"
|
|
@@ -21194,6 +21194,6 @@
|
|
|
21194
21194
|
"symbolId": "src/components/vitest:VitestOptions"
|
|
21195
21195
|
}
|
|
21196
21196
|
},
|
|
21197
|
-
"version": "0.3.
|
|
21198
|
-
"fingerprint": "
|
|
21197
|
+
"version": "0.3.77",
|
|
21198
|
+
"fingerprint": "q+PzlPyAVBri9CYWJDVRrx+IBvfzcv1iPhLEM/+cimE="
|
|
21199
21199
|
}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<div class="tsd-comment tsd-typography"><p>AwsCdkConstructLibraryProject with standard configuration and component integration</p>
|
|
15
15
|
<p>Extends Projen's base class with opinionated defaults and automatic component setup.</p>
|
|
16
16
|
</div></section>
|
|
17
|
-
<section class="tsd-panel tsd-hierarchy" data-refl="
|
|
17
|
+
<section class="tsd-panel tsd-hierarchy" data-refl="812">
|
|
18
18
|
<h4>Hierarchy</h4>
|
|
19
19
|
<ul class="tsd-hierarchy">
|
|
20
20
|
<li class="tsd-hierarchy-item"><span class="tsd-signature-type">AwsCdkConstructLibrary</span>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<div class="tsd-comment tsd-typography"><p>AwsCdkTypeScriptAppProject with standard configuration and component integration</p>
|
|
15
15
|
<p>Extends Projen's base class with opinionated defaults and automatic component setup.</p>
|
|
16
16
|
</div></section>
|
|
17
|
-
<section class="tsd-panel tsd-hierarchy" data-refl="
|
|
17
|
+
<section class="tsd-panel tsd-hierarchy" data-refl="992">
|
|
18
18
|
<h4>Hierarchy</h4>
|
|
19
19
|
<ul class="tsd-hierarchy">
|
|
20
20
|
<li class="tsd-hierarchy-item"><span class="tsd-signature-type">AwsCdkTypeScriptApp</span>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<div class="tsd-comment tsd-typography"><p>JsiiProject with standard configuration and component integration</p>
|
|
15
15
|
<p>Extends Projen's base class with opinionated defaults and automatic component setup.</p>
|
|
16
16
|
</div></section>
|
|
17
|
-
<section class="tsd-panel tsd-hierarchy" data-refl="
|
|
17
|
+
<section class="tsd-panel tsd-hierarchy" data-refl="1175">
|
|
18
18
|
<h4>Hierarchy</h4>
|
|
19
19
|
<ul class="tsd-hierarchy">
|
|
20
20
|
<li class="tsd-hierarchy-item"><span class="tsd-signature-type">JsiiProject</span>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<div class="tsd-comment tsd-typography"><p>TypeScriptProject with standard configuration and component integration</p>
|
|
15
15
|
<p>Extends Projen's base class with opinionated defaults and automatic component setup.</p>
|
|
16
16
|
</div></section>
|
|
17
|
-
<section class="tsd-panel tsd-hierarchy" data-refl="
|
|
17
|
+
<section class="tsd-panel tsd-hierarchy" data-refl="1352">
|
|
18
18
|
<h4>Hierarchy</h4>
|
|
19
19
|
<ul class="tsd-hierarchy">
|
|
20
20
|
<li class="tsd-hierarchy-item"><span class="tsd-signature-type">TypeScriptProject</span>
|
|
@@ -55,7 +55,7 @@ function convertToPosixPath(p) {
|
|
|
55
55
|
return p.split(node_path_1.sep).join(node_path_1.posix.sep);
|
|
56
56
|
}
|
|
57
57
|
class Bundler extends projen_1.Component {
|
|
58
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Bundler", version: "0.3.
|
|
58
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Bundler", version: "0.3.77" };
|
|
59
59
|
static of(project) {
|
|
60
60
|
const isBundler = (o) => o instanceof Bundler;
|
|
61
61
|
return project.components.find(isBundler);
|
|
@@ -157,7 +157,7 @@ class Bundler extends projen_1.Component {
|
|
|
157
157
|
}
|
|
158
158
|
exports.Bundler = Bundler;
|
|
159
159
|
class LambdaFunctionCodeBundle extends projen_1.Component {
|
|
160
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundle", version: "0.3.
|
|
160
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundle", version: "0.3.77" };
|
|
161
161
|
constructor(project, options) {
|
|
162
162
|
super(project);
|
|
163
163
|
const bundler = Bundler.of(project);
|
|
@@ -200,7 +200,7 @@ class LambdaFunctionCodeBundle extends projen_1.Component {
|
|
|
200
200
|
}
|
|
201
201
|
exports.LambdaFunctionCodeBundle = LambdaFunctionCodeBundle;
|
|
202
202
|
class LambdaFunctionCodeBundler extends projen_1.Component {
|
|
203
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundler", version: "0.3.
|
|
203
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundler", version: "0.3.77" };
|
|
204
204
|
constructor(project, options) {
|
|
205
205
|
super(project);
|
|
206
206
|
const entrypoints = [];
|
package/lib/components/colima.js
CHANGED
|
@@ -6,7 +6,7 @@ const component_1 = require("projen/lib/component");
|
|
|
6
6
|
const task_shell_1 = require("projen/lib/task-shell");
|
|
7
7
|
const homebrew_1 = require("./homebrew");
|
|
8
8
|
class Colima extends component_1.Component {
|
|
9
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Colima", version: "0.3.
|
|
9
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Colima", version: "0.3.77" };
|
|
10
10
|
constructor(scope) {
|
|
11
11
|
super(scope);
|
|
12
12
|
const project = this.project;
|
|
@@ -6,7 +6,7 @@ const component_1 = require("projen/lib/component");
|
|
|
6
6
|
const task_shell_1 = require("projen/lib/task-shell");
|
|
7
7
|
const textfile_1 = require("projen/lib/textfile");
|
|
8
8
|
class Homebrew extends component_1.Component {
|
|
9
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Homebrew", version: "0.3.
|
|
9
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Homebrew", version: "0.3.77" };
|
|
10
10
|
static of(project) {
|
|
11
11
|
const isHomebrew = (c) => c instanceof Homebrew;
|
|
12
12
|
return project.components.find(isHomebrew);
|
|
@@ -39,7 +39,7 @@ const path = __importStar(require("node:path"));
|
|
|
39
39
|
const projen_1 = require("projen");
|
|
40
40
|
const utils_1 = require("../utils");
|
|
41
41
|
class LambdaFunctionConstructGenerator extends projen_1.Component {
|
|
42
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionConstructGenerator", version: "0.3.
|
|
42
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionConstructGenerator", version: "0.3.77" };
|
|
43
43
|
sourceDir;
|
|
44
44
|
outputDir;
|
|
45
45
|
filePattern;
|
|
@@ -7,7 +7,7 @@ const javascript_1 = require("projen/lib/javascript");
|
|
|
7
7
|
const colima_1 = require("./colima");
|
|
8
8
|
const homebrew_1 = require("./homebrew");
|
|
9
9
|
class LocalStack extends component_1.Component {
|
|
10
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LocalStack", version: "0.3.
|
|
10
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LocalStack", version: "0.3.77" };
|
|
11
11
|
constructor(scope, options = {}) {
|
|
12
12
|
super(scope);
|
|
13
13
|
const project = javascript_1.NodeProject.of(this);
|
package/lib/components/mise.js
CHANGED
|
@@ -7,7 +7,7 @@ const component_1 = require("projen/lib/component");
|
|
|
7
7
|
const textfile_1 = require("projen/lib/textfile");
|
|
8
8
|
const homebrew_1 = require("./homebrew");
|
|
9
9
|
class Mise extends component_1.Component {
|
|
10
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Mise", version: "0.3.
|
|
10
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Mise", version: "0.3.77" };
|
|
11
11
|
static of(project) {
|
|
12
12
|
const isMise = (c) => c instanceof Mise;
|
|
13
13
|
return project.components.find(isMise);
|
|
@@ -34,7 +34,7 @@ const DEFAULT_CONFIG = {
|
|
|
34
34
|
* TypeDoc component for projen projects
|
|
35
35
|
*/
|
|
36
36
|
class TypeDoc extends component_1.Component {
|
|
37
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeDoc", version: "0.3.
|
|
37
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeDoc", version: "0.3.77" };
|
|
38
38
|
static of(project) {
|
|
39
39
|
const isTypeDoc = (c) => c instanceof TypeDoc;
|
|
40
40
|
return project.components.find(isTypeDoc);
|
package/lib/components/vitest.js
CHANGED
|
@@ -140,7 +140,7 @@ var CoverageReporter;
|
|
|
140
140
|
CoverageReporter["TEXT"] = "text";
|
|
141
141
|
})(CoverageReporter || (exports.CoverageReporter = CoverageReporter = {}));
|
|
142
142
|
class Vitest extends component_1.Component {
|
|
143
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Vitest", version: "0.3.
|
|
143
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Vitest", version: "0.3.77" };
|
|
144
144
|
static of(project) {
|
|
145
145
|
const isVitest = (c) => c instanceof Vitest;
|
|
146
146
|
return project.components.find(isVitest);
|
|
@@ -110,6 +110,11 @@ export declare class ProjectGenerator extends projen.Component {
|
|
|
110
110
|
private readonly options;
|
|
111
111
|
private renderer;
|
|
112
112
|
private static enumGenerated;
|
|
113
|
+
/**
|
|
114
|
+
* Options property name per component class name, for the components whose options
|
|
115
|
+
* property was added to the generated options interface
|
|
116
|
+
*/
|
|
117
|
+
private readonly optionsProperties;
|
|
113
118
|
/**
|
|
114
119
|
* @param project - Projen project instance
|
|
115
120
|
* @param options - Generator configuration
|
package/lib/project-generator.js
CHANGED
|
@@ -155,9 +155,11 @@ class TypeScriptClassRenderer {
|
|
|
155
155
|
* builds import statements, and renders the class structure.
|
|
156
156
|
*
|
|
157
157
|
* @param options - Generator configuration
|
|
158
|
+
* @param optionsProperties - Options property name per component class name, for the components whose
|
|
159
|
+
* options property was added to the generated options interface
|
|
158
160
|
* @returns Complete TypeScript class code as a string
|
|
159
161
|
*/
|
|
160
|
-
render(options) {
|
|
162
|
+
render(options, optionsProperties = new Map()) {
|
|
161
163
|
this.buffer.flush();
|
|
162
164
|
/* Derive interface and type names from the class name */
|
|
163
165
|
const optionsInterface = `${options.name}Options`;
|
|
@@ -166,7 +168,7 @@ class TypeScriptClassRenderer {
|
|
|
166
168
|
/* Use provided components or fall back to defaults (Mise + Vitest) */
|
|
167
169
|
const components = options.components ?? getDefaultComponents();
|
|
168
170
|
/* Extract component configuration for constructor generation */
|
|
169
|
-
const { destructure, componentArray } = this.extractComponentOptions(components);
|
|
171
|
+
const { destructure, componentArray } = this.extractComponentOptions(components, optionsProperties);
|
|
170
172
|
const imports = this.extractImports(options, optionsInterface);
|
|
171
173
|
/* Render all sections of the class file */
|
|
172
174
|
this.renderImports(imports);
|
|
@@ -216,17 +218,21 @@ class TypeScriptClassRenderer {
|
|
|
216
218
|
* 1. Destructure list: variable names to extract from options
|
|
217
219
|
* 2. Component array: code string for applyDefaults() call
|
|
218
220
|
*
|
|
221
|
+
* The options are passed through for exactly the components whose options property is in the
|
|
222
|
+
* generated options interface, so every property of that interface reaches its component.
|
|
223
|
+
*
|
|
219
224
|
* @param components - Component configurations
|
|
225
|
+
* @param optionsProperties - Options property name per component class name
|
|
220
226
|
* @returns Object with destructure array and componentArray code string
|
|
221
227
|
*
|
|
222
228
|
* @example
|
|
223
|
-
* Input: [{ component: Vitest,
|
|
229
|
+
* Input: [{ component: Vitest }], { Vitest => "vitestOptions" }
|
|
224
230
|
* Output: {
|
|
225
231
|
* destructure: ["vitest", "vitestOptions"],
|
|
226
232
|
* componentArray: "[{ component: Vitest, enabled: vitest, options: vitestOptions }]"
|
|
227
233
|
* }
|
|
228
234
|
*/
|
|
229
|
-
extractComponentOptions(components) {
|
|
235
|
+
extractComponentOptions(components, optionsProperties) {
|
|
230
236
|
const destructure = [];
|
|
231
237
|
const componentParts = [];
|
|
232
238
|
for (const c of components) {
|
|
@@ -235,9 +241,9 @@ class TypeScriptClassRenderer {
|
|
|
235
241
|
destructure.push(name);
|
|
236
242
|
/* Build component config object for applyDefaults() call */
|
|
237
243
|
const parts = [`component: ${c.componentClass.name}`];
|
|
238
|
-
|
|
244
|
+
const propName = optionsProperties.get(c.componentClass.name);
|
|
245
|
+
if (propName) {
|
|
239
246
|
/* Component has configurable options - include both enabled flag and options */
|
|
240
|
-
const propName = typeof c.optionsProperty === "string" ? c.optionsProperty : c.optionsProperty.name;
|
|
241
247
|
destructure.push(propName);
|
|
242
248
|
parts.push(`enabled: ${name}`, `options: ${propName}`);
|
|
243
249
|
}
|
|
@@ -422,9 +428,14 @@ class TypeScriptClassRenderer {
|
|
|
422
428
|
*/
|
|
423
429
|
class ProjectGenerator extends projen.Component {
|
|
424
430
|
options;
|
|
425
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.3.
|
|
431
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.3.77" };
|
|
426
432
|
renderer;
|
|
427
433
|
static enumGenerated = false;
|
|
434
|
+
/**
|
|
435
|
+
* Options property name per component class name, for the components whose options
|
|
436
|
+
* property was added to the generated options interface
|
|
437
|
+
*/
|
|
438
|
+
optionsProperties = new Map();
|
|
428
439
|
/**
|
|
429
440
|
* @param project - Projen project instance
|
|
430
441
|
* @param options - Generator configuration
|
|
@@ -488,6 +499,7 @@ class ProjectGenerator extends projen.Component {
|
|
|
488
499
|
}));
|
|
489
500
|
}
|
|
490
501
|
else if (optionsType) {
|
|
502
|
+
this.optionsProperties.set(c.componentClass.name, optionsType.name);
|
|
491
503
|
struct.add({
|
|
492
504
|
name: optionsType.name,
|
|
493
505
|
type: { fqn: optionsType.fqn },
|
|
@@ -585,7 +597,7 @@ class ProjectGenerator extends projen.Component {
|
|
|
585
597
|
* The file is marked as readonly to prevent manual editing.
|
|
586
598
|
*/
|
|
587
599
|
preSynthesize() {
|
|
588
|
-
const content = this.renderer.render(this.options);
|
|
600
|
+
const content = this.renderer.render(this.options, this.optionsProperties);
|
|
589
601
|
new TypeScriptClassFile(this.project, this.options.filePath, content, {
|
|
590
602
|
readonly: this.options.readonly ?? true,
|
|
591
603
|
});
|
|
@@ -871,4 +883,4 @@ class TypeScriptClassFile extends projen.TextFile {
|
|
|
871
883
|
this.addLine(content);
|
|
872
884
|
}
|
|
873
885
|
}
|
|
874
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUF1QztBQUN2Qyx5Q0FBbUQ7QUFFbkQsc0VBQW9FO0FBQ3BFLCtDQUFpQztBQUNqQyxtQ0FBMkY7QUFDM0YscUNBTWtCO0FBR2xCOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0I7SUFDekIsT0FBTztRQUNILEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUNyRDtZQUNJLGNBQWMsRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNO1lBQ3JELGVBQWUsRUFBRTtnQkFDYixJQUFJLEVBQUUsZUFBZTtnQkFDckIsSUFBSSxFQUFFLDhDQUE4QztnQkFDcEQsSUFBSSxFQUFFLHNCQUFzQjthQUMvQjtTQUNKO0tBQ0osQ0FBQztBQUNOLENBQUM7QUErR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVU7SUFPaUI7SUFOckIsS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUNyQixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXhCOztPQUVHO0lBQ0gsWUFBNkIsU0FBUyxHQUFHO1FBQVosV0FBTSxHQUFOLE1BQU0sQ0FBTTtJQUFHLENBQUM7SUFFN0M7Ozs7T0FJRztJQUNILEtBQUs7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLElBQWE7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQs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TCw0Q0FtZkM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDN0M7Ozs7O09BS0c7SUFDSCxZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsVUFBNkIsRUFBRTtRQUM1RixLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEFzc2VtYmx5IH0gZnJvbSBcIkBqc2lpL3NwZWNcIjtcbmltcG9ydCB7IFByb2plblN0cnVjdCwgU3RydWN0IH0gZnJvbSBcIkBtcmdyYWluL2pzaWktc3RydWN0LWJ1aWxkZXJcIjtcbmltcG9ydCAqIGFzIHByb2plbiBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBqYXZhc2NyaXB0LCB0eXBlIFByb2plY3QsIHR5cGUgU291cmNlQ29kZU9wdGlvbnMsIHR5cGUgdHlwZXNjcmlwdCB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50UmVzb2x1dGlvbkVycm9yLFxuICAgIEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcixcbiAgICBJbnZhbGlkRmlsZVBhdGhFcnJvcixcbiAgICBJbnZhbGlkSW5kZW50TGV2ZWxFcnJvcixcbiAgICBNYW5pZmVzdExvYWRFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3RUeXBlIH0gZnJvbSBcIi4vcHJvamVjdC10eXBlXCI7XG5cbi8qKlxuICogRGVmYXVsdCBjb21wb25lbnRzIGFwcGxpZWQgdG8gYWxsIGdlbmVyYXRlZCBwcm9qZWN0c1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0Q29tcG9uZW50cygpOiBDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgeyBjb21wb25lbnRDbGFzczogcmVxdWlyZShcIi4vY29tcG9uZW50cy9taXNlXCIpLk1pc2UgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgY29tcG9uZW50Q2xhc3M6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvdml0ZXN0XCIpLlZpdGVzdCxcbiAgICAgICAgICAgIG9wdGlvbnNQcm9wZXJ0eToge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwidml0ZXN0T3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzLlZpdGVzdE9wdGlvbnNcIixcbiAgICAgICAgICAgICAgICBkb2NzOiBcIlZpdGVzdCBjb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIF07XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBjb21wb25lbnQgdG8gYmUgaW50ZWdyYXRlZCBpbnRvIGEgZ2VuZXJhdGVkIHByb2plY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqIENvbXBvbmVudCBjbGFzcyByZWZlcmVuY2VcbiAgICAgKlxuICAgICAqIEBqc2lpIGlnbm9yZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvbXBvbmVudENsYXNzOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY29tcG9uZW50IGNsYXNzXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCAtIGF1dG8tZGV0ZWN0ZWQgYnkgc2VhcmNoaW5nIEpTSUkgbWFuaWZlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZxbj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbnMgcHJvcGVydHkgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogT3B0aW9uYWwgLSBhdXRvLWRldGVjdGVkIGZyb20gY29tcG9uZW50IGNvbnN0cnVjdG9yLlxuICAgICAqIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIG9wdGlvbnMgcHJvcGVydHkgZ2VuZXJhdGlvbi5cbiAgICAgKiBTZXQgdG8gc3RyaW5nIG9yIG9iamVjdCB0byBjdXN0b21pemUgdGhlIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb3B0aW9uc1Byb3BlcnR5Pzogc3RyaW5nIHwgQ29tcG9uZW50T3B0aW9ucyB8IGZhbHNlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgcHJvcGVydHkgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIG9wdGlvbnMgcHJvcGVydHlcbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSAob3B0aW9uYWwsIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IpXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIHN1bW1hcnkgKG9wdGlvbmFsLCBhdXRvLWRldGVjdGVkIGZyb20gY29tcG9uZW50IGNvbnN0cnVjdG9yKVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRvY3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgUHJvamVjdEdlbmVyYXRvciBjb21wb25lbnRcbiAqXG4gKiBDb25maWd1cmVzIHRoZSBnZW5lcmF0aW9uIG9mIGEgVHlwZVNjcmlwdCBwcm9qZWN0IGNsYXNzIHRoYXQgZXh0ZW5kcyBhIFByb2plbiBiYXNlIGNsYXNzXG4gKiB3aXRoIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyBleHRlbmRzIFNvdXJjZUNvZGVPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgKGUuZy4sIFwiVHlwZVNjcmlwdFByb2plY3RcIilcbiAgICAgKlxuICAgICAqIFRoZSBvcHRpb25zIGludGVyZmFjZSB3aWxsIGJlIG5hbWVkIGAke25hbWV9T3B0aW9uc2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUHJvamVjdCB0eXBlIGlkZW50aWZpZXJcbiAgICAgKlxuICAgICAqIFNwZWNpZmllcyB3aGljaCBQcm9qZW4gYmFzZSBjbGFzcyB0byBleHRlbmQgYW5kIHdoaWNoIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byBhcHBseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIFByb2plY3RUeXBlLlRZUEVTQ1JJUFRcbiAgICAgKiBAZXhhbXBsZSBQcm9qZWN0VHlwZS5KU0lJXG4gICAgICovXG4gICAgcmVhZG9ubHkgcHJvamVjdFR5cGU6IFByb2plY3RUeXBlO1xuXG4gICAgLyoqXG4gICAgICogT3V0cHV0IGZpbGUgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzc1xuICAgICAqXG4gICAgICogTXVzdCBjb250YWluIGEgZGlyZWN0b3J5IHNlcGFyYXRvci4gVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAgICogaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdpdGggYSBcIi5nZW5lcmF0ZWQudHNcIiBzdWZmaXguXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBcInNyYy9wcm9qZWN0cy90eXBlc2NyaXB0LmdlbmVyYXRlZC50c1wiXG4gICAgICovXG4gICAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudHMgdG8gaW50ZWdyYXRlIGludG8gdGhlIHByb2plY3RcbiAgICAgKlxuICAgICAqIEVhY2ggY29tcG9uZW50IHdpbGwgYmUgaW5zdGFudGlhdGVkIGR1cmluZyBwcm9qZWN0IGNvbnN0cnVjdGlvbiBhbmQgY2FuIGJlXG4gICAgICogY29uZmlndXJlZCB2aWEgYW4gb3B0aW9uYWwgb3B0aW9ucyBwcm9wZXJ0eSBpbiB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFt7IGNvbXBvbmVudDogTWlzZSB9LCB7IGNvbXBvbmVudDogVml0ZXN0LCBvcHRpb25zUHJvcGVydHk6IHsgbmFtZTogXCJ2aXRlc3RPcHRpb25zXCIsIHR5cGU6IFwiLi4uXCIsIGRvY3M6IFwiLi4uXCIgfSB9XVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvbXBvbmVudHM/OiBDb21wb25lbnRbXTtcblxuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gZXh0ZW5kIHRoZSBiYXNlIG9wdGlvbnMgd2l0aCBjdXN0b20gcHJvcGVydGllcyBzcGVjaWZpYyB0b1xuICAgICAqIHlvdXIgcHJvamVjdCB0eXBlLlxuICAgICAqXG4gICAgICogQGpzaWkgaWdub3JlXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWRkaXRpb25hbE9wdGlvbnM/OiBhbnlbXTtcblxuICAgIC8qKlxuICAgICAqIFByb3BlcnR5IG5hbWVzIHRvIG9taXQgZnJvbSB0aGUgYmFzZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gaGlkZSBiYXNlIGNsYXNzIG9wdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIGNvbmZpZ3VyYWJsZVxuICAgICAqIGluIHRoZSBnZW5lcmF0ZWQgcHJvamVjdCB0eXBlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9taXRPcHRpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQnVmZmVyIGZvciBidWlsZGluZyBpbmRlbnRlZCBjb2RlIHdpdGggYXV0b21hdGljIGxpbmUgbWFuYWdlbWVudFxuICpcbiAqIE1haW50YWlucyBpbmRlbnRhdGlvbiBsZXZlbCBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWRkaW5nIGxpbmVzLFxuICogb3BlbmluZy9jbG9zaW5nIGJsb2NrcywgYW5kIGZsdXNoaW5nIGFjY3VtdWxhdGVkIGNvbnRlbnQuXG4gKi9cbmNsYXNzIENvZGVCdWZmZXIge1xuICAgIHByaXZhdGUgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBpbmRlbnRMZXZlbCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW5kZW50IC0gU3RyaW5nIHRvIHVzZSBmb3IgZWFjaCBpbmRlbnRhdGlvbiBsZXZlbCAoZGVmYXVsdDogc2luZ2xlIHNwYWNlKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW5kZW50ID0gXCIgXCIpIHt9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBhY2N1bXVsYXRlZCBsaW5lcyBhbmQgcmVzZXRzIHRoZSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGNvZGUgbGluZXMgd2l0aCBwcm9wZXIgaW5kZW50YXRpb25cbiAgICAgKi9cbiAgICBmbHVzaCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmxpbmVzO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaW5lIG9mIGNvZGUgYXQgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gQ29kZSB0byBhZGQgKG9wdGlvbmFsLCBhZGRzIGJsYW5rIGxpbmUgaWYgb21pdHRlZClcbiAgICAgKi9cbiAgICBsaW5lKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5pbmRlbnQucmVwZWF0KHRoaXMuaW5kZW50TGV2ZWwpO1xuICAgICAgICB0aGlzLmxpbmVzLnB1c2goKHByZWZpeCArIChjb2RlID8/IFwiXCIpKS50cmltRW5kKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgbmV3IGluZGVudGF0aW9uIGJsb2NrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSAtIE9wdGlvbmFsIGNvZGUgdG8gYWRkIGJlZm9yZSBpbmNyZWFzaW5nIGluZGVudCAoZS5nLiwgb3BlbmluZyBicmFjZSlcbiAgICAgKi9cbiAgICBvcGVuKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGVudExldmVsKys7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIGJsb2NrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSAtIE9wdGlvbmFsIGNvZGUgdG8gYWRkIGFmdGVyIGRlY3JlYXNpbmcgaW5kZW50IChlLmcuLCBjbG9zaW5nIGJyYWNlKVxuICAgICAqIEB0aHJvd3Mge0ludmFsaWRJbmRlbnRMZXZlbEVycm9yfSBXaGVuIGF0dGVtcHRpbmcgdG8gZGVjcmVhc2UgaW5kZW50IGJlbG93IHplcm9cbiAgICAgKi9cbiAgICBjbG9zZShjb2RlPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGVudExldmVsID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEluZGVudExldmVsRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGVudExldmVsLS07XG4gICAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmUoY29kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGJ1ZmZlciB0byBpbml0aWFsIHN0YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saW5lcyA9IFtdO1xuICAgICAgICB0aGlzLmluZGVudExldmVsID0gMDtcbiAgICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBUeXBlU2NyaXB0IGNsYXNzIGNvZGUgZnJvbSBQcm9qZWN0R2VuZXJhdG9yIG9wdGlvbnNcbiAqXG4gKiBHZW5lcmF0ZXMgYSBjb21wbGV0ZSBUeXBlU2NyaXB0IGNsYXNzIGZpbGUgaW5jbHVkaW5nIGltcG9ydHMsIG9wdGlvbnMgaW50ZXJmYWNlIGV4cG9ydCxcbiAqIGNsYXNzIGRlY2xhcmF0aW9uLCBhbmQgY29uc3RydWN0b3Igd2l0aCBjb21wb25lbnQgaW50ZWdyYXRpb24uXG4gKlxuICogVXNlcyBKU0lJIG1hbmlmZXN0IGludHJvc3BlY3Rpb24gdG8gdmFsaWRhdGUgYmFzZSBjbGFzc2VzIGFuZCBvcHRpb25zIGludGVyZmFjZXMuXG4gKi9cbmNsYXNzIFR5cGVTY3JpcHRDbGFzc1JlbmRlcmVyIHtcbiAgICBwcml2YXRlIGJ1ZmZlcjogQ29kZUJ1ZmZlcjtcbiAgICBwdWJsaWMganNpaU1hbmlmZXN0OiBBc3NlbWJseTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpbmRlbnQgLSBOdW1iZXIgb2Ygc3BhY2VzIHBlciBpbmRlbnRhdGlvbiBsZXZlbCAoZGVmYXVsdDogNClcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbmRlbnQgPSA0KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IENvZGVCdWZmZXIoXCIgXCIucmVwZWF0KGluZGVudCkpO1xuICAgICAgICAvKiBMb2FkIFByb2plbidzIEpTSUkgbWFuaWZlc3QgZm9yIGJhc2UgY2xhc3MgaW50cm9zcGVjdGlvbiAqL1xuICAgICAgICBjb25zdCBwcm9qZW5QYWNrYWdlSnNvbiA9IHJlcXVpcmUucmVzb2x2ZShcInByb2plbi9wYWNrYWdlLmpzb25cIik7XG4gICAgICAgIGNvbnN0IHByb2plblJvb3QgPSBkaXJuYW1lKHByb2plblBhY2thZ2VKc29uKTtcbiAgICAgICAgY29uc3QganNpaVBhdGggPSBqb2luKHByb2plblJvb3QsIFwiLmpzaWlcIik7XG4gICAgICAgIHRoaXMuanNpaU1hbmlmZXN0ID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoanNpaVBhdGgsIFwidXRmLThcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgY29tcGxldGUgVHlwZVNjcmlwdCBjbGFzcyBjb2RlIGZyb20gb3B0aW9uc1xuICAgICAqXG4gICAgICogT3JjaGVzdHJhdGVzIHRoZSByZW5kZXJpbmcgcHJvY2VzczogZGVyaXZlcyBuYW1lcywgZXh0cmFjdHMgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24sXG4gICAgICogYnVpbGRzIGltcG9ydCBzdGF0ZW1lbnRzLCBhbmQgcmVuZGVycyB0aGUgY2xhc3Mgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIENvbXBsZXRlIFR5cGVTY3JpcHQgY2xhc3MgY29kZSBhcyBhIHN0cmluZ1xuICAgICAqL1xuICAgIHJlbmRlcihvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIHRoaXMuYnVmZmVyLmZsdXNoKCk7XG5cbiAgICAgICAgLyogRGVyaXZlIGludGVyZmFjZSBhbmQgdHlwZSBuYW1lcyBmcm9tIHRoZSBjbGFzcyBuYW1lICovXG4gICAgICAgIGNvbnN0IG9wdGlvbnNJbnRlcmZhY2UgPSBgJHtvcHRpb25zLm5hbWV9T3B0aW9uc2A7XG4gICAgICAgIGNvbnN0IGJhc2VPcHRpb25zRnFuID0gdGhpcy5nZXRCYXNlT3B0aW9uc0ZxbihvcHRpb25zLnByb2plY3RUeXBlKTtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNUeXBlID0gYmFzZU9wdGlvbnNGcW4ucmVwbGFjZSgvXnByb2plblxcLi8sIFwiXCIpO1xuXG4gICAgICAgIC8qIFVzZSBwcm92aWRlZCBjb21wb25lbnRzIG9yIGZhbGwgYmFjayB0byBkZWZhdWx0cyAoTWlzZSArIFZpdGVzdCkgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBnZXREZWZhdWx0Q29tcG9uZW50cygpO1xuXG4gICAgICAgIC8qIEV4dHJhY3QgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZm9yIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24gKi9cbiAgICAgICAgY29uc3QgeyBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXkgfSA9IHRoaXMuZXh0cmFjdENvbXBvbmVudE9wdGlvbnMoY29tcG9uZW50cyk7XG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSB0aGlzLmV4dHJhY3RJbXBvcnRzKG9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2UpO1xuXG4gICAgICAgIC8qIFJlbmRlciBhbGwgc2VjdGlvbnMgb2YgdGhlIGNsYXNzIGZpbGUgKi9cbiAgICAgICAgdGhpcy5yZW5kZXJJbXBvcnRzKGltcG9ydHMpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMucmVuZGVyRXhwb3J0KG9wdGlvbnNJbnRlcmZhY2UpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMucmVuZGVyQ2xhc3Mob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSwgYmFzZU9wdGlvbnNUeXBlLCBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5mbHVzaCgpLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWUgZnJvbSBwcm9qZWN0IHR5cGVcbiAgICAgKlxuICAgICAqIFRyYW5zZm9ybXMgcHJvamVjdCB0eXBlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgUHJvamVuIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBieSBhcHBlbmRpbmcgXCJPcHRpb25zXCIgc3VmZml4IGFuZCBwcmVmaXhpbmcgd2l0aCBcInByb2plbi5cIiBuYW1lc3BhY2UuXG4gICAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGJhc2UgY2xhc3MgZXhpc3RzIGluIFByb2plbidzIEpTSUkgbWFuaWZlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm5zIEZ1bGx5IHF1YWxpZmllZCBvcHRpb25zIGludGVyZmFjZSBuYW1lXG4gICAgICogQHRocm93cyB7SW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yfSBXaGVuIHByb2plY3RUeXBlIGZvcm1hdCBpcyBpbnZhbGlkIG9yIGNsYXNzIG5vdCBmb3VuZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRCYXNlT3B0aW9uc0ZxbihQcm9qZWN0VHlwZS5UWVBFU0NSSVBUKSAvLyBcInByb2plbi50eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1wiXG4gICAgICogZ2V0QmFzZU9wdGlvbnNGcW4oUHJvamVjdFR5cGUuSlNJSSkgLy8gXCJwcm9qZW4uY2RrLkpzaWlQcm9qZWN0T3B0aW9uc1wiXG4gICAgICovXG4gICAgZ2V0QmFzZU9wdGlvbnNGcW4ocHJvamVjdFR5cGU6IFByb2plY3RUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gcHJvamVjdFR5cGUudmFsdWVPZigpO1xuICAgICAgICAvKiBWYWxpZGF0ZSBiYXNlIGNsYXNzIGZvcm1hdDogbXVzdCBjb250YWluIG1vZHVsZS5DbGFzc05hbWUgc3RydWN0dXJlICovXG4gICAgICAgIGlmICghYmFzZUNsYXNzLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcihiYXNlQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzZUNsYXNzRnFuID0gYHByb2plbi4ke2Jhc2VDbGFzc31gO1xuICAgICAgICBjb25zdCBvcHRpb25zRnFuID0gYCR7YmFzZUNsYXNzRnFufU9wdGlvbnNgO1xuXG4gICAgICAgIC8qIFZhbGlkYXRlIGJhc2UgY2xhc3MgZXhpc3RzIGluIEpTSUkgbWFuaWZlc3QgKi9cbiAgICAgICAgaWYgKCF0aGlzLmpzaWlNYW5pZmVzdC50eXBlcz8uW2Jhc2VDbGFzc0Zxbl0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3IoYEJhc2UgY2xhc3Mgbm90IGZvdW5kIGluIEpTSUkgbWFuaWZlc3Q6ICR7YmFzZUNsYXNzRnFufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVmFsaWRhdGUgb3B0aW9ucyBpbnRlcmZhY2UgZXhpc3RzIGluIEpTSUkgbWFuaWZlc3QgKi9cbiAgICAgICAgaWYgKCF0aGlzLmpzaWlNYW5pZmVzdC50eXBlcz8uW29wdGlvbnNGcW5dKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yKGBPcHRpb25zIGludGVyZmFjZSBub3QgZm91bmQgaW4gSlNJSSBtYW5pZmVzdDogJHtvcHRpb25zRnFufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnNGcW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZm9yIGNvbnN0cnVjdG9yIGNvZGUgZ2VuZXJhdGlvblxuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBjb21wb25lbnQgY29uZmlndXJhdGlvbnMgaW50bzpcbiAgICAgKiAxLiBEZXN0cnVjdHVyZSBsaXN0OiB2YXJpYWJsZSBuYW1lcyB0byBleHRyYWN0IGZyb20gb3B0aW9uc1xuICAgICAqIDIuIENvbXBvbmVudCBhcnJheTogY29kZSBzdHJpbmcgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50cyAtIENvbXBvbmVudCBjb25maWd1cmF0aW9uc1xuICAgICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRlc3RydWN0dXJlIGFycmF5IGFuZCBjb21wb25lbnRBcnJheSBjb2RlIHN0cmluZ1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJbnB1dDogW3sgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogeyBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIiwgLi4uIH0gfV1cbiAgICAgKiBPdXRwdXQ6IHtcbiAgICAgKiAgIGRlc3RydWN0dXJlOiBbXCJ2aXRlc3RcIiwgXCJ2aXRlc3RPcHRpb25zXCJdLFxuICAgICAqICAgY29tcG9uZW50QXJyYXk6IFwiW3sgY29tcG9uZW50OiBWaXRlc3QsIGVuYWJsZWQ6IHZpdGVzdCwgb3B0aW9uczogdml0ZXN0T3B0aW9ucyB9XVwiXG4gICAgICogfVxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdENvbXBvbmVudE9wdGlvbnMoY29tcG9uZW50czogQ29tcG9uZW50W10pOiB7IGRlc3RydWN0dXJlOiBzdHJpbmdbXTsgY29tcG9uZW50QXJyYXk6IHN0cmluZyB9IHtcbiAgICAgICAgY29uc3QgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICAvKiBDb252ZXJ0IGNvbXBvbmVudCBjbGFzcyBuYW1lIHRvIGNhbWVsQ2FzZSB2YXJpYWJsZSBuYW1lIChlLmcuLCBWaXRlc3QgLT4gdml0ZXN0KSAqL1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGMuY29tcG9uZW50Q2xhc3MubmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGMuY29tcG9uZW50Q2xhc3MubmFtZS5zbGljZSgxKTtcbiAgICAgICAgICAgIGRlc3RydWN0dXJlLnB1c2gobmFtZSk7XG5cbiAgICAgICAgICAgIC8qIEJ1aWxkIGNvbXBvbmVudCBjb25maWcgb2JqZWN0IGZvciBhcHBseURlZmF1bHRzKCkgY2FsbCAqL1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBbYGNvbXBvbmVudDogJHtjLmNvbXBvbmVudENsYXNzLm5hbWV9YF07XG4gICAgICAgICAgICBpZiAoYy5vcHRpb25zUHJvcGVydHkgJiYgdHlwZW9mIGMub3B0aW9uc1Byb3BlcnR5ICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgY29uZmlndXJhYmxlIG9wdGlvbnMgLSBpbmNsdWRlIGJvdGggZW5hYmxlZCBmbGFnIGFuZCBvcHRpb25zICovXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlb2YgYy5vcHRpb25zUHJvcGVydHkgPT09IFwic3RyaW5nXCIgPyBjLm9wdGlvbnNQcm9wZXJ0eSA6IGMub3B0aW9uc1Byb3BlcnR5Lm5hbWU7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3R1cmUucHVzaChwcm9wTmFtZSk7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChgZW5hYmxlZDogJHtuYW1lfWAsIGBvcHRpb25zOiAke3Byb3BOYW1lfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvKiBDb21wb25lbnQgaGFzIG5vIG9wdGlvbnMgLSBvbmx5IGluY2x1ZGUgZW5hYmxlZCBmbGFnICovXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChgZW5hYmxlZDogJHtuYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50UGFydHMucHVzaChgeyAke3BhcnRzLmpvaW4oXCIsIFwiKX0gfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZGVzdHJ1Y3R1cmUsIGNvbXBvbmVudEFycmF5OiBgWyR7Y29tcG9uZW50UGFydHMuam9pbihcIiwgXCIpfV1gIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGltcG9ydCBzdGF0ZW1lbnRzIG1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzc1xuICAgICAqXG4gICAgICogQ29sbGVjdHMgYWxsIHJlcXVpcmVkIGltcG9ydHM6XG4gICAgICogLSBQcm9qZW4gYmFzZSBtb2R1bGUgKHR5cGVzY3JpcHQsIGNkaywgYXdzY2RrKVxuICAgICAqIC0gQ29uZmlnIHV0aWxpdGllcyAoYXBwbHlEZWZhdWx0cywgZGVmYXVsdE9wdGlvbnMpXG4gICAgICogLSBDb21wb25lbnQgY2xhc3Nlc1xuICAgICAqIC0gVXRpbGl0eSBmdW5jdGlvbnMgKGRlZXBNZXJnZSlcbiAgICAgKiAtIEdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZSAodHlwZS1vbmx5IGltcG9ydClcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gR2VuZXJhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEByZXR1cm5zIE1hcCBvZiBtb2R1bGUgcGF0aHMgdG8gc2V0cyBvZiBpbXBvcnRlZCBuYW1lc1xuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdEltcG9ydHMob3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyk6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiB7XG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgICAgICAgLyogRXh0cmFjdCBiYXNlIG1vZHVsZSBuYW1lIGZyb20gcHJvamVjdFR5cGUgKGUuZy4sIFwidHlwZXNjcmlwdFwiIGZyb20gXCJ0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0XCIpICovXG4gICAgICAgIGNvbnN0IGJhc2VNb2R1bGUgPSBvcHRpb25zLnByb2plY3RUeXBlLnZhbHVlT2YoKS5zcGxpdChcIi5cIilbMF07XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGaWxlTmFtZSA9IHRoaXMuZ2V0T3B0aW9uc0ZpbGVOYW1lKG9wdGlvbnNJbnRlcmZhY2UpO1xuXG4gICAgICAgIC8qIFByb2plbiBiYXNlIG1vZHVsZSBpbXBvcnQgKi9cbiAgICAgICAgaW1wb3J0cy5zZXQoXCJwcm9qZW5cIiwgbmV3IFNldChbYmFzZU1vZHVsZV0pKTtcblxuICAgICAgICAvKiBDb25maWd1cmF0aW9uIHV0aWxpdGllcyBpbXBvcnQgKi9cbiAgICAgICAgaW1wb3J0cy5zZXQoXCIuLi9jb25maWdcIiwgbmV3IFNldChbXCJhcHBseURlZmF1bHRzXCIsIFwiZGVmYXVsdE9wdGlvbnNcIl0pKTtcblxuICAgICAgICAvKiBDb21wb25lbnQgY2xhc3MgaW1wb3J0cyAtIGRlcml2ZSBtb2R1bGUgcGF0aCBmcm9tIGNvbXBvbmVudCBjbGFzcyBuYW1lICovXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBvcHRpb25zLmNvbXBvbmVudHMgPz8gZ2V0RGVmYXVsdENvbXBvbmVudHMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjLmNvbXBvbmVudENsYXNzLm5hbWU7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVQYXRoID0gYC4uL2NvbXBvbmVudHMvJHtjb21wb25lbnROYW1lLnRvTG93ZXJDYXNlKCl9YDtcbiAgICAgICAgICAgIGlmICghaW1wb3J0cy5oYXMobW9kdWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBpbXBvcnRzLnNldChtb2R1bGVQYXRoLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbW9kdWxlSW1wb3J0cyA9IGltcG9ydHMuZ2V0KG1vZHVsZVBhdGgpO1xuICAgICAgICAgICAgaWYgKG1vZHVsZUltcG9ydHMpIHtcbiAgICAgICAgICAgICAgICBtb2R1bGVJbXBvcnRzLmFkZChjb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFV0aWxpdHkgZnVuY3Rpb25zIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcIi4uL3V0aWxzXCIsIG5ldyBTZXQoW1wiZGVlcE1lcmdlXCJdKSk7XG5cbiAgICAgICAgLyogR2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlIGltcG9ydCAodHlwZS1vbmx5IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcykgKi9cbiAgICAgICAgaW1wb3J0cy5zZXQoYC4vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZGAsIG5ldyBTZXQoW29wdGlvbnNJbnRlcmZhY2VdKSk7XG5cbiAgICAgICAgcmV0dXJuIGltcG9ydHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlcyB0aGUgY29uZmlnIHBhdGggZm9yIGFjY2Vzc2luZyBkZWZhdWx0IG9wdGlvbnNcbiAgICAgKlxuICAgICAqIFRyYW5zZm9ybXMgcHJvamVjdCB0eXBlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgcGF0aCBpbiB0aGUgZGVmYXVsdE9wdGlvbnNcbiAgICAgKiBjb25maWd1cmF0aW9uIG9iamVjdCBleHBvcnRlZCBmcm9tIGNvbmZpZy50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0VHlwZSAtIFByb2plY3QgdHlwZSBpZGVudGlmaWVyXG4gICAgICogQHJldHVybnMgQ29uZmlnIHBhdGggZm9yIGFjY2Vzc2luZyBkZWZhdWx0IG9wdGlvbnNcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogZ2V0Q29uZmlnUGF0aChQcm9qZWN0VHlwZS5UWVBFU0NSSVBUKSAvLyBcImRlZmF1bHRPcHRpb25zLnR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q29uZmlnUGF0aChwcm9qZWN0VHlwZTogUHJvamVjdFR5cGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYGRlZmF1bHRPcHRpb25zLiR7cHJvamVjdFR5cGUudmFsdWVPZigpfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBpbXBvcnQgc3RhdGVtZW50cyBpbiBzb3J0ZWQgb3JkZXJcbiAgICAgKlxuICAgICAqIFNvcnRzIGltcG9ydHMgd2l0aCBleHRlcm5hbCBwYWNrYWdlcyBmaXJzdCwgdGhlbiByZWxhdGl2ZSBpbXBvcnRzLlxuICAgICAqIFVzZXMgdHlwZS1vbmx5IGltcG9ydHMgZm9yIGdlbmVyYXRlZCBmaWxlcyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW1wb3J0cyAtIE1hcCBvZiBtb2R1bGUgcGF0aHMgdG8gaW1wb3J0ZWQgbmFtZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckltcG9ydHMoaW1wb3J0czogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KSB7XG4gICAgICAgIC8qIFNvcnQgbW9kdWxlczogZXh0ZXJuYWwgcGFja2FnZXMgZmlyc3QsIHRoZW4gcmVsYXRpdmUgaW1wb3J0cyBhbHBoYWJldGljYWxseSAqL1xuICAgICAgICBjb25zdCBzb3J0ZWRNb2R1bGVzID0gQXJyYXkuZnJvbShpbXBvcnRzLmtleXMoKSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYUlzUmVsYXRpdmUgPSBhLnN0YXJ0c1dpdGgoXCIuXCIpO1xuICAgICAgICAgICAgY29uc3QgYklzUmVsYXRpdmUgPSBiLnN0YXJ0c1dpdGgoXCIuXCIpO1xuICAgICAgICAgICAgaWYgKGFJc1JlbGF0aXZlICE9PSBiSXNSZWxhdGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhSXNSZWxhdGl2ZSA/IDEgOiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgbW9kIG9mIHNvcnRlZE1vZHVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuZnJvbShpbXBvcnRzLmdldChtb2QpIHx8IFtdKS5zb3J0KCk7XG4gICAgICAgICAgICAvKiBVc2UgdHlwZS1vbmx5IGltcG9ydCBmb3IgZ2VuZXJhdGVkIGZpbGVzIHRvIHByZXZlbnQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzICovXG4gICAgICAgICAgICBjb25zdCBpc1R5cGVPbmx5ID0gbW9kLmluY2x1ZGVzKFwiLmdlbmVyYXRlZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydFN0bXQgPSBpc1R5cGVPbmx5ID8gXCJpbXBvcnQgdHlwZVwiIDogXCJpbXBvcnRcIjtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYCR7aW1wb3J0U3RtdH0geyAke25hbWVzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiJHttb2R9XCI7YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHJlLWV4cG9ydCBzdGF0ZW1lbnQgZm9yIHRoZSBnZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgb3B0aW9ucyBpbnRlcmZhY2UgdG8gZXhwb3J0XG4gICAgICovXG4gICAgcHJpdmF0ZSByZW5kZXJFeHBvcnQob3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGaWxlTmFtZSA9IHRoaXMuZ2V0T3B0aW9uc0ZpbGVOYW1lKG9wdGlvbnNJbnRlcmZhY2UpO1xuICAgICAgICAvKiB0eXBlLW9ubHkgcmUtZXhwb3J0LCByZXF1aXJlZCBieSBgaXNvbGF0ZWRNb2R1bGVzYCAqL1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBleHBvcnQgdHlwZSB7ICR7b3B0aW9uc0ludGVyZmFjZX0gfSBmcm9tIFwiLi8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkXCI7YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY2xhc3MgZGVjbGFyYXRpb24gYW5kIGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBiYXNlT3B0aW9uc1R5cGUgLSBCYXNlIG9wdGlvbnMgdHlwZSB3aXRob3V0IFwicHJvamVuLlwiIHByZWZpeFxuICAgICAqIEBwYXJhbSBkZXN0cnVjdHVyZSAtIFZhcmlhYmxlIG5hbWVzIHRvIGRlc3RydWN0dXJlIGZyb20gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb21wb25lbnRBcnJheSAtIENvZGUgc3RyaW5nIGZvciBjb21wb25lbnQgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNsYXNzKFxuICAgICAgICBvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGAgKiAke29wdGlvbnMubmFtZX0gd2l0aCBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGFuZCBjb21wb25lbnQgaW50ZWdyYXRpb25gKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogRXh0ZW5kcyBQcm9qZW4ncyBiYXNlIGNsYXNzIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGF1dG9tYXRpYyBjb21wb25lbnQgc2V0dXAuXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5vcGVuKGBleHBvcnQgY2xhc3MgJHtvcHRpb25zLm5hbWV9IGV4dGVuZHMgJHtvcHRpb25zLnByb2plY3RUeXBlLnZhbHVlT2YoKX0ge2ApO1xuICAgICAgICB0aGlzLnJlbmRlckNvbnN0cnVjdG9yKG9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2UsIGJhc2VPcHRpb25zVHlwZSwgZGVzdHJ1Y3R1cmUsIGNvbXBvbmVudEFycmF5KTtcbiAgICAgICAgdGhpcy5idWZmZXIuY2xvc2UoXCJ9XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3I6XG4gICAgICogMS4gRGVzdHJ1Y3R1cmVzIGNvbXBvbmVudCBmbGFncyBhbmQgb3B0aW9ucyBmcm9tIHRoZSBvcHRpb25zIHBhcmFtZXRlclxuICAgICAqIDIuIE1lcmdlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyLXByb3ZpZGVkIG9wdGlvbnNcbiAgICAgKiAzLiBDYWxscyBzdXBlcigpIHdpdGggbWVyZ2VkIG9wdGlvbnNcbiAgICAgKiA0LiBBcHBsaWVzIGNvbXBvbmVudCBkZWZhdWx0cyB2aWEgYXBwbHlEZWZhdWx0cygpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBiYXNlT3B0aW9uc1R5cGUgLSBCYXNlIG9wdGlvbnMgdHlwZSB3aXRob3V0IFwicHJvamVuLlwiIHByZWZpeFxuICAgICAqIEBwYXJhbSBkZXN0cnVjdHVyZSAtIFZhcmlhYmxlIG5hbWVzIHRvIGRlc3RydWN0dXJlIGZyb20gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb21wb25lbnRBcnJheSAtIENvZGUgc3RyaW5nIGZvciBjb21wb25lbnQgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNvbnN0cnVjdG9yKFxuICAgICAgICBvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5nZXRDb25maWdQYXRoKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogQHBhcmFtIG9wdGlvbnMgLSBQcm9qZWN0IGNvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLm9wZW4oYGNvbnN0cnVjdG9yKG9wdGlvbnM6ICR7b3B0aW9uc0ludGVyZmFjZX0pIHtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qIFNlcGFyYXRlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uIGZyb20gYmFzZSBQcm9qZW4gb3B0aW9ucyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgY29uc3QgeyAke2Rlc3RydWN0dXJlLmpvaW4oXCIsIFwiKX0sIC4uLmJhc2VPcHRpb25zIH0gPSBvcHRpb25zO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKiBNZXJnZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyIG9wdGlvbnMgYW5kIGluaXRpYWxpemUgYmFzZSBjbGFzcyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgc3VwZXIoZGVlcE1lcmdlPCR7YmFzZU9wdGlvbnNUeXBlfT4oJHtjb25maWdQYXRofSwgYmFzZU9wdGlvbnMpKTtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyogQXBwbHkgY29tcG9uZW50IGRlZmF1bHRzIGFuZCBpbnN0YW50aWF0ZSBlbmFibGVkIGNvbXBvbmVudHMgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGFwcGx5RGVmYXVsdHModGhpcywgJHtjb21wb25lbnRBcnJheX0pO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5jbG9zZShcIn1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBvcHRpb25zIGludGVyZmFjZSBuYW1lIHRvIGZpbGUgbmFtZVxuICAgICAqXG4gICAgICogQ29udmVydHMgUGFzY2FsQ2FzZSBpbnRlcmZhY2UgbmFtZXMgdG8ga2ViYWItY2FzZSBmaWxlIG5hbWVzLlxuICAgICAqIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGNvbnZlcnNpb24gZm9yIHVubWFwcGVkIGludGVyZmFjZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAcmV0dXJucyBLZWJhYi1jYXNlIGZpbGUgbmFtZSB3aXRob3V0IGV4dGVuc2lvblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRPcHRpb25zRmlsZU5hbWUoXCJUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnNcIikgLy8gXCJ0eXBlc2NyaXB0LW9wdGlvbnNcIlxuICAgICAqL1xuICAgIGdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zOiBcInR5cGVzY3JpcHQtb3B0aW9uc1wiLFxuICAgICAgICAgICAgSnNpaVByb2plY3RPcHRpb25zOiBcImpzaWktb3B0aW9uc1wiLFxuICAgICAgICAgICAgQXdzQ2RrVHlwZVNjcmlwdEFwcFByb2plY3RPcHRpb25zOiBcImF3c2Nkay10eXBlc2NyaXB0LWFwcC1vcHRpb25zXCIsXG4gICAgICAgICAgICBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5UHJvamVjdE9wdGlvbnM6IFwiYXdzY2RrLWNvbnN0cnVjdC1saWJyYXJ5LW9wdGlvbnNcIixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG1hcHBpbmdbb3B0aW9uc0ludGVyZmFjZV0gfHwgb3B0aW9uc0ludGVyZmFjZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm9qZW4gY29tcG9uZW50IHRoYXQgZ2VuZXJhdGVzIFR5cGVTY3JpcHQgcHJvamVjdCBjbGFzc2VzIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvblxuICpcbiAqIFRoaXMgY29tcG9uZW50IGF1dG9tYXRlcyB0aGUgY3JlYXRpb24gb2YgcHJvamVjdCBjbGFzc2VzIHRoYXQgZXh0ZW5kIFByb2plbiBiYXNlIGNsYXNzZXNcbiAqIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2plY3RHZW5lcmF0b3IgZXh0ZW5kcyBwcm9qZW4uQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcjtcbiAgICBwcml2YXRlIHN0YXRpYyBlbnVtR2VuZXJhdGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLFxuICAgICkge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcigpO1xuXG4gICAgICAgIC8qIEdlbmVyYXRlIFByb2plY3RUeXBlIGVudW0gb25jZSBvbiBmaXJzdCBpbnN0YW50aWF0aW9uICovXG4gICAgICAgIGlmICghUHJvamVjdEdlbmVyYXRvci5lbnVtR2VuZXJhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvamVjdFR5cGVFbnVtKCk7XG4gICAgICAgICAgICBQcm9qZWN0R2VuZXJhdG9yLmVudW1HZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogR2VuZXJhdGUgdGhlIG9wdGlvbnMgaW50ZXJmYWNlIHVzaW5nIFByb2plblN0cnVjdCBmb3IgSlNJSSBjb21wYXRpYmlsaXR5ICovXG4gICAgICAgIGNvbnN0IG9wdGlvbnNJbnRlcmZhY2UgPSBgJHtvcHRpb25zLm5hbWV9T3B0aW9uc2A7XG4gICAgICAgIGNvbnN0IGJhc2VPcHRpb25zRnFuID0gdGhpcy5yZW5kZXJlci5nZXRCYXNlT3B0aW9uc0ZxbihvcHRpb25zLnByb2plY3RUeXBlKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVQYXRoID0gdGhpcy5nZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUHJvamVuU3RydWN0IGdlbmVyYXRlcyBhIGNvbmNyZXRlIFR5cGVTY3JpcHQgaW50ZXJmYWNlIGZyb20gUHJvamVuJ3Mgb3B0aW9uc1xuICAgICAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEpTSUkgZG9lc24ndCBzdXBwb3J0IFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlcyBsaWtlIE9taXQ8PlxuICAgICAgICAgKiBUaGUgZ2VuZXJhdGVkIGludGVyZmFjZSBjYW4gYmUgY29uc3VtZWQgYnkgb3RoZXIgbGFuZ3VhZ2VzIChQeXRob24sIEphdmEsIEMjLCBHbykgKi9cbiAgICAgICAgY29uc3Qgc3RydWN0ID0gbmV3IFByb2plblN0cnVjdCh0aGlzLmFzVHlwZVNjcmlwdFByb2plY3QocHJvamVjdCksIHtcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNJbnRlcmZhY2UsXG4gICAgICAgICAgICBmaWxlUGF0aDogb3B0aW9uc0ZpbGVQYXRoLFxuICAgICAgICAgICAgb3V0cHV0RmlsZU9wdGlvbnM6IHsgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5taXhpbih0aGlzLndpdGhvdXRQYWNrYWdlTWFuYWdlckluaXRpYWxWYWx1ZShTdHJ1Y3QuZnJvbUZxbihiYXNlT3B0aW9uc0ZxbikpKVxuICAgICAgICAgICAgLndpdGhvdXREZXByZWNhdGVkKCk7XG5cbiAgICAgICAgLyogUmVtb3ZlIHNwZWNpZmllZCBvcHRpb25zIGZyb20gdGhlIGJhc2UgaW50ZXJmYWNlICovXG4gICAgICAgIGlmIChvcHRpb25zLm9taXRPcHRpb25zKSB7XG4gICAgICAgICAgICBzdHJ1Y3Qub21pdCguLi5vcHRpb25zLm9taXRPcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFkZCBjb21wb25lbnQtZGVyaXZlZCBvcHRpb25zIHRvIHRoZSBpbnRlcmZhY2UgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBnZXREZWZhdWx0Q29tcG9uZW50cygpO1xuICAgICAgICBjb25zdCB7IFByaW1pdGl2ZVR5cGUgfSA9IHJlcXVpcmUoXCJAanNpaS9zcGVjXCIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYy5jb21wb25lbnRDbGFzcy5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgYy5jb21wb25lbnRDbGFzcy5uYW1lLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICAvKiBBZGQgZW5hYmxlZCBmbGFnIGZvciB0aGUgY29tcG9uZW50ICovXG4gICAgICAgICAgICBzdHJ1Y3QuYWRkKHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IHsgcHJpbWl0aXZlOiBQcmltaXRpdmVUeXBlLkJvb2xlYW4gfSxcbiAgICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBFbmFibGUgJHtjLmNvbXBvbmVudENsYXNzLm5hbWV9IGNvbXBvbmVudGAsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogQWRkIG9wdGlvbnMgcHJvcGVydHkgaWYgY29tcG9uZW50IGlzIGNvbmZpZ3VyYWJsZSAqL1xuICAgICAgICAgICAgaWYgKGMub3B0aW9uc1Byb3BlcnR5ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnNUeXBlID0gdGhpcy5yZXNvbHZlQ29tcG9uZW50T3B0aW9uc1R5cGUoYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zVHlwZSAmJiAhdGhpcy5pc0ZxbkF2YWlsYWJsZShvcHRpb25zVHlwZS5mcW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgb3B0aW9ucyB0eXBlIGlzIG5vdCBpbiB0aGUgbWFuaWZlc3QgeWV0LCB3aGljaCBpcyBleHBlY3RlZCB3aGlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICogYSBuZXcgY29tcG9uZW50IGlzIGJlaW5nIGludHJvZHVjZWQ6IGl0cyB0eXBlIG9ubHkgcmVhY2hlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIG1hbmlmZXN0IG9uY2UgaXQgaGFzIGJlZW4gY29tcGlsZWQuIE5ldmVyIGxlYXZlIHRoaXMgc2lsZW50LCBzaW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICogc2tpcHBpbmcgdGhlIHByb3BlcnR5IHJlbW92ZXMgaXQgZnJvbSB0aGUgcHVibGljIEFQSSBvZiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBwYWNrYWdlIC0gYSBzdGFsZSBvciB1bnJlYWRhYmxlIG1hbmlmZXN0IGxvb2tzIGV4YWN0bHkgdGhlIHNhbWUuICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDb21wb25lbnQgb3B0aW9ucyB0eXBlIGlzIG1pc3NpbmcgZnJvbSB0aGUgSlNJSSBtYW5pZmVzdCwgb21pdHRpbmcgdGhlIG9wdGlvbnMgcHJvcGVydHkuIENvbXBpbGUgdGhlIHBhY2thZ2UgYW5kIHN5bnRoZXNpemUgYWdhaW4uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogYy5jb21wb25lbnRDbGFzcy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcW46IG9wdGlvbnNUeXBlLmZxbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uc1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5hZGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNUeXBlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogeyBmcW46IG9wdGlvbnNUeXBlLmZxbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogb3B0aW9uc1R5cGUuZG9jcyA/PyBgJHtjLmNvbXBvbmVudENsYXNzLm5hbWV9IGNvbmZpZ3VyYXRpb25gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBgLSBkZWZhdWx0ICR7Yy5jb21wb25lbnRDbGFzcy5uYW1lfSBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvKiBDb21wb25lbnQgaGFzIG5vIG9wdGlvbnMgcGFyYW1ldGVyIG9yIHJlc29sdXRpb24gZmFpbGVkIC0gc2tpcCAqL1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJGYWlsZWQgdG8gcmVzb2x2ZSBjb21wb25lbnQgb3B0aW9ucyB0eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBjLmNvbXBvbmVudENsYXNzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFkZCBjdXN0b20gb3B0aW9ucyB0byB0aGUgaW50ZXJmYWNlICovXG4gICAgICAgIGlmIChvcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zICYmIG9wdGlvbnMuYWRkaXRpb25hbE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3RydWN0LmFkZCguLi5vcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyb3BzIHRoZSBgQHBqbmV3YCBhbm5vdGF0aW9uIGZyb20gdGhlIGBwYWNrYWdlTWFuYWdlcmAgb3B0aW9uLlxuICAgICAqXG4gICAgICogYHByb2plbiBuZXdgIHJlbmRlcnMgdGhhdCBhbm5vdGF0aW9uIGFzIGFuIGV4cGxpY2l0IGFyZ3VtZW50IGluIHRoZSBgLnByb2plbnJjLnRzYFxuICAgICAqIGl0IGdlbmVyYXRlcywgd2hlcmUgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBkZWZhdWx0cyB0aGVzZSBwcm9qZWN0IHR5cGVzXG4gICAgICogYXBwbHkuIFByb2plbiBhbm5vdGF0ZXMgYHBhY2thZ2VNYW5hZ2VyYCB3aXRoIHRoZSBgJFBBQ0tBR0VfTUFOQUdFUmAgbWFjcm8sIHdoaWNoXG4gICAgICogcmVzb2x2ZXMgdG8gdGhlIHBhY2thZ2UgbWFuYWdlciB0aGF0IHJ1bnMgdGhlIGNvbW1hbmQsIHNvIGBucHggcHJvamVuIG5ldyAtLWZyb21gXG4gICAgICogd291bGQgcGluIGEgbmV3IHByb2plY3QgdG8gbnBtLiBXaXRob3V0IGFuIGFubm90YXRpb24gdGhlIG9wdGlvbiBpcyBsZWZ0IG91dCBvZlxuICAgICAqIHRoZSBnZW5lcmF0ZWQgYC5wcm9qZW5yYy50c2AgYW5kIHRoZSBkZWZhdWx0IG9mIHRoaXMgbGlicmFyeSBhcHBsaWVzLlxuICAgICAqXG4gICAgICogVGhlIGFubm90YXRpb24gY2Fubm90IGJlIHJlLXBvaW50ZWQgYXQgcG5wbSBpbnN0ZWFkOiBwcm9qZW4gb25seSBhY2NlcHRzIGEgbWFjcm9cbiAgICAgKiBvciBhIHByaW1pdGl2ZSB2YWx1ZSBhcyBhbiBpbml0aWFsIHZhbHVlLCBhbmQgdGhpcyBvcHRpb24gaXMgYW4gZW51bS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBiYXNlIC0gVGhlIHByb2plbiBvcHRpb25zIHN0cnVjdCB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZSBpcyBkZXJpdmVkIGZyb21cbiAgICAgKi9cbiAgICBwcml2YXRlIHdpdGhvdXRQYWNrYWdlTWFuYWdlckluaXRpYWxWYWx1ZShiYXNlOiBTdHJ1Y3QpOiBTdHJ1Y3Qge1xuICAgICAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGJhc2UucHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gXCJwYWNrYWdlTWFuYWdlclwiKTtcblxuICAgICAgICBpZiAoIXBhY2thZ2VNYW5hZ2VyPy5kb2NzPy5jdXN0b20/LnBqbmV3KSB7XG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgcGpuZXcsIC4uLmN1c3RvbSB9ID0gcGFja2FnZU1hbmFnZXIuZG9jcy5jdXN0b207XG5cbiAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZShcInBhY2thZ2VNYW5hZ2VyXCIsIHtcbiAgICAgICAgICAgIC4uLnBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgICAgZG9jczoge1xuICAgICAgICAgICAgICAgIC4uLnBhY2thZ2VNYW5hZ2VyLmRvY3MsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogYC0gJHtqYXZhc2NyaXB0Lk5vZGVQYWNrYWdlTWFuYWdlci5QTlBNfWAsXG4gICAgICAgICAgICAgICAgY3VzdG9tLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgcHJvamVjdCB0byBUeXBlU2NyaXB0IHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogUHJvamVuU3RydWN0IHJlcXVpcmVzIGEgVHlwZVNjcmlwdFByb2plY3QgaW5zdGFuY2UuIFRoaXMgZ2VuZXJhdG9yIGlzIG9ubHkgdXNlZFxuICAgICAqIHdpdGhpbiBUeXBlU2NyaXB0IHByb2plY3RzLCBzbyB0aGUgY2FzdCBpcyBzYWZlIGluIHByYWN0aWNlLlxuICAgICAqXG4gICAgICogTm90ZTogVHlwZSBhc3NlcnRpb24gaXMgbmVjZXNzYXJ5IGhlcmUgYmVjYXVzZSBQcm9qZW4ncyB0eXBlIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGVcbiAgICAgKiBhIHJ1bnRpbWUgdHlwZSBndWFyZCBmb3IgVHlwZVNjcmlwdFByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHJldHVybnMgVHlwZVNjcmlwdCBwcm9qZWN0IGluc3RhbmNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc1R5cGVTY3JpcHRQcm9qZWN0KHByb2plY3Q6IFByb2plY3QpOiB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0IHtcbiAgICAgICAgcmV0dXJuIHByb2plY3QgYXMgdW5rbm93biBhcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogUGxhY2VzIHRoZSBvcHRpb25zIGludGVyZmFjZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY2xhc3MgZmlsZVxuICAgICAqIHdpdGggYSBcIi5nZW5lcmF0ZWQudHNcIiBzdWZmaXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgRmlsZSBwYXRoIGZvciB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkRmlsZVBhdGhFcnJvcn0gV2hlbiBmaWxlUGF0aCBkb2Vzbid0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFzdFNsYXNoID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRmlsZVBhdGhFcnJvcih0aGlzLm9wdGlvbnMuZmlsZVBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLnJlbmRlcmVyLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgcmV0dXJuIGAke2Rpcn0vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZC50c2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBUeXBlU2NyaXB0IGNsYXNzIGZpbGUgZHVyaW5nIFByb2plbiBzeW50aGVzaXNcbiAgICAgKlxuICAgICAqIENhbGxlZCBieSBQcm9qZW4gZHVyaW5nIHRoZSBzeW50aGVzaXMgcGhhc2UgdG8gZ2VuZXJhdGUgdGhlIHByb2plY3QgY2xhc3MgZmlsZS5cbiAgICAgKiBUaGUgZmlsZSBpcyBtYXJrZWQgYXMgcmVhZG9ubHkgdG8gcHJldmVudCBtYW51YWwgZWRpdGluZy5cbiAgICAgKi9cbiAgICBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5vcHRpb25zKTtcblxuICAgICAgICBuZXcgVHlwZVNjcmlwdENsYXNzRmlsZSh0aGlzLnByb2plY3QsIHRoaXMub3B0aW9ucy5maWxlUGF0aCwgY29udGVudCwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRoaXMub3B0aW9ucy5yZWFkb25seSA/PyB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gRlFOIGlzIGF2YWlsYWJsZSBpbiBhbnkgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNGcW5BdmFpbGFibGUoZnFuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5sb2FkTWFuaWZlc3RGb3JGcW4oZnFuKTtcbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdC50eXBlcz8uW2Zxbl0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBjb21wb25lbnQgb3B0aW9ucyB0eXBlIGZyb20gSlNJSSBtYW5pZmVzdFxuICAgICAqXG4gICAgICogQXV0by1kZXRlY3RzIG9wdGlvbnMgZnJvbSBKU0lJIG1hbmlmZXN0IHdoZW4gb3B0aW9uc1Byb3BlcnR5IGlzIHVuZGVmaW5lZC5cbiAgICAgKiBSZXR1cm5zIG51bGwgb25seSB3aGVuIG9wdGlvbnNQcm9wZXJ0eSBpcyBleHBsaWNpdGx5IHNldCB0byBmYWxzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVDb21wb25lbnRPcHRpb25zVHlwZShjb21wb25lbnQ6IENvbXBvbmVudCk6IHsgbmFtZTogc3RyaW5nOyBmcW46IHN0cmluZzsgZG9jcz86IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgICAgIC8qIE5vcm1hbGl6ZSBvcHRpb25zUHJvcGVydHkgdG8gQ29tcG9uZW50T3B0aW9ucyAqL1xuICAgICAgICBsZXQgb3B0aW9uc0NvbmZpZzogQ29tcG9uZW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvcHRpb25zQ29uZmlnID0geyBuYW1lOiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5IH07XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSAmJiB0eXBlb2YgY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgb3B0aW9uc0NvbmZpZyA9IGNvbXBvbmVudC5vcHRpb25zUHJvcGVydHk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBVc2UgZXhwbGljaXQgdHlwZSBpZiBwcm92aWRlZCAqL1xuICAgICAgICBpZiAob3B0aW9uc0NvbmZpZz8udHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICAgICAgZnFuOiBvcHRpb25zQ29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgZG9jczogb3B0aW9uc0NvbmZpZy5kb2NzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEZpbmQgY29tcG9uZW50IGluIEpTSUkgbWFuaWZlc3RzICovXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZxbiA9IGNvbXBvbmVudC5mcW4gPz8gdGhpcy5maW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZvckZxbihjb21wb25lbnRGcW4pO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IG1hbmlmZXN0LnR5cGVzPy5bY29tcG9uZW50RnFuXTtcbiAgICAgICAgaWYgKCFjbGFzc1R5cGUgfHwgY2xhc3NUeXBlLmtpbmQgIT09IFwiY2xhc3NcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBvbmVudFJlc29sdXRpb25FcnJvcihjb21wb25lbnRGcW4sIFwiQ29tcG9uZW50IG5vdCBmb3VuZCBpbiBKU0lJIG1hbmlmZXN0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbGl6ZXIgPSAoY2xhc3NUeXBlIGFzIHsgaW5pdGlhbGl6ZXI/OiB7IHBhcmFtZXRlcnM/OiBBcnJheTx7IHR5cGU/OiB7IGZxbj86IHN0cmluZyB9IH0+IH0gfSlcbiAgICAgICAgICAgIC5pbml0aWFsaXplcjtcbiAgICAgICAgaWYgKCFpbml0aWFsaXplcj8ucGFyYW1ldGVycz8uWzFdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogQ29tcG9uZW50IGhhcyBubyBvcHRpb25zIHBhcmFtZXRlciAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1BhcmFtID0gaW5pdGlhbGl6ZXIucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZxbiA9IG9wdGlvbnNQYXJhbS50eXBlPy5mcW47XG5cbiAgICAgICAgaWYgKCFvcHRpb25zRnFuKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIG5vIEZRTiAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1R5cGUgPSBtYW5pZmVzdC50eXBlcz8uW29wdGlvbnNGcW5dO1xuICAgICAgICBjb25zdCBkb2NzID0gKG9wdGlvbnNUeXBlIGFzIHsgZG9jcz86IHsgc3VtbWFyeT86IHN0cmluZyB9IH0gfCB1bmRlZmluZWQpPy5kb2NzPy5zdW1tYXJ5O1xuXG4gICAgICAgIC8qIEF1dG8tZ2VuZXJhdGUgcHJvcGVydHkgbmFtZSBpZiBub3QgcHJvdmlkZWQgKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lO1xuICAgICAgICBjb25zdCBkZWZhdWx0TmFtZSA9IGAke25hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCl9JHtuYW1lLnNsaWNlKDEpfU9wdGlvbnNgO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcHRpb25zQ29uZmlnPy5uYW1lID8/IGRlZmF1bHROYW1lO1xuXG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3BlcnR5TmFtZSwgZnFuOiBvcHRpb25zRnFuLCBkb2NzIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgY29tcG9uZW50IEZRTiBieSBzZWFyY2hpbmcgYWxsIEpTSUkgbWFuaWZlc3RzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSBmaXJzdCAqL1xuICAgICAgICBjb25zdCBvd25GcW4gPSBgQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzLiR7Y29tcG9uZW50TmFtZX1gO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgb3duTWFuaWZlc3QgPSB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICAgICAgaWYgKG93bk1hbmlmZXN0LnR5cGVzPy5bb3duRnFuXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvd25GcW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvKiBPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZSB5ZXQgZHVyaW5nIGRldmVsb3BtZW50IC0gdGhpcyBpcyBleHBlY3RlZCAqL1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2VhcmNoIGluIG5vZGVfbW9kdWxlcyBmb3IgSlNJSSBwYWNrYWdlcyAqL1xuICAgICAgICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBqb2luKF9fZGlybmFtZSwgXCIuLi8uLi9ub2RlX21vZHVsZXNcIik7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gdGhpcy5maW5kSnNpaVBhY2thZ2VzKG5vZGVNb2R1bGVzUGF0aCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwa2cgb2YgcGFja2FnZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBrZyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmcW4gb2YgT2JqZWN0LmtleXMobWFuaWZlc3QudHlwZXMgPz8ge30pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcW4uZW5kc1dpdGgoYC4ke2NvbXBvbmVudE5hbWV9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8qIFNraXAgcGFja2FnZXMgd2l0aCBpbnZhbGlkIG1hbmlmZXN0cyAtIGxvZyBmb3IgZGVidWdnaW5nICovXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byBsb2FkIG1hbmlmZXN0IGZyb20gcGFja2FnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IoY29tcG9uZW50TmFtZSwgXCJDb21wb25lbnQgbm90IGZvdW5kIGluIGFueSBKU0lJIG1hbmlmZXN0XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsbCBKU0lJIHBhY2thZ2VzIGluIG5vZGVfbW9kdWxlc1xuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEpzaWlQYWNrYWdlcyhub2RlTW9kdWxlc1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHsgcmVhZGRpclN5bmMsIHN0YXRTeW5jLCBleGlzdHNTeW5jIH0gPSByZXF1aXJlKFwibm9kZTpmc1wiKTtcblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgsIGVudHJ5KTtcblxuICAgICAgICAgICAgLyogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzICovXG4gICAgICAgICAgICBpZiAoIWVudHJ5UGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICAgICAgICAgICAgLyogU2NvcGVkIHBhY2thZ2UgLSByZWN1cnNlIGludG8gc2NvcGUgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBzY29wZVBhdGggPSBlbnRyeVBhdGg7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzY29wZWRFbnRyeSBvZiByZWFkZGlyU3luYyhzY29wZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBrZ1BhdGggPSByZXNvbHZlKHNjb3BlUGF0aCwgc2NvcGVkRW50cnkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8qIFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrcyAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBrZ1BhdGguc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4ocGtnUGF0aCwgXCIuanNpaVwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1c2gocGtnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRTeW5jKGVudHJ5UGF0aCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIC8qIFJlZ3VsYXIgcGFja2FnZSAqL1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZW50cnlQYXRoLCBcIi5qc2lpXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcy5wdXNoKGVudHJ5UGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIEpTSUkgbWFuaWZlc3QgZm9yIGEgZ2l2ZW4gRlFOXG4gICAgICpcbiAgICAgKiBFeHRyYWN0cyBwYWNrYWdlIG5hbWUgZnJvbSBGUU4uIEZvciBzY29wZWQgcGFja2FnZXMgbGlrZSBAc2NvcGUvcGFja2FnZS5DbGFzc05hbWUsXG4gICAgICogdGhlIHBhY2thZ2UgbmFtZSBpcyBldmVyeXRoaW5nIGJlZm9yZSB0aGUgZmlyc3QgZG90IChpLmUuLCBAc2NvcGUvcGFja2FnZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkTWFuaWZlc3RGb3JGcW4oZnFuOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGRvdEluZGV4ID0gZnFuLmluZGV4T2YoXCIuXCIpO1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGRvdEluZGV4ID4gMCA/IGZxbi5zdWJzdHJpbmcoMCwgZG90SW5kZXgpIDogZnFuO1xuXG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSAqL1xuICAgICAgICBpZiAocGFja2FnZU5hbWUgPT09IFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVHJ5IG5vZGVfbW9kdWxlcyAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE1hbmlmZXN0RnJvbVBhY2thZ2UoZGlybmFtZShwa2dKc29uUGF0aCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0TG9hZEVycm9yKHBhY2thZ2VOYW1lLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgSlNJSSBtYW5pZmVzdCBmcm9tIGEgcGFja2FnZSBkaXJlY3RvcnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBhY2thZ2VQYXRoOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGpzaWlQYXRoID0gam9pbihwYWNrYWdlUGF0aCwgXCIuanNpaVwiKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpzaWlQYXRoLCBcInV0Zi04XCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGlzIHBhY2thZ2UncyBKU0lJIG1hbmlmZXN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkT3duTWFuaWZlc3QoKTogQXNzZW1ibHkge1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcIi4uLy5qc2lpXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoanNpaVBhdGgsIFwidXRmLThcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBQcm9qZWN0VHlwZSBlbnVtIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGVQcm9qZWN0VHlwZUVudW0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByb2plY3RUeXBlcyA9IHRoaXMuZGlzY292ZXJQcm9qZWN0VHlwZXMoKTtcblxuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGluZXMucHVzaChcIi8qKlwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIEVudW0gZGVmaW5pbmcgYWxsIHN1cHBvcnRlZCBwcm9qZWN0IHR5cGVzXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBFYWNoIHByb2plY3QgdHlwZSBjb3JyZXNwb25kcyB0byBhIGdlbmVyYXRlZCBwcm9qZWN0IGNsYXNzIGFuZCBpdHMgY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIGluIHRoZSBkZWZhdWx0T3B0aW9ucyBzdHJ1Y3R1cmUuXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBAZ2VuZXJhdGVkIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqL1wiKTtcbiAgICAgICAgbGluZXMucHVzaChcImV4cG9ydCBlbnVtIFByb2plY3RUeXBlIHtcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBbZW51bU5hbWUsIHZhbHVlLCBkb2NzXSBvZiBwcm9qZWN0VHlwZXMpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgLyoqXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICAqICR7ZG9jc31gKTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgICovXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICR7ZW51bU5hbWV9ID0gXCIke3ZhbHVlfVwiLGApO1xuICAgICAgICAgICAgbGluZXMucHVzaChcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzLnB1c2goXCJ9XCIpO1xuXG4gICAgICAgIG5ldyBwcm9qZW4uVGV4dEZpbGUodGhpcy5wcm9qZWN0LCBcInNyYy9wcm9qZWN0LXR5cGUudHNcIiwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY292ZXJzIGFsbCBwcm9qZWN0IHR5cGVzIHRoYXQgZXh0ZW5kIHByb2plbi5Qcm9qZWN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBkaXNjb3ZlclByb2plY3RUeXBlcygpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgICAgICAgY29uc3QgcHJvamVjdFR5cGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IFwicHJvamVuLlByb2plY3RcIjtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmcW4sIHR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVuZGVyZXIuanNpaU1hbmlmZXN0LnR5cGVzID8/IHt9KSkge1xuICAgICAgICAgICAgaWYgKHR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IHR5cGUgYXMge1xuICAgICAgICAgICAgICAgIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICBiYXNlPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGRvY3M/OiB7IHN1bW1hcnk/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjbGFzc1R5cGUuYWJzdHJhY3QpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dGVuZHNCYXNlKGNsYXNzVHlwZSwgYmFzZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGZxbi5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMyB8fCBwYXJ0c1swXSAhPT0gXCJwcm9qZW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBwYXJ0c1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgY29uc3QgZW51bU5hbWUgPSBjbGFzc05hbWVcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFtBLVpdKS9nLCBcIl8kMVwiKVxuICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL15fLywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke21vZHVsZX0uJHtjbGFzc05hbWV9YDtcbiAgICAgICAgICAgIGNvbnN0IGRvY3MgPSBjbGFzc1R5cGUuZG9jcz8uc3VtbWFyeSA/PyBjbGFzc05hbWU7XG5cbiAgICAgICAgICAgIHByb2plY3RUeXBlcy5wdXNoKFtlbnVtTmFtZSwgdmFsdWUsIGRvY3NdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9qZWN0VHlwZXMuc29ydCgoYSwgYikgPT4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjbGFzcyBleHRlbmRzIHRoZSBiYXNlIGNsYXNzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRlbmRzQmFzZShjbGFzc1R5cGU6IHsgaW5oZXJpdGFuY2VQYXRoPzogc3RyaW5nW107IGJhc2U/OiBzdHJpbmcgfSwgYmFzZUNsYXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNsYXNzVHlwZS5pbmhlcml0YW5jZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGFzc1R5cGUuaW5oZXJpdGFuY2VQYXRoLmluY2x1ZGVzKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVudEJhc2UgPSBjbGFzc1R5cGUuYmFzZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRCYXNlKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEJhc2UgPT09IGJhc2VDbGFzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmFzZVR5cGUgPSB0aGlzLnJlbmRlcmVyLmpzaWlNYW5pZmVzdC50eXBlcz8uW2N1cnJlbnRCYXNlXTtcbiAgICAgICAgICAgIGlmICghYmFzZVR5cGUgfHwgYmFzZVR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50QmFzZSA9IChiYXNlVHlwZSBhcyB7IGJhc2U/OiBzdHJpbmcgfSkuYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogVGV4dCBmaWxlIGZvciBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gKlxuICogRXh0ZW5kcyBQcm9qZW4ncyBUZXh0RmlsZSB0byBhZGQgdGhlIGdlbmVyYXRlZCBmaWxlIG1hcmtlciBjb21tZW50XG4gKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLlxuICovXG5jbGFzcyBUeXBlU2NyaXB0Q2xhc3NGaWxlIGV4dGVuZHMgcHJvamVuLlRleHRGaWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gT3V0cHV0IGZpbGUgcGF0aFxuICAgICAqIEBwYXJhbSBjb250ZW50IC0gVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTb3VyY2UgY29kZSBvcHRpb25zIChyZWFkb25seSwgZXRjLilcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM6IFNvdXJjZUNvZGVPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIG9wdGlvbnMpO1xuICAgICAgICAvKiBBZGQgZ2VuZXJhdGVkIGZpbGUgbWFya2VyIHRvIHByZXZlbnQgbWFudWFsIGVkaXRpbmcgKi9cbiAgICAgICAgdGhpcy5hZGRMaW5lKGAvLyAke3RoaXMubWFya2VyfWApO1xuICAgICAgICB0aGlzLmFkZExpbmUoY29udGVudCk7XG4gICAgfVxufVxuIl19
|
|
886
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUF1QztBQUN2Qyx5Q0FBbUQ7QUFFbkQsc0VBQW9FO0FBQ3BFLCtDQUFpQztBQUNqQyxtQ0FBMkY7QUFDM0YscUNBTWtCO0FBR2xCOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0I7SUFDekIsT0FBTztRQUNILEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUNyRDtZQUNJLGNBQWMsRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNO1lBQ3JELGVBQWUsRUFBRTtnQkFDYixJQUFJLEVBQUUsZUFBZTtnQkFDckIsSUFBSSxFQUFFLDhDQUE4QztnQkFDcEQsSUFBSSxFQUFFLHNCQUFzQjthQUMvQjtTQUNKO0tBQ0osQ0FBQztBQUNOLENBQUM7QUErR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVU7SUFPaUI7SUFOckIsS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUNyQixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXhCOztPQUVHO0lBQ0gsWUFBNkIsU0FBUyxHQUFHO1FBQVosV0FBTSxHQUFOLE1BQU0sQ0FBTTtJQUFHLENBQUM7SUFFN0M7Ozs7T0FJRztJQUNILEtBQUs7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLElBQWE7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQs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LElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDekMsTUFBTTtZQUNWLENBQUM7WUFDRCxXQUFXLEdBQUksUUFBOEIsQ0FBQyxJQUFJLENBQUM7UUFDdkQsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7O0FBeGZMLDRDQXlmQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxtQkFBb0IsU0FBUSxNQUFNLENBQUMsUUFBUTtJQUM3Qzs7Ozs7T0FLRztJQUNILFlBQVksT0FBZ0IsRUFBRSxRQUFnQixFQUFFLE9BQWUsRUFBRSxVQUE2QixFQUFFO1FBQzVGLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQXNzZW1ibHkgfSBmcm9tIFwiQGpzaWkvc3BlY1wiO1xuaW1wb3J0IHsgUHJvamVuU3RydWN0LCBTdHJ1Y3QgfSBmcm9tIFwiQG1yZ3JhaW4vanNpaS1zdHJ1Y3QtYnVpbGRlclwiO1xuaW1wb3J0ICogYXMgcHJvamVuIGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IGphdmFzY3JpcHQsIHR5cGUgUHJvamVjdCwgdHlwZSBTb3VyY2VDb2RlT3B0aW9ucywgdHlwZSB0eXBlc2NyaXB0IH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IsXG4gICAgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yLFxuICAgIEludmFsaWRGaWxlUGF0aEVycm9yLFxuICAgIEludmFsaWRJbmRlbnRMZXZlbEVycm9yLFxuICAgIE1hbmlmZXN0TG9hZEVycm9yLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdFR5cGUgfSBmcm9tIFwiLi9wcm9qZWN0LXR5cGVcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbXBvbmVudHMgYXBwbGllZCB0byBhbGwgZ2VuZXJhdGVkIHByb2plY3RzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRDb21wb25lbnRzKCk6IENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICB7IGNvbXBvbmVudENsYXNzOiByZXF1aXJlKFwiLi9jb21wb25lbnRzL21pc2VcIikuTWlzZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wb25lbnRDbGFzczogcmVxdWlyZShcIi4vY29tcG9uZW50cy92aXRlc3RcIikuVml0ZXN0LFxuICAgICAgICAgICAgb3B0aW9uc1Byb3BlcnR5OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ2aXRlc3RPcHRpb25zXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMuVml0ZXN0T3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgIGRvY3M6IFwiVml0ZXN0IGNvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIGNvbXBvbmVudCB0byBiZSBpbnRlZ3JhdGVkIGludG8gYSBnZW5lcmF0ZWQgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGNsYXNzIHJlZmVyZW5jZVxuICAgICAqXG4gICAgICogQGpzaWkgaWdub3JlXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50Q2xhc3M6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb21wb25lbnQgY2xhc3NcbiAgICAgKlxuICAgICAqIE9wdGlvbmFsIC0gYXV0by1kZXRlY3RlZCBieSBzZWFyY2hpbmcgSlNJSSBtYW5pZmVzdHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZnFuPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCAtIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IuXG4gICAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgb3B0aW9ucyBwcm9wZXJ0eSBnZW5lcmF0aW9uLlxuICAgICAqIFNldCB0byBzdHJpbmcgb3Igb2JqZWN0IHRvIGN1c3RvbWl6ZSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBvcHRpb25zUHJvcGVydHk/OiBzdHJpbmcgfCBDb21wb25lbnRPcHRpb25zIHwgZmFsc2U7XG59XG5cbi8qKlxuICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgb3B0aW9ucyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIChvcHRpb25hbCwgYXV0by1kZXRlY3RlZCBmcm9tIGNvbXBvbmVudCBjb25zdHJ1Y3RvcilcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gc3VtbWFyeSAob3B0aW9uYWwsIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IpXG4gICAgICovXG4gICAgcmVhZG9ubHkgZG9jcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBQcm9qZWN0R2VuZXJhdG9yIGNvbXBvbmVudFxuICpcbiAqIENvbmZpZ3VyZXMgdGhlIGdlbmVyYXRpb24gb2YgYSBUeXBlU2NyaXB0IHByb2plY3QgY2xhc3MgdGhhdCBleHRlbmRzIGEgUHJvamVuIGJhc2UgY2xhc3NcbiAqIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvbiBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RHZW5lcmF0b3JPcHRpb25zIGV4dGVuZHMgU291cmNlQ29kZU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyAoZS5nLiwgXCJUeXBlU2NyaXB0UHJvamVjdFwiKVxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgbmFtZWQgYCR7bmFtZX1PcHRpb25zYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqXG4gICAgICogU3BlY2lmaWVzIHdoaWNoIFByb2plbiBiYXNlIGNsYXNzIHRvIGV4dGVuZCBhbmQgd2hpY2ggZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGFwcGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgUHJvamVjdFR5cGUuVFlQRVNDUklQVFxuICAgICAqIEBleGFtcGxlIFByb2plY3RUeXBlLkpTSUlcbiAgICAgKi9cbiAgICByZWFkb25seSBwcm9qZWN0VHlwZTogUHJvamVjdFR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXQgZmlsZSBwYXRoIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBNdXN0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBUaGUgb3B0aW9ucyBpbnRlcmZhY2Ugd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2l0aCBhIFwiLmdlbmVyYXRlZC50c1wiIHN1ZmZpeC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIFwic3JjL3Byb2plY3RzL3R5cGVzY3JpcHQuZ2VuZXJhdGVkLnRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50cyB0byBpbnRlZ3JhdGUgaW50byB0aGUgcHJvamVjdFxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZHVyaW5nIHByb2plY3QgY29uc3RydWN0aW9uIGFuZCBjYW4gYmVcbiAgICAgKiBjb25maWd1cmVkIHZpYSBhbiBvcHRpb25hbCBvcHRpb25zIHByb3BlcnR5IGluIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgW3sgY29tcG9uZW50OiBNaXNlIH0sIHsgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogeyBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIiwgdHlwZTogXCIuLi5cIiwgZG9jczogXCIuLi5cIiB9IH1dXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50cz86IENvbXBvbmVudFtdO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBleHRlbmQgdGhlIGJhc2Ugb3B0aW9ucyB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvXG4gICAgICogeW91ciBwcm9qZWN0IHR5cGUuXG4gICAgICpcbiAgICAgKiBAanNpaSBpZ25vcmVcbiAgICAgKi9cbiAgICByZWFkb25seSBhZGRpdGlvbmFsT3B0aW9ucz86IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBiYXNlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBoaWRlIGJhc2UgY2xhc3Mgb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgY29uZmlndXJhYmxlXG4gICAgICogaW4gdGhlIGdlbmVyYXRlZCBwcm9qZWN0IHR5cGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb21pdE9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBCdWZmZXIgZm9yIGJ1aWxkaW5nIGluZGVudGVkIGNvZGUgd2l0aCBhdXRvbWF0aWMgbGluZSBtYW5hZ2VtZW50XG4gKlxuICogTWFpbnRhaW5zIGluZGVudGF0aW9uIGxldmVsIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhZGRpbmcgbGluZXMsXG4gKiBvcGVuaW5nL2Nsb3NpbmcgYmxvY2tzLCBhbmQgZmx1c2hpbmcgYWNjdW11bGF0ZWQgY29udGVudC5cbiAqL1xuY2xhc3MgQ29kZUJ1ZmZlciB7XG4gICAgcHJpdmF0ZSBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIGluZGVudExldmVsID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpbmRlbnQgLSBTdHJpbmcgdG8gdXNlIGZvciBlYWNoIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiBzaW5nbGUgc3BhY2UpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpbmRlbnQgPSBcIiBcIikge31cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGFjY3VtdWxhdGVkIGxpbmVzIGFuZCByZXNldHMgdGhlIGJ1ZmZlclxuICAgICAqXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29kZSBsaW5lcyB3aXRoIHByb3BlciBpbmRlbnRhdGlvblxuICAgICAqL1xuICAgIGZsdXNoKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubGluZXM7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpbmUgb2YgY29kZSBhdCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvZGUgLSBDb2RlIHRvIGFkZCAob3B0aW9uYWwsIGFkZHMgYmxhbmsgbGluZSBpZiBvbWl0dGVkKVxuICAgICAqL1xuICAgIGxpbmUoY29kZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmluZGVudC5yZXBlYXQodGhpcy5pbmRlbnRMZXZlbCk7XG4gICAgICAgIHRoaXMubGluZXMucHVzaCgocHJlZml4ICsgKGNvZGUgPz8gXCJcIikpLnRyaW1FbmQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBuZXcgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYmVmb3JlIGluY3JlYXNpbmcgaW5kZW50IChlLmcuLCBvcGVuaW5nIGJyYWNlKVxuICAgICAqL1xuICAgIG9wZW4oY29kZT86IHN0cmluZykge1xuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgdGhpcy5saW5lKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwrKztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYWZ0ZXIgZGVjcmVhc2luZyBpbmRlbnQgKGUuZy4sIGNsb3NpbmcgYnJhY2UpXG4gICAgICogQHRocm93cyB7SW52YWxpZEluZGVudExldmVsRXJyb3J9IFdoZW4gYXR0ZW1wdGluZyB0byBkZWNyZWFzZSBpbmRlbnQgYmVsb3cgemVyb1xuICAgICAqL1xuICAgIGNsb3NlKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5kZW50TGV2ZWxFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwtLTtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwgPSAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIFR5cGVTY3JpcHQgY2xhc3MgY29kZSBmcm9tIFByb2plY3RHZW5lcmF0b3Igb3B0aW9uc1xuICpcbiAqIEdlbmVyYXRlcyBhIGNvbXBsZXRlIFR5cGVTY3JpcHQgY2xhc3MgZmlsZSBpbmNsdWRpbmcgaW1wb3J0cywgb3B0aW9ucyBpbnRlcmZhY2UgZXhwb3J0LFxuICogY2xhc3MgZGVjbGFyYXRpb24sIGFuZCBjb25zdHJ1Y3RvciB3aXRoIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBVc2VzIEpTSUkgbWFuaWZlc3QgaW50cm9zcGVjdGlvbiB0byB2YWxpZGF0ZSBiYXNlIGNsYXNzZXMgYW5kIG9wdGlvbnMgaW50ZXJmYWNlcy5cbiAqL1xuY2xhc3MgVHlwZVNjcmlwdENsYXNzUmVuZGVyZXIge1xuICAgIHByaXZhdGUgYnVmZmVyOiBDb2RlQnVmZmVyO1xuICAgIHB1YmxpYyBqc2lpTWFuaWZlc3Q6IEFzc2VtYmx5O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGVudCAtIE51bWJlciBvZiBzcGFjZXMgcGVyIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiA0KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGluZGVudCA9IDQpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQ29kZUJ1ZmZlcihcIiBcIi5yZXBlYXQoaW5kZW50KSk7XG4gICAgICAgIC8qIExvYWQgUHJvamVuJ3MgSlNJSSBtYW5pZmVzdCBmb3IgYmFzZSBjbGFzcyBpbnRyb3NwZWN0aW9uICovXG4gICAgICAgIGNvbnN0IHByb2plblBhY2thZ2VKc29uID0gcmVxdWlyZS5yZXNvbHZlKFwicHJvamVuL3BhY2thZ2UuanNvblwiKTtcbiAgICAgICAgY29uc3QgcHJvamVuUm9vdCA9IGRpcm5hbWUocHJvamVuUGFja2FnZUpzb24pO1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4ocHJvamVuUm9vdCwgXCIuanNpaVwiKTtcbiAgICAgICAgdGhpcy5qc2lpTWFuaWZlc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqc2lpUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBjb21wbGV0ZSBUeXBlU2NyaXB0IGNsYXNzIGNvZGUgZnJvbSBvcHRpb25zXG4gICAgICpcbiAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHJlbmRlcmluZyBwcm9jZXNzOiBkZXJpdmVzIG5hbWVzLCBleHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbixcbiAgICAgKiBidWlsZHMgaW1wb3J0IHN0YXRlbWVudHMsIGFuZCByZW5kZXJzIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNQcm9wZXJ0aWVzIC0gT3B0aW9ucyBwcm9wZXJ0eSBuYW1lIHBlciBjb21wb25lbnQgY2xhc3MgbmFtZSwgZm9yIHRoZSBjb21wb25lbnRzIHdob3NlXG4gICAgICogICBvcHRpb25zIHByb3BlcnR5IHdhcyBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgQ29tcGxldGUgVHlwZVNjcmlwdCBjbGFzcyBjb2RlIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgcmVuZGVyKG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLCBvcHRpb25zUHJvcGVydGllczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5idWZmZXIuZmx1c2goKTtcblxuICAgICAgICAvKiBEZXJpdmUgaW50ZXJmYWNlIGFuZCB0eXBlIG5hbWVzIGZyb20gdGhlIGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICBjb25zdCBiYXNlT3B0aW9uc1R5cGUgPSBiYXNlT3B0aW9uc0Zxbi5yZXBsYWNlKC9ecHJvamVuXFwuLywgXCJcIik7XG5cbiAgICAgICAgLyogVXNlIHByb3ZpZGVkIGNvbXBvbmVudHMgb3IgZmFsbCBiYWNrIHRvIGRlZmF1bHRzIChNaXNlICsgVml0ZXN0KSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IGdldERlZmF1bHRDb21wb25lbnRzKCk7XG5cbiAgICAgICAgLyogRXh0cmFjdCBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiAqL1xuICAgICAgICBjb25zdCB7IGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSB9ID0gdGhpcy5leHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzLCBvcHRpb25zUHJvcGVydGllcyk7XG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSB0aGlzLmV4dHJhY3RJbXBvcnRzKG9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2UpO1xuXG4gICAgICAgIC8qIFJlbmRlciBhbGwgc2VjdGlvbnMgb2YgdGhlIGNsYXNzIGZpbGUgKi9cbiAgICAgICAgdGhpcy5yZW5kZXJJbXBvcnRzKGltcG9ydHMpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMucmVuZGVyRXhwb3J0KG9wdGlvbnNJbnRlcmZhY2UpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMucmVuZGVyQ2xhc3Mob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSwgYmFzZU9wdGlvbnNUeXBlLCBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5mbHVzaCgpLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWUgZnJvbSBwcm9qZWN0IHR5cGVcbiAgICAgKlxuICAgICAqIFRyYW5zZm9ybXMgcHJvamVjdCB0eXBlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgUHJvamVuIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBieSBhcHBlbmRpbmcgXCJPcHRpb25zXCIgc3VmZml4IGFuZCBwcmVmaXhpbmcgd2l0aCBcInByb2plbi5cIiBuYW1lc3BhY2UuXG4gICAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGJhc2UgY2xhc3MgZXhpc3RzIGluIFByb2plbidzIEpTSUkgbWFuaWZlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm5zIEZ1bGx5IHF1YWxpZmllZCBvcHRpb25zIGludGVyZmFjZSBuYW1lXG4gICAgICogQHRocm93cyB7SW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yfSBXaGVuIHByb2plY3RUeXBlIGZvcm1hdCBpcyBpbnZhbGlkIG9yIGNsYXNzIG5vdCBmb3VuZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRCYXNlT3B0aW9uc0ZxbihQcm9qZWN0VHlwZS5UWVBFU0NSSVBUKSAvLyBcInByb2plbi50eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1wiXG4gICAgICogZ2V0QmFzZU9wdGlvbnNGcW4oUHJvamVjdFR5cGUuSlNJSSkgLy8gXCJwcm9qZW4uY2RrLkpzaWlQcm9qZWN0T3B0aW9uc1wiXG4gICAgICovXG4gICAgZ2V0QmFzZU9wdGlvbnNGcW4ocHJvamVjdFR5cGU6IFByb2plY3RUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gcHJvamVjdFR5cGUudmFsdWVPZigpO1xuICAgICAgICAvKiBWYWxpZGF0ZSBiYXNlIGNsYXNzIGZvcm1hdDogbXVzdCBjb250YWluIG1vZHVsZS5DbGFzc05hbWUgc3RydWN0dXJlICovXG4gICAgICAgIGlmICghYmFzZUNsYXNzLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcihiYXNlQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzZUNsYXNzRnFuID0gYHByb2plbi4ke2Jhc2VDbGFzc31gO1xuICAgICAgICBjb25zdCBvcHRpb25zRnFuID0gYCR7YmFzZUNsYXNzRnFufU9wdGlvbnNgO1xuXG4gICAgICAgIC8qIFZhbGlkYXRlIGJhc2UgY2xhc3MgZXhpc3RzIGluIEpTSUkgbWFuaWZlc3QgKi9cbiAgICAgICAgaWYgKCF0aGlzLmpzaWlNYW5pZmVzdC50eXBlcz8uW2Jhc2VDbGFzc0Zxbl0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3IoYEJhc2UgY2xhc3Mgbm90IGZvdW5kIGluIEpTSUkgbWFuaWZlc3Q6ICR7YmFzZUNsYXNzRnFufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVmFsaWRhdGUgb3B0aW9ucyBpbnRlcmZhY2UgZXhpc3RzIGluIEpTSUkgbWFuaWZlc3QgKi9cbiAgICAgICAgaWYgKCF0aGlzLmpzaWlNYW5pZmVzdC50eXBlcz8uW29wdGlvbnNGcW5dKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yKGBPcHRpb25zIGludGVyZmFjZSBub3QgZm91bmQgaW4gSlNJSSBtYW5pZmVzdDogJHtvcHRpb25zRnFufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnNGcW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZm9yIGNvbnN0cnVjdG9yIGNvZGUgZ2VuZXJhdGlvblxuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBjb21wb25lbnQgY29uZmlndXJhdGlvbnMgaW50bzpcbiAgICAgKiAxLiBEZXN0cnVjdHVyZSBsaXN0OiB2YXJpYWJsZSBuYW1lcyB0byBleHRyYWN0IGZyb20gb3B0aW9uc1xuICAgICAqIDIuIENvbXBvbmVudCBhcnJheTogY29kZSBzdHJpbmcgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsXG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9ucyBhcmUgcGFzc2VkIHRocm91Z2ggZm9yIGV4YWN0bHkgdGhlIGNvbXBvbmVudHMgd2hvc2Ugb3B0aW9ucyBwcm9wZXJ0eSBpcyBpbiB0aGVcbiAgICAgKiBnZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2UsIHNvIGV2ZXJ5IHByb3BlcnR5IG9mIHRoYXQgaW50ZXJmYWNlIHJlYWNoZXMgaXRzIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRzIC0gQ29tcG9uZW50IGNvbmZpZ3VyYXRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnNQcm9wZXJ0aWVzIC0gT3B0aW9ucyBwcm9wZXJ0eSBuYW1lIHBlciBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRlc3RydWN0dXJlIGFycmF5IGFuZCBjb21wb25lbnRBcnJheSBjb2RlIHN0cmluZ1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJbnB1dDogW3sgY29tcG9uZW50OiBWaXRlc3QgfV0sIHsgVml0ZXN0ID0+IFwidml0ZXN0T3B0aW9uc1wiIH1cbiAgICAgKiBPdXRwdXQ6IHtcbiAgICAgKiAgIGRlc3RydWN0dXJlOiBbXCJ2aXRlc3RcIiwgXCJ2aXRlc3RPcHRpb25zXCJdLFxuICAgICAqICAgY29tcG9uZW50QXJyYXk6IFwiW3sgY29tcG9uZW50OiBWaXRlc3QsIGVuYWJsZWQ6IHZpdGVzdCwgb3B0aW9uczogdml0ZXN0T3B0aW9ucyB9XVwiXG4gICAgICogfVxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdENvbXBvbmVudE9wdGlvbnMoXG4gICAgICAgIGNvbXBvbmVudHM6IENvbXBvbmVudFtdLFxuICAgICAgICBvcHRpb25zUHJvcGVydGllczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICAgICk6IHsgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdOyBjb21wb25lbnRBcnJheTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCBkZXN0cnVjdHVyZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIC8qIENvbnZlcnQgY29tcG9uZW50IGNsYXNzIG5hbWUgdG8gY2FtZWxDYXNlIHZhcmlhYmxlIG5hbWUgKGUuZy4sIFZpdGVzdCAtPiB2aXRlc3QpICovXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYy5jb21wb25lbnRDbGFzcy5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgYy5jb21wb25lbnRDbGFzcy5uYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgZGVzdHJ1Y3R1cmUucHVzaChuYW1lKTtcblxuICAgICAgICAgICAgLyogQnVpbGQgY29tcG9uZW50IGNvbmZpZyBvYmplY3QgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsICovXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtgY29tcG9uZW50OiAke2MuY29tcG9uZW50Q2xhc3MubmFtZX1gXTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gb3B0aW9uc1Byb3BlcnRpZXMuZ2V0KGMuY29tcG9uZW50Q2xhc3MubmFtZSk7XG4gICAgICAgICAgICBpZiAocHJvcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAvKiBDb21wb25lbnQgaGFzIGNvbmZpZ3VyYWJsZSBvcHRpb25zIC0gaW5jbHVkZSBib3RoIGVuYWJsZWQgZmxhZyBhbmQgb3B0aW9ucyAqL1xuICAgICAgICAgICAgICAgIGRlc3RydWN0dXJlLnB1c2gocHJvcE5hbWUpO1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goYGVuYWJsZWQ6ICR7bmFtZX1gLCBgb3B0aW9uczogJHtwcm9wTmFtZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGhhcyBubyBvcHRpb25zIC0gb25seSBpbmNsdWRlIGVuYWJsZWQgZmxhZyAqL1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goYGVuYWJsZWQ6ICR7bmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudFBhcnRzLnB1c2goYHsgJHtwYXJ0cy5qb2luKFwiLCBcIil9IH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheTogYFske2NvbXBvbmVudFBhcnRzLmpvaW4oXCIsIFwiKX1dYCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBpbXBvcnQgc3RhdGVtZW50cyBtYXAgZm9yIHRoZSBnZW5lcmF0ZWQgY2xhc3NcbiAgICAgKlxuICAgICAqIENvbGxlY3RzIGFsbCByZXF1aXJlZCBpbXBvcnRzOlxuICAgICAqIC0gUHJvamVuIGJhc2UgbW9kdWxlICh0eXBlc2NyaXB0LCBjZGssIGF3c2NkaylcbiAgICAgKiAtIENvbmZpZyB1dGlsaXRpZXMgKGFwcGx5RGVmYXVsdHMsIGRlZmF1bHRPcHRpb25zKVxuICAgICAqIC0gQ29tcG9uZW50IGNsYXNzZXNcbiAgICAgKiAtIFV0aWxpdHkgZnVuY3Rpb25zIChkZWVwTWVyZ2UpXG4gICAgICogLSBHZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2UgKHR5cGUtb25seSBpbXBvcnQpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBnZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAcmV0dXJucyBNYXAgb2YgbW9kdWxlIHBhdGhzIHRvIHNldHMgb2YgaW1wb3J0ZWQgbmFtZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RJbXBvcnRzKG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLCBvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4ge1xuICAgICAgICBjb25zdCBpbXBvcnRzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gICAgICAgIC8qIEV4dHJhY3QgYmFzZSBtb2R1bGUgbmFtZSBmcm9tIHByb2plY3RUeXBlIChlLmcuLCBcInR5cGVzY3JpcHRcIiBmcm9tIFwidHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiKSAqL1xuICAgICAgICBjb25zdCBiYXNlTW9kdWxlID0gb3B0aW9ucy5wcm9qZWN0VHlwZS52YWx1ZU9mKCkuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcblxuICAgICAgICAvKiBQcm9qZW4gYmFzZSBtb2R1bGUgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwicHJvamVuXCIsIG5ldyBTZXQoW2Jhc2VNb2R1bGVdKSk7XG5cbiAgICAgICAgLyogQ29uZmlndXJhdGlvbiB1dGlsaXRpZXMgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwiLi4vY29uZmlnXCIsIG5ldyBTZXQoW1wiYXBwbHlEZWZhdWx0c1wiLCBcImRlZmF1bHRPcHRpb25zXCJdKSk7XG5cbiAgICAgICAgLyogQ29tcG9uZW50IGNsYXNzIGltcG9ydHMgLSBkZXJpdmUgbW9kdWxlIHBhdGggZnJvbSBjb21wb25lbnQgY2xhc3MgbmFtZSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IGdldERlZmF1bHRDb21wb25lbnRzKCk7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gYy5jb21wb25lbnRDbGFzcy5uYW1lO1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlUGF0aCA9IGAuLi9jb21wb25lbnRzLyR7Y29tcG9uZW50TmFtZS50b0xvd2VyQ2FzZSgpfWA7XG4gICAgICAgICAgICBpZiAoIWltcG9ydHMuaGFzKG1vZHVsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0cy5zZXQobW9kdWxlUGF0aCwgbmV3IFNldCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZUltcG9ydHMgPSBpbXBvcnRzLmdldChtb2R1bGVQYXRoKTtcbiAgICAgICAgICAgIGlmIChtb2R1bGVJbXBvcnRzKSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlSW1wb3J0cy5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBVdGlsaXR5IGZ1bmN0aW9ucyBpbXBvcnQgKi9cbiAgICAgICAgaW1wb3J0cy5zZXQoXCIuLi91dGlsc1wiLCBuZXcgU2V0KFtcImRlZXBNZXJnZVwiXSkpO1xuXG4gICAgICAgIC8qIEdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZSBpbXBvcnQgKHR5cGUtb25seSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMpICovXG4gICAgICAgIGltcG9ydHMuc2V0KGAuLyR7b3B0aW9uc0ZpbGVOYW1lfS5nZW5lcmF0ZWRgLCBuZXcgU2V0KFtvcHRpb25zSW50ZXJmYWNlXSkpO1xuXG4gICAgICAgIHJldHVybiBpbXBvcnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGNvbmZpZyBwYXRoIGZvciBhY2Nlc3NpbmcgZGVmYXVsdCBvcHRpb25zXG4gICAgICpcbiAgICAgKiBUcmFuc2Zvcm1zIHByb2plY3QgdHlwZSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHBhdGggaW4gdGhlIGRlZmF1bHRPcHRpb25zXG4gICAgICogY29uZmlndXJhdGlvbiBvYmplY3QgZXhwb3J0ZWQgZnJvbSBjb25maWcudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm5zIENvbmZpZyBwYXRoIGZvciBhY2Nlc3NpbmcgZGVmYXVsdCBvcHRpb25zXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldENvbmZpZ1BhdGgoUHJvamVjdFR5cGUuVFlQRVNDUklQVCkgLy8gXCJkZWZhdWx0T3B0aW9ucy50eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0XCJcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldENvbmZpZ1BhdGgocHJvamVjdFR5cGU6IFByb2plY3RUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBkZWZhdWx0T3B0aW9ucy4ke3Byb2plY3RUeXBlLnZhbHVlT2YoKX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgaW1wb3J0IHN0YXRlbWVudHMgaW4gc29ydGVkIG9yZGVyXG4gICAgICpcbiAgICAgKiBTb3J0cyBpbXBvcnRzIHdpdGggZXh0ZXJuYWwgcGFja2FnZXMgZmlyc3QsIHRoZW4gcmVsYXRpdmUgaW1wb3J0cy5cbiAgICAgKiBVc2VzIHR5cGUtb25seSBpbXBvcnRzIGZvciBnZW5lcmF0ZWQgZmlsZXMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGltcG9ydHMgLSBNYXAgb2YgbW9kdWxlIHBhdGhzIHRvIGltcG9ydGVkIG5hbWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW5kZXJJbXBvcnRzKGltcG9ydHM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pikge1xuICAgICAgICAvKiBTb3J0IG1vZHVsZXM6IGV4dGVybmFsIHBhY2thZ2VzIGZpcnN0LCB0aGVuIHJlbGF0aXZlIGltcG9ydHMgYWxwaGFiZXRpY2FsbHkgKi9cbiAgICAgICAgY29uc3Qgc29ydGVkTW9kdWxlcyA9IEFycmF5LmZyb20oaW1wb3J0cy5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFJc1JlbGF0aXZlID0gYS5zdGFydHNXaXRoKFwiLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGJJc1JlbGF0aXZlID0gYi5zdGFydHNXaXRoKFwiLlwiKTtcbiAgICAgICAgICAgIGlmIChhSXNSZWxhdGl2ZSAhPT0gYklzUmVsYXRpdmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYUlzUmVsYXRpdmUgPyAxIDogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IG1vZCBvZiBzb3J0ZWRNb2R1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IEFycmF5LmZyb20oaW1wb3J0cy5nZXQobW9kKSB8fCBbXSkuc29ydCgpO1xuICAgICAgICAgICAgLyogVXNlIHR5cGUtb25seSBpbXBvcnQgZm9yIGdlbmVyYXRlZCBmaWxlcyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcGVuZGVuY2llcyAqL1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlT25seSA9IG1vZC5pbmNsdWRlcyhcIi5nZW5lcmF0ZWRcIik7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRTdG10ID0gaXNUeXBlT25seSA/IFwiaW1wb3J0IHR5cGVcIiA6IFwiaW1wb3J0XCI7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGAke2ltcG9ydFN0bXR9IHsgJHtuYW1lcy5qb2luKFwiLCBcIil9IH0gZnJvbSBcIiR7bW9kfVwiO2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyByZS1leHBvcnQgc3RhdGVtZW50IGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlIHRvIGV4cG9ydFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVyRXhwb3J0KG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgLyogdHlwZS1vbmx5IHJlLWV4cG9ydCwgcmVxdWlyZWQgYnkgYGlzb2xhdGVkTW9kdWxlc2AgKi9cbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgZXhwb3J0IHR5cGUgeyAke29wdGlvbnNJbnRlcmZhY2V9IH0gZnJvbSBcIi4vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZFwiO2ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGhlIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAcGFyYW0gYmFzZU9wdGlvbnNUeXBlIC0gQmFzZSBvcHRpb25zIHR5cGUgd2l0aG91dCBcInByb2plbi5cIiBwcmVmaXhcbiAgICAgKiBAcGFyYW0gZGVzdHJ1Y3R1cmUgLSBWYXJpYWJsZSBuYW1lcyB0byBkZXN0cnVjdHVyZSBmcm9tIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50QXJyYXkgLSBDb2RlIHN0cmluZyBmb3IgY29tcG9uZW50IGFycmF5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZW5kZXJDbGFzcyhcbiAgICAgICAgb3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnMsXG4gICAgICAgIG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyxcbiAgICAgICAgYmFzZU9wdGlvbnNUeXBlOiBzdHJpbmcsXG4gICAgICAgIGRlc3RydWN0dXJlOiBzdHJpbmdbXSxcbiAgICAgICAgY29tcG9uZW50QXJyYXk6IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qKlwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgICogJHtvcHRpb25zLm5hbWV9IHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvbiBhbmQgY29tcG9uZW50IGludGVncmF0aW9uYCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKlwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqIEV4dGVuZHMgUHJvamVuJ3MgYmFzZSBjbGFzcyB3aXRoIG9waW5pb25hdGVkIGRlZmF1bHRzIGFuZCBhdXRvbWF0aWMgY29tcG9uZW50IHNldHVwLlwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIub3BlbihgZXhwb3J0IGNsYXNzICR7b3B0aW9ucy5uYW1lfSBleHRlbmRzICR7b3B0aW9ucy5wcm9qZWN0VHlwZS52YWx1ZU9mKCl9IHtgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDb25zdHJ1Y3RvcihvcHRpb25zLCBvcHRpb25zSW50ZXJmYWNlLCBiYXNlT3B0aW9uc1R5cGUsIGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmNsb3NlKFwifVwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvblxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yOlxuICAgICAqIDEuIERlc3RydWN0dXJlcyBjb21wb25lbnQgZmxhZ3MgYW5kIG9wdGlvbnMgZnJvbSB0aGUgb3B0aW9ucyBwYXJhbWV0ZXJcbiAgICAgKiAyLiBNZXJnZXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdpdGggdXNlci1wcm92aWRlZCBvcHRpb25zXG4gICAgICogMy4gQ2FsbHMgc3VwZXIoKSB3aXRoIG1lcmdlZCBvcHRpb25zXG4gICAgICogNC4gQXBwbGllcyBjb21wb25lbnQgZGVmYXVsdHMgdmlhIGFwcGx5RGVmYXVsdHMoKVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAcGFyYW0gYmFzZU9wdGlvbnNUeXBlIC0gQmFzZSBvcHRpb25zIHR5cGUgd2l0aG91dCBcInByb2plbi5cIiBwcmVmaXhcbiAgICAgKiBAcGFyYW0gZGVzdHJ1Y3R1cmUgLSBWYXJpYWJsZSBuYW1lcyB0byBkZXN0cnVjdHVyZSBmcm9tIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50QXJyYXkgLSBDb2RlIHN0cmluZyBmb3IgY29tcG9uZW50IGFycmF5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZW5kZXJDb25zdHJ1Y3RvcihcbiAgICAgICAgb3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnMsXG4gICAgICAgIG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyxcbiAgICAgICAgYmFzZU9wdGlvbnNUeXBlOiBzdHJpbmcsXG4gICAgICAgIGRlc3RydWN0dXJlOiBzdHJpbmdbXSxcbiAgICAgICAgY29tcG9uZW50QXJyYXk6IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZ2V0Q29uZmlnUGF0aChvcHRpb25zLnByb2plY3RUeXBlKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qKlwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqIEBwYXJhbSBvcHRpb25zIC0gUHJvamVjdCBjb25maWd1cmF0aW9uXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5vcGVuKGBjb25zdHJ1Y3RvcihvcHRpb25zOiAke29wdGlvbnNJbnRlcmZhY2V9KSB7YCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKiBTZXBhcmF0ZSBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmcm9tIGJhc2UgUHJvamVuIG9wdGlvbnMgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGNvbnN0IHsgJHtkZXN0cnVjdHVyZS5qb2luKFwiLCBcIil9LCAuLi5iYXNlT3B0aW9ucyB9ID0gb3B0aW9ucztgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyogTWVyZ2UgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdpdGggdXNlciBvcHRpb25zIGFuZCBpbml0aWFsaXplIGJhc2UgY2xhc3MgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYHN1cGVyKGRlZXBNZXJnZTwke2Jhc2VPcHRpb25zVHlwZX0+KCR7Y29uZmlnUGF0aH0sIGJhc2VPcHRpb25zKSk7YCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qIEFwcGx5IGNvbXBvbmVudCBkZWZhdWx0cyBhbmQgaW5zdGFudGlhdGUgZW5hYmxlZCBjb21wb25lbnRzICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBhcHBseURlZmF1bHRzKHRoaXMsICR7Y29tcG9uZW50QXJyYXl9KTtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIuY2xvc2UoXCJ9XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgb3B0aW9ucyBpbnRlcmZhY2UgbmFtZSB0byBmaWxlIG5hbWVcbiAgICAgKlxuICAgICAqIENvbnZlcnRzIFBhc2NhbENhc2UgaW50ZXJmYWNlIG5hbWVzIHRvIGtlYmFiLWNhc2UgZmlsZSBuYW1lcy5cbiAgICAgKiBGYWxscyBiYWNrIHRvIGxvd2VyY2FzZSBjb252ZXJzaW9uIGZvciB1bm1hcHBlZCBpbnRlcmZhY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBPcHRpb25zIGludGVyZmFjZSBuYW1lXG4gICAgICogQHJldHVybnMgS2ViYWItY2FzZSBmaWxlIG5hbWUgd2l0aG91dCBleHRlbnNpb25cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogZ2V0T3B0aW9uc0ZpbGVOYW1lKFwiVHlwZVNjcmlwdFByb2plY3RPcHRpb25zXCIpIC8vIFwidHlwZXNjcmlwdC1vcHRpb25zXCJcbiAgICAgKi9cbiAgICBnZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uczogXCJ0eXBlc2NyaXB0LW9wdGlvbnNcIixcbiAgICAgICAgICAgIEpzaWlQcm9qZWN0T3B0aW9uczogXCJqc2lpLW9wdGlvbnNcIixcbiAgICAgICAgICAgIEF3c0Nka1R5cGVTY3JpcHRBcHBQcm9qZWN0T3B0aW9uczogXCJhd3NjZGstdHlwZXNjcmlwdC1hcHAtb3B0aW9uc1wiLFxuICAgICAgICAgICAgQXdzQ2RrQ29uc3RydWN0TGlicmFyeVByb2plY3RPcHRpb25zOiBcImF3c2Nkay1jb25zdHJ1Y3QtbGlicmFyeS1vcHRpb25zXCIsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBtYXBwaW5nW29wdGlvbnNJbnRlcmZhY2VdIHx8IG9wdGlvbnNJbnRlcmZhY2UudG9Mb3dlckNhc2UoKTtcbiAgICB9XG59XG5cbi8qKlxuICogUHJvamVuIGNvbXBvbmVudCB0aGF0IGdlbmVyYXRlcyBUeXBlU2NyaXB0IHByb2plY3QgY2xhc3NlcyB3aXRoIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBhdXRvbWF0ZXMgdGhlIGNyZWF0aW9uIG9mIHByb2plY3QgY2xhc3NlcyB0aGF0IGV4dGVuZCBQcm9qZW4gYmFzZSBjbGFzc2VzXG4gKiB3aXRoIG9waW5pb25hdGVkIGRlZmF1bHRzIGFuZCBjb21wb25lbnQgaW50ZWdyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9qZWN0R2VuZXJhdG9yIGV4dGVuZHMgcHJvamVuLkNvbXBvbmVudCB7XG4gICAgcHJpdmF0ZSByZW5kZXJlcjogVHlwZVNjcmlwdENsYXNzUmVuZGVyZXI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZW51bUdlbmVyYXRlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIE9wdGlvbnMgcHJvcGVydHkgbmFtZSBwZXIgY29tcG9uZW50IGNsYXNzIG5hbWUsIGZvciB0aGUgY29tcG9uZW50cyB3aG9zZSBvcHRpb25zXG4gICAgICogcHJvcGVydHkgd2FzIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnNQcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IC0gUHJvamVuIHByb2plY3QgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnMsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKHByb2plY3QpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFR5cGVTY3JpcHRDbGFzc1JlbmRlcmVyKCk7XG5cbiAgICAgICAgLyogR2VuZXJhdGUgUHJvamVjdFR5cGUgZW51bSBvbmNlIG9uIGZpcnN0IGluc3RhbnRpYXRpb24gKi9cbiAgICAgICAgaWYgKCFQcm9qZWN0R2VuZXJhdG9yLmVudW1HZW5lcmF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9qZWN0VHlwZUVudW0oKTtcbiAgICAgICAgICAgIFByb2plY3RHZW5lcmF0b3IuZW51bUdlbmVyYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgb3B0aW9ucyBpbnRlcmZhY2UgdXNpbmcgUHJvamVuU3RydWN0IGZvciBKU0lJIGNvbXBhdGliaWxpdHkgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLnJlbmRlcmVyLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZVBhdGggPSB0aGlzLmdldE9wdGlvbnNGaWxlUGF0aChvcHRpb25zSW50ZXJmYWNlKTtcblxuICAgICAgICAvKiBQcm9qZW5TdHJ1Y3QgZ2VuZXJhdGVzIGEgY29uY3JldGUgVHlwZVNjcmlwdCBpbnRlcmZhY2UgZnJvbSBQcm9qZW4ncyBvcHRpb25zXG4gICAgICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgSlNJSSBkb2Vzbid0IHN1cHBvcnQgVHlwZVNjcmlwdCB1dGlsaXR5IHR5cGVzIGxpa2UgT21pdDw+XG4gICAgICAgICAqIFRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIGNhbiBiZSBjb25zdW1lZCBieSBvdGhlciBsYW5ndWFnZXMgKFB5dGhvbiwgSmF2YSwgQyMsIEdvKSAqL1xuICAgICAgICBjb25zdCBzdHJ1Y3QgPSBuZXcgUHJvamVuU3RydWN0KHRoaXMuYXNUeXBlU2NyaXB0UHJvamVjdChwcm9qZWN0KSwge1xuICAgICAgICAgICAgbmFtZTogb3B0aW9uc0ludGVyZmFjZSxcbiAgICAgICAgICAgIGZpbGVQYXRoOiBvcHRpb25zRmlsZVBhdGgsXG4gICAgICAgICAgICBvdXRwdXRGaWxlT3B0aW9uczogeyByZWFkb25seTogdHJ1ZSB9LFxuICAgICAgICB9KVxuICAgICAgICAgICAgLm1peGluKHRoaXMud2l0aG91dFBhY2thZ2VNYW5hZ2VySW5pdGlhbFZhbHVlKFN0cnVjdC5mcm9tRnFuKGJhc2VPcHRpb25zRnFuKSkpXG4gICAgICAgICAgICAud2l0aG91dERlcHJlY2F0ZWQoKTtcblxuICAgICAgICAvKiBSZW1vdmUgc3BlY2lmaWVkIG9wdGlvbnMgZnJvbSB0aGUgYmFzZSBpbnRlcmZhY2UgKi9cbiAgICAgICAgaWYgKG9wdGlvbnMub21pdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIHN0cnVjdC5vbWl0KC4uLm9wdGlvbnMub21pdE9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQWRkIGNvbXBvbmVudC1kZXJpdmVkIG9wdGlvbnMgdG8gdGhlIGludGVyZmFjZSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IGdldERlZmF1bHRDb21wb25lbnRzKCk7XG4gICAgICAgIGNvbnN0IHsgUHJpbWl0aXZlVHlwZSB9ID0gcmVxdWlyZShcIkBqc2lpL3NwZWNcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjLmNvbXBvbmVudENsYXNzLm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBjLmNvbXBvbmVudENsYXNzLm5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIC8qIEFkZCBlbmFibGVkIGZsYWcgZm9yIHRoZSBjb21wb25lbnQgKi9cbiAgICAgICAgICAgIHN0cnVjdC5hZGQoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogeyBwcmltaXRpdmU6IFByaW1pdGl2ZVR5cGUuQm9vbGVhbiB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRvY3M6IHtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEVuYWJsZSAke2MuY29tcG9uZW50Q2xhc3MubmFtZX0gY29tcG9uZW50YCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBBZGQgb3B0aW9ucyBwcm9wZXJ0eSBpZiBjb21wb25lbnQgaXMgY29uZmlndXJhYmxlICovXG4gICAgICAgICAgICBpZiAoYy5vcHRpb25zUHJvcGVydHkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1R5cGUgPSB0aGlzLnJlc29sdmVDb21wb25lbnRPcHRpb25zVHlwZShjKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNUeXBlICYmICF0aGlzLmlzRnFuQXZhaWxhYmxlKG9wdGlvbnNUeXBlLmZxbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBvcHRpb25zIHR5cGUgaXMgbm90IGluIHRoZSBtYW5pZmVzdCB5ZXQsIHdoaWNoIGlzIGV4cGVjdGVkIHdoaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBhIG5ldyBjb21wb25lbnQgaXMgYmVpbmcgaW50cm9kdWNlZDogaXRzIHR5cGUgb25seSByZWFjaGVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICogbWFuaWZlc3Qgb25jZSBpdCBoYXMgYmVlbiBjb21waWxlZC4gTmV2ZXIgbGVhdmUgdGhpcyBzaWxlbnQsIHNpbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBza2lwcGluZyB0aGUgcHJvcGVydHkgcmVtb3ZlcyBpdCBmcm9tIHRoZSBwdWJsaWMgQVBJIG9mIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhY2thZ2UgLSBhIHN0YWxlIG9yIHVucmVhZGFibGUgbWFuaWZlc3QgbG9va3MgZXhhY3RseSB0aGUgc2FtZS4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNvbXBvbmVudCBvcHRpb25zIHR5cGUgaXMgbWlzc2luZyBmcm9tIHRoZSBKU0lJIG1hbmlmZXN0LCBvbWl0dGluZyB0aGUgb3B0aW9ucyBwcm9wZXJ0eS4gQ29tcGlsZSB0aGUgcGFja2FnZSBhbmQgc3ludGhlc2l6ZSBhZ2Fpbi5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBjLmNvbXBvbmVudENsYXNzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZxbjogb3B0aW9uc1R5cGUuZnFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zUHJvcGVydGllcy5zZXQoYy5jb21wb25lbnRDbGFzcy5uYW1lLCBvcHRpb25zVHlwZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5hZGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNUeXBlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogeyBmcW46IG9wdGlvbnNUeXBlLmZxbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogb3B0aW9uc1R5cGUuZG9jcyA/PyBgJHtjLmNvbXBvbmVudENsYXNzLm5hbWV9IGNvbmZpZ3VyYXRpb25gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBgLSBkZWZhdWx0ICR7Yy5jb21wb25lbnRDbGFzcy5uYW1lfSBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvKiBDb21wb25lbnQgaGFzIG5vIG9wdGlvbnMgcGFyYW1ldGVyIG9yIHJlc29sdXRpb24gZmFpbGVkIC0gc2tpcCAqL1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJGYWlsZWQgdG8gcmVzb2x2ZSBjb21wb25lbnQgb3B0aW9ucyB0eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBjLmNvbXBvbmVudENsYXNzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFkZCBjdXN0b20gb3B0aW9ucyB0byB0aGUgaW50ZXJmYWNlICovXG4gICAgICAgIGlmIChvcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zICYmIG9wdGlvbnMuYWRkaXRpb25hbE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3RydWN0LmFkZCguLi5vcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyb3BzIHRoZSBgQHBqbmV3YCBhbm5vdGF0aW9uIGZyb20gdGhlIGBwYWNrYWdlTWFuYWdlcmAgb3B0aW9uLlxuICAgICAqXG4gICAgICogYHByb2plbiBuZXdgIHJlbmRlcnMgdGhhdCBhbm5vdGF0aW9uIGFzIGFuIGV4cGxpY2l0IGFyZ3VtZW50IGluIHRoZSBgLnByb2plbnJjLnRzYFxuICAgICAqIGl0IGdlbmVyYXRlcywgd2hlcmUgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBkZWZhdWx0cyB0aGVzZSBwcm9qZWN0IHR5cGVzXG4gICAgICogYXBwbHkuIFByb2plbiBhbm5vdGF0ZXMgYHBhY2thZ2VNYW5hZ2VyYCB3aXRoIHRoZSBgJFBBQ0tBR0VfTUFOQUdFUmAgbWFjcm8sIHdoaWNoXG4gICAgICogcmVzb2x2ZXMgdG8gdGhlIHBhY2thZ2UgbWFuYWdlciB0aGF0IHJ1bnMgdGhlIGNvbW1hbmQsIHNvIGBucHggcHJvamVuIG5ldyAtLWZyb21gXG4gICAgICogd291bGQgcGluIGEgbmV3IHByb2plY3QgdG8gbnBtLiBXaXRob3V0IGFuIGFubm90YXRpb24gdGhlIG9wdGlvbiBpcyBsZWZ0IG91dCBvZlxuICAgICAqIHRoZSBnZW5lcmF0ZWQgYC5wcm9qZW5yYy50c2AgYW5kIHRoZSBkZWZhdWx0IG9mIHRoaXMgbGlicmFyeSBhcHBsaWVzLlxuICAgICAqXG4gICAgICogVGhlIGFubm90YXRpb24gY2Fubm90IGJlIHJlLXBvaW50ZWQgYXQgcG5wbSBpbnN0ZWFkOiBwcm9qZW4gb25seSBhY2NlcHRzIGEgbWFjcm9cbiAgICAgKiBvciBhIHByaW1pdGl2ZSB2YWx1ZSBhcyBhbiBpbml0aWFsIHZhbHVlLCBhbmQgdGhpcyBvcHRpb24gaXMgYW4gZW51bS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBiYXNlIC0gVGhlIHByb2plbiBvcHRpb25zIHN0cnVjdCB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZSBpcyBkZXJpdmVkIGZyb21cbiAgICAgKi9cbiAgICBwcml2YXRlIHdpdGhvdXRQYWNrYWdlTWFuYWdlckluaXRpYWxWYWx1ZShiYXNlOiBTdHJ1Y3QpOiBTdHJ1Y3Qge1xuICAgICAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGJhc2UucHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gXCJwYWNrYWdlTWFuYWdlclwiKTtcblxuICAgICAgICBpZiAoIXBhY2thZ2VNYW5hZ2VyPy5kb2NzPy5jdXN0b20/LnBqbmV3KSB7XG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgcGpuZXcsIC4uLmN1c3RvbSB9ID0gcGFja2FnZU1hbmFnZXIuZG9jcy5jdXN0b207XG5cbiAgICAgICAgcmV0dXJuIGJhc2UucmVwbGFjZShcInBhY2thZ2VNYW5hZ2VyXCIsIHtcbiAgICAgICAgICAgIC4uLnBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgICAgZG9jczoge1xuICAgICAgICAgICAgICAgIC4uLnBhY2thZ2VNYW5hZ2VyLmRvY3MsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogYC0gJHtqYXZhc2NyaXB0Lk5vZGVQYWNrYWdlTWFuYWdlci5QTlBNfWAsXG4gICAgICAgICAgICAgICAgY3VzdG9tLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgcHJvamVjdCB0byBUeXBlU2NyaXB0IHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogUHJvamVuU3RydWN0IHJlcXVpcmVzIGEgVHlwZVNjcmlwdFByb2plY3QgaW5zdGFuY2UuIFRoaXMgZ2VuZXJhdG9yIGlzIG9ubHkgdXNlZFxuICAgICAqIHdpdGhpbiBUeXBlU2NyaXB0IHByb2plY3RzLCBzbyB0aGUgY2FzdCBpcyBzYWZlIGluIHByYWN0aWNlLlxuICAgICAqXG4gICAgICogTm90ZTogVHlwZSBhc3NlcnRpb24gaXMgbmVjZXNzYXJ5IGhlcmUgYmVjYXVzZSBQcm9qZW4ncyB0eXBlIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGVcbiAgICAgKiBhIHJ1bnRpbWUgdHlwZSBndWFyZCBmb3IgVHlwZVNjcmlwdFByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHJldHVybnMgVHlwZVNjcmlwdCBwcm9qZWN0IGluc3RhbmNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc1R5cGVTY3JpcHRQcm9qZWN0KHByb2plY3Q6IFByb2plY3QpOiB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0IHtcbiAgICAgICAgcmV0dXJuIHByb2plY3QgYXMgdW5rbm93biBhcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogUGxhY2VzIHRoZSBvcHRpb25zIGludGVyZmFjZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY2xhc3MgZmlsZVxuICAgICAqIHdpdGggYSBcIi5nZW5lcmF0ZWQudHNcIiBzdWZmaXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgRmlsZSBwYXRoIGZvciB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkRmlsZVBhdGhFcnJvcn0gV2hlbiBmaWxlUGF0aCBkb2Vzbid0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFzdFNsYXNoID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRmlsZVBhdGhFcnJvcih0aGlzLm9wdGlvbnMuZmlsZVBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLnJlbmRlcmVyLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgcmV0dXJuIGAke2Rpcn0vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZC50c2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBUeXBlU2NyaXB0IGNsYXNzIGZpbGUgZHVyaW5nIFByb2plbiBzeW50aGVzaXNcbiAgICAgKlxuICAgICAqIENhbGxlZCBieSBQcm9qZW4gZHVyaW5nIHRoZSBzeW50aGVzaXMgcGhhc2UgdG8gZ2VuZXJhdGUgdGhlIHByb2plY3QgY2xhc3MgZmlsZS5cbiAgICAgKiBUaGUgZmlsZSBpcyBtYXJrZWQgYXMgcmVhZG9ubHkgdG8gcHJldmVudCBtYW51YWwgZWRpdGluZy5cbiAgICAgKi9cbiAgICBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5vcHRpb25zLCB0aGlzLm9wdGlvbnNQcm9wZXJ0aWVzKTtcblxuICAgICAgICBuZXcgVHlwZVNjcmlwdENsYXNzRmlsZSh0aGlzLnByb2plY3QsIHRoaXMub3B0aW9ucy5maWxlUGF0aCwgY29udGVudCwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRoaXMub3B0aW9ucy5yZWFkb25seSA/PyB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gRlFOIGlzIGF2YWlsYWJsZSBpbiBhbnkgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNGcW5BdmFpbGFibGUoZnFuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5sb2FkTWFuaWZlc3RGb3JGcW4oZnFuKTtcbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdC50eXBlcz8uW2Zxbl0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBjb21wb25lbnQgb3B0aW9ucyB0eXBlIGZyb20gSlNJSSBtYW5pZmVzdFxuICAgICAqXG4gICAgICogQXV0by1kZXRlY3RzIG9wdGlvbnMgZnJvbSBKU0lJIG1hbmlmZXN0IHdoZW4gb3B0aW9uc1Byb3BlcnR5IGlzIHVuZGVmaW5lZC5cbiAgICAgKiBSZXR1cm5zIG51bGwgb25seSB3aGVuIG9wdGlvbnNQcm9wZXJ0eSBpcyBleHBsaWNpdGx5IHNldCB0byBmYWxzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVDb21wb25lbnRPcHRpb25zVHlwZShjb21wb25lbnQ6IENvbXBvbmVudCk6IHsgbmFtZTogc3RyaW5nOyBmcW46IHN0cmluZzsgZG9jcz86IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgICAgIC8qIE5vcm1hbGl6ZSBvcHRpb25zUHJvcGVydHkgdG8gQ29tcG9uZW50T3B0aW9ucyAqL1xuICAgICAgICBsZXQgb3B0aW9uc0NvbmZpZzogQ29tcG9uZW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvcHRpb25zQ29uZmlnID0geyBuYW1lOiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5IH07XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSAmJiB0eXBlb2YgY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgb3B0aW9uc0NvbmZpZyA9IGNvbXBvbmVudC5vcHRpb25zUHJvcGVydHk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBVc2UgZXhwbGljaXQgdHlwZSBpZiBwcm92aWRlZCAqL1xuICAgICAgICBpZiAob3B0aW9uc0NvbmZpZz8udHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICAgICAgZnFuOiBvcHRpb25zQ29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgZG9jczogb3B0aW9uc0NvbmZpZy5kb2NzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEZpbmQgY29tcG9uZW50IGluIEpTSUkgbWFuaWZlc3RzICovXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZxbiA9IGNvbXBvbmVudC5mcW4gPz8gdGhpcy5maW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZvckZxbihjb21wb25lbnRGcW4pO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IG1hbmlmZXN0LnR5cGVzPy5bY29tcG9uZW50RnFuXTtcbiAgICAgICAgaWYgKCFjbGFzc1R5cGUgfHwgY2xhc3NUeXBlLmtpbmQgIT09IFwiY2xhc3NcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBvbmVudFJlc29sdXRpb25FcnJvcihjb21wb25lbnRGcW4sIFwiQ29tcG9uZW50IG5vdCBmb3VuZCBpbiBKU0lJIG1hbmlmZXN0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbGl6ZXIgPSAoY2xhc3NUeXBlIGFzIHsgaW5pdGlhbGl6ZXI/OiB7IHBhcmFtZXRlcnM/OiBBcnJheTx7IHR5cGU/OiB7IGZxbj86IHN0cmluZyB9IH0+IH0gfSlcbiAgICAgICAgICAgIC5pbml0aWFsaXplcjtcbiAgICAgICAgaWYgKCFpbml0aWFsaXplcj8ucGFyYW1ldGVycz8uWzFdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogQ29tcG9uZW50IGhhcyBubyBvcHRpb25zIHBhcmFtZXRlciAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1BhcmFtID0gaW5pdGlhbGl6ZXIucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZxbiA9IG9wdGlvbnNQYXJhbS50eXBlPy5mcW47XG5cbiAgICAgICAgaWYgKCFvcHRpb25zRnFuKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIG5vIEZRTiAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1R5cGUgPSBtYW5pZmVzdC50eXBlcz8uW29wdGlvbnNGcW5dO1xuICAgICAgICBjb25zdCBkb2NzID0gKG9wdGlvbnNUeXBlIGFzIHsgZG9jcz86IHsgc3VtbWFyeT86IHN0cmluZyB9IH0gfCB1bmRlZmluZWQpPy5kb2NzPy5zdW1tYXJ5O1xuXG4gICAgICAgIC8qIEF1dG8tZ2VuZXJhdGUgcHJvcGVydHkgbmFtZSBpZiBub3QgcHJvdmlkZWQgKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lO1xuICAgICAgICBjb25zdCBkZWZhdWx0TmFtZSA9IGAke25hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCl9JHtuYW1lLnNsaWNlKDEpfU9wdGlvbnNgO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcHRpb25zQ29uZmlnPy5uYW1lID8/IGRlZmF1bHROYW1lO1xuXG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3BlcnR5TmFtZSwgZnFuOiBvcHRpb25zRnFuLCBkb2NzIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgY29tcG9uZW50IEZRTiBieSBzZWFyY2hpbmcgYWxsIEpTSUkgbWFuaWZlc3RzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSBmaXJzdCAqL1xuICAgICAgICBjb25zdCBvd25GcW4gPSBgQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzLiR7Y29tcG9uZW50TmFtZX1gO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgb3duTWFuaWZlc3QgPSB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICAgICAgaWYgKG93bk1hbmlmZXN0LnR5cGVzPy5bb3duRnFuXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvd25GcW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvKiBPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZSB5ZXQgZHVyaW5nIGRldmVsb3BtZW50IC0gdGhpcyBpcyBleHBlY3RlZCAqL1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2VhcmNoIGluIG5vZGVfbW9kdWxlcyBmb3IgSlNJSSBwYWNrYWdlcyAqL1xuICAgICAgICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBqb2luKF9fZGlybmFtZSwgXCIuLi8uLi9ub2RlX21vZHVsZXNcIik7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gdGhpcy5maW5kSnNpaVBhY2thZ2VzKG5vZGVNb2R1bGVzUGF0aCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwa2cgb2YgcGFja2FnZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBrZyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmcW4gb2YgT2JqZWN0LmtleXMobWFuaWZlc3QudHlwZXMgPz8ge30pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcW4uZW5kc1dpdGgoYC4ke2NvbXBvbmVudE5hbWV9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8qIFNraXAgcGFja2FnZXMgd2l0aCBpbnZhbGlkIG1hbmlmZXN0cyAtIGxvZyBmb3IgZGVidWdnaW5nICovXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byBsb2FkIG1hbmlmZXN0IGZyb20gcGFja2FnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IoY29tcG9uZW50TmFtZSwgXCJDb21wb25lbnQgbm90IGZvdW5kIGluIGFueSBKU0lJIG1hbmlmZXN0XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsbCBKU0lJIHBhY2thZ2VzIGluIG5vZGVfbW9kdWxlc1xuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEpzaWlQYWNrYWdlcyhub2RlTW9kdWxlc1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHsgcmVhZGRpclN5bmMsIHN0YXRTeW5jLCBleGlzdHNTeW5jIH0gPSByZXF1aXJlKFwibm9kZTpmc1wiKTtcblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgsIGVudHJ5KTtcblxuICAgICAgICAgICAgLyogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzICovXG4gICAgICAgICAgICBpZiAoIWVudHJ5UGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICAgICAgICAgICAgLyogU2NvcGVkIHBhY2thZ2UgLSByZWN1cnNlIGludG8gc2NvcGUgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBzY29wZVBhdGggPSBlbnRyeVBhdGg7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzY29wZWRFbnRyeSBvZiByZWFkZGlyU3luYyhzY29wZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBrZ1BhdGggPSByZXNvbHZlKHNjb3BlUGF0aCwgc2NvcGVkRW50cnkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8qIFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrcyAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBrZ1BhdGguc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4ocGtnUGF0aCwgXCIuanNpaVwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1c2gocGtnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRTeW5jKGVudHJ5UGF0aCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIC8qIFJlZ3VsYXIgcGFja2FnZSAqL1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZW50cnlQYXRoLCBcIi5qc2lpXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcy5wdXNoKGVudHJ5UGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIEpTSUkgbWFuaWZlc3QgZm9yIGEgZ2l2ZW4gRlFOXG4gICAgICpcbiAgICAgKiBFeHRyYWN0cyBwYWNrYWdlIG5hbWUgZnJvbSBGUU4uIEZvciBzY29wZWQgcGFja2FnZXMgbGlrZSBAc2NvcGUvcGFja2FnZS5DbGFzc05hbWUsXG4gICAgICogdGhlIHBhY2thZ2UgbmFtZSBpcyBldmVyeXRoaW5nIGJlZm9yZSB0aGUgZmlyc3QgZG90IChpLmUuLCBAc2NvcGUvcGFja2FnZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkTWFuaWZlc3RGb3JGcW4oZnFuOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGRvdEluZGV4ID0gZnFuLmluZGV4T2YoXCIuXCIpO1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGRvdEluZGV4ID4gMCA/IGZxbi5zdWJzdHJpbmcoMCwgZG90SW5kZXgpIDogZnFuO1xuXG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSAqL1xuICAgICAgICBpZiAocGFja2FnZU5hbWUgPT09IFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVHJ5IG5vZGVfbW9kdWxlcyAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE1hbmlmZXN0RnJvbVBhY2thZ2UoZGlybmFtZShwa2dKc29uUGF0aCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0TG9hZEVycm9yKHBhY2thZ2VOYW1lLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgSlNJSSBtYW5pZmVzdCBmcm9tIGEgcGFja2FnZSBkaXJlY3RvcnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBhY2thZ2VQYXRoOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGpzaWlQYXRoID0gam9pbihwYWNrYWdlUGF0aCwgXCIuanNpaVwiKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpzaWlQYXRoLCBcInV0Zi04XCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGlzIHBhY2thZ2UncyBKU0lJIG1hbmlmZXN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkT3duTWFuaWZlc3QoKTogQXNzZW1ibHkge1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcIi4uLy5qc2lpXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoanNpaVBhdGgsIFwidXRmLThcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBQcm9qZWN0VHlwZSBlbnVtIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGVQcm9qZWN0VHlwZUVudW0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByb2plY3RUeXBlcyA9IHRoaXMuZGlzY292ZXJQcm9qZWN0VHlwZXMoKTtcblxuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGluZXMucHVzaChcIi8qKlwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIEVudW0gZGVmaW5pbmcgYWxsIHN1cHBvcnRlZCBwcm9qZWN0IHR5cGVzXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBFYWNoIHByb2plY3QgdHlwZSBjb3JyZXNwb25kcyB0byBhIGdlbmVyYXRlZCBwcm9qZWN0IGNsYXNzIGFuZCBpdHMgY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIGluIHRoZSBkZWZhdWx0T3B0aW9ucyBzdHJ1Y3R1cmUuXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBAZ2VuZXJhdGVkIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqL1wiKTtcbiAgICAgICAgbGluZXMucHVzaChcImV4cG9ydCBlbnVtIFByb2plY3RUeXBlIHtcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBbZW51bU5hbWUsIHZhbHVlLCBkb2NzXSBvZiBwcm9qZWN0VHlwZXMpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgLyoqXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICAqICR7ZG9jc31gKTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgICovXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICR7ZW51bU5hbWV9ID0gXCIke3ZhbHVlfVwiLGApO1xuICAgICAgICAgICAgbGluZXMucHVzaChcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzLnB1c2goXCJ9XCIpO1xuXG4gICAgICAgIG5ldyBwcm9qZW4uVGV4dEZpbGUodGhpcy5wcm9qZWN0LCBcInNyYy9wcm9qZWN0LXR5cGUudHNcIiwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY292ZXJzIGFsbCBwcm9qZWN0IHR5cGVzIHRoYXQgZXh0ZW5kIHByb2plbi5Qcm9qZWN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBkaXNjb3ZlclByb2plY3RUeXBlcygpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgICAgICAgY29uc3QgcHJvamVjdFR5cGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IFwicHJvamVuLlByb2plY3RcIjtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmcW4sIHR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVuZGVyZXIuanNpaU1hbmlmZXN0LnR5cGVzID8/IHt9KSkge1xuICAgICAgICAgICAgaWYgKHR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IHR5cGUgYXMge1xuICAgICAgICAgICAgICAgIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICBiYXNlPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGRvY3M/OiB7IHN1bW1hcnk/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjbGFzc1R5cGUuYWJzdHJhY3QpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dGVuZHNCYXNlKGNsYXNzVHlwZSwgYmFzZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGZxbi5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMyB8fCBwYXJ0c1swXSAhPT0gXCJwcm9qZW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBwYXJ0c1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgY29uc3QgZW51bU5hbWUgPSBjbGFzc05hbWVcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFtBLVpdKS9nLCBcIl8kMVwiKVxuICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL15fLywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke21vZHVsZX0uJHtjbGFzc05hbWV9YDtcbiAgICAgICAgICAgIGNvbnN0IGRvY3MgPSBjbGFzc1R5cGUuZG9jcz8uc3VtbWFyeSA/PyBjbGFzc05hbWU7XG5cbiAgICAgICAgICAgIHByb2plY3RUeXBlcy5wdXNoKFtlbnVtTmFtZSwgdmFsdWUsIGRvY3NdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9qZWN0VHlwZXMuc29ydCgoYSwgYikgPT4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjbGFzcyBleHRlbmRzIHRoZSBiYXNlIGNsYXNzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRlbmRzQmFzZShjbGFzc1R5cGU6IHsgaW5oZXJpdGFuY2VQYXRoPzogc3RyaW5nW107IGJhc2U/OiBzdHJpbmcgfSwgYmFzZUNsYXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNsYXNzVHlwZS5pbmhlcml0YW5jZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGFzc1R5cGUuaW5oZXJpdGFuY2VQYXRoLmluY2x1ZGVzKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVudEJhc2UgPSBjbGFzc1R5cGUuYmFzZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRCYXNlKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEJhc2UgPT09IGJhc2VDbGFzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmFzZVR5cGUgPSB0aGlzLnJlbmRlcmVyLmpzaWlNYW5pZmVzdC50eXBlcz8uW2N1cnJlbnRCYXNlXTtcbiAgICAgICAgICAgIGlmICghYmFzZVR5cGUgfHwgYmFzZVR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50QmFzZSA9IChiYXNlVHlwZSBhcyB7IGJhc2U/OiBzdHJpbmcgfSkuYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogVGV4dCBmaWxlIGZvciBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gKlxuICogRXh0ZW5kcyBQcm9qZW4ncyBUZXh0RmlsZSB0byBhZGQgdGhlIGdlbmVyYXRlZCBmaWxlIG1hcmtlciBjb21tZW50XG4gKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLlxuICovXG5jbGFzcyBUeXBlU2NyaXB0Q2xhc3NGaWxlIGV4dGVuZHMgcHJvamVuLlRleHRGaWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gT3V0cHV0IGZpbGUgcGF0aFxuICAgICAqIEBwYXJhbSBjb250ZW50IC0gVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTb3VyY2UgY29kZSBvcHRpb25zIChyZWFkb25seSwgZXRjLilcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM6IFNvdXJjZUNvZGVPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIG9wdGlvbnMpO1xuICAgICAgICAvKiBBZGQgZ2VuZXJhdGVkIGZpbGUgbWFya2VyIHRvIHByZXZlbnQgbWFudWFsIGVkaXRpbmcgKi9cbiAgICAgICAgdGhpcy5hZGRMaW5lKGAvLyAke3RoaXMubWFya2VyfWApO1xuICAgICAgICB0aGlzLmFkZExpbmUoY29udGVudCk7XG4gICAgfVxufVxuIl19
|
|
@@ -15,18 +15,18 @@ const utils_1 = require("../utils");
|
|
|
15
15
|
* Extends Projen's base class with opinionated defaults and automatic component setup.
|
|
16
16
|
*/
|
|
17
17
|
class AwsCdkConstructLibraryProject extends projen_1.awscdk.AwsCdkConstructLibrary {
|
|
18
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkConstructLibraryProject", version: "0.3.
|
|
18
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkConstructLibraryProject", version: "0.3.77" };
|
|
19
19
|
/**
|
|
20
20
|
* @param options - Project configuration
|
|
21
21
|
*/
|
|
22
22
|
constructor(options) {
|
|
23
23
|
/* Separate component configuration from base Projen options */
|
|
24
|
-
const { homebrew, mise, vitest, ...baseOptions } = options;
|
|
24
|
+
const { homebrew, homebrewOptions, mise, miseOptions, vitest, vitestOptions, ...baseOptions } = options;
|
|
25
25
|
/* Merge default configuration with user options and initialize base class */
|
|
26
26
|
super((0, utils_1.deepMerge)(config_1.defaultOptions.awscdk.AwsCdkConstructLibrary, baseOptions));
|
|
27
27
|
/* Apply component defaults and instantiate enabled components */
|
|
28
|
-
(0, config_1.applyDefaults)(this, [{ component: homebrew_1.Homebrew, enabled: homebrew }, { component: mise_1.Mise, enabled: mise }, { component: vitest_1.Vitest, enabled: vitest }]);
|
|
28
|
+
(0, config_1.applyDefaults)(this, [{ component: homebrew_1.Homebrew, enabled: homebrew, options: homebrewOptions }, { component: mise_1.Mise, enabled: mise, options: miseOptions }, { component: vitest_1.Vitest, enabled: vitest, options: vitestOptions }]);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
exports.AwsCdkConstructLibraryProject = AwsCdkConstructLibraryProject;
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzY2RrLWNvbnN0cnVjdC1saWJyYXJ5LmdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0cy9hd3NjZGstY29uc3RydWN0LWxpYnJhcnkuZ2VuZXJhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtRkFBbUY7QUFDbkYsbUNBQWdDO0FBQ2hDLHFEQUFrRDtBQUNsRCw2Q0FBMEM7QUFDMUMsaURBQThDO0FBQzlDLHNDQUEwRDtBQUMxRCxvQ0FBcUM7QUFLckM7Ozs7R0FJRztBQUNILE1BQWEsNkJBQThCLFNBQVEsZUFBTSxDQUFDLHNCQUFzQjs7SUFDNUU7O09BRUc7SUFDSCxZQUFZLE9BQTZDO1FBQ3JELCtEQUErRDtRQUMvRCxNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFeEcsNkVBQTZFO1FBQzdFLEtBQUssQ0FBQyxJQUFBLGlCQUFTLEVBQXVDLHVCQUFjLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFbEgsaUVBQWlFO1FBQ2pFLElBQUEsc0JBQWEsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFOLENBQUM7O0FBYkwsc0VBY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLnRzIGFuZCBydW4gXCJwbnBtIGV4ZWMgcHJvamVuXCIuXG5pbXBvcnQgeyBhd3NjZGsgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBIb21lYnJldyB9IGZyb20gXCIuLi9jb21wb25lbnRzL2hvbWVicmV3XCI7XG5pbXBvcnQgeyBNaXNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbWlzZVwiO1xuaW1wb3J0IHsgVml0ZXN0IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvdml0ZXN0XCI7XG5pbXBvcnQgeyBhcHBseURlZmF1bHRzLCBkZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuLi9jb25maWdcIjtcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5UHJvamVjdE9wdGlvbnMgfSBmcm9tIFwiLi9hd3NjZGstY29uc3RydWN0LWxpYnJhcnktb3B0aW9ucy5nZW5lcmF0ZWRcIjtcblxuZXhwb3J0IHR5cGUgeyBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5UHJvamVjdE9wdGlvbnMgfSBmcm9tIFwiLi9hd3NjZGstY29uc3RydWN0LWxpYnJhcnktb3B0aW9ucy5nZW5lcmF0ZWRcIjtcblxuLyoqXG4gKiBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5UHJvamVjdCB3aXRoIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvblxuICpcbiAqIEV4dGVuZHMgUHJvamVuJ3MgYmFzZSBjbGFzcyB3aXRoIG9waW5pb25hdGVkIGRlZmF1bHRzIGFuZCBhdXRvbWF0aWMgY29tcG9uZW50IHNldHVwLlxuICovXG5leHBvcnQgY2xhc3MgQXdzQ2RrQ29uc3RydWN0TGlicmFyeVByb2plY3QgZXh0ZW5kcyBhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBQcm9qZWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5UHJvamVjdE9wdGlvbnMpIHtcbiAgICAgICAgLyogU2VwYXJhdGUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZnJvbSBiYXNlIFByb2plbiBvcHRpb25zICovXG4gICAgICAgIGNvbnN0IHsgaG9tZWJyZXcsIGhvbWVicmV3T3B0aW9ucywgbWlzZSwgbWlzZU9wdGlvbnMsIHZpdGVzdCwgdml0ZXN0T3B0aW9ucywgLi4uYmFzZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgLyogTWVyZ2UgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdpdGggdXNlciBvcHRpb25zIGFuZCBpbml0aWFsaXplIGJhc2UgY2xhc3MgKi9cbiAgICAgICAgc3VwZXIoZGVlcE1lcmdlPGF3c2Nkay5Bd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucz4oZGVmYXVsdE9wdGlvbnMuYXdzY2RrLkF3c0Nka0NvbnN0cnVjdExpYnJhcnksIGJhc2VPcHRpb25zKSk7XG5cbiAgICAgICAgLyogQXBwbHkgY29tcG9uZW50IGRlZmF1bHRzIGFuZCBpbnN0YW50aWF0ZSBlbmFibGVkIGNvbXBvbmVudHMgKi9cbiAgICAgICAgYXBwbHlEZWZhdWx0cyh0aGlzLCBbeyBjb21wb25lbnQ6IEhvbWVicmV3LCBlbmFibGVkOiBob21lYnJldywgb3B0aW9uczogaG9tZWJyZXdPcHRpb25zIH0sIHsgY29tcG9uZW50OiBNaXNlLCBlbmFibGVkOiBtaXNlLCBvcHRpb25zOiBtaXNlT3B0aW9ucyB9LCB7IGNvbXBvbmVudDogVml0ZXN0LCBlbmFibGVkOiB2aXRlc3QsIG9wdGlvbnM6IHZpdGVzdE9wdGlvbnMgfV0pO1xuICAgIH1cbn0iXX0=
|
|
@@ -15,18 +15,18 @@ const utils_1 = require("../utils");
|
|
|
15
15
|
* Extends Projen's base class with opinionated defaults and automatic component setup.
|
|
16
16
|
*/
|
|
17
17
|
class AwsCdkTypeScriptAppProject extends projen_1.awscdk.AwsCdkTypeScriptApp {
|
|
18
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkTypeScriptAppProject", version: "0.3.
|
|
18
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkTypeScriptAppProject", version: "0.3.77" };
|
|
19
19
|
/**
|
|
20
20
|
* @param options - Project configuration
|
|
21
21
|
*/
|
|
22
22
|
constructor(options) {
|
|
23
23
|
/* Separate component configuration from base Projen options */
|
|
24
|
-
const { homebrew, mise, vitest, ...baseOptions } = options;
|
|
24
|
+
const { homebrew, homebrewOptions, mise, miseOptions, vitest, vitestOptions, ...baseOptions } = options;
|
|
25
25
|
/* Merge default configuration with user options and initialize base class */
|
|
26
26
|
super((0, utils_1.deepMerge)(config_1.defaultOptions.awscdk.AwsCdkTypeScriptApp, baseOptions));
|
|
27
27
|
/* Apply component defaults and instantiate enabled components */
|
|
28
|
-
(0, config_1.applyDefaults)(this, [{ component: homebrew_1.Homebrew, enabled: homebrew }, { component: mise_1.Mise, enabled: mise }, { component: vitest_1.Vitest, enabled: vitest }]);
|
|
28
|
+
(0, config_1.applyDefaults)(this, [{ component: homebrew_1.Homebrew, enabled: homebrew, options: homebrewOptions }, { component: mise_1.Mise, enabled: mise, options: miseOptions }, { component: vitest_1.Vitest, enabled: vitest, options: vitestOptions }]);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
exports.AwsCdkTypeScriptAppProject = AwsCdkTypeScriptAppProject;
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzY2RrLXR5cGVzY3JpcHQtYXBwLmdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0cy9hd3NjZGstdHlwZXNjcmlwdC1hcHAuZ2VuZXJhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtRkFBbUY7QUFDbkYsbUNBQWdDO0FBQ2hDLHFEQUFrRDtBQUNsRCw2Q0FBMEM7QUFDMUMsaURBQThDO0FBQzlDLHNDQUEwRDtBQUMxRCxvQ0FBcUM7QUFLckM7Ozs7R0FJRztBQUNILE1BQWEsMEJBQTJCLFNBQVEsZUFBTSxDQUFDLG1CQUFtQjs7SUFDdEU7O09BRUc7SUFDSCxZQUFZLE9BQTBDO1FBQ2xELCtEQUErRDtRQUMvRCxNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFeEcsNkVBQTZFO1FBQzdFLEtBQUssQ0FBQyxJQUFBLGlCQUFTLEVBQW9DLHVCQUFjLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFNUcsaUVBQWlFO1FBQ2pFLElBQUEsc0JBQWEsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFOLENBQUM7O0FBYkwsZ0VBY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLnRzIGFuZCBydW4gXCJwbnBtIGV4ZWMgcHJvamVuXCIuXG5pbXBvcnQgeyBhd3NjZGsgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBIb21lYnJldyB9IGZyb20gXCIuLi9jb21wb25lbnRzL2hvbWVicmV3XCI7XG5pbXBvcnQgeyBNaXNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbWlzZVwiO1xuaW1wb3J0IHsgVml0ZXN0IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvdml0ZXN0XCI7XG5pbXBvcnQgeyBhcHBseURlZmF1bHRzLCBkZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuLi9jb25maWdcIjtcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBBd3NDZGtUeXBlU2NyaXB0QXBwUHJvamVjdE9wdGlvbnMgfSBmcm9tIFwiLi9hd3NjZGstdHlwZXNjcmlwdC1hcHAtb3B0aW9ucy5nZW5lcmF0ZWRcIjtcblxuZXhwb3J0IHR5cGUgeyBBd3NDZGtUeXBlU2NyaXB0QXBwUHJvamVjdE9wdGlvbnMgfSBmcm9tIFwiLi9hd3NjZGstdHlwZXNjcmlwdC1hcHAtb3B0aW9ucy5nZW5lcmF0ZWRcIjtcblxuLyoqXG4gKiBBd3NDZGtUeXBlU2NyaXB0QXBwUHJvamVjdCB3aXRoIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvblxuICpcbiAqIEV4dGVuZHMgUHJvamVuJ3MgYmFzZSBjbGFzcyB3aXRoIG9waW5pb25hdGVkIGRlZmF1bHRzIGFuZCBhdXRvbWF0aWMgY29tcG9uZW50IHNldHVwLlxuICovXG5leHBvcnQgY2xhc3MgQXdzQ2RrVHlwZVNjcmlwdEFwcFByb2plY3QgZXh0ZW5kcyBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBQcm9qZWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBd3NDZGtUeXBlU2NyaXB0QXBwUHJvamVjdE9wdGlvbnMpIHtcbiAgICAgICAgLyogU2VwYXJhdGUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZnJvbSBiYXNlIFByb2plbiBvcHRpb25zICovXG4gICAgICAgIGNvbnN0IHsgaG9tZWJyZXcsIGhvbWVicmV3T3B0aW9ucywgbWlzZSwgbWlzZU9wdGlvbnMsIHZpdGVzdCwgdml0ZXN0T3B0aW9ucywgLi4uYmFzZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgLyogTWVyZ2UgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdpdGggdXNlciBvcHRpb25zIGFuZCBpbml0aWFsaXplIGJhc2UgY2xhc3MgKi9cbiAgICAgICAgc3VwZXIoZGVlcE1lcmdlPGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwT3B0aW9ucz4oZGVmYXVsdE9wdGlvbnMuYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHAsIGJhc2VPcHRpb25zKSk7XG5cbiAgICAgICAgLyogQXBwbHkgY29tcG9uZW50IGRlZmF1bHRzIGFuZCBpbnN0YW50aWF0ZSBlbmFibGVkIGNvbXBvbmVudHMgKi9cbiAgICAgICAgYXBwbHlEZWZhdWx0cyh0aGlzLCBbeyBjb21wb25lbnQ6IEhvbWVicmV3LCBlbmFibGVkOiBob21lYnJldywgb3B0aW9uczogaG9tZWJyZXdPcHRpb25zIH0sIHsgY29tcG9uZW50OiBNaXNlLCBlbmFibGVkOiBtaXNlLCBvcHRpb25zOiBtaXNlT3B0aW9ucyB9LCB7IGNvbXBvbmVudDogVml0ZXN0LCBlbmFibGVkOiB2aXRlc3QsIG9wdGlvbnM6IHZpdGVzdE9wdGlvbnMgfV0pO1xuICAgIH1cbn0iXX0=
|
|
@@ -16,18 +16,18 @@ const utils_1 = require("../utils");
|
|
|
16
16
|
* Extends Projen's base class with opinionated defaults and automatic component setup.
|
|
17
17
|
*/
|
|
18
18
|
class JsiiProject extends projen_1.cdk.JsiiProject {
|
|
19
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.JsiiProject", version: "0.3.
|
|
19
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.JsiiProject", version: "0.3.77" };
|
|
20
20
|
/**
|
|
21
21
|
* @param options - Project configuration
|
|
22
22
|
*/
|
|
23
23
|
constructor(options) {
|
|
24
24
|
/* Separate component configuration from base Projen options */
|
|
25
|
-
const { homebrew, mise, vitest, typeDoc, ...baseOptions } = options;
|
|
25
|
+
const { homebrew, homebrewOptions, mise, miseOptions, vitest, vitestOptions, typeDoc, typeDocOptions, ...baseOptions } = options;
|
|
26
26
|
/* Merge default configuration with user options and initialize base class */
|
|
27
27
|
super((0, utils_1.deepMerge)(config_1.defaultOptions.cdk.JsiiProject, baseOptions));
|
|
28
28
|
/* Apply component defaults and instantiate enabled components */
|
|
29
|
-
(0, config_1.applyDefaults)(this, [{ component: homebrew_1.Homebrew, enabled: homebrew }, { component: mise_1.Mise, enabled: mise }, { component: vitest_1.Vitest, enabled: vitest }, { component: typedoc_1.TypeDoc, enabled: typeDoc }]);
|
|
29
|
+
(0, config_1.applyDefaults)(this, [{ component: homebrew_1.Homebrew, enabled: homebrew, options: homebrewOptions }, { component: mise_1.Mise, enabled: mise, options: miseOptions }, { component: vitest_1.Vitest, enabled: vitest, options: vitestOptions }, { component: typedoc_1.TypeDoc, enabled: typeDoc, options: typeDocOptions }]);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
exports.JsiiProject = JsiiProject;
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNpaS5nZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvamVjdHMvanNpaS5nZW5lcmF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLG1GQUFtRjtBQUNuRixtQ0FBNkI7QUFDN0IscURBQWtEO0FBQ2xELDZDQUEwQztBQUMxQyxtREFBZ0Q7QUFDaEQsaURBQThDO0FBQzlDLHNDQUEwRDtBQUMxRCxvQ0FBcUM7QUFLckM7Ozs7R0FJRztBQUNILE1BQWEsV0FBWSxTQUFRLFlBQUcsQ0FBQyxXQUFXOztJQUM1Qzs7T0FFRztJQUNILFlBQVksT0FBMkI7UUFDbkMsK0RBQStEO1FBQy9ELE1BQU0sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLEdBQUcsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRWpJLDZFQUE2RTtRQUM3RSxLQUFLLENBQUMsSUFBQSxpQkFBUyxFQUF5Qix1QkFBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUV0RixpRUFBaUU7UUFDakUsSUFBQSxzQkFBYSxFQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLG1CQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLGVBQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxpQkFBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3UixDQUFDOztBQWJMLGtDQWNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwicG5wbSBleGVjIHByb2plblwiLlxuaW1wb3J0IHsgY2RrIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgSG9tZWJyZXcgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9ob21lYnJld1wiO1xuaW1wb3J0IHsgTWlzZSB9IGZyb20gXCIuLi9jb21wb25lbnRzL21pc2VcIjtcbmltcG9ydCB7IFR5cGVEb2MgfSBmcm9tIFwiLi4vY29tcG9uZW50cy90eXBlZG9jXCI7XG5pbXBvcnQgeyBWaXRlc3QgfSBmcm9tIFwiLi4vY29tcG9uZW50cy92aXRlc3RcIjtcbmltcG9ydCB7IGFwcGx5RGVmYXVsdHMsIGRlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEpzaWlQcm9qZWN0T3B0aW9ucyB9IGZyb20gXCIuL2pzaWktb3B0aW9ucy5nZW5lcmF0ZWRcIjtcblxuZXhwb3J0IHR5cGUgeyBKc2lpUHJvamVjdE9wdGlvbnMgfSBmcm9tIFwiLi9qc2lpLW9wdGlvbnMuZ2VuZXJhdGVkXCI7XG5cbi8qKlxuICogSnNpaVByb2plY3Qgd2l0aCBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGFuZCBjb21wb25lbnQgaW50ZWdyYXRpb25cbiAqXG4gKiBFeHRlbmRzIFByb2plbidzIGJhc2UgY2xhc3Mgd2l0aCBvcGluaW9uYXRlZCBkZWZhdWx0cyBhbmQgYXV0b21hdGljIGNvbXBvbmVudCBzZXR1cC5cbiAqL1xuZXhwb3J0IGNsYXNzIEpzaWlQcm9qZWN0IGV4dGVuZHMgY2RrLkpzaWlQcm9qZWN0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFByb2plY3QgY29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEpzaWlQcm9qZWN0T3B0aW9ucykge1xuICAgICAgICAvKiBTZXBhcmF0ZSBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmcm9tIGJhc2UgUHJvamVuIG9wdGlvbnMgKi9cbiAgICAgICAgY29uc3QgeyBob21lYnJldywgaG9tZWJyZXdPcHRpb25zLCBtaXNlLCBtaXNlT3B0aW9ucywgdml0ZXN0LCB2aXRlc3RPcHRpb25zLCB0eXBlRG9jLCB0eXBlRG9jT3B0aW9ucywgLi4uYmFzZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgLyogTWVyZ2UgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdpdGggdXNlciBvcHRpb25zIGFuZCBpbml0aWFsaXplIGJhc2UgY2xhc3MgKi9cbiAgICAgICAgc3VwZXIoZGVlcE1lcmdlPGNkay5Kc2lpUHJvamVjdE9wdGlvbnM+KGRlZmF1bHRPcHRpb25zLmNkay5Kc2lpUHJvamVjdCwgYmFzZU9wdGlvbnMpKTtcblxuICAgICAgICAvKiBBcHBseSBjb21wb25lbnQgZGVmYXVsdHMgYW5kIGluc3RhbnRpYXRlIGVuYWJsZWQgY29tcG9uZW50cyAqL1xuICAgICAgICBhcHBseURlZmF1bHRzKHRoaXMsIFt7IGNvbXBvbmVudDogSG9tZWJyZXcsIGVuYWJsZWQ6IGhvbWVicmV3LCBvcHRpb25zOiBob21lYnJld09wdGlvbnMgfSwgeyBjb21wb25lbnQ6IE1pc2UsIGVuYWJsZWQ6IG1pc2UsIG9wdGlvbnM6IG1pc2VPcHRpb25zIH0sIHsgY29tcG9uZW50OiBWaXRlc3QsIGVuYWJsZWQ6IHZpdGVzdCwgb3B0aW9uczogdml0ZXN0T3B0aW9ucyB9LCB7IGNvbXBvbmVudDogVHlwZURvYywgZW5hYmxlZDogdHlwZURvYywgb3B0aW9uczogdHlwZURvY09wdGlvbnMgfV0pO1xuICAgIH1cbn0iXX0=
|
|
@@ -15,18 +15,18 @@ const utils_1 = require("../utils");
|
|
|
15
15
|
* Extends Projen's base class with opinionated defaults and automatic component setup.
|
|
16
16
|
*/
|
|
17
17
|
class TypeScriptProject extends projen_1.typescript.TypeScriptProject {
|
|
18
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeScriptProject", version: "0.3.
|
|
18
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeScriptProject", version: "0.3.77" };
|
|
19
19
|
/**
|
|
20
20
|
* @param options - Project configuration
|
|
21
21
|
*/
|
|
22
22
|
constructor(options) {
|
|
23
23
|
/* Separate component configuration from base Projen options */
|
|
24
|
-
const { homebrew, mise, vitest, ...baseOptions } = options;
|
|
24
|
+
const { homebrew, homebrewOptions, mise, miseOptions, vitest, vitestOptions, ...baseOptions } = options;
|
|
25
25
|
/* Merge default configuration with user options and initialize base class */
|
|
26
26
|
super((0, utils_1.deepMerge)(config_1.defaultOptions.typescript.TypeScriptProject, baseOptions));
|
|
27
27
|
/* Apply component defaults and instantiate enabled components */
|
|
28
|
-
(0, config_1.applyDefaults)(this, [{ component: homebrew_1.Homebrew, enabled: homebrew }, { component: mise_1.Mise, enabled: mise }, { component: vitest_1.Vitest, enabled: vitest }]);
|
|
28
|
+
(0, config_1.applyDefaults)(this, [{ component: homebrew_1.Homebrew, enabled: homebrew, options: homebrewOptions }, { component: mise_1.Mise, enabled: mise, options: miseOptions }, { component: vitest_1.Vitest, enabled: vitest, options: vitestOptions }]);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
exports.TypeScriptProject = TypeScriptProject;
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5nZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvamVjdHMvdHlwZXNjcmlwdC5nZW5lcmF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLG1GQUFtRjtBQUNuRixtQ0FBb0M7QUFDcEMscURBQWtEO0FBQ2xELDZDQUEwQztBQUMxQyxpREFBOEM7QUFDOUMsc0NBQTBEO0FBQzFELG9DQUFxQztBQUtyQzs7OztHQUlHO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxtQkFBVSxDQUFDLGlCQUFpQjs7SUFDL0Q7O09BRUc7SUFDSCxZQUFZLE9BQWlDO1FBQ3pDLCtEQUErRDtRQUMvRCxNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFeEcsNkVBQTZFO1FBQzdFLEtBQUssQ0FBQyxJQUFBLGlCQUFTLEVBQXNDLHVCQUFjLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFaEgsaUVBQWlFO1FBQ2pFLElBQUEsc0JBQWEsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFOLENBQUM7O0FBYkwsOENBY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLnRzIGFuZCBydW4gXCJwbnBtIGV4ZWMgcHJvamVuXCIuXG5pbXBvcnQgeyB0eXBlc2NyaXB0IH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgSG9tZWJyZXcgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9ob21lYnJld1wiO1xuaW1wb3J0IHsgTWlzZSB9IGZyb20gXCIuLi9jb21wb25lbnRzL21pc2VcIjtcbmltcG9ydCB7IFZpdGVzdCB9IGZyb20gXCIuLi9jb21wb25lbnRzL3ZpdGVzdFwiO1xuaW1wb3J0IHsgYXBwbHlEZWZhdWx0cywgZGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNjcmlwdC1vcHRpb25zLmdlbmVyYXRlZFwiO1xuXG5leHBvcnQgdHlwZSB7IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzY3JpcHQtb3B0aW9ucy5nZW5lcmF0ZWRcIjtcblxuLyoqXG4gKiBUeXBlU2NyaXB0UHJvamVjdCB3aXRoIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvblxuICpcbiAqIEV4dGVuZHMgUHJvamVuJ3MgYmFzZSBjbGFzcyB3aXRoIG9waW5pb25hdGVkIGRlZmF1bHRzIGFuZCBhdXRvbWF0aWMgY29tcG9uZW50IHNldHVwLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFByb2plY3QgZXh0ZW5kcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFByb2plY3QgY29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucykge1xuICAgICAgICAvKiBTZXBhcmF0ZSBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmcm9tIGJhc2UgUHJvamVuIG9wdGlvbnMgKi9cbiAgICAgICAgY29uc3QgeyBob21lYnJldywgaG9tZWJyZXdPcHRpb25zLCBtaXNlLCBtaXNlT3B0aW9ucywgdml0ZXN0LCB2aXRlc3RPcHRpb25zLCAuLi5iYXNlT3B0aW9ucyB9ID0gb3B0aW9ucztcblxuICAgICAgICAvKiBNZXJnZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyIG9wdGlvbnMgYW5kIGluaXRpYWxpemUgYmFzZSBjbGFzcyAqL1xuICAgICAgICBzdXBlcihkZWVwTWVyZ2U8dHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdE9wdGlvbnM+KGRlZmF1bHRPcHRpb25zLnR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3QsIGJhc2VPcHRpb25zKSk7XG5cbiAgICAgICAgLyogQXBwbHkgY29tcG9uZW50IGRlZmF1bHRzIGFuZCBpbnN0YW50aWF0ZSBlbmFibGVkIGNvbXBvbmVudHMgKi9cbiAgICAgICAgYXBwbHlEZWZhdWx0cyh0aGlzLCBbeyBjb21wb25lbnQ6IEhvbWVicmV3LCBlbmFibGVkOiBob21lYnJldywgb3B0aW9uczogaG9tZWJyZXdPcHRpb25zIH0sIHsgY29tcG9uZW50OiBNaXNlLCBlbmFibGVkOiBtaXNlLCBvcHRpb25zOiBtaXNlT3B0aW9ucyB9LCB7IGNvbXBvbmVudDogVml0ZXN0LCBlbmFibGVkOiB2aXRlc3QsIG9wdGlvbnM6IHZpdGVzdE9wdGlvbnMgfV0pO1xuICAgIH1cbn0iXX0=
|