jsii-pacmak 1.41.0 → 1.44.1
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/bin/jsii-pacmak.js +15 -2
- package/lib/builder.d.ts +11 -3
- package/lib/builder.js +19 -14
- package/lib/index.d.ts +9 -1
- package/lib/index.js +28 -20
- package/lib/logging.d.ts +3 -1
- package/lib/logging.js +4 -2
- package/lib/npm-modules.d.ts +2 -1
- package/lib/npm-modules.js +1 -1
- package/lib/packaging.js +1 -2
- package/lib/targets/_utils.d.ts +8 -0
- package/lib/targets/_utils.js +1 -1
- package/lib/targets/dotnet/dotnetdocgenerator.d.ts +3 -3
- package/lib/targets/dotnet/dotnetdocgenerator.js +12 -19
- package/lib/targets/dotnet/dotnetgenerator.js +79 -33
- package/lib/targets/index.d.ts +3 -3
- package/lib/targets/index.js +9 -9
- package/lib/targets/java.d.ts +3 -3
- package/lib/targets/java.js +112 -57
- package/lib/targets/python/requirements-dev.txt +2 -2
- package/lib/targets/python.d.ts +5 -4
- package/lib/targets/python.js +76 -41
- package/lib/targets/version-utils.js +2 -2
- package/lib/toposort.d.ts +23 -1
- package/lib/toposort.js +4 -2
- package/lib/util.d.ts +1 -0
- package/lib/util.js +8 -4
- package/lib/version.d.ts +2 -2
- package/lib/version.js +4 -4
- package/package.json +12 -12
package/lib/targets/python.js
CHANGED
|
@@ -204,9 +204,10 @@ function isSortableType(arg) {
|
|
|
204
204
|
return arg.dependsOn !== undefined;
|
|
205
205
|
}
|
|
206
206
|
class BasePythonClassType {
|
|
207
|
-
constructor(generator, pythonName, fqn, opts, docs) {
|
|
207
|
+
constructor(generator, pythonName, spec, fqn, opts, docs) {
|
|
208
208
|
this.generator = generator;
|
|
209
209
|
this.pythonName = pythonName;
|
|
210
|
+
this.spec = spec;
|
|
210
211
|
this.fqn = fqn;
|
|
211
212
|
this.docs = docs;
|
|
212
213
|
this.separateMembers = true;
|
|
@@ -249,11 +250,17 @@ class BasePythonClassType {
|
|
|
249
250
|
addMember(member) {
|
|
250
251
|
this.members.push(member);
|
|
251
252
|
}
|
|
253
|
+
get apiLocation() {
|
|
254
|
+
if (!this.fqn) {
|
|
255
|
+
throw new Error(`Cannot make apiLocation for ${this.pythonName}, does not have FQN`);
|
|
256
|
+
}
|
|
257
|
+
return { api: 'type', fqn: this.fqn };
|
|
258
|
+
}
|
|
252
259
|
emit(code, context) {
|
|
253
260
|
context = nestedContext(context, this.fqn);
|
|
254
261
|
const classParams = this.getClassParams(context);
|
|
255
262
|
openSignature(code, 'class', this.pythonName, classParams);
|
|
256
|
-
this.generator.emitDocString(code, this.docs, {
|
|
263
|
+
this.generator.emitDocString(code, this.apiLocation, this.docs, {
|
|
257
264
|
documentableItem: `class-${this.pythonName}`,
|
|
258
265
|
trailingNewLine: true,
|
|
259
266
|
});
|
|
@@ -299,6 +306,14 @@ class BaseMethod {
|
|
|
299
306
|
this.liftedProp = opts.liftedProp;
|
|
300
307
|
this.parent = opts.parent;
|
|
301
308
|
}
|
|
309
|
+
get apiLocation() {
|
|
310
|
+
var _a;
|
|
311
|
+
return {
|
|
312
|
+
api: 'member',
|
|
313
|
+
fqn: this.parent.fqn,
|
|
314
|
+
memberName: (_a = this.jsName) !== null && _a !== void 0 ? _a : '',
|
|
315
|
+
};
|
|
316
|
+
}
|
|
302
317
|
requiredImports(context) {
|
|
303
318
|
return type_name_1.mergePythonImports(type_name_1.toTypeName(this.returns).requiredImports(context), ...this.parameters.map((param) => type_name_1.toTypeName(param).requiredImports(context)), ...liftedProperties(this.liftedProp));
|
|
304
319
|
function* liftedProperties(struct) {
|
|
@@ -350,6 +365,11 @@ class BaseMethod {
|
|
|
350
365
|
pythonParams.push(`${paramName}: ${paramType}${paramDefault}`);
|
|
351
366
|
}
|
|
352
367
|
const documentableArgs = this.parameters
|
|
368
|
+
.map((p) => ({
|
|
369
|
+
name: p.name,
|
|
370
|
+
docs: p.docs,
|
|
371
|
+
definingType: this.parent,
|
|
372
|
+
}))
|
|
353
373
|
// If there's liftedProps, the last argument is the struct and it won't be _actually_ emitted.
|
|
354
374
|
.filter((_, index) => this.liftedProp != null ? index < this.parameters.length - 1 : true)
|
|
355
375
|
.map((param) => ({
|
|
@@ -369,17 +389,21 @@ class BaseMethod {
|
|
|
369
389
|
pythonParams.push('*');
|
|
370
390
|
// Iterate over all of our props, and reflect them into our params.
|
|
371
391
|
for (const prop of liftedProperties) {
|
|
372
|
-
const paramName = toPythonParameterName(prop.name);
|
|
373
|
-
const paramType = type_name_1.toTypeName(prop).pythonType({
|
|
392
|
+
const paramName = toPythonParameterName(prop.prop.name);
|
|
393
|
+
const paramType = type_name_1.toTypeName(prop.prop).pythonType({
|
|
374
394
|
...context,
|
|
375
395
|
parameterType: true,
|
|
376
396
|
});
|
|
377
|
-
const paramDefault = prop.optional ? ' = None' : '';
|
|
397
|
+
const paramDefault = prop.prop.optional ? ' = None' : '';
|
|
378
398
|
pythonParams.push(`${paramName}: ${paramType}${paramDefault}`);
|
|
379
399
|
}
|
|
380
400
|
}
|
|
381
401
|
// Document them as keyword arguments
|
|
382
|
-
documentableArgs.push(...liftedProperties)
|
|
402
|
+
documentableArgs.push(...liftedProperties.map((p) => ({
|
|
403
|
+
name: p.prop.name,
|
|
404
|
+
docs: p.prop.docs,
|
|
405
|
+
definingType: p.definingType,
|
|
406
|
+
})));
|
|
383
407
|
}
|
|
384
408
|
else if (this.parameters.length >= 1 &&
|
|
385
409
|
this.parameters[this.parameters.length - 1].variadic) {
|
|
@@ -413,7 +437,7 @@ class BaseMethod {
|
|
|
413
437
|
}
|
|
414
438
|
pythonParams.unshift(slugifyAsNeeded(this.implicitParameter, pythonParams.map((param) => param.split(':')[0].trim())));
|
|
415
439
|
openSignature(code, 'def', this.pythonName, pythonParams, false, returnType);
|
|
416
|
-
this.generator.emitDocString(code, this.docs, {
|
|
440
|
+
this.generator.emitDocString(code, this.apiLocation, this.docs, {
|
|
417
441
|
arguments: documentableArgs,
|
|
418
442
|
documentableItem: `method-${this.pythonName}`,
|
|
419
443
|
});
|
|
@@ -441,7 +465,7 @@ class BaseMethod {
|
|
|
441
465
|
});
|
|
442
466
|
// We need to build up a list of properties, which are mandatory, these are the
|
|
443
467
|
// ones we will specifiy to start with in our dictionary literal.
|
|
444
|
-
const liftedProps = this.getLiftedProperties(context.resolver).map((p) => new StructField(this.generator, p));
|
|
468
|
+
const liftedProps = this.getLiftedProperties(context.resolver).map((p) => new StructField(this.generator, p.prop, p.definingType));
|
|
445
469
|
const assignments = liftedProps
|
|
446
470
|
.map((p) => p.pythonName)
|
|
447
471
|
.map((v) => `${v}=${v}`);
|
|
@@ -507,7 +531,7 @@ class BaseMethod {
|
|
|
507
531
|
if (knownProps.has(prop.name)) {
|
|
508
532
|
continue;
|
|
509
533
|
}
|
|
510
|
-
liftedProperties.push(prop);
|
|
534
|
+
liftedProperties.push({ prop, definingType: current });
|
|
511
535
|
knownProps.add(prop.name);
|
|
512
536
|
}
|
|
513
537
|
}
|
|
@@ -527,6 +551,10 @@ class BaseProperty {
|
|
|
527
551
|
this.abstract = abstract;
|
|
528
552
|
this.immutable = immutable;
|
|
529
553
|
this.isStatic = isStatic;
|
|
554
|
+
this.parent = opts.parent;
|
|
555
|
+
}
|
|
556
|
+
get apiLocation() {
|
|
557
|
+
return { api: 'member', fqn: this.parent.fqn, memberName: this.jsName };
|
|
530
558
|
}
|
|
531
559
|
requiredImports(context) {
|
|
532
560
|
return type_name_1.toTypeName(this.type).requiredImports(context);
|
|
@@ -541,7 +569,7 @@ class BaseProperty {
|
|
|
541
569
|
code.line('@abc.abstractmethod');
|
|
542
570
|
}
|
|
543
571
|
openSignature(code, 'def', this.pythonName, [this.implicitParameter], true, pythonType);
|
|
544
|
-
this.generator.emitDocString(code, this.docs, {
|
|
572
|
+
this.generator.emitDocString(code, this.apiLocation, this.docs, {
|
|
545
573
|
documentableItem: `prop-${this.pythonName}`,
|
|
546
574
|
});
|
|
547
575
|
if ((this.shouldEmitBody || forceEmitBody) &&
|
|
@@ -586,7 +614,7 @@ class Interface extends BasePythonClassType {
|
|
|
586
614
|
typeAnnotation: false,
|
|
587
615
|
})}) # type: ignore[misc]`);
|
|
588
616
|
openSignature(code, 'class', this.proxyClassName, proxyBases);
|
|
589
|
-
this.generator.emitDocString(code, this.docs, {
|
|
617
|
+
this.generator.emitDocString(code, this.apiLocation, this.docs, {
|
|
590
618
|
documentableItem: `class-${this.pythonName}`,
|
|
591
619
|
trailingNewLine: true,
|
|
592
620
|
});
|
|
@@ -678,7 +706,7 @@ class Struct extends BasePythonClassType {
|
|
|
678
706
|
* Find all fields (inherited as well)
|
|
679
707
|
*/
|
|
680
708
|
get allMembers() {
|
|
681
|
-
return this.thisInterface.allProperties.map((x) => new StructField(this.generator, x.spec));
|
|
709
|
+
return this.thisInterface.allProperties.map((x) => new StructField(this.generator, x.spec, x.definingType.spec));
|
|
682
710
|
}
|
|
683
711
|
get thisInterface() {
|
|
684
712
|
if (this.fqn == null) {
|
|
@@ -722,8 +750,9 @@ class Struct extends BasePythonClassType {
|
|
|
722
750
|
const args = this.allMembers.map((m) => ({
|
|
723
751
|
name: m.pythonName,
|
|
724
752
|
docs: m.docs,
|
|
753
|
+
definingType: this.spec,
|
|
725
754
|
}));
|
|
726
|
-
this.generator.emitDocString(code, this.docs, {
|
|
755
|
+
this.generator.emitDocString(code, this.apiLocation, this.docs, {
|
|
727
756
|
arguments: args,
|
|
728
757
|
documentableItem: `class-${this.pythonName}`,
|
|
729
758
|
});
|
|
@@ -766,14 +795,22 @@ class Struct extends BasePythonClassType {
|
|
|
766
795
|
}
|
|
767
796
|
}
|
|
768
797
|
class StructField {
|
|
769
|
-
constructor(generator, prop) {
|
|
798
|
+
constructor(generator, prop, definingType) {
|
|
770
799
|
this.generator = generator;
|
|
771
800
|
this.prop = prop;
|
|
801
|
+
this.definingType = definingType;
|
|
772
802
|
this.pythonName = toPythonPropertyName(prop.name);
|
|
773
803
|
this.jsiiName = prop.name;
|
|
774
804
|
this.type = prop;
|
|
775
805
|
this.docs = prop.docs;
|
|
776
806
|
}
|
|
807
|
+
get apiLocation() {
|
|
808
|
+
return {
|
|
809
|
+
api: 'member',
|
|
810
|
+
fqn: this.definingType.fqn,
|
|
811
|
+
memberName: this.jsiiName,
|
|
812
|
+
};
|
|
813
|
+
}
|
|
777
814
|
get optional() {
|
|
778
815
|
return !!this.type.optional;
|
|
779
816
|
}
|
|
@@ -797,7 +834,7 @@ class StructField {
|
|
|
797
834
|
return type_name_1.toTypeName(this.type).pythonType(context);
|
|
798
835
|
}
|
|
799
836
|
emitDocString(code) {
|
|
800
|
-
this.generator.emitDocString(code, this.docs, {
|
|
837
|
+
this.generator.emitDocString(code, this.apiLocation, this.docs, {
|
|
801
838
|
documentableItem: `prop-${this.pythonName}`,
|
|
802
839
|
});
|
|
803
840
|
}
|
|
@@ -808,8 +845,8 @@ class StructField {
|
|
|
808
845
|
}
|
|
809
846
|
}
|
|
810
847
|
class Class extends BasePythonClassType {
|
|
811
|
-
constructor(generator, name, fqn, opts, docs) {
|
|
812
|
-
super(generator, name, fqn, opts, docs);
|
|
848
|
+
constructor(generator, name, spec, fqn, opts, docs) {
|
|
849
|
+
super(generator, name, spec, fqn, opts, docs);
|
|
813
850
|
const { abstract = false, interfaces = [], abstractBases = [] } = opts;
|
|
814
851
|
this.abstract = abstract;
|
|
815
852
|
this.interfaces = interfaces;
|
|
@@ -974,20 +1011,24 @@ class Enum extends BasePythonClassType {
|
|
|
974
1011
|
}
|
|
975
1012
|
}
|
|
976
1013
|
class EnumMember {
|
|
977
|
-
constructor(generator, pythonName, value, docs) {
|
|
1014
|
+
constructor(generator, pythonName, value, docs, parent) {
|
|
978
1015
|
this.generator = generator;
|
|
979
1016
|
this.pythonName = pythonName;
|
|
980
1017
|
this.value = value;
|
|
981
1018
|
this.docs = docs;
|
|
1019
|
+
this.parent = parent;
|
|
982
1020
|
this.pythonName = pythonName;
|
|
983
1021
|
this.value = value;
|
|
984
1022
|
}
|
|
1023
|
+
get apiLocation() {
|
|
1024
|
+
return { api: 'member', fqn: this.parent.fqn, memberName: this.value };
|
|
1025
|
+
}
|
|
985
1026
|
dependsOnModules() {
|
|
986
1027
|
return new Set();
|
|
987
1028
|
}
|
|
988
1029
|
emit(code, _context) {
|
|
989
1030
|
code.line(`${this.pythonName} = "${this.value}"`);
|
|
990
|
-
this.generator.emitDocString(code, this.docs, {
|
|
1031
|
+
this.generator.emitDocString(code, this.apiLocation, this.docs, {
|
|
991
1032
|
documentableItem: `enum-${this.pythonName}`,
|
|
992
1033
|
});
|
|
993
1034
|
}
|
|
@@ -1483,7 +1524,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1483
1524
|
this.types = new Map();
|
|
1484
1525
|
}
|
|
1485
1526
|
// eslint-disable-next-line complexity
|
|
1486
|
-
emitDocString(code, docs, options = {}) {
|
|
1527
|
+
emitDocString(code, apiLocation, docs, options = {}) {
|
|
1487
1528
|
var _a, _b, _c, _d;
|
|
1488
1529
|
if ((!docs || Object.keys(docs).length === 0) && !options.arguments) {
|
|
1489
1530
|
return;
|
|
@@ -1525,7 +1566,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1525
1566
|
}
|
|
1526
1567
|
if (docs.remarks) {
|
|
1527
1568
|
brk();
|
|
1528
|
-
lines.push(...markdown_1.md2rst(this.convertMarkdown((_a = docs.remarks) !== null && _a !== void 0 ? _a : '')).split('\n'));
|
|
1569
|
+
lines.push(...markdown_1.md2rst(this.convertMarkdown((_a = docs.remarks) !== null && _a !== void 0 ? _a : '', apiLocation)).split('\n'));
|
|
1529
1570
|
brk();
|
|
1530
1571
|
}
|
|
1531
1572
|
if ((_c = (_b = options.arguments) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0 > 0) {
|
|
@@ -1562,7 +1603,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1562
1603
|
brk();
|
|
1563
1604
|
lines.push('Example::');
|
|
1564
1605
|
lines.push('');
|
|
1565
|
-
const exampleText = this.convertExample(docs.example);
|
|
1606
|
+
const exampleText = this.convertExample(docs.example, apiLocation);
|
|
1566
1607
|
for (const line of exampleText.split('\n')) {
|
|
1567
1608
|
lines.push(` ${line}`);
|
|
1568
1609
|
}
|
|
@@ -1589,24 +1630,17 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1589
1630
|
code.line();
|
|
1590
1631
|
}
|
|
1591
1632
|
}
|
|
1592
|
-
convertExample(example) {
|
|
1593
|
-
const
|
|
1594
|
-
const translated = this.rosetta.translateSnippet(snippet, jsii_rosetta_1.TargetLanguage.PYTHON);
|
|
1595
|
-
if (!translated) {
|
|
1596
|
-
return example;
|
|
1597
|
-
}
|
|
1633
|
+
convertExample(example, apiLoc) {
|
|
1634
|
+
const translated = this.rosetta.translateExample(apiLoc, example, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly));
|
|
1598
1635
|
return this.prefixDisclaimer(translated);
|
|
1599
1636
|
}
|
|
1600
|
-
convertMarkdown(markdown) {
|
|
1601
|
-
return this.rosetta.translateSnippetsInMarkdown(markdown, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly), (trans) => ({
|
|
1637
|
+
convertMarkdown(markdown, apiLoc) {
|
|
1638
|
+
return this.rosetta.translateSnippetsInMarkdown(apiLoc, markdown, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly), (trans) => ({
|
|
1602
1639
|
language: trans.language,
|
|
1603
1640
|
source: this.prefixDisclaimer(trans),
|
|
1604
1641
|
}));
|
|
1605
1642
|
}
|
|
1606
1643
|
prefixDisclaimer(translated) {
|
|
1607
|
-
if (translated.didCompile && _1.INCOMPLETE_DISCLAIMER_COMPILING) {
|
|
1608
|
-
return `# ${_1.INCOMPLETE_DISCLAIMER_COMPILING}\n${translated.source}`;
|
|
1609
|
-
}
|
|
1610
1644
|
if (!translated.didCompile && _1.INCOMPLETE_DISCLAIMER_NONCOMPILING) {
|
|
1611
1645
|
return `# ${_1.INCOMPLETE_DISCLAIMER_NONCOMPILING}\n${translated.source}`;
|
|
1612
1646
|
}
|
|
@@ -1652,11 +1686,12 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1652
1686
|
const submoduleLike = ns === this.assembly.name
|
|
1653
1687
|
? this.assembly
|
|
1654
1688
|
: (_a = this.assembly.submodules) === null || _a === void 0 ? void 0 : _a[ns];
|
|
1689
|
+
const readmeLocation = { api: 'moduleReadme', moduleFqn: ns };
|
|
1655
1690
|
const module = new PythonModule(type_name_1.toPackageName(ns, this.assembly), ns, {
|
|
1656
1691
|
assembly: this.assembly,
|
|
1657
1692
|
assemblyFilename: this.getAssemblyFileName(),
|
|
1658
1693
|
package: this.package,
|
|
1659
|
-
moduleDocumentation: (submoduleLike === null || submoduleLike === void 0 ? void 0 : submoduleLike.readme) ? this.convertMarkdown((_b = submoduleLike.readme) === null || _b === void 0 ? void 0 : _b.markdown).trim()
|
|
1694
|
+
moduleDocumentation: (submoduleLike === null || submoduleLike === void 0 ? void 0 : submoduleLike.readme) ? this.convertMarkdown((_b = submoduleLike.readme) === null || _b === void 0 ? void 0 : _b.markdown, readmeLocation).trim()
|
|
1660
1695
|
: undefined,
|
|
1661
1696
|
});
|
|
1662
1697
|
this.package.addModule(module);
|
|
@@ -1679,7 +1714,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1679
1714
|
}
|
|
1680
1715
|
onBeginClass(cls, abstract) {
|
|
1681
1716
|
var _a;
|
|
1682
|
-
const klass = new Class(this, util_2.toPythonIdentifier(cls.name), cls.fqn, {
|
|
1717
|
+
const klass = new Class(this, util_2.toPythonIdentifier(cls.name), cls, cls.fqn, {
|
|
1683
1718
|
abstract,
|
|
1684
1719
|
bases: cls.base ? [this.findType(cls.base)] : undefined,
|
|
1685
1720
|
interfaces: (_a = cls.interfaces) === null || _a === void 0 ? void 0 : _a.map((base) => this.findType(base)),
|
|
@@ -1741,10 +1776,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1741
1776
|
var _a, _b;
|
|
1742
1777
|
let iface;
|
|
1743
1778
|
if (ifc.datatype) {
|
|
1744
|
-
iface = new Struct(this, util_2.toPythonIdentifier(ifc.name), ifc.fqn, { bases: (_a = ifc.interfaces) === null || _a === void 0 ? void 0 : _a.map((base) => this.findType(base)) }, ifc.docs);
|
|
1779
|
+
iface = new Struct(this, util_2.toPythonIdentifier(ifc.name), ifc, ifc.fqn, { bases: (_a = ifc.interfaces) === null || _a === void 0 ? void 0 : _a.map((base) => this.findType(base)) }, ifc.docs);
|
|
1745
1780
|
}
|
|
1746
1781
|
else {
|
|
1747
|
-
iface = new Interface(this, util_2.toPythonIdentifier(ifc.name), ifc.fqn, { bases: (_b = ifc.interfaces) === null || _b === void 0 ? void 0 : _b.map((base) => this.findType(base)) }, ifc.docs);
|
|
1782
|
+
iface = new Interface(this, util_2.toPythonIdentifier(ifc.name), ifc, ifc.fqn, { bases: (_b = ifc.interfaces) === null || _b === void 0 ? void 0 : _b.map((base) => this.findType(base)) }, ifc.docs);
|
|
1748
1783
|
}
|
|
1749
1784
|
this.addPythonType(iface);
|
|
1750
1785
|
}
|
|
@@ -1758,7 +1793,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1758
1793
|
onInterfaceProperty(ifc, prop) {
|
|
1759
1794
|
let ifaceProperty;
|
|
1760
1795
|
if (ifc.datatype) {
|
|
1761
|
-
ifaceProperty = new StructField(this, prop);
|
|
1796
|
+
ifaceProperty = new StructField(this, prop, ifc);
|
|
1762
1797
|
}
|
|
1763
1798
|
else {
|
|
1764
1799
|
ifaceProperty = new InterfaceProperty(this, toPythonPropertyName(prop.name, prop.const, prop.protected), prop.name, prop, prop.docs, { immutable: prop.immutable, isStatic: prop.static, parent: ifc });
|
|
@@ -1766,10 +1801,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1766
1801
|
this.getPythonType(ifc.fqn).addMember(ifaceProperty);
|
|
1767
1802
|
}
|
|
1768
1803
|
onBeginEnum(enm) {
|
|
1769
|
-
this.addPythonType(new Enum(this, util_2.toPythonIdentifier(enm.name), enm.fqn, {}, enm.docs));
|
|
1804
|
+
this.addPythonType(new Enum(this, util_2.toPythonIdentifier(enm.name), enm, enm.fqn, {}, enm.docs));
|
|
1770
1805
|
}
|
|
1771
1806
|
onEnumMember(enm, member) {
|
|
1772
|
-
this.getPythonType(enm.fqn).addMember(new EnumMember(this, util_2.toPythonIdentifier(member.name), member.name, member.docs));
|
|
1807
|
+
this.getPythonType(enm.fqn).addMember(new EnumMember(this, util_2.toPythonIdentifier(member.name), member.name, member.docs, enm));
|
|
1773
1808
|
}
|
|
1774
1809
|
onInterfaceMethodOverload(_ifc, _overload, _originalMethod) {
|
|
1775
1810
|
throw new Error('Unhandled Type: InterfaceMethodOverload');
|
|
@@ -2031,4 +2066,4 @@ function nestedContext(context, fqn) {
|
|
|
2031
2066
|
};
|
|
2032
2067
|
}
|
|
2033
2068
|
const isDeprecated = (x) => { var _a; return ((_a = x.docs) === null || _a === void 0 ? void 0 : _a.deprecated) !== undefined; };
|
|
2034
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FNc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQXlDO0FBQ3pDLGtEQU00QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLHdCQUlXO0FBRVgsb0dBQW9HO0FBQ3BHLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDbkMsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsQ0FDdkIsQ0FBQztBQUVGLDJFQUEyRTtBQUMzRSwrRkFBK0Y7QUFDL0YsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0IsTUFBcUIsTUFBTyxTQUFRLGVBQU07SUFHeEMsWUFBbUIsT0FBc0I7UUFDdkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBYyxFQUFFLE9BQWU7UUFDdkQsTUFBTSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFpQixFQUFFLE1BQWM7UUFDbEQsNkJBQTZCO1FBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMs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Q0FBQyxHQUFHLE9BQUMsT0FBTyxDQUFDLG1CQUFtQixtQ0FBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDL0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUI7S0FDbEMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQWEsRUFBRSxFQUFFLFdBQUMsT0FBQSxPQUFBLENBQUMsQ0FBQyxJQUFJLDBDQUFFLFVBQVUsTUFBSyxTQUFTLENBQUEsRUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQ29kZU1ha2VyLCB0b1NuYWtlQ2FzZSB9IGZyb20gJ2NvZGVtYWtlcic7XG5pbXBvcnQgKiBhcyBlc2NhcGVTdHJpbmdSZWdleHAgZnJvbSAnZXNjYXBlLXN0cmluZy1yZWdleHAnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHtcbiAgVGFyZ2V0TGFuZ3VhZ2UsXG4gIFRyYW5zbGF0aW9uLFxuICBSb3NldHRhLFxuICBlbmZvcmNlc1N0cmljdE1vZGUsXG4gIHR5cGVTY3JpcHRTbmlwcGV0RnJvbVNvdXJjZSxcbn0gZnJvbSAnanNpaS1yb3NldHRhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEdlbmVyYXRvciwgR2VuZXJhdG9yT3B0aW9ucyB9IGZyb20gJy4uL2dlbmVyYXRvcic7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQgeyBtZDJyc3QgfSBmcm9tICcuLi9tYXJrZG93bic7XG5pbXBvcnQgeyBUYXJnZXQsIFRhcmdldE9wdGlvbnMgfSBmcm9tICcuLi90YXJnZXQnO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IHJlbmRlclN1bW1hcnkgfSBmcm9tICcuL191dGlscyc7XG5pbXBvcnQge1xuICBOYW1pbmdDb250ZXh0LFxuICB0b1R5cGVOYW1lLFxuICBQeXRob25JbXBvcnRzLFxuICBtZXJnZVB5dGhvbkltcG9ydHMsXG4gIHRvUGFja2FnZU5hbWUsXG59IGZyb20gJy4vcHl0aG9uL3R5cGUtbmFtZSc7XG5pbXBvcnQgeyBkaWUsIHRvUHl0aG9uSWRlbnRpZmllciB9IGZyb20gJy4vcHl0aG9uL3V0aWwnO1xuaW1wb3J0IHsgdG9QeXRob25WZXJzaW9uUmFuZ2UsIHRvUmVsZWFzZVZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24tdXRpbHMnO1xuXG5pbXBvcnQge1xuICBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfQ09NUElMSU5HLFxuICBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HLFxuICBUYXJnZXROYW1lLFxufSBmcm9tICcuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgcmVxdWlyZW1lbnRzRmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgX19kaXJuYW1lLFxuICAncHl0aG9uJyxcbiAgJ3JlcXVpcmVtZW50cy1kZXYudHh0Jyxcbik7XG5cbi8vIHdlIHVzZSBzaW5nbGUtcXVvdGVzIGZvciBtdWx0aS1saW5lIHN0cmluZ3MgdG8gYWxsb3cgZXhhbXBsZXMgd2l0aGluIHRoZVxuLy8gZG9jc3RyaW5ncyB0aGVtc2VsdmVzIHRvIGluY2x1ZGUgZG91YmxlLXF1b3RlcyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjU2OSlcbmNvbnN0IERPQ1NUUklOR19RVU9URVMgPSBcIicnJ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQeXRob24gZXh0ZW5kcyBUYXJnZXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IFB5dGhvbkdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ29kZShvdXREaXI6IHN0cmluZywgdGFyYmFsbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZ2VuZXJhdGVDb2RlKG91dERpciwgdGFyYmFsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoc291cmNlRGlyOiBzdHJpbmcsIG91dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggdmlydHVhbCBlbnZcbiAgICBjb25zdCB2ZW52ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4oc291cmNlRGlyLCAnLmVudi0nKSk7XG4gICAgY29uc3QgdmVudkJpbiA9IHBhdGguam9pbihcbiAgICAgIHZlbnYsXG4gICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ1NjcmlwdHMnIDogJ2JpbicsXG4gICAgKTtcbiAgICBhd2FpdCBzaGVsbCgncHl0aG9uMycsIFtcbiAgICAgICctbScsXG4gICAgICAndmVudicsXG4gICAgICAnLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlcycsIC8vIEFsbG93IHVzaW5nIGdsb2JhbGx5IGluc3RhbGxlZCBwYWNrYWdlcyAoc2F2ZXMgdGltZSAmIGRpc2sgc3BhY2UpXG4gICAgICB2ZW52LFxuICAgIF0pO1xuICAgIGNvbnN0IGVudiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgUEFUSDogYCR7dmVudkJpbn06JHtwcm9jZXNzLmVudi5QQVRIfWAsXG4gICAgICBWSVJUVUFMX0VOVjogdmVudixcbiAgICB9O1xuICAgIGNvbnN0IHB5dGhvbiA9IHBhdGguam9pbih2ZW52QmluLCAncHl0aG9uJyk7XG5cbiAgICAvLyBJbnN0YWxsIHRoZSBuZWNlc3NhcnkgdGhpbmdzXG4gICAgYXdhaXQgc2hlbGwoXG4gICAgICBweXRob24sXG4gICAgICBbJy1tJywgJ3BpcCcsICdpbnN0YWxsJywgJy0tbm8taW5wdXQnLCAnLXInLCByZXF1aXJlbWVudHNGaWxlXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICAgIGVudixcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFjdHVhbGx5IHBhY2thZ2UgdXAgb3VyIGNvZGUsIGJvdGggYXMgYSBzZGlzdCBhbmQgYSB3aGVlbCBmb3IgcHVibGlzaGluZy5cbiAgICBhd2FpdCBzaGVsbChweXRob24sIFsnc2V0dXAucHknLCAnc2Rpc3QnLCAnLS1kaXN0LWRpcicsIG91dERpcl0sIHtcbiAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgZW52LFxuICAgIH0pO1xuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgcHl0aG9uLFxuICAgICAgWyctbScsICdwaXAnLCAnd2hlZWwnLCAnLS1uby1kZXBzJywgJy0td2hlZWwtZGlyJywgb3V0RGlyLCBzb3VyY2VEaXJdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52LFxuICAgICAgICByZXRyeTogeyBtYXhBdHRlbXB0czogNSB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHNoZWxsKHB5dGhvbiwgWyctbScsICd0d2luZScsICdjaGVjaycsIHBhdGguam9pbihvdXREaXIsICcqJyldLCB7XG4gICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgIGVudixcbiAgICB9KTtcbiAgfVxufVxuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICMgQ09ERSBHRU5FUkFUT1IgI1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmludGVyZmFjZSBFbWl0Q29udGV4dCBleHRlbmRzIE5hbWluZ0NvbnRleHQge1xuICAvKiogQGRlcHJlY2F0ZWQgVGhlIFR5cGVSZXNvbHZlciAqL1xuICByZWFkb25seSByZXNvbHZlcjogVHlwZVJlc29sdmVyO1xufVxuXG5jb25zdCBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gcGF0aC5qb2luKC4uLm5hbWUuc3BsaXQoJy4nKSk7XG59O1xuXG5jb25zdCB0b1B5dGhvbk1ldGhvZE5hbWUgPSAobmFtZTogc3RyaW5nLCBwcm90ZWN0ZWRJdGVtID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xuICBsZXQgdmFsdWUgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgdG9QeXRob25Qcm9wZXJ0eU5hbWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgY29uc3RhbnQgPSBmYWxzZSxcbiAgcHJvdGVjdGVkSXRlbSA9IGZhbHNlLFxuKTogc3RyaW5nID0+IHtcbiAgbGV0IHZhbHVlID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcblxuICBpZiAoY29uc3RhbnQpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZ2l2ZW4gc2lnbmF0dXJlJ3MgcGFyYW1ldGVyIG5hbWUgdG8gd2hhdCBzaG91bGQgYmUgZW1pdHRlZCBpbiBQeXRob24uIEl0IHNsdWdpZmllcyB0aGVcbiAqIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG5hbWVzIHRoYXQgY29sbGlkZSB3aXRoIGEgbGlmdGVkIHByb3AgYnkgYXBwZW5kaW5nIHRyYWlsaW5nIGBfYC4gVGhlcmUgaXMgbm9cbiAqIHJpc2sgb2YgY29uZmxpY3Rpbmcgd2l0aCBhbiBvdGhlciBwb3NpdGlvbmFsIHBhcmFtZXRlciB0aGF0IGVuZHMgd2l0aCBhIGBfYCBjaGFyYWN0ZXIgYmVjYXVzZVxuICogdGhpcyBpcyBwcm9oaWJpdGVkIGJ5IHRoZSBganNpaWAgY29tcGlsZXIgKHBhcmFtZXRlciBuYW1lcyBNVVNUIGJlIGNhbWVsQ2FzZSwgYW5kIG9ubHkgYSBzaW5nbGVcbiAqIGBfYCBpcyBwZXJtaXR0ZWQgd2hlbiBpdCBpcyBvbiAqKmxlYWRpbmcqKiBwb3NpdGlvbilcbiAqXG4gKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0aGF0IG5lZWRzIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gbGlmdGVkUGFyYW1OYW1lcyAgdGhlIGxpc3Qgb2YgXCJsaWZ0ZWRcIiBrZXl3b3JkIHBhcmFtZXRlcnMgaW4gdGhpcyBzaWduYXR1cmUuIFRoaXMgbXVzdCBiZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQgd2hlbiBnZW5lcmF0aW5nIGEgbmFtZSBmb3IgYSBwYXJhbWV0ZXIgdGhhdCAqKmlzKiogbGlmdGVkLlxuICovXG5mdW5jdGlvbiB0b1B5dGhvblBhcmFtZXRlck5hbWUoXG4gIG5hbWU6IHN0cmluZyxcbiAgbGlmdGVkUGFyYW1OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG5cbiAgd2hpbGUgKGxpZnRlZFBhcmFtTmFtZXMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXN1bHQgKz0gJ18nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgc2V0RGlmZmVyZW5jZSA9IDxUPihzZXRBOiBTZXQ8VD4sIHNldEI6IFNldDxUPik6IFNldDxUPiA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8VD4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHNldEEpIHtcbiAgICBpZiAoIXNldEIuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQcmVwYXJlIHB5dGhvbiBtZW1iZXJzIGZvciBlbWlzc2lvbi5cbiAqXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lLCB0aGV5IHdpbGwgYWxsIG1hcCB0byB0aGUgc2FtZSBweXRob25cbiAqIG5hbWUsIHNvIHdlIHdpbGwgZmlsdGVyIGFsbCBkZXByZWNhdGVkIG1lbWJlcnMgYW5kIGV4cGVjdCB0aGF0IHRoZXJlIHdpbGwgYmUgb25seSBvbmVcbiAqIGxlZnQuXG4gKlxuICogUmV0dXJucyB0aGUgbWVtYmVycyBpbiBhIHNvcnRlZCBsaXN0LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTWVtYmVycyhtZW1iZXJzOiBQeXRob25CYXNlW10sIHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpIHtcbiAgLy8gY3JlYXRlIGEgbWFwIGZyb20gcHl0aG9uIG5hbWUgdG8gbGlzdCBvZiBtZW1iZXJzXG4gIGNvbnN0IG1hcDogeyBbcHl0aG9uTmFtZTogc3RyaW5nXTogUHl0aG9uQmFzZVtdIH0gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lbWJlcnMpIHtcbiAgICBsZXQgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdO1xuICAgIGlmICghbGlzdCkge1xuICAgICAgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdID0gW107XG4gICAgfVxuXG4gICAgbGlzdC5wdXNoKG0pO1xuICB9XG5cbiAgLy8gbm93IHJldHVybiBhbGwgdGhlIG1lbWJlcnNcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgbGlzdF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgIGxldCBtZW1iZXI7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgbWVtYmVyIGZvciB0aGlzIG5vcm1hbGl6ZWQgbmFtZSwgdGhlbiB1c2UgaXRcbiAgICAgIG1lbWJlciA9IGxpc3RbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlIGZvdW5kIG1vcmUgdGhhbiBvbmUgbWVtYmVyIHdpdGggdGhlIHNhbWUgcHl0aG9uIG5hbWUsIGZpbHRlciBhbGxcbiAgICAgIC8vIGRlcHJlY2F0ZWQgdmVyc2lvbnMgYW5kIGNoZWNrIHRoYXQgd2UgYXJlIGxlZnQgd2l0aCBleGFjdGx5IG9uZS5cbiAgICAgIC8vIG90aGVyd2lzZSwgdGhleSB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yNTA4XG4gICAgICBjb25zdCBub25EZXByZWNhdGVkID0gbGlzdC5maWx0ZXIoKHgpID0+ICFpc0RlcHJlY2F0ZWQoeCkpO1xuICAgICAgaWYgKG5vbkRlcHJlY2F0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG5vbi1kZXByZWNhdGVkIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub25EZXByZWNhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cIiwgYnV0IGFsbCBvZiB0aGVtIGFyZSBkZXByZWNhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWVtYmVyID0gbm9uRGVwcmVjYXRlZFswXTtcbiAgICB9XG5cbiAgICByZXQucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcmV0dXJuIHNvcnRNZW1iZXJzKHJldCwgcmVzb2x2ZXIpO1xufVxuXG5jb25zdCBzb3J0TWVtYmVycyA9IChcbiAgbWVtYmVyczogUHl0aG9uQmFzZVtdLFxuICByZXNvbHZlcjogVHlwZVJlc29sdmVyLFxuKTogUHl0aG9uQmFzZVtdID0+IHtcbiAgbGV0IHNvcnRhYmxlID0gbmV3IEFycmF5PHtcbiAgICBtZW1iZXI6IFB5dGhvbkJhc2UgJiBJU29ydGFibGVUeXBlO1xuICAgIGRlcGVuZHNPbjogU2V0PFB5dGhvblR5cGU+O1xuICB9PigpO1xuICBjb25zdCBzb3J0ZWQgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8UHl0aG9uQmFzZT4oKTtcblxuICAvLyBUaGUgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBkbywgaXMgcHVzaCBhbnkgaXRlbSB3aGljaCBpcyBub3Qgc29ydGFibGUgdG8gdGhlIHZlcnlcbiAgLy8gZnJvbnQgb2YgdGhlIGxpc3QuIFRoaXMgd2lsbCBiZSB0aGluZ3MgbGlrZSBtZXRob2RzLCBwcm9wZXJ0aWVzLCBldGMuXG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICBpZiAoIWlzU29ydGFibGVUeXBlKG1lbWJlcikpIHtcbiAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICBzZWVuLmFkZChtZW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3J0YWJsZS5wdXNoKHsgbWVtYmVyLCBkZXBlbmRzT246IG5ldyBTZXQobWVtYmVyLmRlcGVuZHNPbihyZXNvbHZlcikpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB0aGF0IHdlJ3ZlIHB1bGxlZCBvdXQgZXZlcnl0aGluZyB0aGF0IGNvdWxkbid0IHBvc3NpYmx5IGhhdmUgZGVwZW5kZW5jaWVzLFxuICAvLyB3ZSB3aWxsIGdvIHRocm91Z2ggdGhlIHJlbWFpbmluZyBpdGVtcywgYW5kIHB1bGwgb2ZmIGFueSBpdGVtcyB3aGljaCBoYXZlIG5vXG4gIC8vIGRlcGVuZGVuY2llcyB0aGF0IHdlIGhhdmVuJ3QgYWxyZWFkeSBzb3J0ZWQuXG4gIHdoaWxlIChzb3J0YWJsZS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCB7IG1lbWJlciwgZGVwZW5kc09uIH0gb2Ygc29ydGFibGUpIHtcbiAgICAgIGNvbnN0IGRpZmYgPSBzZXREaWZmZXJlbmNlKGRlcGVuZHNPbiwgc2Vlbik7XG4gICAgICBpZiAoWy4uLmRpZmZdLmZpbmQoKGRlcCkgPT4gIShkZXAgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSA9PSBudWxsKSB7XG4gICAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICAgIHNlZW4uYWRkKG1lbWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdG92ZXIgPSBzb3J0YWJsZS5maWx0ZXIoKHsgbWVtYmVyIH0pID0+ICFzZWVuLmhhcyhtZW1iZXIpKTtcbiAgICBpZiAobGVmdG92ZXIubGVuZ3RoID09PSBzb3J0YWJsZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBzb3J0IG1lbWJlcnMgKGNpcmN1bGFyIGRlcGVuZGVuY3k/KS4gTGVmdG92ZXI6ICR7bGVmdG92ZXJcbiAgICAgICAgICAubWFwKChsbykgPT4gbG8ubWVtYmVyLnB5dGhvbk5hbWUpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvcnRhYmxlID0gbGVmdG92ZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNvcnRlZDtcbn07XG5cbmludGVyZmFjZSBQeXRob25CYXNlIHtcbiAgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuXG4gIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCwgb3B0cz86IGFueSk6IHZvaWQ7XG5cbiAgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cztcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGUgZXh0ZW5kcyBQeXRob25CYXNlIHtcbiAgLy8gVGhlIEpTSUkgRlFOIGZvciB0aGlzIGl0ZW0sIGlmIHRoaXMgaXRlbSBkb2Vzbid0IGV4aXN0IGFzIGEgSlNJSSB0eXBlLCB0aGVuIGl0XG4gIC8vIGRvZXNuJ3QgaGF2ZSBhIEZRTiBhbmQgaXQgc2hvdWxkIGJlIG51bGw7XG4gIHJlYWRvbmx5IGZxbj86IHN0cmluZztcblxuICBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTb3J0YWJsZVR5cGUge1xuICBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXTtcbn1cblxuZnVuY3Rpb24gaXNTb3J0YWJsZVR5cGUoYXJnOiB1bmtub3duKTogYXJnIGlzIElTb3J0YWJsZVR5cGUge1xuICByZXR1cm4gKGFyZyBhcyBQYXJ0aWFsPElTb3J0YWJsZVR5cGU+KS5kZXBlbmRzT24gIT09IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGVPcHRzIHtcbiAgYmFzZXM/OiBzcGVjLlR5cGVSZWZlcmVuY2VbXTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZVB5dGhvbkNsYXNzVHlwZSBpbXBsZW1lbnRzIFB5dGhvblR5cGUsIElTb3J0YWJsZVR5cGUge1xuICBwcm90ZWN0ZWQgYmFzZXM6IHNwZWMuVHlwZVJlZmVyZW5jZVtdO1xuICBwcm90ZWN0ZWQgbWVtYmVyczogUHl0aG9uQmFzZVtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VwYXJhdGVNZW1iZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IFB5dGhvblR5cGVPcHRzLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGNvbnN0IHsgYmFzZXMgPSBbXSB9ID0gb3B0cztcblxuICAgIHRoaXMuYmFzZXMgPSBiYXNlcztcbiAgICB0aGlzLm1lbWJlcnMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5PFB5dGhvblR5cGU+KCk7XG4gICAgY29uc3QgcGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KHRoaXMuZnFuISk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJldHVybiBhbnkgYmFzZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgbW9kdWxlIGF0IHRoZSBzYW1lIGxldmVsIG9mXG4gICAgLy8gbmVzdGluZy5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBiYXNlIG9mIHRoaXMuYmFzZXMpIHtcbiAgICAgIGlmIChzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKGJhc2UpKSB7XG4gICAgICAgIGlmIChyZXNvbHZlci5pc0luTW9kdWxlKGJhc2UpKSB7XG4gICAgICAgICAgLy8gR2l2ZW4gYSBiYXNlLCB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgYmFzZSdzIHBhcmVudCB0aGF0IGlzIHRoZSBzYW1lIGFzXG4gICAgICAgICAgLy8gb3VyIHBhcmVudCwgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF0IHRoZVxuICAgICAgICAgIC8vIHNhbWUgbGV2ZWwgb2Ygb3VyIG93bi5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBtaWdodCBuZWVkIHRvIHJlY3Vyc2UgaW50byBvdXIgbWVtYmVycyB0byBhbHNvIGZpbmQgdGhlaXJcbiAgICAgICAgICAvLyAgICAgICBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgbGV0IGJhc2VJdGVtID0gcmVzb2x2ZXIuZ2V0VHlwZShiYXNlKTtcbiAgICAgICAgICBsZXQgYmFzZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChiYXNlKTtcbiAgICAgICAgICB3aGlsZSAoYmFzZVBhcmVudCAhPT0gcGFyZW50KSB7XG4gICAgICAgICAgICBiYXNlSXRlbSA9IGJhc2VQYXJlbnQ7XG4gICAgICAgICAgICBiYXNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGJhc2VJdGVtLmZxbiEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc2Vlbi5oYXMoYmFzZUl0ZW0uZnFuISkpIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGJhc2VJdGVtKTtcbiAgICAgICAgICAgIHNlZW4uYWRkKGJhc2VJdGVtLmZxbiEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZXBlbmRlbmNpZXM7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIC4uLnRoaXMuYmFzZXMubWFwKChiYXNlKSA9PiB0b1R5cGVOYW1lKGJhc2UpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgICAuLi50aGlzLm1lbWJlcnMubWFwKChtZW0pID0+IG1lbS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWVtYmVyKG1lbWJlcjogUHl0aG9uQmFzZSkge1xuICAgIHRoaXMubWVtYmVycy5wdXNoKG1lbWJlcik7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuXG4gICAgY29uc3QgY2xhc3NQYXJhbXMgPSB0aGlzLmdldENsYXNzUGFyYW1zKGNvbnRleHQpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBjbGFzc1BhcmFtcyk7XG5cbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5ib3VuZFJlc29sdmVyKGNvbnRleHQucmVzb2x2ZXIpO1xuICAgICAgbGV0IHNob3VsZFNlcGFyYXRlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgICBpZiAoc2hvdWxkU2VwYXJhdGUpIHtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRTZXBhcmF0ZSA9IHRoaXMuc2VwYXJhdGVNZW1iZXJzO1xuICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCB7IC4uLmNvbnRleHQsIHJlc29sdmVyIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBib3VuZFJlc29sdmVyKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBUeXBlUmVzb2x2ZXIge1xuICAgIGlmICh0aGlzLmZxbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlci5iaW5kKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgQmFzZU1ldGhvZE9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG59XG5cbmludGVyZmFjZSBCYXNlTWV0aG9kRW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlTWV0aG9kIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJldHVybkZyb21KU0lJTWV0aG9kOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHNwZWMuUGFyYW1ldGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXR1cm5zOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW4sXG4gICAgb3B0czogQmFzZU1ldGhvZE9wdHMsXG4gICkge1xuICAgIHRoaXMuYWJzdHJhY3QgPSAhIW9wdHMuYWJzdHJhY3Q7XG4gICAgdGhpcy5saWZ0ZWRQcm9wID0gb3B0cy5saWZ0ZWRQcm9wO1xuICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHRvVHlwZU5hbWUodGhpcy5yZXR1cm5zKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICAuLi50aGlzLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT5cbiAgICAgICAgdG9UeXBlTmFtZShwYXJhbSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgKSxcbiAgICAgIC4uLmxpZnRlZFByb3BlcnRpZXModGhpcy5saWZ0ZWRQcm9wKSxcbiAgICApO1xuXG4gICAgZnVuY3Rpb24qIGxpZnRlZFByb3BlcnRpZXMoXG4gICAgICBzdHJ1Y3Q6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHVuZGVmaW5lZCxcbiAgICApOiBJdGVyYWJsZUl0ZXJhdG9yPFB5dGhvbkltcG9ydHM+IHtcbiAgICAgIGlmIChzdHJ1Y3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc3RydWN0LnByb3BlcnRpZXMgPz8gW10pIHtcbiAgICAgICAgeWllbGQgdG9UeXBlTmFtZShwcm9wLnR5cGUpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiBzdHJ1Y3QuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBpZmFjZSA9IGNvbnRleHQucmVzb2x2ZXIuZGVyZWZlcmVuY2UoYmFzZSkgYXMgc3BlYy5JbnRlcmZhY2VUeXBlO1xuICAgICAgICBmb3IgKGNvbnN0IGltcG9ydHMgb2YgbGlmdGVkUHJvcGVydGllcyhpZmFjZSkpIHtcbiAgICAgICAgICB5aWVsZCBpbXBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlTWV0aG9kRW1pdE9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgcmVuZGVyQWJzdHJhY3QgPSB0cnVlLCBmb3JjZUVtaXRCb2R5ID0gZmFsc2UgfSA9IG9wdHMgPz8ge307XG5cbiAgICBjb25zdCByZXR1cm5UeXBlOiBzdHJpbmcgPSB0b1R5cGVOYW1lKHRoaXMucmV0dXJucykucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgIC8vIFdlIGNhbm5vdCAoY3VycmVudGx5PykgYmxpbmRseSB1c2UgdGhlIG5hbWVzIGdpdmVuIHRvIHVzIGJ5IHRoZSBKU0lJIGZvclxuICAgIC8vIGluaXRpYWxpemVycywgYmVjYXVzZSBvdXIga2V5d29yZCBsaWZ0aW5nIHdpbGwgYWxsb3cgdHdvIG5hbWVzIHRvIGNsYXNoLlxuICAgIC8vIFRoaXMgY2FuIGhvcGVmdWxseSBiZSByZW1vdmVkIG9uY2Ugd2UgZ2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjg4XG4gICAgLy8gcmVzb2x2ZWQsIHNvIGJ1aWxkIHVwIGEgbGlzdCBvZiBhbGwgb2YgdGhlIHByb3AgbmFtZXMgc28gd2UgY2FuIGNoZWNrIGFnYWluc3RcbiAgICAvLyB0aGVtIGxhdGVyLlxuICAgIGNvbnN0IGxpZnRlZFByb3BOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmICh0aGlzLmxpZnRlZFByb3A/LnByb3BlcnRpZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHRoaXMubGlmdGVkUHJvcC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxpZnRlZFByb3BOYW1lcy5hZGQodG9QeXRob25QYXJhbWV0ZXJOYW1lKHByb3AubmFtZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHVybiBhIGxpc3Qgb2YgSlNJSSBwYXJhbWV0ZXJzLCBpbnRvIFB5dGhvbiBzdHlsZSBhcmd1bWVudHMgd2l0aFxuICAgIC8vIGdyYWR1YWwgdHlwaW5nLCBzbyB3ZSdsbCBoYXZlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzLCBhbmRcbiAgICAvLyBidWlsZCB0aGUgbGlzdCwgY29udmVydGluZyBhcyB3ZSBnby5cbiAgICBjb25zdCBweXRob25QYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiB0aGlzLnBhcmFtZXRlcnMpIHtcbiAgICAgIC8vIFdlIGNhbm5vdCAoY3VycmVudGx5PykgYmxpbmRseSB1c2UgdGhlIG5hbWVzIGdpdmVuIHRvIHVzIGJ5IHRoZSBKU0lJIGZvclxuICAgICAgLy8gaW5pdGlhbGl6ZXJzLCBiZWNhdXNlIG91ciBrZXl3b3JkIGxpZnRpbmcgd2lsbCBhbGxvdyB0d28gbmFtZXMgdG8gY2xhc2guXG4gICAgICAvLyBUaGlzIGNhbiBob3BlZnVsbHkgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI4OFxuICAgICAgLy8gcmVzb2x2ZWQuXG4gICAgICBjb25zdCBwYXJhbU5hbWU6IHN0cmluZyA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShcbiAgICAgICAgcGFyYW0ubmFtZSxcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShwYXJhbSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhcmFtRGVmYXVsdCA9IHBhcmFtLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG5cbiAgICAgIHB5dGhvblBhcmFtcy5wdXNoKGAke3BhcmFtTmFtZX06ICR7cGFyYW1UeXBlfSR7cGFyYW1EZWZhdWx0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY3VtZW50YWJsZUFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLnBhcmFtZXRlcnNcbiAgICAgIC8vIElmIHRoZXJlJ3MgbGlmdGVkUHJvcHMsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBzdHJ1Y3QgYW5kIGl0IHdvbid0IGJlIF9hY3R1YWxseV8gZW1pdHRlZC5cbiAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PlxuICAgICAgICB0aGlzLmxpZnRlZFByb3AgIT0gbnVsbCA/IGluZGV4IDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDEgOiB0cnVlLFxuICAgICAgKVxuICAgICAgLm1hcCgocGFyYW0pID0+ICh7XG4gICAgICAgIC4uLnBhcmFtLFxuICAgICAgICBuYW1lOiB0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSwgbGlmdGVkUHJvcE5hbWVzKSxcbiAgICAgIH0pKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBsaWZ0ZWQgcGFyYW1ldGVyLCB0aGVuIHdlJ2xsIGRyb3AgdGhlIGxhc3QgYXJndW1lbnQgdG8gb3VyIHBhcmFtc1xuICAgIC8vIGFuZCB0aGVuIHdlJ2xsIGxpZnQgYWxsIG9mIHRoZSBwYXJhbXMgb2YgdGhlIGxpZnRlZCB0eXBlIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgLy8gdG8gdGhlIGZ1bmN0aW9uLlxuICAgIGlmICh0aGlzLmxpZnRlZFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVtb3ZlIG91ciBsYXN0IGl0ZW0uXG4gICAgICBweXRob25QYXJhbXMucG9wKCk7XG4gICAgICBjb25zdCBsaWZ0ZWRQcm9wZXJ0aWVzID0gdGhpcy5nZXRMaWZ0ZWRQcm9wZXJ0aWVzKGNvbnRleHQucmVzb2x2ZXIpO1xuXG4gICAgICBpZiAobGlmdGVkUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuICAgICAgICAvLyBBbGwgb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUga2V5d29yZCBvbmx5IGFyZ3VtZW50cywgc28gd2UnbGwgbWFyayB0aGVtXG4gICAgICAgIC8vIGFzIHN1Y2guXG4gICAgICAgIHB5dGhvblBhcmFtcy5wdXNoKCcqJyk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiBvdXIgcHJvcHMsIGFuZCByZWZsZWN0IHRoZW0gaW50byBvdXIgcGFyYW1zLlxuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgbGlmdGVkUHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwcm9wLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUocHJvcCkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwYXJhbURlZmF1bHQgPSBwcm9wLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG5cbiAgICAgICAgICBweXRob25QYXJhbXMucHVzaChgJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX0ke3BhcmFtRGVmYXVsdH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEb2N1bWVudCB0aGVtIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgICBkb2N1bWVudGFibGVBcmdzLnB1c2goLi4ubGlmdGVkUHJvcGVydGllcyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMucGFyYW1ldGVycy5sZW5ndGggPj0gMSAmJlxuICAgICAgdGhpcy5wYXJhbWV0ZXJzW3RoaXMucGFyYW1ldGVycy5sZW5ndGggLSAxXS52YXJpYWRpY1xuICAgICkge1xuICAgICAgLy8gQW5vdGhlciBzaXR1YXRpb24gd2UgY291bGQgYmUgaW4sIGlzIHRoYXQgaW5zdGVhZCBvZiBoYXZpbmcgYSBwbGFpbiBwYXJhbWV0ZXJcbiAgICAgIC8vIHdlIGhhdmUgYSB2YXJpYWRpYyBwYXJhbWV0ZXIgd2hlcmUgd2UgbmVlZCB0byBleHBhbmQgdGhlIGxhc3QgcGFyYW1ldGVyIGFzIGFcbiAgICAgIC8vICphcmdzLlxuICAgICAgcHl0aG9uUGFyYW1zLnBvcCgpO1xuXG4gICAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gdGhpcy5wYXJhbWV0ZXJzLnNsaWNlKC0xKVswXTtcbiAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShsYXN0UGFyYW1ldGVyLm5hbWUpO1xuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShsYXN0UGFyYW1ldGVyLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAgIHB5dGhvblBhcmFtcy5wdXNoKGAqJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmICh0aGlzLmpzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgbmVlZGVkIGJlY2F1c2UgbXlweSBkb2VzIG5vdCBrbm93IGhvdyB0byBjaGVjayBkZWNvcmF0ZWQgZGVjbGFyYXRpb25zXG4gICAgICBkZWNvcmF0b3JzLnB1c2goYEBqc2lpLm1lbWJlcihqc2lpX25hbWU9XCIke3RoaXMuanNOYW1lfVwiKWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlY29yYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goYEAke3RoaXMuZGVjb3JhdG9yfWApO1xuICAgIH1cblxuICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goJ0BhYmMuYWJzdHJhY3RtZXRob2QnKTtcbiAgICB9XG5cbiAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgbmVlZGVkIGJlY2F1c2UgbXlweSBkb2VzIG5vdCBrbm93IGhvdyB0byBjaGVjayBkZWNvcmF0ZWQgZGVjbGFyYXRpb25zXG4gICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzXG4gICAgICAgIC5qb2luKCcgIyB0eXBlOiBpZ25vcmVbbWlzY11cXG4nKVxuICAgICAgICAuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIGNvZGUubGluZShkZWNvcmF0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB5dGhvblBhcmFtcy51bnNoaWZ0KFxuICAgICAgc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgICB0aGlzLmltcGxpY2l0UGFyYW1ldGVyLFxuICAgICAgICBweXRob25QYXJhbXMubWFwKChwYXJhbSkgPT4gcGFyYW0uc3BsaXQoJzonKVswXS50cmltKCkpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgb3BlblNpZ25hdHVyZShcbiAgICAgIGNvZGUsXG4gICAgICAnZGVmJyxcbiAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgIHB5dGhvblBhcmFtcyxcbiAgICAgIGZhbHNlLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5kb2NzLCB7XG4gICAgICBhcmd1bWVudHM6IGRvY3VtZW50YWJsZUFyZ3MsXG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgbWV0aG9kLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0Qm9keShcbiAgICAgIGNvZGUsXG4gICAgICBjb250ZXh0LFxuICAgICAgcmVuZGVyQWJzdHJhY3QsXG4gICAgICBmb3JjZUVtaXRCb2R5LFxuICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgcHl0aG9uUGFyYW1zWzBdLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Qm9keShcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgcmVuZGVyQWJzdHJhY3Q6IGJvb2xlYW4sXG4gICAgZm9yY2VFbWl0Qm9keTogYm9vbGVhbixcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICAgIGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZTogc3RyaW5nLFxuICApIHtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMuc2hvdWxkRW1pdEJvZHkgJiYgIWZvcmNlRW1pdEJvZHkpIHx8XG4gICAgICAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdClcbiAgICApIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmxpZnRlZFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVtaXRBdXRvUHJvcHMoY29kZSwgY29udGV4dCwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbWl0SnNpaU1ldGhvZENhbGwoXG4gICAgICAgIGNvZGUsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGxpZnRlZFByb3BOYW1lcyxcbiAgICAgICAgaW1wbGljaXRQYXJhbWV0ZXIsXG4gICAgICAgIHJldHVyblR5cGUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEF1dG9Qcm9wcyhcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgbGlmdGVkUHJvcE5hbWVzOiBTZXQ8c3RyaW5nPixcbiAgKSB7XG4gICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IHRoaXMucGFyYW1ldGVycy5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgYXJnTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShsYXN0UGFyYW1ldGVyLm5hbWUsIGxpZnRlZFByb3BOYW1lcyk7XG4gICAgY29uc3QgdHlwZU5hbWUgPSB0b1R5cGVOYW1lKGxhc3RQYXJhbWV0ZXIudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgcHJvcGVydGllcywgd2hpY2ggYXJlIG1hbmRhdG9yeSwgdGhlc2UgYXJlIHRoZVxuICAgIC8vIG9uZXMgd2Ugd2lsbCBzcGVjaWZpeSB0byBzdGFydCB3aXRoIGluIG91ciBkaWN0aW9uYXJ5IGxpdGVyYWwuXG4gICAgY29uc3QgbGlmdGVkUHJvcHMgPSB0aGlzLmdldExpZnRlZFByb3BlcnRpZXMoY29udGV4dC5yZXNvbHZlcikubWFwKFxuICAgICAgKHApID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgcCksXG4gICAgKTtcbiAgICBjb25zdCBhc3NpZ25tZW50cyA9IGxpZnRlZFByb3BzXG4gICAgICAubWFwKChwKSA9PiBwLnB5dGhvbk5hbWUpXG4gICAgICAubWFwKCh2KSA9PiBgJHt2fT0ke3Z9YCk7XG5cbiAgICBhc3NpZ25DYWxsUmVzdWx0KGNvZGUsIGFyZ05hbWUsIHR5cGVOYW1lLCBhc3NpZ25tZW50cyk7XG4gICAgY29kZS5saW5lKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRKc2lpTWV0aG9kQ2FsbChcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgbGlmdGVkUHJvcE5hbWVzOiBTZXQ8c3RyaW5nPixcbiAgICBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nLFxuICAgIHJldHVyblR5cGU6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgbWV0aG9kUHJlZml4OiBzdHJpbmcgPSB0aGlzLnJldHVybkZyb21KU0lJTWV0aG9kID8gJ3JldHVybiAnIDogJyc7XG5cbiAgICBjb25zdCBqc2lpTWV0aG9kUGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLmNsYXNzQXNGaXJzdFBhcmFtZXRlcikge1xuICAgICAgaWYgKHRoaXMucGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgbm90IGtub3duLicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpIHtcbiAgICAgICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKFxuICAgICAgICAgIHRvVHlwZU5hbWUodGhpcy5wYXJlbnQpLnB5dGhvblR5cGUoe1xuICAgICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzaW5nIHRoZSBkeW5hbWljIGNsYXNzIG9mIGBzZWxmYC5cbiAgICAgICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKGAke2ltcGxpY2l0UGFyYW1ldGVyfS5fX2NsYXNzX19gKTtcbiAgICAgIH1cbiAgICB9XG4gICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKGltcGxpY2l0UGFyYW1ldGVyKTtcbiAgICBpZiAodGhpcy5qc05hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKGBcIiR7dGhpcy5qc05hbWV9XCJgKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbGFzdCBhcmcgaXMgdmFyaWFkaWMsIGV4cGFuZCB0aGUgdHVwbGVcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiB0aGlzLnBhcmFtZXRlcnMpIHtcbiAgICAgIGxldCBleHByID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUsIGxpZnRlZFByb3BOYW1lcyk7XG4gICAgICBpZiAocGFyYW0udmFyaWFkaWMpIHtcbiAgICAgICAgZXhwciA9IGAqJHtleHByfWA7XG4gICAgICB9XG4gICAgICBwYXJhbXMucHVzaChleHByKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGBqc2lpLiR7dGhpcy5qc2lpTWV0aG9kfSgke2pzaWlNZXRob2RQYXJhbXMuam9pbihcbiAgICAgICcsICcsXG4gICAgKX0sIFske3BhcmFtcy5qb2luKCcsICcpfV0pYDtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgJHttZXRob2RQcmVmaXh9JHtcbiAgICAgICAgdGhpcy5yZXR1cm5Gcm9tSlNJSU1ldGhvZCAmJiByZXR1cm5UeXBlXG4gICAgICAgICAgPyBgdHlwaW5nLmNhc3QoJHtyZXR1cm5UeXBlfSwgJHt2YWx1ZX0pYFxuICAgICAgICAgIDogdmFsdWVcbiAgICAgIH1gLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldExpZnRlZFByb3BlcnRpZXMocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IHNwZWMuUHJvcGVydHlbXSB7XG4gICAgY29uc3QgbGlmdGVkUHJvcGVydGllczogc3BlYy5Qcm9wZXJ0eVtdID0gW107XG5cbiAgICBjb25zdCBzdGFjayA9IFt0aGlzLmxpZnRlZFByb3BdO1xuICAgIGNvbnN0IGtub3duSWZhY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qga25vd25Qcm9wcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoXG4gICAgICBsZXQgY3VycmVudCA9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICBjdXJyZW50ICE9IG51bGw7XG4gICAgICBjdXJyZW50ID0gc3RhY2suc2hpZnQoKVxuICAgICkge1xuICAgICAga25vd25JZmFjZXMuYWRkKGN1cnJlbnQuZnFuKTtcblxuICAgICAgLy8gQWRkIGFueSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBpbnRlcmZhY2UgZGVwZW5kcyBvbiwgdG8gdGhlIGxpc3QuXG4gICAgICBpZiAoY3VycmVudC5pbnRlcmZhY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiBjdXJyZW50LmludGVyZmFjZXMpIHtcbiAgICAgICAgICBpZiAoa25vd25JZmFjZXMuaGFzKGlmYWNlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2gocmVzb2x2ZXIuZGVyZWZlcmVuY2UoaWZhY2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSk7XG4gICAgICAgICAga25vd25JZmFjZXMuYWRkKGlmYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgaW50ZXJmYWNlIHRvIG91ciBsaXN0IG9mIHByb3BlcnRpZXMuXG4gICAgICBpZiAoY3VycmVudC5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGN1cnJlbnQucHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChrbm93blByb3BzLmhhcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlmdGVkUHJvcGVydGllcy5wdXNoKHByb3ApO1xuICAgICAgICAgIGtub3duUHJvcHMuYWRkKHByb3AubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGlmdGVkUHJvcGVydGllcztcbiAgfVxufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5T3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgaXNTdGF0aWM/OiBib29sZWFuO1xuICBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5RW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlUHJvcGVydHkgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1tdXRhYmxlOiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHNwZWMuT3B0aW9uYWxWYWx1ZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IEJhc2VQcm9wZXJ0eU9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgYWJzdHJhY3QgPSBmYWxzZSwgaW1tdXRhYmxlID0gZmFsc2UsIGlzU3RhdGljID0gZmFsc2UgfSA9IG9wdHM7XG5cbiAgICB0aGlzLmFic3RyYWN0ID0gYWJzdHJhY3Q7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlUHJvcGVydHlFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcbiAgICBjb25zdCBweXRob25UeXBlID0gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgaXMgbmVlZGVkIGJlY2F1c2UgbXlweSBjYW5ub3QgY2hlY2sgZGVjb3JhdGVkIHRoaW5nc1xuICAgIGNvZGUubGluZShgQCR7dGhpcy5kZWNvcmF0b3J9ICMgdHlwZTogaWdub3JlW21pc2NdYCk7XG4gICAgY29kZS5saW5lKGBAanNpaS5tZW1iZXIoanNpaV9uYW1lPVwiJHt0aGlzLmpzTmFtZX1cIilgKTtcbiAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgY29kZS5saW5lKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgfVxuICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICBjb2RlLFxuICAgICAgJ2RlZicsXG4gICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICBbdGhpcy5pbXBsaWNpdFBhcmFtZXRlcl0sXG4gICAgICB0cnVlLFxuICAgICAgcHl0aG9uVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgcHJvcC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICh0aGlzLnNob3VsZEVtaXRCb2R5IHx8IGZvcmNlRW1pdEJvZHkpICYmXG4gICAgICAoIXJlbmRlckFic3RyYWN0IHx8ICF0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIGpzaWkuJHt0aGlzLmpzaWlHZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIikpYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfVxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKCF0aGlzLmltbXV0YWJsZSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBAJHt0aGlzLnB5dGhvbk5hbWV9LnNldHRlciR7XG4gICAgICAgICAgdGhpcy5pc1N0YXRpYyA/ICcgIyB0eXBlOiBpZ25vcmVbbm8tcmVkZWZdJyA6ICcnXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICAgIGNvZGUubGluZSgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgICAgfVxuICAgICAgb3BlblNpZ25hdHVyZShcbiAgICAgICAgY29kZSxcbiAgICAgICAgJ2RlZicsXG4gICAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgICAgW3RoaXMuaW1wbGljaXRQYXJhbWV0ZXIsIGB2YWx1ZTogJHtweXRob25UeXBlfWBdLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgJ05vbmUnLFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuc2hvdWxkRW1pdEJvZHkgfHwgZm9yY2VFbWl0Qm9keSkgJiZcbiAgICAgICAgKCFyZW5kZXJBYnN0cmFjdCB8fCAhdGhpcy5hYnN0cmFjdClcbiAgICAgICkge1xuICAgICAgICBjb2RlLmxpbmUoXG4gICAgICAgICAgYGpzaWkuJHt0aGlzLmpzaWlTZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIiwgdmFsdWUpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgICB9XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgSW50ZXJmYWNlIGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmludGVyZmFjZSgnLCBbYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgXSwgJyknKTtcblxuICAgIC8vIEZpcnN0IHdlIGRvIG91ciBub3JtYWwgY2xhc3MgbG9naWMgZm9yIGVtaXR0aW5nIG91ciBtZW1iZXJzLlxuICAgIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIC8vIFRoZW4sIHdlIGhhdmUgdG8gZW1pdCBhIFByb3h5IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgb3VyIHByb3h5IGludGVyZmFjZS5cbiAgICBjb25zdCBwcm94eUJhc2VzOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKFxuICAgICAgKGIpID0+XG4gICAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBiZWNhdXNlIE15UHkgY2Fubm90IGNoZWNrIGR5bmFtaWMgYmFzZSBjbGFzc2VzIChuYXR1cmFsbHkpXG4gICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7XG4gICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG4gICAgY29kZS5saW5lKGBfX2pzaWlfdHlwZV9fOiB0eXBpbmcuQ2xhc3NWYXJbc3RyXSA9IFwiJHt0aGlzLmZxbn1cImApO1xuXG4gICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLm1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VwYXJhdGVNZW1iZXJzKSB7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCwgeyBmb3JjZUVtaXRCb2R5OiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAnIyBBZGRpbmcgYSBcIl9fanNpaV9wcm94eV9jbGFzc19fKCk6IHR5cGluZy5UeXBlXCIgZnVuY3Rpb24gdG8gdGhlIGludGVyZmFjZScsXG4gICAgKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG5cbiAgICBwYXJhbXMucHVzaCgndHlwaW5nX2V4dGVuc2lvbnMuUHJvdG9jb2wnKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBJbnRlcmZhY2VNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnaW52b2tlJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmNsYXNzIEludGVyZmFjZVByb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2J1aWx0aW5zLnByb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kOiBzdHJpbmcgPSAnZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgU3RydWN0IGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHByb3RlY3RlZCBkaXJlY3RNZW1iZXJzID0gbmV3IEFycmF5PFN0cnVjdEZpZWxkPigpO1xuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZCB7XG4gICAgaWYgKCEobWVtYmVyIGluc3RhbmNlb2YgU3RydWN0RmllbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYWRkIFN0cnVjdEZpZWxkIHRvIFN0cnVjdCcpO1xuICAgIH1cbiAgICB0aGlzLmRpcmVjdE1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBjb25zdCBiYXNlSW50ZXJmYWNlcyA9IHRoaXMuZ2V0Q2xhc3NQYXJhbXMoY29udGV4dCk7XG5cbiAgICBjb2RlLmluZGVudCgnQGpzaWkuZGF0YV90eXBlKCcpO1xuICAgIGNvZGUubGluZShganNpaV90eXBlPSR7SlNPTi5zdHJpbmdpZnkodGhpcy5mcW4pfSxgKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnanNpaV9zdHJ1Y3RfYmFzZXM9WycsIGJhc2VJbnRlcmZhY2VzLCAnXSwnKTtcbiAgICBhc3NpZ25EaWN0aW9uYXJ5KGNvZGUsICduYW1lX21hcHBpbmcnLCB0aGlzLnByb3BlcnR5TWFwKCksICcsJywgdHJ1ZSk7XG4gICAgY29kZS51bmluZGVudCgnKScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBiYXNlSW50ZXJmYWNlcyk7XG4gICAgdGhpcy5lbWl0Q29uc3RydWN0b3IoY29kZSwgY29udGV4dCk7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgdGhpcy5lbWl0R2V0dGVyKG1lbWJlciwgY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0TWFnaWNNZXRob2RzKGNvZGUpO1xuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMuYWxsTWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCBmaWVsZHMgKGluaGVyaXRlZCBhcyB3ZWxsKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYWxsTWVtYmVycygpOiBTdHJ1Y3RGaWVsZFtdIHtcbiAgICByZXR1cm4gdGhpcy50aGlzSW50ZXJmYWNlLmFsbFByb3BlcnRpZXMubWFwKFxuICAgICAgKHgpID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgeC5zcGVjKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdGhpc0ludGVyZmFjZSgpIHtcbiAgICBpZiAodGhpcy5mcW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGUU4gbm90IHNldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbS5maW5kSW50ZXJmYWNlKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5hbGxNZW1iZXJzO1xuXG4gICAgY29uc3Qga3dhcmdzID0gbWVtYmVycy5tYXAoKG0pID0+IG0uY29uc3RydWN0b3JEZWNsKGNvbnRleHQpKTtcblxuICAgIGNvbnN0IGltcGxpY2l0UGFyYW1ldGVyID0gc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgJ3NlbGYnLFxuICAgICAgbWVtYmVycy5tYXAoKG0pID0+IG0ucHl0aG9uTmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RvckFyZ3VtZW50cyA9XG4gICAgICBrd2FyZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IFtpbXBsaWNpdFBhcmFtZXRlciwgJyonLCAuLi5rd2FyZ3NdXG4gICAgICAgIDogW2ltcGxpY2l0UGFyYW1ldGVyXTtcblxuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsICdfX2luaXRfXycsIGNvbnN0cnVjdG9yQXJndW1lbnRzLCBmYWxzZSwgJ05vbmUnKTtcbiAgICB0aGlzLmVtaXRDb25zdHJ1Y3RvckRvY3N0cmluZyhjb2RlKTtcblxuICAgIC8vIFJlLXR5cGUgc3RydWN0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIFwiZGljdFwiXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0uaXNTdHJ1Y3QodGhpcy5nZW5lcmF0b3IpKSkge1xuICAgICAgLy8gTm90ZSB0aGF0IFwiTm9uZVwiIGlzIE5PVCBhbiBpbnN0YW5jZSBvZiBkaWN0ICh0aGF0J3MgY29udmVuaWVudCEpXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobWVtYmVyLnR5cGUudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29kZS5vcGVuQmxvY2soYGlmIGlzaW5zdGFuY2UoJHttZW1iZXIucHl0aG9uTmFtZX0sIGRpY3QpYCk7XG4gICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyLnB5dGhvbk5hbWV9ID0gJHt0eXBlTmFtZX0oKioke21lbWJlci5weXRob25OYW1lfSlgKTtcbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmVkIHByb3BlcnRpZXMsIHRob3NlIHdpbGwgYWx3YXlzIGJlIHB1dCBpbnRvIHRoZSBkaWN0XG4gICAgYXNzaWduRGljdGlvbmFyeShcbiAgICAgIGNvZGUsXG4gICAgICBgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX3ZhbHVlczogdHlwaW5nLkRpY3Rbc3RyLCB0eXBpbmcuQW55XWAsXG4gICAgICBtZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICFtLm9wdGlvbmFsKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChtZW1iZXIpID0+XG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke21lbWJlci5weXRob25OYW1lfWAsXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIE9wdGlvbmFsIHByb3BlcnRpZXMsIHdpbGwgb25seSBiZSBwdXQgaW50byB0aGUgZGljdCBpZiB0aGV5J3JlIG5vdCBOb25lXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0ub3B0aW9uYWwpKSB7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgaWYgJHttZW1iZXIucHl0aG9uTmFtZX0gaXMgbm90IE5vbmVgKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll92YWx1ZXNbXCIke21lbWJlci5weXRob25OYW1lfVwiXSA9ICR7bWVtYmVyLnB5dGhvbk5hbWV9YCxcbiAgICAgICk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yRG9jc3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvbnN0IGFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLmFsbE1lbWJlcnMubWFwKChtKSA9PiAoe1xuICAgICAgbmFtZTogbS5weXRob25OYW1lLFxuICAgICAgZG9jczogbS5kb2NzLFxuICAgIH0pKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuZG9jcywge1xuICAgICAgYXJndW1lbnRzOiBhcmdzLFxuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRHZXR0ZXIoXG4gICAgbWVtYmVyOiBTdHJ1Y3RGaWVsZCxcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICkge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPSBtZW1iZXIudHlwZUFubm90YXRpb24oY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoJ0BidWlsdGlucy5wcm9wZXJ0eScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsIG1lbWJlci5weXRob25OYW1lLCBbJ3NlbGYnXSwgdHJ1ZSwgcHl0aG9uVHlwZSk7XG4gICAgbWVtYmVyLmVtaXREb2NTdHJpbmcoY29kZSk7XG4gICAgY29kZS5saW5lKFxuICAgICAgYHJlc3VsdCA9IHNlbGYuX3ZhbHVlcy5nZXQoJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9KWAsXG4gICAgKTtcbiAgICBpZiAoIW1lbWJlci5vcHRpb25hbCkge1xuICAgICAgLy8gQWRkIGFuIGFzc2VydGlvbiB0byBtYXllIE15UFkgaGFwcHkhXG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBhc3NlcnQgcmVzdWx0IGlzIG5vdCBOb25lLCBcIlJlcXVpcmVkIHByb3BlcnR5ICcke21lbWJlci5weXRob25OYW1lfScgaXMgbWlzc2luZ1wiYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvZGUubGluZShgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIHJlc3VsdClgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1hZ2ljTWV0aG9kcyhjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fZXFfXyhzZWxmLCByaHM6IHR5cGluZy5BbnkpIC0+IGJ1aWx0aW5zLmJvb2wnKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAncmV0dXJuIGlzaW5zdGFuY2UocmhzLCBzZWxmLl9fY2xhc3NfXykgYW5kIHJocy5fdmFsdWVzID09IHNlbGYuX3ZhbHVlcycsXG4gICAgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19uZV9fKHNlbGYsIHJoczogdHlwaW5nLkFueSkgLT4gYnVpbHRpbnMuYm9vbCcpO1xuICAgIGNvZGUubGluZSgncmV0dXJuIG5vdCAocmhzID09IHNlbGYpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fcmVwcl9fKHNlbGYpIC0+IHN0cicpO1xuICAgIGNvZGUuaW5kZW50KGByZXR1cm4gXCIke3RoaXMucHl0aG9uTmFtZX0oJXMpXCIgJSBcIiwgXCIuam9pbihgKTtcbiAgICBjb2RlLmxpbmUoJ2sgKyBcIj1cIiArIHJlcHIodikgZm9yIGssIHYgaW4gc2VsZi5fdmFsdWVzLml0ZW1zKCknKTtcbiAgICBjb2RlLnVuaW5kZW50KCcpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIHByb3BlcnR5TWFwKCkge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5hbGxNZW1iZXJzKSB7XG4gICAgICByZXQucHVzaChcbiAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobWVtYmVyLnB5dGhvbk5hbWUpfTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtZW1iZXIuanNpaU5hbWUsXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cblxuY2xhc3MgU3RydWN0RmllbGQgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGpzaWlOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3BlYy5PcHRpb25hbFZhbHVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBwcm9wOiBzcGVjLlByb3BlcnR5LFxuICApIHtcbiAgICB0aGlzLnB5dGhvbk5hbWUgPSB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUpO1xuICAgIHRoaXMuanNpaU5hbWUgPSBwcm9wLm5hbWU7XG4gICAgdGhpcy50eXBlID0gcHJvcDtcbiAgICB0aGlzLmRvY3MgPSBwcm9wLmRvY3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9wdGlvbmFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMudHlwZS5vcHRpb25hbDtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N0cnVjdChnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1N0cnVjdChnZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbSwgdGhpcy50eXBlLnR5cGUpO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yRGVjbChjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG9wdCA9IHRoaXMub3B0aW9uYWwgPyAnID0gTm9uZScgOiAnJztcbiAgICByZXR1cm4gYCR7dGhpcy5weXRob25OYW1lfTogJHt0aGlzLnR5cGVBbm5vdGF0aW9uKHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBwYXJhbWV0ZXJUeXBlOiB0cnVlLFxuICAgIH0pfSR7b3B0fWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBQeXRob24gdHlwZSBhbm5vdGF0aW9uIGZvciB0aGlzIHR5cGVcbiAgICovXG4gIHB1YmxpYyB0eXBlQW5ub3RhdGlvbihjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucHl0aG9uVHlwZShjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0RG9jU3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgcHJvcC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IHRoaXMudHlwZUFubm90YXRpb24oY29udGV4dCk7XG4gICAgY29kZS5saW5lKGAke3RoaXMucHl0aG9uTmFtZX06ICR7cmVzb2x2ZWRUeXBlfWApO1xuICAgIHRoaXMuZW1pdERvY1N0cmluZyhjb2RlKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2xhc3NPcHRzIGV4dGVuZHMgUHl0aG9uVHlwZU9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGludGVyZmFjZXM/OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZVtdO1xuICBhYnN0cmFjdEJhc2VzPzogc3BlYy5DbGFzc1R5cGVbXTtcbn1cblxuY2xhc3MgQ2xhc3MgZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIGltcGxlbWVudHMgSVNvcnRhYmxlVHlwZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJzdHJhY3Q6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJzdHJhY3RCYXNlczogc3BlYy5DbGFzc1R5cGVbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcmZhY2VzOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZVtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgb3B0czogQ2xhc3NPcHRzLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgc3VwZXIoZ2VuZXJhdG9yLCBuYW1lLCBmcW4sIG9wdHMsIGRvY3MpO1xuXG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbnRlcmZhY2VzID0gW10sIGFic3RyYWN0QmFzZXMgPSBbXSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzO1xuICAgIHRoaXMuYWJzdHJhY3RCYXNlcyA9IGFic3RyYWN0QmFzZXM7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQeXRob25UeXBlW10ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogUHl0aG9uVHlwZVtdID0gc3VwZXIuZGVwZW5kc09uKHJlc29sdmVyKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBpZmFjZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgbW9kdWxlIGF0IHRoZSBzYW1lIGxldmVsIG9mXG4gICAgLy8gbmVzdGluZy5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBpZmFjZSBvZiB0aGlzLmludGVyZmFjZXMpIHtcbiAgICAgIGlmIChyZXNvbHZlci5pc0luTW9kdWxlKGlmYWNlKSkge1xuICAgICAgICAvLyBHaXZlbiBhIGlmYWNlLCB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgaWZhY2VzJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWVcbiAgICAgICAgLy8gYXMgb3VyIHBhcmVudCwgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF0IHRoZVxuICAgICAgICAvLyBzYW1lIGxldmVsIG9mIG91ciBvd24uXG4gICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAvLyAgICAgICBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGxldCBpZmFjZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGlmYWNlKTtcbiAgICAgICAgbGV0IGlmYWNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGlmYWNlKTtcbiAgICAgICAgd2hpbGUgKGlmYWNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICBpZmFjZUl0ZW0gPSBpZmFjZVBhcmVudDtcbiAgICAgICAgICBpZmFjZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChpZmFjZUl0ZW0uZnFuISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlZW4uaGFzKGlmYWNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGlmYWNlSXRlbSk7XG4gICAgICAgICAgc2Vlbi5hZGQoaWZhY2VJdGVtLmZxbiEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgc3VwZXIucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLCAvLyBUYWtlcyBjYXJlIG9mIGJhc2UgJiBtZW1iZXJzXG4gICAgICAuLi50aGlzLmludGVyZmFjZXMubWFwKChiYXNlKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKGJhc2UpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICAvLyBGaXJzdCB3ZSBlbWl0IG91ciBpbXBsbWVudHMgZGVjb3JhdG9yXG4gICAgaWYgKHRoaXMuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzOiBzdHJpbmdbXSA9IHRoaXMuaW50ZXJmYWNlcy5tYXAoKGIpID0+XG4gICAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICAgICk7XG4gICAgICBjb2RlLmxpbmUoYEBqc2lpLmltcGxlbWVudHMoJHtpbnRlcmZhY2VzLmpvaW4oJywgJyl9KWApO1xuICAgIH1cblxuICAgIC8vIFRoZW4gd2UgZG8gb3VyIG5vcm1hbCBjbGFzcyBsb2dpYyBmb3IgZW1pdHRpbmcgb3VyIG1lbWJlcnMuXG4gICAgc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcblxuICAgIC8vIFRoZW4sIGlmIG91ciBjbGFzcyBpcyBBYnN0cmFjdCwgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIGFuZCByZWRvIGFsbCBvZlxuICAgIC8vIHRoaXMgbG9naWMsIGV4Y2VwdCBvbmx5IGVtaXRpbmcgYWJzdHJhY3QgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcyBub25cbiAgICAvLyBhYnN0cmFjdCwgYW5kIHN1YmNsYXNzaW5nIG91ciBpbml0aWFsIGNsYXNzLlxuICAgIGlmICh0aGlzLmFic3RyYWN0KSB7XG4gICAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG5cbiAgICAgIGNvbnN0IHByb3h5QmFzZXMgPSBbdGhpcy5weXRob25OYW1lXTtcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiB0aGlzLmFic3RyYWN0QmFzZXMpIHtcbiAgICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGJlY2F1c2UgTXlQeSBjYW5ub3QgY2hlY2sgZHluYW1pYyBiYXNlIGNsYXNzZXMgKG5hdHVyYWxseSlcbiAgICAgICAgcHJveHlCYXNlcy5wdXNoKFxuICAgICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYmFzZSkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcblxuICAgICAgLy8gRmlsdGVyIG91ciBsaXN0IG9mIG1lbWJlcnMgdG8gKm9ubHkqIGJlIGFic3RyYWN0IG1lbWJlcnMsIGFuZCBub3QgYW55XG4gICAgICAvLyBvdGhlciB0eXBlcy5cbiAgICAgIGNvbnN0IGFic3RyYWN0TWVtYmVycyA9IHRoaXMubWVtYmVycy5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIChtIGluc3RhbmNlb2YgQmFzZU1ldGhvZCB8fCBtIGluc3RhbmNlb2YgQmFzZVByb3BlcnR5KSAmJiBtLmFic3RyYWN0LFxuICAgICAgKTtcbiAgICAgIGlmIChhYnN0cmFjdE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhYnN0cmFjdE1lbWJlcnMpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZXBhcmF0ZU1lbWJlcnMpIHtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQsIHsgcmVuZGVyQWJzdHJhY3Q6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICAgIH1cblxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgQWRkaW5nIGEgXCJfX2pzaWlfcHJveHlfY2xhc3NfXygpOiB0eXBpbmcuVHlwZVwiIGZ1bmN0aW9uIHRvIHRoZSBhYnN0cmFjdCBjbGFzcycsXG4gICAgICApO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG4gICAgY29uc3QgbWV0YWNsYXNzOiBzdHJpbmcgPSB0aGlzLmFic3RyYWN0ID8gJ0pTSUlBYnN0cmFjdENsYXNzJyA6ICdKU0lJTWV0YSc7XG5cbiAgICBwYXJhbXMucHVzaChgbWV0YWNsYXNzPWpzaWkuJHttZXRhY2xhc3N9YCk7XG4gICAgcGFyYW1zLnB1c2goYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBTdGF0aWNNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcj86IHN0cmluZyA9ICdidWlsdGlucy5jbGFzc21ldGhvZCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ2Nscyc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnc2ludm9rZSc7XG59XG5cbmNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2NyZWF0ZSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmV0dXJuRnJvbUpTSUlNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2ludm9rZSc7XG59XG5cbmNsYXNzIEFzeW5jTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2FpbnZva2UnO1xufVxuXG5jbGFzcyBTdGF0aWNQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdqc2lpLnB5dGhvbi5jbGFzc3Byb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnY2xzJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdzZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzc2V0Jztcbn1cblxuY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBCYXNlUHJvcGVydHkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmcgPSAnYnVpbHRpbnMucHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NldCc7XG59XG5cbmNsYXNzIEVudW0gZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcGFyYXRlTWVtYmVycyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmVudW0oJywgW2Bqc2lpX3R5cGU9XCIke3RoaXMuZnFufVwiYF0sICcpJyk7XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoX2NvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2VudW0uRW51bSddO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cbn1cblxuY2xhc3MgRW51bU1lbWJlciBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsdWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICB0aGlzLnB5dGhvbk5hbWUgPSBweXRob25OYW1lO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRzT25Nb2R1bGVzKCkge1xuICAgIHJldHVybiBuZXcgU2V0PHN0cmluZz4oKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgX2NvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29kZS5saW5lKGAke3RoaXMucHl0aG9uTmFtZX0gPSBcIiR7dGhpcy52YWx1ZX1cImApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgZW51bS0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhfY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuaW50ZXJmYWNlIE1vZHVsZU9wdHMge1xuICByZWFkb25seSBhc3NlbWJseTogc3BlYy5Bc3NlbWJseTtcbiAgcmVhZG9ubHkgYXNzZW1ibHlGaWxlbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsb2FkQXNzZW1ibHk/OiBib29sZWFuO1xuICByZWFkb25seSBwYWNrYWdlPzogUGFja2FnZTtcblxuICAvKipcbiAgICogVGhlIGRvY3N0cmluZyB0byBlbWl0IGF0IHRoZSB0b3Agb2YgdGhpcyBtb2R1bGUsIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsZURvY3VtZW50YXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHl0aG9uIG1vZHVsZVxuICpcbiAqIFdpbGwgYmUgY2FsbGVkIGZvciBqc2lpIHN1Ym1vZHVsZXMgYW5kIG5hbWVzcGFjZXMuXG4gKi9cbmNsYXNzIFB5dGhvbk1vZHVsZSBpbXBsZW1lbnRzIFB5dGhvblR5cGUge1xuICAvKipcbiAgICogQ29udmVydGVkIHRvIHB1dCBvbiB0aGUgbW9kdWxlXG4gICAqXG4gICAqIFRoZSBmb3JtYXQgaXMgaW4gbWFya2Rvd24sIHdpdGggY29kZSBzYW1wbGVzIGNvbnZlcnRlZCBmcm9tIFRTIHRvIFB5dGhvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2R1bGVEb2N1bWVudGF0aW9uPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZW1ibHk6IHNwZWMuQXNzZW1ibHk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZW1ibHlGaWxlbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRBc3NlbWJseTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1iZXJzID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVzID0gbmV3IEFycmF5PFB5dGhvbk1vZHVsZT4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0czogTW9kdWxlT3B0cyxcbiAgKSB7XG4gICAgdGhpcy5hc3NlbWJseSA9IG9wdHMuYXNzZW1ibHk7XG4gICAgdGhpcy5hc3NlbWJseUZpbGVuYW1lID0gb3B0cy5hc3NlbWJseUZpbGVuYW1lO1xuICAgIHRoaXMubG9hZEFzc2VtYmx5ID0gISFvcHRzLmxvYWRBc3NlbWJseTtcbiAgICB0aGlzLm1vZHVsZURvY3VtZW50YXRpb24gPSBvcHRzLm1vZHVsZURvY3VtZW50YXRpb247XG4gIH1cblxuICBwdWJsaWMgYWRkTWVtYmVyKG1lbWJlcjogUHl0aG9uQmFzZSkge1xuICAgIHRoaXMubWVtYmVycy5wdXNoKG1lbWJlcik7XG4gIH1cblxuICBwdWJsaWMgYWRkUHl0aG9uTW9kdWxlKHB5TW9kOiBQeXRob25Nb2R1bGUpIHtcbiAgICBhc3NlcnQoXG4gICAgICAhdGhpcy5sb2FkQXNzZW1ibHksXG4gICAgICAnUHl0aG9uTW9kdWxlLmFkZFB5dGhvbk1vZHVsZSBDQU5OT1QgYmUgY2FsbGVkIG9uIGFzc2VtYmx5LWxvYWRpbmcgbW9kdWxlcyAoaXQgd291bGQgY2F1c2UgYSBsb2FkIGN5Y2xlKSEnLFxuICAgICk7XG4gICAgdGhpcy5tb2R1bGVzLnB1c2gocHlNb2QpO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICAuLi50aGlzLm1lbWJlcnMubWFwKChtZW0pID0+IG1lbS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgdGhpcy5lbWl0TW9kdWxlRG9jdW1lbnRhdGlvbihjb2RlKTtcblxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5mcW5cbiAgICAgID8gY29udGV4dC5yZXNvbHZlci5iaW5kKHRoaXMuZnFuLCB0aGlzLnB5dGhvbk5hbWUpXG4gICAgICA6IGNvbnRleHQucmVzb2x2ZXI7XG4gICAgY29udGV4dCA9IHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBzdWJtb2R1bGU6IHRoaXMuZnFuID8/IGNvbnRleHQuc3VibW9kdWxlLFxuICAgICAgcmVzb2x2ZXIsXG4gICAgfTtcblxuICAgIC8vIEJlZm9yZSB3ZSB3cml0ZSBhbnl0aGluZyBlbHNlLCB3ZSBuZWVkIHRvIHdyaXRlIG91dCBvdXIgbW9kdWxlIGhlYWRlcnMsIHRoaXNcbiAgICAvLyBpcyB3aGVyZSB3ZSBoYW5kbGUgc3R1ZmYgbGlrZSBpbXBvcnRzLCBhbnkgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24sIGV0Yy5cbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBhYmMnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBidWlsdGlucycpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGRhdGV0aW1lJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgZW51bScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHR5cGluZycpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGpzaWknKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBwdWJsaWNhdGlvbicpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHR5cGluZ19leHRlbnNpb25zJyk7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byB3cml0ZSBvdXQgdGhlIGtlcm5lbCBsb2FkIGxpbmUuXG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICB0aGlzLmVtaXREZXBlbmRlbmN5SW1wb3J0cyhjb2RlKTtcblxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBlbWl0TGlzdChcbiAgICAgICAgY29kZSxcbiAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fID0ganNpaS5KU0lJQXNzZW1ibHkubG9hZCgnLFxuICAgICAgICBbXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS5uYW1lKSxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5LnZlcnNpb24pLFxuICAgICAgICAgICdfX25hbWVfX1swOi02XScsXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseUZpbGVuYW1lKX1gLFxuICAgICAgICBdLFxuICAgICAgICAnKScsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGVuIHdlIG11c3QgaW1wb3J0IHRoZSAuX2pzaWkgc3VicGFja2FnZS5cbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgbGV0IGRpc3RhbmNlRnJvbVJvb3QgPSAwO1xuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGN1cnIgPSB0aGlzLmZxbiE7XG4gICAgICAgIGN1cnIgIT09IHRoaXMuYXNzZW1ibHkubmFtZTtcbiAgICAgICAgY3VyciA9IGN1cnIuc3Vic3RyaW5nKDAsIGN1cnIubGFzdEluZGV4T2YoJy4nKSlcbiAgICAgICkge1xuICAgICAgICBkaXN0YW5jZUZyb21Sb290Kys7XG4gICAgICB9XG4gICAgICBjb2RlLmxpbmUoYGZyb20gJHsnLicucmVwZWF0KGRpc3RhbmNlRnJvbVJvb3QgKyAxKX1fanNpaSBpbXBvcnQgKmApO1xuXG4gICAgICB0aGlzLmVtaXRSZXF1aXJlZEltcG9ydHMoY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBhbGwgb2Ygb3VyIG1lbWJlcnMuXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgcHJlcGFyZU1lbWJlcnModGhpcy5tZW1iZXJzLCByZXNvbHZlcikpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBtZW1iZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBXaGF0ZXZlciBuYW1lcyB3ZSd2ZSBleHBvcnRlZCwgd2UnbGwgd3JpdGUgb3V0IG91ciBfX2FsbF9fIHRoYXQgbGlzdHMgdGhlbS5cbiAgICBjb25zdCBleHBvcnRlZE1lbWJlcnMgPSB0aGlzLm1lbWJlcnMubWFwKChtKSA9PiBgXCIke20ucHl0aG9uTmFtZX1cImApO1xuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgZXhwb3J0ZWRNZW1iZXJzLnB1c2goJ1wiX19qc2lpX2Fzc2VtYmx5X19cIicpO1xuICAgIH1cblxuICAgIC8vIERlY2xhcmUgdGhlIGxpc3Qgb2YgXCJwdWJsaWNcIiBtZW1iZXJzIHRoaXMgbW9kdWxlIGV4cG9ydHNcbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgIH1cbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIGlmIChleHBvcnRlZE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5pbmRlbnQoJ19fYWxsX18gPSBbJyk7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBleHBvcnRlZE1lbWJlcnMuc29ydCgpKSB7XG4gICAgICAgIC8vIFdyaXRpbmcgb25lIGJ5IGxpbmUgbWlnaHQgYmUgX2EgbG90XyBvZiBsaW5lcywgYnV0IGl0J2xsIG1ha2UgcmV2aWV3aW5nIGNoYW5nZXMgdG8gdGhlIGxpc3QgZWFzaWVyLiBUcnVzdCBtZS5cbiAgICAgICAgY29kZS5saW5lKGAke21lbWJlcn0sYCk7XG4gICAgICB9XG4gICAgICBjb2RlLnVuaW5kZW50KCddJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnX19hbGxfXzogdHlwaW5nLkxpc3RbdHlwaW5nLkFueV0gPSBbXScpO1xuICAgIH1cblxuICAgIC8vIE5leHQgdXAsIHdlJ2xsIHVzZSBwdWJsaWNhdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgb2YgdGhlIG5vbi1wdWJsaWMgbmFtZXNcbiAgICAvLyBnZXQgaGlkZGVuIGZyb20gZGlyKCksIHRhYi1jb21wbGV0ZSwgZXRjLlxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgncHVibGljYXRpb24ucHVibGlzaCgpJyk7XG5cbiAgICAvLyBGaW5hbGx5LCB3ZSdsbCBsb2FkIGFsbCByZWdpc3RlcmVkIHB5dGhvbiBtb2R1bGVzXG4gICAgaWYgKHRoaXMubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgTG9hZGluZyBtb2R1bGVzIHRvIGVuc3VyZSB0aGVpciB0eXBlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBqc2lpIHJ1bnRpbWUgbGlicmFyeScsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgdGhpcy5tb2R1bGVzLnNvcnQoKGwsIHIpID0+XG4gICAgICAgIGwucHl0aG9uTmFtZS5sb2NhbGVDb21wYXJlKHIucHl0aG9uTmFtZSksXG4gICAgICApKSB7XG4gICAgICAgIGNvZGUubGluZShgaW1wb3J0ICR7bW9kdWxlLnB5dGhvbk5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGJpbiBzY3JpcHRzIGlmIGJpbiBzZWN0aW9uIGRlZmluZWQuXG4gICAqL1xuICBwdWJsaWMgZW1pdEJpblNjcmlwdHMoY29kZTogQ29kZU1ha2VyKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNjcmlwdHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgaWYgKHRoaXMuYXNzZW1ibHkuYmluICE9IG51bGwpIHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuYXNzZW1ibHkuYmluKSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdF9maWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgJ3NyYycsXG4gICAgICAgICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSh0aGlzLnB5dGhvbk5hbWUpLFxuICAgICAgICAgICAgJ2JpbicsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5vcGVuRmlsZShzY3JpcHRfZmlsZSk7XG4gICAgICAgICAgY29kZS5saW5lKCcjIS91c3IvYmluL2VudiBweXRob24nKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJ2ltcG9ydCBqc2lpJyk7XG4gICAgICAgICAgY29kZS5saW5lKCdpbXBvcnQgc3lzJyk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgZW1pdExpc3QoXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fID0ganNpaS5KU0lJQXNzZW1ibHkubG9hZCgnLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5LnZlcnNpb24pLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnB5dGhvbk5hbWUucmVwbGFjZSgnLl9qc2lpJywgJycpKSxcbiAgICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseUZpbGVuYW1lKX1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICcpJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGVtaXRMaXN0KFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICdfX2pzaWlfYXNzZW1ibHlfXy5pbnZva2VCaW5TY3JpcHQoJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS5uYW1lKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSksXG4gICAgICAgICAgICAgICdzeXMuYXJndlsxOl0nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICcpJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvZGUuY2xvc2VGaWxlKHNjcmlwdF9maWxlKTtcbiAgICAgICAgICBzY3JpcHRzLnB1c2goc2NyaXB0X2ZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBSRUFETUUgYXMgbW9kdWxlIGRvY3N0cmluZyBpZiB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBtb2R1bGUgKGl0IGxvYWRzIHRoZSBhc3NlbWJseSlcbiAgICovXG4gIHByaXZhdGUgZW1pdE1vZHVsZURvY3VtZW50YXRpb24oY29kZTogQ29kZU1ha2VyKSB7XG4gICAgaWYgKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbikge1xuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgICAgY29kZS5saW5lKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbik7XG4gICAgICBjb2RlLmxpbmUoRE9DU1RSSU5HX1FVT1RFUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGVwZW5kZW5jeUltcG9ydHMoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIChkaXJlY3QpIGRlcGVuZGVuY2llcycgLl9qc2lpIHBhY2thZ2VzLlxuICAgIGNvbnN0IGRlcHMgPSBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgIC5tYXAoXG4gICAgICAgIChkZXApID0+XG4gICAgICAgICAgdGhpcy5hc3NlbWJseS5kZXBlbmRlbmN5Q2xvc3VyZT8uW2RlcF0/LnRhcmdldHM/LnB5dGhvbj8ubW9kdWxlID8/XG4gICAgICAgICAgZGllKGBObyBQeXRob24gdGFyZ2V0IHdhcyBjb25maWdydWVkIGZvciB0aGUgZGVwZW5kZW5jeSBcIiR7ZGVwfVwiLmApLFxuICAgICAgKVxuICAgICAgLm1hcCgobW9kKSA9PiBgJHttb2R9Ll9qc2lpYClcbiAgICAgIC5zb3J0KCk7XG5cbiAgICAvLyBOb3cgYWN0dWFsbHkgd3JpdGUgdGhlIGltcG9ydCBzdGF0ZW1lbnRzLi4uXG4gICAgaWYgKGRlcHMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZU5hbWUgb2YgZGVwcykge1xuICAgICAgICBjb2RlLmxpbmUoYGltcG9ydCAke21vZHVsZU5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVxdWlyZWRJbXBvcnRzKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCByZXF1aXJlZEltcG9ydHMgPSB0aGlzLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRJbXBvcnRzKVxuICAgICAgLm1hcCgoW3NvdXJjZVBhY2thZ2UsIGl0ZW1zXSkgPT4gdG9JbXBvcnRTdGF0ZW1lbnRzKHNvdXJjZVBhY2thZ2UsIGl0ZW1zKSlcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGVsdCkgPT4gWy4uLmFjYywgLi4uZWx0XSxcbiAgICAgICAgbmV3IEFycmF5PHsgZW1pdDogKCkgPT4gdm9pZDsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9PigpLFxuICAgICAgKVxuICAgICAgLnNvcnQoaW1wb3J0Q29tcGFyYXRvcik7XG5cbiAgICBpZiAoc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgc3RhdGVtZW50LmVtaXQoY29kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbXBvcnRTdGF0ZW1lbnRzKFxuICAgICAgc291cmNlUGtnOiBzdHJpbmcsXG4gICAgICBpdGVtczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgICApOiBBcnJheTx7IGVtaXQ6IChjb2RlOiBDb2RlTWFrZXIpID0+IHZvaWQ7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHtcbiAgICAgICAgZW1pdDogKGNvZGU6IENvZGVNYWtlcikgPT4gdm9pZDtcbiAgICAgICAgY29tcGFyaXNvbkJhc2U6IHN0cmluZztcbiAgICAgIH0+KCk7XG4gICAgICBpZiAoaXRlbXMuaGFzKCcnKSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY29tcGFyaXNvbkJhc2U6IGBpbXBvcnQgJHtzb3VyY2VQa2d9YCxcbiAgICAgICAgICBlbWl0KGNvZGUpIHtcbiAgICAgICAgICAgIGNvZGUubGluZSh0aGlzLmNvbXBhcmlzb25CYXNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBpZWNlTWVhbCA9IEFycmF5LmZyb20oaXRlbXMpXG4gICAgICAgIC5maWx0ZXIoKGkpID0+IGkgIT09ICcnKVxuICAgICAgICAuc29ydCgpO1xuICAgICAgaWYgKHBpZWNlTWVhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjb21wYXJpc29uQmFzZTogYGZyb20gJHtzb3VyY2VQa2d9IGltcG9ydGAsXG4gICAgICAgICAgZW1pdDogKGNvZGUpID0+XG4gICAgICAgICAgICBlbWl0TGlzdChjb2RlLCBgZnJvbSAke3NvdXJjZVBrZ30gaW1wb3J0IGAsIHBpZWNlTWVhbCwgJycsIHtcbiAgICAgICAgICAgICAgaWZNdWx0aTogWycoJywgJyknXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW1wb3J0Q29tcGFyYXRvcihcbiAgICAgIGxlZnQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICAgcmlnaHQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBsZWZ0LmNvbXBhcmlzb25CYXNlLnN0YXJ0c1dpdGgoJ2ltcG9ydCcpID09PVxuICAgICAgICByaWdodC5jb21wYXJpc29uQmFzZS5zdGFydHNXaXRoKCdpbXBvcnQnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBsZWZ0LmNvbXBhcmlzb25CYXNlLmxvY2FsZUNvbXBhcmUocmlnaHQuY29tcGFyaXNvbkJhc2UpO1xuICAgICAgfVxuICAgICAgLy8gV2Ugd2FudCBcImZyb20gLmZvbyBpbXBvcnQgKC4uLilcIiB0byBiZSAqYWZ0ZXIqIFwiaW1wb3J0IGJhclwiXG4gICAgICByZXR1cm4gcmlnaHQuY29tcGFyaXNvbkJhc2UubG9jYWxlQ29tcGFyZShsZWZ0LmNvbXBhcmlzb25CYXNlKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VEYXRhIHtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5jbGFzcyBQYWNrYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBQeXRob25Nb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSByb290IG1vZHVsZSBvZiB0aGUgcGFja2FnZVxuICAgKi9cbiAgcHVibGljIHJvb3RNb2R1bGU/OiBQeXRob25Nb2R1bGU7XG5cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBQeXRob25Nb2R1bGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlRGF0YVtdPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgbWV0YWRhdGE6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgcHVibGljIGFkZE1vZHVsZShtb2R1bGU6IFB5dGhvbk1vZHVsZSkge1xuICAgIHRoaXMubW9kdWxlcy5zZXQobW9kdWxlLnB5dGhvbk5hbWUsIG1vZHVsZSk7XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBtb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSBhc3NlbWJseVxuICAgIGlmIChtb2R1bGUuZnFuID09PSB0aGlzLm1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkRGF0YShcbiAgICBtb2R1bGU6IFB5dGhvbk1vZHVsZSxcbiAgICBmaWxlbmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzKG1vZHVsZS5weXRob25OYW1lKSkge1xuICAgICAgdGhpcy5kYXRhLnNldChtb2R1bGUucHl0aG9uTmFtZSwgW10pO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5nZXQobW9kdWxlLnB5dGhvbk5hbWUpIS5wdXNoKHsgZmlsZW5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5tb2R1bGVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5weXRob25OYW1lLmxvY2FsZUNvbXBhcmUoYi5weXRob25OYW1lKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG9mIG91ciBtb2R1bGVzLCBhbmQgd3JpdGUgdGhlbSBvdXQgdG8gZGlzay5cbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2R1bGVzKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihcbiAgICAgICAgJ3NyYycsXG4gICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKG1vZC5weXRob25OYW1lKSxcbiAgICAgICAgJ19faW5pdF9fLnB5JyxcbiAgICAgICk7XG5cbiAgICAgIGNvZGUub3BlbkZpbGUoZmlsZW5hbWUpO1xuICAgICAgbW9kLmVtaXQoY29kZSwgY29udGV4dCk7XG4gICAgICBjb2RlLmNsb3NlRmlsZShmaWxlbmFtZSk7XG5cbiAgICAgIHNjcmlwdHMucHVzaCguLi5tb2QuZW1pdEJpblNjcmlwdHMoY29kZSkpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvdXIgcGFja2FnZSBkYXRhLlxuICAgIGNvbnN0IHBhY2thZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFttb2QsIHBkYXRhXSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBwZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5kYXRhICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUobW9kKSxcbiAgICAgICAgICAgIGRhdGEuZmlsZW5hbWUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvZGUub3BlbkZpbGUoZmlsZXBhdGgpO1xuICAgICAgICAgIGNvZGUubGluZShkYXRhLmRhdGEpO1xuICAgICAgICAgIGNvZGUuY2xvc2VGaWxlKGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYWNrYWdlRGF0YVttb2RdID0gcGRhdGEubWFwKChwZCkgPT4gcGQuZmlsZW5hbWUpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgb3VyIGxpc3Qgb2YgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2RlcE5hbWUsIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgdGhpcy5tZXRhZGF0YS5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgKSkge1xuICAgICAgY29uc3QgZGVwSW5mbyA9IHRoaXMubWV0YWRhdGEuZGVwZW5kZW5jeUNsb3N1cmUhW2RlcE5hbWVdO1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIGAke2RlcEluZm8udGFyZ2V0cyEucHl0aG9uIS5kaXN0TmFtZX0ke3RvUHl0aG9uVmVyc2lvblJhbmdlKHZlcnNpb24pfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5lZWQgdG8gYWx3YXlzIHdyaXRlIHRoaXMgZmlsZSBhcyB0aGUgYnVpbGQgcHJvY2VzcyBkZXBlbmRzIG9uIGl0LlxuICAgIC8vIE1ha2UgdXAgc29tZSBjb250ZW50cyBpZiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHVzZWZ1bCB0byBzYXkuXG4gICAgY29kZS5vcGVuRmlsZSgnUkVBRE1FLm1kJyk7XG4gICAgY29kZS5saW5lKFxuICAgICAgdGhpcy5yb290TW9kdWxlPy5tb2R1bGVEb2N1bWVudGF0aW9uID8/XG4gICAgICAgIGAke3RoaXMubmFtZX1cXG4keyc9Jy5yZXBlYXQodGhpcy5uYW1lLmxlbmd0aCl9YCxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdSRUFETUUubWQnKTtcblxuICAgIC8vIFN0cmlwIFwiIChidWlsZCBhYmNkZWYpXCIgZnJvbSB0aGUganNpaSB2ZXJzaW9uXG4gICAgY29uc3QganNpaVZlcnNpb25TaW1wbGUgPSB0aGlzLm1ldGFkYXRhLmpzaWlWZXJzaW9uLnJlcGxhY2UoLyAuKiQvLCAnJyk7XG5cbiAgICBjb25zdCBzZXR1cEt3YXJncyA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgbGljZW5zZTogdGhpcy5tZXRhZGF0YS5saWNlbnNlLFxuICAgICAgdXJsOiB0aGlzLm1ldGFkYXRhLmhvbWVwYWdlLFxuICAgICAgbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGU6ICd0ZXh0L21hcmtkb3duJyxcbiAgICAgIGF1dGhvcjpcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5hdXRob3IubmFtZSArXG4gICAgICAgICh0aGlzLm1ldGFkYXRhLmF1dGhvci5lbWFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgPCR7dGhpcy5tZXRhZGF0YS5hdXRob3IuZW1haWx9PmBcbiAgICAgICAgICA6ICcnKSxcbiAgICAgIGJkaXN0X3doZWVsOiB7XG4gICAgICAgIHVuaXZlcnNhbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwcm9qZWN0X3VybHM6IHtcbiAgICAgICAgU291cmNlOiB0aGlzLm1ldGFkYXRhLnJlcG9zaXRvcnkudXJsLFxuICAgICAgfSxcbiAgICAgIHBhY2thZ2VfZGlyOiB7ICcnOiAnc3JjJyB9LFxuICAgICAgcGFja2FnZXM6IG1vZHVsZXMubWFwKChtKSA9PiBtLnB5dGhvbk5hbWUpLFxuICAgICAgcGFja2FnZV9kYXRhOiBwYWNrYWdlRGF0YSxcbiAgICAgIHB5dGhvbl9yZXF1aXJlczogJz49My42JyxcbiAgICAgIGluc3RhbGxfcmVxdWlyZXM6IFtcbiAgICAgICAgYGpzaWkke3RvUHl0aG9uVmVyc2lvblJhbmdlKGBeJHtqc2lpVmVyc2lvblNpbXBsZX1gKX1gLFxuICAgICAgICAncHVibGljYXRpb24+PTAuMC4zJyxcbiAgICAgIF1cbiAgICAgICAgLmNvbmNhdChkZXBlbmRlbmNpZXMpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICBjbGFzc2lmaWVyczogW1xuICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsXG4gICAgICAgICdPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IEphdmFTY3JpcHQnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMgOjogT25seScsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy42JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjcnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOCcsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy45JyxcbiAgICAgICAgJ1R5cGluZyA6OiBUeXBlZCcsXG4gICAgICBdLFxuICAgICAgc2NyaXB0cyxcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0aGlzLm1ldGFkYXRhLmRvY3M/LnN0YWJpbGl0eSkge1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw6XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA0IC0gQmV0YScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuU3RhYmxlOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKFxuICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlJyxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQ6XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA3IC0gSW5hY3RpdmUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gTm8gJ0RldmVsb3BtZW50IFN0YXR1cycgdHJvdmUgY2xhc3NpZmllciBmb3IgeW91IVxuICAgIH1cblxuICAgIGlmIChzcGR4TGljZW5zZUxpc3RbdGhpcy5tZXRhZGF0YS5saWNlbnNlXT8ub3NpQXBwcm92ZWQpIHtcbiAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0xpY2Vuc2UgOjogT1NJIEFwcHJvdmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkaXRpb25hbENsYXNzaWZpZXJzID0gdGhpcy5tZXRhZGF0YS50YXJnZXRzPy5weXRob24/LmNsYXNzaWZpZXJzO1xuICAgIGlmIChhZGRpdGlvbmFsQ2xhc3NpZmllcnMgIT0gbnVsbCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFkZGl0aW9uYWxDbGFzc2lmaWVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgXCJqc2lpLnRhcmdldHMucHl0aG9uLmNsYXNzaWZpZXJzXCIgdmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIGlmIHByb3ZpZGVkLCBidXQgZm91bmQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGFkZGl0aW9uYWxDbGFzc2lmaWVycyxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGRpc2NvdXJhZ2UgdXNpbmcgdGhvc2Ugc2luY2Ugd2UgYXV0b21hdGljYWxseSBzZXQgYSB2YWx1ZSBmb3IgdGhlbVxuICAgICAgZm9yIChsZXQgY2xhc3NpZmllciBvZiBhZGRpdGlvbmFsQ2xhc3NpZmllcnMuc29ydCgpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIFwianNpaS50YXJnZXRzLnB5dGhvbi5jbGFzc2lmaWVyc1wiIHZhbHVlIGNhbiBvbmx5IGNvbnRhaW4gc3RyaW5ncywgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIGNsYXNzaWZpZXIsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSdsbCBzcGxpdCBvbiBgOjpgIGFuZCByZS1qb2luIGxhdGVyIHNvIGNsYXNzaWZpZXJzIGFyZSBcIm5vcm1hbGl6ZWRcIiB0byBhIHN0YW5kYXJkIHNwYWNpbmdcbiAgICAgICAgY29uc3QgcGFydHMgPSBjbGFzc2lmaWVyLnNwbGl0KCc6OicpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpO1xuICAgICAgICBjb25zdCByZXNlcnZlZENsYXNzaWZpZXJzID0gW1xuICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMnLFxuICAgICAgICAgICdMaWNlbnNlJyxcbiAgICAgICAgICAnT3BlcmF0aW5nIFN5c3RlbScsXG4gICAgICAgICAgJ1R5cGluZycsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChyZXNlcnZlZENsYXNzaWZpZXJzLmluY2x1ZGVzKHBhcnRzWzBdKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBgQ2xhc3NpZmllcnMgc3RhcnRpbmcgd2l0aCAke3Jlc2VydmVkQ2xhc3NpZmllcnNcbiAgICAgICAgICAgICAgLm1hcCgoeCkgPT4gYFwiJHt4fSA6OlwiYClcbiAgICAgICAgICAgICAgLmpvaW4oXG4gICAgICAgICAgICAgICAgJywgJyxcbiAgICAgICAgICAgICAgKX0gYXJlIGF1dG9tYXRpY2FsbHkgc2V0IGFuZCBzaG91bGQgbm90IGJlIG1hbnVhbGx5IGNvbmZpZ3VyZWRgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2xhc3NpZmllciA9IHBhcnRzLmpvaW4oJyA6OiAnKTtcbiAgICAgICAgaWYgKHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLmluY2x1ZGVzKGNsYXNzaWZpZXIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaChjbGFzc2lmaWVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBOZWVkIGEgc2V0dXAucHkgdG8gbWFrZSB0aGlzIFBhY2thZ2UsIGFjdHVhbGx5IGEgUGFja2FnZS5cbiAgICBjb2RlLm9wZW5GaWxlKCdzZXR1cC5weScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGpzb24nKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBzZXR1cHRvb2xzJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdrd2FyZ3MgPSBqc29uLmxvYWRzKCcpO1xuICAgIGNvZGUubGluZSgnICAgIFwiXCJcIicpO1xuICAgIGNvZGUubGluZShKU09OLnN0cmluZ2lmeShzZXR1cEt3YXJncywgbnVsbCwgNCkpO1xuICAgIGNvZGUubGluZSgnXCJcIlwiJyk7XG4gICAgY29kZS5saW5lKCcpJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ3dpdGggb3BlbihcIlJFQURNRS5tZFwiLCBlbmNvZGluZz1cInV0ZjhcIikgYXMgZnAnKTtcbiAgICBjb2RlLmxpbmUoJ2t3YXJnc1tcImxvbmdfZGVzY3JpcHRpb25cIl0gPSBmcC5yZWFkKCknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoJ3NldHVwdG9vbHMuc2V0dXAoKiprd2FyZ3MpJyk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ3NldHVwLnB5Jyk7XG5cbiAgICAvLyBCZWNhdXNlIHdlJ3JlIGdvb2QgY2l0aXplbnMsIHdlJ3JlIGdvaW5nIHRvIGdvIGFoZWFkIGFuZCBzdXBwb3J0IHB5cHJvamVjdC50b21sXG4gICAgLy8gYXMgd2VsbC5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBlYXNpZXIgdG8ganVzdCB1c2UgYSBUT01MIGxpYnJhcnkgdG8gd3JpdGUgdGhpcyBvdXQuXG4gICAgY29kZS5vcGVuRmlsZSgncHlwcm9qZWN0LnRvbWwnKTtcbiAgICBjb2RlLmxpbmUoJ1tidWlsZC1zeXN0ZW1dJyk7XG4gICAgY29uc3QgYnVpbGRUb29scyA9IGZzXG4gICAgICAucmVhZEZpbGVTeW5jKHJlcXVpcmVtZW50c0ZpbGUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IC9eXFxzKiguKylcXHMqI1xccypidWlsZC1zeXN0ZW1cXHMqJC8uZXhlYyhsaW5lKT8uWzFdPy50cmltKCkpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYnVpbGRUb29scywgZW50cnkpID0+IChlbnRyeSA/IFsuLi5idWlsZFRvb2xzLCBlbnRyeV0gOiBidWlsZFRvb2xzKSxcbiAgICAgICAgbmV3IEFycmF5PHN0cmluZz4oKSxcbiAgICAgICk7XG4gICAgY29kZS5saW5lKGByZXF1aXJlcyA9IFske2J1aWxkVG9vbHMubWFwKCh4KSA9PiBgXCIke3h9XCJgKS5qb2luKCcsICcpfV1gKTtcbiAgICBjb2RlLmxpbmUoJ2J1aWxkLWJhY2tlbmQgPSBcInNldHVwdG9vbHMuYnVpbGRfbWV0YVwiJyk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ3B5cHJvamVjdC50b21sJyk7XG5cbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd3JpdGUgb3V0IGEgTUFOSUZFU1QuaW4gdG8gZW5zdXJlIHRoYXQgYWxsIG9mIG91ciByZXF1aXJlZFxuICAgIC8vIGZpbGVzIGFyZSBpbmNsdWRlZC5cbiAgICBjb2RlLm9wZW5GaWxlKCdNQU5JRkVTVC5pbicpO1xuICAgIGNvZGUubGluZSgnaW5jbHVkZSBweXByb2plY3QudG9tbCcpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdNQU5JRkVTVC5pbicpO1xuICB9XG59XG5cbnR5cGUgRmluZE1vZHVsZUNhbGxiYWNrID0gKGZxbjogc3RyaW5nKSA9PiBzcGVjLkFzc2VtYmx5Q29uZmlndXJhdGlvbjtcbnR5cGUgRmluZFR5cGVDYWxsYmFjayA9IChmcW46IHN0cmluZykgPT4gc3BlYy5UeXBlO1xuXG5jbGFzcyBUeXBlUmVzb2x2ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZFRvPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kUmUhOiBSZWdFeHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlTmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZSE6IFJlZ0V4cDtcbiAgcHJpdmF0ZSByZWFkb25seSBmaW5kTW9kdWxlOiBGaW5kTW9kdWxlQ2FsbGJhY2s7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZFR5cGU6IEZpbmRUeXBlQ2FsbGJhY2s7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPixcbiAgICBmaW5kTW9kdWxlOiBGaW5kTW9kdWxlQ2FsbGJhY2ssXG4gICAgZmluZFR5cGU6IEZpbmRUeXBlQ2FsbGJhY2ssXG4gICAgYm91bmRUbz86IHN0cmluZyxcbiAgICBtb2R1bGVOYW1lPzogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgdGhpcy5maW5kTW9kdWxlID0gZmluZE1vZHVsZTtcbiAgICB0aGlzLmZpbmRUeXBlID0gZmluZFR5cGU7XG4gICAgdGhpcy5tb2R1bGVOYW1lID0gbW9kdWxlTmFtZTtcbiAgICB0aGlzLmJvdW5kVG8gPSBib3VuZFRvICE9PSB1bmRlZmluZWQgPyB0aGlzLnRvUHl0aG9uRlFOKGJvdW5kVG8pIDogYm91bmRUbztcblxuICAgIGlmICh0aGlzLm1vZHVsZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tb2R1bGVSZSA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKHRoaXMubW9kdWxlTmFtZSl9KVxcXFwuKC4rKSRgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ib3VuZFRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYm91bmRSZSA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKHRoaXMuYm91bmRUbyl9KVxcXFwuKC4rKSRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYmluZChmcW46IHN0cmluZywgbW9kdWxlTmFtZT86IHN0cmluZyk6IFR5cGVSZXNvbHZlciB7XG4gICAgcmV0dXJuIG5ldyBUeXBlUmVzb2x2ZXIoXG4gICAgICB0aGlzLnR5cGVzLFxuICAgICAgdGhpcy5maW5kTW9kdWxlLFxuICAgICAgdGhpcy5maW5kVHlwZSxcbiAgICAgIGZxbixcbiAgICAgIG1vZHVsZU5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG1vZHVsZU5hbWUuc3RhcnRzV2l0aCgnLicpXG4gICAgICAgICAgPyBgJHt0aGlzLm1vZHVsZU5hbWV9JHttb2R1bGVOYW1lfWBcbiAgICAgICAgICA6IG1vZHVsZU5hbWVcbiAgICAgICAgOiB0aGlzLm1vZHVsZU5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luTW9kdWxlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9XG4gICAgICB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0aGlzLnRvUHl0aG9uRlFOKHR5cGVSZWYuZnFuKSA6IHR5cGVSZWY7XG4gICAgcmV0dXJuIHRoaXMubW9kdWxlUmUudGVzdChweXRob25UeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luTmFtZXNwYWNlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9XG4gICAgICB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0aGlzLnRvUHl0aG9uRlFOKHR5cGVSZWYuZnFuKSA6IHR5cGVSZWY7XG4gICAgcmV0dXJuIHRoaXMuYm91bmRSZS50ZXN0KHB5dGhvblR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmVudCh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIGNvbnN0IGZxbiA9IHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJyA/IHR5cGVSZWYuZnFuIDogdHlwZVJlZjtcbiAgICBjb25zdCBtYXRjaGVzID0gL14oLispXFwuW14uXSskLy5leGVjKGZxbik7XG4gICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEZRTjogJHtmcW59YCk7XG4gICAgfVxuICAgIGNvbnN0IFssIHBhcmVudEZRTl0gPSBtYXRjaGVzO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHlwZXMuZ2V0KHBhcmVudEZRTik7XG5cbiAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgcGFyZW50OiAgJHtwYXJlbnRGUU59YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWZpbmluZ1B5dGhvbk1vZHVsZShcbiAgICB0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBmcW4gPSB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0eXBlUmVmLmZxbiA6IHR5cGVSZWY7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy50eXBlcy5nZXQoZnFuKTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGxldCBtb2QgPSBwYXJlbnQ7XG4gICAgICB3aGlsZSAoIShtb2QgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSB7XG4gICAgICAgIG1vZCA9IHRoaXMuZ2V0UGFyZW50KG1vZC5mcW4hKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtb2QucHl0aG9uTmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaGVzID0gL14oW14uXSspXFwuLy5leGVjKGZxbik7XG4gICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEZRTjogJHtmcW59YCk7XG4gICAgfVxuICAgIGNvbnN0IFssIGFzc21dID0gbWF0Y2hlcztcbiAgICByZXR1cm4gdGhpcy5maW5kTW9kdWxlKGFzc20pLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlO1xuICB9XG5cbiAgcHVibGljIGdldFR5cGUodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlcy5nZXQodHlwZVJlZi5mcW4pO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIHR5cGU6IFwiJHt0eXBlUmVmLmZxbn1cImApO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHVibGljIGRlcmVmZXJlbmNlKHR5cGVSZWY6IHN0cmluZyB8IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKTogc3BlYy5UeXBlIHtcbiAgICBpZiAodHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0eXBlUmVmID0gdHlwZVJlZi5mcW47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmRUeXBlKHR5cGVSZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1B5dGhvbkZRTihmcW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgW2Fzc2VtYmx5TmFtZSwgLi4ucXVhbGlmaWVkSWRlbnRpZmllcnNdID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZnFuUGFydHM6IHN0cmluZ1tdID0gW1xuICAgICAgdGhpcy5maW5kTW9kdWxlKGFzc2VtYmx5TmFtZSkudGFyZ2V0cyEucHl0aG9uIS5tb2R1bGUsXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBxdWFsaWZpZWRJZGVudGlmaWVycykge1xuICAgICAgZnFuUGFydHMucHVzaCh0b1B5dGhvbklkZW50aWZpZXIocGFydCkpO1xuICAgIH1cblxuICAgIHJldHVybiBmcW5QYXJ0cy5qb2luKCcuJyk7XG4gIH1cbn1cblxuY2xhc3MgUHl0aG9uR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHtcbiAgcHJpdmF0ZSBwYWNrYWdlITogUGFja2FnZTtcbiAgcHJpdmF0ZSByb290TW9kdWxlPzogUHl0aG9uTW9kdWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3NldHRhOiBSb3NldHRhLFxuICAgIG9wdGlvbnM6IEdlbmVyYXRvck9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrRm9ybWF0dGVyID0gKHMpID0+IGAke3N9OmA7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2tGb3JtYXR0ZXIgPSAoX3MpID0+IGZhbHNlO1xuXG4gICAgdGhpcy50eXBlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHB1YmxpYyBlbWl0RG9jU3RyaW5nKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczoge1xuICAgICAgYXJndW1lbnRzPzogRG9jdW1lbnRhYmxlQXJndW1lbnRbXTtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW0/OiBzdHJpbmc7XG4gICAgICB0cmFpbGluZ05ld0xpbmU/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgaWYgKCghZG9jcyB8fCBPYmplY3Qua2V5cyhkb2NzKS5sZW5ndGggPT09IDApICYmICFvcHRpb25zLmFyZ3VtZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRvY3MpIHtcbiAgICAgIGRvY3MgPSB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAoZG9jcy5zdW1tYXJ5KSB7XG4gICAgICBsaW5lcy5wdXNoKG1kMnJzdChyZW5kZXJTdW1tYXJ5KGRvY3MpKSk7XG4gICAgICBicmsoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnJrKCkge1xuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0udHJpbSgpICE9PSAnJykge1xuICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBibG9jayhoZWFkaW5nOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZG9CcmsgPSB0cnVlKSB7XG4gICAgICBpZiAoZG9CcmspIHtcbiAgICAgICAgYnJrKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb250ZW50TGluZXMgPSBtZDJyc3QoY29udGVudCkuc3BsaXQoJ1xcbicpO1xuICAgICAgaWYgKGNvbnRlbnRMaW5lcy5sZW5ndGggPD0gMSkge1xuICAgICAgICBsaW5lcy5wdXNoKGA6JHtoZWFkaW5nfTogJHtjb250ZW50TGluZXMuam9pbignJyl9YC50cmltKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgOiR7aGVhZGluZ306YCk7XG4gICAgICAgIGJyaygpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudExpbmVzKSB7XG4gICAgICAgICAgbGluZXMucHVzaChsaW5lLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkb0Jyaykge1xuICAgICAgICBicmsoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZG9jcy5yZW1hcmtzKSB7XG4gICAgICBicmsoKTtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIC4uLm1kMnJzdCh0aGlzLmNvbnZlcnRNYXJrZG93bihkb2NzLnJlbWFya3MgPz8gJycpKS5zcGxpdCgnXFxuJyksXG4gICAgICApO1xuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXJndW1lbnRzPy5sZW5ndGggPz8gMCA+IDApIHtcbiAgICAgIGJyaygpO1xuICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBvcHRpb25zLmFyZ3VtZW50cyEpIHtcbiAgICAgICAgLy8gQWRkIGEgbGluZSBmb3IgZXZlcnkgYXJndW1lbnQuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRpb24sIHdlIG5lZWRcbiAgICAgICAgLy8gdGhlIGRvY3N0cmluZyBzbyB0aGF0IHRoZSBTcGhpbnggZXh0ZW5zaW9uIGNhbiBhZGQgdGhlIHR5cGUgYW5ub3RhdGlvbnMuXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYDpwYXJhbSAke3RvUHl0aG9uUGFyYW1ldGVyTmFtZShwYXJhbS5uYW1lKX06ICR7b25lbGluZURlc2NyaXB0aW9uKFxuICAgICAgICAgICAgcGFyYW0uZG9jcyxcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgICBibG9jaygnZGVmYXVsdCcsIGRvY3MuZGVmYXVsdCk7XG4gICAgfVxuICAgIGlmIChkb2NzLnJldHVybnMpIHtcbiAgICAgIGJsb2NrKCdyZXR1cm4nLCBkb2NzLnJldHVybnMpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5kZXByZWNhdGVkKSB7XG4gICAgICBibG9jaygnZGVwcmVjYXRlZCcsIGRvY3MuZGVwcmVjYXRlZCk7XG4gICAgfVxuICAgIGlmIChkb2NzLnNlZSkge1xuICAgICAgYmxvY2soJ3NlZScsIGRvY3Muc2VlLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkb2NzLnN0YWJpbGl0eSAmJiBzaG91bGRNZW50aW9uU3RhYmlsaXR5KGRvY3Muc3RhYmlsaXR5KSkge1xuICAgICAgYmxvY2soJ3N0YWJpbGl0eScsIGRvY3Muc3RhYmlsaXR5LCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkb2NzLnN1YmNsYXNzYWJsZSkge1xuICAgICAgYmxvY2soJ3N1YmNsYXNzYWJsZScsICdZZXMnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhkb2NzLmN1c3RvbSA/PyB7fSkpIHtcbiAgICAgIGJsb2NrKGssIHYsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5leGFtcGxlKSB7XG4gICAgICBicmsoKTtcbiAgICAgIGxpbmVzLnB1c2goJ0V4YW1wbGU6OicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBjb25zdCBleGFtcGxlVGV4dCA9IHRoaXMuY29udmVydEV4YW1wbGUoZG9jcy5leGFtcGxlKTtcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGV4YW1wbGVUZXh0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgJHtsaW5lfWApO1xuICAgICAgfVxuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09ICcnKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29kZS5saW5lKGAke0RPQ1NUUklOR19RVU9URVN9JHtsaW5lc1swXX0ke0RPQ1NUUklOR19RVU9URVN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZShgJHtET0NTVFJJTkdfUVVPVEVTfSR7bGluZXNbMF19YCk7XG4gICAgICBsaW5lcy5zcGxpY2UoMCwgMSk7XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb2RlLmxpbmUobGluZSk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudHJhaWxpbmdOZXdMaW5lKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29udmVydEV4YW1wbGUoZXhhbXBsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzbmlwcGV0ID0gdHlwZVNjcmlwdFNuaXBwZXRGcm9tU291cmNlKFxuICAgICAgZXhhbXBsZSxcbiAgICAgICdleGFtcGxlJyxcbiAgICAgIGVuZm9yY2VzU3RyaWN0TW9kZSh0aGlzLmFzc2VtYmx5KSxcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJvc2V0dGEudHJhbnNsYXRlU25pcHBldChcbiAgICAgIHNuaXBwZXQsXG4gICAgICBUYXJnZXRMYW5ndWFnZS5QWVRIT04sXG4gICAgKTtcbiAgICBpZiAoIXRyYW5zbGF0ZWQpIHtcbiAgICAgIHJldHVybiBleGFtcGxlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQpO1xuICB9XG5cbiAgcHVibGljIGNvbnZlcnRNYXJrZG93bihtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZVNuaXBwZXRzSW5NYXJrZG93bihcbiAgICAgIG1hcmtkb3duLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICAgKHRyYW5zKSA9PiAoe1xuICAgICAgICBsYW5ndWFnZTogdHJhbnMubGFuZ3VhZ2UsXG4gICAgICAgIHNvdXJjZTogdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByZWZpeERpc2NsYWltZXIodHJhbnNsYXRlZDogVHJhbnNsYXRpb24pIHtcbiAgICBpZiAodHJhbnNsYXRlZC5kaWRDb21waWxlICYmIElOQ09NUExFVEVfRElTQ0xBSU1FUl9DT01QSUxJTkcpIHtcbiAgICAgIHJldHVybiBgIyAke0lOQ09NUExFVEVfRElTQ0xBSU1FUl9DT01QSUxJTkd9XFxuJHt0cmFuc2xhdGVkLnNvdXJjZX1gO1xuICAgIH1cbiAgICBpZiAoIXRyYW5zbGF0ZWQuZGlkQ29tcGlsZSAmJiBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HKSB7XG4gICAgICByZXR1cm4gYCMgJHtJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HfVxcbiR7dHJhbnNsYXRlZC5zb3VyY2V9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldFB5dGhvblR5cGUoZnFuOiBzdHJpbmcpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlcy5nZXQoZnFuKTtcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvY2F0ZSB0eXBlOiBcIiR7ZnFufVwiYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXNzZW1ibHlPdXRwdXREaXIoYXNzbTogc3BlYy5Bc3NlbWJseSkge1xuICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAnc3JjJyxcbiAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKHRoaXMuZ2V0QXNzZW1ibHlNb2R1bGVOYW1lKGFzc20pKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5Bc3NlbWJseShhc3NtOiBzcGVjLkFzc2VtYmx5LCBfZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnBhY2thZ2UgPSBuZXcgUGFja2FnZShcbiAgICAgIGFzc20udGFyZ2V0cyEucHl0aG9uIS5kaXN0TmFtZSxcbiAgICAgIHRvUmVsZWFzZVZlcnNpb24oYXNzbS52ZXJzaW9uLCBUYXJnZXROYW1lLlBZVEhPTiksXG4gICAgICBhc3NtLFxuICAgICk7XG5cbiAgICAvLyBUaGlzIGlzIHRoZSAnPHBhY2thZ2VuYW1lPi5fanNpaScgbW9kdWxlIGZvciB0aGlzIGFzc2VtYmx5XG4gICAgY29uc3QgYXNzZW1ibHlNb2R1bGUgPSBuZXcgUHl0aG9uTW9kdWxlKFxuICAgICAgdGhpcy5nZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbSksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGFzc2VtYmx5OiBhc3NtLFxuICAgICAgICBhc3NlbWJseUZpbGVuYW1lOiB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSxcbiAgICAgICAgbG9hZEFzc2VtYmx5OiB0cnVlLFxuICAgICAgICBwYWNrYWdlOiB0aGlzLnBhY2thZ2UsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkTW9kdWxlKGFzc2VtYmx5TW9kdWxlKTtcbiAgICB0aGlzLnBhY2thZ2UuYWRkRGF0YShhc3NlbWJseU1vZHVsZSwgdGhpcy5nZXRBc3NlbWJseUZpbGVOYW1lKCksIHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRBc3NlbWJseShhc3NtOiBzcGVjLkFzc2VtYmx5LCBfZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUeXBlUmVzb2x2ZXIoXG4gICAgICB0aGlzLnR5cGVzLFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRNb2R1bGUoZnFuKSxcbiAgICAgIChmcW46IHN0cmluZykgPT4gdGhpcy5maW5kVHlwZShmcW4pLFxuICAgICk7XG4gICAgdGhpcy5wYWNrYWdlLndyaXRlKHRoaXMuY29kZSwge1xuICAgICAgYXNzZW1ibHk6IGFzc20sXG4gICAgICBlbWl0dGVkVHlwZXM6IG5ldyBTZXQoKSxcbiAgICAgIHJlc29sdmVyLFxuICAgICAgc3VibW9kdWxlOiBhc3NtLm5hbWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCBiZSBjYWxsZWQgZm9yIGFzc2VtYmx5IHJvb3QsIG5hbWVzcGFjZXMgYW5kIHN1Ym1vZHVsZXMgKGFueXRoaW5nIHRoYXQgY29udGFpbnMgb3RoZXIgdHlwZXMsIGJhc2VkIG9uIGl0cyBGUU4pXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CZWdpbk5hbWVzcGFjZShuczogc3RyaW5nKSB7XG4gICAgLy8gJ25zJyBjb250YWlucyBzb21ldGhpbmcgbGlrZSAnQHNjb3BlL2pzaWktY2FsYy1iYXNlLW9mLWJhc2UnXG4gICAgY29uc3Qgc3VibW9kdWxlTGlrZSA9XG4gICAgICBucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lXG4gICAgICAgID8gdGhpcy5hc3NlbWJseVxuICAgICAgICA6IHRoaXMuYXNzZW1ibHkuc3VibW9kdWxlcz8uW25zXTtcblxuICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBQeXRob25Nb2R1bGUodG9QYWNrYWdlTmFtZShucywgdGhpcy5hc3NlbWJseSksIG5zLCB7XG4gICAgICBhc3NlbWJseTogdGhpcy5hc3NlbWJseSxcbiAgICAgIGFzc2VtYmx5RmlsZW5hbWU6IHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLFxuICAgICAgcGFja2FnZTogdGhpcy5wYWNrYWdlLFxuICAgICAgbW9kdWxlRG9jdW1lbnRhdGlvbjogc3VibW9kdWxlTGlrZT8ucmVhZG1lXG4gICAgICAgID8gdGhpcy5jb252ZXJ0TWFya2Rvd24oc3VibW9kdWxlTGlrZS5yZWFkbWU/Lm1hcmtkb3duKS50cmltKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkTW9kdWxlKG1vZHVsZSk7XG4gICAgdGhpcy50eXBlcy5zZXQobnMsIG1vZHVsZSk7XG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIC8vIFRoaXMgYXBwbGllcyByZWN1cnNpdmVseSB0byBzdWJtb2R1bGVzLCBzbyBubyBuZWVkIHRvIGR1cGxpY2F0ZSFcbiAgICAgIHRoaXMucGFja2FnZS5hZGREYXRhKG1vZHVsZSwgJ3B5LnR5cGVkJywgJycpO1xuICAgIH1cblxuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSEuYWRkUHl0aG9uTW9kdWxlKG1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdE1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2xhc3MgPSBuZXcgQ2xhc3MoXG4gICAgICB0aGlzLFxuICAgICAgdG9QeXRob25JZGVudGlmaWVyKGNscy5uYW1lKSxcbiAgICAgIGNscy5mcW4sXG4gICAgICB7XG4gICAgICAgIGFic3RyYWN0LFxuICAgICAgICBiYXNlczogY2xzLmJhc2UgPyBbdGhpcy5maW5kVHlwZShjbHMuYmFzZSldIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcmZhY2VzOiBjbHMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSxcbiAgICAgICAgYWJzdHJhY3RCYXNlczogYWJzdHJhY3QgPyB0aGlzLmdldEFic3RyYWN0QmFzZXMoY2xzKSA6IFtdLFxuICAgICAgfSxcbiAgICAgIGNscy5kb2NzLFxuICAgICk7XG5cbiAgICBpZiAoY2xzLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBjbHMuaW5pdGlhbGl6ZXI7XG5cbiAgICAgIGtsYXNzLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEluaXRpYWxpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgJ19faW5pdF9fJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY2xzLmluaXRpYWxpemVyLmRvY3MsXG4gICAgICAgICAgZmFsc2UsIC8vIE5ldmVyIHN0YXRpY1xuICAgICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKGNscy5pbml0aWFsaXplciksIHBhcmVudDogY2xzIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShrbGFzcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY01ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgdHJ1ZSwgLy8gQWx3YXlzIHN0YXRpY1xuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY1Byb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY1Byb3BlcnR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUsIHByb3AuY29uc3QpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gbWV0aG9kO1xuXG4gICAgaWYgKG1ldGhvZC5hc3luYykge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEFzeW5jTWV0aG9kKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IE1ldGhvZChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSwgbWV0aG9kLnByb3RlY3RlZCksXG4gICAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCwgcHJvcC5wcm90ZWN0ZWQpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVW5pb25Qcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uOiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5vblByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIGxldCBpZmFjZTogSW50ZXJmYWNlIHwgU3RydWN0O1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2UgPSBuZXcgU3RydWN0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMuZnFuLFxuICAgICAgICB7IGJhc2VzOiBpZmMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSB9LFxuICAgICAgICBpZmMuZG9jcyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmYWNlID0gbmV3IEludGVyZmFjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25JZGVudGlmaWVyKGlmYy5uYW1lKSxcbiAgICAgICAgaWZjLmZxbixcbiAgICAgICAgeyBiYXNlczogaWZjLmludGVyZmFjZXM/Lm1hcCgoYmFzZSkgPT4gdGhpcy5maW5kVHlwZShiYXNlKSkgfSxcbiAgICAgICAgaWZjLmRvY3MsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShpZmFjZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRJbnRlcmZhY2UoX2lmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IG1ldGhvZDtcblxuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShpZmMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgSW50ZXJmYWNlTWV0aG9kKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUsIG1ldGhvZC5wcm90ZWN0ZWQpLFxuICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksIHBhcmVudDogaWZjIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VQcm9wZXJ0eShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIGxldCBpZmFjZVByb3BlcnR5OiBJbnRlcmZhY2VQcm9wZXJ0eSB8IFN0cnVjdEZpZWxkO1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLCBwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBJbnRlcmZhY2VQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0LCBwcm9wLnByb3RlY3RlZCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7IGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsIGlzU3RhdGljOiBwcm9wLnN0YXRpYywgcGFyZW50OiBpZmMgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGlmYy5mcW4pLmFkZE1lbWJlcihpZmFjZVByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoXG4gICAgICBuZXcgRW51bSh0aGlzLCB0b1B5dGhvbklkZW50aWZpZXIoZW5tLm5hbWUpLCBlbm0uZnFuLCB7fSwgZW5tLmRvY3MpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbnVtTWVtYmVyKGVubTogc3BlYy5FbnVtVHlwZSwgbWVtYmVyOiBzcGVjLkVudW1NZW1iZXIpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoZW5tLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IEVudW1NZW1iZXIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uSWRlbnRpZmllcihtZW1iZXIubmFtZSksXG4gICAgICAgIG1lbWJlci5uYW1lLFxuICAgICAgICBtZW1iZXIuZG9jcyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZE92ZXJsb2FkKFxuICAgIF9pZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IEludGVyZmFjZU1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IE1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IFN0YXRpY01ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtOiBzcGVjLkFzc2VtYmx5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXNzbS50YXJnZXRzIS5weXRob24hLm1vZHVsZX0uX2pzaWlgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJlbnRGUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG0gPSAvXiguKylcXC5bXi5dKyQvLmV4ZWMoZnFuKTtcblxuICAgIGlmIChtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwYXJlbnQgRlFOIG9mOiAke2Zxbn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbVsxXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyZW50KGZxbjogc3RyaW5nKTogUHl0aG9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHl0aG9uVHlwZSh0aGlzLmdldFBhcmVudEZRTihmcW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHl0aG9uVHlwZSh0eXBlOiBQeXRob25UeXBlKSB7XG4gICAgaWYgKHR5cGUuZnFuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBhIFB5dGhvbiB0eXBlIHdpdGhvdXQgYSBGUU4uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQYXJlbnQodHlwZS5mcW4pLmFkZE1lbWJlcih0eXBlKTtcbiAgICB0aGlzLnR5cGVzLnNldCh0eXBlLmZxbiwgdHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldGxpZnRlZFByb3AoXG4gICAgbWV0aG9kOiBzcGVjLk1ldGhvZCB8IHNwZWMuSW5pdGlhbGl6ZXIsXG4gICk6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gSWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gdGhpcyBtZXRob2QsIGFuZCBpZiB0aGUgbGFzdCBwYXJhbWV0ZXIncyB0eXBlIGlzXG4gICAgLy8gYSBkYXRhdHlwZSBpbnRlcmZhY2UsIHRoZW4gd2Ugd2FudCB0byBsaWZ0IHRoZSBtZW1iZXJzIG9mIHRoYXQgbGFzdCBwYXJhbXRlclxuICAgIC8vIGFzIGtleXdvcmQgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgaWYgKG1ldGhvZC5wYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCA+PSAxKSB7XG4gICAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gbWV0aG9kLnBhcmFtZXRlcnMhLnNsaWNlKC0xKVswXTtcbiAgICAgIGlmIChcbiAgICAgICAgIWxhc3RQYXJhbWV0ZXIudmFyaWFkaWMgJiZcbiAgICAgICAgc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShsYXN0UGFyYW1ldGVyLnR5cGUpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbGFzdFBhcmFtZXRlclR5cGUgPSB0aGlzLmZpbmRUeXBlKGxhc3RQYXJhbWV0ZXIudHlwZS5mcW4pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3BlYy5pc0ludGVyZmFjZVR5cGUobGFzdFBhcmFtZXRlclR5cGUpICYmXG4gICAgICAgICAgbGFzdFBhcmFtZXRlclR5cGUuZGF0YXR5cGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGxhc3RQYXJhbWV0ZXJUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWJzdHJhY3RCYXNlcyhjbHM6IHNwZWMuQ2xhc3NUeXBlKTogc3BlYy5DbGFzc1R5cGVbXSB7XG4gICAgY29uc3QgYWJzdHJhY3RCYXNlczogc3BlYy5DbGFzc1R5cGVbXSA9IFtdO1xuXG4gICAgaWYgKGNscy5iYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmZpbmRUeXBlKGNscy5iYXNlKTtcblxuICAgICAgaWYgKCFzcGVjLmlzQ2xhc3NUeXBlKGJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIGluaGVyaXRlbmNlIHRoYXQgaXNuJ3QgYSBjbGFzcz9cIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChiYXNlLmFic3RyYWN0KSB7XG4gICAgICAgIGFic3RyYWN0QmFzZXMucHVzaChiYXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWJzdHJhY3RCYXNlcztcbiAgfVxufVxuXG4vKipcbiAqIFBvc2l0aW9uYWwgYXJndW1lbnQgb3Iga2V5d29yZCBwYXJhbWV0ZXJcbiAqL1xuaW50ZXJmYWNlIERvY3VtZW50YWJsZUFyZ3VtZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkb2NzPzogc3BlYy5Eb2NzO1xufVxuXG4vKipcbiAqIFJlbmRlciBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBnaXZlbiBkb2NzLCB1c2VkIGZvciBtZXRob2QgYXJndW1lbnRzIGFuZCBpbmxpbmVkIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gb25lbGluZURlc2NyaXB0aW9uKGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCkge1xuICAvLyBPbmx5IGNvbnNpZGVyIGEgc3Vic2V0IG9mIGZpZWxkcyBoZXJlLCB3ZSBkb24ndCBoYXZlIGEgbG90IG9mIGZvcm1hdHRpbmcgc3BhY2VcbiAgaWYgKCFkb2NzIHx8IE9iamVjdC5rZXlzKGRvY3MpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnLSc7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IFtdO1xuICBpZiAoZG9jcy5zdW1tYXJ5KSB7XG4gICAgcGFydHMucHVzaChtZDJyc3QocmVuZGVyU3VtbWFyeShkb2NzKSkpO1xuICB9XG4gIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICBwYXJ0cy5wdXNoKG1kMnJzdChkb2NzLnJlbWFya3MpKTtcbiAgfVxuICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgcGFydHMucHVzaChgRGVmYXVsdDogJHttZDJyc3QoZG9jcy5kZWZhdWx0KX1gKTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbignICcpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkTWVudGlvblN0YWJpbGl0eShzOiBzcGVjLlN0YWJpbGl0eSkge1xuICAvLyBEb24ndCByZW5kZXIgXCJzdGFibGVcIiBvciBcImV4dGVybmFsXCIsIHRob3NlIGFyZSBib3RoIHN0YWJsZSBieSBpbXBsaWNhdGlvbi5cbiAgcmV0dXJuIHMgPT09IHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQgfHwgcyA9PT0gc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsO1xufVxuXG5mdW5jdGlvbiBpc1N0cnVjdChcbiAgdHlwZVN5c3RlbTogcmVmbGVjdC5UeXBlU3lzdGVtLFxuICByZWY6IHNwZWMuVHlwZVJlZmVyZW5jZSxcbik6IGJvb2xlYW4ge1xuICBpZiAoIXNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UocmVmKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB0eXBlID0gdHlwZVN5c3RlbS50cnlGaW5kRnFuKHJlZi5mcW4pO1xuICByZXR1cm4gISEodHlwZT8uaXNJbnRlcmZhY2VUeXBlKCkgJiYgdHlwZT8uaXNEYXRhVHlwZSgpKTtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGBfYCBhdCB0aGUgZW5kIG9mIGBuYW1lYCB1bnRpbCBpdCBubyBsb25nZXIgY29uZmxpY3RzIHdpdGggYW55IG9mIHRoZVxuICogZW50cmllcyBpbiBgaW5Vc2VgLlxuICpcbiAqIEBwYXJhbSBuYW1lICB0aGUgbmFtZSB0byBiZSBzbHVnaWZpZWQuXG4gKiBAcGFyYW0gaW5Vc2UgdGhlIG5hbWVzIHRoYXQgYXJlIGFscmVhZHkgYmVpbmcgdXNlZC5cbiAqXG4gKiBAcmV0dXJucyB0aGUgc2x1Z2lmaWVkIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHNsdWdpZnlBc05lZWRlZChuYW1lOiBzdHJpbmcsIGluVXNlOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGluVXNlU2V0ID0gbmV3IFNldChpblVzZSk7XG4gIHdoaWxlIChpblVzZVNldC5oYXMobmFtZSkpIHtcbiAgICBuYW1lID0gYCR7bmFtZX1fYDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEJFSE9MRDogSGVscGVycyB0byBvdXRwdXQgY29kZSB0aGF0IGxvb2tzIGxpa2Ugd2hhdCBCbGFjayB3b3VsZCBmb3JtYXQgaW50by4uLlxuLy9cbi8vIEBzZWUgaHR0cHM6Ly9ibGFjay5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvdGhlX2JsYWNrX2NvZGVfc3R5bGUuaHRtbFxuXG5jb25zdCBUQVJHRVRfTElORV9MRU5HVEggPSA4ODtcblxuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnY2xhc3MnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiB2b2lkO1xuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnZGVmJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZ0NvbW1hOiBib29sZWFuLFxuICByZXR1cm5UeXBlOiBzdHJpbmcsXG4pOiB2b2lkO1xuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnY2xhc3MnIHwgJ2RlZicsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmdDb21tYSA9IGZhbHNlLFxuICByZXR1cm5UeXBlPzogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke2tleXdvcmR9ICR7bmFtZX1gO1xuICBjb25zdCBzdWZmaXggPSByZXR1cm5UeXBlID8gYCAtPiAke3JldHVyblR5cGV9YCA6ICcnO1xuICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUub3BlbkJsb2NrKGAke3ByZWZpeH0ke3JldHVyblR5cGUgPyAnKCknIDogJyd9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YocGFyYW1zLCBqb2luKTtcblxuICBjb25zdCBoYXNDb21tZW50cyA9ICFwYXJhbXMuc29tZSgocGFyYW0pID0+IC8jIC4rJC8uZXhlYyhwYXJhbSkpO1xuXG4gIGlmIChcbiAgICBoYXNDb21tZW50cyAmJlxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICBzdWZmaXgubGVuZ3RoICtcbiAgICAgICAgMlxuICApIHtcbiAgICBjb2RlLm9wZW5CbG9jayhgJHtwcmVmaXh9KCR7cGFyYW1zLmpvaW4oam9pbil9KSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvZGUuaW5kZW50KGAke3ByZWZpeH0oYCk7XG4gIGlmIChcbiAgICAhaGFzQ29tbWVudHMgJiZcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICAodHJhaWxpbmdDb21tYSA/IDEgOiAwKVxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cGFyYW1zLmpvaW4oam9pbil9JHt0cmFpbGluZ0NvbW1hID8gJywnIDogJyd9YCk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgIGNvZGUubGluZShwYXJhbS5yZXBsYWNlKC8oXFxzKiMgLispPyQvLCAnLCQxJykpO1xuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KGZhbHNlKTtcbiAgY29kZS5vcGVuQmxvY2soYCkke3N1ZmZpeH1gKTtcbn1cblxuZnVuY3Rpb24gYXNzaWduQ2FsbFJlc3VsdChcbiAgY29kZTogQ29kZU1ha2VyLFxuICB2YXJpYWJsZTogc3RyaW5nLFxuICBmdW5jdDogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke3ZhcmlhYmxlfSA9ICR7ZnVuY3R9KGA7XG4gIGNvbnN0IHN1ZmZpeCA9ICcpJztcblxuICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YocGFyYW1zLCBqb2luKTtcblxuICBpZiAoXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgam9pblNpemUgK1xuICAgICAgc3VmZml4Lmxlbmd0aFxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7cGFyYW1zLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29kZS5pbmRlbnQocHJlZml4KTtcbiAgaWYgKFRBUkdFVF9MSU5FX0xFTkdUSCA+IGNvZGUuY3VycmVudEluZGVudExlbmd0aCArIGVsZW1lbnRzU2l6ZSArIGpvaW5TaXplKSB7XG4gICAgY29kZS5saW5lKHBhcmFtcy5qb2luKGpvaW4pKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29kZS5saW5lKGAke3BhcmFtfSxgKTtcbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChzdWZmaXgpO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25EaWN0aW9uYXJ5KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHZhcmlhYmxlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmc/OiBzdHJpbmcsXG4gIGNvbXBhY3QgPSBmYWxzZSxcbik6IHZvaWQge1xuICBjb25zdCBzcGFjZSA9IGNvbXBhY3QgPyAnJyA6ICcgJztcblxuICBjb25zdCBwcmVmaXggPSBgJHt2YXJpYWJsZX0ke3NwYWNlfT0ke3NwYWNlfXtgO1xuICBjb25zdCBzdWZmaXggPSBgfSR7dHJhaWxpbmcgPz8gJyd9YDtcblxuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY29tcGFjdCkge1xuICAgIGNvbnN0IGpvaW4gPSAnLCAnO1xuICAgIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YoZWxlbWVudHMsIGpvaW4pO1xuICAgIGlmIChcbiAgICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICBzdWZmaXgubGVuZ3RoXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7ZWxlbWVudHMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb2RlLmluZGVudChwcmVmaXgpO1xuICBmb3IgKGNvbnN0IGVsdCBvZiBlbGVtZW50cykge1xuICAgIGNvZGUubGluZShgJHtlbHR9LGApO1xuICB9XG4gIGNvZGUudW5pbmRlbnQoc3VmZml4KTtcbn1cblxuZnVuY3Rpb24gZW1pdExpc3QoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGVsZW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgc3VmZml4OiBzdHJpbmcsXG4gIG9wdHM/OiB7IGlmTXVsdGk6IFtzdHJpbmcsIHN0cmluZ10gfSxcbikge1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihlbGVtZW50cywgam9pbik7XG4gIGlmIChcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICBqb2luU2l6ZSArXG4gICAgICBzdWZmaXgubGVuZ3RoXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtlbGVtZW50cy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IFtiZWZvcmUsIGFmdGVyXSA9IG9wdHM/LmlmTXVsdGkgPz8gWycnLCAnJ107XG5cbiAgY29kZS5pbmRlbnQoYCR7cHJlZml4fSR7YmVmb3JlfWApO1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgY29kZS5saW5lKGVsZW1lbnRzWzBdKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXG4gICAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICsgZWxlbWVudHNTaXplICsgam9pblNpemVcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShlbGVtZW50cy5qb2luKGpvaW4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBlbHQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgY29kZS5saW5lKGAke2VsdH0sYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoYCR7YWZ0ZXJ9JHtzdWZmaXh9YCk7XG59XG5cbmZ1bmN0aW9uIHRvdGFsU2l6ZU9mKHN0cmluZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBqb2luOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50c1NpemU6IHN0cmluZ3NcbiAgICAgIC5tYXAoKHN0cikgPT4gc3RyLmxlbmd0aClcbiAgICAgIC5yZWR1Y2UoKGFjYywgZWx0KSA9PiBhY2MgKyBlbHQsIDApLFxuICAgIGpvaW5TaXplOiBzdHJpbmdzLmxlbmd0aCA+IDEgPyBqb2luLmxlbmd0aCAqIChzdHJpbmdzLmxlbmd0aCAtIDEpIDogMCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbmVzdGVkQ29udGV4dChcbiAgY29udGV4dDogRW1pdENvbnRleHQsXG4gIGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogRW1pdENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIC4uLmNvbnRleHQsXG4gICAgc3Vycm91bmRpbmdUeXBlRnFuczpcbiAgICAgIGZxbiAhPSBudWxsXG4gICAgICAgID8gWy4uLihjb250ZXh0LnN1cnJvdW5kaW5nVHlwZUZxbnMgPz8gW10pLCBmcW5dXG4gICAgICAgIDogY29udGV4dC5zdXJyb3VuZGluZ1R5cGVGcW5zLFxuICB9O1xufVxuXG5jb25zdCBpc0RlcHJlY2F0ZWQgPSAoeDogUHl0aG9uQmFzZSkgPT4geC5kb2NzPy5kZXByZWNhdGVkICE9PSB1bmRlZmluZWQ7XG4iXX0=
|
|
2069
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FNc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQTZEO0FBQzdELGtEQU00QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLHdCQUFtRTtBQUVuRSxvR0FBb0c7QUFDcEcsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFckQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNuQyxTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixDQUN2QixDQUFDO0FBRUYsMkVBQTJFO0FBQzNFLCtGQUErRjtBQUMvRixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUUvQixNQUFxQixNQUFPLFNBQVEsZUFBTTtJQUd4QyxZQUFtQixPQUFzQjtRQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFjLEVBQUUsT0FBZTtRQUN2RCxNQUFNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQWlCLEVBQUUsTUFBYztRQUNsRCw2QkFBNkI7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FB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Y2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBDb2RlTWFrZXIsIHRvU25ha2VDYXNlIH0gZnJvbSAnY29kZW1ha2VyJztcbmltcG9ydCAqIGFzIGVzY2FwZVN0cmluZ1JlZ2V4cCBmcm9tICdlc2NhcGUtc3RyaW5nLXJlZ2V4cCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQge1xuICBUYXJnZXRMYW5ndWFnZSxcbiAgVHJhbnNsYXRpb24sXG4gIFJvc2V0dGEsXG4gIGVuZm9yY2VzU3RyaWN0TW9kZSxcbiAgQXBpTG9jYXRpb24sXG59IGZyb20gJ2pzaWktcm9zZXR0YSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBHZW5lcmF0b3IsIEdlbmVyYXRvck9wdGlvbnMgfSBmcm9tICcuLi9nZW5lcmF0b3InO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgbWQycnN0IH0gZnJvbSAnLi4vbWFya2Rvd24nO1xuaW1wb3J0IHsgVGFyZ2V0LCBUYXJnZXRPcHRpb25zIH0gZnJvbSAnLi4vdGFyZ2V0JztcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyByZW5kZXJTdW1tYXJ5LCBQcm9wZXJ0eURlZmluaXRpb24gfSBmcm9tICcuL191dGlscyc7XG5pbXBvcnQge1xuICBOYW1pbmdDb250ZXh0LFxuICB0b1R5cGVOYW1lLFxuICBQeXRob25JbXBvcnRzLFxuICBtZXJnZVB5dGhvbkltcG9ydHMsXG4gIHRvUGFja2FnZU5hbWUsXG59IGZyb20gJy4vcHl0aG9uL3R5cGUtbmFtZSc7XG5pbXBvcnQgeyBkaWUsIHRvUHl0aG9uSWRlbnRpZmllciB9IGZyb20gJy4vcHl0aG9uL3V0aWwnO1xuaW1wb3J0IHsgdG9QeXRob25WZXJzaW9uUmFuZ2UsIHRvUmVsZWFzZVZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24tdXRpbHMnO1xuXG5pbXBvcnQgeyBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HLCBUYXJnZXROYW1lIH0gZnJvbSAnLic7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzLEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHNwZHhMaWNlbnNlTGlzdCA9IHJlcXVpcmUoJ3NwZHgtbGljZW5zZS1saXN0Jyk7XG5cbmNvbnN0IHJlcXVpcmVtZW50c0ZpbGUgPSBwYXRoLnJlc29sdmUoXG4gIF9fZGlybmFtZSxcbiAgJ3B5dGhvbicsXG4gICdyZXF1aXJlbWVudHMtZGV2LnR4dCcsXG4pO1xuXG4vLyB3ZSB1c2Ugc2luZ2xlLXF1b3RlcyBmb3IgbXVsdGktbGluZSBzdHJpbmdzIHRvIGFsbG93IGV4YW1wbGVzIHdpdGhpbiB0aGVcbi8vIGRvY3N0cmluZ3MgdGhlbXNlbHZlcyB0byBpbmNsdWRlIGRvdWJsZS1xdW90ZXMgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI1NjkpXG5jb25zdCBET0NTVFJJTkdfUVVPVEVTID0gXCInJydcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHl0aG9uIGV4dGVuZHMgVGFyZ2V0IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBUYXJnZXRPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLmdlbmVyYXRvciA9IG5ldyBQeXRob25HZW5lcmF0b3Iob3B0aW9ucy5yb3NldHRhKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUNvZGUob3V0RGlyOiBzdHJpbmcsIHRhcmJhbGw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLmdlbmVyYXRlQ29kZShvdXREaXIsIHRhcmJhbGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkKHNvdXJjZURpcjogc3RyaW5nLCBvdXREaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENyZWF0ZSBhIGZyZXNoIHZpcnR1YWwgZW52XG4gICAgY29uc3QgdmVudiA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKHNvdXJjZURpciwgJy5lbnYtJykpO1xuICAgIGNvbnN0IHZlbnZCaW4gPSBwYXRoLmpvaW4oXG4gICAgICB2ZW52LFxuICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICdTY3JpcHRzJyA6ICdiaW4nLFxuICAgICk7XG4gICAgYXdhaXQgc2hlbGwoJ3B5dGhvbjMnLCBbXG4gICAgICAnLW0nLFxuICAgICAgJ3ZlbnYnLFxuICAgICAgJy0tc3lzdGVtLXNpdGUtcGFja2FnZXMnLCAvLyBBbGxvdyB1c2luZyBnbG9iYWxseSBpbnN0YWxsZWQgcGFja2FnZXMgKHNhdmVzIHRpbWUgJiBkaXNrIHNwYWNlKVxuICAgICAgdmVudixcbiAgICBdKTtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIFBBVEg6IGAke3ZlbnZCaW59OiR7cHJvY2Vzcy5lbnYuUEFUSH1gLFxuICAgICAgVklSVFVBTF9FTlY6IHZlbnYsXG4gICAgfTtcbiAgICBjb25zdCBweXRob24gPSBwYXRoLmpvaW4odmVudkJpbiwgJ3B5dGhvbicpO1xuXG4gICAgLy8gSW5zdGFsbCB0aGUgbmVjZXNzYXJ5IHRoaW5nc1xuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgcHl0aG9uLFxuICAgICAgWyctbScsICdwaXAnLCAnaW5zdGFsbCcsICctLW5vLWlucHV0JywgJy1yJywgcmVxdWlyZW1lbnRzRmlsZV0sXG4gICAgICB7XG4gICAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgICBlbnYsXG4gICAgICAgIHJldHJ5OiB7IG1heEF0dGVtcHRzOiA1IH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBBY3R1YWxseSBwYWNrYWdlIHVwIG91ciBjb2RlLCBib3RoIGFzIGEgc2Rpc3QgYW5kIGEgd2hlZWwgZm9yIHB1Ymxpc2hpbmcuXG4gICAgYXdhaXQgc2hlbGwocHl0aG9uLCBbJ3NldHVwLnB5JywgJ3NkaXN0JywgJy0tZGlzdC1kaXInLCBvdXREaXJdLCB7XG4gICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgIGVudixcbiAgICB9KTtcbiAgICBhd2FpdCBzaGVsbChcbiAgICAgIHB5dGhvbixcbiAgICAgIFsnLW0nLCAncGlwJywgJ3doZWVsJywgJy0tbm8tZGVwcycsICctLXdoZWVsLWRpcicsIG91dERpciwgc291cmNlRGlyXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICAgIGVudixcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBhd2FpdCBzaGVsbChweXRob24sIFsnLW0nLCAndHdpbmUnLCAnY2hlY2snLCBwYXRoLmpvaW4ob3V0RGlyLCAnKicpXSwge1xuICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICBlbnYsXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyAjIENPREUgR0VORVJBVE9SICNcbi8vICMjIyMjIyMjIyMjIyMjIyMjI1xuXG5pbnRlcmZhY2UgRW1pdENvbnRleHQgZXh0ZW5kcyBOYW1pbmdDb250ZXh0IHtcbiAgLyoqIEBkZXByZWNhdGVkIFRoZSBUeXBlUmVzb2x2ZXIgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZXI6IFR5cGVSZXNvbHZlcjtcbn1cblxuY29uc3QgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIHBhdGguam9pbiguLi5uYW1lLnNwbGl0KCcuJykpO1xufTtcblxuY29uc3QgdG9QeXRob25NZXRob2ROYW1lID0gKG5hbWU6IHN0cmluZywgcHJvdGVjdGVkSXRlbSA9IGZhbHNlKTogc3RyaW5nID0+IHtcbiAgbGV0IHZhbHVlID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcbiAgaWYgKHByb3RlY3RlZEl0ZW0pIHtcbiAgICB2YWx1ZSA9IGBfJHt2YWx1ZX1gO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmNvbnN0IHRvUHl0aG9uUHJvcGVydHlOYW1lID0gKFxuICBuYW1lOiBzdHJpbmcsXG4gIGNvbnN0YW50ID0gZmFsc2UsXG4gIHByb3RlY3RlZEl0ZW0gPSBmYWxzZSxcbik6IHN0cmluZyA9PiB7XG4gIGxldCB2YWx1ZSA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG5cbiAgaWYgKGNvbnN0YW50KSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgaWYgKHByb3RlY3RlZEl0ZW0pIHtcbiAgICB2YWx1ZSA9IGBfJHt2YWx1ZX1gO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGdpdmVuIHNpZ25hdHVyZSdzIHBhcmFtZXRlciBuYW1lIHRvIHdoYXQgc2hvdWxkIGJlIGVtaXR0ZWQgaW4gUHl0aG9uLiBJdCBzbHVnaWZpZXMgdGhlXG4gKiBwb3NpdGlvbmFsIHBhcmFtZXRlciBuYW1lcyB0aGF0IGNvbGxpZGUgd2l0aCBhIGxpZnRlZCBwcm9wIGJ5IGFwcGVuZGluZyB0cmFpbGluZyBgX2AuIFRoZXJlIGlzIG5vXG4gKiByaXNrIG9mIGNvbmZsaWN0aW5nIHdpdGggYW4gb3RoZXIgcG9zaXRpb25hbCBwYXJhbWV0ZXIgdGhhdCBlbmRzIHdpdGggYSBgX2AgY2hhcmFjdGVyIGJlY2F1c2VcbiAqIHRoaXMgaXMgcHJvaGliaXRlZCBieSB0aGUgYGpzaWlgIGNvbXBpbGVyIChwYXJhbWV0ZXIgbmFtZXMgTVVTVCBiZSBjYW1lbENhc2UsIGFuZCBvbmx5IGEgc2luZ2xlXG4gKiBgX2AgaXMgcGVybWl0dGVkIHdoZW4gaXQgaXMgb24gKipsZWFkaW5nKiogcG9zaXRpb24pXG4gKlxuICogQHBhcmFtIG5hbWUgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdGhhdCBuZWVkcyBjb252ZXJzaW9uLlxuICogQHBhcmFtIGxpZnRlZFBhcmFtTmFtZXMgIHRoZSBsaXN0IG9mIFwibGlmdGVkXCIga2V5d29yZCBwYXJhbWV0ZXJzIGluIHRoaXMgc2lnbmF0dXJlLiBUaGlzIG11c3QgYmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBvbWl0dGVkIHdoZW4gZ2VuZXJhdGluZyBhIG5hbWUgZm9yIGEgcGFyYW1ldGVyIHRoYXQgKippcyoqIGxpZnRlZC5cbiAqL1xuZnVuY3Rpb24gdG9QeXRob25QYXJhbWV0ZXJOYW1lKFxuICBuYW1lOiBzdHJpbmcsXG4gIGxpZnRlZFBhcmFtTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKSxcbik6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuXG4gIHdoaWxlIChsaWZ0ZWRQYXJhbU5hbWVzLmhhcyhyZXN1bHQpKSB7XG4gICAgcmVzdWx0ICs9ICdfJztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IHNldERpZmZlcmVuY2UgPSA8VD4oc2V0QTogU2V0PFQ+LCBzZXRCOiBTZXQ8VD4pOiBTZXQ8VD4gPT4ge1xuICBjb25zdCByZXN1bHQgPSBuZXcgU2V0PFQ+KCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBzZXRBKSB7XG4gICAgaWYgKCFzZXRCLmhhcyhpdGVtKSkge1xuICAgICAgcmVzdWx0LmFkZChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUHJlcGFyZSBweXRob24gbWVtYmVycyBmb3IgZW1pc3Npb24uXG4gKlxuICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1lbWJlcnMgb2YgdGhlIHNhbWUgbmFtZSwgdGhleSB3aWxsIGFsbCBtYXAgdG8gdGhlIHNhbWUgcHl0aG9uXG4gKiBuYW1lLCBzbyB3ZSB3aWxsIGZpbHRlciBhbGwgZGVwcmVjYXRlZCBtZW1iZXJzIGFuZCBleHBlY3QgdGhhdCB0aGVyZSB3aWxsIGJlIG9ubHkgb25lXG4gKiBsZWZ0LlxuICpcbiAqIFJldHVybnMgdGhlIG1lbWJlcnMgaW4gYSBzb3J0ZWQgbGlzdC5cbiAqL1xuZnVuY3Rpb24gcHJlcGFyZU1lbWJlcnMobWVtYmVyczogUHl0aG9uQmFzZVtdLCByZXNvbHZlcjogVHlwZVJlc29sdmVyKSB7XG4gIC8vIGNyZWF0ZSBhIG1hcCBmcm9tIHB5dGhvbiBuYW1lIHRvIGxpc3Qgb2YgbWVtYmVyc1xuICBjb25zdCBtYXA6IHsgW3B5dGhvbk5hbWU6IHN0cmluZ106IFB5dGhvbkJhc2VbXSB9ID0ge307XG4gIGZvciAoY29uc3QgbSBvZiBtZW1iZXJzKSB7XG4gICAgbGV0IGxpc3QgPSBtYXBbbS5weXRob25OYW1lXTtcbiAgICBpZiAoIWxpc3QpIHtcbiAgICAgIGxpc3QgPSBtYXBbbS5weXRob25OYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIGxpc3QucHVzaChtKTtcbiAgfVxuXG4gIC8vIG5vdyByZXR1cm4gYWxsIHRoZSBtZW1iZXJzXG4gIGNvbnN0IHJldCA9IG5ldyBBcnJheTxQeXRob25CYXNlPigpO1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGxpc3RdIG9mIE9iamVjdC5lbnRyaWVzKG1hcCkpIHtcbiAgICBsZXQgbWVtYmVyO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBpZiB3ZSBoYXZlIGEgc2luZ2xlIG1lbWJlciBmb3IgdGhpcyBub3JtYWxpemVkIG5hbWUsIHRoZW4gdXNlIGl0XG4gICAgICBtZW1iZXIgPSBsaXN0WzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB3ZSBmb3VuZCBtb3JlIHRoYW4gb25lIG1lbWJlciB3aXRoIHRoZSBzYW1lIHB5dGhvbiBuYW1lLCBmaWx0ZXIgYWxsXG4gICAgICAvLyBkZXByZWNhdGVkIHZlcnNpb25zIGFuZCBjaGVjayB0aGF0IHdlIGFyZSBsZWZ0IHdpdGggZXhhY3RseSBvbmUuXG4gICAgICAvLyBvdGhlcndpc2UsIHRoZXkgd2lsbCBvdmVyd3JpdGUgZWFjaCBvdGhlclxuICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjUwOFxuICAgICAgY29uc3Qgbm9uRGVwcmVjYXRlZCA9IGxpc3QuZmlsdGVyKCh4KSA9PiAhaXNEZXByZWNhdGVkKHgpKTtcbiAgICAgIGlmIChub25EZXByZWNhdGVkLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNdWx0aXBsZSBub24tZGVwcmVjYXRlZCBtZW1iZXJzIHdoaWNoIG1hcCB0byB0aGUgUHl0aG9uIG5hbWUgXCIke25hbWV9XCJgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9uRGVwcmVjYXRlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNdWx0aXBsZSBtZW1iZXJzIHdoaWNoIG1hcCB0byB0aGUgUHl0aG9uIG5hbWUgXCIke25hbWV9XCIsIGJ1dCBhbGwgb2YgdGhlbSBhcmUgZGVwcmVjYXRlZGAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG1lbWJlciA9IG5vbkRlcHJlY2F0ZWRbMF07XG4gICAgfVxuXG4gICAgcmV0LnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHJldHVybiBzb3J0TWVtYmVycyhyZXQsIHJlc29sdmVyKTtcbn1cblxuY29uc3Qgc29ydE1lbWJlcnMgPSAoXG4gIG1lbWJlcnM6IFB5dGhvbkJhc2VbXSxcbiAgcmVzb2x2ZXI6IFR5cGVSZXNvbHZlcixcbik6IFB5dGhvbkJhc2VbXSA9PiB7XG4gIGxldCBzb3J0YWJsZSA9IG5ldyBBcnJheTx7XG4gICAgbWVtYmVyOiBQeXRob25CYXNlICYgSVNvcnRhYmxlVHlwZTtcbiAgICBkZXBlbmRzT246IFNldDxQeXRob25UeXBlPjtcbiAgfT4oKTtcbiAgY29uc3Qgc29ydGVkID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFB5dGhvbkJhc2U+KCk7XG5cbiAgLy8gVGhlIGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gZG8sIGlzIHB1c2ggYW55IGl0ZW0gd2hpY2ggaXMgbm90IHNvcnRhYmxlIHRvIHRoZSB2ZXJ5XG4gIC8vIGZyb250IG9mIHRoZSBsaXN0LiBUaGlzIHdpbGwgYmUgdGhpbmdzIGxpa2UgbWV0aG9kcywgcHJvcGVydGllcywgZXRjLlxuICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzKSB7XG4gICAgaWYgKCFpc1NvcnRhYmxlVHlwZShtZW1iZXIpKSB7XG4gICAgICBzb3J0ZWQucHVzaChtZW1iZXIpO1xuICAgICAgc2Vlbi5hZGQobWVtYmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc29ydGFibGUucHVzaCh7IG1lbWJlciwgZGVwZW5kc09uOiBuZXcgU2V0KG1lbWJlci5kZXBlbmRzT24ocmVzb2x2ZXIpKSB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBOb3cgdGhhdCB3ZSd2ZSBwdWxsZWQgb3V0IGV2ZXJ5dGhpbmcgdGhhdCBjb3VsZG4ndCBwb3NzaWJseSBoYXZlIGRlcGVuZGVuY2llcyxcbiAgLy8gd2Ugd2lsbCBnbyB0aHJvdWdoIHRoZSByZW1haW5pbmcgaXRlbXMsIGFuZCBwdWxsIG9mZiBhbnkgaXRlbXMgd2hpY2ggaGF2ZSBub1xuICAvLyBkZXBlbmRlbmNpZXMgdGhhdCB3ZSBoYXZlbid0IGFscmVhZHkgc29ydGVkLlxuICB3aGlsZSAoc29ydGFibGUubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgeyBtZW1iZXIsIGRlcGVuZHNPbiB9IG9mIHNvcnRhYmxlKSB7XG4gICAgICBjb25zdCBkaWZmID0gc2V0RGlmZmVyZW5jZShkZXBlbmRzT24sIHNlZW4pO1xuICAgICAgaWYgKFsuLi5kaWZmXS5maW5kKChkZXApID0+ICEoZGVwIGluc3RhbmNlb2YgUHl0aG9uTW9kdWxlKSkgPT0gbnVsbCkge1xuICAgICAgICBzb3J0ZWQucHVzaChtZW1iZXIpO1xuICAgICAgICBzZWVuLmFkZChtZW1iZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxlZnRvdmVyID0gc29ydGFibGUuZmlsdGVyKCh7IG1lbWJlciB9KSA9PiAhc2Vlbi5oYXMobWVtYmVyKSk7XG4gICAgaWYgKGxlZnRvdmVyLmxlbmd0aCA9PT0gc29ydGFibGUubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3Qgc29ydCBtZW1iZXJzIChjaXJjdWxhciBkZXBlbmRlbmN5PykuIExlZnRvdmVyOiAke2xlZnRvdmVyXG4gICAgICAgICAgLm1hcCgobG8pID0+IGxvLm1lbWJlci5weXRob25OYW1lKVxuICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3J0YWJsZSA9IGxlZnRvdmVyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzb3J0ZWQ7XG59O1xuXG5pbnRlcmZhY2UgUHl0aG9uQmFzZSB7XG4gIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZG9jcz86IHNwZWMuRG9jcztcblxuICBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQsIG9wdHM/OiBhbnkpOiB2b2lkO1xuXG4gIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHM7XG59XG5cbmludGVyZmFjZSBQeXRob25UeXBlIGV4dGVuZHMgUHl0aG9uQmFzZSB7XG4gIC8vIFRoZSBKU0lJIEZRTiBmb3IgdGhpcyBpdGVtLCBpZiB0aGlzIGl0ZW0gZG9lc24ndCBleGlzdCBhcyBhIEpTSUkgdHlwZSwgdGhlbiBpdFxuICAvLyBkb2Vzbid0IGhhdmUgYSBGUU4gYW5kIGl0IHNob3VsZCBiZSBudWxsO1xuICByZWFkb25seSBmcW4/OiBzdHJpbmc7XG5cbiAgYWRkTWVtYmVyKG1lbWJlcjogUHl0aG9uQmFzZSk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU29ydGFibGVUeXBlIHtcbiAgZGVwZW5kc09uKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQeXRob25UeXBlW107XG59XG5cbmZ1bmN0aW9uIGlzU29ydGFibGVUeXBlKGFyZzogdW5rbm93bik6IGFyZyBpcyBJU29ydGFibGVUeXBlIHtcbiAgcmV0dXJuIChhcmcgYXMgUGFydGlhbDxJU29ydGFibGVUeXBlPikuZGVwZW5kc09uICE9PSB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBQeXRob25UeXBlT3B0cyB7XG4gIGJhc2VzPzogc3BlYy5UeXBlUmVmZXJlbmNlW107XG59XG5cbmFic3RyYWN0IGNsYXNzIEJhc2VQeXRob25DbGFzc1R5cGUgaW1wbGVtZW50cyBQeXRob25UeXBlLCBJU29ydGFibGVUeXBlIHtcbiAgcHJvdGVjdGVkIGJhc2VzOiBzcGVjLlR5cGVSZWZlcmVuY2VbXTtcbiAgcHJvdGVjdGVkIG1lbWJlcnM6IFB5dGhvbkJhc2VbXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcGFyYXRlTWVtYmVyczogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBzcGVjOiBzcGVjLlR5cGUsXG4gICAgcHVibGljIHJlYWRvbmx5IGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IFB5dGhvblR5cGVPcHRzLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGNvbnN0IHsgYmFzZXMgPSBbXSB9ID0gb3B0cztcblxuICAgIHRoaXMuYmFzZXMgPSBiYXNlcztcbiAgICB0aGlzLm1lbWJlcnMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5PFB5dGhvblR5cGU+KCk7XG4gICAgY29uc3QgcGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KHRoaXMuZnFuISk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJldHVybiBhbnkgYmFzZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgbW9kdWxlIGF0IHRoZSBzYW1lIGxldmVsIG9mXG4gICAgLy8gbmVzdGluZy5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBiYXNlIG9mIHRoaXMuYmFzZXMpIHtcbiAgICAgIGlmIChzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKGJhc2UpKSB7XG4gICAgICAgIGlmIChyZXNvbHZlci5pc0luTW9kdWxlKGJhc2UpKSB7XG4gICAgICAgICAgLy8gR2l2ZW4gYSBiYXNlLCB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgYmFzZSdzIHBhcmVudCB0aGF0IGlzIHRoZSBzYW1lIGFzXG4gICAgICAgICAgLy8gb3VyIHBhcmVudCwgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF0IHRoZVxuICAgICAgICAgIC8vIHNhbWUgbGV2ZWwgb2Ygb3VyIG93bi5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBtaWdodCBuZWVkIHRvIHJlY3Vyc2UgaW50byBvdXIgbWVtYmVycyB0byBhbHNvIGZpbmQgdGhlaXJcbiAgICAgICAgICAvLyAgICAgICBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgbGV0IGJhc2VJdGVtID0gcmVzb2x2ZXIuZ2V0VHlwZShiYXNlKTtcbiAgICAgICAgICBsZXQgYmFzZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChiYXNlKTtcbiAgICAgICAgICB3aGlsZSAoYmFzZVBhcmVudCAhPT0gcGFyZW50KSB7XG4gICAgICAgICAgICBiYXNlSXRlbSA9IGJhc2VQYXJlbnQ7XG4gICAgICAgICAgICBiYXNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGJhc2VJdGVtLmZxbiEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc2Vlbi5oYXMoYmFzZUl0ZW0uZnFuISkpIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGJhc2VJdGVtKTtcbiAgICAgICAgICAgIHNlZW4uYWRkKGJhc2VJdGVtLmZxbiEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZXBlbmRlbmNpZXM7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIC4uLnRoaXMuYmFzZXMubWFwKChiYXNlKSA9PiB0b1R5cGVOYW1lKGJhc2UpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgICAuLi50aGlzLm1lbWJlcnMubWFwKChtZW0pID0+IG1lbS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWVtYmVyKG1lbWJlcjogUHl0aG9uQmFzZSkge1xuICAgIHRoaXMubWVtYmVycy5wdXNoKG1lbWJlcik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICBpZiAoIXRoaXMuZnFuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgbWFrZSBhcGlMb2NhdGlvbiBmb3IgJHt0aGlzLnB5dGhvbk5hbWV9LCBkb2VzIG5vdCBoYXZlIEZRTmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4geyBhcGk6ICd0eXBlJywgZnFuOiB0aGlzLmZxbiB9O1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcblxuICAgIGNvbnN0IGNsYXNzUGFyYW1zID0gdGhpcy5nZXRDbGFzc1BhcmFtcyhjb250ZXh0KTtcbiAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdjbGFzcycsIHRoaXMucHl0aG9uTmFtZSwgY2xhc3NQYXJhbXMpO1xuXG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBjbGFzcy0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgICAgdHJhaWxpbmdOZXdMaW5lOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuYm91bmRSZXNvbHZlcihjb250ZXh0LnJlc29sdmVyKTtcbiAgICAgIGxldCBzaG91bGRTZXBhcmF0ZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgcHJlcGFyZU1lbWJlcnModGhpcy5tZW1iZXJzLCByZXNvbHZlcikpIHtcbiAgICAgICAgaWYgKHNob3VsZFNlcGFyYXRlKSB7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkU2VwYXJhdGUgPSB0aGlzLnNlcGFyYXRlTWVtYmVycztcbiAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgeyAuLi5jb250ZXh0LCByZXNvbHZlciB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKCdwYXNzJyk7XG4gICAgfVxuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYm91bmRSZXNvbHZlcihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogVHlwZVJlc29sdmVyIHtcbiAgICBpZiAodGhpcy5mcW4gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVyO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZXIuYmluZCh0aGlzLmZxbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEJhc2VNZXRob2RPcHRzIHtcbiAgYWJzdHJhY3Q/OiBib29sZWFuO1xuICBsaWZ0ZWRQcm9wPzogc3BlYy5JbnRlcmZhY2VUeXBlO1xuICBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xufVxuXG5pbnRlcmZhY2UgQmFzZU1ldGhvZEVtaXRPcHRzIHtcbiAgcmVuZGVyQWJzdHJhY3Q/OiBib29sZWFuO1xuICBmb3JjZUVtaXRCb2R5PzogYm9vbGVhbjtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZU1ldGhvZCBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgYWJzdHJhY3Q6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yPzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xhc3NBc0ZpcnN0UGFyYW1ldGVyOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCByZWFkb25seSByZXR1cm5Gcm9tSlNJSU1ldGhvZDogYm9vbGVhbiA9IHRydWU7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRFbWl0Qm9keTogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsaWZ0ZWRQcm9wPzogc3BlYy5JbnRlcmZhY2VUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkganNOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJhbWV0ZXJzOiBzcGVjLlBhcmFtZXRlcltdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmV0dXJuczogc3BlYy5PcHRpb25hbFZhbHVlIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGlzU3RhdGljOiBib29sZWFuLFxuICAgIG9wdHM6IEJhc2VNZXRob2RPcHRzLFxuICApIHtcbiAgICB0aGlzLmFic3RyYWN0ID0gISFvcHRzLmFic3RyYWN0O1xuICAgIHRoaXMubGlmdGVkUHJvcCA9IG9wdHMubGlmdGVkUHJvcDtcbiAgICB0aGlzLnBhcmVudCA9IG9wdHMucGFyZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IHRoaXMucGFyZW50LmZxbixcbiAgICAgIG1lbWJlck5hbWU6IHRoaXMuanNOYW1lID8/ICcnLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHRvVHlwZU5hbWUodGhpcy5yZXR1cm5zKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICAuLi50aGlzLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT5cbiAgICAgICAgdG9UeXBlTmFtZShwYXJhbSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgKSxcbiAgICAgIC4uLmxpZnRlZFByb3BlcnRpZXModGhpcy5saWZ0ZWRQcm9wKSxcbiAgICApO1xuXG4gICAgZnVuY3Rpb24qIGxpZnRlZFByb3BlcnRpZXMoXG4gICAgICBzdHJ1Y3Q6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHVuZGVmaW5lZCxcbiAgICApOiBJdGVyYWJsZUl0ZXJhdG9yPFB5dGhvbkltcG9ydHM+IHtcbiAgICAgIGlmIChzdHJ1Y3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc3RydWN0LnByb3BlcnRpZXMgPz8gW10pIHtcbiAgICAgICAgeWllbGQgdG9UeXBlTmFtZShwcm9wLnR5cGUpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiBzdHJ1Y3QuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBpZmFjZSA9IGNvbnRleHQucmVzb2x2ZXIuZGVyZWZlcmVuY2UoYmFzZSkgYXMgc3BlYy5JbnRlcmZhY2VUeXBlO1xuICAgICAgICBmb3IgKGNvbnN0IGltcG9ydHMgb2YgbGlmdGVkUHJvcGVydGllcyhpZmFjZSkpIHtcbiAgICAgICAgICB5aWVsZCBpbXBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlTWV0aG9kRW1pdE9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgcmVuZGVyQWJzdHJhY3QgPSB0cnVlLCBmb3JjZUVtaXRCb2R5ID0gZmFsc2UgfSA9IG9wdHMgPz8ge307XG5cbiAgICBjb25zdCByZXR1cm5UeXBlOiBzdHJpbmcgPSB0b1R5cGVOYW1lKHRoaXMucmV0dXJucykucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgIC8vIFdlIGNhbm5vdCAoY3VycmVudGx5PykgYmxpbmRseSB1c2UgdGhlIG5hbWVzIGdpdmVuIHRvIHVzIGJ5IHRoZSBKU0lJIGZvclxuICAgIC8vIGluaXRpYWxpemVycywgYmVjYXVzZSBvdXIga2V5d29yZCBsaWZ0aW5nIHdpbGwgYWxsb3cgdHdvIG5hbWVzIHRvIGNsYXNoLlxuICAgIC8vIFRoaXMgY2FuIGhvcGVmdWxseSBiZSByZW1vdmVkIG9uY2Ugd2UgZ2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjg4XG4gICAgLy8gcmVzb2x2ZWQsIHNvIGJ1aWxkIHVwIGEgbGlzdCBvZiBhbGwgb2YgdGhlIHByb3AgbmFtZXMgc28gd2UgY2FuIGNoZWNrIGFnYWluc3RcbiAgICAvLyB0aGVtIGxhdGVyLlxuICAgIGNvbnN0IGxpZnRlZFByb3BOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmICh0aGlzLmxpZnRlZFByb3A/LnByb3BlcnRpZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHRoaXMubGlmdGVkUHJvcC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxpZnRlZFByb3BOYW1lcy5hZGQodG9QeXRob25QYXJhbWV0ZXJOYW1lKHByb3AubmFtZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHVybiBhIGxpc3Qgb2YgSlNJSSBwYXJhbWV0ZXJzLCBpbnRvIFB5dGhvbiBzdHlsZSBhcmd1bWVudHMgd2l0aFxuICAgIC8vIGdyYWR1YWwgdHlwaW5nLCBzbyB3ZSdsbCBoYXZlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzLCBhbmRcbiAgICAvLyBidWlsZCB0aGUgbGlzdCwgY29udmVydGluZyBhcyB3ZSBnby5cbiAgICBjb25zdCBweXRob25QYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiB0aGlzLnBhcmFtZXRlcnMpIHtcbiAgICAgIC8vIFdlIGNhbm5vdCAoY3VycmVudGx5PykgYmxpbmRseSB1c2UgdGhlIG5hbWVzIGdpdmVuIHRvIHVzIGJ5IHRoZSBKU0lJIGZvclxuICAgICAgLy8gaW5pdGlhbGl6ZXJzLCBiZWNhdXNlIG91ciBrZXl3b3JkIGxpZnRpbmcgd2lsbCBhbGxvdyB0d28gbmFtZXMgdG8gY2xhc2guXG4gICAgICAvLyBUaGlzIGNhbiBob3BlZnVsbHkgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI4OFxuICAgICAgLy8gcmVzb2x2ZWQuXG4gICAgICBjb25zdCBwYXJhbU5hbWU6IHN0cmluZyA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShcbiAgICAgICAgcGFyYW0ubmFtZSxcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShwYXJhbSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhcmFtRGVmYXVsdCA9IHBhcmFtLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG5cbiAgICAgIHB5dGhvblBhcmFtcy5wdXNoKGAke3BhcmFtTmFtZX06ICR7cGFyYW1UeXBlfSR7cGFyYW1EZWZhdWx0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY3VtZW50YWJsZUFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLnBhcmFtZXRlcnNcbiAgICAgIC5tYXAoXG4gICAgICAgIChwKSA9PlxuICAgICAgICAgICh7XG4gICAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgICBkb2NzOiBwLmRvY3MsXG4gICAgICAgICAgICBkZWZpbmluZ1R5cGU6IHRoaXMucGFyZW50LFxuICAgICAgICAgIH0gYXMgRG9jdW1lbnRhYmxlQXJndW1lbnQpLFxuICAgICAgKVxuICAgICAgLy8gSWYgdGhlcmUncyBsaWZ0ZWRQcm9wcywgdGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHN0cnVjdCBhbmQgaXQgd29uJ3QgYmUgX2FjdHVhbGx5XyBlbWl0dGVkLlxuICAgICAgLmZpbHRlcigoXywgaW5kZXgpID0+XG4gICAgICAgIHRoaXMubGlmdGVkUHJvcCAhPSBudWxsID8gaW5kZXggPCB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoIC0gMSA6IHRydWUsXG4gICAgICApXG4gICAgICAubWFwKChwYXJhbSkgPT4gKHtcbiAgICAgICAgLi4ucGFyYW0sXG4gICAgICAgIG5hbWU6IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwYXJhbS5uYW1lLCBsaWZ0ZWRQcm9wTmFtZXMpLFxuICAgICAgfSkpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIGxpZnRlZCBwYXJhbWV0ZXIsIHRoZW4gd2UnbGwgZHJvcCB0aGUgbGFzdCBhcmd1bWVudCB0byBvdXIgcGFyYW1zXG4gICAgLy8gYW5kIHRoZW4gd2UnbGwgbGlmdCBhbGwgb2YgdGhlIHBhcmFtcyBvZiB0aGUgbGlmdGVkIHR5cGUgYXMga2V5d29yZCBhcmd1bWVudHNcbiAgICAvLyB0byB0aGUgZnVuY3Rpb24uXG4gICAgaWYgKHRoaXMubGlmdGVkUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZW1vdmUgb3VyIGxhc3QgaXRlbS5cbiAgICAgIHB5dGhvblBhcmFtcy5wb3AoKTtcbiAgICAgIGNvbnN0IGxpZnRlZFByb3BlcnRpZXMgPSB0aGlzLmdldExpZnRlZFByb3BlcnRpZXMoY29udGV4dC5yZXNvbHZlcik7XG5cbiAgICAgIGlmIChsaWZ0ZWRQcm9wZXJ0aWVzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIC8vIEFsbCBvZiB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBrZXl3b3JkIG9ubHkgYXJndW1lbnRzLCBzbyB3ZSdsbCBtYXJrIHRoZW1cbiAgICAgICAgLy8gYXMgc3VjaC5cbiAgICAgICAgcHl0aG9uUGFyYW1zLnB1c2goJyonKTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG9mIG91ciBwcm9wcywgYW5kIHJlZmxlY3QgdGhlbSBpbnRvIG91ciBwYXJhbXMuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBsaWZ0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKHByb3AucHJvcC5uYW1lKTtcbiAgICAgICAgICBjb25zdCBwYXJhbVR5cGUgPSB0b1R5cGVOYW1lKHByb3AucHJvcCkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwYXJhbURlZmF1bHQgPSBwcm9wLnByb3Aub3B0aW9uYWwgPyAnID0gTm9uZScgOiAnJztcblxuICAgICAgICAgIHB5dGhvblBhcmFtcy5wdXNoKGAke3BhcmFtTmFtZX06ICR7cGFyYW1UeXBlfSR7cGFyYW1EZWZhdWx0fWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERvY3VtZW50IHRoZW0gYXMga2V5d29yZCBhcmd1bWVudHNcbiAgICAgIGRvY3VtZW50YWJsZUFyZ3MucHVzaChcbiAgICAgICAgLi4ubGlmdGVkUHJvcGVydGllcy5tYXAoXG4gICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAoe1xuICAgICAgICAgICAgICBuYW1lOiBwLnByb3AubmFtZSxcbiAgICAgICAgICAgICAgZG9jczogcC5wcm9wLmRvY3MsXG4gICAgICAgICAgICAgIGRlZmluaW5nVHlwZTogcC5kZWZpbmluZ1R5cGUsXG4gICAgICAgICAgICB9IGFzIERvY3VtZW50YWJsZUFyZ3VtZW50KSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMucGFyYW1ldGVycy5sZW5ndGggPj0gMSAmJlxuICAgICAgdGhpcy5wYXJhbWV0ZXJzW3RoaXMucGFyYW1ldGVycy5sZW5ndGggLSAxXS52YXJpYWRpY1xuICAgICkge1xuICAgICAgLy8gQW5vdGhlciBzaXR1YXRpb24gd2UgY291bGQgYmUgaW4sIGlzIHRoYXQgaW5zdGVhZCBvZiBoYXZpbmcgYSBwbGFpbiBwYXJhbWV0ZXJcbiAgICAgIC8vIHdlIGhhdmUgYSB2YXJpYWRpYyBwYXJhbWV0ZXIgd2hlcmUgd2UgbmVlZCB0byBleHBhbmQgdGhlIGxhc3QgcGFyYW1ldGVyIGFzIGFcbiAgICAgIC8vICphcmdzLlxuICAgICAgcHl0aG9uUGFyYW1zLnBvcCgpO1xuXG4gICAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gdGhpcy5wYXJhbWV0ZXJzLnNsaWNlKC0xKVswXTtcbiAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShsYXN0UGFyYW1ldGVyLm5hbWUpO1xuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShsYXN0UGFyYW1ldGVyLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAgIHB5dGhvblBhcmFtcy5wdXNoKGAqJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmICh0aGlzLmpzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgbmVlZGVkIGJlY2F1c2UgbXlweSBkb2VzIG5vdCBrbm93IGhvdyB0byBjaGVjayBkZWNvcmF0ZWQgZGVjbGFyYXRpb25zXG4gICAgICBkZWNvcmF0b3JzLnB1c2goYEBqc2lpLm1lbWJlcihqc2lpX25hbWU9XCIke3RoaXMuanNOYW1lfVwiKWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlY29yYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goYEAke3RoaXMuZGVjb3JhdG9yfWApO1xuICAgIH1cblxuICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goJ0BhYmMuYWJzdHJhY3RtZXRob2QnKTtcbiAgICB9XG5cbiAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgbmVlZGVkIGJlY2F1c2UgbXlweSBkb2VzIG5vdCBrbm93IGhvdyB0byBjaGVjayBkZWNvcmF0ZWQgZGVjbGFyYXRpb25zXG4gICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzXG4gICAgICAgIC5qb2luKCcgIyB0eXBlOiBpZ25vcmVbbWlzY11cXG4nKVxuICAgICAgICAuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIGNvZGUubGluZShkZWNvcmF0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB5dGhvblBhcmFtcy51bnNoaWZ0KFxuICAgICAgc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgICB0aGlzLmltcGxpY2l0UGFyYW1ldGVyLFxuICAgICAgICBweXRob25QYXJhbXMubWFwKChwYXJhbSkgPT4gcGFyYW0uc3BsaXQoJzonKVswXS50cmltKCkpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgb3BlblNpZ25hdHVyZShcbiAgICAgIGNvZGUsXG4gICAgICAnZGVmJyxcbiAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgIHB5dGhvblBhcmFtcyxcbiAgICAgIGZhbHNlLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBhcmd1bWVudHM6IGRvY3VtZW50YWJsZUFyZ3MsXG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgbWV0aG9kLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0Qm9keShcbiAgICAgIGNvZGUsXG4gICAgICBjb250ZXh0LFxuICAgICAgcmVuZGVyQWJzdHJhY3QsXG4gICAgICBmb3JjZUVtaXRCb2R5LFxuICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgcHl0aG9uUGFyYW1zWzBdLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Qm9keShcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgcmVuZGVyQWJzdHJhY3Q6IGJvb2xlYW4sXG4gICAgZm9yY2VFbWl0Qm9keTogYm9vbGVhbixcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICAgIGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZTogc3RyaW5nLFxuICApIHtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMuc2hvdWxkRW1pdEJvZHkgJiYgIWZvcmNlRW1pdEJvZHkpIHx8XG4gICAgICAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdClcbiAgICApIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmxpZnRlZFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVtaXRBdXRvUHJvcHMoY29kZSwgY29udGV4dCwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbWl0SnNpaU1ldGhvZENhbGwoXG4gICAgICAgIGNvZGUsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGxpZnRlZFByb3BOYW1lcyxcbiAgICAgICAgaW1wbGljaXRQYXJhbWV0ZXIsXG4gICAgICAgIHJldHVyblR5cGUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEF1dG9Qcm9wcyhcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgbGlmdGVkUHJvcE5hbWVzOiBTZXQ8c3RyaW5nPixcbiAgKSB7XG4gICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IHRoaXMucGFyYW1ldGVycy5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgYXJnTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShsYXN0UGFyYW1ldGVyLm5hbWUsIGxpZnRlZFByb3BOYW1lcyk7XG4gICAgY29uc3QgdHlwZU5hbWUgPSB0b1R5cGVOYW1lKGxhc3RQYXJhbWV0ZXIudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgcHJvcGVydGllcywgd2hpY2ggYXJlIG1hbmRhdG9yeSwgdGhlc2UgYXJlIHRoZVxuICAgIC8vIG9uZXMgd2Ugd2lsbCBzcGVjaWZpeSB0byBzdGFydCB3aXRoIGluIG91ciBkaWN0aW9uYXJ5IGxpdGVyYWwuXG4gICAgY29uc3QgbGlmdGVkUHJvcHMgPSB0aGlzLmdldExpZnRlZFByb3BlcnRpZXMoY29udGV4dC5yZXNvbHZlcikubWFwKFxuICAgICAgKHApID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgcC5wcm9wLCBwLmRlZmluaW5nVHlwZSksXG4gICAgKTtcbiAgICBjb25zdCBhc3NpZ25tZW50cyA9IGxpZnRlZFByb3BzXG4gICAgICAubWFwKChwKSA9PiBwLnB5dGhvbk5hbWUpXG4gICAgICAubWFwKCh2KSA9PiBgJHt2fT0ke3Z9YCk7XG5cbiAgICBhc3NpZ25DYWxsUmVzdWx0KGNvZGUsIGFyZ05hbWUsIHR5cGVOYW1lLCBhc3NpZ25tZW50cyk7XG4gICAgY29kZS5saW5lKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRKc2lpTWV0aG9kQ2FsbChcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgbGlmdGVkUHJvcE5hbWVzOiBTZXQ8c3RyaW5nPixcbiAgICBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nLFxuICAgIHJldHVyblR5cGU6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgbWV0aG9kUHJlZml4OiBzdHJpbmcgPSB0aGlzLnJldHVybkZyb21KU0lJTWV0aG9kID8gJ3JldHVybiAnIDogJyc7XG5cbiAgICBjb25zdCBqc2lpTWV0aG9kUGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLmNsYXNzQXNGaXJzdFBhcmFtZXRlcikge1xuICAgICAgaWYgKHRoaXMucGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgbm90IGtub3duLicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpIHtcbiAgICAgICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKFxuICAgICAgICAgIHRvVHlwZU5hbWUodGhpcy5wYXJlbnQpLnB5dGhvblR5cGUoe1xuICAgICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzaW5nIHRoZSBkeW5hbWljIGNsYXNzIG9mIGBzZWxmYC5cbiAgICAgICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKGAke2ltcGxpY2l0UGFyYW1ldGVyfS5fX2NsYXNzX19gKTtcbiAgICAgIH1cbiAgICB9XG4gICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKGltcGxpY2l0UGFyYW1ldGVyKTtcbiAgICBpZiAodGhpcy5qc05hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKGBcIiR7dGhpcy5qc05hbWV9XCJgKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbGFzdCBhcmcgaXMgdmFyaWFkaWMsIGV4cGFuZCB0aGUgdHVwbGVcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiB0aGlzLnBhcmFtZXRlcnMpIHtcbiAgICAgIGxldCBleHByID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUsIGxpZnRlZFByb3BOYW1lcyk7XG4gICAgICBpZiAocGFyYW0udmFyaWFkaWMpIHtcbiAgICAgICAgZXhwciA9IGAqJHtleHByfWA7XG4gICAgICB9XG4gICAgICBwYXJhbXMucHVzaChleHByKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGBqc2lpLiR7dGhpcy5qc2lpTWV0aG9kfSgke2pzaWlNZXRob2RQYXJhbXMuam9pbihcbiAgICAgICcsICcsXG4gICAgKX0sIFske3BhcmFtcy5qb2luKCcsICcpfV0pYDtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgJHttZXRob2RQcmVmaXh9JHtcbiAgICAgICAgdGhpcy5yZXR1cm5Gcm9tSlNJSU1ldGhvZCAmJiByZXR1cm5UeXBlXG4gICAgICAgICAgPyBgdHlwaW5nLmNhc3QoJHtyZXR1cm5UeXBlfSwgJHt2YWx1ZX0pYFxuICAgICAgICAgIDogdmFsdWVcbiAgICAgIH1gLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldExpZnRlZFByb3BlcnRpZXMocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFByb3BlcnR5RGVmaW5pdGlvbltdIHtcbiAgICBjb25zdCBsaWZ0ZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eURlZmluaXRpb25bXSA9IFtdO1xuXG4gICAgY29uc3Qgc3RhY2sgPSBbdGhpcy5saWZ0ZWRQcm9wXTtcbiAgICBjb25zdCBrbm93bklmYWNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGtub3duUHJvcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKFxuICAgICAgbGV0IGN1cnJlbnQgPSBzdGFjay5zaGlmdCgpO1xuICAgICAgY3VycmVudCAhPSBudWxsO1xuICAgICAgY3VycmVudCA9IHN0YWNrLnNoaWZ0KClcbiAgICApIHtcbiAgICAgIGtub3duSWZhY2VzLmFkZChjdXJyZW50LmZxbik7XG5cbiAgICAgIC8vIEFkZCBhbnkgaW50ZXJmYWNlcyB0aGF0IHRoaXMgaW50ZXJmYWNlIGRlcGVuZHMgb24sIHRvIHRoZSBsaXN0LlxuICAgICAgaWYgKGN1cnJlbnQuaW50ZXJmYWNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWZhY2Ugb2YgY3VycmVudC5pbnRlcmZhY2VzKSB7XG4gICAgICAgICAgaWYgKGtub3duSWZhY2VzLmhhcyhpZmFjZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wdXNoKHJlc29sdmVyLmRlcmVmZXJlbmNlKGlmYWNlKSBhcyBzcGVjLkludGVyZmFjZVR5cGUpO1xuICAgICAgICAgIGtub3duSWZhY2VzLmFkZChpZmFjZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIGludGVyZmFjZSB0byBvdXIgbGlzdCBvZiBwcm9wZXJ0aWVzLlxuICAgICAgaWYgKGN1cnJlbnQucHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBjdXJyZW50LnByb3BlcnRpZXMpIHtcbiAgICAgICAgICBpZiAoa25vd25Qcm9wcy5oYXMocHJvcC5uYW1lKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpZnRlZFByb3BlcnRpZXMucHVzaCh7IHByb3AsIGRlZmluaW5nVHlwZTogY3VycmVudCB9KTtcbiAgICAgICAgICBrbm93blByb3BzLmFkZChwcm9wLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZnRlZFByb3BlcnRpZXM7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEJhc2VQcm9wZXJ0eU9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGltbXV0YWJsZT86IGJvb2xlYW47XG4gIGlzU3RhdGljPzogYm9vbGVhbjtcbiAgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcbn1cblxuaW50ZXJmYWNlIEJhc2VQcm9wZXJ0eUVtaXRPcHRzIHtcbiAgcmVuZGVyQWJzdHJhY3Q/OiBib29sZWFuO1xuICBmb3JjZUVtaXRCb2R5PzogYm9vbGVhbjtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZVByb3BlcnR5IGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGlzU3RhdGljOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZztcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGltbXV0YWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHNwZWMuT3B0aW9uYWxWYWx1ZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IEJhc2VQcm9wZXJ0eU9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgYWJzdHJhY3QgPSBmYWxzZSwgaW1tdXRhYmxlID0gZmFsc2UsIGlzU3RhdGljID0gZmFsc2UgfSA9IG9wdHM7XG5cbiAgICB0aGlzLmFic3RyYWN0ID0gYWJzdHJhY3Q7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljO1xuICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4geyBhcGk6ICdtZW1iZXInLCBmcW46IHRoaXMucGFyZW50LmZxbiwgbWVtYmVyTmFtZTogdGhpcy5qc05hbWUgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBvcHRzPzogQmFzZVByb3BlcnR5RW1pdE9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgcmVuZGVyQWJzdHJhY3QgPSB0cnVlLCBmb3JjZUVtaXRCb2R5ID0gZmFsc2UgfSA9IG9wdHMgPz8ge307XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9IHRvVHlwZU5hbWUodGhpcy50eXBlKS5weXRob25UeXBlKGNvbnRleHQpO1xuXG4gICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGlzIG5lZWRlZCBiZWNhdXNlIG15cHkgY2Fubm90IGNoZWNrIGRlY29yYXRlZCB0aGluZ3NcbiAgICBjb2RlLmxpbmUoYEAke3RoaXMuZGVjb3JhdG9yfSAjIHR5cGU6IGlnbm9yZVttaXNjXWApO1xuICAgIGNvZGUubGluZShgQGpzaWkubWVtYmVyKGpzaWlfbmFtZT1cIiR7dGhpcy5qc05hbWV9XCIpYCk7XG4gICAgaWYgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgIGNvZGUubGluZSgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgIH1cbiAgICBvcGVuU2lnbmF0dXJlKFxuICAgICAgY29kZSxcbiAgICAgICdkZWYnLFxuICAgICAgdGhpcy5weXRob25OYW1lLFxuICAgICAgW3RoaXMuaW1wbGljaXRQYXJhbWV0ZXJdLFxuICAgICAgdHJ1ZSxcbiAgICAgIHB5dGhvblR5cGUsXG4gICAgKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYHByb3AtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICAodGhpcy5zaG91bGRFbWl0Qm9keSB8fCBmb3JjZUVtaXRCb2R5KSAmJlxuICAgICAgKCFyZW5kZXJBYnN0cmFjdCB8fCAhdGhpcy5hYnN0cmFjdClcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYHJldHVybiB0eXBpbmcuY2FzdCgke3B5dGhvblR5cGV9LCBqc2lpLiR7dGhpcy5qc2lpR2V0TWV0aG9kfSgke3RoaXMuaW1wbGljaXRQYXJhbWV0ZXJ9LCBcIiR7dGhpcy5qc05hbWV9XCIpKWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJy4uLicpO1xuICAgIH1cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICghdGhpcy5pbW11dGFibGUpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgQCR7dGhpcy5weXRob25OYW1lfS5zZXR0ZXIke1xuICAgICAgICAgIHRoaXMuaXNTdGF0aWMgPyAnICMgdHlwZTogaWdub3JlW25vLXJlZGVmXScgOiAnJ1xuICAgICAgICB9YCxcbiAgICAgICk7XG4gICAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgICBjb2RlLmxpbmUoJ0BhYmMuYWJzdHJhY3RtZXRob2QnKTtcbiAgICAgIH1cbiAgICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICAgIGNvZGUsXG4gICAgICAgICdkZWYnLFxuICAgICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICAgIFt0aGlzLmltcGxpY2l0UGFyYW1ldGVyLCBgdmFsdWU6ICR7cHl0aG9uVHlwZX1gXSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgICdOb25lJyxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLnNob3VsZEVtaXRCb2R5IHx8IGZvcmNlRW1pdEJvZHkpICYmXG4gICAgICAgICghcmVuZGVyQWJzdHJhY3QgfHwgIXRoaXMuYWJzdHJhY3QpXG4gICAgICApIHtcbiAgICAgICAgY29kZS5saW5lKFxuICAgICAgICAgIGBqc2lpLiR7dGhpcy5qc2lpU2V0TWV0aG9kfSgke3RoaXMuaW1wbGljaXRQYXJhbWV0ZXJ9LCBcIiR7dGhpcy5qc05hbWV9XCIsIHZhbHVlKWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlLmxpbmUoJy4uLicpO1xuICAgICAgfVxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEludGVyZmFjZSBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUge1xuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuICAgIGVtaXRMaXN0KGNvZGUsICdAanNpaS5pbnRlcmZhY2UoJywgW2Bqc2lpX3R5cGU9XCIke3RoaXMuZnFufVwiYF0sICcpJyk7XG5cbiAgICAvLyBGaXJzdCB3ZSBkbyBvdXIgbm9ybWFsIGNsYXNzIGxvZ2ljIGZvciBlbWl0dGluZyBvdXIgbWVtYmVycy5cbiAgICBzdXBlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCk7XG5cbiAgICAvLyBUaGVuLCB3ZSBoYXZlIHRvIGVtaXQgYSBQcm94eSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIG91ciBwcm94eSBpbnRlcmZhY2UuXG4gICAgY29uc3QgcHJveHlCYXNlczogc3RyaW5nW10gPSB0aGlzLmJhc2VzLm1hcChcbiAgICAgIChiKSA9PlxuICAgICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgYmVjYXVzZSBNeVB5IGNhbm5vdCBjaGVjayBkeW5hbWljIGJhc2UgY2xhc3NlcyAobmF0dXJhbGx5KVxuICAgICAgICBganNpaS5wcm94eV9mb3IoJHt0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoe1xuICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICB9KX0pICMgdHlwZTogaWdub3JlW21pc2NdYCxcbiAgICApO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5wcm94eUNsYXNzTmFtZSwgcHJveHlCYXNlcyk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBjbGFzcy0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgICAgdHJhaWxpbmdOZXdMaW5lOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvZGUubGluZShgX19qc2lpX3R5cGVfXzogdHlwaW5nLkNsYXNzVmFyW3N0cl0gPSBcIiR7dGhpcy5mcW59XCJgKTtcblxuICAgIGlmICh0aGlzLm1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5tZW1iZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLnNlcGFyYXRlTWVtYmVycykge1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICB9XG4gICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQsIHsgZm9yY2VFbWl0Qm9keTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKCdwYXNzJyk7XG4gICAgfVxuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKFxuICAgICAgJyMgQWRkaW5nIGEgXCJfX2pzaWlfcHJveHlfY2xhc3NfXygpOiB0eXBpbmcuVHlwZVwiIGZ1bmN0aW9uIHRvIHRoZSBpbnRlcmZhY2UnLFxuICAgICk7XG4gICAgY29kZS5saW5lKFxuICAgICAgYHR5cGluZy5jYXN0KHR5cGluZy5BbnksICR7dGhpcy5weXRob25OYW1lfSkuX19qc2lpX3Byb3h5X2NsYXNzX18gPSBsYW1iZGEgOiAke3RoaXMucHJveHlDbGFzc05hbWV9YCxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZnFuICE9IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZW1pdHRlZFR5cGVzLmFkZCh0aGlzLmZxbik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENsYXNzUGFyYW1zKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSB0aGlzLmJhc2VzLm1hcCgoYikgPT5cbiAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICApO1xuXG4gICAgcGFyYW1zLnB1c2goJ3R5cGluZ19leHRlbnNpb25zLlByb3RvY29sJyk7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcHJveHlDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYF8ke3RoaXMucHl0aG9uTmFtZX1Qcm94eWA7XG4gIH1cbn1cblxuY2xhc3MgSW50ZXJmYWNlTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2ludm9rZSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRFbWl0Qm9keTogYm9vbGVhbiA9IGZhbHNlO1xufVxuXG5jbGFzcyBJbnRlcmZhY2VQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdidWlsdGlucy5wcm9wZXJ0eSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZDogc3RyaW5nID0gJ2dldCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kOiBzdHJpbmcgPSAnc2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmNsYXNzIFN0cnVjdCBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUge1xuICBwcm90ZWN0ZWQgZGlyZWN0TWVtYmVycyA9IG5ldyBBcnJheTxTdHJ1Y3RGaWVsZD4oKTtcblxuICBwdWJsaWMgYWRkTWVtYmVyKG1lbWJlcjogUHl0aG9uQmFzZSk6IHZvaWQge1xuICAgIGlmICghKG1lbWJlciBpbnN0YW5jZW9mIFN0cnVjdEZpZWxkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGFkZCBTdHJ1Y3RGaWVsZCB0byBTdHJ1Y3QnKTtcbiAgICB9XG4gICAgdGhpcy5kaXJlY3RNZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgY29uc3QgYmFzZUludGVyZmFjZXMgPSB0aGlzLmdldENsYXNzUGFyYW1zKGNvbnRleHQpO1xuXG4gICAgY29kZS5pbmRlbnQoJ0Bqc2lpLmRhdGFfdHlwZSgnKTtcbiAgICBjb2RlLmxpbmUoYGpzaWlfdHlwZT0ke0pTT04uc3RyaW5naWZ5KHRoaXMuZnFuKX0sYCk7XG4gICAgZW1pdExpc3QoY29kZSwgJ2pzaWlfc3RydWN0X2Jhc2VzPVsnLCBiYXNlSW50ZXJmYWNlcywgJ10sJyk7XG4gICAgYXNzaWduRGljdGlvbmFyeShjb2RlLCAnbmFtZV9tYXBwaW5nJywgdGhpcy5wcm9wZXJ0eU1hcCgpLCAnLCcsIHRydWUpO1xuICAgIGNvZGUudW5pbmRlbnQoJyknKTtcbiAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdjbGFzcycsIHRoaXMucHl0aG9uTmFtZSwgYmFzZUludGVyZmFjZXMpO1xuICAgIHRoaXMuZW1pdENvbnN0cnVjdG9yKGNvZGUsIGNvbnRleHQpO1xuXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5hbGxNZW1iZXJzKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuZW1pdEdldHRlcihtZW1iZXIsIGNvZGUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdE1hZ2ljTWV0aG9kcyhjb2RlKTtcblxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKHRoaXMuZnFuICE9IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZW1pdHRlZFR5cGVzLmFkZCh0aGlzLmZxbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICAuLi50aGlzLmFsbE1lbWJlcnMubWFwKChtZW0pID0+IG1lbS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbGwgZmllbGRzIChpbmhlcml0ZWQgYXMgd2VsbClcbiAgICovXG4gIHByaXZhdGUgZ2V0IGFsbE1lbWJlcnMoKTogU3RydWN0RmllbGRbXSB7XG4gICAgcmV0dXJuIHRoaXMudGhpc0ludGVyZmFjZS5hbGxQcm9wZXJ0aWVzLm1hcChcbiAgICAgICh4KSA9PiBuZXcgU3RydWN0RmllbGQodGhpcy5nZW5lcmF0b3IsIHguc3BlYywgeC5kZWZpbmluZ1R5cGUuc3BlYyksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRoaXNJbnRlcmZhY2UoKSB7XG4gICAgaWYgKHRoaXMuZnFuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRlFOIG5vdCBzZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdG9yLnJlZmxlY3RBc3NlbWJseS5zeXN0ZW0uZmluZEludGVyZmFjZSh0aGlzLmZxbik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRDb25zdHJ1Y3Rvcihjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgbWVtYmVycyA9IHRoaXMuYWxsTWVtYmVycztcblxuICAgIGNvbnN0IGt3YXJncyA9IG1lbWJlcnMubWFwKChtKSA9PiBtLmNvbnN0cnVjdG9yRGVjbChjb250ZXh0KSk7XG5cbiAgICBjb25zdCBpbXBsaWNpdFBhcmFtZXRlciA9IHNsdWdpZnlBc05lZWRlZChcbiAgICAgICdzZWxmJyxcbiAgICAgIG1lbWJlcnMubWFwKChtKSA9PiBtLnB5dGhvbk5hbWUpLFxuICAgICk7XG4gICAgY29uc3QgY29uc3RydWN0b3JBcmd1bWVudHMgPVxuICAgICAga3dhcmdzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBbaW1wbGljaXRQYXJhbWV0ZXIsICcqJywgLi4ua3dhcmdzXVxuICAgICAgICA6IFtpbXBsaWNpdFBhcmFtZXRlcl07XG5cbiAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdkZWYnLCAnX19pbml0X18nLCBjb25zdHJ1Y3RvckFyZ3VtZW50cywgZmFsc2UsICdOb25lJyk7XG4gICAgdGhpcy5lbWl0Q29uc3RydWN0b3JEb2NzdHJpbmcoY29kZSk7XG5cbiAgICAvLyBSZS10eXBlIHN0cnVjdCBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCBhcyBcImRpY3RcIlxuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMuZmlsdGVyKChtKSA9PiBtLmlzU3RydWN0KHRoaXMuZ2VuZXJhdG9yKSkpIHtcbiAgICAgIC8vIE5vdGUgdGhhdCBcIk5vbmVcIiBpcyBOT1QgYW4gaW5zdGFuY2Ugb2YgZGljdCAodGhhdCdzIGNvbnZlbmllbnQhKVxuICAgICAgY29uc3QgdHlwZU5hbWUgPSB0b1R5cGVOYW1lKG1lbWJlci50eXBlLnR5cGUpLnB5dGhvblR5cGUoe1xuICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGNvZGUub3BlbkJsb2NrKGBpZiBpc2luc3RhbmNlKCR7bWVtYmVyLnB5dGhvbk5hbWV9LCBkaWN0KWApO1xuICAgICAgY29kZS5saW5lKGAke21lbWJlci5weXRob25OYW1lfSA9ICR7dHlwZU5hbWV9KCoqJHttZW1iZXIucHl0aG9uTmFtZX0pYCk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICAvLyBSZXF1aXJlZCBwcm9wZXJ0aWVzLCB0aG9zZSB3aWxsIGFsd2F5cyBiZSBwdXQgaW50byB0aGUgZGljdFxuICAgIGFzc2lnbkRpY3Rpb25hcnkoXG4gICAgICBjb2RlLFxuICAgICAgYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll92YWx1ZXM6IHR5cGluZy5EaWN0W3N0ciwgdHlwaW5nLkFueV1gLFxuICAgICAgbWVtYmVyc1xuICAgICAgICAuZmlsdGVyKChtKSA9PiAhbS5vcHRpb25hbClcbiAgICAgICAgLm1hcChcbiAgICAgICAgICAobWVtYmVyKSA9PlxuICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobWVtYmVyLnB5dGhvbk5hbWUpfTogJHttZW1iZXIucHl0aG9uTmFtZX1gLFxuICAgICAgICApLFxuICAgICk7XG5cbiAgICAvLyBPcHRpb25hbCBwcm9wZXJ0aWVzLCB3aWxsIG9ubHkgYmUgcHV0IGludG8gdGhlIGRpY3QgaWYgdGhleSdyZSBub3QgTm9uZVxuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMuZmlsdGVyKChtKSA9PiBtLm9wdGlvbmFsKSkge1xuICAgICAgY29kZS5vcGVuQmxvY2soYGlmICR7bWVtYmVyLnB5dGhvbk5hbWV9IGlzIG5vdCBOb25lYCk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGAke2ltcGxpY2l0UGFyYW1ldGVyfS5fdmFsdWVzW1wiJHttZW1iZXIucHl0aG9uTmFtZX1cIl0gPSAke21lbWJlci5weXRob25OYW1lfWAsXG4gICAgICApO1xuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRDb25zdHJ1Y3RvckRvY3N0cmluZyhjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICBjb25zdCBhcmdzOiBEb2N1bWVudGFibGVBcmd1bWVudFtdID0gdGhpcy5hbGxNZW1iZXJzLm1hcCgobSkgPT4gKHtcbiAgICAgIG5hbWU6IG0ucHl0aG9uTmFtZSxcbiAgICAgIGRvY3M6IG0uZG9jcyxcbiAgICAgIGRlZmluaW5nVHlwZTogdGhpcy5zcGVjLFxuICAgIH0pKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgYXJndW1lbnRzOiBhcmdzLFxuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRHZXR0ZXIoXG4gICAgbWVtYmVyOiBTdHJ1Y3RGaWVsZCxcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICkge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPSBtZW1iZXIudHlwZUFubm90YXRpb24oY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoJ0BidWlsdGlucy5wcm9wZXJ0eScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsIG1lbWJlci5weXRob25OYW1lLCBbJ3NlbGYnXSwgdHJ1ZSwgcHl0aG9uVHlwZSk7XG4gICAgbWVtYmVyLmVtaXREb2NTdHJpbmcoY29kZSk7XG4gICAgY29kZS5saW5lKFxuICAgICAgYHJlc3VsdCA9IHNlbGYuX3ZhbHVlcy5nZXQoJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9KWAsXG4gICAgKTtcbiAgICBpZiAoIW1lbWJlci5vcHRpb25hbCkge1xuICAgICAgLy8gQWRkIGFuIGFzc2VydGlvbiB0byBtYXllIE15UFkgaGFwcHkhXG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBhc3NlcnQgcmVzdWx0IGlzIG5vdCBOb25lLCBcIlJlcXVpcmVkIHByb3BlcnR5ICcke21lbWJlci5weXRob25OYW1lfScgaXMgbWlzc2luZ1wiYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvZGUubGluZShgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIHJlc3VsdClgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1hZ2ljTWV0aG9kcyhjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fZXFfXyhzZWxmLCByaHM6IHR5cGluZy5BbnkpIC0+IGJ1aWx0aW5zLmJvb2wnKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAncmV0dXJuIGlzaW5zdGFuY2UocmhzLCBzZWxmLl9fY2xhc3NfXykgYW5kIHJocy5fdmFsdWVzID09IHNlbGYuX3ZhbHVlcycsXG4gICAgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19uZV9fKHNlbGYsIHJoczogdHlwaW5nLkFueSkgLT4gYnVpbHRpbnMuYm9vbCcpO1xuICAgIGNvZGUubGluZSgncmV0dXJuIG5vdCAocmhzID09IHNlbGYpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fcmVwcl9fKHNlbGYpIC0+IHN0cicpO1xuICAgIGNvZGUuaW5kZW50KGByZXR1cm4gXCIke3RoaXMucHl0aG9uTmFtZX0oJXMpXCIgJSBcIiwgXCIuam9pbihgKTtcbiAgICBjb2RlLmxpbmUoJ2sgKyBcIj1cIiArIHJlcHIodikgZm9yIGssIHYgaW4gc2VsZi5fdmFsdWVzLml0ZW1zKCknKTtcbiAgICBjb2RlLnVuaW5kZW50KCcpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIHByb3BlcnR5TWFwKCkge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5hbGxNZW1iZXJzKSB7XG4gICAgICByZXQucHVzaChcbiAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobWVtYmVyLnB5dGhvbk5hbWUpfTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtZW1iZXIuanNpaU5hbWUsXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cblxuY2xhc3MgU3RydWN0RmllbGQgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGpzaWlOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3BlYy5PcHRpb25hbFZhbHVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBwcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGUsXG4gICkge1xuICAgIHRoaXMucHl0aG9uTmFtZSA9IHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSk7XG4gICAgdGhpcy5qc2lpTmFtZSA9IHByb3AubmFtZTtcbiAgICB0aGlzLnR5cGUgPSBwcm9wO1xuICAgIHRoaXMuZG9jcyA9IHByb3AuZG9jcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiB0aGlzLmRlZmluaW5nVHlwZS5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiB0aGlzLmpzaWlOYW1lLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9wdGlvbmFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMudHlwZS5vcHRpb25hbDtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N0cnVjdChnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1N0cnVjdChnZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbSwgdGhpcy50eXBlLnR5cGUpO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yRGVjbChjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG9wdCA9IHRoaXMub3B0aW9uYWwgPyAnID0gTm9uZScgOiAnJztcbiAgICByZXR1cm4gYCR7dGhpcy5weXRob25OYW1lfTogJHt0aGlzLnR5cGVBbm5vdGF0aW9uKHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBwYXJhbWV0ZXJUeXBlOiB0cnVlLFxuICAgIH0pfSR7b3B0fWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBQeXRob24gdHlwZSBhbm5vdGF0aW9uIGZvciB0aGlzIHR5cGVcbiAgICovXG4gIHB1YmxpYyB0eXBlQW5ub3RhdGlvbihjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucHl0aG9uVHlwZShjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0RG9jU3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgcHJvcC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IHRoaXMudHlwZUFubm90YXRpb24oY29udGV4dCk7XG4gICAgY29kZS5saW5lKGAke3RoaXMucHl0aG9uTmFtZX06ICR7cmVzb2x2ZWRUeXBlfWApO1xuICAgIHRoaXMuZW1pdERvY1N0cmluZyhjb2RlKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2xhc3NPcHRzIGV4dGVuZHMgUHl0aG9uVHlwZU9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGludGVyZmFjZXM/OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZVtdO1xuICBhYnN0cmFjdEJhc2VzPzogc3BlYy5DbGFzc1R5cGVbXTtcbn1cblxuY2xhc3MgQ2xhc3MgZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIGltcGxlbWVudHMgSVNvcnRhYmxlVHlwZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJzdHJhY3Q6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJzdHJhY3RCYXNlczogc3BlYy5DbGFzc1R5cGVbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcmZhY2VzOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZVtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3BlYzogc3BlYy5UeXBlLFxuICAgIGZxbjogc3RyaW5nLFxuICAgIG9wdHM6IENsYXNzT3B0cyxcbiAgICBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIHN1cGVyKGdlbmVyYXRvciwgbmFtZSwgc3BlYywgZnFuLCBvcHRzLCBkb2NzKTtcblxuICAgIGNvbnN0IHsgYWJzdHJhY3QgPSBmYWxzZSwgaW50ZXJmYWNlcyA9IFtdLCBhYnN0cmFjdEJhc2VzID0gW10gfSA9IG9wdHM7XG5cbiAgICB0aGlzLmFic3RyYWN0ID0gYWJzdHJhY3Q7XG4gICAgdGhpcy5pbnRlcmZhY2VzID0gaW50ZXJmYWNlcztcbiAgICB0aGlzLmFic3RyYWN0QmFzZXMgPSBhYnN0cmFjdEJhc2VzO1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHl0aG9uVHlwZVtdIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IFB5dGhvblR5cGVbXSA9IHN1cGVyLmRlcGVuZHNPbihyZXNvbHZlcik7XG4gICAgY29uc3QgcGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KHRoaXMuZnFuISk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJldHVybiBhbnkgaWZhY2VzIHRoYXQgYXJlIGluIHRoZSBzYW1lIG1vZHVsZSBhdCB0aGUgc2FtZSBsZXZlbCBvZlxuICAgIC8vIG5lc3RpbmcuXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgaWZhY2Ugb2YgdGhpcy5pbnRlcmZhY2VzKSB7XG4gICAgICBpZiAocmVzb2x2ZXIuaXNJbk1vZHVsZShpZmFjZSkpIHtcbiAgICAgICAgLy8gR2l2ZW4gYSBpZmFjZSwgd2UgbmVlZCB0byBsb2NhdGUgdGhlIGlmYWNlcydzIHBhcmVudCB0aGF0IGlzIHRoZSBzYW1lXG4gICAgICAgIC8vIGFzIG91ciBwYXJlbnQsIGJlY2F1c2Ugd2Ugb25seSBjYXJlIGFib3V0IGRlcGVuZGVuY2llcyB0aGF0IGFyZSBhdCB0aGVcbiAgICAgICAgLy8gc2FtZSBsZXZlbCBvZiBvdXIgb3duLlxuICAgICAgICAvLyBUT0RPOiBXZSBtaWdodCBuZWVkIHRvIHJlY3Vyc2UgaW50byBvdXIgbWVtYmVycyB0byBhbHNvIGZpbmQgdGhlaXJcbiAgICAgICAgLy8gICAgICAgZGVwZW5kZW5jaWVzLlxuICAgICAgICBsZXQgaWZhY2VJdGVtID0gcmVzb2x2ZXIuZ2V0VHlwZShpZmFjZSk7XG4gICAgICAgIGxldCBpZmFjZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChpZmFjZSk7XG4gICAgICAgIHdoaWxlIChpZmFjZVBhcmVudCAhPT0gcGFyZW50KSB7XG4gICAgICAgICAgaWZhY2VJdGVtID0gaWZhY2VQYXJlbnQ7XG4gICAgICAgICAgaWZhY2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoaWZhY2VJdGVtLmZxbiEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZWVuLmhhcyhpZmFjZUl0ZW0uZnFuISkpIHtcbiAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChpZmFjZUl0ZW0pO1xuICAgICAgICAgIHNlZW4uYWRkKGlmYWNlSXRlbS5mcW4hKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZXBlbmRlbmNpZXM7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSwgLy8gVGFrZXMgY2FyZSBvZiBiYXNlICYgbWVtYmVyc1xuICAgICAgLi4udGhpcy5pbnRlcmZhY2VzLm1hcCgoYmFzZSkgPT5cbiAgICAgICAgdG9UeXBlTmFtZShiYXNlKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgLy8gRmlyc3Qgd2UgZW1pdCBvdXIgaW1wbG1lbnRzIGRlY29yYXRvclxuICAgIGlmICh0aGlzLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW50ZXJmYWNlczogc3RyaW5nW10gPSB0aGlzLmludGVyZmFjZXMubWFwKChiKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgICApO1xuICAgICAgY29kZS5saW5lKGBAanNpaS5pbXBsZW1lbnRzKCR7aW50ZXJmYWNlcy5qb2luKCcsICcpfSlgKTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIHdlIGRvIG91ciBub3JtYWwgY2xhc3MgbG9naWMgZm9yIGVtaXR0aW5nIG91ciBtZW1iZXJzLlxuICAgIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG5cbiAgICAvLyBUaGVuLCBpZiBvdXIgY2xhc3MgaXMgQWJzdHJhY3QsIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCBhbmQgcmVkbyBhbGwgb2ZcbiAgICAvLyB0aGlzIGxvZ2ljLCBleGNlcHQgb25seSBlbWl0aW5nIGFic3RyYWN0IG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgYXMgbm9uXG4gICAgLy8gYWJzdHJhY3QsIGFuZCBzdWJjbGFzc2luZyBvdXIgaW5pdGlhbCBjbGFzcy5cbiAgICBpZiAodGhpcy5hYnN0cmFjdCkge1xuICAgICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuXG4gICAgICBjb25zdCBwcm94eUJhc2VzID0gW3RoaXMucHl0aG9uTmFtZV07XG4gICAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgdGhpcy5hYnN0cmFjdEJhc2VzKSB7XG4gICAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBiZWNhdXNlIE15UHkgY2Fubm90IGNoZWNrIGR5bmFtaWMgYmFzZSBjbGFzc2VzIChuYXR1cmFsbHkpXG4gICAgICAgIHByb3h5QmFzZXMucHVzaChcbiAgICAgICAgICBganNpaS5wcm94eV9mb3IoJHt0b1R5cGVOYW1lKGJhc2UpLnB5dGhvblR5cGUoe1xuICAgICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgICAgICB9KX0pICMgdHlwZTogaWdub3JlW21pc2NdYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5wcm94eUNsYXNzTmFtZSwgcHJveHlCYXNlcyk7XG5cbiAgICAgIC8vIEZpbHRlciBvdXIgbGlzdCBvZiBtZW1iZXJzIHRvICpvbmx5KiBiZSBhYnN0cmFjdCBtZW1iZXJzLCBhbmQgbm90IGFueVxuICAgICAgLy8gb3RoZXIgdHlwZXMuXG4gICAgICBjb25zdCBhYnN0cmFjdE1lbWJlcnMgPSB0aGlzLm1lbWJlcnMuZmlsdGVyKFxuICAgICAgICAobSkgPT5cbiAgICAgICAgICAobSBpbnN0YW5jZW9mIEJhc2VNZXRob2QgfHwgbSBpbnN0YW5jZW9mIEJhc2VQcm9wZXJ0eSkgJiYgbS5hYnN0cmFjdCxcbiAgICAgICk7XG4gICAgICBpZiAoYWJzdHJhY3RNZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgYWJzdHJhY3RNZW1iZXJzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2VwYXJhdGVNZW1iZXJzKSB7XG4gICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCBjb250ZXh0LCB7IHJlbmRlckFic3RyYWN0OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZS5saW5lKCdwYXNzJyk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgICcjIEFkZGluZyBhIFwiX19qc2lpX3Byb3h5X2NsYXNzX18oKTogdHlwaW5nLlR5cGVcIiBmdW5jdGlvbiB0byB0aGUgYWJzdHJhY3QgY2xhc3MnLFxuICAgICAgKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYHR5cGluZy5jYXN0KHR5cGluZy5BbnksICR7dGhpcy5weXRob25OYW1lfSkuX19qc2lpX3Byb3h5X2NsYXNzX18gPSBsYW1iZGEgOiAke3RoaXMucHJveHlDbGFzc05hbWV9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENsYXNzUGFyYW1zKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSB0aGlzLmJhc2VzLm1hcCgoYikgPT5cbiAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICApO1xuICAgIGNvbnN0IG1ldGFjbGFzczogc3RyaW5nID0gdGhpcy5hYnN0cmFjdCA/ICdKU0lJQWJzdHJhY3RDbGFzcycgOiAnSlNJSU1ldGEnO1xuXG4gICAgcGFyYW1zLnB1c2goYG1ldGFjbGFzcz1qc2lpLiR7bWV0YWNsYXNzfWApO1xuICAgIHBhcmFtcy5wdXNoKGBqc2lpX3R5cGU9XCIke3RoaXMuZnFufVwiYCk7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcHJveHlDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYF8ke3RoaXMucHl0aG9uTmFtZX1Qcm94eWA7XG4gIH1cbn1cblxuY2xhc3MgU3RhdGljTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I/OiBzdHJpbmcgPSAnYnVpbHRpbnMuY2xhc3NtZXRob2QnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdjbHMnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ3NpbnZva2UnO1xufVxuXG5jbGFzcyBJbml0aWFsaXplciBleHRlbmRzIEJhc2VNZXRob2Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2Q6IHN0cmluZyA9ICdjcmVhdGUnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xhc3NBc0ZpcnN0UGFyYW1ldGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJldHVybkZyb21KU0lJTWV0aG9kOiBib29sZWFuID0gZmFsc2U7XG59XG5cbmNsYXNzIE1ldGhvZCBleHRlbmRzIEJhc2VNZXRob2Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2Q6IHN0cmluZyA9ICdpbnZva2UnO1xufVxuXG5jbGFzcyBBc3luY01ldGhvZCBleHRlbmRzIEJhc2VNZXRob2Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2Q6IHN0cmluZyA9ICdhaW52b2tlJztcbn1cblxuY2xhc3MgU3RhdGljUHJvcGVydHkgZXh0ZW5kcyBCYXNlUHJvcGVydHkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmcgPSAnanNpaS5weXRob24uY2xhc3Nwcm9wZXJ0eSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ2Nscyc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kOiBzdHJpbmcgPSAnc2dldCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kOiBzdHJpbmcgPSAnc3NldCc7XG59XG5cbmNsYXNzIFByb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2J1aWx0aW5zLnByb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kOiBzdHJpbmcgPSAnZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzZXQnO1xufVxuXG5jbGFzcyBFbnVtIGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZXBhcmF0ZU1lbWJlcnMgPSBmYWxzZTtcblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuICAgIGVtaXRMaXN0KGNvZGUsICdAanNpaS5lbnVtKCcsIFtganNpaV90eXBlPVwiJHt0aGlzLmZxbn1cImBdLCAnKScpO1xuICAgIHJldHVybiBzdXBlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENsYXNzUGFyYW1zKF9jb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydlbnVtLkVudW0nXTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gc3VwZXIucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG59XG5cbmNsYXNzIEVudW1NZW1iZXIgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UsXG4gICkge1xuICAgIHRoaXMucHl0aG9uTmFtZSA9IHB5dGhvbk5hbWU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgcmV0dXJuIHsgYXBpOiAnbWVtYmVyJywgZnFuOiB0aGlzLnBhcmVudC5mcW4sIG1lbWJlck5hbWU6IHRoaXMudmFsdWUgfTtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRzT25Nb2R1bGVzKCkge1xuICAgIHJldHVybiBuZXcgU2V0PHN0cmluZz4oKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgX2NvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29kZS5saW5lKGAke3RoaXMucHl0aG9uTmFtZX0gPSBcIiR7dGhpcy52YWx1ZX1cImApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgZW51bS0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhfY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuaW50ZXJmYWNlIE1vZHVsZU9wdHMge1xuICByZWFkb25seSBhc3NlbWJseTogc3BlYy5Bc3NlbWJseTtcbiAgcmVhZG9ubHkgYXNzZW1ibHlGaWxlbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsb2FkQXNzZW1ibHk/OiBib29sZWFuO1xuICByZWFkb25seSBwYWNrYWdlPzogUGFja2FnZTtcblxuICAvKipcbiAgICogVGhlIGRvY3N0cmluZyB0byBlbWl0IGF0IHRoZSB0b3Agb2YgdGhpcyBtb2R1bGUsIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsZURvY3VtZW50YXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHl0aG9uIG1vZHVsZVxuICpcbiAqIFdpbGwgYmUgY2FsbGVkIGZvciBqc2lpIHN1Ym1vZHVsZXMgYW5kIG5hbWVzcGFjZXMuXG4gKi9cbmNsYXNzIFB5dGhvbk1vZHVsZSBpbXBsZW1lbnRzIFB5dGhvblR5cGUge1xuICAvKipcbiAgICogQ29udmVydGVkIHRvIHB1dCBvbiB0aGUgbW9kdWxlXG4gICAqXG4gICAqIFRoZSBmb3JtYXQgaXMgaW4gbWFya2Rvd24sIHdpdGggY29kZSBzYW1wbGVzIGNvbnZlcnRlZCBmcm9tIFRTIHRvIFB5dGhvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2R1bGVEb2N1bWVudGF0aW9uPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZW1ibHk6IHNwZWMuQXNzZW1ibHk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZW1ibHlGaWxlbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRBc3NlbWJseTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1iZXJzID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVzID0gbmV3IEFycmF5PFB5dGhvbk1vZHVsZT4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0czogTW9kdWxlT3B0cyxcbiAgKSB7XG4gICAgdGhpcy5hc3NlbWJseSA9IG9wdHMuYXNzZW1ibHk7XG4gICAgdGhpcy5hc3NlbWJseUZpbGVuYW1lID0gb3B0cy5hc3NlbWJseUZpbGVuYW1lO1xuICAgIHRoaXMubG9hZEFzc2VtYmx5ID0gISFvcHRzLmxvYWRBc3NlbWJseTtcbiAgICB0aGlzLm1vZHVsZURvY3VtZW50YXRpb24gPSBvcHRzLm1vZHVsZURvY3VtZW50YXRpb247XG4gIH1cblxuICBwdWJsaWMgYWRkTWVtYmVyKG1lbWJlcjogUHl0aG9uQmFzZSkge1xuICAgIHRoaXMubWVtYmVycy5wdXNoKG1lbWJlcik7XG4gIH1cblxuICBwdWJsaWMgYWRkUHl0aG9uTW9kdWxlKHB5TW9kOiBQeXRob25Nb2R1bGUpIHtcbiAgICBhc3NlcnQoXG4gICAgICAhdGhpcy5sb2FkQXNzZW1ibHksXG4gICAgICAnUHl0aG9uTW9kdWxlLmFkZFB5dGhvbk1vZHVsZSBDQU5OT1QgYmUgY2FsbGVkIG9uIGFzc2VtYmx5LWxvYWRpbmcgbW9kdWxlcyAoaXQgd291bGQgY2F1c2UgYSBsb2FkIGN5Y2xlKSEnLFxuICAgICk7XG4gICAgdGhpcy5tb2R1bGVzLnB1c2gocHlNb2QpO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICAuLi50aGlzLm1lbWJlcnMubWFwKChtZW0pID0+IG1lbS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgdGhpcy5lbWl0TW9kdWxlRG9jdW1lbnRhdGlvbihjb2RlKTtcblxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5mcW5cbiAgICAgID8gY29udGV4dC5yZXNvbHZlci5iaW5kKHRoaXMuZnFuLCB0aGlzLnB5dGhvbk5hbWUpXG4gICAgICA6IGNvbnRleHQucmVzb2x2ZXI7XG4gICAgY29udGV4dCA9IHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBzdWJtb2R1bGU6IHRoaXMuZnFuID8/IGNvbnRleHQuc3VibW9kdWxlLFxuICAgICAgcmVzb2x2ZXIsXG4gICAgfTtcblxuICAgIC8vIEJlZm9yZSB3ZSB3cml0ZSBhbnl0aGluZyBlbHNlLCB3ZSBuZWVkIHRvIHdyaXRlIG91dCBvdXIgbW9kdWxlIGhlYWRlcnMsIHRoaXNcbiAgICAvLyBpcyB3aGVyZSB3ZSBoYW5kbGUgc3R1ZmYgbGlrZSBpbXBvcnRzLCBhbnkgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24sIGV0Yy5cbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBhYmMnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBidWlsdGlucycpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGRhdGV0aW1lJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgZW51bScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHR5cGluZycpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGpzaWknKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBwdWJsaWNhdGlvbicpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHR5cGluZ19leHRlbnNpb25zJyk7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byB3cml0ZSBvdXQgdGhlIGtlcm5lbCBsb2FkIGxpbmUuXG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICB0aGlzLmVtaXREZXBlbmRlbmN5SW1wb3J0cyhjb2RlKTtcblxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBlbWl0TGlzdChcbiAgICAgICAgY29kZSxcbiAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fID0ganNpaS5KU0lJQXNzZW1ibHkubG9hZCgnLFxuICAgICAgICBbXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS5uYW1lKSxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5LnZlcnNpb24pLFxuICAgICAgICAgICdfX25hbWVfX1swOi02XScsXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseUZpbGVuYW1lKX1gLFxuICAgICAgICBdLFxuICAgICAgICAnKScsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGVuIHdlIG11c3QgaW1wb3J0IHRoZSAuX2pzaWkgc3VicGFja2FnZS5cbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgbGV0IGRpc3RhbmNlRnJvbVJvb3QgPSAwO1xuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGN1cnIgPSB0aGlzLmZxbiE7XG4gICAgICAgIGN1cnIgIT09IHRoaXMuYXNzZW1ibHkubmFtZTtcbiAgICAgICAgY3VyciA9IGN1cnIuc3Vic3RyaW5nKDAsIGN1cnIubGFzdEluZGV4T2YoJy4nKSlcbiAgICAgICkge1xuICAgICAgICBkaXN0YW5jZUZyb21Sb290Kys7XG4gICAgICB9XG4gICAgICBjb2RlLmxpbmUoYGZyb20gJHsnLicucmVwZWF0KGRpc3RhbmNlRnJvbVJvb3QgKyAxKX1fanNpaSBpbXBvcnQgKmApO1xuXG4gICAgICB0aGlzLmVtaXRSZXF1aXJlZEltcG9ydHMoY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBhbGwgb2Ygb3VyIG1lbWJlcnMuXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgcHJlcGFyZU1lbWJlcnModGhpcy5tZW1iZXJzLCByZXNvbHZlcikpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBtZW1iZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBXaGF0ZXZlciBuYW1lcyB3ZSd2ZSBleHBvcnRlZCwgd2UnbGwgd3JpdGUgb3V0IG91ciBfX2FsbF9fIHRoYXQgbGlzdHMgdGhlbS5cbiAgICBjb25zdCBleHBvcnRlZE1lbWJlcnMgPSB0aGlzLm1lbWJlcnMubWFwKChtKSA9PiBgXCIke20ucHl0aG9uTmFtZX1cImApO1xuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgZXhwb3J0ZWRNZW1iZXJzLnB1c2goJ1wiX19qc2lpX2Fzc2VtYmx5X19cIicpO1xuICAgIH1cblxuICAgIC8vIERlY2xhcmUgdGhlIGxpc3Qgb2YgXCJwdWJsaWNcIiBtZW1iZXJzIHRoaXMgbW9kdWxlIGV4cG9ydHNcbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgIH1cbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIGlmIChleHBvcnRlZE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5pbmRlbnQoJ19fYWxsX18gPSBbJyk7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBleHBvcnRlZE1lbWJlcnMuc29ydCgpKSB7XG4gICAgICAgIC8vIFdyaXRpbmcgb25lIGJ5IGxpbmUgbWlnaHQgYmUgX2EgbG90XyBvZiBsaW5lcywgYnV0IGl0J2xsIG1ha2UgcmV2aWV3aW5nIGNoYW5nZXMgdG8gdGhlIGxpc3QgZWFzaWVyLiBUcnVzdCBtZS5cbiAgICAgICAgY29kZS5saW5lKGAke21lbWJlcn0sYCk7XG4gICAgICB9XG4gICAgICBjb2RlLnVuaW5kZW50KCddJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnX19hbGxfXzogdHlwaW5nLkxpc3RbdHlwaW5nLkFueV0gPSBbXScpO1xuICAgIH1cblxuICAgIC8vIE5leHQgdXAsIHdlJ2xsIHVzZSBwdWJsaWNhdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgb2YgdGhlIG5vbi1wdWJsaWMgbmFtZXNcbiAgICAvLyBnZXQgaGlkZGVuIGZyb20gZGlyKCksIHRhYi1jb21wbGV0ZSwgZXRjLlxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgncHVibGljYXRpb24ucHVibGlzaCgpJyk7XG5cbiAgICAvLyBGaW5hbGx5LCB3ZSdsbCBsb2FkIGFsbCByZWdpc3RlcmVkIHB5dGhvbiBtb2R1bGVzXG4gICAgaWYgKHRoaXMubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgTG9hZGluZyBtb2R1bGVzIHRvIGVuc3VyZSB0aGVpciB0eXBlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBqc2lpIHJ1bnRpbWUgbGlicmFyeScsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgdGhpcy5tb2R1bGVzLnNvcnQoKGwsIHIpID0+XG4gICAgICAgIGwucHl0aG9uTmFtZS5sb2NhbGVDb21wYXJlKHIucHl0aG9uTmFtZSksXG4gICAgICApKSB7XG4gICAgICAgIGNvZGUubGluZShgaW1wb3J0ICR7bW9kdWxlLnB5dGhvbk5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGJpbiBzY3JpcHRzIGlmIGJpbiBzZWN0aW9uIGRlZmluZWQuXG4gICAqL1xuICBwdWJsaWMgZW1pdEJpblNjcmlwdHMoY29kZTogQ29kZU1ha2VyKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNjcmlwdHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgaWYgKHRoaXMuYXNzZW1ibHkuYmluICE9IG51bGwpIHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuYXNzZW1ibHkuYmluKSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdF9maWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgJ3NyYycsXG4gICAgICAgICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSh0aGlzLnB5dGhvbk5hbWUpLFxuICAgICAgICAgICAgJ2JpbicsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5vcGVuRmlsZShzY3JpcHRfZmlsZSk7XG4gICAgICAgICAgY29kZS5saW5lKCcjIS91c3IvYmluL2VudiBweXRob24nKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJ2ltcG9ydCBqc2lpJyk7XG4gICAgICAgICAgY29kZS5saW5lKCdpbXBvcnQgc3lzJyk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgZW1pdExpc3QoXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fID0ganNpaS5KU0lJQXNzZW1ibHkubG9hZCgnLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5LnZlcnNpb24pLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnB5dGhvbk5hbWUucmVwbGFjZSgnLl9qc2lpJywgJycpKSxcbiAgICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseUZpbGVuYW1lKX1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICcpJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGVtaXRMaXN0KFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICdfX2pzaWlfYXNzZW1ibHlfXy5pbnZva2VCaW5TY3JpcHQoJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS5uYW1lKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSksXG4gICAgICAgICAgICAgICdzeXMuYXJndlsxOl0nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICcpJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvZGUuY2xvc2VGaWxlKHNjcmlwdF9maWxlKTtcbiAgICAgICAgICBzY3JpcHRzLnB1c2goc2NyaXB0X2ZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBSRUFETUUgYXMgbW9kdWxlIGRvY3N0cmluZyBpZiB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBtb2R1bGUgKGl0IGxvYWRzIHRoZSBhc3NlbWJseSlcbiAgICovXG4gIHByaXZhdGUgZW1pdE1vZHVsZURvY3VtZW50YXRpb24oY29kZTogQ29kZU1ha2VyKSB7XG4gICAgaWYgKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbikge1xuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgICAgY29kZS5saW5lKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbik7XG4gICAgICBjb2RlLmxpbmUoRE9DU1RSSU5HX1FVT1RFUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGVwZW5kZW5jeUltcG9ydHMoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIChkaXJlY3QpIGRlcGVuZGVuY2llcycgLl9qc2lpIHBhY2thZ2VzLlxuICAgIGNvbnN0IGRlcHMgPSBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgIC5tYXAoXG4gICAgICAgIChkZXApID0+XG4gICAgICAgICAgdGhpcy5hc3NlbWJseS5kZXBlbmRlbmN5Q2xvc3VyZT8uW2RlcF0/LnRhcmdldHM/LnB5dGhvbj8ubW9kdWxlID8/XG4gICAgICAgICAgZGllKGBObyBQeXRob24gdGFyZ2V0IHdhcyBjb25maWdydWVkIGZvciB0aGUgZGVwZW5kZW5jeSBcIiR7ZGVwfVwiLmApLFxuICAgICAgKVxuICAgICAgLm1hcCgobW9kKSA9PiBgJHttb2R9Ll9qc2lpYClcbiAgICAgIC5zb3J0KCk7XG5cbiAgICAvLyBOb3cgYWN0dWFsbHkgd3JpdGUgdGhlIGltcG9ydCBzdGF0ZW1lbnRzLi4uXG4gICAgaWYgKGRlcHMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZU5hbWUgb2YgZGVwcykge1xuICAgICAgICBjb2RlLmxpbmUoYGltcG9ydCAke21vZHVsZU5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVxdWlyZWRJbXBvcnRzKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCByZXF1aXJlZEltcG9ydHMgPSB0aGlzLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRJbXBvcnRzKVxuICAgICAgLm1hcCgoW3NvdXJjZVBhY2thZ2UsIGl0ZW1zXSkgPT4gdG9JbXBvcnRTdGF0ZW1lbnRzKHNvdXJjZVBhY2thZ2UsIGl0ZW1zKSlcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGVsdCkgPT4gWy4uLmFjYywgLi4uZWx0XSxcbiAgICAgICAgbmV3IEFycmF5PHsgZW1pdDogKCkgPT4gdm9pZDsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9PigpLFxuICAgICAgKVxuICAgICAgLnNvcnQoaW1wb3J0Q29tcGFyYXRvcik7XG5cbiAgICBpZiAoc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgc3RhdGVtZW50LmVtaXQoY29kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbXBvcnRTdGF0ZW1lbnRzKFxuICAgICAgc291cmNlUGtnOiBzdHJpbmcsXG4gICAgICBpdGVtczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgICApOiBBcnJheTx7IGVtaXQ6IChjb2RlOiBDb2RlTWFrZXIpID0+IHZvaWQ7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHtcbiAgICAgICAgZW1pdDogKGNvZGU6IENvZGVNYWtlcikgPT4gdm9pZDtcbiAgICAgICAgY29tcGFyaXNvbkJhc2U6IHN0cmluZztcbiAgICAgIH0+KCk7XG4gICAgICBpZiAoaXRlbXMuaGFzKCcnKSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY29tcGFyaXNvbkJhc2U6IGBpbXBvcnQgJHtzb3VyY2VQa2d9YCxcbiAgICAgICAgICBlbWl0KGNvZGUpIHtcbiAgICAgICAgICAgIGNvZGUubGluZSh0aGlzLmNvbXBhcmlzb25CYXNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBpZWNlTWVhbCA9IEFycmF5LmZyb20oaXRlbXMpXG4gICAgICAgIC5maWx0ZXIoKGkpID0+IGkgIT09ICcnKVxuICAgICAgICAuc29ydCgpO1xuICAgICAgaWYgKHBpZWNlTWVhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjb21wYXJpc29uQmFzZTogYGZyb20gJHtzb3VyY2VQa2d9IGltcG9ydGAsXG4gICAgICAgICAgZW1pdDogKGNvZGUpID0+XG4gICAgICAgICAgICBlbWl0TGlzdChjb2RlLCBgZnJvbSAke3NvdXJjZVBrZ30gaW1wb3J0IGAsIHBpZWNlTWVhbCwgJycsIHtcbiAgICAgICAgICAgICAgaWZNdWx0aTogWycoJywgJyknXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW1wb3J0Q29tcGFyYXRvcihcbiAgICAgIGxlZnQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICAgcmlnaHQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBsZWZ0LmNvbXBhcmlzb25CYXNlLnN0YXJ0c1dpdGgoJ2ltcG9ydCcpID09PVxuICAgICAgICByaWdodC5jb21wYXJpc29uQmFzZS5zdGFydHNXaXRoKCdpbXBvcnQnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBsZWZ0LmNvbXBhcmlzb25CYXNlLmxvY2FsZUNvbXBhcmUocmlnaHQuY29tcGFyaXNvbkJhc2UpO1xuICAgICAgfVxuICAgICAgLy8gV2Ugd2FudCBcImZyb20gLmZvbyBpbXBvcnQgKC4uLilcIiB0byBiZSAqYWZ0ZXIqIFwiaW1wb3J0IGJhclwiXG4gICAgICByZXR1cm4gcmlnaHQuY29tcGFyaXNvbkJhc2UubG9jYWxlQ29tcGFyZShsZWZ0LmNvbXBhcmlzb25CYXNlKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VEYXRhIHtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5jbGFzcyBQYWNrYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBQeXRob25Nb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSByb290IG1vZHVsZSBvZiB0aGUgcGFja2FnZVxuICAgKi9cbiAgcHVibGljIHJvb3RNb2R1bGU/OiBQeXRob25Nb2R1bGU7XG5cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBQeXRob25Nb2R1bGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlRGF0YVtdPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgbWV0YWRhdGE6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgcHVibGljIGFkZE1vZHVsZShtb2R1bGU6IFB5dGhvbk1vZHVsZSkge1xuICAgIHRoaXMubW9kdWxlcy5zZXQobW9kdWxlLnB5dGhvbk5hbWUsIG1vZHVsZSk7XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBtb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSBhc3NlbWJseVxuICAgIGlmIChtb2R1bGUuZnFuID09PSB0aGlzLm1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkRGF0YShcbiAgICBtb2R1bGU6IFB5dGhvbk1vZHVsZSxcbiAgICBmaWxlbmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzKG1vZHVsZS5weXRob25OYW1lKSkge1xuICAgICAgdGhpcy5kYXRhLnNldChtb2R1bGUucHl0aG9uTmFtZSwgW10pO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5nZXQobW9kdWxlLnB5dGhvbk5hbWUpIS5wdXNoKHsgZmlsZW5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5tb2R1bGVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5weXRob25OYW1lLmxvY2FsZUNvbXBhcmUoYi5weXRob25OYW1lKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG9mIG91ciBtb2R1bGVzLCBhbmQgd3JpdGUgdGhlbSBvdXQgdG8gZGlzay5cbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2R1bGVzKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihcbiAgICAgICAgJ3NyYycsXG4gICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKG1vZC5weXRob25OYW1lKSxcbiAgICAgICAgJ19faW5pdF9fLnB5JyxcbiAgICAgICk7XG5cbiAgICAgIGNvZGUub3BlbkZpbGUoZmlsZW5hbWUpO1xuICAgICAgbW9kLmVtaXQoY29kZSwgY29udGV4dCk7XG4gICAgICBjb2RlLmNsb3NlRmlsZShmaWxlbmFtZSk7XG5cbiAgICAgIHNjcmlwdHMucHVzaCguLi5tb2QuZW1pdEJpblNjcmlwdHMoY29kZSkpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvdXIgcGFja2FnZSBkYXRhLlxuICAgIGNvbnN0IHBhY2thZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFttb2QsIHBkYXRhXSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBwZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5kYXRhICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUobW9kKSxcbiAgICAgICAgICAgIGRhdGEuZmlsZW5hbWUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvZGUub3BlbkZpbGUoZmlsZXBhdGgpO1xuICAgICAgICAgIGNvZGUubGluZShkYXRhLmRhdGEpO1xuICAgICAgICAgIGNvZGUuY2xvc2VGaWxlKGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYWNrYWdlRGF0YVttb2RdID0gcGRhdGEubWFwKChwZCkgPT4gcGQuZmlsZW5hbWUpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgb3VyIGxpc3Qgb2YgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2RlcE5hbWUsIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgdGhpcy5tZXRhZGF0YS5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgKSkge1xuICAgICAgY29uc3QgZGVwSW5mbyA9IHRoaXMubWV0YWRhdGEuZGVwZW5kZW5jeUNsb3N1cmUhW2RlcE5hbWVdO1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIGAke2RlcEluZm8udGFyZ2V0cyEucHl0aG9uIS5kaXN0TmFtZX0ke3RvUHl0aG9uVmVyc2lvblJhbmdlKHZlcnNpb24pfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5lZWQgdG8gYWx3YXlzIHdyaXRlIHRoaXMgZmlsZSBhcyB0aGUgYnVpbGQgcHJvY2VzcyBkZXBlbmRzIG9uIGl0LlxuICAgIC8vIE1ha2UgdXAgc29tZSBjb250ZW50cyBpZiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHVzZWZ1bCB0byBzYXkuXG4gICAgY29kZS5vcGVuRmlsZSgnUkVBRE1FLm1kJyk7XG4gICAgY29kZS5saW5lKFxuICAgICAgdGhpcy5yb290TW9kdWxlPy5tb2R1bGVEb2N1bWVudGF0aW9uID8/XG4gICAgICAgIGAke3RoaXMubmFtZX1cXG4keyc9Jy5yZXBlYXQodGhpcy5uYW1lLmxlbmd0aCl9YCxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdSRUFETUUubWQnKTtcblxuICAgIC8vIFN0cmlwIFwiIChidWlsZCBhYmNkZWYpXCIgZnJvbSB0aGUganNpaSB2ZXJzaW9uXG4gICAgY29uc3QganNpaVZlcnNpb25TaW1wbGUgPSB0aGlzLm1ldGFkYXRhLmpzaWlWZXJzaW9uLnJlcGxhY2UoLyAuKiQvLCAnJyk7XG5cbiAgICBjb25zdCBzZXR1cEt3YXJncyA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgbGljZW5zZTogdGhpcy5tZXRhZGF0YS5saWNlbnNlLFxuICAgICAgdXJsOiB0aGlzLm1ldGFkYXRhLmhvbWVwYWdlLFxuICAgICAgbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGU6ICd0ZXh0L21hcmtkb3duJyxcbiAgICAgIGF1dGhvcjpcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5hdXRob3IubmFtZSArXG4gICAgICAgICh0aGlzLm1ldGFkYXRhLmF1dGhvci5lbWFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgPCR7dGhpcy5tZXRhZGF0YS5hdXRob3IuZW1haWx9PmBcbiAgICAgICAgICA6ICcnKSxcbiAgICAgIGJkaXN0X3doZWVsOiB7XG4gICAgICAgIHVuaXZlcnNhbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwcm9qZWN0X3VybHM6IHtcbiAgICAgICAgU291cmNlOiB0aGlzLm1ldGFkYXRhLnJlcG9zaXRvcnkudXJsLFxuICAgICAgfSxcbiAgICAgIHBhY2thZ2VfZGlyOiB7ICcnOiAnc3JjJyB9LFxuICAgICAgcGFja2FnZXM6IG1vZHVsZXMubWFwKChtKSA9PiBtLnB5dGhvbk5hbWUpLFxuICAgICAgcGFja2FnZV9kYXRhOiBwYWNrYWdlRGF0YSxcbiAgICAgIHB5dGhvbl9yZXF1aXJlczogJz49My42JyxcbiAgICAgIGluc3RhbGxfcmVxdWlyZXM6IFtcbiAgICAgICAgYGpzaWkke3RvUHl0aG9uVmVyc2lvblJhbmdlKGBeJHtqc2lpVmVyc2lvblNpbXBsZX1gKX1gLFxuICAgICAgICAncHVibGljYXRpb24+PTAuMC4zJyxcbiAgICAgIF1cbiAgICAgICAgLmNvbmNhdChkZXBlbmRlbmNpZXMpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICBjbGFzc2lmaWVyczogW1xuICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsXG4gICAgICAgICdPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IEphdmFTY3JpcHQnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMgOjogT25seScsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy42JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjcnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOCcsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy45JyxcbiAgICAgICAgJ1R5cGluZyA6OiBUeXBlZCcsXG4gICAgICBdLFxuICAgICAgc2NyaXB0cyxcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0aGlzLm1ldGFkYXRhLmRvY3M/LnN0YWJpbGl0eSkge1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw6XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA0IC0gQmV0YScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuU3RhYmxlOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKFxuICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlJyxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQ6XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA3IC0gSW5hY3RpdmUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gTm8gJ0RldmVsb3BtZW50IFN0YXR1cycgdHJvdmUgY2xhc3NpZmllciBmb3IgeW91IVxuICAgIH1cblxuICAgIGlmIChzcGR4TGljZW5zZUxpc3RbdGhpcy5tZXRhZGF0YS5saWNlbnNlXT8ub3NpQXBwcm92ZWQpIHtcbiAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0xpY2Vuc2UgOjogT1NJIEFwcHJvdmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkaXRpb25hbENsYXNzaWZpZXJzID0gdGhpcy5tZXRhZGF0YS50YXJnZXRzPy5weXRob24/LmNsYXNzaWZpZXJzO1xuICAgIGlmIChhZGRpdGlvbmFsQ2xhc3NpZmllcnMgIT0gbnVsbCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFkZGl0aW9uYWxDbGFzc2lmaWVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgXCJqc2lpLnRhcmdldHMucHl0aG9uLmNsYXNzaWZpZXJzXCIgdmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIGlmIHByb3ZpZGVkLCBidXQgZm91bmQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGFkZGl0aW9uYWxDbGFzc2lmaWVycyxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGRpc2NvdXJhZ2UgdXNpbmcgdGhvc2Ugc2luY2Ugd2UgYXV0b21hdGljYWxseSBzZXQgYSB2YWx1ZSBmb3IgdGhlbVxuICAgICAgZm9yIChsZXQgY2xhc3NpZmllciBvZiBhZGRpdGlvbmFsQ2xhc3NpZmllcnMuc29ydCgpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIFwianNpaS50YXJnZXRzLnB5dGhvbi5jbGFzc2lmaWVyc1wiIHZhbHVlIGNhbiBvbmx5IGNvbnRhaW4gc3RyaW5ncywgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIGNsYXNzaWZpZXIsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSdsbCBzcGxpdCBvbiBgOjpgIGFuZCByZS1qb2luIGxhdGVyIHNvIGNsYXNzaWZpZXJzIGFyZSBcIm5vcm1hbGl6ZWRcIiB0byBhIHN0YW5kYXJkIHNwYWNpbmdcbiAgICAgICAgY29uc3QgcGFydHMgPSBjbGFzc2lmaWVyLnNwbGl0KCc6OicpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpO1xuICAgICAgICBjb25zdCByZXNlcnZlZENsYXNzaWZpZXJzID0gW1xuICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMnLFxuICAgICAgICAgICdMaWNlbnNlJyxcbiAgICAgICAgICAnT3BlcmF0aW5nIFN5c3RlbScsXG4gICAgICAgICAgJ1R5cGluZycsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChyZXNlcnZlZENsYXNzaWZpZXJzLmluY2x1ZGVzKHBhcnRzWzBdKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBgQ2xhc3NpZmllcnMgc3RhcnRpbmcgd2l0aCAke3Jlc2VydmVkQ2xhc3NpZmllcnNcbiAgICAgICAgICAgICAgLm1hcCgoeCkgPT4gYFwiJHt4fSA6OlwiYClcbiAgICAgICAgICAgICAgLmpvaW4oXG4gICAgICAgICAgICAgICAgJywgJyxcbiAgICAgICAgICAgICAgKX0gYXJlIGF1dG9tYXRpY2FsbHkgc2V0IGFuZCBzaG91bGQgbm90IGJlIG1hbnVhbGx5IGNvbmZpZ3VyZWRgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2xhc3NpZmllciA9IHBhcnRzLmpvaW4oJyA6OiAnKTtcbiAgICAgICAgaWYgKHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLmluY2x1ZGVzKGNsYXNzaWZpZXIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaChjbGFzc2lmaWVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBOZWVkIGEgc2V0dXAucHkgdG8gbWFrZSB0aGlzIFBhY2thZ2UsIGFjdHVhbGx5IGEgUGFja2FnZS5cbiAgICBjb2RlLm9wZW5GaWxlKCdzZXR1cC5weScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGpzb24nKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBzZXR1cHRvb2xzJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdrd2FyZ3MgPSBqc29uLmxvYWRzKCcpO1xuICAgIGNvZGUubGluZSgnICAgIFwiXCJcIicpO1xuICAgIGNvZGUubGluZShKU09OLnN0cmluZ2lmeShzZXR1cEt3YXJncywgbnVsbCwgNCkpO1xuICAgIGNvZGUubGluZSgnXCJcIlwiJyk7XG4gICAgY29kZS5saW5lKCcpJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ3dpdGggb3BlbihcIlJFQURNRS5tZFwiLCBlbmNvZGluZz1cInV0ZjhcIikgYXMgZnAnKTtcbiAgICBjb2RlLmxpbmUoJ2t3YXJnc1tcImxvbmdfZGVzY3JpcHRpb25cIl0gPSBmcC5yZWFkKCknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoJ3NldHVwdG9vbHMuc2V0dXAoKiprd2FyZ3MpJyk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ3NldHVwLnB5Jyk7XG5cbiAgICAvLyBCZWNhdXNlIHdlJ3JlIGdvb2QgY2l0aXplbnMsIHdlJ3JlIGdvaW5nIHRvIGdvIGFoZWFkIGFuZCBzdXBwb3J0IHB5cHJvamVjdC50b21sXG4gICAgLy8gYXMgd2VsbC5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBlYXNpZXIgdG8ganVzdCB1c2UgYSBUT01MIGxpYnJhcnkgdG8gd3JpdGUgdGhpcyBvdXQuXG4gICAgY29kZS5vcGVuRmlsZSgncHlwcm9qZWN0LnRvbWwnKTtcbiAgICBjb2RlLmxpbmUoJ1tidWlsZC1zeXN0ZW1dJyk7XG4gICAgY29uc3QgYnVpbGRUb29scyA9IGZzXG4gICAgICAucmVhZEZpbGVTeW5jKHJlcXVpcmVtZW50c0ZpbGUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IC9eXFxzKiguKylcXHMqI1xccypidWlsZC1zeXN0ZW1cXHMqJC8uZXhlYyhsaW5lKT8uWzFdPy50cmltKCkpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYnVpbGRUb29scywgZW50cnkpID0+IChlbnRyeSA/IFsuLi5idWlsZFRvb2xzLCBlbnRyeV0gOiBidWlsZFRvb2xzKSxcbiAgICAgICAgbmV3IEFycmF5PHN0cmluZz4oKSxcbiAgICAgICk7XG4gICAgY29kZS5saW5lKGByZXF1aXJlcyA9IFske2J1aWxkVG9vbHMubWFwKCh4KSA9PiBgXCIke3h9XCJgKS5qb2luKCcsICcpfV1gKTtcbiAgICBjb2RlLmxpbmUoJ2J1aWxkLWJhY2tlbmQgPSBcInNldHVwdG9vbHMuYnVpbGRfbWV0YVwiJyk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ3B5cHJvamVjdC50b21sJyk7XG5cbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd3JpdGUgb3V0IGEgTUFOSUZFU1QuaW4gdG8gZW5zdXJlIHRoYXQgYWxsIG9mIG91ciByZXF1aXJlZFxuICAgIC8vIGZpbGVzIGFyZSBpbmNsdWRlZC5cbiAgICBjb2RlLm9wZW5GaWxlKCdNQU5JRkVTVC5pbicpO1xuICAgIGNvZGUubGluZSgnaW5jbHVkZSBweXByb2plY3QudG9tbCcpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdNQU5JRkVTVC5pbicpO1xuICB9XG59XG5cbnR5cGUgRmluZE1vZHVsZUNhbGxiYWNrID0gKGZxbjogc3RyaW5nKSA9PiBzcGVjLkFzc2VtYmx5Q29uZmlndXJhdGlvbjtcbnR5cGUgRmluZFR5cGVDYWxsYmFjayA9IChmcW46IHN0cmluZykgPT4gc3BlYy5UeXBlO1xuXG5jbGFzcyBUeXBlUmVzb2x2ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZFRvPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kUmUhOiBSZWdFeHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlTmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZSE6IFJlZ0V4cDtcbiAgcHJpdmF0ZSByZWFkb25seSBmaW5kTW9kdWxlOiBGaW5kTW9kdWxlQ2FsbGJhY2s7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZFR5cGU6IEZpbmRUeXBlQ2FsbGJhY2s7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPixcbiAgICBmaW5kTW9kdWxlOiBGaW5kTW9kdWxlQ2FsbGJhY2ssXG4gICAgZmluZFR5cGU6IEZpbmRUeXBlQ2FsbGJhY2ssXG4gICAgYm91bmRUbz86IHN0cmluZyxcbiAgICBtb2R1bGVOYW1lPzogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgdGhpcy5maW5kTW9kdWxlID0gZmluZE1vZHVsZTtcbiAgICB0aGlzLmZpbmRUeXBlID0gZmluZFR5cGU7XG4gICAgdGhpcy5tb2R1bGVOYW1lID0gbW9kdWxlTmFtZTtcbiAgICB0aGlzLmJvdW5kVG8gPSBib3VuZFRvICE9PSB1bmRlZmluZWQgPyB0aGlzLnRvUHl0aG9uRlFOKGJvdW5kVG8pIDogYm91bmRUbztcblxuICAgIGlmICh0aGlzLm1vZHVsZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tb2R1bGVSZSA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKHRoaXMubW9kdWxlTmFtZSl9KVxcXFwuKC4rKSRgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ib3VuZFRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYm91bmRSZSA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKHRoaXMuYm91bmRUbyl9KVxcXFwuKC4rKSRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYmluZChmcW46IHN0cmluZywgbW9kdWxlTmFtZT86IHN0cmluZyk6IFR5cGVSZXNvbHZlciB7XG4gICAgcmV0dXJuIG5ldyBUeXBlUmVzb2x2ZXIoXG4gICAgICB0aGlzLnR5cGVzLFxuICAgICAgdGhpcy5maW5kTW9kdWxlLFxuICAgICAgdGhpcy5maW5kVHlwZSxcbiAgICAgIGZxbixcbiAgICAgIG1vZHVsZU5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG1vZHVsZU5hbWUuc3RhcnRzV2l0aCgnLicpXG4gICAgICAgICAgPyBgJHt0aGlzLm1vZHVsZU5hbWV9JHttb2R1bGVOYW1lfWBcbiAgICAgICAgICA6IG1vZHVsZU5hbWVcbiAgICAgICAgOiB0aGlzLm1vZHVsZU5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luTW9kdWxlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9XG4gICAgICB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0aGlzLnRvUHl0aG9uRlFOKHR5cGVSZWYuZnFuKSA6IHR5cGVSZWY7XG4gICAgcmV0dXJuIHRoaXMubW9kdWxlUmUudGVzdChweXRob25UeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luTmFtZXNwYWNlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9XG4gICAgICB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0aGlzLnRvUHl0aG9uRlFOKHR5cGVSZWYuZnFuKSA6IHR5cGVSZWY7XG4gICAgcmV0dXJuIHRoaXMuYm91bmRSZS50ZXN0KHB5dGhvblR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmVudCh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIGNvbnN0IGZxbiA9IHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJyA/IHR5cGVSZWYuZnFuIDogdHlwZVJlZjtcbiAgICBjb25zdCBtYXRjaGVzID0gL14oLispXFwuW14uXSskLy5leGVjKGZxbik7XG4gICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEZRTjogJHtmcW59YCk7XG4gICAgfVxuICAgIGNvbnN0IFssIHBhcmVudEZRTl0gPSBtYXRjaGVzO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHlwZXMuZ2V0KHBhcmVudEZRTik7XG5cbiAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgcGFyZW50OiAgJHtwYXJlbnRGUU59YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWZpbmluZ1B5dGhvbk1vZHVsZShcbiAgICB0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBmcW4gPSB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0eXBlUmVmLmZxbiA6IHR5cGVSZWY7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy50eXBlcy5nZXQoZnFuKTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGxldCBtb2QgPSBwYXJlbnQ7XG4gICAgICB3aGlsZSAoIShtb2QgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSB7XG4gICAgICAgIG1vZCA9IHRoaXMuZ2V0UGFyZW50KG1vZC5mcW4hKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtb2QucHl0aG9uTmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaGVzID0gL14oW14uXSspXFwuLy5leGVjKGZxbik7XG4gICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEZRTjogJHtmcW59YCk7XG4gICAgfVxuICAgIGNvbnN0IFssIGFzc21dID0gbWF0Y2hlcztcbiAgICByZXR1cm4gdGhpcy5maW5kTW9kdWxlKGFzc20pLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlO1xuICB9XG5cbiAgcHVibGljIGdldFR5cGUodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlcy5nZXQodHlwZVJlZi5mcW4pO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIHR5cGU6IFwiJHt0eXBlUmVmLmZxbn1cImApO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHVibGljIGRlcmVmZXJlbmNlKHR5cGVSZWY6IHN0cmluZyB8IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKTogc3BlYy5UeXBlIHtcbiAgICBpZiAodHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0eXBlUmVmID0gdHlwZVJlZi5mcW47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmRUeXBlKHR5cGVSZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1B5dGhvbkZRTihmcW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgW2Fzc2VtYmx5TmFtZSwgLi4ucXVhbGlmaWVkSWRlbnRpZmllcnNdID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZnFuUGFydHM6IHN0cmluZ1tdID0gW1xuICAgICAgdGhpcy5maW5kTW9kdWxlKGFzc2VtYmx5TmFtZSkudGFyZ2V0cyEucHl0aG9uIS5tb2R1bGUsXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBxdWFsaWZpZWRJZGVudGlmaWVycykge1xuICAgICAgZnFuUGFydHMucHVzaCh0b1B5dGhvbklkZW50aWZpZXIocGFydCkpO1xuICAgIH1cblxuICAgIHJldHVybiBmcW5QYXJ0cy5qb2luKCcuJyk7XG4gIH1cbn1cblxuY2xhc3MgUHl0aG9uR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHtcbiAgcHJpdmF0ZSBwYWNrYWdlITogUGFja2FnZTtcbiAgcHJpdmF0ZSByb290TW9kdWxlPzogUHl0aG9uTW9kdWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3NldHRhOiBSb3NldHRhLFxuICAgIG9wdGlvbnM6IEdlbmVyYXRvck9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrRm9ybWF0dGVyID0gKHMpID0+IGAke3N9OmA7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2tGb3JtYXR0ZXIgPSAoX3MpID0+IGZhbHNlO1xuXG4gICAgdGhpcy50eXBlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHB1YmxpYyBlbWl0RG9jU3RyaW5nKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBhcGlMb2NhdGlvbjogQXBpTG9jYXRpb24sXG4gICAgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGFyZ3VtZW50cz86IERvY3VtZW50YWJsZUFyZ3VtZW50W107XG4gICAgICBkb2N1bWVudGFibGVJdGVtPzogc3RyaW5nO1xuICAgICAgdHJhaWxpbmdOZXdMaW5lPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGlmICgoIWRvY3MgfHwgT2JqZWN0LmtleXMoZG9jcykubGVuZ3RoID09PSAwKSAmJiAhb3B0aW9ucy5hcmd1bWVudHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFkb2NzKSB7XG4gICAgICBkb2NzID0ge307XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKGRvY3Muc3VtbWFyeSkge1xuICAgICAgbGluZXMucHVzaChtZDJyc3QocmVuZGVyU3VtbWFyeShkb2NzKSkpO1xuICAgICAgYnJrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJyaygpIHtcbiAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmxvY2soaGVhZGluZzogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGRvQnJrID0gdHJ1ZSkge1xuICAgICAgaWYgKGRvQnJrKSB7XG4gICAgICAgIGJyaygpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGVudExpbmVzID0gbWQycnN0KGNvbnRlbnQpLnNwbGl0KCdcXG4nKTtcbiAgICAgIGlmIChjb250ZW50TGluZXMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgbGluZXMucHVzaChgOiR7aGVhZGluZ306ICR7Y29udGVudExpbmVzLmpvaW4oJycpfWAudHJpbSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYDoke2hlYWRpbmd9OmApO1xuICAgICAgICBicmsoKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGNvbnRlbnRMaW5lcykge1xuICAgICAgICAgIGxpbmVzLnB1c2gobGluZS50cmltKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZG9CcmspIHtcbiAgICAgICAgYnJrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRvY3MucmVtYXJrcykge1xuICAgICAgYnJrKCk7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAuLi5tZDJyc3QodGhpcy5jb252ZXJ0TWFya2Rvd24oZG9jcy5yZW1hcmtzID8/ICcnLCBhcGlMb2NhdGlvbikpLnNwbGl0KFxuICAgICAgICAgICdcXG4nLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGJyaygpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFyZ3VtZW50cz8ubGVuZ3RoID8/IDAgPiAwKSB7XG4gICAgICBicmsoKTtcbiAgICAgIGZvciAoY29uc3QgcGFyYW0gb2Ygb3B0aW9ucy5hcmd1bWVudHMhKSB7XG4gICAgICAgIC8vIEFkZCBhIGxpbmUgZm9yIGV2ZXJ5IGFyZ3VtZW50LiBFdmVuIGlmIHRoZXJlIGlzIG5vIGRlc2NyaXB0aW9uLCB3ZSBuZWVkXG4gICAgICAgIC8vIHRoZSBkb2NzdHJpbmcgc28gdGhhdCB0aGUgU3BoaW54IGV4dGVuc2lvbiBjYW4gYWRkIHRoZSB0eXBlIGFubm90YXRpb25zLlxuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGA6cGFyYW0gJHt0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSl9OiAke29uZWxpbmVEZXNjcmlwdGlvbihcbiAgICAgICAgICAgIHBhcmFtLmRvY3MsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MuZGVmYXVsdCkge1xuICAgICAgYmxvY2soJ2RlZmF1bHQnLCBkb2NzLmRlZmF1bHQpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5yZXR1cm5zKSB7XG4gICAgICBibG9jaygncmV0dXJuJywgZG9jcy5yZXR1cm5zKTtcbiAgICB9XG4gICAgaWYgKGRvY3MuZGVwcmVjYXRlZCkge1xuICAgICAgYmxvY2soJ2RlcHJlY2F0ZWQnLCBkb2NzLmRlcHJlY2F0ZWQpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5zZWUpIHtcbiAgICAgIGJsb2NrKCdzZWUnLCBkb2NzLnNlZSwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5zdGFiaWxpdHkgJiYgc2hvdWxkTWVudGlvblN0YWJpbGl0eShkb2NzLnN0YWJpbGl0eSkpIHtcbiAgICAgIGJsb2NrKCdzdGFiaWxpdHknLCBkb2NzLnN0YWJpbGl0eSwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5zdWJjbGFzc2FibGUpIHtcbiAgICAgIGJsb2NrKCdzdWJjbGFzc2FibGUnLCAnWWVzJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZG9jcy5jdXN0b20gPz8ge30pKSB7XG4gICAgICBibG9jayhrLCB2LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MuZXhhbXBsZSkge1xuICAgICAgYnJrKCk7XG4gICAgICBsaW5lcy5wdXNoKCdFeGFtcGxlOjonKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgY29uc3QgZXhhbXBsZVRleHQgPSB0aGlzLmNvbnZlcnRFeGFtcGxlKGRvY3MuZXhhbXBsZSwgYXBpTG9jYXRpb24pO1xuXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXhhbXBsZVRleHQuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICAke2xpbmV9YCk7XG4gICAgICB9XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gJycpIHtcbiAgICAgIGxpbmVzLnBvcCgpO1xuICAgIH1cblxuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7RE9DU1RSSU5HX1FVT1RFU30ke2xpbmVzWzBdfSR7RE9DU1RSSU5HX1FVT1RFU31gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKGAke0RPQ1NUUklOR19RVU9URVN9JHtsaW5lc1swXX1gKTtcbiAgICAgIGxpbmVzLnNwbGljZSgwLCAxKTtcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGNvZGUubGluZShsaW5lKTtcbiAgICAgIH1cblxuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50cmFpbGluZ05ld0xpbmUpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjb252ZXJ0RXhhbXBsZShleGFtcGxlOiBzdHJpbmcsIGFwaUxvYzogQXBpTG9jYXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJvc2V0dGEudHJhbnNsYXRlRXhhbXBsZShcbiAgICAgIGFwaUxvYyxcbiAgICAgIGV4YW1wbGUsXG4gICAgICBUYXJnZXRMYW5ndWFnZS5QWVRIT04sXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQpO1xuICB9XG5cbiAgcHVibGljIGNvbnZlcnRNYXJrZG93bihtYXJrZG93bjogc3RyaW5nLCBhcGlMb2M6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZVNuaXBwZXRzSW5NYXJrZG93bihcbiAgICAgIGFwaUxvYyxcbiAgICAgIG1hcmtkb3duLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICAgKHRyYW5zKSA9PiAoe1xuICAgICAgICBsYW5ndWFnZTogdHJhbnMubGFuZ3VhZ2UsXG4gICAgICAgIHNvdXJjZTogdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByZWZpeERpc2NsYWltZXIodHJhbnNsYXRlZDogVHJhbnNsYXRpb24pIHtcbiAgICBpZiAoIXRyYW5zbGF0ZWQuZGlkQ29tcGlsZSAmJiBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HKSB7XG4gICAgICByZXR1cm4gYCMgJHtJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HfVxcbiR7dHJhbnNsYXRlZC5zb3VyY2V9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldFB5dGhvblR5cGUoZnFuOiBzdHJpbmcpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlcy5nZXQoZnFuKTtcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvY2F0ZSB0eXBlOiBcIiR7ZnFufVwiYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXNzZW1ibHlPdXRwdXREaXIoYXNzbTogc3BlYy5Bc3NlbWJseSkge1xuICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAnc3JjJyxcbiAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKHRoaXMuZ2V0QXNzZW1ibHlNb2R1bGVOYW1lKGFzc20pKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5Bc3NlbWJseShhc3NtOiBzcGVjLkFzc2VtYmx5LCBfZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnBhY2thZ2UgPSBuZXcgUGFja2FnZShcbiAgICAgIGFzc20udGFyZ2V0cyEucHl0aG9uIS5kaXN0TmFtZSxcbiAgICAgIHRvUmVsZWFzZVZlcnNpb24oYXNzbS52ZXJzaW9uLCBUYXJnZXROYW1lLlBZVEhPTiksXG4gICAgICBhc3NtLFxuICAgICk7XG5cbiAgICAvLyBUaGlzIGlzIHRoZSAnPHBhY2thZ2VuYW1lPi5fanNpaScgbW9kdWxlIGZvciB0aGlzIGFzc2VtYmx5XG4gICAgY29uc3QgYXNzZW1ibHlNb2R1bGUgPSBuZXcgUHl0aG9uTW9kdWxlKFxuICAgICAgdGhpcy5nZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbSksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGFzc2VtYmx5OiBhc3NtLFxuICAgICAgICBhc3NlbWJseUZpbGVuYW1lOiB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSxcbiAgICAgICAgbG9hZEFzc2VtYmx5OiB0cnVlLFxuICAgICAgICBwYWNrYWdlOiB0aGlzLnBhY2thZ2UsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkTW9kdWxlKGFzc2VtYmx5TW9kdWxlKTtcbiAgICB0aGlzLnBhY2thZ2UuYWRkRGF0YShhc3NlbWJseU1vZHVsZSwgdGhpcy5nZXRBc3NlbWJseUZpbGVOYW1lKCksIHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRBc3NlbWJseShhc3NtOiBzcGVjLkFzc2VtYmx5LCBfZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUeXBlUmVzb2x2ZXIoXG4gICAgICB0aGlzLnR5cGVzLFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRNb2R1bGUoZnFuKSxcbiAgICAgIChmcW46IHN0cmluZykgPT4gdGhpcy5maW5kVHlwZShmcW4pLFxuICAgICk7XG4gICAgdGhpcy5wYWNrYWdlLndyaXRlKHRoaXMuY29kZSwge1xuICAgICAgYXNzZW1ibHk6IGFzc20sXG4gICAgICBlbWl0dGVkVHlwZXM6IG5ldyBTZXQoKSxcbiAgICAgIHJlc29sdmVyLFxuICAgICAgc3VibW9kdWxlOiBhc3NtLm5hbWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCBiZSBjYWxsZWQgZm9yIGFzc2VtYmx5IHJvb3QsIG5hbWVzcGFjZXMgYW5kIHN1Ym1vZHVsZXMgKGFueXRoaW5nIHRoYXQgY29udGFpbnMgb3RoZXIgdHlwZXMsIGJhc2VkIG9uIGl0cyBGUU4pXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CZWdpbk5hbWVzcGFjZShuczogc3RyaW5nKSB7XG4gICAgLy8gJ25zJyBjb250YWlucyBzb21ldGhpbmcgbGlrZSAnQHNjb3BlL2pzaWktY2FsYy1iYXNlLW9mLWJhc2UnXG4gICAgY29uc3Qgc3VibW9kdWxlTGlrZSA9XG4gICAgICBucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lXG4gICAgICAgID8gdGhpcy5hc3NlbWJseVxuICAgICAgICA6IHRoaXMuYXNzZW1ibHkuc3VibW9kdWxlcz8uW25zXTtcblxuICAgIGNvbnN0IHJlYWRtZUxvY2F0aW9uOiBBcGlMb2NhdGlvbiA9IHsgYXBpOiAnbW9kdWxlUmVhZG1lJywgbW9kdWxlRnFuOiBucyB9O1xuXG4gICAgY29uc3QgbW9kdWxlID0gbmV3IFB5dGhvbk1vZHVsZSh0b1BhY2thZ2VOYW1lKG5zLCB0aGlzLmFzc2VtYmx5KSwgbnMsIHtcbiAgICAgIGFzc2VtYmx5OiB0aGlzLmFzc2VtYmx5LFxuICAgICAgYXNzZW1ibHlGaWxlbmFtZTogdGhpcy5nZXRBc3NlbWJseUZpbGVOYW1lKCksXG4gICAgICBwYWNrYWdlOiB0aGlzLnBhY2thZ2UsXG4gICAgICBtb2R1bGVEb2N1bWVudGF0aW9uOiBzdWJtb2R1bGVMaWtlPy5yZWFkbWVcbiAgICAgICAgPyB0aGlzLmNvbnZlcnRNYXJrZG93bihcbiAgICAgICAgICAgIHN1Ym1vZHVsZUxpa2UucmVhZG1lPy5tYXJrZG93bixcbiAgICAgICAgICAgIHJlYWRtZUxvY2F0aW9uLFxuICAgICAgICAgICkudHJpbSgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wYWNrYWdlLmFkZE1vZHVsZShtb2R1bGUpO1xuICAgIHRoaXMudHlwZXMuc2V0KG5zLCBtb2R1bGUpO1xuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICAvLyBUaGlzIGFwcGxpZXMgcmVjdXJzaXZlbHkgdG8gc3VibW9kdWxlcywgc28gbm8gbmVlZCB0byBkdXBsaWNhdGUhXG4gICAgICB0aGlzLnBhY2thZ2UuYWRkRGF0YShtb2R1bGUsICdweS50eXBlZCcsICcnKTtcbiAgICB9XG5cbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgdGhpcy5yb290TW9kdWxlID0gbW9kdWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUhLmFkZFB5dGhvbk1vZHVsZShtb2R1bGUpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZE5hbWVzcGFjZShuczogc3RyaW5nKSB7XG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvb3RNb2R1bGU7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5DbGFzcyhjbHM6IHNwZWMuQ2xhc3NUeXBlLCBhYnN0cmFjdDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGtsYXNzID0gbmV3IENsYXNzKFxuICAgICAgdGhpcyxcbiAgICAgIHRvUHl0aG9uSWRlbnRpZmllcihjbHMubmFtZSksXG4gICAgICBjbHMsXG4gICAgICBjbHMuZnFuLFxuICAgICAge1xuICAgICAgICBhYnN0cmFjdCxcbiAgICAgICAgYmFzZXM6IGNscy5iYXNlID8gW3RoaXMuZmluZFR5cGUoY2xzLmJhc2UpXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW50ZXJmYWNlczogY2xzLmludGVyZmFjZXM/Lm1hcCgoYmFzZSkgPT4gdGhpcy5maW5kVHlwZShiYXNlKSksXG4gICAgICAgIGFic3RyYWN0QmFzZXM6IGFic3RyYWN0ID8gdGhpcy5nZXRBYnN0cmFjdEJhc2VzKGNscykgOiBbXSxcbiAgICAgIH0sXG4gICAgICBjbHMuZG9jcyxcbiAgICApO1xuXG4gICAgaWYgKGNscy5pbml0aWFsaXplciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gY2xzLmluaXRpYWxpemVyO1xuXG4gICAgICBrbGFzcy5hZGRNZW1iZXIoXG4gICAgICAgIG5ldyBJbml0aWFsaXplcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgICdfX2luaXRfXycsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGNscy5pbml0aWFsaXplci5kb2NzLFxuICAgICAgICAgIGZhbHNlLCAvLyBOZXZlciBzdGF0aWNcbiAgICAgICAgICB7IGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChjbHMuaW5pdGlhbGl6ZXIpLCBwYXJlbnQ6IGNscyB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoa2xhc3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gbWV0aG9kO1xuXG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBTdGF0aWNNZXRob2QoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSksXG4gICAgICAgIG1ldGhvZC5uYW1lLFxuICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgbWV0aG9kLmRvY3MsXG4gICAgICAgIHRydWUsIC8vIEFsd2F5cyBzdGF0aWNcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBtZXRob2QuYWJzdHJhY3QsXG4gICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNQcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBTdGF0aWNQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0KSxcbiAgICAgICAgcHJvcC5uYW1lLFxuICAgICAgICBwcm9wLFxuICAgICAgICBwcm9wLmRvY3MsXG4gICAgICAgIHtcbiAgICAgICAgICBhYnN0cmFjdDogcHJvcC5hYnN0cmFjdCxcbiAgICAgICAgICBpbW11dGFibGU6IHByb3AuaW1tdXRhYmxlLFxuICAgICAgICAgIGlzU3RhdGljOiBwcm9wLnN0YXRpYyxcbiAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1ldGhvZChjbHM6IHNwZWMuQ2xhc3NUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IG1ldGhvZDtcblxuICAgIGlmIChtZXRob2QuYXN5bmMpIHtcbiAgICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICAgIG5ldyBBc3luY01ldGhvZChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSwgbWV0aG9kLnByb3RlY3RlZCksXG4gICAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICAgIG5ldyBNZXRob2QoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUsIG1ldGhvZC5wcm90ZWN0ZWQpLFxuICAgICAgICAgIG1ldGhvZC5uYW1lLFxuICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgICAgbWV0aG9kLmRvY3MsXG4gICAgICAgICAgISFtZXRob2Quc3RhdGljLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFic3RyYWN0OiBtZXRob2QuYWJzdHJhY3QsXG4gICAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblByb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFByb3BlcnR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUsIHByb3AuY29uc3QsIHByb3AucHJvdGVjdGVkKSxcbiAgICAgICAgcHJvcC5uYW1lLFxuICAgICAgICBwcm9wLFxuICAgICAgICBwcm9wLmRvY3MsXG4gICAgICAgIHtcbiAgICAgICAgICBhYnN0cmFjdDogcHJvcC5hYnN0cmFjdCxcbiAgICAgICAgICBpbW11dGFibGU6IHByb3AuaW1tdXRhYmxlLFxuICAgICAgICAgIGlzU3RhdGljOiBwcm9wLnN0YXRpYyxcbiAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblVuaW9uUHJvcGVydHkoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBwcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIF91bmlvbjogc3BlYy5VbmlvblR5cGVSZWZlcmVuY2UsXG4gICkge1xuICAgIHRoaXMub25Qcm9wZXJ0eShjbHMsIHByb3ApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5JbnRlcmZhY2UoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICBsZXQgaWZhY2U6IEludGVyZmFjZSB8IFN0cnVjdDtcblxuICAgIGlmIChpZmMuZGF0YXR5cGUpIHtcbiAgICAgIGlmYWNlID0gbmV3IFN0cnVjdChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25JZGVudGlmaWVyKGlmYy5uYW1lKSxcbiAgICAgICAgaWZjLFxuICAgICAgICBpZmMuZnFuLFxuICAgICAgICB7IGJhc2VzOiBpZmMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSB9LFxuICAgICAgICBpZmMuZG9jcyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmYWNlID0gbmV3IEludGVyZmFjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25JZGVudGlmaWVyKGlmYy5uYW1lKSxcbiAgICAgICAgaWZjLFxuICAgICAgICBpZmMuZnFuLFxuICAgICAgICB7IGJhc2VzOiBpZmMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSB9LFxuICAgICAgICBpZmMuZG9jcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRQeXRob25UeXBlKGlmYWNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEludGVyZmFjZShfaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2QoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gbWV0aG9kO1xuXG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGlmYy5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBJbnRlcmZhY2VNZXRob2QoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSwgbWV0aG9kLnByb3RlY3RlZCksXG4gICAgICAgIG1ldGhvZC5uYW1lLFxuICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgbWV0aG9kLmRvY3MsXG4gICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgeyBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSwgcGFyZW50OiBpZmMgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZVByb3BlcnR5KGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgbGV0IGlmYWNlUHJvcGVydHk6IEludGVyZmFjZVByb3BlcnR5IHwgU3RydWN0RmllbGQ7XG5cbiAgICBpZiAoaWZjLmRhdGF0eXBlKSB7XG4gICAgICBpZmFjZVByb3BlcnR5ID0gbmV3IFN0cnVjdEZpZWxkKHRoaXMsIHByb3AsIGlmYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmYWNlUHJvcGVydHkgPSBuZXcgSW50ZXJmYWNlUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCwgcHJvcC5wcm90ZWN0ZWQpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAgeyBpbW11dGFibGU6IHByb3AuaW1tdXRhYmxlLCBpc1N0YXRpYzogcHJvcC5zdGF0aWMsIHBhcmVudDogaWZjIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShpZmMuZnFuKS5hZGRNZW1iZXIoaWZhY2VQcm9wZXJ0eSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkVudW0oZW5tOiBzcGVjLkVudW1UeXBlKSB7XG4gICAgdGhpcy5hZGRQeXRob25UeXBlKFxuICAgICAgbmV3IEVudW0odGhpcywgdG9QeXRob25JZGVudGlmaWVyKGVubS5uYW1lKSwgZW5tLCBlbm0uZnFuLCB7fSwgZW5tLmRvY3MpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbnVtTWVtYmVyKGVubTogc3BlYy5FbnVtVHlwZSwgbWVtYmVyOiBzcGVjLkVudW1NZW1iZXIpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoZW5tLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IEVudW1NZW1iZXIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uSWRlbnRpZmllcihtZW1iZXIubmFtZSksXG4gICAgICAgIG1lbWJlci5uYW1lLFxuICAgICAgICBtZW1iZXIuZG9jcyxcbiAgICAgICAgZW5tLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kT3ZlcmxvYWQoXG4gICAgX2lmYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIF9vdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmhhbmRsZWQgVHlwZTogSW50ZXJmYWNlTWV0aG9kT3ZlcmxvYWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1ldGhvZE92ZXJsb2FkKFxuICAgIF9jbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIF9vdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmhhbmRsZWQgVHlwZTogTWV0aG9kT3ZlcmxvYWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY01ldGhvZE92ZXJsb2FkKFxuICAgIF9jbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIF9vdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmhhbmRsZWQgVHlwZTogU3RhdGljTWV0aG9kT3ZlcmxvYWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXNzZW1ibHlNb2R1bGVOYW1lKGFzc206IHNwZWMuQXNzZW1ibHkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHthc3NtLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlfS5fanNpaWA7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmVudEZRTihmcW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbSA9IC9eKC4rKVxcLlteLl0rJC8uZXhlYyhmcW4pO1xuXG4gICAgaWYgKG0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHBhcmVudCBGUU4gb2Y6ICR7ZnFufWApO1xuICAgIH1cblxuICAgIHJldHVybiBtWzFdO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJlbnQoZnFuOiBzdHJpbmcpOiBQeXRob25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQeXRob25UeXBlKHRoaXMuZ2V0UGFyZW50RlFOKGZxbikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQeXRob25UeXBlKHR5cGU6IFB5dGhvblR5cGUpIHtcbiAgICBpZiAodHlwZS5mcW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGEgUHl0aG9uIHR5cGUgd2l0aG91dCBhIEZRTi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmdldFBhcmVudCh0eXBlLmZxbikuYWRkTWVtYmVyKHR5cGUpO1xuICAgIHRoaXMudHlwZXMuc2V0KHR5cGUuZnFuLCB0eXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0bGlmdGVkUHJvcChcbiAgICBtZXRob2Q6IHNwZWMuTWV0aG9kIHwgc3BlYy5Jbml0aWFsaXplcixcbiAgKTogc3BlYy5JbnRlcmZhY2VUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgcGFyYW1ldGVycyB0byB0aGlzIG1ldGhvZCwgYW5kIGlmIHRoZSBsYXN0IHBhcmFtZXRlcidzIHR5cGUgaXNcbiAgICAvLyBhIGRhdGF0eXBlIGludGVyZmFjZSwgdGhlbiB3ZSB3YW50IHRvIGxpZnQgdGhlIG1lbWJlcnMgb2YgdGhhdCBsYXN0IHBhcmFtdGVyXG4gICAgLy8gYXMga2V5d29yZCBhcmd1bWVudHMgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICBpZiAobWV0aG9kLnBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwID49IDEpIHtcbiAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXIgPSBtZXRob2QucGFyYW1ldGVycyEuc2xpY2UoLTEpWzBdO1xuICAgICAgaWYgKFxuICAgICAgICAhbGFzdFBhcmFtZXRlci52YXJpYWRpYyAmJlxuICAgICAgICBzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKGxhc3RQYXJhbWV0ZXIudHlwZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBsYXN0UGFyYW1ldGVyVHlwZSA9IHRoaXMuZmluZFR5cGUobGFzdFBhcmFtZXRlci50eXBlLmZxbik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzcGVjLmlzSW50ZXJmYWNlVHlwZShsYXN0UGFyYW1ldGVyVHlwZSkgJiZcbiAgICAgICAgICBsYXN0UGFyYW1ldGVyVHlwZS5kYXRhdHlwZVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gbGFzdFBhcmFtZXRlclR5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBYnN0cmFjdEJhc2VzKGNsczogc3BlYy5DbGFzc1R5cGUpOiBzcGVjLkNsYXNzVHlwZVtdIHtcbiAgICBjb25zdCBhYnN0cmFjdEJhc2VzOiBzcGVjLkNsYXNzVHlwZVtdID0gW107XG5cbiAgICBpZiAoY2xzLmJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmFzZSA9IHRoaXMuZmluZFR5cGUoY2xzLmJhc2UpO1xuXG4gICAgICBpZiAoIXNwZWMuaXNDbGFzc1R5cGUoYmFzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2xhc3MgaW5oZXJpdGVuY2UgdGhhdCBpc24ndCBhIGNsYXNzP1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJhc2UuYWJzdHJhY3QpIHtcbiAgICAgICAgYWJzdHJhY3RCYXNlcy5wdXNoKGJhc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhYnN0cmFjdEJhc2VzO1xuICB9XG59XG5cbi8qKlxuICogUG9zaXRpb25hbCBhcmd1bWVudCBvciBrZXl3b3JkIHBhcmFtZXRlclxuICovXG5pbnRlcmZhY2UgRG9jdW1lbnRhYmxlQXJndW1lbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlZmluaW5nVHlwZTogc3BlYy5UeXBlO1xuICBkb2NzPzogc3BlYy5Eb2NzO1xufVxuXG4vKipcbiAqIFJlbmRlciBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBnaXZlbiBkb2NzLCB1c2VkIGZvciBtZXRob2QgYXJndW1lbnRzIGFuZCBpbmxpbmVkIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gb25lbGluZURlc2NyaXB0aW9uKGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCkge1xuICAvLyBPbmx5IGNvbnNpZGVyIGEgc3Vic2V0IG9mIGZpZWxkcyBoZXJlLCB3ZSBkb24ndCBoYXZlIGEgbG90IG9mIGZvcm1hdHRpbmcgc3BhY2VcbiAgaWYgKCFkb2NzIHx8IE9iamVjdC5rZXlzKGRvY3MpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnLSc7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IFtdO1xuICBpZiAoZG9jcy5zdW1tYXJ5KSB7XG4gICAgcGFydHMucHVzaChtZDJyc3QocmVuZGVyU3VtbWFyeShkb2NzKSkpO1xuICB9XG4gIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICBwYXJ0cy5wdXNoKG1kMnJzdChkb2NzLnJlbWFya3MpKTtcbiAgfVxuICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgcGFydHMucHVzaChgRGVmYXVsdDogJHttZDJyc3QoZG9jcy5kZWZhdWx0KX1gKTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbignICcpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkTWVudGlvblN0YWJpbGl0eShzOiBzcGVjLlN0YWJpbGl0eSkge1xuICAvLyBEb24ndCByZW5kZXIgXCJzdGFibGVcIiBvciBcImV4dGVybmFsXCIsIHRob3NlIGFyZSBib3RoIHN0YWJsZSBieSBpbXBsaWNhdGlvbi5cbiAgcmV0dXJuIHMgPT09IHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQgfHwgcyA9PT0gc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsO1xufVxuXG5mdW5jdGlvbiBpc1N0cnVjdChcbiAgdHlwZVN5c3RlbTogcmVmbGVjdC5UeXBlU3lzdGVtLFxuICByZWY6IHNwZWMuVHlwZVJlZmVyZW5jZSxcbik6IGJvb2xlYW4ge1xuICBpZiAoIXNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UocmVmKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB0eXBlID0gdHlwZVN5c3RlbS50cnlGaW5kRnFuKHJlZi5mcW4pO1xuICByZXR1cm4gISEodHlwZT8uaXNJbnRlcmZhY2VUeXBlKCkgJiYgdHlwZT8uaXNEYXRhVHlwZSgpKTtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGBfYCBhdCB0aGUgZW5kIG9mIGBuYW1lYCB1bnRpbCBpdCBubyBsb25nZXIgY29uZmxpY3RzIHdpdGggYW55IG9mIHRoZVxuICogZW50cmllcyBpbiBgaW5Vc2VgLlxuICpcbiAqIEBwYXJhbSBuYW1lICB0aGUgbmFtZSB0byBiZSBzbHVnaWZpZWQuXG4gKiBAcGFyYW0gaW5Vc2UgdGhlIG5hbWVzIHRoYXQgYXJlIGFscmVhZHkgYmVpbmcgdXNlZC5cbiAqXG4gKiBAcmV0dXJucyB0aGUgc2x1Z2lmaWVkIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHNsdWdpZnlBc05lZWRlZChuYW1lOiBzdHJpbmcsIGluVXNlOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGluVXNlU2V0ID0gbmV3IFNldChpblVzZSk7XG4gIHdoaWxlIChpblVzZVNldC5oYXMobmFtZSkpIHtcbiAgICBuYW1lID0gYCR7bmFtZX1fYDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEJFSE9MRDogSGVscGVycyB0byBvdXRwdXQgY29kZSB0aGF0IGxvb2tzIGxpa2Ugd2hhdCBCbGFjayB3b3VsZCBmb3JtYXQgaW50by4uLlxuLy9cbi8vIEBzZWUgaHR0cHM6Ly9ibGFjay5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvdGhlX2JsYWNrX2NvZGVfc3R5bGUuaHRtbFxuXG5jb25zdCBUQVJHRVRfTElORV9MRU5HVEggPSA4ODtcblxuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnY2xhc3MnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiB2b2lkO1xuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnZGVmJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZ0NvbW1hOiBib29sZWFuLFxuICByZXR1cm5UeXBlOiBzdHJpbmcsXG4pOiB2b2lkO1xuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnY2xhc3MnIHwgJ2RlZicsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmdDb21tYSA9IGZhbHNlLFxuICByZXR1cm5UeXBlPzogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke2tleXdvcmR9ICR7bmFtZX1gO1xuICBjb25zdCBzdWZmaXggPSByZXR1cm5UeXBlID8gYCAtPiAke3JldHVyblR5cGV9YCA6ICcnO1xuICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUub3BlbkJsb2NrKGAke3ByZWZpeH0ke3JldHVyblR5cGUgPyAnKCknIDogJyd9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YocGFyYW1zLCBqb2luKTtcblxuICBjb25zdCBoYXNDb21tZW50cyA9ICFwYXJhbXMuc29tZSgocGFyYW0pID0+IC8jIC4rJC8uZXhlYyhwYXJhbSkpO1xuXG4gIGlmIChcbiAgICBoYXNDb21tZW50cyAmJlxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICBzdWZmaXgubGVuZ3RoICtcbiAgICAgICAgMlxuICApIHtcbiAgICBjb2RlLm9wZW5CbG9jayhgJHtwcmVmaXh9KCR7cGFyYW1zLmpvaW4oam9pbil9KSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvZGUuaW5kZW50KGAke3ByZWZpeH0oYCk7XG4gIGlmIChcbiAgICAhaGFzQ29tbWVudHMgJiZcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICAodHJhaWxpbmdDb21tYSA/IDEgOiAwKVxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cGFyYW1zLmpvaW4oam9pbil9JHt0cmFpbGluZ0NvbW1hID8gJywnIDogJyd9YCk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgIGNvZGUubGluZShwYXJhbS5yZXBsYWNlKC8oXFxzKiMgLispPyQvLCAnLCQxJykpO1xuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KGZhbHNlKTtcbiAgY29kZS5vcGVuQmxvY2soYCkke3N1ZmZpeH1gKTtcbn1cblxuZnVuY3Rpb24gYXNzaWduQ2FsbFJlc3VsdChcbiAgY29kZTogQ29kZU1ha2VyLFxuICB2YXJpYWJsZTogc3RyaW5nLFxuICBmdW5jdDogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke3ZhcmlhYmxlfSA9ICR7ZnVuY3R9KGA7XG4gIGNvbnN0IHN1ZmZpeCA9ICcpJztcblxuICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YocGFyYW1zLCBqb2luKTtcblxuICBpZiAoXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgam9pblNpemUgK1xuICAgICAgc3VmZml4Lmxlbmd0aFxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7cGFyYW1zLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29kZS5pbmRlbnQocHJlZml4KTtcbiAgaWYgKFRBUkdFVF9MSU5FX0xFTkdUSCA+IGNvZGUuY3VycmVudEluZGVudExlbmd0aCArIGVsZW1lbnRzU2l6ZSArIGpvaW5TaXplKSB7XG4gICAgY29kZS5saW5lKHBhcmFtcy5qb2luKGpvaW4pKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29kZS5saW5lKGAke3BhcmFtfSxgKTtcbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChzdWZmaXgpO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25EaWN0aW9uYXJ5KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHZhcmlhYmxlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmc/OiBzdHJpbmcsXG4gIGNvbXBhY3QgPSBmYWxzZSxcbik6IHZvaWQge1xuICBjb25zdCBzcGFjZSA9IGNvbXBhY3QgPyAnJyA6ICcgJztcblxuICBjb25zdCBwcmVmaXggPSBgJHt2YXJpYWJsZX0ke3NwYWNlfT0ke3NwYWNlfXtgO1xuICBjb25zdCBzdWZmaXggPSBgfSR7dHJhaWxpbmcgPz8gJyd9YDtcblxuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY29tcGFjdCkge1xuICAgIGNvbnN0IGpvaW4gPSAnLCAnO1xuICAgIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YoZWxlbWVudHMsIGpvaW4pO1xuICAgIGlmIChcbiAgICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICBzdWZmaXgubGVuZ3RoXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7ZWxlbWVudHMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb2RlLmluZGVudChwcmVmaXgpO1xuICBmb3IgKGNvbnN0IGVsdCBvZiBlbGVtZW50cykge1xuICAgIGNvZGUubGluZShgJHtlbHR9LGApO1xuICB9XG4gIGNvZGUudW5pbmRlbnQoc3VmZml4KTtcbn1cblxuZnVuY3Rpb24gZW1pdExpc3QoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGVsZW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgc3VmZml4OiBzdHJpbmcsXG4gIG9wdHM/OiB7IGlmTXVsdGk6IFtzdHJpbmcsIHN0cmluZ10gfSxcbikge1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihlbGVtZW50cywgam9pbik7XG4gIGlmIChcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICBqb2luU2l6ZSArXG4gICAgICBzdWZmaXgubGVuZ3RoXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtlbGVtZW50cy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IFtiZWZvcmUsIGFmdGVyXSA9IG9wdHM/LmlmTXVsdGkgPz8gWycnLCAnJ107XG5cbiAgY29kZS5pbmRlbnQoYCR7cHJlZml4fSR7YmVmb3JlfWApO1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgY29kZS5saW5lKGVsZW1lbnRzWzBdKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXG4gICAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICsgZWxlbWVudHNTaXplICsgam9pblNpemVcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShlbGVtZW50cy5qb2luKGpvaW4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBlbHQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgY29kZS5saW5lKGAke2VsdH0sYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoYCR7YWZ0ZXJ9JHtzdWZmaXh9YCk7XG59XG5cbmZ1bmN0aW9uIHRvdGFsU2l6ZU9mKHN0cmluZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBqb2luOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50c1NpemU6IHN0cmluZ3NcbiAgICAgIC5tYXAoKHN0cikgPT4gc3RyLmxlbmd0aClcbiAgICAgIC5yZWR1Y2UoKGFjYywgZWx0KSA9PiBhY2MgKyBlbHQsIDApLFxuICAgIGpvaW5TaXplOiBzdHJpbmdzLmxlbmd0aCA+IDEgPyBqb2luLmxlbmd0aCAqIChzdHJpbmdzLmxlbmd0aCAtIDEpIDogMCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbmVzdGVkQ29udGV4dChcbiAgY29udGV4dDogRW1pdENvbnRleHQsXG4gIGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogRW1pdENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIC4uLmNvbnRleHQsXG4gICAgc3Vycm91bmRpbmdUeXBlRnFuczpcbiAgICAgIGZxbiAhPSBudWxsXG4gICAgICAgID8gWy4uLihjb250ZXh0LnN1cnJvdW5kaW5nVHlwZUZxbnMgPz8gW10pLCBmcW5dXG4gICAgICAgIDogY29udGV4dC5zdXJyb3VuZGluZ1R5cGVGcW5zLFxuICB9O1xufVxuXG5jb25zdCBpc0RlcHJlY2F0ZWQgPSAoeDogUHl0aG9uQmFzZSkgPT4geC5kb2NzPy5kZXByZWNhdGVkICE9PSB1bmRlZmluZWQ7XG4iXX0=
|