jsii-pacmak 1.40.0 → 1.44.0
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/java.js
CHANGED
|
@@ -380,7 +380,7 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
380
380
|
onBeginClass(cls, abstract) {
|
|
381
381
|
var _a, _b;
|
|
382
382
|
this.openFileIfNeeded(cls);
|
|
383
|
-
this.addJavaDocs(cls);
|
|
383
|
+
this.addJavaDocs(cls, { api: 'type', fqn: cls.fqn });
|
|
384
384
|
const classBase = this.getClassBase(cls);
|
|
385
385
|
const extendsExpression = classBase ? ` extends ${classBase}` : '';
|
|
386
386
|
let implementsExpr = '';
|
|
@@ -415,7 +415,7 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
415
415
|
onInitializer(cls, method) {
|
|
416
416
|
this.code.line();
|
|
417
417
|
// If needed, patching up the documentation to point users at the builder pattern
|
|
418
|
-
this.addJavaDocs(method);
|
|
418
|
+
this.addJavaDocs(method, { api: 'initializer', fqn: cls.fqn });
|
|
419
419
|
this.emitStabilityAnnotations(method);
|
|
420
420
|
// Abstract classes should have protected initializers
|
|
421
421
|
const initializerAccessLevel = cls.abstract
|
|
@@ -433,21 +433,21 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
433
433
|
/* noop */
|
|
434
434
|
}
|
|
435
435
|
onProperty(cls, prop) {
|
|
436
|
-
this.emitProperty(cls, prop);
|
|
436
|
+
this.emitProperty(cls, prop, cls);
|
|
437
437
|
}
|
|
438
438
|
onStaticProperty(cls, prop) {
|
|
439
439
|
if (prop.const) {
|
|
440
|
-
this.emitConstProperty(prop);
|
|
440
|
+
this.emitConstProperty(cls, prop);
|
|
441
441
|
}
|
|
442
442
|
else {
|
|
443
|
-
this.emitProperty(cls, prop);
|
|
443
|
+
this.emitProperty(cls, prop, cls);
|
|
444
444
|
}
|
|
445
445
|
}
|
|
446
446
|
/**
|
|
447
447
|
* Since we expand the union setters, we will use this event to only emit the getter which returns an Object.
|
|
448
448
|
*/
|
|
449
449
|
onUnionProperty(cls, prop, _union) {
|
|
450
|
-
this.emitProperty(cls, prop);
|
|
450
|
+
this.emitProperty(cls, prop, cls);
|
|
451
451
|
}
|
|
452
452
|
onMethod(cls, method) {
|
|
453
453
|
this.emitMethod(cls, method);
|
|
@@ -463,7 +463,7 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
463
463
|
}
|
|
464
464
|
onBeginEnum(enm) {
|
|
465
465
|
this.openFileIfNeeded(enm);
|
|
466
|
-
this.addJavaDocs(enm);
|
|
466
|
+
this.addJavaDocs(enm, { api: 'type', fqn: enm.fqn });
|
|
467
467
|
if (!this.isNested(enm)) {
|
|
468
468
|
this.emitGeneratedAnnotation();
|
|
469
469
|
}
|
|
@@ -475,8 +475,12 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
475
475
|
this.code.closeBlock();
|
|
476
476
|
this.closeFileIfNeeded(enm);
|
|
477
477
|
}
|
|
478
|
-
onEnumMember(
|
|
479
|
-
this.addJavaDocs(member
|
|
478
|
+
onEnumMember(parentType, member) {
|
|
479
|
+
this.addJavaDocs(member, {
|
|
480
|
+
api: 'member',
|
|
481
|
+
fqn: parentType.fqn,
|
|
482
|
+
memberName: member.name,
|
|
483
|
+
});
|
|
480
484
|
this.emitStabilityAnnotations(member);
|
|
481
485
|
this.code.line(`${member.name},`);
|
|
482
486
|
}
|
|
@@ -498,7 +502,7 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
498
502
|
onBeginInterface(ifc) {
|
|
499
503
|
var _a;
|
|
500
504
|
this.openFileIfNeeded(ifc);
|
|
501
|
-
this.addJavaDocs(ifc);
|
|
505
|
+
this.addJavaDocs(ifc, { api: 'type', fqn: ifc.fqn });
|
|
502
506
|
// all interfaces always extend JsiiInterface so we can identify that it is a jsii interface.
|
|
503
507
|
const interfaces = (_a = ifc.interfaces) !== null && _a !== void 0 ? _a : [];
|
|
504
508
|
const bases = [
|
|
@@ -532,24 +536,32 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
532
536
|
this.code.closeBlock();
|
|
533
537
|
this.closeFileIfNeeded(ifc);
|
|
534
538
|
}
|
|
535
|
-
onInterfaceMethod(
|
|
539
|
+
onInterfaceMethod(ifc, method) {
|
|
536
540
|
this.code.line();
|
|
537
541
|
const returnType = method.returns
|
|
538
542
|
? this.toDecoratedJavaType(method.returns)
|
|
539
543
|
: 'void';
|
|
540
|
-
this.addJavaDocs(method
|
|
544
|
+
this.addJavaDocs(method, {
|
|
545
|
+
api: 'member',
|
|
546
|
+
fqn: ifc.fqn,
|
|
547
|
+
memberName: method.name,
|
|
548
|
+
});
|
|
541
549
|
this.emitStabilityAnnotations(method);
|
|
542
550
|
this.code.line(`${returnType} ${method.name}(${this.renderMethodParameters(method)});`);
|
|
543
551
|
}
|
|
544
552
|
onInterfaceMethodOverload(ifc, overload, _originalMethod) {
|
|
545
553
|
this.onInterfaceMethod(ifc, overload);
|
|
546
554
|
}
|
|
547
|
-
onInterfaceProperty(
|
|
555
|
+
onInterfaceProperty(ifc, prop) {
|
|
548
556
|
const getterType = this.toDecoratedJavaType(prop);
|
|
549
557
|
const propName = naming_util_1.jsiiToPascalCase(JavaGenerator.safeJavaPropertyName(prop.name));
|
|
550
558
|
// for unions we only generate overloads for setters, not getters.
|
|
551
559
|
this.code.line();
|
|
552
|
-
this.addJavaDocs(prop
|
|
560
|
+
this.addJavaDocs(prop, {
|
|
561
|
+
api: 'member',
|
|
562
|
+
fqn: ifc.fqn,
|
|
563
|
+
memberName: prop.name,
|
|
564
|
+
});
|
|
553
565
|
this.emitStabilityAnnotations(prop);
|
|
554
566
|
if (prop.optional) {
|
|
555
567
|
if (prop.overrides) {
|
|
@@ -566,7 +578,11 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
566
578
|
const setterTypes = this.toDecoratedJavaTypes(prop);
|
|
567
579
|
for (const type of setterTypes) {
|
|
568
580
|
this.code.line();
|
|
569
|
-
this.addJavaDocs(prop
|
|
581
|
+
this.addJavaDocs(prop, {
|
|
582
|
+
api: 'member',
|
|
583
|
+
fqn: ifc.fqn,
|
|
584
|
+
memberName: prop.name,
|
|
585
|
+
});
|
|
570
586
|
if (prop.optional) {
|
|
571
587
|
if (prop.overrides) {
|
|
572
588
|
this.code.line('@Override');
|
|
@@ -644,7 +660,10 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
644
660
|
this.code.openFile(packageInfoFile);
|
|
645
661
|
this.code.line('/**');
|
|
646
662
|
if (mod.readme) {
|
|
647
|
-
for (const line of jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(mod.readme.markdown
|
|
663
|
+
for (const line of jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(mod.readme.markdown, {
|
|
664
|
+
api: 'moduleReadme',
|
|
665
|
+
moduleFqn: mod.name,
|
|
666
|
+
})).split('\n')) {
|
|
648
667
|
this.code.line(` * ${line.replace(/\*\//g, '*{@literal /}')}`);
|
|
649
668
|
}
|
|
650
669
|
}
|
|
@@ -669,7 +688,10 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
669
688
|
this.code.openFile(packageInfoFile);
|
|
670
689
|
this.code.line('/**');
|
|
671
690
|
if (mod.readme) {
|
|
672
|
-
for (const line of jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(mod.readme.markdown
|
|
691
|
+
for (const line of jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(mod.readme.markdown, {
|
|
692
|
+
api: 'moduleReadme',
|
|
693
|
+
moduleFqn,
|
|
694
|
+
})).split('\n')) {
|
|
673
695
|
this.code.line(` * ${line.replace(/\*\//g, '*{@literal /}')}`);
|
|
674
696
|
}
|
|
675
697
|
}
|
|
@@ -915,16 +937,20 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
915
937
|
renderConstName(prop) {
|
|
916
938
|
return this.code.toSnakeCase(prop.name).toLocaleUpperCase(); // java consts are SNAKE_UPPER_CASE
|
|
917
939
|
}
|
|
918
|
-
emitConstProperty(prop) {
|
|
940
|
+
emitConstProperty(parentType, prop) {
|
|
919
941
|
const propType = this.toJavaType(prop.type);
|
|
920
942
|
const propName = this.renderConstName(prop);
|
|
921
943
|
const access = this.renderAccessLevel(prop);
|
|
922
944
|
this.code.line();
|
|
923
|
-
this.addJavaDocs(prop
|
|
945
|
+
this.addJavaDocs(prop, {
|
|
946
|
+
api: 'member',
|
|
947
|
+
fqn: parentType.fqn,
|
|
948
|
+
memberName: prop.name,
|
|
949
|
+
});
|
|
924
950
|
this.emitStabilityAnnotations(prop);
|
|
925
951
|
this.code.line(`${access} final static ${propType} ${propName};`);
|
|
926
952
|
}
|
|
927
|
-
emitProperty(cls, prop, { defaultImpl = false, final = false, includeGetter = true, overrides = !!prop.overrides, } = {}) {
|
|
953
|
+
emitProperty(cls, prop, definingType, { defaultImpl = false, final = false, includeGetter = true, overrides = !!prop.overrides, } = {}) {
|
|
928
954
|
const getterType = this.toDecoratedJavaType(prop);
|
|
929
955
|
const setterTypes = this.toDecoratedJavaTypes(prop, {
|
|
930
956
|
covariant: prop.static,
|
|
@@ -941,7 +967,11 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
941
967
|
// for unions we only generate overloads for setters, not getters.
|
|
942
968
|
if (includeGetter) {
|
|
943
969
|
this.code.line();
|
|
944
|
-
this.addJavaDocs(prop
|
|
970
|
+
this.addJavaDocs(prop, {
|
|
971
|
+
api: 'member',
|
|
972
|
+
fqn: definingType.fqn,
|
|
973
|
+
memberName: prop.name,
|
|
974
|
+
});
|
|
945
975
|
if (overrides && !prop.static) {
|
|
946
976
|
this.code.line('@Override');
|
|
947
977
|
}
|
|
@@ -969,7 +999,11 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
969
999
|
if (!prop.immutable) {
|
|
970
1000
|
for (const type of setterTypes) {
|
|
971
1001
|
this.code.line();
|
|
972
|
-
this.addJavaDocs(prop
|
|
1002
|
+
this.addJavaDocs(prop, {
|
|
1003
|
+
api: 'member',
|
|
1004
|
+
fqn: cls.fqn,
|
|
1005
|
+
memberName: prop.name,
|
|
1006
|
+
});
|
|
973
1007
|
if (overrides && !prop.static) {
|
|
974
1008
|
this.code.line('@Override');
|
|
975
1009
|
}
|
|
@@ -1014,7 +1048,11 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1014
1048
|
const methodName = JavaGenerator.safeJavaMethodName(method.name);
|
|
1015
1049
|
const signature = `${returnType} ${methodName}(${this.renderMethodParameters(method)})`;
|
|
1016
1050
|
this.code.line();
|
|
1017
|
-
this.addJavaDocs(method
|
|
1051
|
+
this.addJavaDocs(method, {
|
|
1052
|
+
api: 'member',
|
|
1053
|
+
fqn: cls.fqn,
|
|
1054
|
+
memberName: method.name,
|
|
1055
|
+
});
|
|
1018
1056
|
this.emitStabilityAnnotations(method);
|
|
1019
1057
|
if (overrides && !method.static) {
|
|
1020
1058
|
this.code.line('@Override');
|
|
@@ -1069,7 +1107,10 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1069
1107
|
const prop = clone(reflectProp.spec);
|
|
1070
1108
|
prop.abstract = false;
|
|
1071
1109
|
// Emitting "final" since this is a proxy and nothing will/should override this
|
|
1072
|
-
this.emitProperty(type.spec, prop,
|
|
1110
|
+
this.emitProperty(type.spec, prop, reflectProp.definingType.spec, {
|
|
1111
|
+
final: true,
|
|
1112
|
+
overrides: true,
|
|
1113
|
+
});
|
|
1073
1114
|
}
|
|
1074
1115
|
// emit all the methods
|
|
1075
1116
|
for (const reflectMethod of type.allMethods.filter((method) => method.abstract &&
|
|
@@ -1105,7 +1146,7 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1105
1146
|
!isJavaLangObjectMethodName(`get${naming_util_1.jsiiToPascalCase(prop.name)}`) &&
|
|
1106
1147
|
(prop.parentType.fqn === type.fqn ||
|
|
1107
1148
|
!hasDefaultInterfaces(prop.assembly)))) {
|
|
1108
|
-
this.emitProperty(type.spec, property.spec, {
|
|
1149
|
+
this.emitProperty(type.spec, property.spec, property.definingType.spec, {
|
|
1109
1150
|
defaultImpl: true,
|
|
1110
1151
|
overrides: type.isInterfaceType(),
|
|
1111
1152
|
});
|
|
@@ -1149,13 +1190,14 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1149
1190
|
}
|
|
1150
1191
|
}
|
|
1151
1192
|
}
|
|
1152
|
-
toJavaProp(property, inherited) {
|
|
1193
|
+
toJavaProp(property, definingType, inherited) {
|
|
1153
1194
|
var _a;
|
|
1154
1195
|
const safeName = JavaGenerator.safeJavaPropertyName(property.name);
|
|
1155
1196
|
const propName = naming_util_1.jsiiToPascalCase(safeName);
|
|
1156
1197
|
return {
|
|
1157
1198
|
docs: property.docs,
|
|
1158
1199
|
spec: property,
|
|
1200
|
+
definingType,
|
|
1159
1201
|
propName,
|
|
1160
1202
|
jsiiName: property.name,
|
|
1161
1203
|
nullable: !!property.optional,
|
|
@@ -1226,7 +1268,11 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1226
1268
|
name: 'create',
|
|
1227
1269
|
parameters: params.map((param) => param.param),
|
|
1228
1270
|
};
|
|
1229
|
-
this.addJavaDocs(dummyMethod
|
|
1271
|
+
this.addJavaDocs(dummyMethod, {
|
|
1272
|
+
api: 'member',
|
|
1273
|
+
fqn: cls.fqn,
|
|
1274
|
+
memberName: dummyMethod.name,
|
|
1275
|
+
});
|
|
1230
1276
|
this.emitStabilityAnnotations(cls.initializer);
|
|
1231
1277
|
this.code.openBlock(`public static ${BUILDER_CLASS_NAME} create(${params
|
|
1232
1278
|
.map((param) => `final ${param.javaType}${param.param.variadic ? '...' : ''} ${param.fieldName}`)
|
|
@@ -1276,7 +1322,11 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1276
1322
|
for (const javaType of this.toJavaTypes(prop.type.spec, {
|
|
1277
1323
|
covariant: true,
|
|
1278
1324
|
})) {
|
|
1279
|
-
this.addJavaDocs(setter
|
|
1325
|
+
this.addJavaDocs(setter, {
|
|
1326
|
+
api: 'member',
|
|
1327
|
+
fqn: prop.definingType.fqn,
|
|
1328
|
+
memberName: prop.name,
|
|
1329
|
+
});
|
|
1280
1330
|
this.emitStabilityAnnotations(prop.spec);
|
|
1281
1331
|
this.code.openBlock(`public ${BUILDER_CLASS_NAME} ${fieldName}(final ${javaType} ${fieldName})`);
|
|
1282
1332
|
this.code.line(`this.${structParamName}${firstStruct.optional ? '()' : ''}.${fieldName}(${fieldName});`);
|
|
@@ -1316,17 +1366,21 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1316
1366
|
}
|
|
1317
1367
|
this.code.closeBlock();
|
|
1318
1368
|
}
|
|
1319
|
-
emitBuilderSetter(prop, builderName,
|
|
1369
|
+
emitBuilderSetter(prop, builderName, parentType) {
|
|
1320
1370
|
var _a, _b, _c, _d;
|
|
1321
1371
|
for (const type of prop.javaTypes) {
|
|
1322
1372
|
this.code.line();
|
|
1323
1373
|
this.code.line('/**');
|
|
1324
|
-
this.code.line(` * Sets the value of {@link ${
|
|
1374
|
+
this.code.line(` * Sets the value of {@link ${parentType.name}#${getterFor(prop.fieldName)}}`);
|
|
1325
1375
|
const summary = (_b = (_a = prop.docs) === null || _a === void 0 ? void 0 : _a.summary) !== null && _b !== void 0 ? _b : 'the value to be set';
|
|
1326
1376
|
this.code.line(` * ${paramJavadoc(prop.fieldName, prop.nullable, summary)}`);
|
|
1327
1377
|
if (((_c = prop.docs) === null || _c === void 0 ? void 0 : _c.remarks) != null) {
|
|
1328
1378
|
const indent = ' '.repeat(7 + prop.fieldName.length);
|
|
1329
|
-
const remarks = jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(prop.docs.remarks
|
|
1379
|
+
const remarks = jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(prop.docs.remarks, {
|
|
1380
|
+
api: 'member',
|
|
1381
|
+
fqn: prop.definingType.fqn,
|
|
1382
|
+
memberName: prop.jsiiName,
|
|
1383
|
+
})).trimRight();
|
|
1330
1384
|
for (const line of remarks.split('\n')) {
|
|
1331
1385
|
this.code.line(` * ${indent} ${line}`);
|
|
1332
1386
|
}
|
|
@@ -1374,8 +1428,8 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1374
1428
|
this.code.line(' */');
|
|
1375
1429
|
this.emitStabilityAnnotations(classSpec);
|
|
1376
1430
|
this.code.openBlock(`public static final class ${BUILDER_CLASS_NAME} implements software.amazon.jsii.Builder<${classSpec.name}>`);
|
|
1377
|
-
props.forEach((prop) => this.code.line(
|
|
1378
|
-
props.forEach((prop) => this.emitBuilderSetter(prop, BUILDER_CLASS_NAME, classSpec
|
|
1431
|
+
props.forEach((prop) => this.code.line(`${prop.fieldJavaType} ${prop.fieldName};`));
|
|
1432
|
+
props.forEach((prop) => this.emitBuilderSetter(prop, BUILDER_CLASS_NAME, classSpec));
|
|
1379
1433
|
// Start build()
|
|
1380
1434
|
this.code.line();
|
|
1381
1435
|
this.code.line('/**');
|
|
@@ -1386,8 +1440,7 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1386
1440
|
this.emitStabilityAnnotations(classSpec);
|
|
1387
1441
|
this.code.line('@Override');
|
|
1388
1442
|
this.code.openBlock(`public ${classSpec.name} build()`);
|
|
1389
|
-
|
|
1390
|
-
this.code.line(`return new ${constructorName}(${propFields});`);
|
|
1443
|
+
this.code.line(`return new ${constructorName}(this);`);
|
|
1391
1444
|
this.code.closeBlock();
|
|
1392
1445
|
// End build()
|
|
1393
1446
|
this.code.closeBlock();
|
|
@@ -1401,7 +1454,7 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1401
1454
|
function collectProps(currentIfc, isBaseClass = false) {
|
|
1402
1455
|
var _a, _b;
|
|
1403
1456
|
for (const property of (_a = currentIfc.properties) !== null && _a !== void 0 ? _a : []) {
|
|
1404
|
-
const javaProp = this.toJavaProp(property, isBaseClass);
|
|
1457
|
+
const javaProp = this.toJavaProp(property, currentIfc, isBaseClass);
|
|
1405
1458
|
propsByName[javaProp.propName] = javaProp;
|
|
1406
1459
|
}
|
|
1407
1460
|
// add props of base struct
|
|
@@ -1433,7 +1486,7 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1433
1486
|
props.forEach((prop) => this.code.line(`this.${prop.fieldName} = software.amazon.jsii.Kernel.get(this, "${prop.jsiiName}", ${prop.fieldNativeType});`));
|
|
1434
1487
|
this.code.closeBlock();
|
|
1435
1488
|
// End JSII reference constructor
|
|
1436
|
-
// Start
|
|
1489
|
+
// Start builder constructor
|
|
1437
1490
|
this.code.line();
|
|
1438
1491
|
this.code.line('/**');
|
|
1439
1492
|
this.code.line(' * Constructor that initializes the object based on literal property values passed by the {@link Builder}.');
|
|
@@ -1441,16 +1494,13 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1441
1494
|
if (props.some((prop) => prop.fieldJavaType !== prop.paramJavaType)) {
|
|
1442
1495
|
this.code.line('@SuppressWarnings("unchecked")');
|
|
1443
1496
|
}
|
|
1444
|
-
|
|
1445
|
-
.map((prop) => `final ${prop.paramJavaType} ${prop.fieldName}`)
|
|
1446
|
-
.join(', ');
|
|
1447
|
-
this.code.openBlock(`protected ${INTERFACE_PROXY_CLASS_NAME}(${constructorArgs})`);
|
|
1497
|
+
this.code.openBlock(`protected ${INTERFACE_PROXY_CLASS_NAME}(final ${BUILDER_CLASS_NAME} builder)`);
|
|
1448
1498
|
this.code.line('super(software.amazon.jsii.JsiiObject.InitializationMode.JSII);');
|
|
1449
1499
|
props.forEach((prop) => {
|
|
1450
1500
|
const explicitCast = prop.fieldJavaType !== prop.paramJavaType
|
|
1451
1501
|
? `(${prop.fieldJavaType})`
|
|
1452
1502
|
: '';
|
|
1453
|
-
this.code.line(`this.${prop.fieldName} = ${explicitCast}${_validateIfNonOptional(prop.fieldName
|
|
1503
|
+
this.code.line(`this.${prop.fieldName} = ${explicitCast}${_validateIfNonOptional(`builder.${prop.fieldName}`, prop)};`);
|
|
1454
1504
|
});
|
|
1455
1505
|
this.code.closeBlock();
|
|
1456
1506
|
// End literal constructor
|
|
@@ -1599,7 +1649,7 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1599
1649
|
return { filePath, name };
|
|
1600
1650
|
}
|
|
1601
1651
|
// eslint-disable-next-line complexity
|
|
1602
|
-
addJavaDocs(doc, defaultText) {
|
|
1652
|
+
addJavaDocs(doc, apiLoc, defaultText) {
|
|
1603
1653
|
var _a, _b, _c, _d;
|
|
1604
1654
|
if (!defaultText &&
|
|
1605
1655
|
Object.keys((_a = doc.docs) !== null && _a !== void 0 ? _a : {}).length === 0 &&
|
|
@@ -1615,14 +1665,26 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
1615
1665
|
paras.push(defaultText);
|
|
1616
1666
|
}
|
|
1617
1667
|
if (docs.remarks) {
|
|
1618
|
-
paras.push(jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(docs.remarks)).trimRight());
|
|
1668
|
+
paras.push(jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(docs.remarks, apiLoc)).trimRight());
|
|
1619
1669
|
}
|
|
1620
1670
|
if (docs.default) {
|
|
1621
1671
|
paras.push(`Default: ${docs.default}`); // NOTE: there is no annotation in JavaDoc for this
|
|
1622
1672
|
}
|
|
1623
1673
|
if (docs.example) {
|
|
1624
1674
|
paras.push('Example:');
|
|
1625
|
-
|
|
1675
|
+
const convertedExample = this.convertExample(docs.example, apiLoc);
|
|
1676
|
+
// We used to use the slightly nicer `<pre>{@code ...}</pre>`, which doesn't
|
|
1677
|
+
// require (and therefore also doesn't allow) escaping special characters.
|
|
1678
|
+
//
|
|
1679
|
+
// However, code samples may contain block quotes of their own ('*/') that
|
|
1680
|
+
// would terminate the block comment from the PoV of the Java tokenizer, and
|
|
1681
|
+
// since `{@code ... }` doesn't allow any escaping, there's also no way to encode
|
|
1682
|
+
// '*/' in a way that would (a) hide it from the tokenizer and (b) give '*/' back
|
|
1683
|
+
// after processing JavaDocs.
|
|
1684
|
+
//
|
|
1685
|
+
// Hence, we just resort to HTML-encoding everything (same as we do for code
|
|
1686
|
+
// examples that have been translated from MarkDown).
|
|
1687
|
+
paras.push(jsii_rosetta_1.markDownToJavaDoc(['```', convertedExample, '```'].join('\n')));
|
|
1626
1688
|
}
|
|
1627
1689
|
const tagLines = [];
|
|
1628
1690
|
if (docs.returns) {
|
|
@@ -2039,24 +2101,17 @@ class JavaGenerator extends generator_1.Generator {
|
|
|
2039
2101
|
: 'jsii-pacmak';
|
|
2040
2102
|
this.code.line(`@javax.annotation.Generated(value = "${generator}"${date})`);
|
|
2041
2103
|
}
|
|
2042
|
-
convertExample(example) {
|
|
2043
|
-
const
|
|
2044
|
-
const translated = this.rosetta.translateSnippet(snippet, jsii_rosetta_1.TargetLanguage.JAVA);
|
|
2045
|
-
if (!translated) {
|
|
2046
|
-
return example;
|
|
2047
|
-
}
|
|
2104
|
+
convertExample(example, api) {
|
|
2105
|
+
const translated = this.rosetta.translateExample(api, example, jsii_rosetta_1.TargetLanguage.JAVA, jsii_rosetta_1.enforcesStrictMode(this.assembly));
|
|
2048
2106
|
return this.prefixDisclaimer(translated);
|
|
2049
2107
|
}
|
|
2050
|
-
convertSamplesInMarkdown(markdown) {
|
|
2051
|
-
return this.rosetta.translateSnippetsInMarkdown(markdown, jsii_rosetta_1.TargetLanguage.JAVA, jsii_rosetta_1.enforcesStrictMode(this.assembly), (trans) => ({
|
|
2108
|
+
convertSamplesInMarkdown(markdown, api) {
|
|
2109
|
+
return this.rosetta.translateSnippetsInMarkdown(api, markdown, jsii_rosetta_1.TargetLanguage.JAVA, jsii_rosetta_1.enforcesStrictMode(this.assembly), (trans) => ({
|
|
2052
2110
|
language: trans.language,
|
|
2053
2111
|
source: this.prefixDisclaimer(trans),
|
|
2054
2112
|
}));
|
|
2055
2113
|
}
|
|
2056
2114
|
prefixDisclaimer(translated) {
|
|
2057
|
-
if (translated.didCompile && _1.INCOMPLETE_DISCLAIMER_COMPILING) {
|
|
2058
|
-
return `// ${_1.INCOMPLETE_DISCLAIMER_COMPILING}\n${translated.source}`;
|
|
2059
|
-
}
|
|
2060
2115
|
if (!translated.didCompile && _1.INCOMPLETE_DISCLAIMER_NONCOMPILING) {
|
|
2061
2116
|
return `// ${_1.INCOMPLETE_DISCLAIMER_NONCOMPILING}\n${translated.source}`;
|
|
2062
2117
|
}
|
|
@@ -2330,4 +2385,4 @@ function splitNamespace(ns) {
|
|
|
2330
2385
|
}
|
|
2331
2386
|
return [ns.substr(0, dot), ns.substr(dot + 1)];
|
|
2332
2387
|
}
|
|
2333
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImphdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLCtCQUErQjtBQUMvQix5REFBdUQ7QUFDdkQsK0JBQStCO0FBRS9CLCtDQU9zQjtBQUN0Qiw2QkFBNkI7QUFDN0IseUNBQXlDO0FBR3pDLDRDQUF5QztBQUN6QyxzQ0FBc0M7QUFDdEMsZ0RBQWtEO0FBRWxELHNDQUttQjtBQUNuQixrQ0FBNkQ7QUFDN0Qsd0NBQW1EO0FBQ25ELHFDQUE2RDtBQUM3RCxtREFBd0U7QUFFeEUsd0JBSVc7QUFFWCxvR0FBb0c7QUFDcEcsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFckQsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUM7QUFFckMsTUFBTSxZQUFZLEdBQUcsb0NBQW9DLENBQUM7QUFDMUQsTUFBTSxZQUFZLEdBQUcscUNBQXFDLENBQUM7QUFDM0QsTUFBTSxZQUFZLEdBQUcsZ0NBQWdDLENBQUM7QUFFdEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLFdBQVc7SUFHdEIsWUFDbUIsT0FBOEIsRUFDOUIsT0FBcUI7UUFEckIsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7UUFDOUIsWUFBTyxHQUFQLE9BQU8sQ0FBYztRQUp2QixlQUFVLEdBQUcsTUFBTSxDQUFDO0lBS2xDLENBQUM7SUFFRyxLQUFLLENBQUMsWUFBWTtRQUN2QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1I7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ3pCLHVEQUF1RDtZQUN2RCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQ3JCLE1BQU0s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QVMsY0FBYyxDQUFDLEVBQVU7SUFDaEMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNkLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDakI7SUFDRCxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcbmltcG9ydCAqIGFzIGNsb25lIGZyb20gJ2Nsb25lJztcbmltcG9ydCB7IHRvU25ha2VDYXNlIH0gZnJvbSAnY29kZW1ha2VyL2xpYi9jYXNlLXV0aWxzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCB7XG4gIFJvc2V0dGEsXG4gIFRhcmdldExhbmd1YWdlLFxuICB0eXBlU2NyaXB0U25pcHBldEZyb21Tb3VyY2UsXG4gIFRyYW5zbGF0aW9uLFxuICBlbmZvcmNlc1N0cmljdE1vZGUsXG4gIG1hcmtEb3duVG9KYXZhRG9jLFxufSBmcm9tICdqc2lpLXJvc2V0dGEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHhtbGJ1aWxkZXIgZnJvbSAneG1sYnVpbGRlcic7XG5cbmltcG9ydCB7IFRhcmdldEJ1aWxkZXIsIEJ1aWxkT3B0aW9ucyB9IGZyb20gJy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgR2VuZXJhdG9yIH0gZnJvbSAnLi4vZ2VuZXJhdG9yJztcbmltcG9ydCAqIGFzIGxvZ2dpbmcgZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQgeyBqc2lpVG9QYXNjYWxDYXNlIH0gZnJvbSAnLi4vbmFtaW5nLXV0aWwnO1xuaW1wb3J0IHsgSnNpaU1vZHVsZSB9IGZyb20gJy4uL3BhY2thZ2luZyc7XG5pbXBvcnQge1xuICBQYWNrYWdlSW5mbyxcbiAgVGFyZ2V0LFxuICBmaW5kTG9jYWxCdWlsZERpcnMsXG4gIFRhcmdldE9wdGlvbnMsXG59IGZyb20gJy4uL3RhcmdldCc7XG5pbXBvcnQgeyBzaGVsbCwgU2NyYXRjaCwgc2x1Z2lmeSwgc2V0RXh0ZW5kIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBWRVJTSU9OLCBWRVJTSU9OX0RFU0MgfSBmcm9tICcuLi92ZXJzaW9uJztcbmltcG9ydCB7IHN0YWJpbGl0eVByZWZpeEZvciwgcmVuZGVyU3VtbWFyeSB9IGZyb20gJy4vX3V0aWxzJztcbmltcG9ydCB7IHRvTWF2ZW5WZXJzaW9uUmFuZ2UsIHRvUmVsZWFzZVZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24tdXRpbHMnO1xuXG5pbXBvcnQge1xuICBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfQ09NUElMSU5HLFxuICBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HLFxuICBUYXJnZXROYW1lLFxufSBmcm9tICcuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgQlVJTERFUl9DTEFTU19OQU1FID0gJ0J1aWxkZXInO1xuXG5jb25zdCBBTk5fTk9UX05VTEwgPSAnQG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbCc7XG5jb25zdCBBTk5fTlVMTEFCTEUgPSAnQG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGUnO1xuY29uc3QgQU5OX0lOVEVSTkFMID0gJ0Bzb2Z0d2FyZS5hbWF6b24uanNpaS5JbnRlcm5hbCc7XG5cbi8qKlxuICogQnVpbGQgSmF2YSBwYWNrYWdlcyBhbGwgdG9nZXRoZXIsIGJ5IGdlbmVyYXRpbmcgYW4gYWdncmVnYXRlIFBPTVxuICpcbiAqIFRoaXMgd2lsbCBtYWtlIHRoZSBKYXZhIGJ1aWxkIGEgbG90IG1vcmUgZWZmaWNpZW50ICh+MzAwJSkuXG4gKlxuICogRG8gdGhpcyBieSBjb3B5aW5nIHRoZSBjb2RlIGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBnZW5lcmF0aW5nIGFuIGFnZ3JlZ2F0ZVxuICogUE9NIHRoZXJlLCBhbmQgdGhlbiBjb3B5aW5nIHRoZSBhcnRpZmFjdHMgYmFjayBpbnRvIHRoZSByZXNwZWN0aXZlIG91dHB1dFxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBKYXZhQnVpbGRlciBpbXBsZW1lbnRzIFRhcmdldEJ1aWxkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldE5hbWUgPSAnamF2YSc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlczogcmVhZG9ubHkgSnNpaU1vZHVsZVtdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQnVpbGRPcHRpb25zLFxuICApIHt9XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkTW9kdWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb2R1bGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29kZU9ubHkpIHtcbiAgICAgIC8vIFNpbXBsZSwganVzdCBnZW5lcmF0ZSBjb2RlIHRvIHJlc3BlY3RpdmUgb3V0cHV0IGRpcnNcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0aGlzLm1vZHVsZXMubWFwKChtb2R1bGUpID0+XG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vZHVsZUNvZGUoXG4gICAgICAgICAgICBtb2R1bGUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICB0aGlzLm91dHB1dERpcihtb2R1bGUub3V0cHV0RGlyZWN0b3J5KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgbWFrZSBhIHNpbmdsZSB0ZW1wZGlyIHRvIGhvbGQgYWxsIHNvdXJjZXMsIGJ1aWxkIHRoZW0gdG9nZXRoZXIgYW5kIGNvcHkgdGhlbSBiYWNrIG91dFxuICAgIGNvbnN0IHNjcmF0Y2hEaXJzOiBBcnJheTxTY3JhdGNoPGFueT4+ID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbXBTb3VyY2VEaXIgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQWdncmVnYXRlU291cmNlRGlyKFxuICAgICAgICB0aGlzLm1vZHVsZXMsXG4gICAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgICk7XG4gICAgICBzY3JhdGNoRGlycy5wdXNoKHRlbXBTb3VyY2VEaXIpO1xuXG4gICAgICAvLyBOZWVkIGFueSBvbGQgbW9kdWxlIG9iamVjdCB0byBtYWtlIGEgdGFyZ2V0IHRvIGJlIGFibGUgdG8gaW52b2tlIGJ1aWxkLCB0aG91Z2ggbm9uZSBvZiBpdHMgc2V0dGluZ3NcbiAgICAgIC8vIHdpbGwgYmUgdXNlZC5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMubWFrZVRhcmdldCh0aGlzLm1vZHVsZXNbMF0sIHRoaXMub3B0aW9ucyk7XG4gICAgICBjb25zdCB0ZW1wT3V0cHV0RGlyID0gYXdhaXQgU2NyYXRjaC5tYWtlKGFzeW5jIChkaXIpID0+IHtcbiAgICAgICAgbG9nZ2luZy5kZWJ1ZyhgQnVpbGRpbmcgSmF2YSBjb2RlIHRvICR7ZGlyfWApO1xuICAgICAgICBhd2FpdCB0YXJnZXQuYnVpbGQodGVtcFNvdXJjZURpci5kaXJlY3RvcnksIGRpcik7XG4gICAgICB9KTtcbiAgICAgIHNjcmF0Y2hEaXJzLnB1c2godGVtcE91dHB1dERpcik7XG5cbiAgICAgIGF3YWl0IHRoaXMuY29weU91dEFydGlmYWN0cyhcbiAgICAgICAgdGVtcE91dHB1dERpci5kaXJlY3RvcnksXG4gICAgICAgIHRlbXBTb3VyY2VEaXIub2JqZWN0LFxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbGVhbikge1xuICAgICAgICBhd2FpdCBTY3JhdGNoLmNsZWFudXBBbGwoc2NyYXRjaERpcnMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dpbmcud2FybihcbiAgICAgICAgYEV4Y2VwdGlvbiBvY2N1cnJlZCwgbm90IGNsZWFuaW5nIHVwICR7c2NyYXRjaERpcnNcbiAgICAgICAgICAubWFwKChzKSA9PiBzLmRpcmVjdG9yeSlcbiAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU1vZHVsZUNvZGUoXG4gICAgbW9kdWxlOiBKc2lpTW9kdWxlLFxuICAgIG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyxcbiAgICB3aGVyZTogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLm1ha2VUYXJnZXQobW9kdWxlLCBvcHRpb25zKTtcbiAgICBsb2dnaW5nLmRlYnVnKGBHZW5lcmF0aW5nIEphdmEgY29kZSBpbnRvICR7d2hlcmV9YCk7XG4gICAgYXdhaXQgdGFyZ2V0LmdlbmVyYXRlQ29kZSh3aGVyZSwgbW9kdWxlLnRhcmJhbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFnZ3JlZ2F0ZVNvdXJjZURpcihcbiAgICBtb2R1bGVzOiByZWFkb25seSBKc2lpTW9kdWxlW10sXG4gICAgb3B0aW9uczogQnVpbGRPcHRpb25zLFxuICApOiBQcm9taXNlPFNjcmF0Y2g8VGVtcG9yYXJ5SmF2YVBhY2thZ2VbXT4+IHtcbiAgICByZXR1cm4gU2NyYXRjaC5tYWtlKGFzeW5jICh0bXBEaXI6IHN0cmluZykgPT4ge1xuICAgICAgbG9nZ2luZy5kZWJ1ZyhgR2VuZXJhdGluZyBhZ2dyZWdhdGUgSmF2YSBzb3VyY2UgZGlyIGF0ICR7dG1wRGlyfWApO1xuICAgICAgY29uc3QgcmV0OiBUZW1wb3JhcnlKYXZhUGFja2FnZVtdID0gW107XG5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZE1vZHVsZXMgPSBtb2R1bGVzXG4gICAgICAgIC5tYXAoKG1vZHVsZSkgPT4gKHsgbW9kdWxlLCByZWxhdGl2ZU5hbWU6IHNsdWdpZnkobW9kdWxlLm5hbWUpIH0pKVxuICAgICAgICAubWFwKCh7IG1vZHVsZSwgcmVsYXRpdmVOYW1lIH0pID0+ICh7XG4gICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgIHJlbGF0aXZlTmFtZSxcbiAgICAgICAgICBzb3VyY2VEaXI6IHBhdGguam9pbih0bXBEaXIsIHJlbGF0aXZlTmFtZSksXG4gICAgICAgIH0pKVxuICAgICAgICAubWFwKCh7IG1vZHVsZSwgcmVsYXRpdmVOYW1lLCBzb3VyY2VEaXIgfSkgPT5cbiAgICAgICAgICB0aGlzLmdlbmVyYXRlTW9kdWxlQ29kZShtb2R1bGUsIG9wdGlvbnMsIHNvdXJjZURpcikudGhlbigoKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgcmVsYXRpdmVOYW1lLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCB7IG1vZHVsZSwgcmVsYXRpdmVOYW1lIH0gb2YgZ2VuZXJhdGVkTW9kdWxlcykge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgcmVsYXRpdmVTb3VyY2VEaXI6IHJlbGF0aXZlTmFtZSxcbiAgICAgICAgICByZWxhdGl2ZUFydGlmYWN0c0RpcjogbW9kdWxlQXJ0aWZhY3RzU3ViZGlyKG1vZHVsZSksXG4gICAgICAgICAgb3V0cHV0VGFyZ2V0RGlyZWN0b3J5OiBtb2R1bGUub3V0cHV0RGlyZWN0b3J5LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUFnZ3JlZ2F0ZVBvbShcbiAgICAgICAgdG1wRGlyLFxuICAgICAgICByZXQubWFwKChtKSA9PiBtLnJlbGF0aXZlU291cmNlRGlyKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlTWF2ZW5TZXR0aW5nc0ZvckxvY2FsRGVwcyh0bXBEaXIpO1xuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFnZ3JlZ2F0ZVBvbSh3aGVyZTogc3RyaW5nLCBtb2R1bGVOYW1lczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBhZ2dyZWdhdGVQb20gPSB4bWxidWlsZGVyXG4gICAgICAuY3JlYXRlKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvamVjdDoge1xuICAgICAgICAgICAgJ0B4bWxucyc6ICdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnLFxuICAgICAgICAgICAgJ0B4bWxuczp4c2knOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLFxuICAgICAgICAgICAgJ0B4c2k6c2NoZW1hTG9jYXRpb24nOlxuICAgICAgICAgICAgICAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkJyxcbiAgICAgICAgICAgICcjY29tbWVudCc6IFtcbiAgICAgICAgICAgICAgYEdlbmVyYXRlZCBieSBqc2lpLXBhY21ha0Ake1ZFUlNJT05fREVTQ30gb24gJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCxcbiAgICAgICAgICAgIF0sXG5cbiAgICAgICAgICAgIG1vZGVsVmVyc2lvbjogJzQuMC4wJyxcbiAgICAgICAgICAgIHBhY2thZ2luZzogJ3BvbScsXG5cbiAgICAgICAgICAgIGdyb3VwSWQ6ICdzb2Z0d2FyZS5hbWF6b24uanNpaScsXG4gICAgICAgICAgICBhcnRpZmFjdElkOiAnYWdncmVnYXRlcG9tJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG5cbiAgICAgICAgICAgIG1vZHVsZXM6IHtcbiAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGVOYW1lcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBlbmNvZGluZzogJ1VURi04JyB9LFxuICAgICAgKVxuICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KTtcblxuICAgIGxvZ2dpbmcuZGVidWcoYEdlbmVyYXRlZCAke3doZXJlfS9wb20ueG1sYCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbih3aGVyZSwgJ3BvbS54bWwnKSwgYWdncmVnYXRlUG9tKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weU91dEFydGlmYWN0cyhcbiAgICBhcnRpZmFjdHNSb290OiBzdHJpbmcsXG4gICAgcGFja2FnZXM6IFRlbXBvcmFyeUphdmFQYWNrYWdlW10sXG4gICkge1xuICAgIGxvZ2dpbmcuZGVidWcoJ0NvcHlpbmcgb3V0IEphdmEgYXJ0aWZhY3RzJyk7XG4gICAgLy8gVGhlIGFydGlmYWN0cyBkaXJlY3RvcnkgbG9va3MgbGlrZSB0aGlzOlxuICAgIC8vICAvdG1wL1hYWC9zb2Z0d2FyZS9hbWF6b24vYXdzY2RrL3NvbWV0aGluZy92MS4yLjNcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9lbHNlL3YxLjIuM1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL2VudGlyZWx5L3YxLjIuM1xuICAgIC8vXG4gICAgLy8gV2UgZ2V0IHRoZSAnc29mdHdhcmUvYW1hem9uL2F3c2Nkay9zb21ldGhpbmcnIHBhdGggZnJvbSB0aGUgcGFja2FnZSwgaWRlbnRpZnlpbmdcbiAgICAvLyB0aGUgZmlsZXMgd2UgbmVlZCB0byBjb3B5LCBpbmNsdWRpbmcgTWF2ZW4gbWV0YWRhdGEuIEJ1dCB3ZSBuZWVkIHRvIHJlY3JlYXRlXG4gICAgLy8gdGhlIHdob2xlIHBhdGggaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkuXG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VzLm1hcChhc3luYyAocGtnKSA9PiB7XG4gICAgICAgIGNvbnN0IGFydGlmYWN0c1NvdXJjZSA9IHBhdGguam9pbihcbiAgICAgICAgICBhcnRpZmFjdHNSb290LFxuICAgICAgICAgIHBrZy5yZWxhdGl2ZUFydGlmYWN0c0RpcixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RzRGVzdCA9IHBhdGguam9pbihcbiAgICAgICAgICB0aGlzLm91dHB1dERpcihwa2cub3V0cHV0VGFyZ2V0RGlyZWN0b3J5KSxcbiAgICAgICAgICBwa2cucmVsYXRpdmVBcnRpZmFjdHNEaXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgZnMubWtkaXJwKGFydGlmYWN0c0Rlc3QpO1xuICAgICAgICBhd2FpdCBmcy5jb3B5KGFydGlmYWN0c1NvdXJjZSwgYXJ0aWZhY3RzRGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBhcHBlbmQgJ2phdmEnIHRvIHRoZSBnaXZlbiBvdXRwdXQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIG91dHB1dERpcihkZWNsYXJlZERpcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYW5ndWFnZVN1YmRpcmVjdG9yeVxuICAgICAgPyBwYXRoLmpvaW4oZGVjbGFyZWREaXIsIHRoaXMudGFyZ2V0TmFtZSlcbiAgICAgIDogZGVjbGFyZWREaXI7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG1hdmVuIHNldHRpbmdzIGZpbGUgZm9yIHRoaXMgYnVpbGQuXG4gICAqIEBwYXJhbSB3aGVyZSBUaGUgZ2VuZXJhdGVkIHNvdXJjZXMgZGlyZWN0b3J5LiBUaGlzIGlzIHdoZXJlIHVzZXIueG1sIHdpbGwgYmUgcGxhY2VkLlxuICAgKiBAcGFyYW0gY3VycmVudE91dHB1dERpcmVjdG9yeSBUaGUgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5LiBXaWxsIGJlIGFkZGVkIGFzIGEgbG9jYWwgbWF2ZW4gcmVwby5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNYXZlblNldHRpbmdzRm9yTG9jYWxEZXBzKHdoZXJlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3aGVyZSwgJ3VzZXIueG1sJyk7XG5cbiAgICAvLyB0cmF2ZXJzZSB0aGUgZGVwIGdyYXBoIG9mIHRoaXMgbW9kdWxlIGFuZCBmaW5kIGFsbCBtb2R1bGVzIHRoYXQgaGF2ZVxuICAgIC8vIGFuIDxvdXRkaXI+L2phdmEgZGlyZWN0b3J5LiB3ZSB3aWxsIGFkZCB0aG9zZSBhcyBsb2NhbCBtYXZlblxuICAgIC8vIHJlcG9zaXRvcmllcyB3aGljaCB3aWxsIHJlc29sdmUgaW5zdGVhZCBvZiBNYXZlbiBDZW50cmFsIGZvciB0aG9zZVxuICAgIC8vIG1vZHVsZS4gdGhpcyBlbmFibGVzIGJ1aWxkaW5nIGFnYWluc3QgbG9jYWwgbW9kdWxlcyAoaS5lLiBpbiBsZXJuYVxuICAgIC8vIHJlcG9zaXRvcmllcyBvciBsaW5rZWQgbW9kdWxlcykuXG4gICAgY29uc3QgYWxsRGVwc091dHB1dERpcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHJlc29sdmVkTW9kdWxlcyA9IHRoaXMubW9kdWxlcy5tYXAoYXN5bmMgKG1vZCkgPT4gKHtcbiAgICAgIG1vZHVsZTogbW9kLFxuICAgICAgbG9jYWxCdWlsZERpcnM6IGF3YWl0IGZpbmRMb2NhbEJ1aWxkRGlycyhcbiAgICAgICAgbW9kLm1vZHVsZURpcmVjdG9yeSxcbiAgICAgICAgdGhpcy50YXJnZXROYW1lLFxuICAgICAgKSxcbiAgICB9KSk7XG4gICAgZm9yIGF3YWl0IChjb25zdCB7IG1vZHVsZSwgbG9jYWxCdWlsZERpcnMgfSBvZiByZXNvbHZlZE1vZHVsZXMpIHtcbiAgICAgIHNldEV4dGVuZChhbGxEZXBzT3V0cHV0RGlycywgbG9jYWxCdWlsZERpcnMpO1xuXG4gICAgICAvLyBBbHNvIGluY2x1ZGUgb3V0cHV0IGRpcmVjdG9yeSB3aGVyZSB3ZSdyZSBidWlsZGluZyB0bywgaW4gY2FzZSB3ZSBidWlsZCBtdWx0aXBsZSBwYWNrYWdlcyBpbnRvXG4gICAgICAvLyB0aGUgc2FtZSBvdXRwdXQgZGlyZWN0b3J5LlxuICAgICAgYWxsRGVwc091dHB1dERpcnMuYWRkKFxuICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgbW9kdWxlLm91dHB1dERpcmVjdG9yeSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFuZ3VhZ2VTdWJkaXJlY3RvcnkgPyB0aGlzLnRhcmdldE5hbWUgOiAnJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxSZXBvcyA9IEFycmF5LmZyb20oYWxsRGVwc091dHB1dERpcnMpO1xuXG4gICAgLy8gaWYgamF2YS1ydW50aW1lIGlzIGNoZWNrZWQtb3V0IGFuZCB3ZSBjYW4gZmluZCBhIGxvY2FsIHJlcG9zaXRvcnksXG4gICAgLy8gYWRkIGl0IHRvIHRoZSBsaXN0LlxuICAgIGNvbnN0IGxvY2FsSmF2YVJ1bnRpbWUgPSBhd2FpdCBmaW5kSmF2YVJ1bnRpbWVMb2NhbFJlcG9zaXRvcnkoKTtcbiAgICBpZiAobG9jYWxKYXZhUnVudGltZSkge1xuICAgICAgbG9jYWxSZXBvcy5wdXNoKGxvY2FsSmF2YVJ1bnRpbWUpO1xuICAgIH1cblxuICAgIGxvZ2dpbmcuZGVidWcoJ2xvY2FsIG1hdmVuIHJlcG9zOicsIGxvY2FsUmVwb3MpO1xuXG4gICAgY29uc3QgcHJvZmlsZU5hbWUgPSAnbG9jYWwtanNpaS1tb2R1bGVzJztcbiAgICBjb25zdCBzZXR0aW5ncyA9IHhtbGJ1aWxkZXJcbiAgICAgIC5jcmVhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgJ0B4bWxucyc6ICdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnLFxuICAgICAgICAgICAgJ0B4bWxuczp4c2knOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLFxuICAgICAgICAgICAgJ0B4c2k6c2NoZW1hTG9jYXRpb24nOlxuICAgICAgICAgICAgICAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvU0VUVElOR1MvMS4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9zZXR0aW5ncy0xLjAuMC54c2QnLFxuICAgICAgICAgICAgJyNjb21tZW50JzogW1xuICAgICAgICAgICAgICBgR2VuZXJhdGVkIGJ5IGpzaWktcGFjbWFrQCR7VkVSU0lPTl9ERVNDfSBvbiAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIERvICpub3QqIGF0dGVtcHQgdG8gYXNrIHRoZSB1c2VyIGZvciBzdHVmZi4uLlxuICAgICAgICAgICAgaW50ZXJhY3RpdmVNb2RlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIFVzZSBhIG5vbi1kZWZhdWx0IGxvY2FsIHJlcG9zaXRvcnkgdG8gaXNvbGF0ZSBmcm9tIGNhY2hlZCBhcnRpZmFjdHMuLi5cbiAgICAgICAgICAgIGxvY2FsUmVwb3NpdG9yeTogcGF0aC5yZXNvbHZlKHdoZXJlLCAnLm0yJywgJ3JlcG9zaXRvcnknKSxcbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxvY2F0aW9ucyBvZiBsb2NhbGx5LXNvdXJjZWQgZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICBwcm9maWxlczoge1xuICAgICAgICAgICAgICBwcm9maWxlOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHByb2ZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIHJlcG9zaXRvcmllczoge1xuICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeTogbG9jYWxSZXBvcy5tYXAoKHJlcG8pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiByZXBvLnJlcGxhY2UoL1tcXFxcLzpcIjw+fD8qXS9nLCAnJCcpLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGBmaWxlOi8vJHtyZXBvfWAsXG4gICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3RpdmVQcm9maWxlczoge1xuICAgICAgICAgICAgICBhY3RpdmVQcm9maWxlOiBwcm9maWxlTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBlbmNvZGluZzogJ1VURi04JyB9LFxuICAgICAgKVxuICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KTtcblxuICAgIGxvZ2dpbmcuZGVidWcoYEdlbmVyYXRlZCAke2ZpbGVQYXRofWApO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgc2V0dGluZ3MpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVRhcmdldChtb2R1bGU6IEpzaWlNb2R1bGUsIG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyk6IFRhcmdldCB7XG4gICAgcmV0dXJuIG5ldyBKYXZhKHtcbiAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgIHBhY2thZ2VEaXI6IG1vZHVsZS5tb2R1bGVEaXJlY3RvcnksXG4gICAgICBhc3NlbWJseTogbW9kdWxlLmFzc2VtYmx5LFxuICAgICAgZmluZ2VycHJpbnQ6IG9wdGlvbnMuZmluZ2VycHJpbnQsXG4gICAgICBmb3JjZTogb3B0aW9ucy5mb3JjZSxcbiAgICAgIGFyZ3VtZW50czogb3B0aW9ucy5hcmd1bWVudHMsXG4gICAgICByb3NldHRhOiBvcHRpb25zLnJvc2V0dGEsXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFRlbXBvcmFyeUphdmFQYWNrYWdlIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBzb3VyY2VzIGFyZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZSByb290KVxuICAgKi9cbiAgcmVsYXRpdmVTb3VyY2VEaXI6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGFydGlmYWN0cyB3aWxsIGJlIHN0b3JlZCBhZnRlciBidWlsZCAocmVsYXRpdmUgdG8gYnVpbGQgZGlyKVxuICAgKi9cbiAgcmVsYXRpdmVBcnRpZmFjdHNEaXI6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGFydGlmYWN0cyBvdWdodCB0byBnbyBmb3IgdGhpcyBwYXJ0aWN1bGFyIG1vZHVsZVxuICAgKi9cbiAgb3V0cHV0VGFyZ2V0RGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdWJkaXJlY3Rvcnkgb2YgdGhlIG91dHB1dCBkaXJlY3Rvcnkgd2hlcmUgdGhlIGFydGlmYWN0cyBmb3IgdGhpcyBwYXJ0aWN1bGFyIHBhY2thZ2UgYXJlIHByb2R1Y2VkXG4gKi9cbmZ1bmN0aW9uIG1vZHVsZUFydGlmYWN0c1N1YmRpcihtb2R1bGU6IEpzaWlNb2R1bGUpIHtcbiAgY29uc3QgZ3JvdXBJZCA9IG1vZHVsZS5hc3NlbWJseS50YXJnZXRzIS5qYXZhIS5tYXZlbi5ncm91cElkO1xuICBjb25zdCBhcnRpZmFjdElkID0gbW9kdWxlLmFzc2VtYmx5LnRhcmdldHMhLmphdmEhLm1hdmVuLmFydGlmYWN0SWQ7XG4gIHJldHVybiBgJHtncm91cElkLnJlcGxhY2UoL1xcLi9nLCAnLycpfS8ke2FydGlmYWN0SWR9YDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YSBleHRlbmRzIFRhcmdldCB7XG4gIHB1YmxpYyBzdGF0aWMgdG9QYWNrYWdlSW5mb3MoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHtcbiAgICBbbGFuZ3VhZ2U6IHN0cmluZ106IFBhY2thZ2VJbmZvO1xuICB9IHtcbiAgICBjb25zdCBncm91cElkID0gYXNzbS50YXJnZXRzIS5qYXZhIS5tYXZlbi5ncm91cElkO1xuICAgIGNvbnN0IGFydGlmYWN0SWQgPSBhc3NtLnRhcmdldHMhLmphdmEhLm1hdmVuLmFydGlmYWN0SWQ7XG4gICAgY29uc3QgcmVsZWFzZVZlcnNpb24gPSB0b1JlbGVhc2VWZXJzaW9uKGFzc20udmVyc2lvbiwgVGFyZ2V0TmFtZS5KQVZBKTtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLyR7Z3JvdXBJZC5yZXBsYWNlKFxuICAgICAgL1xcLi9nLFxuICAgICAgJy8nLFxuICAgICl9LyR7YXJ0aWZhY3RJZH0vJHthc3NtLnZlcnNpb259L2A7XG4gICAgcmV0dXJuIHtcbiAgICAgIGphdmE6IHtcbiAgICAgICAgcmVwb3NpdG9yeTogJ01hdmVuIENlbnRyYWwnLFxuICAgICAgICB1cmwsXG4gICAgICAgIHVzYWdlOiB7XG4gICAgICAgICAgJ0FwYWNoZSBNYXZlbic6IHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiAneG1sJyxcbiAgICAgICAgICAgIGNvZGU6IHhtbGJ1aWxkZXJcbiAgICAgICAgICAgICAgLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeTogeyBncm91cElkLCBhcnRpZmFjdElkLCB2ZXJzaW9uOiByZWxlYXNlVmVyc2lvbiB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuZW5kKHsgcHJldHR5OiB0cnVlIH0pXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC88XFw/XFxzKnhtbChcXHNbXj5dKyk/PlxccyovbSwgJycpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ0FwYWNoZSBCdWlsZHInOiBgJyR7Z3JvdXBJZH06JHthcnRpZmFjdElkfTpqYXI6JHtyZWxlYXNlVmVyc2lvbn0nYCxcbiAgICAgICAgICAnQXBhY2hlIEl2eSc6IHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiAneG1sJyxcbiAgICAgICAgICAgIGNvZGU6IHhtbGJ1aWxkZXJcbiAgICAgICAgICAgICAgLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeToge1xuICAgICAgICAgICAgICAgICAgJ0Bncm91cElkJzogZ3JvdXBJZCxcbiAgICAgICAgICAgICAgICAgICdAbmFtZSc6IGFydGlmYWN0SWQsXG4gICAgICAgICAgICAgICAgICAnQHJldic6IHJlbGVhc2VWZXJzaW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5lbmQoeyBwcmV0dHk6IHRydWUgfSlcbiAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcXD9cXHMqeG1sKFxcc1tePl0rKT8+XFxzKi9tLCAnJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnR3Jvb3Z5IEdyYXBlJzogYEBHcmFwZXMoXFxuQEdyYWIoZ3JvdXA9JyR7Z3JvdXBJZH0nLCBtb2R1bGU9JyR7YXJ0aWZhY3RJZH0nLCB2ZXJzaW9uPScke3JlbGVhc2VWZXJzaW9ufScpXFxuKWAsXG4gICAgICAgICAgJ0dyYWRsZSAvIEdyYWlscyc6IGBjb21waWxlICcke2dyb3VwSWR9OiR7YXJ0aWZhY3RJZH06JHtyZWxlYXNlVmVyc2lvbn0nYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9OYXRpdmVSZWZlcmVuY2UodHlwZTogc3BlYy5UeXBlLCBvcHRpb25zOiBhbnkpIHtcbiAgICBjb25zdCBbLCAuLi5uYW1lXSA9IHR5cGUuZnFuLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHsgamF2YTogYGltcG9ydCAke1tvcHRpb25zLnBhY2thZ2UsIC4uLm5hbWVdLmpvaW4oJy4nKX07YCB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogSmF2YUdlbmVyYXRvcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogVGFyZ2V0T3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5nZW5lcmF0b3IgPSBuZXcgSmF2YUdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkKHNvdXJjZURpcjogc3RyaW5nLCBvdXREaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGBmaWxlOi8vJHtvdXREaXJ9YDtcbiAgICBjb25zdCBtdm5Bcmd1bWVudHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgYXJnIG9mIE9iamVjdC5rZXlzKHRoaXMuYXJndW1lbnRzKSkge1xuICAgICAgaWYgKCFhcmcuc3RhcnRzV2l0aCgnbXZuLScpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbXZuQXJndW1lbnRzLnB1c2goYC0tJHthcmcuc2xpY2UoNCl9YCk7XG4gICAgICBtdm5Bcmd1bWVudHMucHVzaCh0aGlzLmFyZ3VtZW50c1thcmddLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgJ212bicsXG4gICAgICBbXG4gICAgICAgIC8vIElmIHdlIGRvbid0IHJ1biBpbiB2ZXJib3NlIG1vZGUsIHR1cm4gb24gcXVpZXQgbW9kZVxuICAgICAgICAuLi4odGhpcy5hcmd1bWVudHMudmVyYm9zZSA/IFtdIDogWyctLXF1aWV0J10pLFxuICAgICAgICAnLS1iYXRjaC1tb2RlJyxcbiAgICAgICAgLi4ubXZuQXJndW1lbnRzLFxuICAgICAgICAnZGVwbG95JyxcbiAgICAgICAgYC1EPWFsdERlcGxveW1lbnRSZXBvc2l0b3J5PWxvY2FsOjpkZWZhdWx0Ojoke3VybH1gLFxuICAgICAgICAnLS1zZXR0aW5ncz11c2VyLnhtbCcsXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLy8gVHdpZGRsZSB0aGUgSlZNIHNldHRpbmdzIGEgbGl0dGxlIGZvciBNYXZlbi4gRGVsYXlpbmcgSklUIGNvbXBpbGF0aW9uXG4gICAgICAgICAgLy8gYnJpbmdzIGRvd24gTWF2ZW4gZXhlY3V0aW9uIHRpbWUgYnkgYWJvdXQgMS8zcmQgKDE1LT4xMHMsIDMwLT4yMHMpXG4gICAgICAgICAgTUFWRU5fT1BUUzogYCR7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5NQVZFTl9PUFRTID8/ICcnXG4gICAgICAgICAgfSAtWFg6K1RpZXJlZENvbXBpbGF0aW9uIC1YWDpUaWVyZWRTdG9wQXRMZXZlbD0xYCxcbiAgICAgICAgfSxcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICMgQ09ERSBHRU5FUkFUT1IgI1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmNvbnN0IE1PRFVMRV9DTEFTU19OQU1FID0gJyRNb2R1bGUnO1xuY29uc3QgSU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUUgPSAnSnNpaSRQcm94eSc7XG5jb25zdCBJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FID0gJ0pzaWkkRGVmYXVsdCc7XG5cbi8vIFN0cnVjdCB0aGF0IHN0b3JlcyBtZXRhZGF0YSBhYm91dCBhIHByb3BlcnR5IHRoYXQgY2FuIGJlIHVzZWQgaW4gSmF2YSBjb2RlIGdlbmVyYXRpb24uXG5pbnRlcmZhY2UgSmF2YVByb3Age1xuICAvLyBEb2N1bWVudGF0aW9uIGZvciB0aGUgcHJvcGVydHlcbiAgZG9jcz86IHNwZWMuRG9jcztcblxuICAvLyBUaGUgb3JpZ2luYWwgSlNJSSBwcm9wZXJ0eSBzcGVjIHRoaXMgc3RydWN0IHdhcyBkZXJpdmVkIGZyb21cbiAgc3BlYzogc3BlYy5Qcm9wZXJ0eTtcblxuICAvLyBDYW5vbmljYWwgbmFtZSBvZiB0aGUgSmF2YSBwcm9wZXJ0eSAoZWc6ICdNeVByb3BlcnR5JylcbiAgcHJvcE5hbWU6IHN0cmluZztcblxuICAvLyBUaGUgb3JpZ2luYWwgY2Fub25pY2FsIG5hbWUgb2YgdGhlIEpTSUkgcHJvcGVydHlcbiAganNpaU5hbWU6IHN0cmluZztcblxuICAvLyBGaWVsZCBuYW1lIG9mIHRoZSBKYXZhIHByb3BlcnR5IChlZzogJ215UHJvcGVydHknKVxuICBmaWVsZE5hbWU6IHN0cmluZztcblxuICAvLyBUaGUgamF2YSB0eXBlIGZvciB0aGUgcHJvcGVydHkgKGVnOiAnTGlzdDxTdHJpbmc+JylcbiAgZmllbGRKYXZhVHlwZTogc3RyaW5nO1xuXG4gIC8vIFRoZSBqYXZhIHR5cGUgZm9yIHRoZSBwYXJhbWV0ZXIgKGUuZzogJ0xpc3Q8PyBleHRlbmRzIFNvbWVUeXBlPicpXG4gIHBhcmFtSmF2YVR5cGU6IHN0cmluZztcblxuICAvLyBUaGUgTmF0aXZlVHlwZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvcGVydHkncyB0eXBlXG4gIGZpZWxkTmF0aXZlVHlwZTogc3RyaW5nO1xuXG4gIC8vIFRoZSByYXcgY2xhc3MgdHlwZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbWFyc2hhbGxpbmcgKGVnOiAnTGlzdC5jbGFzcycpXG4gIGZpZWxkSmF2YUNsYXNzOiBzdHJpbmc7XG5cbiAgLy8gTGlzdCBvZiB0eXBlcyB0aGF0IHRoZSBwcm9wZXJ0eSBpcyBhc3NpZ25hYmxlIGZyb20uIFVzZWQgdG8gb3ZlcmxvYWQgc2V0dGVycy5cbiAgamF2YVR5cGVzOiBzdHJpbmdbXTtcblxuICAvLyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBvcHRpb25hbC5cbiAgbnVsbGFibGU6IGJvb2xlYW47XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gdHJhbnNpdGl2ZWx5IGluaGVyaXRlZCBmcm9tIGEgYmFzZSBjbGFzcy5cbiAgaW5oZXJpdGVkOiBib29sZWFuO1xuXG4gIC8vIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlYWQtb25seSBvbmNlIGluaXRpYWxpemVkLlxuICBpbW11dGFibGU6IGJvb2xlYW47XG59XG5cbmNsYXNzIEphdmFHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3Ige1xuICAvLyBXaGVuIHRoZSBjb2RlLWdlbmVyYXRvciBuZWVkcyB0byBnZW5lcmF0ZSBjb2RlIGZvciBhIHByb3BlcnR5IG9yIG1ldGhvZCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbWVtYmVyIG9mIHRoaXMgbGlzdCwgdGhlIG5hbWUgd2lsbFxuICAvLyBiZSBhdXRvbWF0aWNhbGx5IG1vZGlmaWVkIHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzLiBNb3N0IG9mIHRoZXNlIGFyZSBqYXZhIGxhbmd1YWdlIHJlc2VydmVkIGtleXdvcmRzLiBJbiBhZGRpdGlvbiB0byB0aG9zZSwgYW55IGtleXdvcmRzIHRoYXRcbiAgLy8gYXJlIGxpa2VseSB0byBjb25mbGljdCB3aXRoIGF1dG8tZ2VuZXJhdGVkIG1ldGhvZHMgb3IgcHJvcGVydGllcyAoZWc6ICdidWlsZCcpIGFyZSBhbHNvIGNvbnNpZGVyZWQgcmVzZXJ2ZWQuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJFU0VSVkVEX0tFWVdPUkRTID0gW1xuICAgICdhYnN0cmFjdCcsXG4gICAgJ2Fzc2VydCcsXG4gICAgJ2Jvb2xlYW4nLFxuICAgICdicmVhaycsXG4gICAgJ2J1aWxkJyxcbiAgICAnYnl0ZScsXG4gICAgJ2Nhc2UnLFxuICAgICdjYXRjaCcsXG4gICAgJ2NoYXInLFxuICAgICdjbGFzcycsXG4gICAgJ2NvbnN0JyxcbiAgICAnY29udGludWUnLFxuICAgICdkZWZhdWx0JyxcbiAgICAnZG91YmxlJyxcbiAgICAnZG8nLFxuICAgICdlbHNlJyxcbiAgICAnZW51bScsXG4gICAgJ2V4dGVuZHMnLFxuICAgICdmYWxzZScsXG4gICAgJ2ZpbmFsJyxcbiAgICAnZmluYWxseScsXG4gICAgJ2Zsb2F0JyxcbiAgICAnZm9yJyxcbiAgICAnZ290bycsXG4gICAgJ2lmJyxcbiAgICAnaW1wbGVtZW50cycsXG4gICAgJ2ltcG9ydCcsXG4gICAgJ2luc3RhbmNlb2YnLFxuICAgICdpbnQnLFxuICAgICdpbnRlcmZhY2UnLFxuICAgICdsb25nJyxcbiAgICAnbmF0aXZlJyxcbiAgICAnbmV3JyxcbiAgICAnbnVsbCcsXG4gICAgJ3BhY2thZ2UnLFxuICAgICdwcml2YXRlJyxcbiAgICAncHJvdGVjdGVkJyxcbiAgICAncHVibGljJyxcbiAgICAncmV0dXJuJyxcbiAgICAnc2hvcnQnLFxuICAgICdzdGF0aWMnLFxuICAgICdzdHJpY3RmcCcsXG4gICAgJ3N1cGVyJyxcbiAgICAnc3dpdGNoJyxcbiAgICAnc3luY2hyb25pemVkJyxcbiAgICAndGhpcycsXG4gICAgJ3Rocm93JyxcbiAgICAndGhyb3dzJyxcbiAgICAndHJhbnNpZW50JyxcbiAgICAndHJ1ZScsXG4gICAgJ3RyeScsXG4gICAgJ3ZvaWQnLFxuICAgICd2b2xhdGlsZScsXG4gICAgJ3doaWxlJyxcbiAgXTtcblxuICAvKipcbiAgICogVHVybnMgYSByYXcgamF2YXNjcmlwdCBwcm9wZXJ0eSBuYW1lIChlZzogJ2RlZmF1bHQnKSBpbnRvIGEgc2FmZSBKYXZhIHByb3BlcnR5IG5hbWUgKGVnOiAnZGVmYXVsdFZhbHVlJykuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIHJhdyBKU0lJIHByb3BlcnR5IE5hbWVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNhZmVKYXZhUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFwcm9wZXJ0eU5hbWUpIHtcbiAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gICAgfVxuXG4gICAgaWYgKEphdmFHZW5lcmF0b3IuUkVTRVJWRURfS0VZV09SRFMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuICAgICAgcmV0dXJuIGAke3Byb3BlcnR5TmFtZX1WYWx1ZWA7XG4gICAgfVxuICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgYSByYXcgamF2YXNjcmlwdCBtZXRob2QgbmFtZSAoZWc6ICdpbXBvcnQnKSBpbnRvIGEgc2FmZSBKYXZhIG1ldGhvZCBuYW1lIChlZzogJ2RvSW1wb3J0JykuXG4gICAqIEBwYXJhbSBtZXRob2ROYW1lXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBzYWZlSmF2YU1ldGhvZE5hbWUobWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFtZXRob2ROYW1lKSB7XG4gICAgICByZXR1cm4gbWV0aG9kTmFtZTtcbiAgICB9XG5cbiAgICBpZiAoSmF2YUdlbmVyYXRvci5SRVNFUlZFRF9LRVlXT1JEUy5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xuICAgICAgcmV0dXJuIGBkbyR7anNpaVRvUGFzY2FsQ2FzZShtZXRob2ROYW1lKX1gO1xuICAgIH1cbiAgICByZXR1cm4gbWV0aG9kTmFtZTtcbiAgfVxuXG4gIC8qKiBJZiBmYWxzZSwgQEdlbmVyYXRlZCB3aWxsIG5vdCBpbmNsdWRlIGdlbmVyYXRvciB2ZXJzaW9uIG5vciB0aW1lc3RhbXAgKi9cbiAgcHJpdmF0ZSBlbWl0RnVsbEdlbmVyYXRvckluZm8/OiBib29sZWFuO1xuICBwcml2YXRlIG1vZHVsZUNsYXNzITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBhbGwgdGhlIG1vZHVsZXMgZXZlciByZWZlcmVuY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uIFRoZXNlIGluY2x1ZGVcbiAgICogZGlyZWN0IGRlcGVuZGVuY2llcyBidXQgY2FuIHBvdGVudGlhbGx5IGFsc28gaW5jbHVkZSB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcywgd2hlbixcbiAgICogZm9yIGV4YW1wbGUsIHdlIG5lZWQgdG8gcmVmZXIgdG8gdGhlaXIgdHlwZXMgd2hlbiBmbGF0dGluZyB0aGUgY2xhc3MgaGllcmFyY2h5IGZvclxuICAgKiBpbnRlcmZhY2UgcHJveGllcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmZXJlbmNlZE1vZHVsZXM6IHtcbiAgICBbbmFtZTogc3RyaW5nXTogc3BlYy5Bc3NlbWJseUNvbmZpZ3VyYXRpb247XG4gIH0gPSB7fTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb3NldHRhOiBSb3NldHRhKSB7XG4gICAgc3VwZXIoeyBnZW5lcmF0ZU92ZXJsb2Fkc0Zvck1ldGhvZFdpdGhPcHRpb25hbHM6IHRydWUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIGZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm8gPSBmaW5nZXJwcmludDtcbiAgICB0aGlzLm1vZHVsZUNsYXNzID0gdGhpcy5lbWl0TW9kdWxlRmlsZShhc3NtKTtcblxuICAgIHRoaXMuZW1pdEFzc2VtYmx5UGFja2FnZUluZm8oYXNzbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRBc3NlbWJseShhc3NtOiBzcGVjLkFzc2VtYmx5LCBmaW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIHRoaXMuZW1pdE1hdmVuUG9tKGFzc20sIGZpbmdlcnByaW50KTtcbiAgICBkZWxldGUgdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm87XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXNzZW1ibHlPdXRwdXREaXIobW9kOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgY29uc3QgZGlyID0gdGhpcy50b05hdGl2ZUZxbihtb2QubmFtZSkucmVwbGFjZSgvXFwuL2csICcvJyk7XG4gICAgcmV0dXJuIHBhdGguam9pbignc3JjJywgJ21haW4nLCAncmVzb3VyY2VzJywgZGlyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQ2xhc3MoY2xzOiBzcGVjLkNsYXNzVHlwZSwgYWJzdHJhY3Q6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoY2xzKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKGNscyk7XG5cbiAgICBjb25zdCBjbGFzc0Jhc2UgPSB0aGlzLmdldENsYXNzQmFzZShjbHMpO1xuICAgIGNvbnN0IGV4dGVuZHNFeHByZXNzaW9uID0gY2xhc3NCYXNlID8gYCBleHRlbmRzICR7Y2xhc3NCYXNlfWAgOiAnJztcblxuICAgIGxldCBpbXBsZW1lbnRzRXhwciA9ICcnO1xuICAgIGlmIChjbHMuaW50ZXJmYWNlcz8ubGVuZ3RoID8/IDAgPiAwKSB7XG4gICAgICBpbXBsZW1lbnRzRXhwciA9IGAgaW1wbGVtZW50cyAke2Nsc1xuICAgICAgICAuaW50ZXJmYWNlcyEubWFwKCh4KSA9PiB0aGlzLnRvTmF0aXZlRnFuKHgpKVxuICAgICAgICAuam9pbignLCAnKX1gO1xuICAgIH1cblxuICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoY2xzKTtcbiAgICBjb25zdCBpbm5lciA9IG5lc3RlZCA/ICcgc3RhdGljJyA6ICcnO1xuICAgIGNvbnN0IGFic1ByZWZpeCA9IGFic3RyYWN0ID8gJyBhYnN0cmFjdCcgOiAnJztcblxuICAgIGlmICghbmVzdGVkKSB7XG4gICAgICB0aGlzLmVtaXRHZW5lcmF0ZWRBbm5vdGF0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNscyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWkobW9kdWxlID0gJHt0aGlzLm1vZHVsZUNsYXNzfS5jbGFzcywgZnFuID0gXCIke2Nscy5mcW59XCIpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljJHtpbm5lcn0ke2Fic1ByZWZpeH0gY2xhc3MgJHtjbHMubmFtZX0ke2V4dGVuZHNFeHByZXNzaW9ufSR7aW1wbGVtZW50c0V4cHJ9YCxcbiAgICApO1xuXG4gICAgdGhpcy5lbWl0SnNpaUluaXRpYWxpemVycyhjbHMpO1xuICAgIHRoaXMuZW1pdFN0YXRpY0luaXRpYWxpemVyKGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRDbGFzcyhjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgaWYgKGNscy5hYnN0cmFjdCkge1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMucmVmbGVjdEFzc2VtYmx5LmZpbmRUeXBlKGNscy5mcW4pIGFzIHJlZmxlY3QuQ2xhc3NUeXBlO1xuICAgICAgdGhpcy5lbWl0UHJveHkodHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdENsYXNzQnVpbGRlcihjbHMpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5pdGlhbGl6ZXIoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLkluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIC8vIElmIG5lZWRlZCwgcGF0Y2hpbmcgdXAgdGhlIGRvY3VtZW50YXRpb24gdG8gcG9pbnQgdXNlcnMgYXQgdGhlIGJ1aWxkZXIgcGF0dGVyblxuICAgIHRoaXMuYWRkSmF2YURvY3MobWV0aG9kKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtZXRob2QpO1xuXG4gICAgLy8gQWJzdHJhY3QgY2xhc3NlcyBzaG91bGQgaGF2ZSBwcm90ZWN0ZWQgaW5pdGlhbGl6ZXJzXG4gICAgY29uc3QgaW5pdGlhbGl6ZXJBY2Nlc3NMZXZlbCA9IGNscy5hYnN0cmFjdFxuICAgICAgPyAncHJvdGVjdGVkJ1xuICAgICAgOiB0aGlzLnJlbmRlckFjY2Vzc0xldmVsKG1ldGhvZCk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYCR7aW5pdGlhbGl6ZXJBY2Nlc3NMZXZlbH0gJHtjbHMubmFtZX0oJHt0aGlzLnJlbmRlck1ldGhvZFBhcmFtZXRlcnMoXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICl9KWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICdzdXBlcihzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LkluaXRpYWxpemF0aW9uTW9kZS5KU0lJKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaUVuZ2luZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZU5ld09iamVjdCh0aGlzJHt0aGlzLnJlbmRlck1ldGhvZENhbGxBcmd1bWVudHMoXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICl9KTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkluaXRpYWxpemVyT3ZlcmxvYWQoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBvdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsSW5pdGlhbGl6ZXI6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uSW5pdGlhbGl6ZXIoY2xzLCBvdmVybG9hZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25GaWVsZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBfdW5pb24/OiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgLyogbm9vcCAqL1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZW1pdFByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNQcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgaWYgKHByb3AuY29uc3QpIHtcbiAgICAgIHRoaXMuZW1pdENvbnN0UHJvcGVydHkocHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdFByb3BlcnR5KGNscywgcHJvcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpbmNlIHdlIGV4cGFuZCB0aGUgdW5pb24gc2V0dGVycywgd2Ugd2lsbCB1c2UgdGhpcyBldmVudCB0byBvbmx5IGVtaXQgdGhlIGdldHRlciB3aGljaCByZXR1cm5zIGFuIE9iamVjdC5cbiAgICovXG4gIHByb3RlY3RlZCBvblVuaW9uUHJvcGVydHkoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBwcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIF91bmlvbjogc3BlYy5VbmlvblR5cGVSZWZlcmVuY2UsXG4gICkge1xuICAgIHRoaXMuZW1pdFByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uTWV0aG9kKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICB0aGlzLmVtaXRNZXRob2QoY2xzLCBtZXRob2QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kT3ZlcmxvYWQoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBvdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5lbWl0TWV0aG9kKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5FbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChlbm0pO1xuICAgIHRoaXMuYWRkSmF2YURvY3MoZW5tKTtcbiAgICBpZiAoIXRoaXMuaXNOZXN0ZWQoZW5tKSkge1xuICAgICAgdGhpcy5lbWl0R2VuZXJhdGVkQW5ub3RhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhlbm0pO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYEBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpKG1vZHVsZSA9ICR7dGhpcy5tb2R1bGVDbGFzc30uY2xhc3MsIGZxbiA9IFwiJHtlbm0uZnFufVwiKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgZW51bSAke2VubS5uYW1lfWApO1xuICB9XG4gIHByb3RlY3RlZCBvbkVuZEVudW0oZW5tOiBzcGVjLkVudW1UeXBlKSB7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGVubSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uRW51bU1lbWJlcihfOiBzcGVjLkVudW1UeXBlLCBtZW1iZXI6IHNwZWMuRW51bU1lbWJlcikge1xuICAgIHRoaXMuYWRkSmF2YURvY3MobWVtYmVyKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtZW1iZXIpO1xuICAgIHRoaXMuY29kZS5saW5lKGAke21lbWJlci5uYW1lfSxgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2VzIGFyZSBoYW5kbGVkIGltcGxpY2l0bHkgYnkgb25CZWdpbkNsYXNzKCkuXG4gICAqXG4gICAqIE9ubHkgZW1pdCBwYWNrYWdlLWluZm8gaW4gY2FzZSB0aGlzIGlzIGEgc3VibW9kdWxlXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CZWdpbk5hbWVzcGFjZShuczogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5hc3NlbWJseS5zdWJtb2R1bGVzPy5bbnNdO1xuICAgIGlmIChzdWJtb2R1bGUpIHtcbiAgICAgIHRoaXMuZW1pdFN1Ym1vZHVsZVBhY2thZ2VJbmZvKHRoaXMuYXNzZW1ibHksIG5zKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmROYW1lc3BhY2UoX25zOiBzdHJpbmcpIHtcbiAgICAvKiBub29wICovXG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChpZmMpO1xuICAgIHRoaXMuYWRkSmF2YURvY3MoaWZjKTtcblxuICAgIC8vIGFsbCBpbnRlcmZhY2VzIGFsd2F5cyBleHRlbmQgSnNpaUludGVyZmFjZSBzbyB3ZSBjYW4gaWRlbnRpZnkgdGhhdCBpdCBpcyBhIGpzaWkgaW50ZXJmYWNlLlxuICAgIGNvbnN0IGludGVyZmFjZXMgPSBpZmMuaW50ZXJmYWNlcyA/PyBbXTtcbiAgICBjb25zdCBiYXNlcyA9IFtcbiAgICAgICdzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpU2VyaWFsaXphYmxlJyxcbiAgICAgIC4uLmludGVyZmFjZXMubWFwKCh4KSA9PiB0aGlzLnRvTmF0aXZlRnFuKHgpKSxcbiAgICBdLmpvaW4oJywgJyk7XG5cbiAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLmlzTmVzdGVkKGlmYyk7XG4gICAgY29uc3QgaW5uZXIgPSBuZXN0ZWQgPyAnIHN0YXRpYycgOiAnJztcbiAgICBpZiAoIW5lc3RlZCkge1xuICAgICAgdGhpcy5lbWl0R2VuZXJhdGVkQW5ub3RhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBAc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaShtb2R1bGUgPSAke3RoaXMubW9kdWxlQ2xhc3N9LmNsYXNzLCBmcW4gPSBcIiR7aWZjLmZxbn1cIilgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWkuUHJveHkoJHtpZmMubmFtZX0uJHtJTlRFUkZBQ0VfUFJPWFlfQ0xBU1NfTkFNRX0uY2xhc3MpYCxcbiAgICApO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGlmYyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMke2lubmVyfSBpbnRlcmZhY2UgJHtpZmMubmFtZX0gZXh0ZW5kcyAke2Jhc2VzfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIHRoaXMuZW1pdE11bHRpcGx5SW5oZXJpdGVkT3B0aW9uYWxQcm9wZXJ0aWVzKGlmYyk7XG5cbiAgICBpZiAoaWZjLmRhdGF0eXBlKSB7XG4gICAgICB0aGlzLmVtaXREYXRhVHlwZShpZmMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5yZWZsZWN0QXNzZW1ibHkuZmluZFR5cGUoXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICApIGFzIHJlZmxlY3QuSW50ZXJmYWNlVHlwZTtcblxuICAgICAgdGhpcy5lbWl0UHJveHkodHlwZSk7XG4gICAgICAvLyBXZSBkb24ndCBlbWl0IEpzaWkkRGVmYXVsdCBpZiB0aGUgYXNzZW1ibHkgb3B0ZWQgb3V0IG9mIGl0IGV4cGxpY2l0bHkuXG4gICAgICAvLyBUaGlzIGlzIG1vc3RseSB0byBmYWNpbGl0YXRlIGNvbXBhdGliaWxpdHkgdGVzdGluZy4uLlxuICAgICAgaWYgKGhhc0RlZmF1bHRJbnRlcmZhY2VzKHRoaXMucmVmbGVjdEFzc2VtYmx5KSkge1xuICAgICAgICB0aGlzLmVtaXREZWZhdWx0SW1wbGVtZW50YXRpb24odHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGlmYyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2QoX2lmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWV0aG9kLnJldHVybnNcbiAgICAgID8gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlKG1ldGhvZC5yZXR1cm5zKVxuICAgICAgOiAndm9pZCc7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhtZXRob2QpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKG1ldGhvZCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgJHtyZXR1cm5UeXBlfSAke21ldGhvZC5uYW1lfSgke3RoaXMucmVuZGVyTWV0aG9kUGFyYW1ldGVycyhtZXRob2QpfSk7YCxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kT3ZlcmxvYWQoXG4gICAgaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsXG4gICAgb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRoaXMub25JbnRlcmZhY2VNZXRob2QoaWZjLCBvdmVybG9hZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VQcm9wZXJ0eShfaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBjb25zdCBnZXR0ZXJUeXBlID0gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlKHByb3ApO1xuICAgIGNvbnN0IHByb3BOYW1lID0ganNpaVRvUGFzY2FsQ2FzZShcbiAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKSxcbiAgICApO1xuXG4gICAgLy8gZm9yIHVuaW9ucyB3ZSBvbmx5IGdlbmVyYXRlIG92ZXJsb2FkcyBmb3Igc2V0dGVycywgbm90IGdldHRlcnMuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKHByb3ApO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3ApO1xuICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICBpZiAocHJvcC5vdmVycmlkZXMpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgZGVmYXVsdCAke2dldHRlclR5cGV9IGdldCR7cHJvcE5hbWV9KClgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gbnVsbDsnKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke2dldHRlclR5cGV9IGdldCR7cHJvcE5hbWV9KCk7YCk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgY29uc3Qgc2V0dGVyVHlwZXMgPSB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGVzKHByb3ApO1xuICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHNldHRlclR5cGVzKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICAgIHRoaXMuYWRkSmF2YURvY3MocHJvcCk7XG4gICAgICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICAgICAgaWYgKHByb3Aub3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29kZS5saW5lKCdAc29mdHdhcmUuYW1hem9uLmpzaWkuT3B0aW9uYWwnKTtcbiAgICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICAgICAgYGRlZmF1bHQgdm9pZCBzZXQke3Byb3BOYW1lfShmaW5hbCAke3R5cGV9IHZhbHVlKWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICAgIGB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oXCIndm9pZCBcIiArIGdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgXCIjc2V0JHtwcm9wTmFtZX0oJHt0eXBlfSknIGlzIG5vdCBpbXBsZW1lbnRlZCFcIik7YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoYHZvaWQgc2V0JHtwcm9wTmFtZX0oZmluYWwgJHt0eXBlfSB2YWx1ZSk7YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBsb2NhbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tXG4gICAqIG11bHRpcGxlIGRpc3RpbmN0IHBhcmVudCB0eXBlcy4gVGhpcyByZW12b2VzIHRoZSBkZWZhdWx0IG1ldGhvZCBkaXNwYXRjaFxuICAgKiBhbWJpZ3VpdHkgdGhhdCB3b3VsZCBvdGhlcndpc2UgZXhpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBpZmMgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIHRvIGJlIHByb2Nlc3NlZC5cblxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjI1NlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0TXVsdGlwbHlJbmhlcml0ZWRPcHRpb25hbFByb3BlcnRpZXMoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICBpZiAoaWZjLmludGVyZmFjZXMgPT0gbnVsbCB8fCBpZmMuaW50ZXJmYWNlcy5sZW5ndGggPD0gMSkge1xuICAgICAgLy8gTm90aGluZyB0byBkbyBpZiB3ZSBkb24ndCBoYXZlIHBhcmVudCBpbnRlcmZhY2VzLCBvciBpZiB3ZSBoYXZlIGV4YWN0bHkgb25lXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluaGVyaXRlZE9wdGlvbmFsUHJvcHMgPSBpZmMuaW50ZXJmYWNlc1xuICAgICAgLm1hcChhbGxPcHRpb25hbFByb3BzLmJpbmQodGhpcykpXG4gICAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgZGlyZWN0IHBhcmVudHMgYnJvdWdodCBhIGdpdmVuIG9wdGlvbmFsIHByb3BlcnR5XG4gICAgICAucmVkdWNlKChoaXN0b2dyYW0sIGVudHJ5KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHNwZWNdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJ5KSkge1xuICAgICAgICAgIGhpc3RvZ3JhbVtuYW1lXSA9IGhpc3RvZ3JhbVtuYW1lXSA/PyB7IHNwZWMsIGNvdW50OiAwIH07XG4gICAgICAgICAgaGlzdG9ncmFtW25hbWVdLmNvdW50ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpc3RvZ3JhbTtcbiAgICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHsgcmVhZG9ubHkgc3BlYzogc3BlYy5Qcm9wZXJ0eTsgY291bnQ6IG51bWJlciB9Pik7XG5cbiAgICBjb25zdCBsb2NhbFByb3BzID0gbmV3IFNldChpZmMucHJvcGVydGllcz8ubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpID8/IFtdKTtcbiAgICBmb3IgKGNvbnN0IHsgc3BlYywgY291bnQgfSBvZiBPYmplY3QudmFsdWVzKGluaGVyaXRlZE9wdGlvbmFsUHJvcHMpKSB7XG4gICAgICBpZiAoY291bnQgPCAyIHx8IGxvY2FsUHJvcHMuaGFzKHNwZWMubmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLm9uSW50ZXJmYWNlUHJvcGVydHkoaWZjLCBzcGVjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhbGxPcHRpb25hbFByb3BzKHRoaXM6IEphdmFHZW5lcmF0b3IsIGZxbjogc3RyaW5nKSB7XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5maW5kVHlwZShmcW4pIGFzIHNwZWMuSW50ZXJmYWNlVHlwZTtcbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3BlYy5Qcm9wZXJ0eT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiB0eXBlLnByb3BlcnRpZXMgPz8gW10pIHtcbiAgICAgICAgLy8gQWRkaW5nIGFydGlmaWNhbCBcIm92ZXJyaWRlc1wiIGhlcmUgZm9yIGNvZGUtZ2VuIHF1YWxpdHkncyBzYWtlLlxuICAgICAgICByZXN1bHRbcHJvcC5uYW1lXSA9IHsgLi4ucHJvcCwgb3ZlcnJpZGVzOiB0eXBlLmZxbiB9O1xuICAgICAgfVxuICAgICAgLy8gSW5jbHVkZSBvcHRpb25hbCBwcm9wZXJ0aWVzIG9mIGFsbCBzdXBlciBpbnRlcmZhY2VzIGluIHRoZSByZXN1bHRcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiB0eXBlLmludGVyZmFjZXMgPz8gW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgcHJvcF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgYWxsT3B0aW9uYWxQcm9wcy5jYWxsKHRoaXMsIGJhc2UpLFxuICAgICAgICApKSB7XG4gICAgICAgICAgaWYgKCEobmFtZSBpbiByZXN1bHQpKSB7XG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBwcm9wO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRBc3NlbWJseVBhY2thZ2VJbmZvKG1vZDogc3BlYy5Bc3NlbWJseSkge1xuICAgIGlmICghbW9kLmRvY3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lIH0gPSB0aGlzLnRvTmF0aXZlTmFtZShtb2QpO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvRmlsZSA9IHRoaXMudG9KYXZhRmlsZVBhdGgoXG4gICAgICBtb2QsXG4gICAgICBgJHttb2QubmFtZX0ucGFja2FnZS1pbmZvYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICBpZiAobW9kLnJlYWRtZSkge1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG1hcmtEb3duVG9KYXZhRG9jKFxuICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihtb2QucmVhZG1lLm1hcmtkb3duKSxcbiAgICAgICkuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGAgKiAke2xpbmUucmVwbGFjZSgvXFwqXFwvL2csICcqe0BsaXRlcmFsIC99Jyl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2QuZG9jcy5kZXByZWNhdGVkKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnIConKTtcbiAgICAgIC8vIEphdmFjIHdvbid0IGFsbG93IEBkZXByZWNhdGVkIG9uIHBhY2thZ2VzLCB3aGlsZSBARGVwcmVjYXRlZCBpcyBhYWFhYnNvbHV0ZWx5IGZpbmUuIER1aC5cbiAgICAgIHRoaXMuY29kZS5saW5lKGAgKiBEZXByZWNhdGVkOiAke21vZC5kb2NzLmRlcHJlY2F0ZWR9YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtb2QpO1xuICAgIHRoaXMuY29kZS5saW5lKGBwYWNrYWdlICR7cGFja2FnZU5hbWV9O2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUocGFja2FnZUluZm9GaWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN1Ym1vZHVsZVBhY2thZ2VJbmZvKGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5LCBtb2R1bGVGcW46IHN0cmluZykge1xuICAgIGNvbnN0IG1vZCA9IGFzc2VtYmx5LnN1Ym1vZHVsZXM/Llttb2R1bGVGcW5dO1xuICAgIGlmICghbW9kPy5yZWFkbWU/Lm1hcmtkb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYWNrYWdlTmFtZSB9ID0gdHJhbnNsYXRlRnFuKGFzc2VtYmx5LCBtb2R1bGVGcW4pO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvRmlsZSA9IHRoaXMudG9KYXZhRmlsZVBhdGgoXG4gICAgICBhc3NlbWJseSxcbiAgICAgIGAke21vZHVsZUZxbn0ucGFja2FnZS1pbmZvYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICBpZiAobW9kLnJlYWRtZSkge1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG1hcmtEb3duVG9KYXZhRG9jKFxuICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihtb2QucmVhZG1lLm1hcmtkb3duKSxcbiAgICAgICkuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGAgKiAke2xpbmUucmVwbGFjZSgvXFwqXFwvL2csICcqe0BsaXRlcmFsIC99Jyl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmNvZGUubGluZShgcGFja2FnZSAke3BhY2thZ2VOYW1lfTtgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VGaWxlKHBhY2thZ2VJbmZvRmlsZSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRNYXZlblBvbShhc3NtOiBzcGVjLkFzc2VtYmx5LCBmaW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIGlmICghYXNzbS50YXJnZXRzPy5qYXZhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzc2VtYmx5ICR7YXNzbS5uYW1lfSBkb2VzIG5vdCBkZWNsYXJlIGEgamF2YSB0YXJnZXRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tZW50ID0gZmluZ2VycHJpbnRcbiAgICAgID8ge1xuICAgICAgICAgICcjY29tbWVudCc6IFtcbiAgICAgICAgICAgIGBHZW5lcmF0ZWQgYnkganNpaS1wYWNtYWtAJHtWRVJTSU9OX0RFU0N9IG9uICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWAsXG4gICAgICAgICAgICBgQGpzaWktcGFjbWFrOm1ldGFAICR7SlNPTi5zdHJpbmdpZnkodGhpcy5tZXRhZGF0YSl9YCxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgICA6IHt9O1xuXG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKCdwb20ueG1sJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICB4bWxidWlsZGVyXG4gICAgICAgIC5jcmVhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvamVjdDoge1xuICAgICAgICAgICAgICAnQHhtbG5zJzogJ2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCcsXG4gICAgICAgICAgICAgICdAeG1sbnM6eHNpJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyxcbiAgICAgICAgICAgICAgJ0B4c2k6c2NoZW1hTG9jYXRpb24nOlxuICAgICAgICAgICAgICAgICdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCcsXG5cbiAgICAgICAgICAgICAgLi4uY29tbWVudCxcblxuICAgICAgICAgICAgICBtb2RlbFZlcnNpb246ICc0LjAuMCcsXG4gICAgICAgICAgICAgIG5hbWU6ICcke3Byb2plY3QuZ3JvdXBJZH06JHtwcm9qZWN0LmFydGlmYWN0SWR9JyxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGFzc20uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIHVybDogYXNzbS5ob21lcGFnZSxcblxuICAgICAgICAgICAgICBsaWNlbnNlczoge1xuICAgICAgICAgICAgICAgIGxpY2Vuc2U6IGdldExpY2Vuc2UoKSxcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBkZXZlbG9wZXJzOiB7XG4gICAgICAgICAgICAgICAgZGV2ZWxvcGVyOiBtYXZlbkRldmVsb3BlcnMoKSxcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBzY206IHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBgc2NtOiR7YXNzbS5yZXBvc2l0b3J5LnR5cGV9OiR7YXNzbS5yZXBvc2l0b3J5LnVybH1gLFxuICAgICAgICAgICAgICAgIHVybDogYXNzbS5yZXBvc2l0b3J5LnVybCxcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBncm91cElkOiBhc3NtLnRhcmdldHMuamF2YS5tYXZlbi5ncm91cElkLFxuICAgICAgICAgICAgICBhcnRpZmFjdElkOiBhc3NtLnRhcmdldHMuamF2YS5tYXZlbi5hcnRpZmFjdElkLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiBtYWtlVmVyc2lvbihcbiAgICAgICAgICAgICAgICBhc3NtLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgYXNzbS50YXJnZXRzLmphdmEubWF2ZW4udmVyc2lvblN1ZmZpeCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgcGFja2FnaW5nOiAnamFyJyxcblxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7ICdwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nJzogJ1VURi04JyB9LFxuXG4gICAgICAgICAgICAgIGRlcGVuZGVuY2llczogeyBkZXBlbmRlbmN5OiBtYXZlbkRlcGVuZGVuY2llcy5jYWxsKHRoaXMpIH0sXG5cbiAgICAgICAgICAgICAgYnVpbGQ6IHtcbiAgICAgICAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICAgICAgICBwbHVnaW46IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICdtYXZlbi1jb21waWxlci1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczLjguMScsXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogeyBzb3VyY2U6ICcxLjgnLCB0YXJnZXQ6ICcxLjgnIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAnbWF2ZW4tamFyLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzMuMi4wJyxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucycsXG4gICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ21hdmVuLXNvdXJjZS1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczLjIuMScsXG4gICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnYXR0YWNoLXNvdXJjZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnb2FsczogeyBnb2FsOiAnamFyJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucycsXG4gICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ21hdmVuLWphdmFkb2MtcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMy4yLjAnLFxuICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2F0dGFjaC1qYXZhZG9jcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdvYWxzOiB7IGdvYWw6ICdqYXInIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbE9uRXJyb3I6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdzogJ3Byb3RlY3RlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlRXhjbHVkZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhjbHVkaW5nIHRoZSAkTW9kdWxlIGNsYXNzZXMgc28gdGhleSB3b24ndCBwb2xsdXRlIHRoZSBkb2NzaXRlLiBUaGV5IG90aGVyd2lzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgYWxsIGNvbGxlY3RlZCBhdCB0aGUgdG9wIG9mIHRoZSBjbGFzc2xpc3QsIGJ1cnJ5aW5nIHVzZWZ1bCBpbmZvcm1hdGlvbiB1bmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGxvdCBvZiBkcnkgc2Nyb2xsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyoqLyRNb2R1bGUuamF2YSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZGluZyB0aGVzZSBtYWtlcyBKYXZhRG9jIGdlbmVyYXRpb24gYWJvdXQgYSAzcmQgZmFzdGVyICh3aGljaCBpcyBmYXIgYW5kIGF3YXkgdGhlIG1vc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVuc2l2ZSBwYXJ0IG9mIHRoZSBidWlsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxKT3B0aW9uOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICctSi1YWDorVGllcmVkQ29tcGlsYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnLUotWFg6VGllcmVkU3RvcEF0TGV2ZWw9MScsXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAnbWF2ZW4tZW5mb3JjZXItcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMy4wLjAtTTMnLFxuICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2VuZm9yY2UtbWF2ZW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnb2FsczogeyBnb2FsOiAnZW5mb3JjZScgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTWF2ZW5WZXJzaW9uOiB7IHZlcnNpb246ICczLjYnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuY29kZWhhdXMubW9qbycsXG4gICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ3ZlcnNpb25zLW1hdmVuLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzIuOC4xJyxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJhY2t1cFBvbXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBlbmNvZGluZzogJ1VURi04JyB9LFxuICAgICAgICApXG4gICAgICAgIC5lbmQoeyBwcmV0dHk6IHRydWUgfSksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VGaWxlKCdwb20ueG1sJyk7XG5cbiAgICAvKipcbiAgICAgKiBDb21iaW5lcyBhIHZlcnNpb24gbnVtYmVyIHdpdGggYW4gb3B0aW9uYWwgc3VmZml4LiBUaGUgc3VmZml4LCB3aGVuIHByZXNlbnQsIG11c3QgYmVnaW4gd2l0aFxuICAgICAqICctJyBvciAnLicsIGFuZCB3aWxsIGJlIGNvbmNhdGVuYXRlZCBhcy1pcyB0byB0aGUgdmVyc2lvbiBudW1iZXIuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyXG4gICAgICogQHBhcmFtIHN1ZmZpeCAgdGhlIHN1ZmZpeCwgaWYgYW55LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1ha2VWZXJzaW9uKHZlcnNpb246IHN0cmluZywgc3VmZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIGlmICghc3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0b1JlbGVhc2VWZXJzaW9uKHZlcnNpb24sIFRhcmdldE5hbWUuSkFWQSk7XG4gICAgICB9XG4gICAgICBpZiAoIXN1ZmZpeC5zdGFydHNXaXRoKCctJykgJiYgIXN1ZmZpeC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2ZXJzaW9uU3VmZml4IG11c3Qgc3RhcnQgd2l0aCAnLScgb3IgJy4nLCBidXQgcmVjZWl2ZWQgJHtzdWZmaXh9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHt2ZXJzaW9ufSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF2ZW5EZXBlbmRlbmNpZXModGhpczogSmF2YUdlbmVyYXRvcikge1xuICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5PE1hdmVuRGVwZW5kZW5jeT4oKTtcbiAgICAgIGZvciAoY29uc3QgW2RlcE5hbWUsIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICB0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY2llcyA/PyB7fSxcbiAgICAgICkpIHtcbiAgICAgICAgY29uc3QgZGVwID0gdGhpcy5hc3NlbWJseS5kZXBlbmRlbmN5Q2xvc3VyZT8uW2RlcE5hbWVdO1xuICAgICAgICBpZiAoIWRlcD8udGFyZ2V0cz8uamF2YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBc3NlbWJseSAke2Fzc20ubmFtZX0gZGVwZW5kcyBvbiAke2RlcE5hbWV9LCB3aGljaCBkb2VzIG5vdCBkZWNsYXJlIGEgamF2YSB0YXJnZXRgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goe1xuICAgICAgICAgIGdyb3VwSWQ6IGRlcC50YXJnZXRzLmphdmEubWF2ZW4uZ3JvdXBJZCxcbiAgICAgICAgICBhcnRpZmFjdElkOiBkZXAudGFyZ2V0cy5qYXZhLm1hdmVuLmFydGlmYWN0SWQsXG4gICAgICAgICAgdmVyc2lvbjogdG9NYXZlblZlcnNpb25SYW5nZShcbiAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICBkZXAudGFyZ2V0cy5qYXZhLm1hdmVuLnZlcnNpb25TdWZmaXgsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgSlNJSSBqYXZhIHJ1bnRpbWUgYmFzZSBjbGFzc2VzXG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh7XG4gICAgICAgIGdyb3VwSWQ6ICdzb2Z0d2FyZS5hbWF6b24uanNpaScsXG4gICAgICAgIGFydGlmYWN0SWQ6ICdqc2lpLXJ1bnRpbWUnLFxuICAgICAgICB2ZXJzaW9uOiB0b01hdmVuVmVyc2lvblJhbmdlKGBeJHtWRVJTSU9OfWApLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb3ZpZGVzIEBvcmcuamV0YnJhaW5zLipcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHtcbiAgICAgICAgZ3JvdXBJZDogJ29yZy5qZXRicmFpbnMnLFxuICAgICAgICBhcnRpZmFjdElkOiAnYW5ub3RhdGlvbnMnLFxuICAgICAgICB2ZXJzaW9uOiAnWzE2LjAuMywyMC4wLjApJyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm92aWRlcyBAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQgZm9yIEpES3MgPj0gOVxuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goe1xuICAgICAgICAnI2NvbW1lbnQnOiAnUHJvdmlkZXMgQGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkIGZvciBKREtzID49IDknLFxuICAgICAgICBncm91cElkOiAnamF2YXguYW5ub3RhdGlvbicsXG4gICAgICAgIGFydGlmYWN0SWQ6ICdqYXZheC5hbm5vdGF0aW9uLWFwaScsXG4gICAgICAgIHZlcnNpb246ICdbMS4zLjIsMS40LjApJyxcbiAgICAgICAgc2NvcGU6ICdjb21waWxlJyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGVwZW5kZW5jaWVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdmVuRGV2ZWxvcGVycygpIHtcbiAgICAgIHJldHVybiBbYXNzbS5hdXRob3IsIC4uLihhc3NtLmNvbnRyaWJ1dG9ycyA/PyBbXSldLm1hcCh0b0RldmVsb3Blcik7XG5cbiAgICAgIGZ1bmN0aW9uIHRvRGV2ZWxvcGVyKHBlcnNvbjogc3BlYy5QZXJzb24pIHtcbiAgICAgICAgY29uc3QgZGV2ZWxvcGVyOiBhbnkgPSB7XG4gICAgICAgICAgW3BlcnNvbi5vcmdhbml6YXRpb24gPyAnb3JnYW5pemF0aW9uJyA6ICduYW1lJ106IHBlcnNvbi5uYW1lLFxuICAgICAgICAgIHJvbGVzOiB7IHJvbGU6IHBlcnNvbi5yb2xlcyB9LFxuICAgICAgICB9O1xuICAgICAgICAvLyBXZSBjYW5ub3Qgc2V0IFwidW5kZWZpbmVkXCIgb3IgXCJudWxsXCIgdG8gYSBmaWVsZCAtIHRoaXMgY2F1c2VzIGludmFsaWQgWE1MIHRvIGJlIGVtaXR0ZWQgKHBlciBQT00gc2NoZW1hKS5cbiAgICAgICAgaWYgKHBlcnNvbi5lbWFpbCkge1xuICAgICAgICAgIGRldmVsb3Blci5lbWFpbCA9IHBlcnNvbi5lbWFpbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVyc29uLnVybCkge1xuICAgICAgICAgIGRldmVsb3BlcltwZXJzb24ub3JnYW5pemF0aW9uID8gJ29yZ2FuaXphdGlvblVybCcgOiAndXJsJ10gPVxuICAgICAgICAgICAgcGVyc29uLnVybDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGV2ZWxvcGVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWF2ZW4tc3R5bGUgbGljZW5zZSBibG9jayBmb3IgYSB0aGUgYXNzZW1ibHkuXG4gICAgICogQHNlZSBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvcG9tLmh0bWwjTGljZW5zZXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRMaWNlbnNlKCkge1xuICAgICAgY29uc3Qgc3BkeCA9IHNwZHhMaWNlbnNlTGlzdFthc3NtLmxpY2Vuc2VdO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc3BkeCAmJiB7XG4gICAgICAgICAgbmFtZTogc3BkeC5uYW1lLFxuICAgICAgICAgIHVybDogc3BkeC51cmwsXG4gICAgICAgICAgZGlzdHJpYnV0aW9uOiAncmVwbycsXG4gICAgICAgICAgY29tbWVudHM6IHNwZHgub3NpQXBwcm92ZWQgPyAnQW4gT1NJLWFwcHJvdmVkIGxpY2Vuc2UnIDogdW5kZWZpbmVkLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YXRpY0luaXRpYWxpemVyKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICBjb25zdCBjb25zdHMgPSAoY2xzLnByb3BlcnRpZXMgPz8gW10pLmZpbHRlcigoeCkgPT4geC5jb25zdCk7XG4gICAgaWYgKGNvbnN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBqYXZhQ2xhc3MgPSB0aGlzLnRvSmF2YVR5cGUoY2xzKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnc3RhdGljJyk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgY29uc3RzKSB7XG4gICAgICBjb25zdCBjb25zdE5hbWUgPSB0aGlzLnJlbmRlckNvbnN0TmFtZShwcm9wKTtcbiAgICAgIGNvbnN0IHByb3BUeXBlID0gdGhpcy50b05hdGl2ZVR5cGUocHJvcC50eXBlLCB7IGZvck1hcnNoYWxsaW5nOiB0cnVlIH0pO1xuICAgICAgY29uc3Qgc3RhdGVtZW50ID0gYHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuanNpaVN0YXRpY0dldCgke2phdmFDbGFzc30uY2xhc3MsIFwiJHtwcm9wLm5hbWV9XCIsICR7cHJvcFR5cGV9KWA7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYCR7Y29uc3ROYW1lfSA9ICR7dGhpcy53cmFwQ29sbGVjdGlvbihcbiAgICAgICAgICBzdGF0ZW1lbnQsXG4gICAgICAgICAgcHJvcC50eXBlLFxuICAgICAgICAgIHByb3Aub3B0aW9uYWwsXG4gICAgICAgICl9O2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNvbnN0TmFtZShwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuY29kZS50b1NuYWtlQ2FzZShwcm9wLm5hbWUpLnRvTG9jYWxlVXBwZXJDYXNlKCk7IC8vIGphdmEgY29uc3RzIGFyZSBTTkFLRV9VUFBFUl9DQVNFXG4gIH1cblxuICBwcml2YXRlIGVtaXRDb25zdFByb3BlcnR5KHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBjb25zdCBwcm9wVHlwZSA9IHRoaXMudG9KYXZhVHlwZShwcm9wLnR5cGUpO1xuICAgIGNvbnN0IHByb3BOYW1lID0gdGhpcy5yZW5kZXJDb25zdE5hbWUocHJvcCk7XG4gICAgY29uc3QgYWNjZXNzID0gdGhpcy5yZW5kZXJBY2Nlc3NMZXZlbChwcm9wKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wKTtcbiAgICB0aGlzLmNvZGUubGluZShgJHthY2Nlc3N9IGZpbmFsIHN0YXRpYyAke3Byb3BUeXBlfSAke3Byb3BOYW1lfTtgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFByb3BlcnR5KFxuICAgIGNsczogc3BlYy5UeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAge1xuICAgICAgZGVmYXVsdEltcGwgPSBmYWxzZSxcbiAgICAgIGZpbmFsID0gZmFsc2UsXG4gICAgICBpbmNsdWRlR2V0dGVyID0gdHJ1ZSxcbiAgICAgIG92ZXJyaWRlcyA9ICEhcHJvcC5vdmVycmlkZXMsXG4gICAgfToge1xuICAgICAgZGVmYXVsdEltcGw/OiBib29sZWFuO1xuICAgICAgZmluYWw/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZUdldHRlcj86IGJvb2xlYW47XG4gICAgICBvdmVycmlkZXM/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgZ2V0dGVyVHlwZSA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShwcm9wKTtcbiAgICBjb25zdCBzZXR0ZXJUeXBlcyA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZXMocHJvcCwge1xuICAgICAgY292YXJpYW50OiBwcm9wLnN0YXRpYyxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IGpzaWlUb1Bhc2NhbENhc2UoXG4gICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKHByb3AubmFtZSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGlmaWVycyA9IFtkZWZhdWx0SW1wbCA/ICdkZWZhdWx0JyA6IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwocHJvcCldO1xuICAgIGlmIChwcm9wLnN0YXRpYykgbW9kaWZpZXJzLnB1c2goJ3N0YXRpYycpO1xuICAgIGlmIChwcm9wLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2Fic3RyYWN0Jyk7XG4gICAgaWYgKGZpbmFsICYmICFwcm9wLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2ZpbmFsJyk7XG5cbiAgICBjb25zdCBqYXZhQ2xhc3MgPSB0aGlzLnRvSmF2YVR5cGUoY2xzKTtcblxuICAgIC8vIGZvciB1bmlvbnMgd2Ugb25seSBnZW5lcmF0ZSBvdmVybG9hZHMgZm9yIHNldHRlcnMsIG5vdCBnZXR0ZXJzLlxuICAgIGlmIChpbmNsdWRlR2V0dGVyKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wKTtcbiAgICAgIGlmIChvdmVycmlkZXMgJiYgIXByb3Auc3RhdGljKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3ApO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYCR7bW9kaWZpZXJzLmpvaW4oJyAnKX0gJHtnZXR0ZXJUeXBlfSBnZXQke3Byb3BOYW1lfSgpYDtcbiAgICAgIGlmIChwcm9wLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkge1xuICAgICAgICB0aGlzLmNvZGUubGluZShgJHtzaWduYXR1cmV9O2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhzaWduYXR1cmUpO1xuICAgICAgICBsZXQgc3RhdGVtZW50O1xuICAgICAgICBpZiAocHJvcC5zdGF0aWMpIHtcbiAgICAgICAgICBzdGF0ZW1lbnQgPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5qc2lpU3RhdGljR2V0KCR7dGhpcy50b0phdmFUeXBlKFxuICAgICAgICAgICAgY2xzLFxuICAgICAgICAgICl9LmNsYXNzLCBgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlbWVudCA9ICdzb2Z0d2FyZS5hbWF6b24uanNpaS5LZXJuZWwuZ2V0KHRoaXMsICc7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZW1lbnQgKz0gYFwiJHtwcm9wLm5hbWV9XCIsICR7dGhpcy50b05hdGl2ZVR5cGUocHJvcC50eXBlLCB7XG4gICAgICAgICAgZm9yTWFyc2hhbGxpbmc6IHRydWUsXG4gICAgICAgIH0pfSlgO1xuXG4gICAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICAgIGByZXR1cm4gJHt0aGlzLndyYXBDb2xsZWN0aW9uKHN0YXRlbWVudCwgcHJvcC50eXBlLCBwcm9wLm9wdGlvbmFsKX07YCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXByb3AuaW1tdXRhYmxlKSB7XG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2Ygc2V0dGVyVHlwZXMpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlcyAmJiAhcHJvcC5zdGF0aWMpIHtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMocHJvcCk7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke21vZGlmaWVycy5qb2luKFxuICAgICAgICAgICcgJyxcbiAgICAgICAgKX0gdm9pZCBzZXQke3Byb3BOYW1lfShmaW5hbCAke3R5cGV9IHZhbHVlKWA7XG4gICAgICAgIGlmIChwcm9wLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkge1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKGAke3NpZ25hdHVyZX07YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhzaWduYXR1cmUpO1xuICAgICAgICAgIGxldCBzdGF0ZW1lbnQgPSAnJztcblxuICAgICAgICAgIGlmIChwcm9wLnN0YXRpYykge1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9IGBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LmpzaWlTdGF0aWNTZXQoJHtqYXZhQ2xhc3N9LmNsYXNzLCBgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ3NvZnR3YXJlLmFtYXpvbi5qc2lpLktlcm5lbC5zZXQodGhpcywgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9wLm9wdGlvbmFsXG4gICAgICAgICAgICA/ICd2YWx1ZSdcbiAgICAgICAgICAgIDogYGphdmEudXRpbC5PYmplY3RzLnJlcXVpcmVOb25OdWxsKHZhbHVlLCBcIiR7cHJvcC5uYW1lfSBpcyByZXF1aXJlZFwiKWA7XG4gICAgICAgICAgc3RhdGVtZW50ICs9IGBcIiR7cHJvcC5uYW1lfVwiLCAke3ZhbHVlfSk7YDtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShzdGF0ZW1lbnQpO1xuICAgICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRNZXRob2QoXG4gICAgY2xzOiBzcGVjLlR5cGUsXG4gICAgbWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgICB7XG4gICAgICBkZWZhdWx0SW1wbCA9IGZhbHNlLFxuICAgICAgZmluYWwgPSBmYWxzZSxcbiAgICAgIG92ZXJyaWRlcyA9ICEhbWV0aG9kLm92ZXJyaWRlcyxcbiAgICB9OiB7IGRlZmF1bHRJbXBsPzogYm9vbGVhbjsgZmluYWw/OiBib29sZWFuOyBvdmVycmlkZXM/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1ldGhvZC5yZXR1cm5zXG4gICAgICA/IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShtZXRob2QucmV0dXJucylcbiAgICAgIDogJ3ZvaWQnO1xuXG4gICAgY29uc3QgbW9kaWZpZXJzID0gW1xuICAgICAgZGVmYXVsdEltcGwgPyAnZGVmYXVsdCcgOiB0aGlzLnJlbmRlckFjY2Vzc0xldmVsKG1ldGhvZCksXG4gICAgXTtcbiAgICBpZiAobWV0aG9kLnN0YXRpYykgbW9kaWZpZXJzLnB1c2goJ3N0YXRpYycpO1xuICAgIGlmIChtZXRob2QuYWJzdHJhY3QgJiYgIWRlZmF1bHRJbXBsKSBtb2RpZmllcnMucHVzaCgnYWJzdHJhY3QnKTtcbiAgICBpZiAoZmluYWwgJiYgIW1ldGhvZC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIG1vZGlmaWVycy5wdXNoKCdmaW5hbCcpO1xuXG4gICAgY29uc3QgYXN5bmMgPSAhIW1ldGhvZC5hc3luYztcbiAgICBjb25zdCBtZXRob2ROYW1lID0gSmF2YUdlbmVyYXRvci5zYWZlSmF2YU1ldGhvZE5hbWUobWV0aG9kLm5hbWUpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke3JldHVyblR5cGV9ICR7bWV0aG9kTmFtZX0oJHt0aGlzLnJlbmRlck1ldGhvZFBhcmFtZXRlcnMoXG4gICAgICBtZXRob2QsXG4gICAgKX0pYDtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuYWRkSmF2YURvY3MobWV0aG9kKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtZXRob2QpO1xuICAgIGlmIChvdmVycmlkZXMgJiYgIW1ldGhvZC5zdGF0aWMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICB9XG4gICAgaWYgKG1ldGhvZC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke21vZGlmaWVycy5qb2luKCcgJyl9ICR7c2lnbmF0dXJlfTtgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgJHttb2RpZmllcnMuam9pbignICcpfSAke3NpZ25hdHVyZX1gKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKHRoaXMucmVuZGVyTWV0aG9kQ2FsbChjbHMsIG1ldGhvZCwgYXN5bmMpKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdlIGFyZSBub3cgZ29pbmcgdG8gYnVpbGQgYSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHVudHlwZWRcbiAgICogamF2YXNjcmlwdCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiB3ZSB3YW50IGphdmEgY29kZSB0byBiZVxuICAgKiBhYmxlIHRvIGludGVyYWN0IHdpdGggdGhlbSwgc28gd2Ugd2lsbCBjcmVhdGUgYSBwcm94eSBjbGFzcyB3aGljaFxuICAgKiBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIGFuZCBoYXMgdGhlIHNhbWUgbWV0aG9kcy5cbiAgICpcbiAgICogVGhlc2UgcHJveGllcyBhcmUgYWxzbyB1c2VkIHRvIGV4dGVuZCBhYnN0cmFjdCBjbGFzc2VzIHRvIGFsbG93IHRoZSBKU0lJXG4gICAqIGVuZ2luZSB0byBpbnN0YW50aWF0ZSBhbiBhYnN0cmFjdCBjbGFzcyBpbiBKYXZhLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UHJveHkodHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlIHwgcmVmbGVjdC5DbGFzc1R5cGUpIHtcbiAgICBjb25zdCBuYW1lID0gSU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUU7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgKiBBIHByb3h5IGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgYSBjb25jcmV0ZSBqYXZhc2NyaXB0IGluc3RhbmNlIG9mIHRoaXMgdHlwZS4nLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuXG4gICAgY29uc3QgYmFzZUludGVyZmFjZXMgPSB0aGlzLmRlZmF1bHRJbnRlcmZhY2VzRm9yKHR5cGUsIHtcbiAgICAgIGluY2x1ZGVUaGlzVHlwZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSgpICYmICFoYXNEZWZhdWx0SW50ZXJmYWNlcyh0eXBlLmFzc2VtYmx5KSkge1xuICAgICAgLy8gRXh0ZW5kIHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5IHNpbmNlIHRoaXMgbW9kdWxlIGRvZXMgbm90IGhhdmUgdGhlIEpzaWkkRGVmYXVsdFxuICAgICAgYmFzZUludGVyZmFjZXMucHVzaCh0aGlzLnRvTmF0aXZlRnFuKHR5cGUuZnFuKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VmZml4ID0gdHlwZS5pc0ludGVyZmFjZVR5cGUoKVxuICAgICAgPyBgZXh0ZW5kcyBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0IGltcGxlbWVudHMgJHtiYXNlSW50ZXJmYWNlcy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9YFxuICAgICAgOiBgZXh0ZW5kcyAke3RoaXMudG9OYXRpdmVGcW4odHlwZS5mcW4pfSR7XG4gICAgICAgICAgYmFzZUludGVyZmFjZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBgIGltcGxlbWVudHMgJHtiYXNlSW50ZXJmYWNlcy5qb2luKCcsICcpfWBcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgfWA7XG5cbiAgICBjb25zdCBtb2RpZmllcnMgPSB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpID8gJ2ZpbmFsJyA6ICdwcml2YXRlIHN0YXRpYyBmaW5hbCc7XG5cbiAgICB0aGlzLmNvZGUubGluZShBTk5fSU5URVJOQUwpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYCR7bW9kaWZpZXJzfSBjbGFzcyAke25hbWV9ICR7c3VmZml4fWApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7bmFtZX0oZmluYWwgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdFJlZiBvYmpSZWYpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihvYmpSZWYpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBlbWl0IGFsbCBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCByZWZsZWN0UHJvcCBvZiB0eXBlLmFsbFByb3BlcnRpZXMuZmlsdGVyKFxuICAgICAgKHByb3ApID0+XG4gICAgICAgIHByb3AuYWJzdHJhY3QgJiZcbiAgICAgICAgKHByb3AucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgcHJvcC5wYXJlbnRUeXBlLmlzQ2xhc3NUeXBlKCkgfHxcbiAgICAgICAgICAhaGFzRGVmYXVsdEludGVyZmFjZXMocHJvcC5hc3NlbWJseSkpLFxuICAgICkpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjbG9uZShyZWZsZWN0UHJvcC5zcGVjKTtcbiAgICAgIHByb3AuYWJzdHJhY3QgPSBmYWxzZTtcbiAgICAgIC8vIEVtaXR0aW5nIFwiZmluYWxcIiBzaW5jZSB0aGlzIGlzIGEgcHJveHkgYW5kIG5vdGhpbmcgd2lsbC9zaG91bGQgb3ZlcnJpZGUgdGhpc1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkodHlwZS5zcGVjLCBwcm9wLCB7IGZpbmFsOiB0cnVlLCBvdmVycmlkZXM6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gZW1pdCBhbGwgdGhlIG1ldGhvZHNcbiAgICBmb3IgKGNvbnN0IHJlZmxlY3RNZXRob2Qgb2YgdHlwZS5hbGxNZXRob2RzLmZpbHRlcihcbiAgICAgIChtZXRob2QpID0+XG4gICAgICAgIG1ldGhvZC5hYnN0cmFjdCAmJlxuICAgICAgICAobWV0aG9kLnBhcmVudFR5cGUuZnFuID09PSB0eXBlLmZxbiB8fFxuICAgICAgICAgIG1ldGhvZC5wYXJlbnRUeXBlLmlzQ2xhc3NUeXBlKCkgfHxcbiAgICAgICAgICAhaGFzRGVmYXVsdEludGVyZmFjZXMobWV0aG9kLmFzc2VtYmx5KSksXG4gICAgKSkge1xuICAgICAgY29uc3QgbWV0aG9kID0gY2xvbmUocmVmbGVjdE1ldGhvZC5zcGVjKTtcbiAgICAgIG1ldGhvZC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgLy8gRW1pdHRpbmcgXCJmaW5hbFwiIHNpbmNlIHRoaXMgaXMgYSBwcm94eSBhbmQgbm90aGluZyB3aWxsL3Nob3VsZCBvdmVycmlkZSB0aGlzXG4gICAgICB0aGlzLmVtaXRNZXRob2QodHlwZS5zcGVjLCBtZXRob2QsIHsgZmluYWw6IHRydWUsIG92ZXJyaWRlczogdHJ1ZSB9KTtcblxuICAgICAgZm9yIChjb25zdCBvdmVybG9hZGVkTWV0aG9kIG9mIHRoaXMuY3JlYXRlT3ZlcmxvYWRzRm9yT3B0aW9uYWxzKG1ldGhvZCkpIHtcbiAgICAgICAgb3ZlcmxvYWRlZE1ldGhvZC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXRNZXRob2QodHlwZS5zcGVjLCBvdmVybG9hZGVkTWV0aG9kLCB7XG4gICAgICAgICAgZmluYWw6IHRydWUsXG4gICAgICAgICAgb3ZlcnJpZGVzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGVmYXVsdEltcGxlbWVudGF0aW9uKHR5cGU6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSkge1xuICAgIGNvbnN0IGJhc2VJbnRlcmZhY2VzID0gW3R5cGUubmFtZSwgLi4udGhpcy5kZWZhdWx0SW50ZXJmYWNlc0Zvcih0eXBlKV07XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiBJbnRlcm5hbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgJHt0eXBlLm5hbWV9fS5gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBpbnRlcmZhY2UgJHtJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FfSBleHRlbmRzICR7YmFzZUludGVyZmFjZXNcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHR5cGUuYWxsUHJvcGVydGllcy5maWx0ZXIoXG4gICAgICAocHJvcCkgPT5cbiAgICAgICAgcHJvcC5hYnN0cmFjdCAmJlxuICAgICAgICAvLyBPbmx5IGNoZWNraW5nIHRoZSBnZXR0ZXIgLSBqYXZhLmxhbmcuT2JqZWN0IGhhcyBubyBzZXR0ZXJzLlxuICAgICAgICAhaXNKYXZhTGFuZ09iamVjdE1ldGhvZE5hbWUoYGdldCR7anNpaVRvUGFzY2FsQ2FzZShwcm9wLm5hbWUpfWApICYmXG4gICAgICAgIChwcm9wLnBhcmVudFR5cGUuZnFuID09PSB0eXBlLmZxbiB8fFxuICAgICAgICAgICFoYXNEZWZhdWx0SW50ZXJmYWNlcyhwcm9wLmFzc2VtYmx5KSksXG4gICAgKSkge1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkodHlwZS5zcGVjLCBwcm9wZXJ0eS5zcGVjLCB7XG4gICAgICAgIGRlZmF1bHRJbXBsOiB0cnVlLFxuICAgICAgICBvdmVycmlkZXM6IHR5cGUuaXNJbnRlcmZhY2VUeXBlKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgdHlwZS5hbGxNZXRob2RzLmZpbHRlcihcbiAgICAgIChtZXRob2QpID0+XG4gICAgICAgIG1ldGhvZC5hYnN0cmFjdCAmJlxuICAgICAgICAhaXNKYXZhTGFuZ09iamVjdE1ldGhvZE5hbWUobWV0aG9kLm5hbWUpICYmXG4gICAgICAgIChtZXRob2QucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgIWhhc0RlZmF1bHRJbnRlcmZhY2VzKG1ldGhvZC5hc3NlbWJseSkpLFxuICAgICkpIHtcbiAgICAgIHRoaXMuZW1pdE1ldGhvZCh0eXBlLnNwZWMsIG1ldGhvZC5zcGVjLCB7XG4gICAgICAgIGRlZmF1bHRJbXBsOiB0cnVlLFxuICAgICAgICBvdmVycmlkZXM6IHR5cGUuaXNJbnRlcmZhY2VUeXBlKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGVudGl0eTogc3BlYy5Eb2N1bWVudGFibGUpIHtcbiAgICBpZiAoIWVudGl0eS5kb2NzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbnRpdHkuZG9jcy5zdGFiaWxpdHkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLlN0YWJpbGl0eShzb2Z0d2FyZS5hbWF6b24uanNpaS5TdGFiaWxpdHkuTGV2ZWwuJHtfbGV2ZWwoXG4gICAgICAgICAgZW50aXR5LmRvY3Muc3RhYmlsaXR5LFxuICAgICAgICApfSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZW50aXR5LmRvY3Muc3RhYmlsaXR5ID09PSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkIHx8XG4gICAgICBlbnRpdHkuZG9jcy5kZXByZWNhdGVkXG4gICAgKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQERlcHJlY2F0ZWQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfbGV2ZWwoc3RhYmlsaXR5OiBzcGVjLlN0YWJpbGl0eSk6IHN0cmluZyB7XG4gICAgICBzd2l0Y2ggKHN0YWJpbGl0eSkge1xuICAgICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQ6XG4gICAgICAgICAgcmV0dXJuICdEZXByZWNhdGVkJztcbiAgICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw6XG4gICAgICAgICAgcmV0dXJuICdFeHBlcmltZW50YWwnO1xuICAgICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkV4dGVybmFsOlxuICAgICAgICAgIC8vIFJlbmRlcmluZyAnRXh0ZXJuYWwnIG91dCBhcyBwdWJsaWNseSB2aXNpYmxlIHN0YXRlIGlzIGNvbmZ1c2luZy4gQXMgZmFyXG4gICAgICAgICAgLy8gYXMgdXNlcnMgYXJlIGNvbmNlcm5lZCB3ZSBqdXN0IGFkdmVydGlzZSB0aGlzIGFzIHN0YWJsZS5cbiAgICAgICAgICByZXR1cm4gJ1N0YWJsZSc7XG4gICAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuU3RhYmxlOlxuICAgICAgICAgIHJldHVybiAnU3RhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc3RhYmlsaXR5OiAke3N0YWJpbGl0eSBhcyBhbnl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFQcm9wKHByb3BlcnR5OiBzcGVjLlByb3BlcnR5LCBpbmhlcml0ZWQ6IGJvb2xlYW4pOiBKYXZhUHJvcCB7XG4gICAgY29uc3Qgc2FmZU5hbWUgPSBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKHByb3BlcnR5Lm5hbWUpO1xuICAgIGNvbnN0IHByb3BOYW1lID0ganNpaVRvUGFzY2FsQ2FzZShzYWZlTmFtZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9jczogcHJvcGVydHkuZG9jcyxcbiAgICAgIHNwZWM6IHByb3BlcnR5LFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBqc2lpTmFtZTogcHJvcGVydHkubmFtZSxcbiAgICAgIG51bGxhYmxlOiAhIXByb3BlcnR5Lm9wdGlvbmFsLFxuICAgICAgZmllbGROYW1lOiB0aGlzLmNvZGUudG9DYW1lbENhc2Uoc2FmZU5hbWUpLFxuICAgICAgZmllbGRKYXZhVHlwZTogdGhpcy50b0phdmFUeXBlKHByb3BlcnR5LnR5cGUpLFxuICAgICAgcGFyYW1KYXZhVHlwZTogdGhpcy50b0phdmFUeXBlKHByb3BlcnR5LnR5cGUsIHsgY292YXJpYW50OiB0cnVlIH0pLFxuICAgICAgZmllbGROYXRpdmVUeXBlOiB0aGlzLnRvTmF0aXZlVHlwZShwcm9wZXJ0eS50eXBlKSxcbiAgICAgIGZpZWxkSmF2YUNsYXNzOiBgJHt0aGlzLnRvSmF2YVR5cGUocHJvcGVydHkudHlwZSwge1xuICAgICAgICBmb3JNYXJzaGFsbGluZzogdHJ1ZSxcbiAgICAgIH0pfS5jbGFzc2AsXG4gICAgICBqYXZhVHlwZXM6IHRoaXMudG9KYXZhVHlwZXMocHJvcGVydHkudHlwZSwgeyBjb3ZhcmlhbnQ6IHRydWUgfSksXG4gICAgICBpbW11dGFibGU6IHByb3BlcnR5LmltbXV0YWJsZSA/PyBmYWxzZSxcbiAgICAgIGluaGVyaXRlZCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q2xhc3NCdWlsZGVyKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICAvLyBOb3QgcmVuZGVyaW5nIGlmIHRoZXJlIGlzIG5vIGluaXRpYWxpemVyLCBvciBpZiB0aGUgaW5pdGlhbGl6ZXIgaXMgcHJvdGVjdGVkIG9yIHZhcmlhZGljXG4gICAgaWYgKGNscy5pbml0aWFsaXplciA9PSBudWxsIHx8IGNscy5pbml0aWFsaXplci5wcm90ZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm90IHJlbmRlcmluZyBpZiB0aGUgaW5pdGlhbGl6ZXIgaGFzIG5vIHBhcmFtZXRlcnNcbiAgICBpZiAoY2xzLmluaXRpYWxpemVyLnBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBOb3QgcmVuZGVyaW5nIGlmIHRoZXJlIGlzIGEgbmVzdGVkIFwiQnVpbGRlclwiIGNsYXNzXG4gICAgaWYgKFxuICAgICAgdGhpcy5yZWZsZWN0QXNzZW1ibHkudHJ5RmluZFR5cGUoYCR7Y2xzLmZxbn0uJHtCVUlMREVSX0NMQVNTX05BTUV9YCkgIT1cbiAgICAgIG51bGxcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBmaXJzdCBzdHJ1Y3QgcGFyYW1ldGVyIG9mIHRoZSBjb25zdHJ1Y3RvciAoaWYgYW55KVxuICAgIGNvbnN0IGZpcnN0U3RydWN0ID0gY2xzLmluaXRpYWxpemVyLnBhcmFtZXRlcnMuZmluZCgocGFyYW0pID0+IHtcbiAgICAgIGlmICghc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShwYXJhbS50eXBlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJhbVR5cGUgPSB0aGlzLnJlZmxlY3RBc3NlbWJseS50cnlGaW5kVHlwZShwYXJhbS50eXBlLmZxbik7XG4gICAgICByZXR1cm4gcGFyYW1UeXBlPy5pc0RhdGFUeXBlKCk7XG4gICAgfSk7XG5cbiAgICAvLyBOb3QgcmVuZGVyaW5nIGlmIHRoZXJlIGlzIG5vIHN0cnVjdCBwYXJhbWV0ZXJcbiAgICBpZiAoZmlyc3RTdHJ1Y3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cnVjdFR5cGUgPSB0aGlzLnJlZmxlY3RBc3NlbWJseS5maW5kVHlwZShcbiAgICAgIChmaXJzdFN0cnVjdC50eXBlIGFzIHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKS5mcW4sXG4gICAgKSBhcyByZWZsZWN0LkludGVyZmFjZVR5cGU7XG4gICAgY29uc3Qgc3RydWN0UGFyYW1OYW1lID0gdGhpcy5jb2RlLnRvQ2FtZWxDYXNlKFxuICAgICAgSmF2YUdlbmVyYXRvci5zYWZlSmF2YVByb3BlcnR5TmFtZShmaXJzdFN0cnVjdC5uYW1lKSxcbiAgICApO1xuICAgIGNvbnN0IHN0cnVjdEJ1aWxkZXIgPSBgJHt0aGlzLnRvSmF2YVR5cGUoXG4gICAgICBmaXJzdFN0cnVjdC50eXBlLFxuICAgICl9LiR7QlVJTERFUl9DTEFTU19OQU1FfWA7XG5cbiAgICBjb25zdCBwb3NpdGlvbmFsUGFyYW1zID0gY2xzLmluaXRpYWxpemVyLnBhcmFtZXRlcnNcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGZpcnN0U3RydWN0KVxuICAgICAgLm1hcCgocGFyYW0pID0+ICh7XG4gICAgICAgIHBhcmFtLFxuICAgICAgICBmaWVsZE5hbWU6IHRoaXMuY29kZS50b0NhbWVsQ2FzZShcbiAgICAgICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKHBhcmFtLm5hbWUpLFxuICAgICAgICApLFxuICAgICAgICBqYXZhVHlwZTogdGhpcy50b0phdmFUeXBlKHBhcmFtLnR5cGUpLFxuICAgICAgfSkpO1xuXG4gICAgY29uc3QgYnVpbHRUeXBlID0gdGhpcy50b0phdmFUeXBlKGNscyk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJldHRpZXIvcHJldHRpZXJcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiAke3N0YWJpbGl0eVByZWZpeEZvcihcbiAgICAgICAgY2xzLmluaXRpYWxpemVyLFxuICAgICAgKX1BIGZsdWVudCBidWlsZGVyIGZvciB7QGxpbmsgJHtidWlsdFR5cGV9fS5gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNscy5pbml0aWFsaXplcik7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzICR7QlVJTERFUl9DTEFTU19OQU1FfSBpbXBsZW1lbnRzIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkJ1aWxkZXI8JHtidWlsdFR5cGV9PmAsXG4gICAgKTtcblxuICAgIC8vIFN0YXRpYyBmYWN0b3J5IG1ldGhvZChzKVxuICAgIGZvciAoY29uc3QgcGFyYW1zIG9mIGNvbXB1dGVPdmVycmlkZXMocG9zaXRpb25hbFBhcmFtcykpIHtcbiAgICAgIGNvbnN0IGR1bW15TWV0aG9kOiBzcGVjLk1ldGhvZCA9IHtcbiAgICAgICAgZG9jczoge1xuICAgICAgICAgIHN0YWJpbGl0eTogY2xzLmluaXRpYWxpemVyLmRvY3M/LnN0YWJpbGl0eSA/PyBjbHMuZG9jcz8uc3RhYmlsaXR5LFxuICAgICAgICAgIHJldHVybnM6IGBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgJHtCVUlMREVSX0NMQVNTX05BTUV9fS5gLFxuICAgICAgICB9LFxuICAgICAgICBuYW1lOiAnY3JlYXRlJyxcbiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1zLm1hcCgocGFyYW0pID0+IHBhcmFtLnBhcmFtKSxcbiAgICAgIH07XG4gICAgICB0aGlzLmFkZEphdmFEb2NzKGR1bW15TWV0aG9kKTtcbiAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNscy5pbml0aWFsaXplcik7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljIHN0YXRpYyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gY3JlYXRlKCR7cGFyYW1zXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgICAgYGZpbmFsICR7cGFyYW0uamF2YVR5cGV9JHtwYXJhbS5wYXJhbS52YXJpYWRpYyA/ICcuLi4nIDogJyd9ICR7XG4gICAgICAgICAgICAgICAgcGFyYW0uZmllbGROYW1lXG4gICAgICAgICAgICAgIH1gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuam9pbignLCAnKX0pYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHJldHVybiBuZXcgJHtCVUlMREVSX0NMQVNTX05BTUV9KCR7cG9zaXRpb25hbFBhcmFtc1xuICAgICAgICAgIC5tYXAoKHBhcmFtLCBpZHgpID0+IChpZHggPCBwYXJhbXMubGVuZ3RoID8gcGFyYW0uZmllbGROYW1lIDogJ251bGwnKSlcbiAgICAgICAgICAuam9pbignLCAnKX0pO2AsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICAvLyBQcml2YXRlIHByb3BlcnRpZXNcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcG9zaXRpb25hbFBhcmFtcykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBwcml2YXRlIGZpbmFsICR7cGFyYW0uamF2YVR5cGV9JHtwYXJhbS5wYXJhbS52YXJpYWRpYyA/ICdbXScgOiAnJ30gJHtcbiAgICAgICAgICBwYXJhbS5maWVsZE5hbWVcbiAgICAgICAgfTtgLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcHJpdmF0ZSAke1xuICAgICAgICBmaXJzdFN0cnVjdC5vcHRpb25hbCA/ICcnIDogJ2ZpbmFsICdcbiAgICAgIH0ke3N0cnVjdEJ1aWxkZXJ9ICR7c3RydWN0UGFyYW1OYW1lfTtgLFxuICAgICk7XG5cbiAgICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByaXZhdGUgJHtCVUlMREVSX0NMQVNTX05BTUV9KCR7cG9zaXRpb25hbFBhcmFtc1xuICAgICAgICAubWFwKFxuICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgIGBmaW5hbCAke3BhcmFtLmphdmFUeXBlfSR7cGFyYW0ucGFyYW0udmFyaWFkaWMgPyAnLi4uJyA6ICcnfSAke1xuICAgICAgICAgICAgICBwYXJhbS5maWVsZE5hbWVcbiAgICAgICAgICAgIH1gLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcsICcpfSlgLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwb3NpdGlvbmFsUGFyYW1zKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgdGhpcy4ke3BhcmFtLmZpZWxkTmFtZX0gPSAke3BhcmFtLmZpZWxkTmFtZX07YCk7XG4gICAgfVxuICAgIGlmICghZmlyc3RTdHJ1Y3Qub3B0aW9uYWwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSA9IG5ldyAke3N0cnVjdEJ1aWxkZXJ9KCk7YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBGaWVsZHNcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc3RydWN0VHlwZS5hbGxQcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmNvZGUudG9DYW1lbENhc2UoXG4gICAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgY29uc3Qgc2V0dGVyOiBzcGVjLk1ldGhvZCA9IHtcbiAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgLi4ucHJvcC5zcGVjLmRvY3MsXG4gICAgICAgICAgc3RhYmlsaXR5OiBwcm9wLnNwZWMuZG9jcz8uc3RhYmlsaXR5LFxuICAgICAgICAgIHJldHVybnM6ICd7QGNvZGUgdGhpc30nLFxuICAgICAgICB9LFxuICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgdHlwZTogc3BlYy5DQU5PTklDQUxfQU5ZLCAvLyBXZSBkb24ndCBxdWl0ZSBjYXJlIGluIHRoaXMgY29udGV4dCFcbiAgICAgICAgICAgIGRvY3M6IHByb3Auc3BlYy5kb2NzLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBqYXZhVHlwZSBvZiB0aGlzLnRvSmF2YVR5cGVzKHByb3AudHlwZS5zcGVjISwge1xuICAgICAgICBjb3ZhcmlhbnQ6IHRydWUsXG4gICAgICB9KSkge1xuICAgICAgICB0aGlzLmFkZEphdmFEb2NzKHNldHRlcik7XG4gICAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3Auc3BlYyk7XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICAgYHB1YmxpYyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gJHtmaWVsZE5hbWV9KGZpbmFsICR7amF2YVR5cGV9ICR7ZmllbGROYW1lfSlgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0ke1xuICAgICAgICAgICAgZmlyc3RTdHJ1Y3Qub3B0aW9uYWwgPyAnKCknIDogJydcbiAgICAgICAgICB9LiR7ZmllbGROYW1lfSgke2ZpZWxkTmFtZX0pO2AsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gdGhpczsnKTtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaW5hbCBidWlsZCBtZXRob2RcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiBAcmV0dXJucyBhIG5ld2x5IGJ1aWx0IGluc3RhbmNlIG9mIHtAbGluayAke2J1aWx0VHlwZX19LmAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xzLmluaXRpYWxpemVyKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljICR7YnVpbHRUeXBlfSBidWlsZCgpYCk7XG4gICAgY29uc3QgcGFyYW1zID0gY2xzLmluaXRpYWxpemVyLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgaWYgKHBhcmFtID09PSBmaXJzdFN0cnVjdCkge1xuICAgICAgICByZXR1cm4gZmlyc3RTdHJ1Y3Qub3B0aW9uYWxcbiAgICAgICAgICA/IGB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSAhPSBudWxsID8gdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0uYnVpbGQoKSA6IG51bGxgXG4gICAgICAgICAgOiBgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0uYnVpbGQoKWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHRoaXMuJHtcbiAgICAgICAgcG9zaXRpb25hbFBhcmFtcy5maW5kKChwKSA9PiBwYXJhbSA9PT0gcC5wYXJhbSkhLmZpZWxkTmFtZVxuICAgICAgfWA7XG4gICAgfSk7XG4gICAgdGhpcy5jb2RlLmluZGVudChgcmV0dXJuIG5ldyAke2J1aWx0VHlwZX0oYCk7XG4gICAgcGFyYW1zLmZvckVhY2goKHBhcmFtLCBpZHgpID0+XG4gICAgICB0aGlzLmNvZGUubGluZShgJHtwYXJhbX0ke2lkeCA8IHBhcmFtcy5sZW5ndGggLSAxID8gJywnIDogJyd9YCksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUudW5pbmRlbnQoJyk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIC8vIE9wdGlvbmFsIGJ1aWxkZXIgaW5pdGlhbGl6YXRpb25cbiAgICBpZiAoZmlyc3RTdHJ1Y3Qub3B0aW9uYWwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwcml2YXRlICR7c3RydWN0QnVpbGRlcn0gJHtzdHJ1Y3RQYXJhbU5hbWV9KClgKTtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYGlmICh0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSA9PSBudWxsKWApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9ID0gbmV3ICR7c3RydWN0QnVpbGRlcn0oKTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9O2ApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEJ1aWxkZXJTZXR0ZXIoXG4gICAgcHJvcDogSmF2YVByb3AsXG4gICAgYnVpbGRlck5hbWU6IHN0cmluZyxcbiAgICBidWlsdFR5cGU6IHN0cmluZyxcbiAgKSB7XG4gICAgZm9yIChjb25zdCB0eXBlIG9mIHByb3AuamF2YVR5cGVzKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB7QGxpbmsgJHtidWlsdFR5cGV9IyR7Z2V0dGVyRm9yKFxuICAgICAgICAgIHByb3AuZmllbGROYW1lLFxuICAgICAgICApfX1gLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBwcm9wLmRvY3M/LnN1bW1hcnkgPz8gJ3RoZSB2YWx1ZSB0byBiZSBzZXQnO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGAgKiAke3BhcmFtSmF2YWRvYyhwcm9wLmZpZWxkTmFtZSwgcHJvcC5udWxsYWJsZSwgc3VtbWFyeSl9YCxcbiAgICAgICk7XG4gICAgICBpZiAocHJvcC5kb2NzPy5yZW1hcmtzICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgaW5kZW50ID0gJyAnLnJlcGVhdCg3ICsgcHJvcC5maWVsZE5hbWUubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgcmVtYXJrcyA9IG1hcmtEb3duVG9KYXZhRG9jKFxuICAgICAgICAgIHRoaXMuY29udmVydFNhbXBsZXNJbk1hcmtkb3duKHByb3AuZG9jcy5yZW1hcmtzKSxcbiAgICAgICAgKS50cmltUmlnaHQoKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHJlbWFya3Muc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqICR7aW5kZW50fSAke2xpbmV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY29kZS5saW5lKCcgKiBAcmV0dXJuIHtAY29kZSB0aGlzfScpO1xuICAgICAgaWYgKHByb3AuZG9jcz8uZGVwcmVjYXRlZCkge1xuICAgICAgICB0aGlzLmNvZGUubGluZShgICogQGRlcHJlY2F0ZWQgJHtwcm9wLmRvY3MuZGVwcmVjYXRlZH1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3Auc3BlYyk7XG4gICAgICAvLyBXZSBhZGQgYW4gZXhwbGljaXQgY2FzdCBpZiBib3RoIHR5cGVzIGFyZSBnZW5lcmljIGJ1dCB0aGV5IGFyZSBub3QgaWRlbnRpY2FsIChvbmUgaXMgY292YXJpYW50LCB0aGUgb3RoZXIgaXNuJ3QpXG4gICAgICBjb25zdCBleHBsaWNpdENhc3QgPVxuICAgICAgICB0eXBlLmluY2x1ZGVzKCc8JykgJiZcbiAgICAgICAgcHJvcC5maWVsZEphdmFUeXBlLmluY2x1ZGVzKCc8JykgJiZcbiAgICAgICAgdHlwZSAhPT0gcHJvcC5maWVsZEphdmFUeXBlXG4gICAgICAgICAgPyBgKCR7cHJvcC5maWVsZEphdmFUeXBlfSlgXG4gICAgICAgICAgOiAnJztcbiAgICAgIGlmIChleHBsaWNpdENhc3QgIT09ICcnKSB7XG4gICAgICAgIC8vIFdlJ2xsIGJlIGRvaW5nIGEgc2FmZSwgYnV0IHVuY2hlY2tlZCBjYXN0LCBzbyBzdXBwcmVzcyB0aGF0IHdhcm5pbmdcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BTdXBwcmVzc1dhcm5pbmdzKFwidW5jaGVja2VkXCIpJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljICR7YnVpbGRlck5hbWV9ICR7cHJvcC5maWVsZE5hbWV9KCR7dHlwZX0gJHtwcm9wLmZpZWxkTmFtZX0pYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gPSAke2V4cGxpY2l0Q2FzdH0ke3Byb3AuZmllbGROYW1lfTtgLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gdGhpczsnKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0dGVyRm9yKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBmaWVsZE5hbWU7XG4gICAgICByZXR1cm4gYGdldCR7Zmlyc3QudG9VcHBlckNhc2UoKX0ke3Jlc3Quam9pbignJyl9YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbnRlcmZhY2VCdWlsZGVyKFxuICAgIGNsYXNzU3BlYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIGNvbnN0cnVjdG9yTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBKYXZhUHJvcFtdLFxuICApIHtcbiAgICAvLyBTdGFydCBidWlsZGVyKClcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiBAcmV0dXJuIGEge0BsaW5rICR7QlVJTERFUl9DTEFTU19OQU1FfX0gb2Yge0BsaW5rICR7Y2xhc3NTcGVjLm5hbWV9fWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xhc3NTcGVjKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBzdGF0aWMgJHtCVUlMREVSX0NMQVNTX05BTUV9IGJ1aWxkZXIoKWApO1xuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gbmV3ICR7QlVJTERFUl9DTEFTU19OQU1FfSgpO2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgLy8gRW5kIGJ1aWxkZXIoKVxuXG4gICAgLy8gU3RhcnQgQnVpbGRlclxuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShgICogQSBidWlsZGVyIGZvciB7QGxpbmsgJHtjbGFzc1NwZWMubmFtZX19YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNsYXNzU3BlYyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzICR7QlVJTERFUl9DTEFTU19OQU1FfSBpbXBsZW1lbnRzIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkJ1aWxkZXI8JHtjbGFzc1NwZWMubmFtZX0+YCxcbiAgICApO1xuXG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT5cbiAgICAgIHRoaXMuY29kZS5saW5lKGBwcml2YXRlICR7cHJvcC5maWVsZEphdmFUeXBlfSAke3Byb3AuZmllbGROYW1lfTtgKSxcbiAgICApO1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+XG4gICAgICB0aGlzLmVtaXRCdWlsZGVyU2V0dGVyKHByb3AsIEJVSUxERVJfQ0xBU1NfTkFNRSwgY2xhc3NTcGVjLm5hbWUpLFxuICAgICk7XG5cbiAgICAvLyBTdGFydCBidWlsZCgpXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqIEJ1aWxkcyB0aGUgY29uZmlndXJlZCBpbnN0YW5jZS4nKTtcbiAgICB0aGlzLmNvZGUubGluZShgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgJHtjbGFzc1NwZWMubmFtZX19YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbnkgcmVxdWlyZWQgYXR0cmlidXRlIHdhcyBub3QgcHJvdmlkZWQnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNsYXNzU3BlYyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyAke2NsYXNzU3BlYy5uYW1lfSBidWlsZCgpYCk7XG5cbiAgICBjb25zdCBwcm9wRmllbGRzID0gcHJvcHMubWFwKChwcm9wKSA9PiBwcm9wLmZpZWxkTmFtZSkuam9pbignLCAnKTtcblxuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gbmV3ICR7Y29uc3RydWN0b3JOYW1lfSgke3Byb3BGaWVsZHN9KTtgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBidWlsZCgpXG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBCdWlsZGVyXG4gIH1cblxuICBwcml2YXRlIGVtaXREYXRhVHlwZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIC8vIGNvbGxlY3QgYWxsIHByb3BlcnRpZXMgZnJvbSBhbGwgYmFzZSBzdHJ1Y3RzIGFuZCBkZWR1cGUgYnkgbmFtZS4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBnZW5lcmF0aW9uIG9mIHRoZVxuICAgIC8vIGFzc2VtYmx5IHdpbGwgbm90IHBlcm1pdCBtdWx0aXBsZSBvdmVybG9hZGVkIGluaGVyaXRlZCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdGhhdCB0aGlzIHdpbGwgYmVcbiAgICAvLyBlbmZvcmNlZCBieSBUeXBlc2NyaXB0IGNvbnN0cmFpbnRzLlxuICAgIGNvbnN0IHByb3BzQnlOYW1lOiB7IFtuYW1lOiBzdHJpbmddOiBKYXZhUHJvcCB9ID0ge307XG5cbiAgICBmdW5jdGlvbiBjb2xsZWN0UHJvcHMoXG4gICAgICB0aGlzOiBKYXZhR2VuZXJhdG9yLFxuICAgICAgY3VycmVudElmYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgICAgaXNCYXNlQ2xhc3MgPSBmYWxzZSxcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgY3VycmVudElmYy5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGphdmFQcm9wID0gdGhpcy50b0phdmFQcm9wKHByb3BlcnR5LCBpc0Jhc2VDbGFzcyk7XG4gICAgICAgIHByb3BzQnlOYW1lW2phdmFQcm9wLnByb3BOYW1lXSA9IGphdmFQcm9wO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgcHJvcHMgb2YgYmFzZSBzdHJ1Y3RcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiBjdXJyZW50SWZjLmludGVyZmFjZXMgPz8gW10pIHtcbiAgICAgICAgY29sbGVjdFByb3BzLmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbmRUeXBlKGJhc2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbGxlY3RQcm9wcy5jYWxsKHRoaXMsIGlmYyk7XG4gICAgY29uc3QgcHJvcHMgPSBPYmplY3QudmFsdWVzKHByb3BzQnlOYW1lKTtcbiAgICB0aGlzLmVtaXRJbnRlcmZhY2VCdWlsZGVyKGlmYywgSU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUUsIHByb3BzKTtcblxuICAgIC8vIFN0YXJ0IGltcGxlbWVudGF0aW9uIGNsYXNzXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYCAqIEFuIGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgJHtpZmMubmFtZX19YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGlmYyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoQU5OX0lOVEVSTkFMKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYGZpbmFsIGNsYXNzICR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9IGV4dGVuZHMgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdCBpbXBsZW1lbnRzICR7aWZjLm5hbWV9YCxcbiAgICApO1xuXG4gICAgLy8gSW1tdXRhYmxlIHByb3BlcnRpZXNcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoYHByaXZhdGUgZmluYWwgJHtwcm9wLmZpZWxkSmF2YVR5cGV9ICR7cHJvcC5maWVsZE5hbWV9O2ApLFxuICAgICk7XG5cbiAgICAvLyBTdGFydCBKU0lJIHJlZmVyZW5jZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAqIENvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG9iamVjdCBiYXNlZCBvbiB2YWx1ZXMgcmV0cmlldmVkIGZyb20gdGhlIEpzaWlPYmplY3QuJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKiBAcGFyYW0gb2JqUmVmIFJlZmVyZW5jZSB0byB0aGUgSlNJSSBtYW5hZ2VkIG9iamVjdC4nKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtJTlRFUkZBQ0VfUFJPWFlfQ0xBU1NfTkFNRX0oZmluYWwgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdFJlZiBvYmpSZWYpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihvYmpSZWYpOycpO1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gPSBzb2Z0d2FyZS5hbWF6b24uanNpaS5LZXJuZWwuZ2V0KHRoaXMsIFwiJHtwcm9wLmpzaWlOYW1lfVwiLCAke3Byb3AuZmllbGROYXRpdmVUeXBlfSk7YCxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBKU0lJIHJlZmVyZW5jZSBjb25zdHJ1Y3RvclxuXG4gICAgLy8gU3RhcnQgbGl0ZXJhbCBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAqIENvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG9iamVjdCBiYXNlZCBvbiBsaXRlcmFsIHByb3BlcnR5IHZhbHVlcyBwYXNzZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyfS4nLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIGlmIChwcm9wcy5zb21lKChwcm9wKSA9PiBwcm9wLmZpZWxkSmF2YVR5cGUgIT09IHByb3AucGFyYW1KYXZhVHlwZSkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdAU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKScpO1xuICAgIH1cbiAgICBjb25zdCBjb25zdHJ1Y3RvckFyZ3MgPSBwcm9wc1xuICAgICAgLm1hcCgocHJvcCkgPT4gYGZpbmFsICR7cHJvcC5wYXJhbUphdmFUeXBlfSAke3Byb3AuZmllbGROYW1lfWApXG4gICAgICAuam9pbignLCAnKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCAke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfSgke2NvbnN0cnVjdG9yQXJnc30pYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ3N1cGVyKHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuSW5pdGlhbGl6YXRpb25Nb2RlLkpTSUkpOycsXG4gICAgKTtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICBjb25zdCBleHBsaWNpdENhc3QgPVxuICAgICAgICBwcm9wLmZpZWxkSmF2YVR5cGUgIT09IHByb3AucGFyYW1KYXZhVHlwZVxuICAgICAgICAgID8gYCgke3Byb3AuZmllbGRKYXZhVHlwZX0pYFxuICAgICAgICAgIDogJyc7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gPSAke2V4cGxpY2l0Q2FzdH0ke192YWxpZGF0ZUlmTm9uT3B0aW9uYWwoXG4gICAgICAgICAgcHJvcC5maWVsZE5hbWUsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgKX07YCxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgbGl0ZXJhbCBjb25zdHJ1Y3RvclxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljIGZpbmFsICR7cHJvcC5maWVsZEphdmFUeXBlfSBnZXQke3Byb3AucHJvcE5hbWV9KClgLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gdGhpcy4ke3Byb3AuZmllbGROYW1lfTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfSk7XG5cbiAgICAvLyBlbWl0ICRqc2lpJHRvSnNvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB0byBzZXJpYWxpemUgdGhpcyBvYmplY3Qgd2hlbiBzZW50IHRvIEpTXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoQU5OX0lOVEVSTkFMKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgJ3B1YmxpYyBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvbk5vZGUgJGpzaWkkdG9Kc29uKCknLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnZmluYWwgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlciBvbSA9IHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3RNYXBwZXIuSU5TVEFOQ0U7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYGZpbmFsIGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLk9iamVjdE5vZGUgZGF0YSA9IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLkpzb25Ob2RlRmFjdG9yeS5pbnN0YW5jZS5vYmplY3ROb2RlKCk7YCxcbiAgICApO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYGlmICh0aGlzLmdldCR7cHJvcC5wcm9wTmFtZX0oKSAhPSBudWxsKWApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBkYXRhLnNldChcIiR7cHJvcC5zcGVjLm5hbWV9XCIsIG9tLnZhbHVlVG9UcmVlKHRoaXMuZ2V0JHtwcm9wLnByb3BOYW1lfSgpKSk7YCxcbiAgICAgICk7XG4gICAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnZmluYWwgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSBzdHJ1Y3QgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5Kc29uTm9kZUZhY3RvcnkuaW5zdGFuY2Uub2JqZWN0Tm9kZSgpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShgc3RydWN0LnNldChcImZxblwiLCBvbS52YWx1ZVRvVHJlZShcIiR7aWZjLmZxbn1cIikpO2ApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdHJ1Y3Quc2V0KFwiZGF0YVwiLCBkYXRhKTsnKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnZmluYWwgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSBvYmogPSBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5Kc29uTm9kZUZhY3RvcnkuaW5zdGFuY2Uub2JqZWN0Tm9kZSgpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnb2JqLnNldChcIiRqc2lpLnN0cnVjdFwiLCBzdHJ1Y3QpOycpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIG9iajsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCAkanNpaSR0b0pzb25cblxuICAgIC8vIEdlbmVyYXRlIGVxdWFscygpIG92ZXJyaWRlXG4gICAgdGhpcy5lbWl0RXF1YWxzT3ZlcnJpZGUoaWZjLm5hbWUsIHByb3BzKTtcblxuICAgIC8vIEdlbmVyYXRlIGhhc2hDb2RlKCkgb3ZlcnJpZGVcbiAgICB0aGlzLmVtaXRIYXNoQ29kZU92ZXJyaWRlKHByb3BzKTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgLy8gRW5kIGltcGxlbWVudGF0aW9uIGNsYXNzXG5cbiAgICBmdW5jdGlvbiBfdmFsaWRhdGVJZk5vbk9wdGlvbmFsKHZhcmlhYmxlOiBzdHJpbmcsIHByb3A6IEphdmFQcm9wKTogc3RyaW5nIHtcbiAgICAgIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGwoJHt2YXJpYWJsZX0sIFwiJHtwcm9wLmZpZWxkTmFtZX0gaXMgcmVxdWlyZWRcIilgO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEVxdWFsc092ZXJyaWRlKGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wczogSmF2YVByb3BbXSkge1xuICAgIC8vIEEgY2xhc3Mgd2l0aG91dCBwcm9wZXJ0aWVzIGRvZXMgbm90IG5lZWQgdG8gb3ZlcnJpZGUgZXF1YWxzKClcbiAgICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygncHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKScpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsnKTtcblxuICAgIC8vIFRoaXMgd2FzIGFscmVhZHkgY2hlY2tlZCBieSBgc3VwZXIuZXF1YWxzKG8pYCwgc28gd2Ugc2tpcCBpdCBoZXJlLi4uXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOycsXG4gICAgKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgJHtjbGFzc05hbWV9LiR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9IHRoYXQgPSAoJHtjbGFzc05hbWV9LiR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9KSBvO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgY29uc3QgaW5pdGlhbFByb3BzID0gcHJvcHMuc2xpY2UoMCwgcHJvcHMubGVuZ3RoIC0gMSk7XG4gICAgY29uc3QgZmluYWxQcm9wID0gcHJvcHNbcHJvcHMubGVuZ3RoIC0gMV07XG5cbiAgICBpbml0aWFsUHJvcHMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgY29uc3QgcHJlZGljYXRlID0gcHJvcC5udWxsYWJsZVxuICAgICAgICA/IGB0aGlzLiR7cHJvcC5maWVsZE5hbWV9ICE9IG51bGwgPyAhdGhpcy4ke3Byb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke3Byb3AuZmllbGROYW1lfSkgOiB0aGF0LiR7cHJvcC5maWVsZE5hbWV9ICE9IG51bGxgXG4gICAgICAgIDogYCEke3Byb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke3Byb3AuZmllbGROYW1lfSlgO1xuXG4gICAgICB0aGlzLmNvZGUubGluZShgaWYgKCR7cHJlZGljYXRlfSkgcmV0dXJuIGZhbHNlO2ApO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGZpbmFsIChyZXR1cm5lZCBwcmVkaWNhdGUpIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBvdGhlciBvbmVzXG4gICAgY29uc3QgZmluYWxQcmVkaWNhdGUgPSBmaW5hbFByb3AubnVsbGFibGVcbiAgICAgID8gYHRoaXMuJHtmaW5hbFByb3AuZmllbGROYW1lfSAhPSBudWxsID8gdGhpcy4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9LmVxdWFscyh0aGF0LiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0pIDogYCArXG4gICAgICAgIGB0aGF0LiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0gPT0gbnVsbGBcbiAgICAgIDogYHRoaXMuJHtmaW5hbFByb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9KWA7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiAke2ZpbmFsUHJlZGljYXRlfTtgKTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRIYXNoQ29kZU92ZXJyaWRlKHByb3BzOiBKYXZhUHJvcFtdKSB7XG4gICAgLy8gQSBjbGFzcyB3aXRob3V0IHByb3BlcnRpZXMgZG9lcyBub3QgbmVlZCB0byBvdmVycmlkZSBoYXNoQ29kZSgpXG4gICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3B1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKScpO1xuXG4gICAgY29uc3QgZmlyc3RQcm9wID0gcHJvcHNbMF07XG4gICAgY29uc3QgcmVtYWluaW5nUHJvcHMgPSBwcm9wcy5zbGljZSgxKTtcblxuICAgIHRoaXMuY29kZS5saW5lKGBpbnQgcmVzdWx0ID0gJHtfaGFzaENvZGVGb3JQcm9wKGZpcnN0UHJvcCl9O2ApO1xuICAgIHJlbWFpbmluZ1Byb3BzLmZvckVhY2goKHByb3ApID0+XG4gICAgICB0aGlzLmNvZGUubGluZShgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoJHtfaGFzaENvZGVGb3JQcm9wKHByb3ApfSk7YCksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHJlc3VsdDsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgZnVuY3Rpb24gX2hhc2hDb2RlRm9yUHJvcChwcm9wOiBKYXZhUHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AubnVsbGFibGVcbiAgICAgICAgPyBgdGhpcy4ke3Byb3AuZmllbGROYW1lfSAhPSBudWxsID8gdGhpcy4ke3Byb3AuZmllbGROYW1lfS5oYXNoQ29kZSgpIDogMGBcbiAgICAgICAgOiBgdGhpcy4ke3Byb3AuZmllbGROYW1lfS5oYXNoQ29kZSgpYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5GaWxlSWZOZWVkZWQodHlwZTogc3BlYy5UeXBlKSB7XG4gICAgaWYgKHRoaXMuaXNOZXN0ZWQodHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUub3BlbkZpbGUodGhpcy50b0phdmFGaWxlUGF0aCh0aGlzLmFzc2VtYmx5LCB0eXBlKSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcGFja2FnZSAke3RoaXMudG9OYXRpdmVOYW1lKHRoaXMuYXNzZW1ibHksIHR5cGUpLnBhY2thZ2VOYW1lfTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VGaWxlSWZOZWVkZWQodHlwZTogc3BlYy5UeXBlKSB7XG4gICAgaWYgKHRoaXMuaXNOZXN0ZWQodHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZSh0aGlzLnRvSmF2YUZpbGVQYXRoKHRoaXMuYXNzZW1ibHksIHR5cGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNOZXN0ZWQodHlwZTogc3BlYy5UeXBlKSB7XG4gICAgaWYgKCF0aGlzLmFzc2VtYmx5LnR5cGVzIHx8ICF0eXBlLm5hbWVzcGFjZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBgJHt0eXBlLmFzc2VtYmx5fS4ke3R5cGUubmFtZXNwYWNlfWA7XG4gICAgcmV0dXJuIHBhcmVudCBpbiB0aGlzLmFzc2VtYmx5LnR5cGVzO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFGaWxlUGF0aChhc3NtOiBzcGVjLkFzc2VtYmx5LCBmcW46IHN0cmluZyk6IHN0cmluZztcbiAgcHJpdmF0ZSB0b0phdmFGaWxlUGF0aChhc3NtOiBzcGVjLkFzc2VtYmx5LCB0eXBlOiBzcGVjLlR5cGUpOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9KYXZhRmlsZVBhdGgoYXNzbTogc3BlYy5Bc3NlbWJseSwgd2hhdDogc3BlYy5UeXBlIHwgc3RyaW5nKSB7XG4gICAgY29uc3QgZnFuID0gdHlwZW9mIHdoYXQgPT09ICdzdHJpbmcnID8gd2hhdCA6IHdoYXQuZnFuO1xuICAgIGNvbnN0IHsgcGFja2FnZU5hbWUsIHR5cGVOYW1lcyB9ID0gdHJhbnNsYXRlRnFuKGFzc20sIGZxbik7XG5cbiAgICBpZiAodHlwZU5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdG9KYXZhRmlsZVBhdGg6ICR7ZnFufSBtdXN0IGluZGljYXRlIGEgdHlwZSwgYnV0IGRvZXNuJ3Q6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgeyBwYWNrYWdlTmFtZSwgdHlwZU5hbWVzIH0sXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3BhdGguam9pbihcbiAgICAgICdzcmMnLFxuICAgICAgJ21haW4nLFxuICAgICAgJ2phdmEnLFxuICAgICAgLi4ucGFja2FnZU5hbWUuc3BsaXQoJy4nKSxcbiAgICAgIHR5cGVOYW1lc1swXSxcbiAgICApfS5qYXZhYDtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhUmVzb3VyY2VQYXRoKGFzc206IHNwZWMuQXNzZW1ibHksIGZxbjogc3RyaW5nLCBleHQgPSAnLnR4dCcpIHtcbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lLCB0eXBlTmFtZSB9ID0gdGhpcy50b05hdGl2ZU5hbWUoYXNzbSwge1xuICAgICAgZnFuLFxuICAgICAga2luZDogc3BlYy5UeXBlS2luZC5DbGFzcyxcbiAgICAgIGFzc2VtYmx5OiBhc3NtLm5hbWUsXG4gICAgICBuYW1lOiBmcW4ucmVwbGFjZSgvLipcXC4oW14uXSspJC8sICckMScpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAuLi5wYWNrYWdlTmFtZS5zcGxpdCgnLicpLFxuICAgICAgYCR7dHlwZU5hbWUuc3BsaXQoJy4nKVswXX0ke2V4dH1gLFxuICAgIF07XG4gICAgLy8gUmVzb3VyY2UgbmFtZXMgYXJlIC8tZGVsaW1pdGVkIHBhdGhzIChldmVuIG9uIFdpbmRvd3MgKndpbmsgd2luayopXG4gICAgY29uc3QgbmFtZSA9IHBhcnRzLmpvaW4oJy8nKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbignc3JjJywgJ21haW4nLCAncmVzb3VyY2VzJywgLi4ucGFydHMpO1xuXG4gICAgcmV0dXJuIHsgZmlsZVBhdGgsIG5hbWUgfTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHByaXZhdGUgYWRkSmF2YURvY3MoZG9jOiBzcGVjLkRvY3VtZW50YWJsZSwgZGVmYXVsdFRleHQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICAhZGVmYXVsdFRleHQgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRvYy5kb2NzID8/IHt9KS5sZW5ndGggPT09IDAgJiZcbiAgICAgICEoKGRvYyBhcyBzcGVjLk1ldGhvZCkucGFyYW1ldGVycyA/PyBbXSkuc29tZShcbiAgICAgICAgKHApID0+IE9iamVjdC5rZXlzKHAuZG9jcyA/PyB7fSkubGVuZ3RoICE9PSAwLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY3MgPSAoZG9jLmRvY3MgPSBkb2MuZG9jcyA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJhcyA9IFtdO1xuXG4gICAgaWYgKGRvY3Muc3VtbWFyeSkge1xuICAgICAgcGFyYXMucHVzaChyZW5kZXJTdW1tYXJ5KGRvY3MpKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRUZXh0KSB7XG4gICAgICBwYXJhcy5wdXNoKGRlZmF1bHRUZXh0KTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5yZW1hcmtzKSB7XG4gICAgICBwYXJhcy5wdXNoKFxuICAgICAgICBtYXJrRG93blRvSmF2YURvYyhcbiAgICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihkb2NzLnJlbWFya3MpLFxuICAgICAgICApLnRyaW1SaWdodCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgICBwYXJhcy5wdXNoKGBEZWZhdWx0OiAke2RvY3MuZGVmYXVsdH1gKTsgLy8gTk9URTogdGhlcmUgaXMgbm8gYW5ub3RhdGlvbiBpbiBKYXZhRG9jIGZvciB0aGlzXG4gICAgfVxuXG4gICAgaWYgKGRvY3MuZXhhbXBsZSkge1xuICAgICAgcGFyYXMucHVzaCgnRXhhbXBsZTonKTtcbiAgICAgIHBhcmFzLnB1c2goXG4gICAgICAgIGA8YmxvY2txdW90ZT48cHJlPntAY29kZVxcbiR7dGhpcy5jb252ZXJ0RXhhbXBsZShcbiAgICAgICAgICBkb2NzLmV4YW1wbGUsXG4gICAgICAgICl9fTwvcHJlPjwvYmxvY2txdW90ZT5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWdMaW5lcyA9IFtdO1xuXG4gICAgaWYgKGRvY3MucmV0dXJucykge1xuICAgICAgdGFnTGluZXMucHVzaChgQHJldHVybiAke2RvY3MucmV0dXJuc31gKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc2VlKSB7XG4gICAgICB0YWdMaW5lcy5wdXNoKGBAc2VlICR7ZG9jcy5zZWV9YCk7XG4gICAgfVxuICAgIGlmIChkb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIHRhZ0xpbmVzLnB1c2goYEBkZXByZWNhdGVkICR7ZG9jcy5kZXByZWNhdGVkfWApO1xuICAgIH1cblxuICAgIC8vIFBhcmFtc1xuICAgIGlmICgoZG9jIGFzIHNwZWMuTWV0aG9kKS5wYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBkb2MgYXMgc3BlYy5NZXRob2Q7XG4gICAgICBpZiAobWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBwYXJhbS5kb2NzPy5zdW1tYXJ5O1xuICAgICAgICAgIHRhZ0xpbmVzLnB1c2gocGFyYW1KYXZhZG9jKHBhcmFtLm5hbWUsIHBhcmFtLm9wdGlvbmFsLCBzdW1tYXJ5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGFnTGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYXMucHVzaCh0YWdMaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGFyYSBvZiBwYXJhcykge1xuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnPHA+Jyk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKC4uLnBhcmEuc3BsaXQoJ1xcbicpLmZpbHRlcigobCkgPT4gbCAhPT0gJycpKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgICogJHtsaW5lfWApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gIH1cblxuICBwcml2YXRlIGdldENsYXNzQmFzZShjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgaWYgKCFjbHMuYmFzZSkge1xuICAgICAgcmV0dXJuICdzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0JztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0phdmFUeXBlKHsgZnFuOiBjbHMuYmFzZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdG9EZWNvcmF0ZWRKYXZhVHlwZShcbiAgICBvcHRpb25hbFZhbHVlOiBzcGVjLk9wdGlvbmFsVmFsdWUsXG4gICAgeyBjb3ZhcmlhbnQgPSBmYWxzZSB9ID0ge30sXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlcyhvcHRpb25hbFZhbHVlLCB7IGNvdmFyaWFudCB9KTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiBgJHtcbiAgICAgICAgb3B0aW9uYWxWYWx1ZS5vcHRpb25hbCA/IEFOTl9OVUxMQUJMRSA6IEFOTl9OT1RfTlVMTFxuICAgICAgfSBqYXZhLmxhbmcuT2JqZWN0YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFswXTtcbiAgfVxuXG4gIHByaXZhdGUgdG9EZWNvcmF0ZWRKYXZhVHlwZXMoXG4gICAgb3B0aW9uYWxWYWx1ZTogc3BlYy5PcHRpb25hbFZhbHVlLFxuICAgIHsgY292YXJpYW50ID0gZmFsc2UgfSA9IHt9LFxuICApOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudG9KYXZhVHlwZXMob3B0aW9uYWxWYWx1ZS50eXBlLCB7IGNvdmFyaWFudCB9KS5tYXAoXG4gICAgICAobmFrZWRUeXBlKSA9PlxuICAgICAgICBgJHtvcHRpb25hbFZhbHVlLm9wdGlvbmFsID8gQU5OX05VTExBQkxFIDogQU5OX05PVF9OVUxMfSAke25ha2VkVHlwZX1gLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YVR5cGUoXG4gICAgdHlwZTogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIG9wdHM/OiB7IGZvck1hcnNoYWxsaW5nPzogYm9vbGVhbjsgY292YXJpYW50PzogYm9vbGVhbiB9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVzID0gdGhpcy50b0phdmFUeXBlcyh0eXBlLCBvcHRzKTtcbiAgICBpZiAodHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuICdqYXZhLmxhbmcuT2JqZWN0JztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVzWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSB0b05hdGl2ZVR5cGUoXG4gICAgdHlwZTogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIHsgZm9yTWFyc2hhbGxpbmcgPSBmYWxzZSwgY292YXJpYW50ID0gZmFsc2UgfSA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZSkpIHtcbiAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnRUeXBlID0gdGhpcy50b05hdGl2ZVR5cGUodHlwZS5jb2xsZWN0aW9uLmVsZW1lbnR0eXBlLCB7XG4gICAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgICBjb3ZhcmlhbnQsXG4gICAgICB9KTtcbiAgICAgIHN3aXRjaCAodHlwZS5jb2xsZWN0aW9uLmtpbmQpIHtcbiAgICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLkFycmF5OlxuICAgICAgICAgIHJldHVybiBgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5saXN0T2YoJHtuYXRpdmVFbGVtZW50VHlwZX0pYDtcbiAgICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcDpcbiAgICAgICAgICByZXR1cm4gYHNvZnR3YXJlLmFtYXpvbi5qc2lpLk5hdGl2ZVR5cGUubWFwT2YoJHtuYXRpdmVFbGVtZW50VHlwZX0pYDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29sbGVjdGlvbiBraW5kOiAke3R5cGUuY29sbGVjdGlvbi5raW5kIGFzIGFueX1gLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5mb3JDbGFzcygke3RoaXMudG9KYXZhVHlwZSh0eXBlLCB7XG4gICAgICBmb3JNYXJzaGFsbGluZyxcbiAgICAgIGNvdmFyaWFudCxcbiAgICB9KX0uY2xhc3MpYDtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhVHlwZXMoXG4gICAgdHlwZXJlZjogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIHsgZm9yTWFyc2hhbGxpbmcgPSBmYWxzZSwgY292YXJpYW50ID0gZmFsc2UgfSA9IHt9LFxuICApOiBzdHJpbmdbXSB7XG4gICAgaWYgKHNwZWMuaXNQcmltaXRpdmVUeXBlUmVmZXJlbmNlKHR5cGVyZWYpKSB7XG4gICAgICByZXR1cm4gW3RoaXMudG9KYXZhUHJpbWl0aXZlKHR5cGVyZWYucHJpbWl0aXZlKV07XG4gICAgfSBlbHNlIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZXJlZikpIHtcbiAgICAgIHJldHVybiBbdGhpcy50b0phdmFDb2xsZWN0aW9uKHR5cGVyZWYsIHsgZm9yTWFyc2hhbGxpbmcsIGNvdmFyaWFudCB9KV07XG4gICAgfSBlbHNlIGlmIChzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKHR5cGVyZWYpKSB7XG4gICAgICByZXR1cm4gW3RoaXMudG9OYXRpdmVGcW4odHlwZXJlZi5mcW4pXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVyZWYudW5pb24pIHtcbiAgICAgIGNvbnN0IHR5cGVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3Qgc3VidHlwZSBvZiB0eXBlcmVmLnVuaW9uLnR5cGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLnRvSmF2YVR5cGVzKHN1YnR5cGUsIHtcbiAgICAgICAgICBmb3JNYXJzaGFsbGluZyxcbiAgICAgICAgICBjb3ZhcmlhbnQsXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgdHlwZXMucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZSByZWZlcmVuY2U6ICR7SlNPTi5zdHJpbmdpZnkodHlwZXJlZil9YCk7XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YUNvbGxlY3Rpb24oXG4gICAgcmVmOiBzcGVjLkNvbGxlY3Rpb25UeXBlUmVmZXJlbmNlLFxuICAgIHtcbiAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgY292YXJpYW50LFxuICAgIH06IHsgZm9yTWFyc2hhbGxpbmc6IGJvb2xlYW47IGNvdmFyaWFudDogYm9vbGVhbiB9LFxuICApIHtcbiAgICBjb25zdCBlbGVtZW50SmF2YVR5cGUgPSB0aGlzLnRvSmF2YVR5cGUocmVmLmNvbGxlY3Rpb24uZWxlbWVudHR5cGUsIHtcbiAgICAgIGNvdmFyaWFudCxcbiAgICB9KTtcbiAgICBjb25zdCB0eXBlQ29uc3RyYWludCA9IGNvdmFyaWFudFxuICAgICAgPyBtYWtlQ292YXJpYW50KGVsZW1lbnRKYXZhVHlwZSlcbiAgICAgIDogZWxlbWVudEphdmFUeXBlO1xuICAgIHN3aXRjaCAocmVmLmNvbGxlY3Rpb24ua2luZCkge1xuICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLkFycmF5OlxuICAgICAgICByZXR1cm4gZm9yTWFyc2hhbGxpbmdcbiAgICAgICAgICA/ICdqYXZhLnV0aWwuTGlzdCdcbiAgICAgICAgICA6IGBqYXZhLnV0aWwuTGlzdDwke3R5cGVDb25zdHJhaW50fT5gO1xuICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcDpcbiAgICAgICAgcmV0dXJuIGZvck1hcnNoYWxsaW5nXG4gICAgICAgICAgPyAnamF2YS51dGlsLk1hcCdcbiAgICAgICAgICA6IGBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICR7dHlwZUNvbnN0cmFpbnR9PmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIGNvbGxlY3Rpb24ga2luZDogJHtyZWYuY29sbGVjdGlvbi5raW5kIGFzIGFueX1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VDb3ZhcmlhbnQoamF2YVR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAvLyBEb24ndCBlbWl0IGEgY292YXJpYW50IGV4cHJlc3Npb24gZm9yIFN0cmluZyAoaXQncyBgZmluYWxgIGluIEphdmEpXG4gICAgICBpZiAoamF2YVR5cGUgPT09ICdqYXZhLmxhbmcuU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gamF2YVR5cGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD8gZXh0ZW5kcyAke2phdmFUeXBlfWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFQcmltaXRpdmUocHJpbWl0aXZlOiBzcGVjLlByaW1pdGl2ZVR5cGUpIHtcbiAgICBzd2l0Y2ggKHByaW1pdGl2ZSkge1xuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuQm9vbGVhbjpcbiAgICAgICAgcmV0dXJuICdqYXZhLmxhbmcuQm9vbGVhbic7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5EYXRlOlxuICAgICAgICByZXR1cm4gJ2phdmEudGltZS5JbnN0YW50JztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkpzb246XG4gICAgICAgIHJldHVybiAnY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSc7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5OdW1iZXI6XG4gICAgICAgIHJldHVybiAnamF2YS5sYW5nLk51bWJlcic7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiAnamF2YS5sYW5nLlN0cmluZyc7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5Bbnk6XG4gICAgICAgIHJldHVybiAnamF2YS5sYW5nLk9iamVjdCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJpbWl0aXZlIHR5cGU6ICR7cHJpbWl0aXZlIGFzIGFueX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck1ldGhvZENhbGxBcmd1bWVudHMobWV0aG9kOiBzcGVjLkNhbGxhYmxlKSB7XG4gICAgaWYgKCFtZXRob2QucGFyYW1ldGVycyB8fCBtZXRob2QucGFyYW1ldGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgcmVndWxhclBhcmFtcyA9IG1ldGhvZC5wYXJhbWV0ZXJzLmZpbHRlcigocCkgPT4gIXAudmFyaWFkaWMpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJlZ3VsYXJQYXJhbXMubWFwKF9yZW5kZXJQYXJhbWV0ZXIpO1xuICAgIGNvbnN0IHZhbHVlU3RyID0gYG5ldyBPYmplY3RbXSB7ICR7dmFsdWVzLmpvaW4oJywgJyl9IH1gO1xuICAgIGlmIChtZXRob2QudmFyaWFkaWMpIHtcbiAgICAgIGNvbnN0IHZhbHVlc1N0cmVhbSA9IGBqYXZhLnV0aWwuQXJyYXlzLjxPYmplY3Q+c3RyZWFtKCR7dmFsdWVTdHJ9KWA7XG5cbiAgICAgIGNvbnN0IGxhc3RQYXJhbSA9IG1ldGhvZC5wYXJhbWV0ZXJzW21ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgcmVzdFN0cmVhbSA9IGBqYXZhLnV0aWwuQXJyYXlzLjxPYmplY3Q+c3RyZWFtKCR7bGFzdFBhcmFtLm5hbWV9KWA7XG5cbiAgICAgIGNvbnN0IGZ1bGxTdHJlYW0gPVxuICAgICAgICByZWd1bGFyUGFyYW1zLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb25jYXQoJHt2YWx1ZXNTdHJlYW19LCAke3Jlc3RTdHJlYW19KWBcbiAgICAgICAgICA6IHJlc3RTdHJlYW07XG4gICAgICByZXR1cm4gYCwgJHtmdWxsU3RyZWFtfS50b0FycmF5KE9iamVjdFtdOjpuZXcpYDtcbiAgICB9XG4gICAgcmV0dXJuIGAsICR7dmFsdWVTdHJ9YDtcblxuICAgIGZ1bmN0aW9uIF9yZW5kZXJQYXJhbWV0ZXIocGFyYW06IHNwZWMuUGFyYW1ldGVyKSB7XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocGFyYW0ubmFtZSk7XG4gICAgICByZXR1cm4gaXNOdWxsYWJsZShwYXJhbSlcbiAgICAgICAgPyBzYWZlTmFtZVxuICAgICAgICA6IGBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCgke3NhZmVOYW1lfSwgXCIke3NhZmVOYW1lfSBpcyByZXF1aXJlZFwiKWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJNZXRob2RDYWxsKFxuICAgIGNsczogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QsXG4gICAgYXN5bmM6IGJvb2xlYW4sXG4gICkge1xuICAgIGxldCBzdGF0ZW1lbnQgPSAnJztcblxuICAgIGlmIChtZXRob2Quc3RhdGljKSB7XG4gICAgICBjb25zdCBqYXZhQ2xhc3MgPSB0aGlzLnRvSmF2YVR5cGUoY2xzKTtcbiAgICAgIHN0YXRlbWVudCArPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5qc2lpU3RhdGljQ2FsbCgke2phdmFDbGFzc30uY2xhc3MsIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlbWVudCArPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuS2VybmVsLiR7XG4gICAgICAgIGFzeW5jID8gJ2FzeW5jQ2FsbCcgOiAnY2FsbCdcbiAgICAgIH0odGhpcywgYDtcbiAgICB9XG5cbiAgICBzdGF0ZW1lbnQgKz0gYFwiJHttZXRob2QubmFtZX1cImA7XG5cbiAgICBpZiAobWV0aG9kLnJldHVybnMpIHtcbiAgICAgIHN0YXRlbWVudCArPSBgLCAke3RoaXMudG9OYXRpdmVUeXBlKG1ldGhvZC5yZXR1cm5zLnR5cGUsIHtcbiAgICAgICAgZm9yTWFyc2hhbGxpbmc6IHRydWUsXG4gICAgICB9KX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZW1lbnQgKz0gJywgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5WT0lEJztcbiAgICB9XG4gICAgc3RhdGVtZW50ICs9IGAke3RoaXMucmVuZGVyTWV0aG9kQ2FsbEFyZ3VtZW50cyhtZXRob2QpfSlgO1xuXG4gICAgaWYgKG1ldGhvZC5yZXR1cm5zKSB7XG4gICAgICBzdGF0ZW1lbnQgPSB0aGlzLndyYXBDb2xsZWN0aW9uKFxuICAgICAgICBzdGF0ZW1lbnQsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLnR5cGUsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLm9wdGlvbmFsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kLnJldHVybnMpIHtcbiAgICAgIHJldHVybiBgcmV0dXJuICR7c3RhdGVtZW50fTtgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7c3RhdGVtZW50fTtgO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGEgY29sbGVjdGlvbiBpbnRvIGFuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIGVsc2UgcmV0dXJucyB0aGUgZXhpc3Rpbmcgc3RhdGVtZW50LlxuICAgKiBAcGFyYW0gc3RhdGVtZW50IFRoZSBzdGF0ZW1lbnQgdG8gd3JhcCBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9wdGlvbmFsIFdoZXRoZXIgdGhlIHZhbHVlIGlzIG9wdGlvbmFsIChjYW4gYmUgbnVsbC91bmRlZmluZWQpIG9yIG5vdC5cbiAgICogQHJldHVybnMgVGhlIG1vZGlmaWVkIG9yIG9yaWdpbmFsIHN0YXRlbWVudC5cbiAgICovXG4gIHByaXZhdGUgd3JhcENvbGxlY3Rpb24oXG4gICAgc3RhdGVtZW50OiBzdHJpbmcsXG4gICAgdHlwZTogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIG9wdGlvbmFsPzogYm9vbGVhbixcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoc3BlYy5pc0NvbGxlY3Rpb25UeXBlUmVmZXJlbmNlKHR5cGUpKSB7XG4gICAgICBsZXQgd3JhcHBlcjogc3RyaW5nO1xuICAgICAgc3dpdGNoICh0eXBlLmNvbGxlY3Rpb24ua2luZCkge1xuICAgICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuQXJyYXk6XG4gICAgICAgICAgd3JhcHBlciA9ICd1bm1vZGlmaWFibGVMaXN0JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcDpcbiAgICAgICAgICB3cmFwcGVyID0gJ3VubW9kaWZpYWJsZU1hcCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIGNvbGxlY3Rpb24ga2luZDogJHt0eXBlLmNvbGxlY3Rpb24ua2luZCBhcyBhbnl9YCxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgXCJvcHRpb25hbFwiLCB0aGUgdmFsdWUgbmVlZHMgb3QgYmUgZXhwbGljaXRseSBjYXN0IHRvIGFsbG93IGZvciBjYXNlcyB3aGVyZSB0aGUgcmF3IHR5cGUgd2FzIHJldHVybmVkLlxuICAgICAgcmV0dXJuIG9wdGlvbmFsXG4gICAgICAgID8gYGphdmEudXRpbC5PcHRpb25hbC5vZk51bGxhYmxlKCgke3RoaXMudG9KYXZhVHlwZShcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgKX0pKCR7c3RhdGVtZW50fSkpLm1hcChqYXZhLnV0aWwuQ29sbGVjdGlvbnM6OiR7d3JhcHBlcn0pLm9yRWxzZShudWxsKWBcbiAgICAgICAgOiBgamF2YS51dGlsLkNvbGxlY3Rpb25zLiR7d3JhcHBlcn0oJHtzdGF0ZW1lbnR9KWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWV0aG9kUGFyYW1ldGVycyhtZXRob2Q6IHNwZWMuQ2FsbGFibGUpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcbiAgICBpZiAobWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgICAvLyBXZSBjYW4gcmVuZGVyIGNvdmFyaWFudCBwYXJhbWV0ZXJzIG9ubHkgZm9yIG1ldGhvZHMgdGhhdCBhcmVuJ3Qgb3ZlcnJpZGFibGUuLi4gc28gb25seSBmb3Igc3RhdGljIG1ldGhvZHMgY3VycmVudGx5LlxuICAgICAgICBwYXJhbXMucHVzaChcbiAgICAgICAgICBgZmluYWwgJHt0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGUocCwge1xuICAgICAgICAgICAgY292YXJpYW50OiAobWV0aG9kIGFzIHNwZWMuTWV0aG9kKS5zdGF0aWMsXG4gICAgICAgICAgfSl9JHtwLnZhcmlhZGljID8gJy4uLicgOiAnJ30gJHtKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKFxuICAgICAgICAgICAgcC5uYW1lLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcy5qb2luKCcsICcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBY2Nlc3NMZXZlbChtZXRob2Q6IHNwZWMuQ2FsbGFibGUgfCBzcGVjLlByb3BlcnR5KSB7XG4gICAgcmV0dXJuIG1ldGhvZC5wcm90ZWN0ZWQgPyAncHJvdGVjdGVkJyA6ICdwdWJsaWMnO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlTW9kdWxlQ2xhc3MobW9kdWxlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudG9OYXRpdmVGcW4obW9kdWxlTmFtZSl9LiR7TU9EVUxFX0NMQVNTX05BTUV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1vZHVsZUZpbGUobW9kOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZC5uYW1lO1xuICAgIGNvbnN0IG1vZHVsZUNsYXNzID0gdGhpcy5tYWtlTW9kdWxlQ2xhc3MobW9kdWxlTmFtZSk7XG5cbiAgICBjb25zdCB7IGZpbGVQYXRoOiBtb2R1bGVSZXNGaWxlLCBuYW1lOiBtb2R1bGVSZXNOYW1lIH0gPVxuICAgICAgdGhpcy50b0phdmFSZXNvdXJjZVBhdGgobW9kLCBgJHttb2QubmFtZX0uJHtNT0RVTEVfQ0xBU1NfTkFNRX1gKTtcbiAgICB0aGlzLmNvZGUub3BlbkZpbGUobW9kdWxlUmVzRmlsZSk7XG4gICAgZm9yIChjb25zdCBmcW4gb2YgT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS50eXBlcyA/PyB7fSkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke2Zxbn09JHt0aGlzLnRvTmF0aXZlRnFuKGZxbiwgeyBiaW5hcnlOYW1lOiB0cnVlIH0pfWApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUuY2xvc2VGaWxlKG1vZHVsZVJlc0ZpbGUpO1xuXG4gICAgY29uc3QgbW9kdWxlRmlsZSA9IHRoaXMudG9KYXZhRmlsZVBhdGgobW9kLCB7XG4gICAgICBhc3NlbWJseTogbW9kLm5hbWUsXG4gICAgICBmcW46IGAke21vZC5uYW1lfS4ke01PRFVMRV9DTEFTU19OQU1FfWAsXG4gICAgICBraW5kOiBzcGVjLlR5cGVLaW5kLkNsYXNzLFxuICAgICAgbmFtZTogTU9EVUxFX0NMQVNTX05BTUUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkZpbGUobW9kdWxlRmlsZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHBhY2thZ2UgJHt0aGlzLnRvTmF0aXZlTmFtZShtb2QpLnBhY2thZ2VOYW1lfTtgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIGlmIChPYmplY3Qua2V5cyhtb2QuZGVwZW5kZW5jaWVzID8/IHt9KS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsnKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEuaW8uUmVhZGVyOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5VbmNoZWNrZWRJT0V4Y2VwdGlvbjsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsnKTtcbiAgICBpZiAoT2JqZWN0LmtleXMobW9kLmRlcGVuZGVuY2llcyA/PyB7fSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsnKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLnV0aWwuTWFwOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpTW9kdWxlOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICB0aGlzLmNvZGUubGluZShBTk5fSU5URVJOQUwpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljIGZpbmFsIGNsYXNzICR7TU9EVUxFX0NMQVNTX05BTUV9IGV4dGVuZHMgSnNpaU1vZHVsZWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICdwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IE1PRFVMRV9UWVBFUyA9IGxvYWQoKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3ByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9hZCgpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8PigpOycpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYGZpbmFsIENsYXNzTG9hZGVyIGNsID0gJHtNT0RVTEVfQ0xBU1NfTkFNRX0uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgdHJ5IChmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IGNsLmdldFJlc291cmNlQXNTdHJlYW0oXCIke21vZHVsZVJlc05hbWV9XCIpO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgICAgIGZpbmFsIFJlYWRlciByZCA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAnICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZCkpJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdici5saW5lcygpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAgLmZpbHRlcihsaW5lIC0+ICFsaW5lLnRyaW0oKS5pc0VtcHR5KCkpJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnICAuZm9yRWFjaChsaW5lIC0+ICcpO1xuICAgIHRoaXMuY29kZS5saW5lKCdmaW5hbCBTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3BsaXQoXCI9XCIsIDIpOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdmaW5hbCBTdHJpbmcgZnFuID0gcGFydHNbMF07Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBwYXJ0c1sxXTsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmVzdWx0LnB1dChmcW4sIGNsYXNzTmFtZSk7Jyk7XG4gICAgdGhpcy5jb2RlLnVuaW5kZW50KCd9KTsnKTsgLy8gUHJveHkgZm9yIGNsb3NlQmxvY2tcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2NhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleGNlcHRpb24pJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3Rocm93IG5ldyBVbmNoZWNrZWRJT0V4Y2VwdGlvbihleGNlcHRpb24pOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiByZXN1bHQ7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAncHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gY2FjaGUgPSBuZXcgSGFzaE1hcDw+KCk7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICAvLyBjdG9yXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljICR7TU9EVUxFX0NMQVNTX05BTUV9KClgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBzdXBlcihcIiR7bW9kdWxlTmFtZX1cIiwgXCIke1xuICAgICAgICBtb2QudmVyc2lvblxuICAgICAgfVwiLCAke01PRFVMRV9DTEFTU19OQU1FfS5jbGFzcywgXCIke3RoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpfVwiKTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTsgLy8gY3RvclxuXG4gICAgLy8gZGVwZW5kZW5jaWVzXG4gICAgaWYgKG1vZC5kZXBlbmRlbmNpZXMgJiYgT2JqZWN0LmtleXMobW9kLmRlcGVuZGVuY2llcykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGVwcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBkZXAgb2YgT2JqZWN0LmtleXMobW9kLmRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgZGVwcy5wdXNoKGAke3RoaXMubWFrZU1vZHVsZUNsYXNzKGRlcCl9LmNsYXNzYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICAncHVibGljIExpc3Q8Q2xhc3M8PyBleHRlbmRzIEpzaWlNb2R1bGU+PiBnZXREZXBlbmRlbmNpZXMoKScsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiBhc0xpc3QoJHtkZXBzLmpvaW4oJywgJyl9KTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICdwcm90ZWN0ZWQgQ2xhc3M8Pz4gcmVzb2x2ZUNsYXNzKGZpbmFsIFN0cmluZyBmcW4pIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2lmICghTU9EVUxFX1RZUEVTLmNvbnRhaW5zS2V5KGZxbikpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAndGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oXCJVbmtub3duIEpTSUkgdHlwZTogXCIgKyBmcW4pOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5saW5lKCdTdHJpbmcgY2xhc3NOYW1lID0gTU9EVUxFX1RZUEVTLmdldChmcW4pOycpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2lmICghdGhpcy5jYWNoZS5jb250YWluc0tleShjbGFzc05hbWUpKScpO1xuICAgIHRoaXMuY29kZS5saW5lKCd0aGlzLmNhY2hlLnB1dChjbGFzc05hbWUsIHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSkpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiB0aGlzLmNhY2hlLmdldChjbGFzc05hbWUpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdwcml2YXRlIENsYXNzPD8+IGZpbmRDbGFzcyhmaW5hbCBTdHJpbmcgYmluYXJ5TmFtZSknKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCd0cnknKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIENsYXNzLmZvck5hbWUoYmluYXJ5TmFtZSk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdjYXRjaCAoZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGNlcHRpb24pJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUobW9kdWxlRmlsZSk7XG5cbiAgICByZXR1cm4gbW9kdWxlQ2xhc3M7XG4gIH1cblxuICBwcml2YXRlIGVtaXRKc2lpSW5pdGlhbGl6ZXJzKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7Y2xzLm5hbWV9KGZpbmFsIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3RSZWYgb2JqUmVmKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnc3VwZXIob2JqUmVmKTsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCAke2Nscy5uYW1lfShmaW5hbCBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LkluaXRpYWxpemF0aW9uTW9kZSBpbml0aWFsaXphdGlvbk1vZGUpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihpbml0aWFsaXphdGlvbk1vZGUpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIGphdmEgRlFOIGZvciBhIEpTSUkgRlFOOlxuICAgKiAxLiBEZXRlcm1pbmUgd2hpY2ggYXNzZW1ibHkgdGhlIEZRTiBiZWxvbmdzIHRvIChmaXJzdCBjb21wb25lbnQgb2YgdGhlIEZRTilcbiAgICogMi4gTG9jYXRlIHRoZSBgdGFyZ2V0cy5qYXZhLnBhY2thZ2VgIHZhbHVlIGZvciB0aGF0IGFzc2VtYmx5ICh0aGlzIGFzc2VtYmx5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcylcbiAgICogMy4gUmV0dXJuIHRoZSBqYXZhIEZRTjogYGA8bW9kdWxlLnRhcmdldHMuamF2YS5wYWNrYWdlPi48RlFOIHN0aXBwZWQgb2YgZmlyc3QgY29tcG9uZW50PmBgXG4gICAqXG4gICAqIFJlY29yZHMgYW4gYXNzZW1ibHkgcmVmZXJlbmNlIGlmIHRoZSByZWZlcmVuY2VkIEZRTiBjb21lcyBmcm9tIGEgZGlmZmVyZW50IGFzc2VtYmx5LlxuICAgKlxuICAgKiBAcGFyYW0gZnFuIHRoZSBKU0lJIEZRTiB0byBiZSB1c2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBKYXZhIEZRTi5cbiAgICpcbiAgICogQHRocm93cyBpZiB0aGUgYXNzZW1ibHkgdGhlIEZRTiBiZWxvbmdzIHRvIGRvZXMgbm90IGhhdmUgYSBgdGFyZ2V0cy5qYXZhLnBhY2thZ2VgIHNldC5cbiAgICovXG4gIHByaXZhdGUgdG9OYXRpdmVGcW4oXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgeyBiaW5hcnlOYW1lIH06IHsgYmluYXJ5TmFtZTogYm9vbGVhbiB9ID0geyBiaW5hcnlOYW1lOiBmYWxzZSB9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IFttb2RdID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZGVwTW9kID0gdGhpcy5maW5kTW9kdWxlKG1vZCk7XG4gICAgLy8gTWFrZSBzdXJlIGFueSBkZXBlbmRlbmN5IChkaXJlY3Qgb3IgdHJhbnNpdGl2ZSkgb2Ygd2hpY2ggYW55IHR5cGUgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkIGJ5IHRoZSBnZW5lcmF0ZWRcbiAgICAvLyBjb2RlIGlzIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgUE9NJ3MgZGVwZW5kZW5jaWVzIHNlY3Rpb24gKHByb3RlY3RpbmcgdGhlIGFydGlmYWN0IGZyb20gY2hhbmdlcyBpbiB0aGVcbiAgICAvLyBkZXBlbmRlbmNpZXMnIGRlcGVuZGVuY3kgc3RydWN0dXJlKS5cbiAgICBpZiAobW9kICE9PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIHRoaXMucmVmZXJlbmNlZE1vZHVsZXNbbW9kXSA9IGRlcE1vZDtcblxuICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRyYW5zbGF0ZUZxbih7IC4uLmRlcE1vZCwgbmFtZTogbW9kIH0sIGZxbik7XG4gICAgICByZXR1cm4gW3RyYW5zbGF0ZWQucGFja2FnZU5hbWUsIC4uLnRyYW5zbGF0ZWQudHlwZU5hbWVzXS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYWNrYWdlTmFtZSwgdHlwZU5hbWUgfSA9XG4gICAgICBmcW4gPT09IHRoaXMuYXNzZW1ibHkubmFtZVxuICAgICAgICA/IHRoaXMudG9OYXRpdmVOYW1lKHRoaXMuYXNzZW1ibHkpXG4gICAgICAgIDogdGhpcy50b05hdGl2ZU5hbWUodGhpcy5hc3NlbWJseSwgdGhpcy5hc3NlbWJseS50eXBlcyFbZnFuXSk7XG4gICAgY29uc3QgY2xhc3NOYW1lID1cbiAgICAgIHR5cGVOYW1lICYmIGJpbmFyeU5hbWUgPyB0eXBlTmFtZS5yZXBsYWNlKCcuJywgJyQnKSA6IHR5cGVOYW1lO1xuICAgIHJldHVybiBgJHtwYWNrYWdlTmFtZX0ke2NsYXNzTmFtZSA/IGAuJHtjbGFzc05hbWV9YCA6ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgSmF2YSBuYW1lIGZvciBhIGpzaWkgYXNzZW1ibHkgb3IgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIGFzc20gVGhlIGFzc2VtYmx5IHRoYXQgY29udGFpbnMgdGhlIHR5cGVcbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgd2Ugd2FudCB0aGUgbmFtZSBvZlxuICAgKi9cbiAgcHJpdmF0ZSB0b05hdGl2ZU5hbWUoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHR5cGVOYW1lOiB1bmRlZmluZWQ7XG4gIH07XG4gIHByaXZhdGUgdG9OYXRpdmVOYW1lKFxuICAgIGFzc206IHNwZWMuQXNzZW1ibHksXG4gICAgdHlwZTogc3BlYy5UeXBlLFxuICApOiB7IHBhY2thZ2VOYW1lOiBzdHJpbmc7IHR5cGVOYW1lOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSB0b05hdGl2ZU5hbWUoXG4gICAgYXNzbTogc3BlYy5Bc3NlbWJseSxcbiAgICB0eXBlPzogc3BlYy5UeXBlLFxuICApOiB7IHBhY2thZ2VOYW1lOiBzdHJpbmc7IHR5cGVOYW1lPzogc3RyaW5nIH0ge1xuICAgIGlmICghdHlwZSkge1xuICAgICAgcmV0dXJuIHsgcGFja2FnZU5hbWU6IHBhY2thZ2VOYW1lRnJvbUFzc2VtYmx5KGFzc20pIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHRyYW5zbGF0ZUZxbihhc3NtLCB0eXBlLmZxbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhY2thZ2VOYW1lOiB0cmFuc2xhdGVkLnBhY2thZ2VOYW1lLFxuICAgICAgdHlwZU5hbWU6IHRyYW5zbGF0ZWQudHlwZU5hbWVzLmpvaW4oJy4nKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGBgQEdlbmVyYXRlZGBgIGFubm90YXRpb24gaG9ub3JpbmcgdGhlIGBgdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm9gYCBzZXR0aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0R2VuZXJhdGVkQW5ub3RhdGlvbigpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm9cbiAgICAgID8gYCwgZGF0ZSA9IFwiJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGdlbmVyYXRvciA9IHRoaXMuZW1pdEZ1bGxHZW5lcmF0b3JJbmZvXG4gICAgICA/IGBqc2lpLXBhY21hay8ke1ZFUlNJT05fREVTQ31gXG4gICAgICA6ICdqc2lpLXBhY21hayc7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkKHZhbHVlID0gXCIke2dlbmVyYXRvcn1cIiR7ZGF0ZX0pYCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RXhhbXBsZShleGFtcGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNuaXBwZXQgPSB0eXBlU2NyaXB0U25pcHBldEZyb21Tb3VyY2UoXG4gICAgICBleGFtcGxlLFxuICAgICAgJ2V4YW1wbGUnLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMucm9zZXR0YS50cmFuc2xhdGVTbmlwcGV0KFxuICAgICAgc25pcHBldCxcbiAgICAgIFRhcmdldExhbmd1YWdlLkpBVkEsXG4gICAgKTtcbiAgICBpZiAoIXRyYW5zbGF0ZWQpIHtcbiAgICAgIHJldHVybiBleGFtcGxlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U2FtcGxlc0luTWFya2Rvd24obWFya2Rvd246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9zZXR0YS50cmFuc2xhdGVTbmlwcGV0c0luTWFya2Rvd24oXG4gICAgICBtYXJrZG93bixcbiAgICAgIFRhcmdldExhbmd1YWdlLkpBVkEsXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgICAodHJhbnMpID0+ICh7XG4gICAgICAgIGxhbmd1YWdlOiB0cmFucy5sYW5ndWFnZSxcbiAgICAgICAgc291cmNlOiB0aGlzLnByZWZpeERpc2NsYWltZXIodHJhbnMpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlZml4RGlzY2xhaW1lcih0cmFuc2xhdGVkOiBUcmFuc2xhdGlvbikge1xuICAgIGlmICh0cmFuc2xhdGVkLmRpZENvbXBpbGUgJiYgSU5DT01QTEVURV9ESVNDTEFJTUVSX0NPTVBJTElORykge1xuICAgICAgcmV0dXJuIGAvLyAke0lOQ09NUExFVEVfRElTQ0xBSU1FUl9DT01QSUxJTkd9XFxuJHt0cmFuc2xhdGVkLnNvdXJjZX1gO1xuICAgIH1cbiAgICBpZiAoIXRyYW5zbGF0ZWQuZGlkQ29tcGlsZSAmJiBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HKSB7XG4gICAgICByZXR1cm4gYC8vICR7SU5DT01QTEVURV9ESVNDTEFJTUVSX05PTkNPTVBJTElOR31cXG4ke3RyYW5zbGF0ZWQuc291cmNlfWA7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkLnNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5zIHRoZSBKYXZhIEZRTiBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpbnRlcmZhY2VzIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIHdoZW4gYSBuZXdcbiAgICogZGVmYXVsdCBpbnRlcmZhY2Ugb3IgcHJveHkgY2xhc3MgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgZm9yIHdoaWNoIGEgZGVmYXVsdCBpbnRlcmZhY2Ugb3IgcHJveHkgaXMgZW1pdHRlZC5cbiAgICogQHBhcmFtIGluY2x1ZGVUaGlzVHlwZSB3aGV0aGVyIHRoaXMgY2xhc3MncyBkZWZhdWx0IGludGVyZmFjZSBzaG91bGQgYmUgaW5jbHVkZWQgb3Igbm90LlxuICAgKlxuICAgKiBAcmV0dXJucyBhIGxpc3Qgb2YgSmF2YSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMuXG4gICAqL1xuICBwcml2YXRlIGRlZmF1bHRJbnRlcmZhY2VzRm9yKFxuICAgIHR5cGU6IHJlZmxlY3QuQ2xhc3NUeXBlIHwgcmVmbGVjdC5JbnRlcmZhY2VUeXBlLFxuICAgIHsgaW5jbHVkZVRoaXNUeXBlID0gZmFsc2UgfTogeyBpbmNsdWRlVGhpc1R5cGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgaWYgKFxuICAgICAgaW5jbHVkZVRoaXNUeXBlICYmXG4gICAgICBoYXNEZWZhdWx0SW50ZXJmYWNlcyh0eXBlLmFzc2VtYmx5KSAmJlxuICAgICAgdHlwZS5pc0ludGVyZmFjZVR5cGUoKVxuICAgICkge1xuICAgICAgcmVzdWx0LmFkZChcbiAgICAgICAgYCR7dGhpcy50b05hdGl2ZUZxbih0eXBlLmZxbil9LiR7SU5URVJGQUNFX0RFRkFVTFRfQ0xBU1NfTkFNRX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiB0eXBlLmludGVyZmFjZXMpIHtcbiAgICAgICAgaWYgKGhhc0RlZmF1bHRJbnRlcmZhY2VzKGlmYWNlLmFzc2VtYmx5KSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoXG4gICAgICAgICAgICBgJHt0aGlzLnRvTmF0aXZlRnFuKGlmYWNlLmZxbil9LiR7SU5URVJGQUNFX0RFRkFVTFRfQ0xBU1NfTkFNRX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGVmYXVsdEludGVyZmFjZXNGb3IoaWZhY2UpKSB7XG4gICAgICAgICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGUuaXNDbGFzc1R5cGUoKSAmJiB0eXBlLmJhc2UgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kZWZhdWx0SW50ZXJmYWNlc0Zvcih0eXBlLmJhc2UpKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIG1vZGVscyB0aGUgUE9NIHNjaGVtYSBmb3IgYSA8ZGVwZW5kZW5jeT4gZW50aXR5XG4gKiBAc2VlIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9wb20uaHRtbCNEZXBlbmRlbmNpZXNcbiAqL1xuaW50ZXJmYWNlIE1hdmVuRGVwZW5kZW5jeSB7XG4gIGdyb3VwSWQ6IHN0cmluZztcbiAgYXJ0aWZhY3RJZDogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgdHlwZT86IHN0cmluZztcbiAgc2NvcGU/OiAnY29tcGlsZScgfCAncHJvdmlkZWQnIHwgJ3J1bnRpbWUnIHwgJ3Rlc3QnIHwgJ3N5c3RlbSc7XG4gIHN5c3RlbVBhdGg/OiBzdHJpbmc7XG4gIG9wdGlvbmFsPzogYm9vbGVhbjtcblxuICAnI2NvbW1lbnQnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIExvb2tzIHVwIHRoZSBgQGpzaWkvamF2YS1ydW50aW1lYCBwYWNrYWdlIGZyb20gdGhlIGxvY2FsIHJlcG9zaXRvcnkuXG4gKiBJZiBpdCBjb250YWlucyBhIFwibWF2ZW4tcmVwb1wiIGRpcmVjdG9yeSwgaXQgd2lsbCBiZSBhZGRlZCBhcyBhIGxvY2FsIG1hdmVuIHJlcG9cbiAqIHNvIHdoZW4gd2UgYnVpbGQgbG9jYWxseSwgd2UgYnVpbGQgYWdhaW5zdCBpdCBhbmQgbm90IGFnYWluc3QgdGhlIG9uZSBwdWJsaXNoZWRcbiAqIHRvIE1hdmVuIENlbnRyYWwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRKYXZhUnVudGltZUxvY2FsUmVwb3NpdG9yeSgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuICAgIGNvbnN0IGphdmFSdW50aW1lID0gcmVxdWlyZSgnQGpzaWkvamF2YS1ydW50aW1lJyk7XG4gICAgbG9nZ2luZy5pbmZvKFxuICAgICAgYFVzaW5nIGxvY2FsIHZlcnNpb24gb2YgdGhlIEphdmEganNpaSBydW50aW1lIHBhY2thZ2UgYXQ6ICR7amF2YVJ1bnRpbWUucmVwb3NpdG9yeX1gLFxuICAgICk7XG4gICAgcmV0dXJuIGphdmFSdW50aW1lLnJlcG9zaXRvcnk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOdWxsYWJsZShvcHRpb25hbFZhbHVlOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFvcHRpb25hbFZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgb3B0aW9uYWxWYWx1ZS5vcHRpb25hbCB8fFxuICAgIChzcGVjLmlzUHJpbWl0aXZlVHlwZVJlZmVyZW5jZShvcHRpb25hbFZhbHVlLnR5cGUpICYmXG4gICAgICBvcHRpb25hbFZhbHVlLnR5cGUucHJpbWl0aXZlID09PSBzcGVjLlByaW1pdGl2ZVR5cGUuQW55KVxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJhbUphdmFkb2MoXG4gIG5hbWU6IHN0cmluZyxcbiAgb3B0aW9uYWw/OiBib29sZWFuLFxuICBzdW1tYXJ5Pzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHMgPSBbJ0BwYXJhbScsIG5hbWVdO1xuICBpZiAoc3VtbWFyeSkge1xuICAgIHBhcnRzLnB1c2goZW5kV2l0aFBlcmlvZChzdW1tYXJ5KSk7XG4gIH1cbiAgaWYgKCFvcHRpb25hbCkge1xuICAgIHBhcnRzLnB1c2goJ1RoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLicpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gZW5kV2l0aFBlcmlvZChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzID0gcy50cmltUmlnaHQoKTtcbiAgaWYgKCFzLmVuZHNXaXRoKCcuJykpIHtcbiAgICByZXR1cm4gYCR7c30uYDtcbiAgfVxuICByZXR1cm4gcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU92ZXJyaWRlczxUIGV4dGVuZHMgeyBwYXJhbTogc3BlYy5QYXJhbWV0ZXIgfT4oXG4gIGFsbFBhcmFtczogVFtdLFxuKTogSXRlcmFibGU8VFtdPiB7XG4gIHJldHVybiB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06IGZ1bmN0aW9uKiAoKSB7XG4gICAgICB5aWVsZCBhbGxQYXJhbXM7XG4gICAgICB3aGlsZSAoYWxsUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbGFzdFBhcmFtID0gYWxsUGFyYW1zW2FsbFBhcmFtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKCFsYXN0UGFyYW0ucGFyYW0udmFyaWFkaWMgJiYgIWxhc3RQYXJhbS5wYXJhbS5vcHRpb25hbCkge1xuICAgICAgICAgIC8vIE5laXRoZXIgdmFyaWFkaWMgbm9yIG9wdGlvbmFsIC0tIHdlJ3JlIGRvbmUgaGVyZSFcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYWxsUGFyYW1zID0gYWxsUGFyYW1zLnNsaWNlKDAsIGFsbFBhcmFtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgLy8gSWYgdGhlIGxhc3RQYXJhbSB3YXMgdmFyaWFkaWMsIHdlIHNob3VsZG4ndCBnZW5lcmF0ZSBhbiBvdmVycmlkZSB3aXRob3V0IGl0IG9ubHkuXG4gICAgICAgIGlmIChsYXN0UGFyYW0ucGFyYW0ub3B0aW9uYWwpIHtcbiAgICAgICAgICB5aWVsZCBhbGxQYXJhbXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG50eXBlIEFzc2VtYmx5TGlrZSA9IHNwZWMuQXNzZW1ibHlDb25maWd1cmF0aW9uICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5hdGl2ZSBwYWNrYWdlIG5hbWUgZnJvbSBhbiBhc3NlbWJseVxuICovXG5mdW5jdGlvbiBwYWNrYWdlTmFtZUZyb21Bc3NlbWJseShhc3NtOiBBc3NlbWJseUxpa2UpIHtcbiAgY29uc3QgamF2YVBhY2thZ2UgPSBhc3NtLnRhcmdldHM/LmphdmE/LnBhY2thZ2U7XG4gIGlmICghamF2YVBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIG1vZHVsZSAke2Fzc20ubmFtZX0gZG9lcyBub3QgaGF2ZSBhIGphdmEucGFja2FnZSBzZXR0aW5nYCxcbiAgICApO1xuICB9XG4gIHJldHVybiBqYXZhUGFja2FnZTtcbn1cblxuLyoqXG4gKiBBbmFseXplcyBhbmQgdHJhbnNsYXRlcyBhIGpzaWkgRlFOIHRvIEphdmEgY29tcG9uZW50c1xuICpcbiAqIFRoZSBGUU4gY2FuIGJlIG9mIHRoZSBhc3NlbWJseSwgYSBzdWJtb2R1bGUsIG9yIGEgdHlwZS5cbiAqXG4gKiBBbnkgdHlwZSBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAqXG4gKiAtIExvY2F0ZWQgaW4gemVybyBvciBtb3JlIG5lc3RlZCBzdWJtb2R1bGVzLiBBbnkgb2YgdGhlc2UgY2FuIGhhdmUgYSBKYXZhXG4gKiAgIHBhY2thZ2UgbmFtZSBhc3NpZ25lZC0taWYgbm9uZSwgdGhlIG5hbWUgaXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJ5XG4gKiAgIHNuYWtlIGNhc2luZy4gQXQgbGVhc3QgdGhlIGFzc2VtYmx5IG11c3QgaGF2ZSBhIEphdmEgcGFja2FnZSBuYW1lIGFzc2lnbmVkLlxuICogLSBMb2NhdGVkIGluIHplcm8gb3IgbW9yZSBuZXN0ZWQgdHlwZXMgKGNsYXNzZXMpLlxuICpcbiAqIEZpbmQgdXAgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHVudGlsIHdlIGZpbmQgYSBzdWJtb2R1bGUgKG9yIHRoZSBhc3NlbWJseVxuICogaXRzZWxmKSB0aGF0IGhhcyBhbiBleHBsaWNpdCBKYXZhIHBhY2thZ2UgbmFtZSBkZWZpbmVkLlxuICpcbiAqIEFwcGVuZCBhbGwgdGhlIG5hbWVzcGFjZXMgdGhhdCB3ZSBjcm9zc2VkIHRoYXQgZGlkbid0IGhhdmUgYSBwYWNrYWdlIG5hbWUgZGVmaW5lZC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBKYXZhIHBhY2thZ2UgbmFtZSBkZXRlcm1pbmVkIHRoaXMgd2F5LCBhcyB3ZWxsIGFzIHRoZSBoaWVyYXJjaHkgb2YgdHlwZVxuICogbmFtZXMgaW5zaWRlIHRoZSBwYWNrYWdlLiBgdHlwZU5hbWVzYCBtYXkgYmUgbWlzc2luZyBvciBlbXB0eSBpZiB0aGUgRlFOIGluZGljYXRlZFxuICogdGhlIGFzc2VtYmx5IG9yIGEgc3VibW9kdWxlLCBjb250YWlucyAxIGVsZW1lbnQgaWYgdGhlIEZRTiBpbmRpY2F0ZWQgYSB0b3AtbGV2ZWwgdHlwZSxcbiAqIG11bHRpcGxlIGVsZW1lbnRzIGlmIHRoZSBGUU4gaW5kaWNhdGVkIGEgbmVzdGVkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZUZxbihcbiAgYXNzbTogQXNzZW1ibHlMaWtlLFxuICBvcmlnaW5hbEZxbjogc3RyaW5nLFxuKTogeyBwYWNrYWdlTmFtZTogc3RyaW5nOyB0eXBlTmFtZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBpbXBsaWNpdFBhY2thZ2VOYW1lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgLy8gV2Ugd29yayBvdXJzZWx2ZXMgdXB3YXJkIHRocm91Z2ggdGhlIEZRTiB1bnRpbCB3ZSd2ZSBmb3VuZCBhbiBleHBsaWNpdCBwYWNrYWdlXG4gIGxldCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lRnJvbUFzc2VtYmx5KGFzc20pO1xuICBsZXQgZnFuID0gb3JpZ2luYWxGcW47XG4gIHdoaWxlIChmcW4gIT09ICcnICYmIGZxbiAhPT0gYXNzbS5uYW1lKSB7XG4gICAgY29uc3QgW3BhcmVudEZxbiwgbGFzdFBhcnRdID0gc3BsaXROYW1lc3BhY2UoZnFuKTtcblxuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IGFzc20uc3VibW9kdWxlcz8uW2Zxbl07XG4gICAgaWYgKHN1Ym1vZHVsZSkge1xuICAgICAgY29uc3QgZXhwbGljaXRQYWNrYWdlID0gc3VibW9kdWxlLnRhcmdldHM/LmphdmE/LnBhY2thZ2U7XG4gICAgICBpZiAoZXhwbGljaXRQYWNrYWdlKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gZXhwbGljaXRQYWNrYWdlO1xuICAgICAgICAvLyBXZSBjYW4gc3RvcCByZWN1cnNpbmcsIHR5cGVzIGNhbm5vdCBiZSB0aGUgcGFyZW50IG9mIGEgbW9kdWxlIGFuZCBub3RoaW5nIHVwd2FyZHMgY2FuIGNoYW5nZVxuICAgICAgICAvLyB0aGUgcGFja2FnZSBuYW1lIGFueW1vcmVcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpbXBsaWNpdFBhY2thZ2VOYW1lcy51bnNoaWZ0KGAuJHt0b1NuYWtlQ2FzZShsYXN0UGFydCl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGl0J3Mgbm90IGEgc3VibW9kdWxlLCBpdCBtdXN0IGJlIGEgdHlwZS5cbiAgICAgIHR5cGVOYW1lcy51bnNoaWZ0KGxhc3RQYXJ0KTtcbiAgICB9XG5cbiAgICBmcW4gPSBwYXJlbnRGcW47XG4gIH1cbiAgaWYgKGZxbiA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kICcke29yaWdpbmFsRnFufScgaW5zaWRlICcke2Fzc20ubmFtZX0nYCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwYWNrYWdlTmFtZTogYCR7cGFja2FnZU5hbWV9JHtpbXBsaWNpdFBhY2thZ2VOYW1lcy5qb2luKCcnKX1gLFxuICAgIHR5cGVOYW1lcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGFzc2VtYmx5IGV4cG9zZXMgdGhlIFwiaGFzRGVmYXVsdEludGVyZmFjZXNcIlxuICoganNpaS1wYWNtYWsgZmVhdHVyZSBmbGFnLlxuICpcbiAqIEBwYXJhbSBhc3NlbWJseSB0aGUgYXNzZW1ibHkgdGhhdCBpcyB0ZXN0ZWRcbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBKc2lpJERlZmF1bHQgaW50ZXJmYWNlcyBjYW4gYmUgdXNlZFxuICovXG5mdW5jdGlvbiBoYXNEZWZhdWx0SW50ZXJmYWNlcyhhc3NlbWJseTogcmVmbGVjdC5Bc3NlbWJseSk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFhc3NlbWJseS5tZXRhZGF0YT8uanNpaT8ucGFjbWFrPy5oYXNEZWZhdWx0SW50ZXJmYWNlcztcbn1cblxuLyoqXG4gKiBXaGVja3Mgd2hldGhlciBhIG5hbWUgY29ycmVzcG9uZHMgdG8gYSBtZXRob2Qgb24gYGphdmEubGFuZy5PYmplY3RgLiBJdCBpcyBub3RcbiAqIHBvc3NpYmxlIHRvIGVtaXQgZGVmYXVsdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHRob3NlIG5hbWVzIGJlY2F1c2VcbiAqIHRoZXNlIHdvdWxkIGFsd2F5cyBiZSByZXBsYWNlZCBieSB0aGUgaW1wbGVtZW50YXRpb25zIG9uIGBPYmplY3RgLlxuICpcbiAqIEBwYXJhbSBuYW1lIHRoZSBjaGVja2VkIG5hbWVcbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgbmFtZS5cbiAqL1xuZnVuY3Rpb24gaXNKYXZhTGFuZ09iamVjdE1ldGhvZE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBKQVZBX0xBTkdfT0JKRUNUX01FVEhPRF9OQU1FUy5oYXMobmFtZSk7XG59XG5jb25zdCBKQVZBX0xBTkdfT0JKRUNUX01FVEhPRF9OQU1FUyA9IG5ldyBTZXQoW1xuICAnY2xvbmUnLFxuICAnZXF1YWxzJyxcbiAgJ2ZpbmFsaXplJyxcbiAgJ2dldENsYXNzJyxcbiAgJ2hhc2hDb2RlJyxcbiAgJ25vdGlmeScsXG4gICdub3RpZnlBbGwnLFxuICAndG9TdHJpbmcnLFxuICAnd2FpdCcsXG5dKTtcblxuLyoqXG4gKiBJbiBhIGRvdHRlZCBzdHJpbmcsIHN0cmlwIG9mZiB0aGUgbGFzdCBkb3R0ZWQgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIHNwbGl0TmFtZXNwYWNlKG5zOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgY29uc3QgZG90ID0gbnMubGFzdEluZGV4T2YoJy4nKTtcbiAgaWYgKGRvdCA9PT0gLTEpIHtcbiAgICByZXR1cm4gWycnLCBuc107XG4gIH1cbiAgcmV0dXJuIFtucy5zdWJzdHIoMCwgZG90KSwgbnMuc3Vic3RyKGRvdCArIDEpXTtcbn1cbiJdfQ==
|
|
2388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImphdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLCtCQUErQjtBQUMvQix5REFBdUQ7QUFDdkQsK0JBQStCO0FBRS9CLCtDQU9zQjtBQUN0Qiw2QkFBNkI7QUFDN0IseUNBQXlDO0FBR3pDLDRDQUF5QztBQUN6QyxzQ0FBc0M7QUFDdEMsZ0RBQWtEO0FBRWxELHNDQUttQjtBQUNuQixrQ0FBNkQ7QUFDN0Qsd0NBQW1EO0FBQ25ELHFDQUE2RDtBQUM3RCxtREFBd0U7QUFFeEUsd0JBQW1FO0FBRW5FLG9HQUFvRztBQUNwRyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVyRCxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztBQUVyQyxNQUFNLFlBQVksR0FBRyxvQ0FBb0MsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxxQ0FBcUMsQ0FBQztBQUMzRCxNQUFNLFlBQVksR0FBRyxnQ0FBZ0MsQ0FBQztBQUV0RDs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsV0FBVztJQUd0QixZQUNtQixPQUE4QixFQUM5QixPQUFxQjtRQURyQixZQUFPLEdBQVAsT0FBTyxDQUF1QjtRQUM5QixZQUFPLEdBQVAsT0FBTyxDQUFjO1FBSnZCLGVBQVUsR0FBRyxNQUFNLENBQUM7SUFLbEMsQ0FBQztJQUVHLEtBQUssQ0FBQyxZQUFZO1FBQ3ZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDekIsdURBQXVEO1lBQ3ZELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsTUFB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VyxFQUFFLEdBQUcsV0FBVyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUM3RCxTQUFTO0tBQ1YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxRQUEwQjs7SUFDdEQsT0FBTyxDQUFDLG9CQUFDLFFBQVEsQ0FBQyxRQUFRLDBDQUFFLElBQUksMENBQUUsTUFBTSwwQ0FBRSxvQkFBb0IsQ0FBQSxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsMEJBQTBCLENBQUMsSUFBWTtJQUM5QyxPQUFPLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBQ0QsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM1QyxPQUFPO0lBQ1AsUUFBUTtJQUNSLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsVUFBVTtJQUNWLE1BQU07Q0FDUCxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILFNBQVMsY0FBYyxDQUFDLEVBQVU7SUFDaEMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNkLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDakI7SUFDRCxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcbmltcG9ydCAqIGFzIGNsb25lIGZyb20gJ2Nsb25lJztcbmltcG9ydCB7IHRvU25ha2VDYXNlIH0gZnJvbSAnY29kZW1ha2VyL2xpYi9jYXNlLXV0aWxzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCB7XG4gIFJvc2V0dGEsXG4gIFRhcmdldExhbmd1YWdlLFxuICBUcmFuc2xhdGlvbixcbiAgZW5mb3JjZXNTdHJpY3RNb2RlLFxuICBtYXJrRG93blRvSmF2YURvYyxcbiAgQXBpTG9jYXRpb24sXG59IGZyb20gJ2pzaWktcm9zZXR0YSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgeG1sYnVpbGRlciBmcm9tICd4bWxidWlsZGVyJztcblxuaW1wb3J0IHsgVGFyZ2V0QnVpbGRlciwgQnVpbGRPcHRpb25zIH0gZnJvbSAnLi4vYnVpbGRlcic7XG5pbXBvcnQgeyBHZW5lcmF0b3IgfSBmcm9tICcuLi9nZW5lcmF0b3InO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tICcuLi9sb2dnaW5nJztcbmltcG9ydCB7IGpzaWlUb1Bhc2NhbENhc2UgfSBmcm9tICcuLi9uYW1pbmctdXRpbCc7XG5pbXBvcnQgeyBKc2lpTW9kdWxlIH0gZnJvbSAnLi4vcGFja2FnaW5nJztcbmltcG9ydCB7XG4gIFBhY2thZ2VJbmZvLFxuICBUYXJnZXQsXG4gIGZpbmRMb2NhbEJ1aWxkRGlycyxcbiAgVGFyZ2V0T3B0aW9ucyxcbn0gZnJvbSAnLi4vdGFyZ2V0JztcbmltcG9ydCB7IHNoZWxsLCBTY3JhdGNoLCBzbHVnaWZ5LCBzZXRFeHRlbmQgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IFZFUlNJT04sIFZFUlNJT05fREVTQyB9IGZyb20gJy4uL3ZlcnNpb24nO1xuaW1wb3J0IHsgc3RhYmlsaXR5UHJlZml4Rm9yLCByZW5kZXJTdW1tYXJ5IH0gZnJvbSAnLi9fdXRpbHMnO1xuaW1wb3J0IHsgdG9NYXZlblZlcnNpb25SYW5nZSwgdG9SZWxlYXNlVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi11dGlscyc7XG5cbmltcG9ydCB7IElOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkcsIFRhcmdldE5hbWUgfSBmcm9tICcuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgQlVJTERFUl9DTEFTU19OQU1FID0gJ0J1aWxkZXInO1xuXG5jb25zdCBBTk5fTk9UX05VTEwgPSAnQG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbCc7XG5jb25zdCBBTk5fTlVMTEFCTEUgPSAnQG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGUnO1xuY29uc3QgQU5OX0lOVEVSTkFMID0gJ0Bzb2Z0d2FyZS5hbWF6b24uanNpaS5JbnRlcm5hbCc7XG5cbi8qKlxuICogQnVpbGQgSmF2YSBwYWNrYWdlcyBhbGwgdG9nZXRoZXIsIGJ5IGdlbmVyYXRpbmcgYW4gYWdncmVnYXRlIFBPTVxuICpcbiAqIFRoaXMgd2lsbCBtYWtlIHRoZSBKYXZhIGJ1aWxkIGEgbG90IG1vcmUgZWZmaWNpZW50ICh+MzAwJSkuXG4gKlxuICogRG8gdGhpcyBieSBjb3B5aW5nIHRoZSBjb2RlIGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBnZW5lcmF0aW5nIGFuIGFnZ3JlZ2F0ZVxuICogUE9NIHRoZXJlLCBhbmQgdGhlbiBjb3B5aW5nIHRoZSBhcnRpZmFjdHMgYmFjayBpbnRvIHRoZSByZXNwZWN0aXZlIG91dHB1dFxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBKYXZhQnVpbGRlciBpbXBsZW1lbnRzIFRhcmdldEJ1aWxkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldE5hbWUgPSAnamF2YSc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlczogcmVhZG9ubHkgSnNpaU1vZHVsZVtdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQnVpbGRPcHRpb25zLFxuICApIHt9XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkTW9kdWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb2R1bGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29kZU9ubHkpIHtcbiAgICAgIC8vIFNpbXBsZSwganVzdCBnZW5lcmF0ZSBjb2RlIHRvIHJlc3BlY3RpdmUgb3V0cHV0IGRpcnNcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0aGlzLm1vZHVsZXMubWFwKChtb2R1bGUpID0+XG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vZHVsZUNvZGUoXG4gICAgICAgICAgICBtb2R1bGUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICB0aGlzLm91dHB1dERpcihtb2R1bGUub3V0cHV0RGlyZWN0b3J5KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgbWFrZSBhIHNpbmdsZSB0ZW1wZGlyIHRvIGhvbGQgYWxsIHNvdXJjZXMsIGJ1aWxkIHRoZW0gdG9nZXRoZXIgYW5kIGNvcHkgdGhlbSBiYWNrIG91dFxuICAgIGNvbnN0IHNjcmF0Y2hEaXJzOiBBcnJheTxTY3JhdGNoPGFueT4+ID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbXBTb3VyY2VEaXIgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQWdncmVnYXRlU291cmNlRGlyKFxuICAgICAgICB0aGlzLm1vZHVsZXMsXG4gICAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgICk7XG4gICAgICBzY3JhdGNoRGlycy5wdXNoKHRlbXBTb3VyY2VEaXIpO1xuXG4gICAgICAvLyBOZWVkIGFueSBvbGQgbW9kdWxlIG9iamVjdCB0byBtYWtlIGEgdGFyZ2V0IHRvIGJlIGFibGUgdG8gaW52b2tlIGJ1aWxkLCB0aG91Z2ggbm9uZSBvZiBpdHMgc2V0dGluZ3NcbiAgICAgIC8vIHdpbGwgYmUgdXNlZC5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMubWFrZVRhcmdldCh0aGlzLm1vZHVsZXNbMF0sIHRoaXMub3B0aW9ucyk7XG4gICAgICBjb25zdCB0ZW1wT3V0cHV0RGlyID0gYXdhaXQgU2NyYXRjaC5tYWtlKGFzeW5jIChkaXIpID0+IHtcbiAgICAgICAgbG9nZ2luZy5kZWJ1ZyhgQnVpbGRpbmcgSmF2YSBjb2RlIHRvICR7ZGlyfWApO1xuICAgICAgICBhd2FpdCB0YXJnZXQuYnVpbGQodGVtcFNvdXJjZURpci5kaXJlY3RvcnksIGRpcik7XG4gICAgICB9KTtcbiAgICAgIHNjcmF0Y2hEaXJzLnB1c2godGVtcE91dHB1dERpcik7XG5cbiAgICAgIGF3YWl0IHRoaXMuY29weU91dEFydGlmYWN0cyhcbiAgICAgICAgdGVtcE91dHB1dERpci5kaXJlY3RvcnksXG4gICAgICAgIHRlbXBTb3VyY2VEaXIub2JqZWN0LFxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbGVhbikge1xuICAgICAgICBhd2FpdCBTY3JhdGNoLmNsZWFudXBBbGwoc2NyYXRjaERpcnMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dpbmcud2FybihcbiAgICAgICAgYEV4Y2VwdGlvbiBvY2N1cnJlZCwgbm90IGNsZWFuaW5nIHVwICR7c2NyYXRjaERpcnNcbiAgICAgICAgICAubWFwKChzKSA9PiBzLmRpcmVjdG9yeSlcbiAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU1vZHVsZUNvZGUoXG4gICAgbW9kdWxlOiBKc2lpTW9kdWxlLFxuICAgIG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyxcbiAgICB3aGVyZTogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLm1ha2VUYXJnZXQobW9kdWxlLCBvcHRpb25zKTtcbiAgICBsb2dnaW5nLmRlYnVnKGBHZW5lcmF0aW5nIEphdmEgY29kZSBpbnRvICR7d2hlcmV9YCk7XG4gICAgYXdhaXQgdGFyZ2V0LmdlbmVyYXRlQ29kZSh3aGVyZSwgbW9kdWxlLnRhcmJhbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFnZ3JlZ2F0ZVNvdXJjZURpcihcbiAgICBtb2R1bGVzOiByZWFkb25seSBKc2lpTW9kdWxlW10sXG4gICAgb3B0aW9uczogQnVpbGRPcHRpb25zLFxuICApOiBQcm9taXNlPFNjcmF0Y2g8VGVtcG9yYXJ5SmF2YVBhY2thZ2VbXT4+IHtcbiAgICByZXR1cm4gU2NyYXRjaC5tYWtlKGFzeW5jICh0bXBEaXI6IHN0cmluZykgPT4ge1xuICAgICAgbG9nZ2luZy5kZWJ1ZyhgR2VuZXJhdGluZyBhZ2dyZWdhdGUgSmF2YSBzb3VyY2UgZGlyIGF0ICR7dG1wRGlyfWApO1xuICAgICAgY29uc3QgcmV0OiBUZW1wb3JhcnlKYXZhUGFja2FnZVtdID0gW107XG5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZE1vZHVsZXMgPSBtb2R1bGVzXG4gICAgICAgIC5tYXAoKG1vZHVsZSkgPT4gKHsgbW9kdWxlLCByZWxhdGl2ZU5hbWU6IHNsdWdpZnkobW9kdWxlLm5hbWUpIH0pKVxuICAgICAgICAubWFwKCh7IG1vZHVsZSwgcmVsYXRpdmVOYW1lIH0pID0+ICh7XG4gICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgIHJlbGF0aXZlTmFtZSxcbiAgICAgICAgICBzb3VyY2VEaXI6IHBhdGguam9pbih0bXBEaXIsIHJlbGF0aXZlTmFtZSksXG4gICAgICAgIH0pKVxuICAgICAgICAubWFwKCh7IG1vZHVsZSwgcmVsYXRpdmVOYW1lLCBzb3VyY2VEaXIgfSkgPT5cbiAgICAgICAgICB0aGlzLmdlbmVyYXRlTW9kdWxlQ29kZShtb2R1bGUsIG9wdGlvbnMsIHNvdXJjZURpcikudGhlbigoKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgcmVsYXRpdmVOYW1lLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCB7IG1vZHVsZSwgcmVsYXRpdmVOYW1lIH0gb2YgZ2VuZXJhdGVkTW9kdWxlcykge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgcmVsYXRpdmVTb3VyY2VEaXI6IHJlbGF0aXZlTmFtZSxcbiAgICAgICAgICByZWxhdGl2ZUFydGlmYWN0c0RpcjogbW9kdWxlQXJ0aWZhY3RzU3ViZGlyKG1vZHVsZSksXG4gICAgICAgICAgb3V0cHV0VGFyZ2V0RGlyZWN0b3J5OiBtb2R1bGUub3V0cHV0RGlyZWN0b3J5LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUFnZ3JlZ2F0ZVBvbShcbiAgICAgICAgdG1wRGlyLFxuICAgICAgICByZXQubWFwKChtKSA9PiBtLnJlbGF0aXZlU291cmNlRGlyKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlTWF2ZW5TZXR0aW5nc0ZvckxvY2FsRGVwcyh0bXBEaXIpO1xuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFnZ3JlZ2F0ZVBvbSh3aGVyZTogc3RyaW5nLCBtb2R1bGVOYW1lczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBhZ2dyZWdhdGVQb20gPSB4bWxidWlsZGVyXG4gICAgICAuY3JlYXRlKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvamVjdDoge1xuICAgICAgICAgICAgJ0B4bWxucyc6ICdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnLFxuICAgICAgICAgICAgJ0B4bWxuczp4c2knOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLFxuICAgICAgICAgICAgJ0B4c2k6c2NoZW1hTG9jYXRpb24nOlxuICAgICAgICAgICAgICAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkJyxcbiAgICAgICAgICAgICcjY29tbWVudCc6IFtcbiAgICAgICAgICAgICAgYEdlbmVyYXRlZCBieSBqc2lpLXBhY21ha0Ake1ZFUlNJT05fREVTQ30gb24gJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCxcbiAgICAgICAgICAgIF0sXG5cbiAgICAgICAgICAgIG1vZGVsVmVyc2lvbjogJzQuMC4wJyxcbiAgICAgICAgICAgIHBhY2thZ2luZzogJ3BvbScsXG5cbiAgICAgICAgICAgIGdyb3VwSWQ6ICdzb2Z0d2FyZS5hbWF6b24uanNpaScsXG4gICAgICAgICAgICBhcnRpZmFjdElkOiAnYWdncmVnYXRlcG9tJyxcbiAgICAgICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG5cbiAgICAgICAgICAgIG1vZHVsZXM6IHtcbiAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGVOYW1lcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBlbmNvZGluZzogJ1VURi04JyB9LFxuICAgICAgKVxuICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KTtcblxuICAgIGxvZ2dpbmcuZGVidWcoYEdlbmVyYXRlZCAke3doZXJlfS9wb20ueG1sYCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbih3aGVyZSwgJ3BvbS54bWwnKSwgYWdncmVnYXRlUG9tKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weU91dEFydGlmYWN0cyhcbiAgICBhcnRpZmFjdHNSb290OiBzdHJpbmcsXG4gICAgcGFja2FnZXM6IFRlbXBvcmFyeUphdmFQYWNrYWdlW10sXG4gICkge1xuICAgIGxvZ2dpbmcuZGVidWcoJ0NvcHlpbmcgb3V0IEphdmEgYXJ0aWZhY3RzJyk7XG4gICAgLy8gVGhlIGFydGlmYWN0cyBkaXJlY3RvcnkgbG9va3MgbGlrZSB0aGlzOlxuICAgIC8vICAvdG1wL1hYWC9zb2Z0d2FyZS9hbWF6b24vYXdzY2RrL3NvbWV0aGluZy92MS4yLjNcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9lbHNlL3YxLjIuM1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL2VudGlyZWx5L3YxLjIuM1xuICAgIC8vXG4gICAgLy8gV2UgZ2V0IHRoZSAnc29mdHdhcmUvYW1hem9uL2F3c2Nkay9zb21ldGhpbmcnIHBhdGggZnJvbSB0aGUgcGFja2FnZSwgaWRlbnRpZnlpbmdcbiAgICAvLyB0aGUgZmlsZXMgd2UgbmVlZCB0byBjb3B5LCBpbmNsdWRpbmcgTWF2ZW4gbWV0YWRhdGEuIEJ1dCB3ZSBuZWVkIHRvIHJlY3JlYXRlXG4gICAgLy8gdGhlIHdob2xlIHBhdGggaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkuXG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VzLm1hcChhc3luYyAocGtnKSA9PiB7XG4gICAgICAgIGNvbnN0IGFydGlmYWN0c1NvdXJjZSA9IHBhdGguam9pbihcbiAgICAgICAgICBhcnRpZmFjdHNSb290LFxuICAgICAgICAgIHBrZy5yZWxhdGl2ZUFydGlmYWN0c0RpcixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RzRGVzdCA9IHBhdGguam9pbihcbiAgICAgICAgICB0aGlzLm91dHB1dERpcihwa2cub3V0cHV0VGFyZ2V0RGlyZWN0b3J5KSxcbiAgICAgICAgICBwa2cucmVsYXRpdmVBcnRpZmFjdHNEaXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgZnMubWtkaXJwKGFydGlmYWN0c0Rlc3QpO1xuICAgICAgICBhd2FpdCBmcy5jb3B5KGFydGlmYWN0c1NvdXJjZSwgYXJ0aWZhY3RzRGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBhcHBlbmQgJ2phdmEnIHRvIHRoZSBnaXZlbiBvdXRwdXQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIG91dHB1dERpcihkZWNsYXJlZERpcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYW5ndWFnZVN1YmRpcmVjdG9yeVxuICAgICAgPyBwYXRoLmpvaW4oZGVjbGFyZWREaXIsIHRoaXMudGFyZ2V0TmFtZSlcbiAgICAgIDogZGVjbGFyZWREaXI7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG1hdmVuIHNldHRpbmdzIGZpbGUgZm9yIHRoaXMgYnVpbGQuXG4gICAqIEBwYXJhbSB3aGVyZSBUaGUgZ2VuZXJhdGVkIHNvdXJjZXMgZGlyZWN0b3J5LiBUaGlzIGlzIHdoZXJlIHVzZXIueG1sIHdpbGwgYmUgcGxhY2VkLlxuICAgKiBAcGFyYW0gY3VycmVudE91dHB1dERpcmVjdG9yeSBUaGUgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5LiBXaWxsIGJlIGFkZGVkIGFzIGEgbG9jYWwgbWF2ZW4gcmVwby5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNYXZlblNldHRpbmdzRm9yTG9jYWxEZXBzKHdoZXJlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3aGVyZSwgJ3VzZXIueG1sJyk7XG5cbiAgICAvLyB0cmF2ZXJzZSB0aGUgZGVwIGdyYXBoIG9mIHRoaXMgbW9kdWxlIGFuZCBmaW5kIGFsbCBtb2R1bGVzIHRoYXQgaGF2ZVxuICAgIC8vIGFuIDxvdXRkaXI+L2phdmEgZGlyZWN0b3J5LiB3ZSB3aWxsIGFkZCB0aG9zZSBhcyBsb2NhbCBtYXZlblxuICAgIC8vIHJlcG9zaXRvcmllcyB3aGljaCB3aWxsIHJlc29sdmUgaW5zdGVhZCBvZiBNYXZlbiBDZW50cmFsIGZvciB0aG9zZVxuICAgIC8vIG1vZHVsZS4gdGhpcyBlbmFibGVzIGJ1aWxkaW5nIGFnYWluc3QgbG9jYWwgbW9kdWxlcyAoaS5lLiBpbiBsZXJuYVxuICAgIC8vIHJlcG9zaXRvcmllcyBvciBsaW5rZWQgbW9kdWxlcykuXG4gICAgY29uc3QgYWxsRGVwc091dHB1dERpcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHJlc29sdmVkTW9kdWxlcyA9IHRoaXMubW9kdWxlcy5tYXAoYXN5bmMgKG1vZCkgPT4gKHtcbiAgICAgIG1vZHVsZTogbW9kLFxuICAgICAgbG9jYWxCdWlsZERpcnM6IGF3YWl0IGZpbmRMb2NhbEJ1aWxkRGlycyhcbiAgICAgICAgbW9kLm1vZHVsZURpcmVjdG9yeSxcbiAgICAgICAgdGhpcy50YXJnZXROYW1lLFxuICAgICAgKSxcbiAgICB9KSk7XG4gICAgZm9yIGF3YWl0IChjb25zdCB7IG1vZHVsZSwgbG9jYWxCdWlsZERpcnMgfSBvZiByZXNvbHZlZE1vZHVsZXMpIHtcbiAgICAgIHNldEV4dGVuZChhbGxEZXBzT3V0cHV0RGlycywgbG9jYWxCdWlsZERpcnMpO1xuXG4gICAgICAvLyBBbHNvIGluY2x1ZGUgb3V0cHV0IGRpcmVjdG9yeSB3aGVyZSB3ZSdyZSBidWlsZGluZyB0bywgaW4gY2FzZSB3ZSBidWlsZCBtdWx0aXBsZSBwYWNrYWdlcyBpbnRvXG4gICAgICAvLyB0aGUgc2FtZSBvdXRwdXQgZGlyZWN0b3J5LlxuICAgICAgYWxsRGVwc091dHB1dERpcnMuYWRkKFxuICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgbW9kdWxlLm91dHB1dERpcmVjdG9yeSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFuZ3VhZ2VTdWJkaXJlY3RvcnkgPyB0aGlzLnRhcmdldE5hbWUgOiAnJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxSZXBvcyA9IEFycmF5LmZyb20oYWxsRGVwc091dHB1dERpcnMpO1xuXG4gICAgLy8gaWYgamF2YS1ydW50aW1lIGlzIGNoZWNrZWQtb3V0IGFuZCB3ZSBjYW4gZmluZCBhIGxvY2FsIHJlcG9zaXRvcnksXG4gICAgLy8gYWRkIGl0IHRvIHRoZSBsaXN0LlxuICAgIGNvbnN0IGxvY2FsSmF2YVJ1bnRpbWUgPSBhd2FpdCBmaW5kSmF2YVJ1bnRpbWVMb2NhbFJlcG9zaXRvcnkoKTtcbiAgICBpZiAobG9jYWxKYXZhUnVudGltZSkge1xuICAgICAgbG9jYWxSZXBvcy5wdXNoKGxvY2FsSmF2YVJ1bnRpbWUpO1xuICAgIH1cblxuICAgIGxvZ2dpbmcuZGVidWcoJ2xvY2FsIG1hdmVuIHJlcG9zOicsIGxvY2FsUmVwb3MpO1xuXG4gICAgY29uc3QgcHJvZmlsZU5hbWUgPSAnbG9jYWwtanNpaS1tb2R1bGVzJztcbiAgICBjb25zdCBzZXR0aW5ncyA9IHhtbGJ1aWxkZXJcbiAgICAgIC5jcmVhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgJ0B4bWxucyc6ICdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnLFxuICAgICAgICAgICAgJ0B4bWxuczp4c2knOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLFxuICAgICAgICAgICAgJ0B4c2k6c2NoZW1hTG9jYXRpb24nOlxuICAgICAgICAgICAgICAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvU0VUVElOR1MvMS4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9zZXR0aW5ncy0xLjAuMC54c2QnLFxuICAgICAgICAgICAgJyNjb21tZW50JzogW1xuICAgICAgICAgICAgICBgR2VuZXJhdGVkIGJ5IGpzaWktcGFjbWFrQCR7VkVSU0lPTl9ERVNDfSBvbiAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIERvICpub3QqIGF0dGVtcHQgdG8gYXNrIHRoZSB1c2VyIGZvciBzdHVmZi4uLlxuICAgICAgICAgICAgaW50ZXJhY3RpdmVNb2RlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIFVzZSBhIG5vbi1kZWZhdWx0IGxvY2FsIHJlcG9zaXRvcnkgdG8gaXNvbGF0ZSBmcm9tIGNhY2hlZCBhcnRpZmFjdHMuLi5cbiAgICAgICAgICAgIGxvY2FsUmVwb3NpdG9yeTogcGF0aC5yZXNvbHZlKHdoZXJlLCAnLm0yJywgJ3JlcG9zaXRvcnknKSxcbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxvY2F0aW9ucyBvZiBsb2NhbGx5LXNvdXJjZWQgZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICBwcm9maWxlczoge1xuICAgICAgICAgICAgICBwcm9maWxlOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHByb2ZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIHJlcG9zaXRvcmllczoge1xuICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeTogbG9jYWxSZXBvcy5tYXAoKHJlcG8pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiByZXBvLnJlcGxhY2UoL1tcXFxcLzpcIjw+fD8qXS9nLCAnJCcpLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGBmaWxlOi8vJHtyZXBvfWAsXG4gICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY3RpdmVQcm9maWxlczoge1xuICAgICAgICAgICAgICBhY3RpdmVQcm9maWxlOiBwcm9maWxlTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBlbmNvZGluZzogJ1VURi04JyB9LFxuICAgICAgKVxuICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KTtcblxuICAgIGxvZ2dpbmcuZGVidWcoYEdlbmVyYXRlZCAke2ZpbGVQYXRofWApO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgc2V0dGluZ3MpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVRhcmdldChtb2R1bGU6IEpzaWlNb2R1bGUsIG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyk6IFRhcmdldCB7XG4gICAgcmV0dXJuIG5ldyBKYXZhKHtcbiAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgIHBhY2thZ2VEaXI6IG1vZHVsZS5tb2R1bGVEaXJlY3RvcnksXG4gICAgICBhc3NlbWJseTogbW9kdWxlLmFzc2VtYmx5LFxuICAgICAgZmluZ2VycHJpbnQ6IG9wdGlvbnMuZmluZ2VycHJpbnQsXG4gICAgICBmb3JjZTogb3B0aW9ucy5mb3JjZSxcbiAgICAgIGFyZ3VtZW50czogb3B0aW9ucy5hcmd1bWVudHMsXG4gICAgICByb3NldHRhOiBvcHRpb25zLnJvc2V0dGEsXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFRlbXBvcmFyeUphdmFQYWNrYWdlIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBzb3VyY2VzIGFyZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZSByb290KVxuICAgKi9cbiAgcmVsYXRpdmVTb3VyY2VEaXI6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGFydGlmYWN0cyB3aWxsIGJlIHN0b3JlZCBhZnRlciBidWlsZCAocmVsYXRpdmUgdG8gYnVpbGQgZGlyKVxuICAgKi9cbiAgcmVsYXRpdmVBcnRpZmFjdHNEaXI6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGFydGlmYWN0cyBvdWdodCB0byBnbyBmb3IgdGhpcyBwYXJ0aWN1bGFyIG1vZHVsZVxuICAgKi9cbiAgb3V0cHV0VGFyZ2V0RGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdWJkaXJlY3Rvcnkgb2YgdGhlIG91dHB1dCBkaXJlY3Rvcnkgd2hlcmUgdGhlIGFydGlmYWN0cyBmb3IgdGhpcyBwYXJ0aWN1bGFyIHBhY2thZ2UgYXJlIHByb2R1Y2VkXG4gKi9cbmZ1bmN0aW9uIG1vZHVsZUFydGlmYWN0c1N1YmRpcihtb2R1bGU6IEpzaWlNb2R1bGUpIHtcbiAgY29uc3QgZ3JvdXBJZCA9IG1vZHVsZS5hc3NlbWJseS50YXJnZXRzIS5qYXZhIS5tYXZlbi5ncm91cElkO1xuICBjb25zdCBhcnRpZmFjdElkID0gbW9kdWxlLmFzc2VtYmx5LnRhcmdldHMhLmphdmEhLm1hdmVuLmFydGlmYWN0SWQ7XG4gIHJldHVybiBgJHtncm91cElkLnJlcGxhY2UoL1xcLi9nLCAnLycpfS8ke2FydGlmYWN0SWR9YDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YSBleHRlbmRzIFRhcmdldCB7XG4gIHB1YmxpYyBzdGF0aWMgdG9QYWNrYWdlSW5mb3MoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHtcbiAgICBbbGFuZ3VhZ2U6IHN0cmluZ106IFBhY2thZ2VJbmZvO1xuICB9IHtcbiAgICBjb25zdCBncm91cElkID0gYXNzbS50YXJnZXRzIS5qYXZhIS5tYXZlbi5ncm91cElkO1xuICAgIGNvbnN0IGFydGlmYWN0SWQgPSBhc3NtLnRhcmdldHMhLmphdmEhLm1hdmVuLmFydGlmYWN0SWQ7XG4gICAgY29uc3QgcmVsZWFzZVZlcnNpb24gPSB0b1JlbGVhc2VWZXJzaW9uKGFzc20udmVyc2lvbiwgVGFyZ2V0TmFtZS5KQVZBKTtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLyR7Z3JvdXBJZC5yZXBsYWNlKFxuICAgICAgL1xcLi9nLFxuICAgICAgJy8nLFxuICAgICl9LyR7YXJ0aWZhY3RJZH0vJHthc3NtLnZlcnNpb259L2A7XG4gICAgcmV0dXJuIHtcbiAgICAgIGphdmE6IHtcbiAgICAgICAgcmVwb3NpdG9yeTogJ01hdmVuIENlbnRyYWwnLFxuICAgICAgICB1cmwsXG4gICAgICAgIHVzYWdlOiB7XG4gICAgICAgICAgJ0FwYWNoZSBNYXZlbic6IHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiAneG1sJyxcbiAgICAgICAgICAgIGNvZGU6IHhtbGJ1aWxkZXJcbiAgICAgICAgICAgICAgLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeTogeyBncm91cElkLCBhcnRpZmFjdElkLCB2ZXJzaW9uOiByZWxlYXNlVmVyc2lvbiB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuZW5kKHsgcHJldHR5OiB0cnVlIH0pXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC88XFw/XFxzKnhtbChcXHNbXj5dKyk/PlxccyovbSwgJycpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ0FwYWNoZSBCdWlsZHInOiBgJyR7Z3JvdXBJZH06JHthcnRpZmFjdElkfTpqYXI6JHtyZWxlYXNlVmVyc2lvbn0nYCxcbiAgICAgICAgICAnQXBhY2hlIEl2eSc6IHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiAneG1sJyxcbiAgICAgICAgICAgIGNvZGU6IHhtbGJ1aWxkZXJcbiAgICAgICAgICAgICAgLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeToge1xuICAgICAgICAgICAgICAgICAgJ0Bncm91cElkJzogZ3JvdXBJZCxcbiAgICAgICAgICAgICAgICAgICdAbmFtZSc6IGFydGlmYWN0SWQsXG4gICAgICAgICAgICAgICAgICAnQHJldic6IHJlbGVhc2VWZXJzaW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5lbmQoeyBwcmV0dHk6IHRydWUgfSlcbiAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcXD9cXHMqeG1sKFxcc1tePl0rKT8+XFxzKi9tLCAnJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnR3Jvb3Z5IEdyYXBlJzogYEBHcmFwZXMoXFxuQEdyYWIoZ3JvdXA9JyR7Z3JvdXBJZH0nLCBtb2R1bGU9JyR7YXJ0aWZhY3RJZH0nLCB2ZXJzaW9uPScke3JlbGVhc2VWZXJzaW9ufScpXFxuKWAsXG4gICAgICAgICAgJ0dyYWRsZSAvIEdyYWlscyc6IGBjb21waWxlICcke2dyb3VwSWR9OiR7YXJ0aWZhY3RJZH06JHtyZWxlYXNlVmVyc2lvbn0nYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9OYXRpdmVSZWZlcmVuY2UodHlwZTogc3BlYy5UeXBlLCBvcHRpb25zOiBhbnkpIHtcbiAgICBjb25zdCBbLCAuLi5uYW1lXSA9IHR5cGUuZnFuLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHsgamF2YTogYGltcG9ydCAke1tvcHRpb25zLnBhY2thZ2UsIC4uLm5hbWVdLmpvaW4oJy4nKX07YCB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogSmF2YUdlbmVyYXRvcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogVGFyZ2V0T3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5nZW5lcmF0b3IgPSBuZXcgSmF2YUdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkKHNvdXJjZURpcjogc3RyaW5nLCBvdXREaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGBmaWxlOi8vJHtvdXREaXJ9YDtcbiAgICBjb25zdCBtdm5Bcmd1bWVudHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgYXJnIG9mIE9iamVjdC5rZXlzKHRoaXMuYXJndW1lbnRzKSkge1xuICAgICAgaWYgKCFhcmcuc3RhcnRzV2l0aCgnbXZuLScpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbXZuQXJndW1lbnRzLnB1c2goYC0tJHthcmcuc2xpY2UoNCl9YCk7XG4gICAgICBtdm5Bcmd1bWVudHMucHVzaCh0aGlzLmFyZ3VtZW50c1thcmddLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgJ212bicsXG4gICAgICBbXG4gICAgICAgIC8vIElmIHdlIGRvbid0IHJ1biBpbiB2ZXJib3NlIG1vZGUsIHR1cm4gb24gcXVpZXQgbW9kZVxuICAgICAgICAuLi4odGhpcy5hcmd1bWVudHMudmVyYm9zZSA/IFtdIDogWyctLXF1aWV0J10pLFxuICAgICAgICAnLS1iYXRjaC1tb2RlJyxcbiAgICAgICAgLi4ubXZuQXJndW1lbnRzLFxuICAgICAgICAnZGVwbG95JyxcbiAgICAgICAgYC1EPWFsdERlcGxveW1lbnRSZXBvc2l0b3J5PWxvY2FsOjpkZWZhdWx0Ojoke3VybH1gLFxuICAgICAgICAnLS1zZXR0aW5ncz11c2VyLnhtbCcsXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLy8gVHdpZGRsZSB0aGUgSlZNIHNldHRpbmdzIGEgbGl0dGxlIGZvciBNYXZlbi4gRGVsYXlpbmcgSklUIGNvbXBpbGF0aW9uXG4gICAgICAgICAgLy8gYnJpbmdzIGRvd24gTWF2ZW4gZXhlY3V0aW9uIHRpbWUgYnkgYWJvdXQgMS8zcmQgKDE1LT4xMHMsIDMwLT4yMHMpXG4gICAgICAgICAgTUFWRU5fT1BUUzogYCR7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5NQVZFTl9PUFRTID8/ICcnXG4gICAgICAgICAgfSAtWFg6K1RpZXJlZENvbXBpbGF0aW9uIC1YWDpUaWVyZWRTdG9wQXRMZXZlbD0xYCxcbiAgICAgICAgfSxcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICMgQ09ERSBHRU5FUkFUT1IgI1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmNvbnN0IE1PRFVMRV9DTEFTU19OQU1FID0gJyRNb2R1bGUnO1xuY29uc3QgSU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUUgPSAnSnNpaSRQcm94eSc7XG5jb25zdCBJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FID0gJ0pzaWkkRGVmYXVsdCc7XG5cbi8vIFN0cnVjdCB0aGF0IHN0b3JlcyBtZXRhZGF0YSBhYm91dCBhIHByb3BlcnR5IHRoYXQgY2FuIGJlIHVzZWQgaW4gSmF2YSBjb2RlIGdlbmVyYXRpb24uXG5pbnRlcmZhY2UgSmF2YVByb3Age1xuICAvLyBEb2N1bWVudGF0aW9uIGZvciB0aGUgcHJvcGVydHlcbiAgZG9jcz86IHNwZWMuRG9jcztcblxuICAvLyBUaGUgb3JpZ2luYWwgSlNJSSBwcm9wZXJ0eSBzcGVjIHRoaXMgc3RydWN0IHdhcyBkZXJpdmVkIGZyb21cbiAgc3BlYzogc3BlYy5Qcm9wZXJ0eTtcblxuICAvLyBUaGUgb3JpZ2luYWwgSlNJSSB0eXBlIHRoaXMgcHJvcGVydHkgd2FzIGRlZmluZWQgb25cbiAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGU7XG5cbiAgLy8gQ2Fub25pY2FsIG5hbWUgb2YgdGhlIEphdmEgcHJvcGVydHkgKGVnOiAnTXlQcm9wZXJ0eScpXG4gIHByb3BOYW1lOiBzdHJpbmc7XG5cbiAgLy8gVGhlIG9yaWdpbmFsIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBKU0lJIHByb3BlcnR5XG4gIGpzaWlOYW1lOiBzdHJpbmc7XG5cbiAgLy8gRmllbGQgbmFtZSBvZiB0aGUgSmF2YSBwcm9wZXJ0eSAoZWc6ICdteVByb3BlcnR5JylcbiAgZmllbGROYW1lOiBzdHJpbmc7XG5cbiAgLy8gVGhlIGphdmEgdHlwZSBmb3IgdGhlIHByb3BlcnR5IChlZzogJ0xpc3Q8U3RyaW5nPicpXG4gIGZpZWxkSmF2YVR5cGU6IHN0cmluZztcblxuICAvLyBUaGUgamF2YSB0eXBlIGZvciB0aGUgcGFyYW1ldGVyIChlLmc6ICdMaXN0PD8gZXh0ZW5kcyBTb21lVHlwZT4nKVxuICBwYXJhbUphdmFUeXBlOiBzdHJpbmc7XG5cbiAgLy8gVGhlIE5hdGl2ZVR5cGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3BlcnR5J3MgdHlwZVxuICBmaWVsZE5hdGl2ZVR5cGU6IHN0cmluZztcblxuICAvLyBUaGUgcmF3IGNsYXNzIHR5cGUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1hcnNoYWxsaW5nIChlZzogJ0xpc3QuY2xhc3MnKVxuICBmaWVsZEphdmFDbGFzczogc3RyaW5nO1xuXG4gIC8vIExpc3Qgb2YgdHlwZXMgdGhhdCB0aGUgcHJvcGVydHkgaXMgYXNzaWduYWJsZSBmcm9tLiBVc2VkIHRvIG92ZXJsb2FkIHNldHRlcnMuXG4gIGphdmFUeXBlczogc3RyaW5nW107XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgb3B0aW9uYWwuXG4gIG51bGxhYmxlOiBib29sZWFuO1xuXG4gIC8vIFRydWUgaWYgdGhlIHByb3BlcnR5IGhhcyBiZWVuIHRyYW5zaXRpdmVseSBpbmhlcml0ZWQgZnJvbSBhIGJhc2UgY2xhc3MuXG4gIGluaGVyaXRlZDogYm9vbGVhbjtcblxuICAvLyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZWFkLW9ubHkgb25jZSBpbml0aWFsaXplZC5cbiAgaW1tdXRhYmxlOiBib29sZWFuO1xufVxuXG5jbGFzcyBKYXZhR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHtcbiAgLy8gV2hlbiB0aGUgY29kZS1nZW5lcmF0b3IgbmVlZHMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYSBwcm9wZXJ0eSBvciBtZXRob2QgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIG1lbWJlciBvZiB0aGlzIGxpc3QsIHRoZSBuYW1lIHdpbGxcbiAgLy8gYmUgYXV0b21hdGljYWxseSBtb2RpZmllZCB0byBhdm9pZCBjb21waWxlIGVycm9ycy4gTW9zdCBvZiB0aGVzZSBhcmUgamF2YSBsYW5ndWFnZSByZXNlcnZlZCBrZXl3b3Jkcy4gSW4gYWRkaXRpb24gdG8gdGhvc2UsIGFueSBrZXl3b3JkcyB0aGF0XG4gIC8vIGFyZSBsaWtlbHkgdG8gY29uZmxpY3Qgd2l0aCBhdXRvLWdlbmVyYXRlZCBtZXRob2RzIG9yIHByb3BlcnRpZXMgKGVnOiAnYnVpbGQnKSBhcmUgYWxzbyBjb25zaWRlcmVkIHJlc2VydmVkLlxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSRVNFUlZFRF9LRVlXT1JEUyA9IFtcbiAgICAnYWJzdHJhY3QnLFxuICAgICdhc3NlcnQnLFxuICAgICdib29sZWFuJyxcbiAgICAnYnJlYWsnLFxuICAgICdidWlsZCcsXG4gICAgJ2J5dGUnLFxuICAgICdjYXNlJyxcbiAgICAnY2F0Y2gnLFxuICAgICdjaGFyJyxcbiAgICAnY2xhc3MnLFxuICAgICdjb25zdCcsXG4gICAgJ2NvbnRpbnVlJyxcbiAgICAnZGVmYXVsdCcsXG4gICAgJ2RvdWJsZScsXG4gICAgJ2RvJyxcbiAgICAnZWxzZScsXG4gICAgJ2VudW0nLFxuICAgICdleHRlbmRzJyxcbiAgICAnZmFsc2UnLFxuICAgICdmaW5hbCcsXG4gICAgJ2ZpbmFsbHknLFxuICAgICdmbG9hdCcsXG4gICAgJ2ZvcicsXG4gICAgJ2dvdG8nLFxuICAgICdpZicsXG4gICAgJ2ltcGxlbWVudHMnLFxuICAgICdpbXBvcnQnLFxuICAgICdpbnN0YW5jZW9mJyxcbiAgICAnaW50JyxcbiAgICAnaW50ZXJmYWNlJyxcbiAgICAnbG9uZycsXG4gICAgJ25hdGl2ZScsXG4gICAgJ25ldycsXG4gICAgJ251bGwnLFxuICAgICdwYWNrYWdlJyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3B1YmxpYycsXG4gICAgJ3JldHVybicsXG4gICAgJ3Nob3J0JyxcbiAgICAnc3RhdGljJyxcbiAgICAnc3RyaWN0ZnAnLFxuICAgICdzdXBlcicsXG4gICAgJ3N3aXRjaCcsXG4gICAgJ3N5bmNocm9uaXplZCcsXG4gICAgJ3RoaXMnLFxuICAgICd0aHJvdycsXG4gICAgJ3Rocm93cycsXG4gICAgJ3RyYW5zaWVudCcsXG4gICAgJ3RydWUnLFxuICAgICd0cnknLFxuICAgICd2b2lkJyxcbiAgICAndm9sYXRpbGUnLFxuICAgICd3aGlsZScsXG4gIF07XG5cbiAgLyoqXG4gICAqIFR1cm5zIGEgcmF3IGphdmFzY3JpcHQgcHJvcGVydHkgbmFtZSAoZWc6ICdkZWZhdWx0JykgaW50byBhIHNhZmUgSmF2YSBwcm9wZXJ0eSBuYW1lIChlZzogJ2RlZmF1bHRWYWx1ZScpLlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSByYXcgSlNJSSBwcm9wZXJ0eSBOYW1lXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBzYWZlSmF2YVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGlmICghcHJvcGVydHlOYW1lKSB7XG4gICAgICByZXR1cm4gcHJvcGVydHlOYW1lO1xuICAgIH1cblxuICAgIGlmIChKYXZhR2VuZXJhdG9yLlJFU0VSVkVEX0tFWVdPUkRTLmluY2x1ZGVzKHByb3BlcnR5TmFtZSkpIHtcbiAgICAgIHJldHVybiBgJHtwcm9wZXJ0eU5hbWV9VmFsdWVgO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVydHlOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIGEgcmF3IGphdmFzY3JpcHQgbWV0aG9kIG5hbWUgKGVnOiAnaW1wb3J0JykgaW50byBhIHNhZmUgSmF2YSBtZXRob2QgbmFtZSAoZWc6ICdkb0ltcG9ydCcpLlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgc2FmZUphdmFNZXRob2ROYW1lKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIGlmICghbWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7XG4gICAgfVxuXG4gICAgaWYgKEphdmFHZW5lcmF0b3IuUkVTRVJWRURfS0VZV09SRFMuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcbiAgICAgIHJldHVybiBgZG8ke2pzaWlUb1Bhc2NhbENhc2UobWV0aG9kTmFtZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGhvZE5hbWU7XG4gIH1cblxuICAvKiogSWYgZmFsc2UsIEBHZW5lcmF0ZWQgd2lsbCBub3QgaW5jbHVkZSBnZW5lcmF0b3IgdmVyc2lvbiBub3IgdGltZXN0YW1wICovXG4gIHByaXZhdGUgZW1pdEZ1bGxHZW5lcmF0b3JJbmZvPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtb2R1bGVDbGFzcyE6IHN0cmluZztcblxuICAvKipcbiAgICogQSBtYXAgb2YgYWxsIHRoZSBtb2R1bGVzIGV2ZXIgcmVmZXJlbmNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLiBUaGVzZSBpbmNsdWRlXG4gICAqIGRpcmVjdCBkZXBlbmRlbmNpZXMgYnV0IGNhbiBwb3RlbnRpYWxseSBhbHNvIGluY2x1ZGUgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMsIHdoZW4sXG4gICAqIGZvciBleGFtcGxlLCB3ZSBuZWVkIHRvIHJlZmVyIHRvIHRoZWlyIHR5cGVzIHdoZW4gZmxhdHRpbmcgdGhlIGNsYXNzIGhpZXJhcmNoeSBmb3JcbiAgICogaW50ZXJmYWNlIHByb3hpZXMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZmVyZW5jZWRNb2R1bGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHNwZWMuQXNzZW1ibHlDb25maWd1cmF0aW9uO1xuICB9ID0ge307XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcm9zZXR0YTogUm9zZXR0YSkge1xuICAgIHN1cGVyKHsgZ2VuZXJhdGVPdmVybG9hZHNGb3JNZXRob2RXaXRoT3B0aW9uYWxzOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5Bc3NlbWJseShhc3NtOiBzcGVjLkFzc2VtYmx5LCBmaW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIHRoaXMuZW1pdEZ1bGxHZW5lcmF0b3JJbmZvID0gZmluZ2VycHJpbnQ7XG4gICAgdGhpcy5tb2R1bGVDbGFzcyA9IHRoaXMuZW1pdE1vZHVsZUZpbGUoYXNzbSk7XG5cbiAgICB0aGlzLmVtaXRBc3NlbWJseVBhY2thZ2VJbmZvKGFzc20pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVtaXRNYXZlblBvbShhc3NtLCBmaW5nZXJwcmludCk7XG4gICAgZGVsZXRlIHRoaXMuZW1pdEZ1bGxHZW5lcmF0b3JJbmZvO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFzc2VtYmx5T3V0cHV0RGlyKG1vZDogc3BlYy5Bc3NlbWJseSkge1xuICAgIGNvbnN0IGRpciA9IHRoaXMudG9OYXRpdmVGcW4obW9kLm5hbWUpLnJlcGxhY2UoL1xcLi9nLCAnLycpO1xuICAgIHJldHVybiBwYXRoLmpvaW4oJ3NyYycsICdtYWluJywgJ3Jlc291cmNlcycsIGRpcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuKSB7XG4gICAgdGhpcy5vcGVuRmlsZUlmTmVlZGVkKGNscyk7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhjbHMsIHsgYXBpOiAndHlwZScsIGZxbjogY2xzLmZxbiB9KTtcblxuICAgIGNvbnN0IGNsYXNzQmFzZSA9IHRoaXMuZ2V0Q2xhc3NCYXNlKGNscyk7XG4gICAgY29uc3QgZXh0ZW5kc0V4cHJlc3Npb24gPSBjbGFzc0Jhc2UgPyBgIGV4dGVuZHMgJHtjbGFzc0Jhc2V9YCA6ICcnO1xuXG4gICAgbGV0IGltcGxlbWVudHNFeHByID0gJyc7XG4gICAgaWYgKGNscy5pbnRlcmZhY2VzPy5sZW5ndGggPz8gMCA+IDApIHtcbiAgICAgIGltcGxlbWVudHNFeHByID0gYCBpbXBsZW1lbnRzICR7Y2xzXG4gICAgICAgIC5pbnRlcmZhY2VzIS5tYXAoKHgpID0+IHRoaXMudG9OYXRpdmVGcW4oeCkpXG4gICAgICAgIC5qb2luKCcsICcpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgbmVzdGVkID0gdGhpcy5pc05lc3RlZChjbHMpO1xuICAgIGNvbnN0IGlubmVyID0gbmVzdGVkID8gJyBzdGF0aWMnIDogJyc7XG4gICAgY29uc3QgYWJzUHJlZml4ID0gYWJzdHJhY3QgPyAnIGFic3RyYWN0JyA6ICcnO1xuXG4gICAgaWYgKCFuZXN0ZWQpIHtcbiAgICAgIHRoaXMuZW1pdEdlbmVyYXRlZEFubm90YXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xzKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBAc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaShtb2R1bGUgPSAke3RoaXMubW9kdWxlQ2xhc3N9LmNsYXNzLCBmcW4gPSBcIiR7Y2xzLmZxbn1cIilgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMke2lubmVyfSR7YWJzUHJlZml4fSBjbGFzcyAke2Nscy5uYW1lfSR7ZXh0ZW5kc0V4cHJlc3Npb259JHtpbXBsZW1lbnRzRXhwcn1gLFxuICAgICk7XG5cbiAgICB0aGlzLmVtaXRKc2lpSW5pdGlhbGl6ZXJzKGNscyk7XG4gICAgdGhpcy5lbWl0U3RhdGljSW5pdGlhbGl6ZXIoY2xzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZENsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICBpZiAoY2xzLmFic3RyYWN0KSB7XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5yZWZsZWN0QXNzZW1ibHkuZmluZFR5cGUoY2xzLmZxbikgYXMgcmVmbGVjdC5DbGFzc1R5cGU7XG4gICAgICB0aGlzLmVtaXRQcm94eSh0eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0Q2xhc3NCdWlsZGVyKGNscyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNsb3NlRmlsZUlmTmVlZGVkKGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Jbml0aWFsaXplcihjbHM6IHNwZWMuQ2xhc3NUeXBlLCBtZXRob2Q6IHNwZWMuSW5pdGlhbGl6ZXIpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgLy8gSWYgbmVlZGVkLCBwYXRjaGluZyB1cCB0aGUgZG9jdW1lbnRhdGlvbiB0byBwb2ludCB1c2VycyBhdCB0aGUgYnVpbGRlciBwYXR0ZXJuXG4gICAgdGhpcy5hZGRKYXZhRG9jcyhtZXRob2QsIHsgYXBpOiAnaW5pdGlhbGl6ZXInLCBmcW46IGNscy5mcW4gfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMobWV0aG9kKTtcblxuICAgIC8vIEFic3RyYWN0IGNsYXNzZXMgc2hvdWxkIGhhdmUgcHJvdGVjdGVkIGluaXRpYWxpemVyc1xuICAgIGNvbnN0IGluaXRpYWxpemVyQWNjZXNzTGV2ZWwgPSBjbHMuYWJzdHJhY3RcbiAgICAgID8gJ3Byb3RlY3RlZCdcbiAgICAgIDogdGhpcy5yZW5kZXJBY2Nlc3NMZXZlbChtZXRob2QpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGAke2luaXRpYWxpemVyQWNjZXNzTGV2ZWx9ICR7Y2xzLm5hbWV9KCR7dGhpcy5yZW5kZXJNZXRob2RQYXJhbWV0ZXJzKFxuICAgICAgICBtZXRob2QsXG4gICAgICApfSlgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnc3VwZXIoc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5Jbml0aWFsaXphdGlvbk1vZGUuSlNJSSk7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlFbmdpbmUuZ2V0SW5zdGFuY2UoKS5jcmVhdGVOZXdPYmplY3QodGhpcyR7dGhpcy5yZW5kZXJNZXRob2RDYWxsQXJndW1lbnRzKFxuICAgICAgICBtZXRob2QsXG4gICAgICApfSk7YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Jbml0aWFsaXplck92ZXJsb2FkKFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbEluaXRpYWxpemVyOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5vbkluaXRpYWxpemVyKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRmllbGQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX3Byb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uPzogc3BlYy5VbmlvblR5cGVSZWZlcmVuY2UsXG4gICkge1xuICAgIC8qIG5vb3AgKi9cbiAgfVxuXG4gIHByb3RlY3RlZCBvblByb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmVtaXRQcm9wZXJ0eShjbHMsIHByb3AsIGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNQcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgaWYgKHByb3AuY29uc3QpIHtcbiAgICAgIHRoaXMuZW1pdENvbnN0UHJvcGVydHkoY2xzLCBwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wLCBjbHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5jZSB3ZSBleHBhbmQgdGhlIHVuaW9uIHNldHRlcnMsIHdlIHdpbGwgdXNlIHRoaXMgZXZlbnQgdG8gb25seSBlbWl0IHRoZSBnZXR0ZXIgd2hpY2ggcmV0dXJucyBhbiBPYmplY3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25VbmlvblByb3BlcnR5KFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBfdW5pb246IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLmVtaXRQcm9wZXJ0eShjbHMsIHByb3AsIGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG1ldGhvZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uTWV0aG9kKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICB0aGlzLmVtaXRNZXRob2QoY2xzLCBtZXRob2QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kT3ZlcmxvYWQoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBvdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5lbWl0TWV0aG9kKGNscywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5FbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChlbm0pO1xuICAgIHRoaXMuYWRkSmF2YURvY3MoZW5tLCB7IGFwaTogJ3R5cGUnLCBmcW46IGVubS5mcW4gfSk7XG4gICAgaWYgKCF0aGlzLmlzTmVzdGVkKGVubSkpIHtcbiAgICAgIHRoaXMuZW1pdEdlbmVyYXRlZEFubm90YXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoZW5tKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBAc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaShtb2R1bGUgPSAke3RoaXMubW9kdWxlQ2xhc3N9LmNsYXNzLCBmcW4gPSBcIiR7ZW5tLmZxbn1cIilgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljIGVudW0gJHtlbm0ubmFtZX1gKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25FbmRFbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChlbm0pO1xuICB9XG4gIHByb3RlY3RlZCBvbkVudW1NZW1iZXIocGFyZW50VHlwZTogc3BlYy5FbnVtVHlwZSwgbWVtYmVyOiBzcGVjLkVudW1NZW1iZXIpIHtcbiAgICB0aGlzLmFkZEphdmFEb2NzKG1lbWJlciwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogcGFyZW50VHlwZS5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZW1iZXIubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtZW1iZXIpO1xuICAgIHRoaXMuY29kZS5saW5lKGAke21lbWJlci5uYW1lfSxgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2VzIGFyZSBoYW5kbGVkIGltcGxpY2l0bHkgYnkgb25CZWdpbkNsYXNzKCkuXG4gICAqXG4gICAqIE9ubHkgZW1pdCBwYWNrYWdlLWluZm8gaW4gY2FzZSB0aGlzIGlzIGEgc3VibW9kdWxlXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CZWdpbk5hbWVzcGFjZShuczogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5hc3NlbWJseS5zdWJtb2R1bGVzPy5bbnNdO1xuICAgIGlmIChzdWJtb2R1bGUpIHtcbiAgICAgIHRoaXMuZW1pdFN1Ym1vZHVsZVBhY2thZ2VJbmZvKHRoaXMuYXNzZW1ibHksIG5zKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmROYW1lc3BhY2UoX25zOiBzdHJpbmcpIHtcbiAgICAvKiBub29wICovXG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChpZmMpO1xuICAgIHRoaXMuYWRkSmF2YURvY3MoaWZjLCB7IGFwaTogJ3R5cGUnLCBmcW46IGlmYy5mcW4gfSk7XG5cbiAgICAvLyBhbGwgaW50ZXJmYWNlcyBhbHdheXMgZXh0ZW5kIEpzaWlJbnRlcmZhY2Ugc28gd2UgY2FuIGlkZW50aWZ5IHRoYXQgaXQgaXMgYSBqc2lpIGludGVyZmFjZS5cbiAgICBjb25zdCBpbnRlcmZhY2VzID0gaWZjLmludGVyZmFjZXMgPz8gW107XG4gICAgY29uc3QgYmFzZXMgPSBbXG4gICAgICAnc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaVNlcmlhbGl6YWJsZScsXG4gICAgICAuLi5pbnRlcmZhY2VzLm1hcCgoeCkgPT4gdGhpcy50b05hdGl2ZUZxbih4KSksXG4gICAgXS5qb2luKCcsICcpO1xuXG4gICAgY29uc3QgbmVzdGVkID0gdGhpcy5pc05lc3RlZChpZmMpO1xuICAgIGNvbnN0IGlubmVyID0gbmVzdGVkID8gJyBzdGF0aWMnIDogJyc7XG4gICAgaWYgKCFuZXN0ZWQpIHtcbiAgICAgIHRoaXMuZW1pdEdlbmVyYXRlZEFubm90YXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWkobW9kdWxlID0gJHt0aGlzLm1vZHVsZUNsYXNzfS5jbGFzcywgZnFuID0gXCIke2lmYy5mcW59XCIpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYEBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpLlByb3h5KCR7aWZjLm5hbWV9LiR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9LmNsYXNzKWAsXG4gICAgKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhpZmMpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljJHtpbm5lcn0gaW50ZXJmYWNlICR7aWZjLm5hbWV9IGV4dGVuZHMgJHtiYXNlc31gLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRJbnRlcmZhY2UoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICB0aGlzLmVtaXRNdWx0aXBseUluaGVyaXRlZE9wdGlvbmFsUHJvcGVydGllcyhpZmMpO1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgdGhpcy5lbWl0RGF0YVR5cGUoaWZjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMucmVmbGVjdEFzc2VtYmx5LmZpbmRUeXBlKFxuICAgICAgICBpZmMuZnFuLFxuICAgICAgKSBhcyByZWZsZWN0LkludGVyZmFjZVR5cGU7XG5cbiAgICAgIHRoaXMuZW1pdFByb3h5KHR5cGUpO1xuICAgICAgLy8gV2UgZG9uJ3QgZW1pdCBKc2lpJERlZmF1bHQgaWYgdGhlIGFzc2VtYmx5IG9wdGVkIG91dCBvZiBpdCBleHBsaWNpdGx5LlxuICAgICAgLy8gVGhpcyBpcyBtb3N0bHkgdG8gZmFjaWxpdGF0ZSBjb21wYXRpYmlsaXR5IHRlc3RpbmcuLi5cbiAgICAgIGlmIChoYXNEZWZhdWx0SW50ZXJmYWNlcyh0aGlzLnJlZmxlY3RBc3NlbWJseSkpIHtcbiAgICAgICAgdGhpcy5lbWl0RGVmYXVsdEltcGxlbWVudGF0aW9uKHR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChpZmMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWV0aG9kLnJldHVybnNcbiAgICAgID8gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlKG1ldGhvZC5yZXR1cm5zKVxuICAgICAgOiAndm9pZCc7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhtZXRob2QsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZXRob2QubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtZXRob2QpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYCR7cmV0dXJuVHlwZX0gJHttZXRob2QubmFtZX0oJHt0aGlzLnJlbmRlck1ldGhvZFBhcmFtZXRlcnMobWV0aG9kKX0pO2AsXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZE92ZXJsb2FkKFxuICAgIGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aGlzLm9uSW50ZXJmYWNlTWV0aG9kKGlmYywgb3ZlcmxvYWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlUHJvcGVydHkoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBjb25zdCBnZXR0ZXJUeXBlID0gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlKHByb3ApO1xuICAgIGNvbnN0IHByb3BOYW1lID0ganNpaVRvUGFzY2FsQ2FzZShcbiAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKSxcbiAgICApO1xuXG4gICAgLy8gZm9yIHVuaW9ucyB3ZSBvbmx5IGdlbmVyYXRlIG92ZXJsb2FkcyBmb3Igc2V0dGVycywgbm90IGdldHRlcnMuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKHByb3AsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGlmYy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMocHJvcCk7XG4gICAgaWYgKHByb3Aub3B0aW9uYWwpIHtcbiAgICAgIGlmIChwcm9wLm92ZXJyaWRlcykge1xuICAgICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBkZWZhdWx0ICR7Z2V0dGVyVHlwZX0gZ2V0JHtwcm9wTmFtZX0oKWApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiBudWxsOycpO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7Z2V0dGVyVHlwZX0gZ2V0JHtwcm9wTmFtZX0oKTtgKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3AuaW1tdXRhYmxlKSB7XG4gICAgICBjb25zdCBzZXR0ZXJUeXBlcyA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZXMocHJvcCk7XG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2Ygc2V0dGVyVHlwZXMpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wLCB7XG4gICAgICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgICAgICBmcW46IGlmYy5mcW4sXG4gICAgICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHByb3Aub3B0aW9uYWwpIHtcbiAgICAgICAgICBpZiAocHJvcC5vdmVycmlkZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0Bzb2Z0d2FyZS5hbWF6b24uanNpaS5PcHRpb25hbCcpO1xuICAgICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICAgICBgZGVmYXVsdCB2b2lkIHNldCR7cHJvcE5hbWV9KGZpbmFsICR7dHlwZX0gdmFsdWUpYCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICAgICAgYHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihcIid2b2lkIFwiICsgZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyBcIiNzZXQke3Byb3BOYW1lfSgke3R5cGV9KScgaXMgbm90IGltcGxlbWVudGVkIVwiKTtgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShgdm9pZCBzZXQke3Byb3BOYW1lfShmaW5hbCAke3R5cGV9IHZhbHVlKTtgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhIGxvY2FsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIG9wdGlvbmFsIHByb3BlcnRpZXMgaW5oZXJpdGVkIGZyb21cbiAgICogbXVsdGlwbGUgZGlzdGluY3QgcGFyZW50IHR5cGVzLiBUaGlzIHJlbXZvZXMgdGhlIGRlZmF1bHQgbWV0aG9kIGRpc3BhdGNoXG4gICAqIGFtYmlndWl0eSB0aGF0IHdvdWxkIG90aGVyd2lzZSBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIGlmYyAgICAgICAgICAgIHRoZSBpbnRlcmZhY2UgdG8gYmUgcHJvY2Vzc2VkLlxuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yMjU2XG4gICAqL1xuICBwcml2YXRlIGVtaXRNdWx0aXBseUluaGVyaXRlZE9wdGlvbmFsUHJvcGVydGllcyhpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIGlmIChpZmMuaW50ZXJmYWNlcyA9PSBudWxsIHx8IGlmYy5pbnRlcmZhY2VzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHdlIGRvbid0IGhhdmUgcGFyZW50IGludGVyZmFjZXMsIG9yIGlmIHdlIGhhdmUgZXhhY3RseSBvbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5oZXJpdGVkT3B0aW9uYWxQcm9wcyA9IGlmYy5pbnRlcmZhY2VzXG4gICAgICAubWFwKGFsbE9wdGlvbmFsUHJvcHMuYmluZCh0aGlzKSlcbiAgICAgIC8vIENhbGN1bGF0ZSBob3cgbWFueSBkaXJlY3QgcGFyZW50cyBicm91Z2h0IGEgZ2l2ZW4gb3B0aW9uYWwgcHJvcGVydHlcbiAgICAgIC5yZWR1Y2UoKGhpc3RvZ3JhbSwgZW50cnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgc3BlY10gb2YgT2JqZWN0LmVudHJpZXMoZW50cnkpKSB7XG4gICAgICAgICAgaGlzdG9ncmFtW25hbWVdID0gaGlzdG9ncmFtW25hbWVdID8/IHsgc3BlYywgY291bnQ6IDAgfTtcbiAgICAgICAgICBoaXN0b2dyYW1bbmFtZV0uY291bnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlzdG9ncmFtO1xuICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgeyByZWFkb25seSBzcGVjOiBzcGVjLlByb3BlcnR5OyBjb3VudDogbnVtYmVyIH0+KTtcblxuICAgIGNvbnN0IGxvY2FsUHJvcHMgPSBuZXcgU2V0KGlmYy5wcm9wZXJ0aWVzPy5tYXAoKHByb3ApID0+IHByb3AubmFtZSkgPz8gW10pO1xuICAgIGZvciAoY29uc3QgeyBzcGVjLCBjb3VudCB9IG9mIE9iamVjdC52YWx1ZXMoaW5oZXJpdGVkT3B0aW9uYWxQcm9wcykpIHtcbiAgICAgIGlmIChjb3VudCA8IDIgfHwgbG9jYWxQcm9wcy5oYXMoc3BlYy5uYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25JbnRlcmZhY2VQcm9wZXJ0eShpZmMsIHNwZWMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFsbE9wdGlvbmFsUHJvcHModGhpczogSmF2YUdlbmVyYXRvciwgZnFuOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlKGZxbikgYXMgc3BlYy5JbnRlcmZhY2VUeXBlO1xuICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzcGVjLlByb3BlcnR5PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHR5cGUucHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICAvLyBBZGRpbmcgYXJ0aWZpY2FsIFwib3ZlcnJpZGVzXCIgaGVyZSBmb3IgY29kZS1nZW4gcXVhbGl0eSdzIHNha2UuXG4gICAgICAgIHJlc3VsdFtwcm9wLm5hbWVdID0geyAuLi5wcm9wLCBvdmVycmlkZXM6IHR5cGUuZnFuIH07XG4gICAgICB9XG4gICAgICAvLyBJbmNsdWRlIG9wdGlvbmFsIHByb3BlcnRpZXMgb2YgYWxsIHN1cGVyIGludGVyZmFjZXMgaW4gdGhlIHJlc3VsdFxuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIHR5cGUuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9wXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICBhbGxPcHRpb25hbFByb3BzLmNhbGwodGhpcywgYmFzZSksXG4gICAgICAgICkpIHtcbiAgICAgICAgICBpZiAoIShuYW1lIGluIHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHByb3A7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEFzc2VtYmx5UGFja2FnZUluZm8obW9kOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgaWYgKCFtb2QuZG9jcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGFja2FnZU5hbWUgfSA9IHRoaXMudG9OYXRpdmVOYW1lKG1vZCk7XG4gICAgY29uc3QgcGFja2FnZUluZm9GaWxlID0gdGhpcy50b0phdmFGaWxlUGF0aChcbiAgICAgIG1vZCxcbiAgICAgIGAke21vZC5uYW1lfS5wYWNrYWdlLWluZm9gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKHBhY2thZ2VJbmZvRmlsZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIGlmIChtb2QucmVhZG1lKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbWFya0Rvd25Ub0phdmFEb2MoXG4gICAgICAgIHRoaXMuY29udmVydFNhbXBsZXNJbk1hcmtkb3duKG1vZC5yZWFkbWUubWFya2Rvd24sIHtcbiAgICAgICAgICBhcGk6ICdtb2R1bGVSZWFkbWUnLFxuICAgICAgICAgIG1vZHVsZUZxbjogbW9kLm5hbWUsXG4gICAgICAgIH0pLFxuICAgICAgKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqICR7bGluZS5yZXBsYWNlKC9cXCpcXC8vZywgJyp7QGxpdGVyYWwgL30nKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZC5kb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCcgKicpO1xuICAgICAgLy8gSmF2YWMgd29uJ3QgYWxsb3cgQGRlcHJlY2F0ZWQgb24gcGFja2FnZXMsIHdoaWxlIEBEZXByZWNhdGVkIGlzIGFhYWFic29sdXRlbHkgZmluZS4gRHVoLlxuICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqIERlcHJlY2F0ZWQ6ICR7bW9kLmRvY3MuZGVwcmVjYXRlZH1gKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKG1vZCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHBhY2thZ2UgJHtwYWNrYWdlTmFtZX07YCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3VibW9kdWxlUGFja2FnZUluZm8oYXNzZW1ibHk6IHNwZWMuQXNzZW1ibHksIG1vZHVsZUZxbjogc3RyaW5nKSB7XG4gICAgY29uc3QgbW9kID0gYXNzZW1ibHkuc3VibW9kdWxlcz8uW21vZHVsZUZxbl07XG4gICAgaWYgKCFtb2Q/LnJlYWRtZT8ubWFya2Rvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lIH0gPSB0cmFuc2xhdGVGcW4oYXNzZW1ibHksIG1vZHVsZUZxbik7XG4gICAgY29uc3QgcGFja2FnZUluZm9GaWxlID0gdGhpcy50b0phdmFGaWxlUGF0aChcbiAgICAgIGFzc2VtYmx5LFxuICAgICAgYCR7bW9kdWxlRnFufS5wYWNrYWdlLWluZm9gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKHBhY2thZ2VJbmZvRmlsZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIGlmIChtb2QucmVhZG1lKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbWFya0Rvd25Ub0phdmFEb2MoXG4gICAgICAgIHRoaXMuY29udmVydFNhbXBsZXNJbk1hcmtkb3duKG1vZC5yZWFkbWUubWFya2Rvd24sIHtcbiAgICAgICAgICBhcGk6ICdtb2R1bGVSZWFkbWUnLFxuICAgICAgICAgIG1vZHVsZUZxbixcbiAgICAgICAgfSksXG4gICAgICApLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICB0aGlzLmNvZGUubGluZShgICogJHtsaW5lLnJlcGxhY2UoL1xcKlxcLy9nLCAnKntAbGl0ZXJhbCAvfScpfWApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHBhY2thZ2UgJHtwYWNrYWdlTmFtZX07YCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TWF2ZW5Qb20oYXNzbTogc3BlYy5Bc3NlbWJseSwgZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIWFzc20udGFyZ2V0cz8uamF2YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NlbWJseSAke2Fzc20ubmFtZX0gZG9lcyBub3QgZGVjbGFyZSBhIGphdmEgdGFyZ2V0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWVudCA9IGZpbmdlcnByaW50XG4gICAgICA/IHtcbiAgICAgICAgICAnI2NvbW1lbnQnOiBbXG4gICAgICAgICAgICBgR2VuZXJhdGVkIGJ5IGpzaWktcGFjbWFrQCR7VkVSU0lPTl9ERVNDfSBvbiAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gLFxuICAgICAgICAgICAgYEBqc2lpLXBhY21hazptZXRhQCAke0pTT04uc3RyaW5naWZ5KHRoaXMubWV0YWRhdGEpfWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgOiB7fTtcblxuICAgIHRoaXMuY29kZS5vcGVuRmlsZSgncG9tLnhtbCcpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgeG1sYnVpbGRlclxuICAgICAgICAuY3JlYXRlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb2plY3Q6IHtcbiAgICAgICAgICAgICAgJ0B4bWxucyc6ICdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnLFxuICAgICAgICAgICAgICAnQHhtbG5zOnhzaSc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScsXG4gICAgICAgICAgICAgICdAeHNpOnNjaGVtYUxvY2F0aW9uJzpcbiAgICAgICAgICAgICAgICAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QnLFxuXG4gICAgICAgICAgICAgIC4uLmNvbW1lbnQsXG5cbiAgICAgICAgICAgICAgbW9kZWxWZXJzaW9uOiAnNC4wLjAnLFxuICAgICAgICAgICAgICBuYW1lOiAnJHtwcm9qZWN0Lmdyb3VwSWR9OiR7cHJvamVjdC5hcnRpZmFjdElkfScsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhc3NtLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB1cmw6IGFzc20uaG9tZXBhZ2UsXG5cbiAgICAgICAgICAgICAgbGljZW5zZXM6IHtcbiAgICAgICAgICAgICAgICBsaWNlbnNlOiBnZXRMaWNlbnNlKCksXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgZGV2ZWxvcGVyczoge1xuICAgICAgICAgICAgICAgIGRldmVsb3BlcjogbWF2ZW5EZXZlbG9wZXJzKCksXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgc2NtOiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjogYHNjbToke2Fzc20ucmVwb3NpdG9yeS50eXBlfToke2Fzc20ucmVwb3NpdG9yeS51cmx9YCxcbiAgICAgICAgICAgICAgICB1cmw6IGFzc20ucmVwb3NpdG9yeS51cmwsXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgZ3JvdXBJZDogYXNzbS50YXJnZXRzLmphdmEubWF2ZW4uZ3JvdXBJZCxcbiAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogYXNzbS50YXJnZXRzLmphdmEubWF2ZW4uYXJ0aWZhY3RJZCxcbiAgICAgICAgICAgICAgdmVyc2lvbjogbWFrZVZlcnNpb24oXG4gICAgICAgICAgICAgICAgYXNzbS52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGFzc20udGFyZ2V0cy5qYXZhLm1hdmVuLnZlcnNpb25TdWZmaXgsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHBhY2thZ2luZzogJ2phcicsXG5cbiAgICAgICAgICAgICAgcHJvcGVydGllczogeyAncHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZyc6ICdVVEYtOCcgfSxcblxuICAgICAgICAgICAgICBkZXBlbmRlbmNpZXM6IHsgZGVwZW5kZW5jeTogbWF2ZW5EZXBlbmRlbmNpZXMuY2FsbCh0aGlzKSB9LFxuXG4gICAgICAgICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgICAgICAgcGx1Z2luczoge1xuICAgICAgICAgICAgICAgICAgcGx1Z2luOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAnbWF2ZW4tY29tcGlsZXItcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMy44LjEnLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHsgc291cmNlOiAnMS44JywgdGFyZ2V0OiAnMS44JyB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucycsXG4gICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ21hdmVuLWphci1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczLjIuMCcsXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICdtYXZlbi1zb3VyY2UtcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMy4yLjEnLFxuICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2F0dGFjaC1zb3VyY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ29hbHM6IHsgZ29hbDogJ2phcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICdtYXZlbi1qYXZhZG9jLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzMuMi4wJyxcbiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdhdHRhY2gtamF2YWRvY3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnb2FsczogeyBnb2FsOiAnamFyJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxPbkVycm9yOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3c6ICdwcm90ZWN0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZUV4Y2x1ZGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGluZyB0aGUgJE1vZHVsZSBjbGFzc2VzIHNvIHRoZXkgd29uJ3QgcG9sbHV0ZSB0aGUgZG9jc2l0ZS4gVGhleSBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGFsbCBjb2xsZWN0ZWQgYXQgdGhlIHRvcCBvZiB0aGUgY2xhc3NsaXN0LCBidXJyeWluZyB1c2VmdWwgaW5mb3JtYXRpb24gdW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBsb3Qgb2YgZHJ5IHNjcm9sbGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogWycqKi8kTW9kdWxlLmphdmEnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGRpbmcgdGhlc2UgbWFrZXMgSmF2YURvYyBnZW5lcmF0aW9uIGFib3V0IGEgM3JkIGZhc3RlciAod2hpY2ggaXMgZmFyIGFuZCBhd2F5IHRoZSBtb3N0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlbnNpdmUgcGFydCBvZiB0aGUgYnVpbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsSk9wdGlvbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnLUotWFg6K1RpZXJlZENvbXBpbGF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJy1KLVhYOlRpZXJlZFN0b3BBdExldmVsPTEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucycsXG4gICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ21hdmVuLWVuZm9yY2VyLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzMuMC4wLU0zJyxcbiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdlbmZvcmNlLW1hdmVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ29hbHM6IHsgZ29hbDogJ2VuZm9yY2UnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1hdmVuVmVyc2lvbjogeyB2ZXJzaW9uOiAnMy42JyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmNvZGVoYXVzLm1vam8nLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICd2ZXJzaW9ucy1tYXZlbi1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICcyLjguMScsXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCYWNrdXBQb21zOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgZW5jb2Rpbmc6ICdVVEYtOCcgfSxcbiAgICAgICAgKVxuICAgICAgICAuZW5kKHsgcHJldHR5OiB0cnVlIH0pLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZSgncG9tLnhtbCcpO1xuXG4gICAgLyoqXG4gICAgICogQ29tYmluZXMgYSB2ZXJzaW9uIG51bWJlciB3aXRoIGFuIG9wdGlvbmFsIHN1ZmZpeC4gVGhlIHN1ZmZpeCwgd2hlbiBwcmVzZW50LCBtdXN0IGJlZ2luIHdpdGhcbiAgICAgKiAnLScgb3IgJy4nLCBhbmQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgYXMtaXMgdG8gdGhlIHZlcnNpb24gbnVtYmVyLi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlclxuICAgICAqIEBwYXJhbSBzdWZmaXggIHRoZSBzdWZmaXgsIGlmIGFueS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYWtlVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcsIHN1ZmZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICBpZiAoIXN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdG9SZWxlYXNlVmVyc2lvbih2ZXJzaW9uLCBUYXJnZXROYW1lLkpBVkEpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdWZmaXguc3RhcnRzV2l0aCgnLScpICYmICFzdWZmaXguc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdmVyc2lvblN1ZmZpeCBtdXN0IHN0YXJ0IHdpdGggJy0nIG9yICcuJywgYnV0IHJlY2VpdmVkICR7c3VmZml4fWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7dmVyc2lvbn0ke3N1ZmZpeH1gO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdmVuRGVwZW5kZW5jaWVzKHRoaXM6IEphdmFHZW5lcmF0b3IpIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheTxNYXZlbkRlcGVuZGVuY3k+KCk7XG4gICAgICBmb3IgKGNvbnN0IFtkZXBOYW1lLCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgdGhpcy5hc3NlbWJseS5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgICApKSB7XG4gICAgICAgIGNvbnN0IGRlcCA9IHRoaXMuYXNzZW1ibHkuZGVwZW5kZW5jeUNsb3N1cmU/LltkZXBOYW1lXTtcbiAgICAgICAgaWYgKCFkZXA/LnRhcmdldHM/LmphdmEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXNzZW1ibHkgJHthc3NtLm5hbWV9IGRlcGVuZHMgb24gJHtkZXBOYW1lfSwgd2hpY2ggZG9lcyBub3QgZGVjbGFyZSBhIGphdmEgdGFyZ2V0YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHtcbiAgICAgICAgICBncm91cElkOiBkZXAudGFyZ2V0cy5qYXZhLm1hdmVuLmdyb3VwSWQsXG4gICAgICAgICAgYXJ0aWZhY3RJZDogZGVwLnRhcmdldHMuamF2YS5tYXZlbi5hcnRpZmFjdElkLFxuICAgICAgICAgIHZlcnNpb246IHRvTWF2ZW5WZXJzaW9uUmFuZ2UoXG4gICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgICAgZGVwLnRhcmdldHMuamF2YS5tYXZlbi52ZXJzaW9uU3VmZml4LFxuICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gVGhlIEpTSUkgamF2YSBydW50aW1lIGJhc2UgY2xhc3Nlc1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goe1xuICAgICAgICBncm91cElkOiAnc29mdHdhcmUuYW1hem9uLmpzaWknLFxuICAgICAgICBhcnRpZmFjdElkOiAnanNpaS1ydW50aW1lJyxcbiAgICAgICAgdmVyc2lvbjogdG9NYXZlblZlcnNpb25SYW5nZShgXiR7VkVSU0lPTn1gKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm92aWRlcyBAb3JnLmpldGJyYWlucy4qXG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh7XG4gICAgICAgIGdyb3VwSWQ6ICdvcmcuamV0YnJhaW5zJyxcbiAgICAgICAgYXJ0aWZhY3RJZDogJ2Fubm90YXRpb25zJyxcbiAgICAgICAgdmVyc2lvbjogJ1sxNi4wLjMsMjAuMC4wKScsXG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZXMgQGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkIGZvciBKREtzID49IDlcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHtcbiAgICAgICAgJyNjb21tZW50JzogJ1Byb3ZpZGVzIEBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCBmb3IgSkRLcyA+PSA5JyxcbiAgICAgICAgZ3JvdXBJZDogJ2phdmF4LmFubm90YXRpb24nLFxuICAgICAgICBhcnRpZmFjdElkOiAnamF2YXguYW5ub3RhdGlvbi1hcGknLFxuICAgICAgICB2ZXJzaW9uOiAnWzEuMy4yLDEuNC4wKScsXG4gICAgICAgIHNjb3BlOiAnY29tcGlsZScsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXZlbkRldmVsb3BlcnMoKSB7XG4gICAgICByZXR1cm4gW2Fzc20uYXV0aG9yLCAuLi4oYXNzbS5jb250cmlidXRvcnMgPz8gW10pXS5tYXAodG9EZXZlbG9wZXIpO1xuXG4gICAgICBmdW5jdGlvbiB0b0RldmVsb3BlcihwZXJzb246IHNwZWMuUGVyc29uKSB7XG4gICAgICAgIGNvbnN0IGRldmVsb3BlcjogYW55ID0ge1xuICAgICAgICAgIFtwZXJzb24ub3JnYW5pemF0aW9uID8gJ29yZ2FuaXphdGlvbicgOiAnbmFtZSddOiBwZXJzb24ubmFtZSxcbiAgICAgICAgICByb2xlczogeyByb2xlOiBwZXJzb24ucm9sZXMgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gV2UgY2Fubm90IHNldCBcInVuZGVmaW5lZFwiIG9yIFwibnVsbFwiIHRvIGEgZmllbGQgLSB0aGlzIGNhdXNlcyBpbnZhbGlkIFhNTCB0byBiZSBlbWl0dGVkIChwZXIgUE9NIHNjaGVtYSkuXG4gICAgICAgIGlmIChwZXJzb24uZW1haWwpIHtcbiAgICAgICAgICBkZXZlbG9wZXIuZW1haWwgPSBwZXJzb24uZW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcnNvbi51cmwpIHtcbiAgICAgICAgICBkZXZlbG9wZXJbcGVyc29uLm9yZ2FuaXphdGlvbiA/ICdvcmdhbml6YXRpb25VcmwnIDogJ3VybCddID1cbiAgICAgICAgICAgIHBlcnNvbi51cmw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRldmVsb3BlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hdmVuLXN0eWxlIGxpY2Vuc2UgYmxvY2sgZm9yIGEgdGhlIGFzc2VtYmx5LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL3BvbS5odG1sI0xpY2Vuc2VzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TGljZW5zZSgpIHtcbiAgICAgIGNvbnN0IHNwZHggPSBzcGR4TGljZW5zZUxpc3RbYXNzbS5saWNlbnNlXTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNwZHggJiYge1xuICAgICAgICAgIG5hbWU6IHNwZHgubmFtZSxcbiAgICAgICAgICB1cmw6IHNwZHgudXJsLFxuICAgICAgICAgIGRpc3RyaWJ1dGlvbjogJ3JlcG8nLFxuICAgICAgICAgIGNvbW1lbnRzOiBzcGR4Lm9zaUFwcHJvdmVkID8gJ0FuIE9TSS1hcHByb3ZlZCBsaWNlbnNlJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGF0aWNJbml0aWFsaXplcihjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgY29uc3QgY29uc3RzID0gKGNscy5wcm9wZXJ0aWVzID8/IFtdKS5maWx0ZXIoKHgpID0+IHguY29uc3QpO1xuICAgIGlmIChjb25zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgamF2YUNsYXNzID0gdGhpcy50b0phdmFUeXBlKGNscyk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3N0YXRpYycpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGNvbnN0cykge1xuICAgICAgY29uc3QgY29uc3ROYW1lID0gdGhpcy5yZW5kZXJDb25zdE5hbWUocHJvcCk7XG4gICAgICBjb25zdCBwcm9wVHlwZSA9IHRoaXMudG9OYXRpdmVUeXBlKHByb3AudHlwZSwgeyBmb3JNYXJzaGFsbGluZzogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHN0YXRlbWVudCA9IGBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LmpzaWlTdGF0aWNHZXQoJHtqYXZhQ2xhc3N9LmNsYXNzLCBcIiR7cHJvcC5uYW1lfVwiLCAke3Byb3BUeXBlfSlgO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGAke2NvbnN0TmFtZX0gPSAke3RoaXMud3JhcENvbGxlY3Rpb24oXG4gICAgICAgICAgc3RhdGVtZW50LFxuICAgICAgICAgIHByb3AudHlwZSxcbiAgICAgICAgICBwcm9wLm9wdGlvbmFsLFxuICAgICAgICApfTtgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDb25zdE5hbWUocHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLmNvZGUudG9TbmFrZUNhc2UocHJvcC5uYW1lKS50b0xvY2FsZVVwcGVyQ2FzZSgpOyAvLyBqYXZhIGNvbnN0cyBhcmUgU05BS0VfVVBQRVJfQ0FTRVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q29uc3RQcm9wZXJ0eShwYXJlbnRUeXBlOiBzcGVjLlR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBjb25zdCBwcm9wVHlwZSA9IHRoaXMudG9KYXZhVHlwZShwcm9wLnR5cGUpO1xuICAgIGNvbnN0IHByb3BOYW1lID0gdGhpcy5yZW5kZXJDb25zdE5hbWUocHJvcCk7XG4gICAgY29uc3QgYWNjZXNzID0gdGhpcy5yZW5kZXJBY2Nlc3NMZXZlbChwcm9wKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBwYXJlbnRUeXBlLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wKTtcbiAgICB0aGlzLmNvZGUubGluZShgJHthY2Nlc3N9IGZpbmFsIHN0YXRpYyAke3Byb3BUeXBlfSAke3Byb3BOYW1lfTtgKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFByb3BlcnR5KFxuICAgIGNsczogc3BlYy5UeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGUsXG4gICAge1xuICAgICAgZGVmYXVsdEltcGwgPSBmYWxzZSxcbiAgICAgIGZpbmFsID0gZmFsc2UsXG4gICAgICBpbmNsdWRlR2V0dGVyID0gdHJ1ZSxcbiAgICAgIG92ZXJyaWRlcyA9ICEhcHJvcC5vdmVycmlkZXMsXG4gICAgfToge1xuICAgICAgZGVmYXVsdEltcGw/OiBib29sZWFuO1xuICAgICAgZmluYWw/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZUdldHRlcj86IGJvb2xlYW47XG4gICAgICBvdmVycmlkZXM/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgZ2V0dGVyVHlwZSA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShwcm9wKTtcbiAgICBjb25zdCBzZXR0ZXJUeXBlcyA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZXMocHJvcCwge1xuICAgICAgY292YXJpYW50OiBwcm9wLnN0YXRpYyxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IGpzaWlUb1Bhc2NhbENhc2UoXG4gICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKHByb3AubmFtZSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGlmaWVycyA9IFtkZWZhdWx0SW1wbCA/ICdkZWZhdWx0JyA6IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwocHJvcCldO1xuICAgIGlmIChwcm9wLnN0YXRpYykgbW9kaWZpZXJzLnB1c2goJ3N0YXRpYycpO1xuICAgIGlmIChwcm9wLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2Fic3RyYWN0Jyk7XG4gICAgaWYgKGZpbmFsICYmICFwcm9wLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2ZpbmFsJyk7XG5cbiAgICBjb25zdCBqYXZhQ2xhc3MgPSB0aGlzLnRvSmF2YVR5cGUoY2xzKTtcblxuICAgIC8vIGZvciB1bmlvbnMgd2Ugb25seSBnZW5lcmF0ZSBvdmVybG9hZHMgZm9yIHNldHRlcnMsIG5vdCBnZXR0ZXJzLlxuICAgIGlmIChpbmNsdWRlR2V0dGVyKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wLCB7XG4gICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgIGZxbjogZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgICAgfSk7XG4gICAgICBpZiAob3ZlcnJpZGVzICYmICFwcm9wLnN0YXRpYykge1xuICAgICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke21vZGlmaWVycy5qb2luKCcgJyl9ICR7Z2V0dGVyVHlwZX0gZ2V0JHtwcm9wTmFtZX0oKWA7XG4gICAgICBpZiAocHJvcC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7c2lnbmF0dXJlfTtgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soc2lnbmF0dXJlKTtcbiAgICAgICAgbGV0IHN0YXRlbWVudDtcbiAgICAgICAgaWYgKHByb3Auc3RhdGljKSB7XG4gICAgICAgICAgc3RhdGVtZW50ID0gYHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuanNpaVN0YXRpY0dldCgke3RoaXMudG9KYXZhVHlwZShcbiAgICAgICAgICAgIGNscyxcbiAgICAgICAgICApfS5jbGFzcywgYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZW1lbnQgPSAnc29mdHdhcmUuYW1hem9uLmpzaWkuS2VybmVsLmdldCh0aGlzLCAnO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGVtZW50ICs9IGBcIiR7cHJvcC5uYW1lfVwiLCAke3RoaXMudG9OYXRpdmVUeXBlKHByb3AudHlwZSwge1xuICAgICAgICAgIGZvck1hcnNoYWxsaW5nOiB0cnVlLFxuICAgICAgICB9KX0pYDtcblxuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgcmV0dXJuICR7dGhpcy53cmFwQ29sbGVjdGlvbihzdGF0ZW1lbnQsIHByb3AudHlwZSwgcHJvcC5vcHRpb25hbCl9O2AsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHNldHRlclR5cGVzKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICAgIHRoaXMuYWRkSmF2YURvY3MocHJvcCwge1xuICAgICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgICAgZnFuOiBjbHMuZnFuLFxuICAgICAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvdmVycmlkZXMgJiYgIXByb3Auc3RhdGljKSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3ApO1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBgJHttb2RpZmllcnMuam9pbihcbiAgICAgICAgICAnICcsXG4gICAgICAgICl9IHZvaWQgc2V0JHtwcm9wTmFtZX0oZmluYWwgJHt0eXBlfSB2YWx1ZSlgO1xuICAgICAgICBpZiAocHJvcC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIHtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShgJHtzaWduYXR1cmV9O2ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soc2lnbmF0dXJlKTtcbiAgICAgICAgICBsZXQgc3RhdGVtZW50ID0gJyc7XG5cbiAgICAgICAgICBpZiAocHJvcC5zdGF0aWMpIHtcbiAgICAgICAgICAgIHN0YXRlbWVudCArPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5qc2lpU3RhdGljU2V0KCR7amF2YUNsYXNzfS5jbGFzcywgYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9ICdzb2Z0d2FyZS5hbWF6b24uanNpaS5LZXJuZWwuc2V0KHRoaXMsICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvcC5vcHRpb25hbFxuICAgICAgICAgICAgPyAndmFsdWUnXG4gICAgICAgICAgICA6IGBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCh2YWx1ZSwgXCIke3Byb3AubmFtZX0gaXMgcmVxdWlyZWRcIilgO1xuICAgICAgICAgIHN0YXRlbWVudCArPSBgXCIke3Byb3AubmFtZX1cIiwgJHt2YWx1ZX0pO2A7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoc3RhdGVtZW50KTtcbiAgICAgICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TWV0aG9kKFxuICAgIGNsczogc3BlYy5UeXBlLFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QsXG4gICAge1xuICAgICAgZGVmYXVsdEltcGwgPSBmYWxzZSxcbiAgICAgIGZpbmFsID0gZmFsc2UsXG4gICAgICBvdmVycmlkZXMgPSAhIW1ldGhvZC5vdmVycmlkZXMsXG4gICAgfTogeyBkZWZhdWx0SW1wbD86IGJvb2xlYW47IGZpbmFsPzogYm9vbGVhbjsgb3ZlcnJpZGVzPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtZXRob2QucmV0dXJuc1xuICAgICAgPyB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGUobWV0aG9kLnJldHVybnMpXG4gICAgICA6ICd2b2lkJztcblxuICAgIGNvbnN0IG1vZGlmaWVycyA9IFtcbiAgICAgIGRlZmF1bHRJbXBsID8gJ2RlZmF1bHQnIDogdGhpcy5yZW5kZXJBY2Nlc3NMZXZlbChtZXRob2QpLFxuICAgIF07XG4gICAgaWYgKG1ldGhvZC5zdGF0aWMpIG1vZGlmaWVycy5wdXNoKCdzdGF0aWMnKTtcbiAgICBpZiAobWV0aG9kLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2Fic3RyYWN0Jyk7XG4gICAgaWYgKGZpbmFsICYmICFtZXRob2QuYWJzdHJhY3QgJiYgIWRlZmF1bHRJbXBsKSBtb2RpZmllcnMucHVzaCgnZmluYWwnKTtcblxuICAgIGNvbnN0IGFzeW5jID0gISFtZXRob2QuYXN5bmM7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IEphdmFHZW5lcmF0b3Iuc2FmZUphdmFNZXRob2ROYW1lKG1ldGhvZC5uYW1lKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBgJHtyZXR1cm5UeXBlfSAke21ldGhvZE5hbWV9KCR7dGhpcy5yZW5kZXJNZXRob2RQYXJhbWV0ZXJzKFxuICAgICAgbWV0aG9kLFxuICAgICl9KWA7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKG1ldGhvZCwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogY2xzLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IG1ldGhvZC5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKG1ldGhvZCk7XG4gICAgaWYgKG92ZXJyaWRlcyAmJiAhbWV0aG9kLnN0YXRpYykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIH1cbiAgICBpZiAobWV0aG9kLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7bW9kaWZpZXJzLmpvaW4oJyAnKX0gJHtzaWduYXR1cmV9O2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGAke21vZGlmaWVycy5qb2luKCcgJyl9ICR7c2lnbmF0dXJlfWApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUodGhpcy5yZW5kZXJNZXRob2RDYWxsKGNscywgbWV0aG9kLCBhc3luYykpO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2UgYXJlIG5vdyBnb2luZyB0byBidWlsZCBhIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBwcm94eSBmb3IgdW50eXBlZFxuICAgKiBqYXZhc2NyaXB0IG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIHdlIHdhbnQgamF2YSBjb2RlIHRvIGJlXG4gICAqIGFibGUgdG8gaW50ZXJhY3Qgd2l0aCB0aGVtLCBzbyB3ZSB3aWxsIGNyZWF0ZSBhIHByb3h5IGNsYXNzIHdoaWNoXG4gICAqIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgYW5kIGhhcyB0aGUgc2FtZSBtZXRob2RzLlxuICAgKlxuICAgKiBUaGVzZSBwcm94aWVzIGFyZSBhbHNvIHVzZWQgdG8gZXh0ZW5kIGFic3RyYWN0IGNsYXNzZXMgdG8gYWxsb3cgdGhlIEpTSUlcbiAgICogZW5naW5lIHRvIGluc3RhbnRpYXRlIGFuIGFic3RyYWN0IGNsYXNzIGluIEphdmEuXG4gICAqL1xuICBwcml2YXRlIGVtaXRQcm94eSh0eXBlOiByZWZsZWN0LkludGVyZmFjZVR5cGUgfCByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIGNvbnN0IG5hbWUgPSBJTlRFUkZBQ0VfUFJPWFlfQ0xBU1NfTkFNRTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAqIEEgcHJveHkgY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyBhIGNvbmNyZXRlIGphdmFzY3JpcHQgaW5zdGFuY2Ugb2YgdGhpcyB0eXBlLicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG5cbiAgICBjb25zdCBiYXNlSW50ZXJmYWNlcyA9IHRoaXMuZGVmYXVsdEludGVyZmFjZXNGb3IodHlwZSwge1xuICAgICAgaW5jbHVkZVRoaXNUeXBlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGUuaXNJbnRlcmZhY2VUeXBlKCkgJiYgIWhhc0RlZmF1bHRJbnRlcmZhY2VzKHR5cGUuYXNzZW1ibHkpKSB7XG4gICAgICAvLyBFeHRlbmQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkgc2luY2UgdGhpcyBtb2R1bGUgZG9lcyBub3QgaGF2ZSB0aGUgSnNpaSREZWZhdWx0XG4gICAgICBiYXNlSW50ZXJmYWNlcy5wdXNoKHRoaXMudG9OYXRpdmVGcW4odHlwZS5mcW4pKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWZmaXggPSB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpXG4gICAgICA/IGBleHRlbmRzIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QgaW1wbGVtZW50cyAke2Jhc2VJbnRlcmZhY2VzLmpvaW4oXG4gICAgICAgICAgJywgJyxcbiAgICAgICAgKX1gXG4gICAgICA6IGBleHRlbmRzICR7dGhpcy50b05hdGl2ZUZxbih0eXBlLmZxbil9JHtcbiAgICAgICAgICBiYXNlSW50ZXJmYWNlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IGAgaW1wbGVtZW50cyAke2Jhc2VJbnRlcmZhY2VzLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICB9YDtcblxuICAgIGNvbnN0IG1vZGlmaWVycyA9IHR5cGUuaXNJbnRlcmZhY2VUeXBlKCkgPyAnZmluYWwnIDogJ3ByaXZhdGUgc3RhdGljIGZpbmFsJztcblxuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgJHttb2RpZmllcnN9IGNsYXNzICR7bmFtZX0gJHtzdWZmaXh9YCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtuYW1lfShmaW5hbCBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0UmVmIG9ialJlZilgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3N1cGVyKG9ialJlZik7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIC8vIGVtaXQgYWxsIHByb3BlcnRpZXNcbiAgICBmb3IgKGNvbnN0IHJlZmxlY3RQcm9wIG9mIHR5cGUuYWxsUHJvcGVydGllcy5maWx0ZXIoXG4gICAgICAocHJvcCkgPT5cbiAgICAgICAgcHJvcC5hYnN0cmFjdCAmJlxuICAgICAgICAocHJvcC5wYXJlbnRUeXBlLmZxbiA9PT0gdHlwZS5mcW4gfHxcbiAgICAgICAgICBwcm9wLnBhcmVudFR5cGUuaXNDbGFzc1R5cGUoKSB8fFxuICAgICAgICAgICFoYXNEZWZhdWx0SW50ZXJmYWNlcyhwcm9wLmFzc2VtYmx5KSksXG4gICAgKSkge1xuICAgICAgY29uc3QgcHJvcCA9IGNsb25lKHJlZmxlY3RQcm9wLnNwZWMpO1xuICAgICAgcHJvcC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgLy8gRW1pdHRpbmcgXCJmaW5hbFwiIHNpbmNlIHRoaXMgaXMgYSBwcm94eSBhbmQgbm90aGluZyB3aWxsL3Nob3VsZCBvdmVycmlkZSB0aGlzXG4gICAgICB0aGlzLmVtaXRQcm9wZXJ0eSh0eXBlLnNwZWMsIHByb3AsIHJlZmxlY3RQcm9wLmRlZmluaW5nVHlwZS5zcGVjLCB7XG4gICAgICAgIGZpbmFsOiB0cnVlLFxuICAgICAgICBvdmVycmlkZXM6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBlbWl0IGFsbCB0aGUgbWV0aG9kc1xuICAgIGZvciAoY29uc3QgcmVmbGVjdE1ldGhvZCBvZiB0eXBlLmFsbE1ldGhvZHMuZmlsdGVyKFxuICAgICAgKG1ldGhvZCkgPT5cbiAgICAgICAgbWV0aG9kLmFic3RyYWN0ICYmXG4gICAgICAgIChtZXRob2QucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgbWV0aG9kLnBhcmVudFR5cGUuaXNDbGFzc1R5cGUoKSB8fFxuICAgICAgICAgICFoYXNEZWZhdWx0SW50ZXJmYWNlcyhtZXRob2QuYXNzZW1ibHkpKSxcbiAgICApKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBjbG9uZShyZWZsZWN0TWV0aG9kLnNwZWMpO1xuICAgICAgbWV0aG9kLmFic3RyYWN0ID0gZmFsc2U7XG4gICAgICAvLyBFbWl0dGluZyBcImZpbmFsXCIgc2luY2UgdGhpcyBpcyBhIHByb3h5IGFuZCBub3RoaW5nIHdpbGwvc2hvdWxkIG92ZXJyaWRlIHRoaXNcbiAgICAgIHRoaXMuZW1pdE1ldGhvZCh0eXBlLnNwZWMsIG1ldGhvZCwgeyBmaW5hbDogdHJ1ZSwgb3ZlcnJpZGVzOiB0cnVlIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IG92ZXJsb2FkZWRNZXRob2Qgb2YgdGhpcy5jcmVhdGVPdmVybG9hZHNGb3JPcHRpb25hbHMobWV0aG9kKSkge1xuICAgICAgICBvdmVybG9hZGVkTWV0aG9kLmFic3RyYWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdE1ldGhvZCh0eXBlLnNwZWMsIG92ZXJsb2FkZWRNZXRob2QsIHtcbiAgICAgICAgICBmaW5hbDogdHJ1ZSxcbiAgICAgICAgICBvdmVycmlkZXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREZWZhdWx0SW1wbGVtZW50YXRpb24odHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlKSB7XG4gICAgY29uc3QgYmFzZUludGVyZmFjZXMgPSBbdHlwZS5uYW1lLCAuLi50aGlzLmRlZmF1bHRJbnRlcmZhY2VzRm9yKHR5cGUpXTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYCAqIEludGVybmFsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayAke3R5cGUubmFtZX19LmAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoQU5OX0lOVEVSTkFMKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYGludGVyZmFjZSAke0lOVEVSRkFDRV9ERUZBVUxUX0NMQVNTX05BTUV9IGV4dGVuZHMgJHtiYXNlSW50ZXJmYWNlc1xuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdHlwZS5hbGxQcm9wZXJ0aWVzLmZpbHRlcihcbiAgICAgIChwcm9wKSA9PlxuICAgICAgICBwcm9wLmFic3RyYWN0ICYmXG4gICAgICAgIC8vIE9ubHkgY2hlY2tpbmcgdGhlIGdldHRlciAtIGphdmEubGFuZy5PYmplY3QgaGFzIG5vIHNldHRlcnMuXG4gICAgICAgICFpc0phdmFMYW5nT2JqZWN0TWV0aG9kTmFtZShgZ2V0JHtqc2lpVG9QYXNjYWxDYXNlKHByb3AubmFtZSl9YCkgJiZcbiAgICAgICAgKHByb3AucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgIWhhc0RlZmF1bHRJbnRlcmZhY2VzKHByb3AuYXNzZW1ibHkpKSxcbiAgICApKSB7XG4gICAgICB0aGlzLmVtaXRQcm9wZXJ0eSh0eXBlLnNwZWMsIHByb3BlcnR5LnNwZWMsIHByb3BlcnR5LmRlZmluaW5nVHlwZS5zcGVjLCB7XG4gICAgICAgIGRlZmF1bHRJbXBsOiB0cnVlLFxuICAgICAgICBvdmVycmlkZXM6IHR5cGUuaXNJbnRlcmZhY2VUeXBlKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgdHlwZS5hbGxNZXRob2RzLmZpbHRlcihcbiAgICAgIChtZXRob2QpID0+XG4gICAgICAgIG1ldGhvZC5hYnN0cmFjdCAmJlxuICAgICAgICAhaXNKYXZhTGFuZ09iamVjdE1ldGhvZE5hbWUobWV0aG9kLm5hbWUpICYmXG4gICAgICAgIChtZXRob2QucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgIWhhc0RlZmF1bHRJbnRlcmZhY2VzKG1ldGhvZC5hc3NlbWJseSkpLFxuICAgICkpIHtcbiAgICAgIHRoaXMuZW1pdE1ldGhvZCh0eXBlLnNwZWMsIG1ldGhvZC5zcGVjLCB7XG4gICAgICAgIGRlZmF1bHRJbXBsOiB0cnVlLFxuICAgICAgICBvdmVycmlkZXM6IHR5cGUuaXNJbnRlcmZhY2VUeXBlKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGVudGl0eTogc3BlYy5Eb2N1bWVudGFibGUpIHtcbiAgICBpZiAoIWVudGl0eS5kb2NzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbnRpdHkuZG9jcy5zdGFiaWxpdHkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLlN0YWJpbGl0eShzb2Z0d2FyZS5hbWF6b24uanNpaS5TdGFiaWxpdHkuTGV2ZWwuJHtfbGV2ZWwoXG4gICAgICAgICAgZW50aXR5LmRvY3Muc3RhYmlsaXR5LFxuICAgICAgICApfSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZW50aXR5LmRvY3Muc3RhYmlsaXR5ID09PSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkIHx8XG4gICAgICBlbnRpdHkuZG9jcy5kZXByZWNhdGVkXG4gICAgKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQERlcHJlY2F0ZWQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfbGV2ZWwoc3RhYmlsaXR5OiBzcGVjLlN0YWJpbGl0eSk6IHN0cmluZyB7XG4gICAgICBzd2l0Y2ggKHN0YWJpbGl0eSkge1xuICAgICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQ6XG4gICAgICAgICAgcmV0dXJuICdEZXByZWNhdGVkJztcbiAgICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw6XG4gICAgICAgICAgcmV0dXJuICdFeHBlcmltZW50YWwnO1xuICAgICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkV4dGVybmFsOlxuICAgICAgICAgIC8vIFJlbmRlcmluZyAnRXh0ZXJuYWwnIG91dCBhcyBwdWJsaWNseSB2aXNpYmxlIHN0YXRlIGlzIGNvbmZ1c2luZy4gQXMgZmFyXG4gICAgICAgICAgLy8gYXMgdXNlcnMgYXJlIGNvbmNlcm5lZCB3ZSBqdXN0IGFkdmVydGlzZSB0aGlzIGFzIHN0YWJsZS5cbiAgICAgICAgICByZXR1cm4gJ1N0YWJsZSc7XG4gICAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuU3RhYmxlOlxuICAgICAgICAgIHJldHVybiAnU3RhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc3RhYmlsaXR5OiAke3N0YWJpbGl0eSBhcyBhbnl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFQcm9wKFxuICAgIHByb3BlcnR5OiBzcGVjLlByb3BlcnR5LFxuICAgIGRlZmluaW5nVHlwZTogc3BlYy5UeXBlLFxuICAgIGluaGVyaXRlZDogYm9vbGVhbixcbiAgKTogSmF2YVByb3Age1xuICAgIGNvbnN0IHNhZmVOYW1lID0gSmF2YUdlbmVyYXRvci5zYWZlSmF2YVByb3BlcnR5TmFtZShwcm9wZXJ0eS5uYW1lKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IGpzaWlUb1Bhc2NhbENhc2Uoc2FmZU5hbWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvY3M6IHByb3BlcnR5LmRvY3MsXG4gICAgICBzcGVjOiBwcm9wZXJ0eSxcbiAgICAgIGRlZmluaW5nVHlwZSxcbiAgICAgIHByb3BOYW1lLFxuICAgICAganNpaU5hbWU6IHByb3BlcnR5Lm5hbWUsXG4gICAgICBudWxsYWJsZTogISFwcm9wZXJ0eS5vcHRpb25hbCxcbiAgICAgIGZpZWxkTmFtZTogdGhpcy5jb2RlLnRvQ2FtZWxDYXNlKHNhZmVOYW1lKSxcbiAgICAgIGZpZWxkSmF2YVR5cGU6IHRoaXMudG9KYXZhVHlwZShwcm9wZXJ0eS50eXBlKSxcbiAgICAgIHBhcmFtSmF2YVR5cGU6IHRoaXMudG9KYXZhVHlwZShwcm9wZXJ0eS50eXBlLCB7IGNvdmFyaWFudDogdHJ1ZSB9KSxcbiAgICAgIGZpZWxkTmF0aXZlVHlwZTogdGhpcy50b05hdGl2ZVR5cGUocHJvcGVydHkudHlwZSksXG4gICAgICBmaWVsZEphdmFDbGFzczogYCR7dGhpcy50b0phdmFUeXBlKHByb3BlcnR5LnR5cGUsIHtcbiAgICAgICAgZm9yTWFyc2hhbGxpbmc6IHRydWUsXG4gICAgICB9KX0uY2xhc3NgLFxuICAgICAgamF2YVR5cGVzOiB0aGlzLnRvSmF2YVR5cGVzKHByb3BlcnR5LnR5cGUsIHsgY292YXJpYW50OiB0cnVlIH0pLFxuICAgICAgaW1tdXRhYmxlOiBwcm9wZXJ0eS5pbW11dGFibGUgPz8gZmFsc2UsXG4gICAgICBpbmhlcml0ZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENsYXNzQnVpbGRlcihjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgLy8gTm90IHJlbmRlcmluZyBpZiB0aGVyZSBpcyBubyBpbml0aWFsaXplciwgb3IgaWYgdGhlIGluaXRpYWxpemVyIGlzIHByb3RlY3RlZCBvciB2YXJpYWRpY1xuICAgIGlmIChjbHMuaW5pdGlhbGl6ZXIgPT0gbnVsbCB8fCBjbHMuaW5pdGlhbGl6ZXIucHJvdGVjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vdCByZW5kZXJpbmcgaWYgdGhlIGluaXRpYWxpemVyIGhhcyBubyBwYXJhbWV0ZXJzXG4gICAgaWYgKGNscy5pbml0aWFsaXplci5wYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm90IHJlbmRlcmluZyBpZiB0aGVyZSBpcyBhIG5lc3RlZCBcIkJ1aWxkZXJcIiBjbGFzc1xuICAgIGlmIChcbiAgICAgIHRoaXMucmVmbGVjdEFzc2VtYmx5LnRyeUZpbmRUeXBlKGAke2Nscy5mcW59LiR7QlVJTERFUl9DTEFTU19OQU1FfWApICE9XG4gICAgICBudWxsXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgZmlyc3Qgc3RydWN0IHBhcmFtZXRlciBvZiB0aGUgY29uc3RydWN0b3IgKGlmIGFueSlcbiAgICBjb25zdCBmaXJzdFN0cnVjdCA9IGNscy5pbml0aWFsaXplci5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtKSA9PiB7XG4gICAgICBpZiAoIXNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UocGFyYW0udHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdGhpcy5yZWZsZWN0QXNzZW1ibHkudHJ5RmluZFR5cGUocGFyYW0udHlwZS5mcW4pO1xuICAgICAgcmV0dXJuIHBhcmFtVHlwZT8uaXNEYXRhVHlwZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gTm90IHJlbmRlcmluZyBpZiB0aGVyZSBpcyBubyBzdHJ1Y3QgcGFyYW1ldGVyXG4gICAgaWYgKGZpcnN0U3RydWN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJ1Y3RUeXBlID0gdGhpcy5yZWZsZWN0QXNzZW1ibHkuZmluZFR5cGUoXG4gICAgICAoZmlyc3RTdHJ1Y3QudHlwZSBhcyBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSkuZnFuLFxuICAgICkgYXMgcmVmbGVjdC5JbnRlcmZhY2VUeXBlO1xuICAgIGNvbnN0IHN0cnVjdFBhcmFtTmFtZSA9IHRoaXMuY29kZS50b0NhbWVsQ2FzZShcbiAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUoZmlyc3RTdHJ1Y3QubmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBzdHJ1Y3RCdWlsZGVyID0gYCR7dGhpcy50b0phdmFUeXBlKFxuICAgICAgZmlyc3RTdHJ1Y3QudHlwZSxcbiAgICApfS4ke0JVSUxERVJfQ0xBU1NfTkFNRX1gO1xuXG4gICAgY29uc3QgcG9zaXRpb25hbFBhcmFtcyA9IGNscy5pbml0aWFsaXplci5wYXJhbWV0ZXJzXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBmaXJzdFN0cnVjdClcbiAgICAgIC5tYXAoKHBhcmFtKSA9PiAoe1xuICAgICAgICBwYXJhbSxcbiAgICAgICAgZmllbGROYW1lOiB0aGlzLmNvZGUudG9DYW1lbENhc2UoXG4gICAgICAgICAgSmF2YUdlbmVyYXRvci5zYWZlSmF2YVByb3BlcnR5TmFtZShwYXJhbS5uYW1lKSxcbiAgICAgICAgKSxcbiAgICAgICAgamF2YVR5cGU6IHRoaXMudG9KYXZhVHlwZShwYXJhbS50eXBlKSxcbiAgICAgIH0pKTtcblxuICAgIGNvbnN0IGJ1aWx0VHlwZSA9IHRoaXMudG9KYXZhVHlwZShjbHMpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZXR0aWVyL3ByZXR0aWVyXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgICogJHtzdGFiaWxpdHlQcmVmaXhGb3IoXG4gICAgICAgIGNscy5pbml0aWFsaXplcixcbiAgICAgICl9QSBmbHVlbnQgYnVpbGRlciBmb3Ige0BsaW5rICR7YnVpbHRUeXBlfX0uYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhjbHMuaW5pdGlhbGl6ZXIpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gaW1wbGVtZW50cyBzb2Z0d2FyZS5hbWF6b24uanNpaS5CdWlsZGVyPCR7YnVpbHRUeXBlfT5gLFxuICAgICk7XG5cbiAgICAvLyBTdGF0aWMgZmFjdG9yeSBtZXRob2QocylcbiAgICBmb3IgKGNvbnN0IHBhcmFtcyBvZiBjb21wdXRlT3ZlcnJpZGVzKHBvc2l0aW9uYWxQYXJhbXMpKSB7XG4gICAgICBjb25zdCBkdW1teU1ldGhvZDogc3BlYy5NZXRob2QgPSB7XG4gICAgICAgIGRvY3M6IHtcbiAgICAgICAgICBzdGFiaWxpdHk6IGNscy5pbml0aWFsaXplci5kb2NzPy5zdGFiaWxpdHkgPz8gY2xzLmRvY3M/LnN0YWJpbGl0eSxcbiAgICAgICAgICByZXR1cm5zOiBgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rICR7QlVJTERFUl9DTEFTU19OQU1FfX0uYCxcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZTogJ2NyZWF0ZScsXG4gICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtcy5tYXAoKHBhcmFtKSA9PiBwYXJhbS5wYXJhbSksXG4gICAgICB9O1xuICAgICAgdGhpcy5hZGRKYXZhRG9jcyhkdW1teU1ldGhvZCwge1xuICAgICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgICBmcW46IGNscy5mcW4sXG4gICAgICAgIG1lbWJlck5hbWU6IGR1bW15TWV0aG9kLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNscy5pbml0aWFsaXplcik7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljIHN0YXRpYyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gY3JlYXRlKCR7cGFyYW1zXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgICAgYGZpbmFsICR7cGFyYW0uamF2YVR5cGV9JHtwYXJhbS5wYXJhbS52YXJpYWRpYyA/ICcuLi4nIDogJyd9ICR7XG4gICAgICAgICAgICAgICAgcGFyYW0uZmllbGROYW1lXG4gICAgICAgICAgICAgIH1gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuam9pbignLCAnKX0pYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHJldHVybiBuZXcgJHtCVUlMREVSX0NMQVNTX05BTUV9KCR7cG9zaXRpb25hbFBhcmFtc1xuICAgICAgICAgIC5tYXAoKHBhcmFtLCBpZHgpID0+IChpZHggPCBwYXJhbXMubGVuZ3RoID8gcGFyYW0uZmllbGROYW1lIDogJ251bGwnKSlcbiAgICAgICAgICAuam9pbignLCAnKX0pO2AsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICAvLyBQcml2YXRlIHByb3BlcnRpZXNcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcG9zaXRpb25hbFBhcmFtcykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBwcml2YXRlIGZpbmFsICR7cGFyYW0uamF2YVR5cGV9JHtwYXJhbS5wYXJhbS52YXJpYWRpYyA/ICdbXScgOiAnJ30gJHtcbiAgICAgICAgICBwYXJhbS5maWVsZE5hbWVcbiAgICAgICAgfTtgLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcHJpdmF0ZSAke1xuICAgICAgICBmaXJzdFN0cnVjdC5vcHRpb25hbCA/ICcnIDogJ2ZpbmFsICdcbiAgICAgIH0ke3N0cnVjdEJ1aWxkZXJ9ICR7c3RydWN0UGFyYW1OYW1lfTtgLFxuICAgICk7XG5cbiAgICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByaXZhdGUgJHtCVUlMREVSX0NMQVNTX05BTUV9KCR7cG9zaXRpb25hbFBhcmFtc1xuICAgICAgICAubWFwKFxuICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgIGBmaW5hbCAke3BhcmFtLmphdmFUeXBlfSR7cGFyYW0ucGFyYW0udmFyaWFkaWMgPyAnLi4uJyA6ICcnfSAke1xuICAgICAgICAgICAgICBwYXJhbS5maWVsZE5hbWVcbiAgICAgICAgICAgIH1gLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcsICcpfSlgLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwb3NpdGlvbmFsUGFyYW1zKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgdGhpcy4ke3BhcmFtLmZpZWxkTmFtZX0gPSAke3BhcmFtLmZpZWxkTmFtZX07YCk7XG4gICAgfVxuICAgIGlmICghZmlyc3RTdHJ1Y3Qub3B0aW9uYWwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSA9IG5ldyAke3N0cnVjdEJ1aWxkZXJ9KCk7YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBGaWVsZHNcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc3RydWN0VHlwZS5hbGxQcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmNvZGUudG9DYW1lbENhc2UoXG4gICAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcC5uYW1lKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgY29uc3Qgc2V0dGVyOiBzcGVjLk1ldGhvZCA9IHtcbiAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgLi4ucHJvcC5zcGVjLmRvY3MsXG4gICAgICAgICAgc3RhYmlsaXR5OiBwcm9wLnNwZWMuZG9jcz8uc3RhYmlsaXR5LFxuICAgICAgICAgIHJldHVybnM6ICd7QGNvZGUgdGhpc30nLFxuICAgICAgICB9LFxuICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgdHlwZTogc3BlYy5DQU5PTklDQUxfQU5ZLCAvLyBXZSBkb24ndCBxdWl0ZSBjYXJlIGluIHRoaXMgY29udGV4dCFcbiAgICAgICAgICAgIGRvY3M6IHByb3Auc3BlYy5kb2NzLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBqYXZhVHlwZSBvZiB0aGlzLnRvSmF2YVR5cGVzKHByb3AudHlwZS5zcGVjISwge1xuICAgICAgICBjb3ZhcmlhbnQ6IHRydWUsXG4gICAgICB9KSkge1xuICAgICAgICB0aGlzLmFkZEphdmFEb2NzKHNldHRlciwge1xuICAgICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgICAgZnFuOiBwcm9wLmRlZmluaW5nVHlwZS5mcW4sIC8vIENvdWxkIGJlIGluaGVyaXRlZFxuICAgICAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3Auc3BlYyk7XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICAgYHB1YmxpYyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gJHtmaWVsZE5hbWV9KGZpbmFsICR7amF2YVR5cGV9ICR7ZmllbGROYW1lfSlgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICBgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0ke1xuICAgICAgICAgICAgZmlyc3RTdHJ1Y3Qub3B0aW9uYWwgPyAnKCknIDogJydcbiAgICAgICAgICB9LiR7ZmllbGROYW1lfSgke2ZpZWxkTmFtZX0pO2AsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gdGhpczsnKTtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaW5hbCBidWlsZCBtZXRob2RcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiBAcmV0dXJucyBhIG5ld2x5IGJ1aWx0IGluc3RhbmNlIG9mIHtAbGluayAke2J1aWx0VHlwZX19LmAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xzLmluaXRpYWxpemVyKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljICR7YnVpbHRUeXBlfSBidWlsZCgpYCk7XG4gICAgY29uc3QgcGFyYW1zID0gY2xzLmluaXRpYWxpemVyLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgaWYgKHBhcmFtID09PSBmaXJzdFN0cnVjdCkge1xuICAgICAgICByZXR1cm4gZmlyc3RTdHJ1Y3Qub3B0aW9uYWxcbiAgICAgICAgICA/IGB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSAhPSBudWxsID8gdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0uYnVpbGQoKSA6IG51bGxgXG4gICAgICAgICAgOiBgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0uYnVpbGQoKWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHRoaXMuJHtcbiAgICAgICAgcG9zaXRpb25hbFBhcmFtcy5maW5kKChwKSA9PiBwYXJhbSA9PT0gcC5wYXJhbSkhLmZpZWxkTmFtZVxuICAgICAgfWA7XG4gICAgfSk7XG4gICAgdGhpcy5jb2RlLmluZGVudChgcmV0dXJuIG5ldyAke2J1aWx0VHlwZX0oYCk7XG4gICAgcGFyYW1zLmZvckVhY2goKHBhcmFtLCBpZHgpID0+XG4gICAgICB0aGlzLmNvZGUubGluZShgJHtwYXJhbX0ke2lkeCA8IHBhcmFtcy5sZW5ndGggLSAxID8gJywnIDogJyd9YCksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUudW5pbmRlbnQoJyk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIC8vIE9wdGlvbmFsIGJ1aWxkZXIgaW5pdGlhbGl6YXRpb25cbiAgICBpZiAoZmlyc3RTdHJ1Y3Qub3B0aW9uYWwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwcml2YXRlICR7c3RydWN0QnVpbGRlcn0gJHtzdHJ1Y3RQYXJhbU5hbWV9KClgKTtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYGlmICh0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSA9PSBudWxsKWApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9ID0gbmV3ICR7c3RydWN0QnVpbGRlcn0oKTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9O2ApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEJ1aWxkZXJTZXR0ZXIoXG4gICAgcHJvcDogSmF2YVByb3AsXG4gICAgYnVpbGRlck5hbWU6IHN0cmluZyxcbiAgICBwYXJlbnRUeXBlOiBzcGVjLkludGVyZmFjZVR5cGUsXG4gICkge1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiBwcm9wLmphdmFUeXBlcykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgICogU2V0cyB0aGUgdmFsdWUgb2Yge0BsaW5rICR7cGFyZW50VHlwZS5uYW1lfSMke2dldHRlckZvcihcbiAgICAgICAgICBwcm9wLmZpZWxkTmFtZSxcbiAgICAgICAgKX19YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gcHJvcC5kb2NzPy5zdW1tYXJ5ID8/ICd0aGUgdmFsdWUgdG8gYmUgc2V0JztcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgICogJHtwYXJhbUphdmFkb2MocHJvcC5maWVsZE5hbWUsIHByb3AubnVsbGFibGUsIHN1bW1hcnkpfWAsXG4gICAgICApO1xuICAgICAgaWYgKHByb3AuZG9jcz8ucmVtYXJrcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICcgJy5yZXBlYXQoNyArIHByb3AuZmllbGROYW1lLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlbWFya3MgPSBtYXJrRG93blRvSmF2YURvYyhcbiAgICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihwcm9wLmRvY3MucmVtYXJrcywge1xuICAgICAgICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgICAgICAgIGZxbjogcHJvcC5kZWZpbmluZ1R5cGUuZnFuLFxuICAgICAgICAgICAgbWVtYmVyTmFtZTogcHJvcC5qc2lpTmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKS50cmltUmlnaHQoKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHJlbWFya3Muc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqICR7aW5kZW50fSAke2xpbmV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY29kZS5saW5lKCcgKiBAcmV0dXJuIHtAY29kZSB0aGlzfScpO1xuICAgICAgaWYgKHByb3AuZG9jcz8uZGVwcmVjYXRlZCkge1xuICAgICAgICB0aGlzLmNvZGUubGluZShgICogQGRlcHJlY2F0ZWQgJHtwcm9wLmRvY3MuZGVwcmVjYXRlZH1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3Auc3BlYyk7XG4gICAgICAvLyBXZSBhZGQgYW4gZXhwbGljaXQgY2FzdCBpZiBib3RoIHR5cGVzIGFyZSBnZW5lcmljIGJ1dCB0aGV5IGFyZSBub3QgaWRlbnRpY2FsIChvbmUgaXMgY292YXJpYW50LCB0aGUgb3RoZXIgaXNuJ3QpXG4gICAgICBjb25zdCBleHBsaWNpdENhc3QgPVxuICAgICAgICB0eXBlLmluY2x1ZGVzKCc8JykgJiZcbiAgICAgICAgcHJvcC5maWVsZEphdmFUeXBlLmluY2x1ZGVzKCc8JykgJiZcbiAgICAgICAgdHlwZSAhPT0gcHJvcC5maWVsZEphdmFUeXBlXG4gICAgICAgICAgPyBgKCR7cHJvcC5maWVsZEphdmFUeXBlfSlgXG4gICAgICAgICAgOiAnJztcbiAgICAgIGlmIChleHBsaWNpdENhc3QgIT09ICcnKSB7XG4gICAgICAgIC8vIFdlJ2xsIGJlIGRvaW5nIGEgc2FmZSwgYnV0IHVuY2hlY2tlZCBjYXN0LCBzbyBzdXBwcmVzcyB0aGF0IHdhcm5pbmdcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BTdXBwcmVzc1dhcm5pbmdzKFwidW5jaGVja2VkXCIpJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljICR7YnVpbGRlck5hbWV9ICR7cHJvcC5maWVsZE5hbWV9KCR7dHlwZX0gJHtwcm9wLmZpZWxkTmFtZX0pYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gPSAke2V4cGxpY2l0Q2FzdH0ke3Byb3AuZmllbGROYW1lfTtgLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gdGhpczsnKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0dGVyRm9yKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBmaWVsZE5hbWU7XG4gICAgICByZXR1cm4gYGdldCR7Zmlyc3QudG9VcHBlckNhc2UoKX0ke3Jlc3Quam9pbignJyl9YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbnRlcmZhY2VCdWlsZGVyKFxuICAgIGNsYXNzU3BlYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgIGNvbnN0cnVjdG9yTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBKYXZhUHJvcFtdLFxuICApIHtcbiAgICAvLyBTdGFydCBidWlsZGVyKClcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiBAcmV0dXJuIGEge0BsaW5rICR7QlVJTERFUl9DTEFTU19OQU1FfX0gb2Yge0BsaW5rICR7Y2xhc3NTcGVjLm5hbWV9fWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xhc3NTcGVjKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBzdGF0aWMgJHtCVUlMREVSX0NMQVNTX05BTUV9IGJ1aWxkZXIoKWApO1xuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gbmV3ICR7QlVJTERFUl9DTEFTU19OQU1FfSgpO2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgLy8gRW5kIGJ1aWxkZXIoKVxuXG4gICAgLy8gU3RhcnQgQnVpbGRlclxuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShgICogQSBidWlsZGVyIGZvciB7QGxpbmsgJHtjbGFzc1NwZWMubmFtZX19YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNsYXNzU3BlYyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzICR7QlVJTERFUl9DTEFTU19OQU1FfSBpbXBsZW1lbnRzIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkJ1aWxkZXI8JHtjbGFzc1NwZWMubmFtZX0+YCxcbiAgICApO1xuXG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT5cbiAgICAgIHRoaXMuY29kZS5saW5lKGAke3Byb3AuZmllbGRKYXZhVHlwZX0gJHtwcm9wLmZpZWxkTmFtZX07YCksXG4gICAgKTtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PlxuICAgICAgdGhpcy5lbWl0QnVpbGRlclNldHRlcihwcm9wLCBCVUlMREVSX0NMQVNTX05BTUUsIGNsYXNzU3BlYyksXG4gICAgKTtcblxuICAgIC8vIFN0YXJ0IGJ1aWxkKClcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICogQnVpbGRzIHRoZSBjb25maWd1cmVkIGluc3RhbmNlLicpO1xuICAgIHRoaXMuY29kZS5saW5lKGAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayAke2NsYXNzU3BlYy5uYW1lfX1gKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFueSByZXF1aXJlZCBhdHRyaWJ1dGUgd2FzIG5vdCBwcm92aWRlZCcsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xhc3NTcGVjKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljICR7Y2xhc3NTcGVjLm5hbWV9IGJ1aWxkKClgKTtcblxuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gbmV3ICR7Y29uc3RydWN0b3JOYW1lfSh0aGlzKTtgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBidWlsZCgpXG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBCdWlsZGVyXG4gIH1cblxuICBwcml2YXRlIGVtaXREYXRhVHlwZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIC8vIGNvbGxlY3QgYWxsIHByb3BlcnRpZXMgZnJvbSBhbGwgYmFzZSBzdHJ1Y3RzIGFuZCBkZWR1cGUgYnkgbmFtZS4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBnZW5lcmF0aW9uIG9mIHRoZVxuICAgIC8vIGFzc2VtYmx5IHdpbGwgbm90IHBlcm1pdCBtdWx0aXBsZSBvdmVybG9hZGVkIGluaGVyaXRlZCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdGhhdCB0aGlzIHdpbGwgYmVcbiAgICAvLyBlbmZvcmNlZCBieSBUeXBlc2NyaXB0IGNvbnN0cmFpbnRzLlxuICAgIGNvbnN0IHByb3BzQnlOYW1lOiB7IFtuYW1lOiBzdHJpbmddOiBKYXZhUHJvcCB9ID0ge307XG5cbiAgICBmdW5jdGlvbiBjb2xsZWN0UHJvcHMoXG4gICAgICB0aGlzOiBKYXZhR2VuZXJhdG9yLFxuICAgICAgY3VycmVudElmYzogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICAgICAgaXNCYXNlQ2xhc3MgPSBmYWxzZSxcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgY3VycmVudElmYy5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGphdmFQcm9wID0gdGhpcy50b0phdmFQcm9wKHByb3BlcnR5LCBjdXJyZW50SWZjLCBpc0Jhc2VDbGFzcyk7XG4gICAgICAgIHByb3BzQnlOYW1lW2phdmFQcm9wLnByb3BOYW1lXSA9IGphdmFQcm9wO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgcHJvcHMgb2YgYmFzZSBzdHJ1Y3RcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiBjdXJyZW50SWZjLmludGVyZmFjZXMgPz8gW10pIHtcbiAgICAgICAgY29sbGVjdFByb3BzLmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbmRUeXBlKGJhc2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbGxlY3RQcm9wcy5jYWxsKHRoaXMsIGlmYyk7XG4gICAgY29uc3QgcHJvcHMgPSBPYmplY3QudmFsdWVzKHByb3BzQnlOYW1lKTtcbiAgICB0aGlzLmVtaXRJbnRlcmZhY2VCdWlsZGVyKGlmYywgSU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUUsIHByb3BzKTtcblxuICAgIC8vIFN0YXJ0IGltcGxlbWVudGF0aW9uIGNsYXNzXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYCAqIEFuIGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgJHtpZmMubmFtZX19YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGlmYyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoQU5OX0lOVEVSTkFMKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYGZpbmFsIGNsYXNzICR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9IGV4dGVuZHMgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdCBpbXBsZW1lbnRzICR7aWZjLm5hbWV9YCxcbiAgICApO1xuXG4gICAgLy8gSW1tdXRhYmxlIHByb3BlcnRpZXNcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoYHByaXZhdGUgZmluYWwgJHtwcm9wLmZpZWxkSmF2YVR5cGV9ICR7cHJvcC5maWVsZE5hbWV9O2ApLFxuICAgICk7XG5cbiAgICAvLyBTdGFydCBKU0lJIHJlZmVyZW5jZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAqIENvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG9iamVjdCBiYXNlZCBvbiB2YWx1ZXMgcmV0cmlldmVkIGZyb20gdGhlIEpzaWlPYmplY3QuJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKiBAcGFyYW0gb2JqUmVmIFJlZmVyZW5jZSB0byB0aGUgSlNJSSBtYW5hZ2VkIG9iamVjdC4nKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtJTlRFUkZBQ0VfUFJPWFlfQ0xBU1NfTkFNRX0oZmluYWwgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdFJlZiBvYmpSZWYpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihvYmpSZWYpOycpO1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gPSBzb2Z0d2FyZS5hbWF6b24uanNpaS5LZXJuZWwuZ2V0KHRoaXMsIFwiJHtwcm9wLmpzaWlOYW1lfVwiLCAke3Byb3AuZmllbGROYXRpdmVUeXBlfSk7YCxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBKU0lJIHJlZmVyZW5jZSBjb25zdHJ1Y3RvclxuXG4gICAgLy8gU3RhcnQgYnVpbGRlciBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAqIENvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG9iamVjdCBiYXNlZCBvbiBsaXRlcmFsIHByb3BlcnR5IHZhbHVlcyBwYXNzZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyfS4nLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIGlmIChwcm9wcy5zb21lKChwcm9wKSA9PiBwcm9wLmZpZWxkSmF2YVR5cGUgIT09IHByb3AucGFyYW1KYXZhVHlwZSkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdAU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKScpO1xuICAgIH1cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCAke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfShmaW5hbCAke0JVSUxERVJfQ0xBU1NfTkFNRX0gYnVpbGRlcilgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnc3VwZXIoc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5Jbml0aWFsaXphdGlvbk1vZGUuSlNJSSk7JyxcbiAgICApO1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IGV4cGxpY2l0Q2FzdCA9XG4gICAgICAgIHByb3AuZmllbGRKYXZhVHlwZSAhPT0gcHJvcC5wYXJhbUphdmFUeXBlXG4gICAgICAgICAgPyBgKCR7cHJvcC5maWVsZEphdmFUeXBlfSlgXG4gICAgICAgICAgOiAnJztcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgdGhpcy4ke3Byb3AuZmllbGROYW1lfSA9ICR7ZXhwbGljaXRDYXN0fSR7X3ZhbGlkYXRlSWZOb25PcHRpb25hbChcbiAgICAgICAgICBgYnVpbGRlci4ke3Byb3AuZmllbGROYW1lfWAsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgKX07YCxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgbGl0ZXJhbCBjb25zdHJ1Y3RvclxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICBgcHVibGljIGZpbmFsICR7cHJvcC5maWVsZEphdmFUeXBlfSBnZXQke3Byb3AucHJvcE5hbWV9KClgLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gdGhpcy4ke3Byb3AuZmllbGROYW1lfTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfSk7XG5cbiAgICAvLyBlbWl0ICRqc2lpJHRvSnNvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB0byBzZXJpYWxpemUgdGhpcyBvYmplY3Qgd2hlbiBzZW50IHRvIEpTXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoQU5OX0lOVEVSTkFMKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgJ3B1YmxpYyBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvbk5vZGUgJGpzaWkkdG9Kc29uKCknLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnZmluYWwgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlciBvbSA9IHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3RNYXBwZXIuSU5TVEFOQ0U7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYGZpbmFsIGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLk9iamVjdE5vZGUgZGF0YSA9IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLkpzb25Ob2RlRmFjdG9yeS5pbnN0YW5jZS5vYmplY3ROb2RlKCk7YCxcbiAgICApO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYGlmICh0aGlzLmdldCR7cHJvcC5wcm9wTmFtZX0oKSAhPSBudWxsKWApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGBkYXRhLnNldChcIiR7cHJvcC5zcGVjLm5hbWV9XCIsIG9tLnZhbHVlVG9UcmVlKHRoaXMuZ2V0JHtwcm9wLnByb3BOYW1lfSgpKSk7YCxcbiAgICAgICk7XG4gICAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnZmluYWwgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSBzdHJ1Y3QgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5Kc29uTm9kZUZhY3RvcnkuaW5zdGFuY2Uub2JqZWN0Tm9kZSgpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShgc3RydWN0LnNldChcImZxblwiLCBvbS52YWx1ZVRvVHJlZShcIiR7aWZjLmZxbn1cIikpO2ApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdHJ1Y3Quc2V0KFwiZGF0YVwiLCBkYXRhKTsnKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnZmluYWwgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSBvYmogPSBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5Kc29uTm9kZUZhY3RvcnkuaW5zdGFuY2Uub2JqZWN0Tm9kZSgpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnb2JqLnNldChcIiRqc2lpLnN0cnVjdFwiLCBzdHJ1Y3QpOycpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIG9iajsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCAkanNpaSR0b0pzb25cblxuICAgIC8vIEdlbmVyYXRlIGVxdWFscygpIG92ZXJyaWRlXG4gICAgdGhpcy5lbWl0RXF1YWxzT3ZlcnJpZGUoaWZjLm5hbWUsIHByb3BzKTtcblxuICAgIC8vIEdlbmVyYXRlIGhhc2hDb2RlKCkgb3ZlcnJpZGVcbiAgICB0aGlzLmVtaXRIYXNoQ29kZU92ZXJyaWRlKHByb3BzKTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgLy8gRW5kIGltcGxlbWVudGF0aW9uIGNsYXNzXG5cbiAgICBmdW5jdGlvbiBfdmFsaWRhdGVJZk5vbk9wdGlvbmFsKHZhcmlhYmxlOiBzdHJpbmcsIHByb3A6IEphdmFQcm9wKTogc3RyaW5nIHtcbiAgICAgIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGwoJHt2YXJpYWJsZX0sIFwiJHtwcm9wLmZpZWxkTmFtZX0gaXMgcmVxdWlyZWRcIilgO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEVxdWFsc092ZXJyaWRlKGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wczogSmF2YVByb3BbXSkge1xuICAgIC8vIEEgY2xhc3Mgd2l0aG91dCBwcm9wZXJ0aWVzIGRvZXMgbm90IG5lZWQgdG8gb3ZlcnJpZGUgZXF1YWxzKClcbiAgICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygncHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKScpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsnKTtcblxuICAgIC8vIFRoaXMgd2FzIGFscmVhZHkgY2hlY2tlZCBieSBgc3VwZXIuZXF1YWxzKG8pYCwgc28gd2Ugc2tpcCBpdCBoZXJlLi4uXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOycsXG4gICAgKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgJHtjbGFzc05hbWV9LiR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9IHRoYXQgPSAoJHtjbGFzc05hbWV9LiR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9KSBvO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgY29uc3QgaW5pdGlhbFByb3BzID0gcHJvcHMuc2xpY2UoMCwgcHJvcHMubGVuZ3RoIC0gMSk7XG4gICAgY29uc3QgZmluYWxQcm9wID0gcHJvcHNbcHJvcHMubGVuZ3RoIC0gMV07XG5cbiAgICBpbml0aWFsUHJvcHMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgY29uc3QgcHJlZGljYXRlID0gcHJvcC5udWxsYWJsZVxuICAgICAgICA/IGB0aGlzLiR7cHJvcC5maWVsZE5hbWV9ICE9IG51bGwgPyAhdGhpcy4ke3Byb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke3Byb3AuZmllbGROYW1lfSkgOiB0aGF0LiR7cHJvcC5maWVsZE5hbWV9ICE9IG51bGxgXG4gICAgICAgIDogYCEke3Byb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke3Byb3AuZmllbGROYW1lfSlgO1xuXG4gICAgICB0aGlzLmNvZGUubGluZShgaWYgKCR7cHJlZGljYXRlfSkgcmV0dXJuIGZhbHNlO2ApO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGZpbmFsIChyZXR1cm5lZCBwcmVkaWNhdGUpIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBvdGhlciBvbmVzXG4gICAgY29uc3QgZmluYWxQcmVkaWNhdGUgPSBmaW5hbFByb3AubnVsbGFibGVcbiAgICAgID8gYHRoaXMuJHtmaW5hbFByb3AuZmllbGROYW1lfSAhPSBudWxsID8gdGhpcy4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9LmVxdWFscyh0aGF0LiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0pIDogYCArXG4gICAgICAgIGB0aGF0LiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0gPT0gbnVsbGBcbiAgICAgIDogYHRoaXMuJHtmaW5hbFByb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9KWA7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiAke2ZpbmFsUHJlZGljYXRlfTtgKTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRIYXNoQ29kZU92ZXJyaWRlKHByb3BzOiBKYXZhUHJvcFtdKSB7XG4gICAgLy8gQSBjbGFzcyB3aXRob3V0IHByb3BlcnRpZXMgZG9lcyBub3QgbmVlZCB0byBvdmVycmlkZSBoYXNoQ29kZSgpXG4gICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3B1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKScpO1xuXG4gICAgY29uc3QgZmlyc3RQcm9wID0gcHJvcHNbMF07XG4gICAgY29uc3QgcmVtYWluaW5nUHJvcHMgPSBwcm9wcy5zbGljZSgxKTtcblxuICAgIHRoaXMuY29kZS5saW5lKGBpbnQgcmVzdWx0ID0gJHtfaGFzaENvZGVGb3JQcm9wKGZpcnN0UHJvcCl9O2ApO1xuICAgIHJlbWFpbmluZ1Byb3BzLmZvckVhY2goKHByb3ApID0+XG4gICAgICB0aGlzLmNvZGUubGluZShgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoJHtfaGFzaENvZGVGb3JQcm9wKHByb3ApfSk7YCksXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHJlc3VsdDsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgZnVuY3Rpb24gX2hhc2hDb2RlRm9yUHJvcChwcm9wOiBKYXZhUHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AubnVsbGFibGVcbiAgICAgICAgPyBgdGhpcy4ke3Byb3AuZmllbGROYW1lfSAhPSBudWxsID8gdGhpcy4ke3Byb3AuZmllbGROYW1lfS5oYXNoQ29kZSgpIDogMGBcbiAgICAgICAgOiBgdGhpcy4ke3Byb3AuZmllbGROYW1lfS5oYXNoQ29kZSgpYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9wZW5GaWxlSWZOZWVkZWQodHlwZTogc3BlYy5UeXBlKSB7XG4gICAgaWYgKHRoaXMuaXNOZXN0ZWQodHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUub3BlbkZpbGUodGhpcy50b0phdmFGaWxlUGF0aCh0aGlzLmFzc2VtYmx5LCB0eXBlKSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgcGFja2FnZSAke3RoaXMudG9OYXRpdmVOYW1lKHRoaXMuYXNzZW1ibHksIHR5cGUpLnBhY2thZ2VOYW1lfTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VGaWxlSWZOZWVkZWQodHlwZTogc3BlYy5UeXBlKSB7XG4gICAgaWYgKHRoaXMuaXNOZXN0ZWQodHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZSh0aGlzLnRvSmF2YUZpbGVQYXRoKHRoaXMuYXNzZW1ibHksIHR5cGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNOZXN0ZWQodHlwZTogc3BlYy5UeXBlKSB7XG4gICAgaWYgKCF0aGlzLmFzc2VtYmx5LnR5cGVzIHx8ICF0eXBlLm5hbWVzcGFjZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBgJHt0eXBlLmFzc2VtYmx5fS4ke3R5cGUubmFtZXNwYWNlfWA7XG4gICAgcmV0dXJuIHBhcmVudCBpbiB0aGlzLmFzc2VtYmx5LnR5cGVzO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFGaWxlUGF0aChhc3NtOiBzcGVjLkFzc2VtYmx5LCBmcW46IHN0cmluZyk6IHN0cmluZztcbiAgcHJpdmF0ZSB0b0phdmFGaWxlUGF0aChhc3NtOiBzcGVjLkFzc2VtYmx5LCB0eXBlOiBzcGVjLlR5cGUpOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9KYXZhRmlsZVBhdGgoYXNzbTogc3BlYy5Bc3NlbWJseSwgd2hhdDogc3BlYy5UeXBlIHwgc3RyaW5nKSB7XG4gICAgY29uc3QgZnFuID0gdHlwZW9mIHdoYXQgPT09ICdzdHJpbmcnID8gd2hhdCA6IHdoYXQuZnFuO1xuICAgIGNvbnN0IHsgcGFja2FnZU5hbWUsIHR5cGVOYW1lcyB9ID0gdHJhbnNsYXRlRnFuKGFzc20sIGZxbik7XG5cbiAgICBpZiAodHlwZU5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdG9KYXZhRmlsZVBhdGg6ICR7ZnFufSBtdXN0IGluZGljYXRlIGEgdHlwZSwgYnV0IGRvZXNuJ3Q6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgeyBwYWNrYWdlTmFtZSwgdHlwZU5hbWVzIH0sXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3BhdGguam9pbihcbiAgICAgICdzcmMnLFxuICAgICAgJ21haW4nLFxuICAgICAgJ2phdmEnLFxuICAgICAgLi4ucGFja2FnZU5hbWUuc3BsaXQoJy4nKSxcbiAgICAgIHR5cGVOYW1lc1swXSxcbiAgICApfS5qYXZhYDtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhUmVzb3VyY2VQYXRoKGFzc206IHNwZWMuQXNzZW1ibHksIGZxbjogc3RyaW5nLCBleHQgPSAnLnR4dCcpIHtcbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lLCB0eXBlTmFtZSB9ID0gdGhpcy50b05hdGl2ZU5hbWUoYXNzbSwge1xuICAgICAgZnFuLFxuICAgICAga2luZDogc3BlYy5UeXBlS2luZC5DbGFzcyxcbiAgICAgIGFzc2VtYmx5OiBhc3NtLm5hbWUsXG4gICAgICBuYW1lOiBmcW4ucmVwbGFjZSgvLipcXC4oW14uXSspJC8sICckMScpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAuLi5wYWNrYWdlTmFtZS5zcGxpdCgnLicpLFxuICAgICAgYCR7dHlwZU5hbWUuc3BsaXQoJy4nKVswXX0ke2V4dH1gLFxuICAgIF07XG4gICAgLy8gUmVzb3VyY2UgbmFtZXMgYXJlIC8tZGVsaW1pdGVkIHBhdGhzIChldmVuIG9uIFdpbmRvd3MgKndpbmsgd2luayopXG4gICAgY29uc3QgbmFtZSA9IHBhcnRzLmpvaW4oJy8nKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbignc3JjJywgJ21haW4nLCAncmVzb3VyY2VzJywgLi4ucGFydHMpO1xuXG4gICAgcmV0dXJuIHsgZmlsZVBhdGgsIG5hbWUgfTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHByaXZhdGUgYWRkSmF2YURvY3MoXG4gICAgZG9jOiBzcGVjLkRvY3VtZW50YWJsZSxcbiAgICBhcGlMb2M6IEFwaUxvY2F0aW9uLFxuICAgIGRlZmF1bHRUZXh0Pzogc3RyaW5nLFxuICApIHtcbiAgICBpZiAoXG4gICAgICAhZGVmYXVsdFRleHQgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRvYy5kb2NzID8/IHt9KS5sZW5ndGggPT09IDAgJiZcbiAgICAgICEoKGRvYyBhcyBzcGVjLk1ldGhvZCkucGFyYW1ldGVycyA/PyBbXSkuc29tZShcbiAgICAgICAgKHApID0+IE9iamVjdC5rZXlzKHAuZG9jcyA/PyB7fSkubGVuZ3RoICE9PSAwLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY3MgPSAoZG9jLmRvY3MgPSBkb2MuZG9jcyA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJhcyA9IFtdO1xuXG4gICAgaWYgKGRvY3Muc3VtbWFyeSkge1xuICAgICAgcGFyYXMucHVzaChyZW5kZXJTdW1tYXJ5KGRvY3MpKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRUZXh0KSB7XG4gICAgICBwYXJhcy5wdXNoKGRlZmF1bHRUZXh0KTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5yZW1hcmtzKSB7XG4gICAgICBwYXJhcy5wdXNoKFxuICAgICAgICBtYXJrRG93blRvSmF2YURvYyhcbiAgICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihkb2NzLnJlbWFya3MsIGFwaUxvYyksXG4gICAgICAgICkudHJpbVJpZ2h0KCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICAgIHBhcmFzLnB1c2goYERlZmF1bHQ6ICR7ZG9jcy5kZWZhdWx0fWApOyAvLyBOT1RFOiB0aGVyZSBpcyBubyBhbm5vdGF0aW9uIGluIEphdmFEb2MgZm9yIHRoaXNcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5leGFtcGxlKSB7XG4gICAgICBwYXJhcy5wdXNoKCdFeGFtcGxlOicpO1xuXG4gICAgICBjb25zdCBjb252ZXJ0ZWRFeGFtcGxlID0gdGhpcy5jb252ZXJ0RXhhbXBsZShkb2NzLmV4YW1wbGUsIGFwaUxvYyk7XG5cbiAgICAgIC8vIFdlIHVzZWQgdG8gdXNlIHRoZSBzbGlnaHRseSBuaWNlciBgPHByZT57QGNvZGUgLi4ufTwvcHJlPmAsIHdoaWNoIGRvZXNuJ3RcbiAgICAgIC8vIHJlcXVpcmUgKGFuZCB0aGVyZWZvcmUgYWxzbyBkb2Vzbid0IGFsbG93KSBlc2NhcGluZyBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgICAvL1xuICAgICAgLy8gSG93ZXZlciwgY29kZSBzYW1wbGVzIG1heSBjb250YWluIGJsb2NrIHF1b3RlcyBvZiB0aGVpciBvd24gKCcqLycpIHRoYXRcbiAgICAgIC8vIHdvdWxkIHRlcm1pbmF0ZSB0aGUgYmxvY2sgY29tbWVudCBmcm9tIHRoZSBQb1Ygb2YgdGhlIEphdmEgdG9rZW5pemVyLCBhbmRcbiAgICAgIC8vIHNpbmNlIGB7QGNvZGUgLi4uIH1gIGRvZXNuJ3QgYWxsb3cgYW55IGVzY2FwaW5nLCB0aGVyZSdzIGFsc28gbm8gd2F5IHRvIGVuY29kZVxuICAgICAgLy8gJyovJyBpbiBhIHdheSB0aGF0IHdvdWxkIChhKSBoaWRlIGl0IGZyb20gdGhlIHRva2VuaXplciBhbmQgKGIpIGdpdmUgJyovJyBiYWNrXG4gICAgICAvLyBhZnRlciBwcm9jZXNzaW5nIEphdmFEb2NzLlxuICAgICAgLy9cbiAgICAgIC8vIEhlbmNlLCB3ZSBqdXN0IHJlc29ydCB0byBIVE1MLWVuY29kaW5nIGV2ZXJ5dGhpbmcgKHNhbWUgYXMgd2UgZG8gZm9yIGNvZGVcbiAgICAgIC8vIGV4YW1wbGVzIHRoYXQgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgZnJvbSBNYXJrRG93bikuXG4gICAgICBwYXJhcy5wdXNoKFxuICAgICAgICBtYXJrRG93blRvSmF2YURvYyhbJ2BgYCcsIGNvbnZlcnRlZEV4YW1wbGUsICdgYGAnXS5qb2luKCdcXG4nKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRhZ0xpbmVzID0gW107XG5cbiAgICBpZiAoZG9jcy5yZXR1cm5zKSB7XG4gICAgICB0YWdMaW5lcy5wdXNoKGBAcmV0dXJuICR7ZG9jcy5yZXR1cm5zfWApO1xuICAgIH1cbiAgICBpZiAoZG9jcy5zZWUpIHtcbiAgICAgIHRhZ0xpbmVzLnB1c2goYEBzZWUgJHtkb2NzLnNlZX1gKTtcbiAgICB9XG4gICAgaWYgKGRvY3MuZGVwcmVjYXRlZCkge1xuICAgICAgdGFnTGluZXMucHVzaChgQGRlcHJlY2F0ZWQgJHtkb2NzLmRlcHJlY2F0ZWR9YCk7XG4gICAgfVxuXG4gICAgLy8gUGFyYW1zXG4gICAgaWYgKChkb2MgYXMgc3BlYy5NZXRob2QpLnBhcmFtZXRlcnMpIHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGRvYyBhcyBzcGVjLk1ldGhvZDtcbiAgICAgIGlmIChtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIG1ldGhvZC5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHBhcmFtLmRvY3M/LnN1bW1hcnk7XG4gICAgICAgICAgdGFnTGluZXMucHVzaChwYXJhbUphdmFkb2MocGFyYW0ubmFtZSwgcGFyYW0ub3B0aW9uYWwsIHN1bW1hcnkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YWdMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhcy5wdXNoKHRhZ0xpbmVzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXJhIG9mIHBhcmFzKSB7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsaW5lcy5wdXNoKCc8cD4nKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goLi4ucGFyYS5zcGxpdCgnXFxuJykuZmlsdGVyKChsKSA9PiBsICE9PSAnJykpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAgKiAke2xpbmV9YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2xhc3NCYXNlKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICBpZiAoIWNscy5iYXNlKSB7XG4gICAgICByZXR1cm4gJ3NvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvSmF2YVR5cGUoeyBmcW46IGNscy5iYXNlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0RlY29yYXRlZEphdmFUeXBlKFxuICAgIG9wdGlvbmFsVmFsdWU6IHNwZWMuT3B0aW9uYWxWYWx1ZSxcbiAgICB7IGNvdmFyaWFudCA9IGZhbHNlIH0gPSB7fSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGVzKG9wdGlvbmFsVmFsdWUsIHsgY292YXJpYW50IH0pO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIGAke1xuICAgICAgICBvcHRpb25hbFZhbHVlLm9wdGlvbmFsID8gQU5OX05VTExBQkxFIDogQU5OX05PVF9OVUxMXG4gICAgICB9IGphdmEubGFuZy5PYmplY3RgO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0WzBdO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0RlY29yYXRlZEphdmFUeXBlcyhcbiAgICBvcHRpb25hbFZhbHVlOiBzcGVjLk9wdGlvbmFsVmFsdWUsXG4gICAgeyBjb3ZhcmlhbnQgPSBmYWxzZSB9ID0ge30sXG4gICk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy50b0phdmFUeXBlcyhvcHRpb25hbFZhbHVlLnR5cGUsIHsgY292YXJpYW50IH0pLm1hcChcbiAgICAgIChuYWtlZFR5cGUpID0+XG4gICAgICAgIGAke29wdGlvbmFsVmFsdWUub3B0aW9uYWwgPyBBTk5fTlVMTEFCTEUgOiBBTk5fTk9UX05VTEx9ICR7bmFrZWRUeXBlfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhVHlwZShcbiAgICB0eXBlOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgb3B0cz86IHsgZm9yTWFyc2hhbGxpbmc/OiBib29sZWFuOyBjb3ZhcmlhbnQ/OiBib29sZWFuIH0sXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZXMgPSB0aGlzLnRvSmF2YVR5cGVzKHR5cGUsIG9wdHMpO1xuICAgIGlmICh0eXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gJ2phdmEubGFuZy5PYmplY3QnO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZXNbMF07XG4gIH1cblxuICBwcml2YXRlIHRvTmF0aXZlVHlwZShcbiAgICB0eXBlOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgeyBmb3JNYXJzaGFsbGluZyA9IGZhbHNlLCBjb3ZhcmlhbnQgPSBmYWxzZSB9ID0ge30sXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHNwZWMuaXNDb2xsZWN0aW9uVHlwZVJlZmVyZW5jZSh0eXBlKSkge1xuICAgICAgY29uc3QgbmF0aXZlRWxlbWVudFR5cGUgPSB0aGlzLnRvTmF0aXZlVHlwZSh0eXBlLmNvbGxlY3Rpb24uZWxlbWVudHR5cGUsIHtcbiAgICAgICAgZm9yTWFyc2hhbGxpbmcsXG4gICAgICAgIGNvdmFyaWFudCxcbiAgICAgIH0pO1xuICAgICAgc3dpdGNoICh0eXBlLmNvbGxlY3Rpb24ua2luZCkge1xuICAgICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuQXJyYXk6XG4gICAgICAgICAgcmV0dXJuIGBzb2Z0d2FyZS5hbWF6b24uanNpaS5OYXRpdmVUeXBlLmxpc3RPZigke25hdGl2ZUVsZW1lbnRUeXBlfSlgO1xuICAgICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwOlxuICAgICAgICAgIHJldHVybiBgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5tYXBPZigke25hdGl2ZUVsZW1lbnRUeXBlfSlgO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBjb2xsZWN0aW9uIGtpbmQ6ICR7dHlwZS5jb2xsZWN0aW9uLmtpbmQgYXMgYW55fWAsXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGBzb2Z0d2FyZS5hbWF6b24uanNpaS5OYXRpdmVUeXBlLmZvckNsYXNzKCR7dGhpcy50b0phdmFUeXBlKHR5cGUsIHtcbiAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgY292YXJpYW50LFxuICAgIH0pfS5jbGFzcylgO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFUeXBlcyhcbiAgICB0eXBlcmVmOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgeyBmb3JNYXJzaGFsbGluZyA9IGZhbHNlLCBjb3ZhcmlhbnQgPSBmYWxzZSB9ID0ge30sXG4gICk6IHN0cmluZ1tdIHtcbiAgICBpZiAoc3BlYy5pc1ByaW1pdGl2ZVR5cGVSZWZlcmVuY2UodHlwZXJlZikpIHtcbiAgICAgIHJldHVybiBbdGhpcy50b0phdmFQcmltaXRpdmUodHlwZXJlZi5wcmltaXRpdmUpXTtcbiAgICB9IGVsc2UgaWYgKHNwZWMuaXNDb2xsZWN0aW9uVHlwZVJlZmVyZW5jZSh0eXBlcmVmKSkge1xuICAgICAgcmV0dXJuIFt0aGlzLnRvSmF2YUNvbGxlY3Rpb24odHlwZXJlZiwgeyBmb3JNYXJzaGFsbGluZywgY292YXJpYW50IH0pXTtcbiAgICB9IGVsc2UgaWYgKHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UodHlwZXJlZikpIHtcbiAgICAgIHJldHVybiBbdGhpcy50b05hdGl2ZUZxbih0eXBlcmVmLmZxbildO1xuICAgIH0gZWxzZSBpZiAodHlwZXJlZi51bmlvbikge1xuICAgICAgY29uc3QgdHlwZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBzdWJ0eXBlIG9mIHR5cGVyZWYudW5pb24udHlwZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMudG9KYXZhVHlwZXMoc3VidHlwZSwge1xuICAgICAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgICAgIGNvdmFyaWFudCxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICB0eXBlcy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eXBlIHJlZmVyZW5jZTogJHtKU09OLnN0cmluZ2lmeSh0eXBlcmVmKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhQ29sbGVjdGlvbihcbiAgICByZWY6IHNwZWMuQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UsXG4gICAge1xuICAgICAgZm9yTWFyc2hhbGxpbmcsXG4gICAgICBjb3ZhcmlhbnQsXG4gICAgfTogeyBmb3JNYXJzaGFsbGluZzogYm9vbGVhbjsgY292YXJpYW50OiBib29sZWFuIH0sXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnRKYXZhVHlwZSA9IHRoaXMudG9KYXZhVHlwZShyZWYuY29sbGVjdGlvbi5lbGVtZW50dHlwZSwge1xuICAgICAgY292YXJpYW50LFxuICAgIH0pO1xuICAgIGNvbnN0IHR5cGVDb25zdHJhaW50ID0gY292YXJpYW50XG4gICAgICA/IG1ha2VDb3ZhcmlhbnQoZWxlbWVudEphdmFUeXBlKVxuICAgICAgOiBlbGVtZW50SmF2YVR5cGU7XG4gICAgc3dpdGNoIChyZWYuY29sbGVjdGlvbi5raW5kKSB7XG4gICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuQXJyYXk6XG4gICAgICAgIHJldHVybiBmb3JNYXJzaGFsbGluZ1xuICAgICAgICAgID8gJ2phdmEudXRpbC5MaXN0J1xuICAgICAgICAgIDogYGphdmEudXRpbC5MaXN0PCR7dHlwZUNvbnN0cmFpbnR9PmA7XG4gICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwOlxuICAgICAgICByZXR1cm4gZm9yTWFyc2hhbGxpbmdcbiAgICAgICAgICA/ICdqYXZhLnV0aWwuTWFwJ1xuICAgICAgICAgIDogYGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgJHt0eXBlQ29uc3RyYWludH0+YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29sbGVjdGlvbiBraW5kOiAke3JlZi5jb2xsZWN0aW9uLmtpbmQgYXMgYW55fWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUNvdmFyaWFudChqYXZhVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIC8vIERvbid0IGVtaXQgYSBjb3ZhcmlhbnQgZXhwcmVzc2lvbiBmb3IgU3RyaW5nIChpdCdzIGBmaW5hbGAgaW4gSmF2YSlcbiAgICAgIGlmIChqYXZhVHlwZSA9PT0gJ2phdmEubGFuZy5TdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBqYXZhVHlwZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPyBleHRlbmRzICR7amF2YVR5cGV9YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YVByaW1pdGl2ZShwcmltaXRpdmU6IHNwZWMuUHJpbWl0aXZlVHlwZSkge1xuICAgIHN3aXRjaCAocHJpbWl0aXZlKSB7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5Cb29sZWFuOlxuICAgICAgICByZXR1cm4gJ2phdmEubGFuZy5Cb29sZWFuJztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkRhdGU6XG4gICAgICAgIHJldHVybiAnamF2YS50aW1lLkluc3RhbnQnO1xuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuSnNvbjpcbiAgICAgICAgcmV0dXJuICdjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5PYmplY3ROb2RlJztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLk51bWJlcjpcbiAgICAgICAgcmV0dXJuICdqYXZhLmxhbmcuTnVtYmVyJztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuICdqYXZhLmxhbmcuU3RyaW5nJztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkFueTpcbiAgICAgICAgcmV0dXJuICdqYXZhLmxhbmcuT2JqZWN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcmltaXRpdmUgdHlwZTogJHtwcmltaXRpdmUgYXMgYW55fWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWV0aG9kQ2FsbEFyZ3VtZW50cyhtZXRob2Q6IHNwZWMuQ2FsbGFibGUpIHtcbiAgICBpZiAoIW1ldGhvZC5wYXJhbWV0ZXJzIHx8IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCByZWd1bGFyUGFyYW1zID0gbWV0aG9kLnBhcmFtZXRlcnMuZmlsdGVyKChwKSA9PiAhcC52YXJpYWRpYyk7XG4gICAgY29uc3QgdmFsdWVzID0gcmVndWxhclBhcmFtcy5tYXAoX3JlbmRlclBhcmFtZXRlcik7XG4gICAgY29uc3QgdmFsdWVTdHIgPSBgbmV3IE9iamVjdFtdIHsgJHt2YWx1ZXMuam9pbignLCAnKX0gfWA7XG4gICAgaWYgKG1ldGhvZC52YXJpYWRpYykge1xuICAgICAgY29uc3QgdmFsdWVzU3RyZWFtID0gYGphdmEudXRpbC5BcnJheXMuPE9iamVjdD5zdHJlYW0oJHt2YWx1ZVN0cn0pYDtcblxuICAgICAgY29uc3QgbGFzdFBhcmFtID0gbWV0aG9kLnBhcmFtZXRlcnNbbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCByZXN0U3RyZWFtID0gYGphdmEudXRpbC5BcnJheXMuPE9iamVjdD5zdHJlYW0oJHtsYXN0UGFyYW0ubmFtZX0pYDtcblxuICAgICAgY29uc3QgZnVsbFN0cmVhbSA9XG4gICAgICAgIHJlZ3VsYXJQYXJhbXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbmNhdCgke3ZhbHVlc1N0cmVhbX0sICR7cmVzdFN0cmVhbX0pYFxuICAgICAgICAgIDogcmVzdFN0cmVhbTtcbiAgICAgIHJldHVybiBgLCAke2Z1bGxTdHJlYW19LnRvQXJyYXkoT2JqZWN0W106Om5ldylgO1xuICAgIH1cbiAgICByZXR1cm4gYCwgJHt2YWx1ZVN0cn1gO1xuXG4gICAgZnVuY3Rpb24gX3JlbmRlclBhcmFtZXRlcihwYXJhbTogc3BlYy5QYXJhbWV0ZXIpIHtcbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gSmF2YUdlbmVyYXRvci5zYWZlSmF2YVByb3BlcnR5TmFtZShwYXJhbS5uYW1lKTtcbiAgICAgIHJldHVybiBpc051bGxhYmxlKHBhcmFtKVxuICAgICAgICA/IHNhZmVOYW1lXG4gICAgICAgIDogYGphdmEudXRpbC5PYmplY3RzLnJlcXVpcmVOb25OdWxsKCR7c2FmZU5hbWV9LCBcIiR7c2FmZU5hbWV9IGlzIHJlcXVpcmVkXCIpYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck1ldGhvZENhbGwoXG4gICAgY2xzOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgbWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgICBhc3luYzogYm9vbGVhbixcbiAgKSB7XG4gICAgbGV0IHN0YXRlbWVudCA9ICcnO1xuXG4gICAgaWYgKG1ldGhvZC5zdGF0aWMpIHtcbiAgICAgIGNvbnN0IGphdmFDbGFzcyA9IHRoaXMudG9KYXZhVHlwZShjbHMpO1xuICAgICAgc3RhdGVtZW50ICs9IGBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LmpzaWlTdGF0aWNDYWxsKCR7amF2YUNsYXNzfS5jbGFzcywgYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVtZW50ICs9IGBzb2Z0d2FyZS5hbWF6b24uanNpaS5LZXJuZWwuJHtcbiAgICAgICAgYXN5bmMgPyAnYXN5bmNDYWxsJyA6ICdjYWxsJ1xuICAgICAgfSh0aGlzLCBgO1xuICAgIH1cblxuICAgIHN0YXRlbWVudCArPSBgXCIke21ldGhvZC5uYW1lfVwiYDtcblxuICAgIGlmIChtZXRob2QucmV0dXJucykge1xuICAgICAgc3RhdGVtZW50ICs9IGAsICR7dGhpcy50b05hdGl2ZVR5cGUobWV0aG9kLnJldHVybnMudHlwZSwge1xuICAgICAgICBmb3JNYXJzaGFsbGluZzogdHJ1ZSxcbiAgICAgIH0pfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlbWVudCArPSAnLCBzb2Z0d2FyZS5hbWF6b24uanNpaS5OYXRpdmVUeXBlLlZPSUQnO1xuICAgIH1cbiAgICBzdGF0ZW1lbnQgKz0gYCR7dGhpcy5yZW5kZXJNZXRob2RDYWxsQXJndW1lbnRzKG1ldGhvZCl9KWA7XG5cbiAgICBpZiAobWV0aG9kLnJldHVybnMpIHtcbiAgICAgIHN0YXRlbWVudCA9IHRoaXMud3JhcENvbGxlY3Rpb24oXG4gICAgICAgIHN0YXRlbWVudCxcbiAgICAgICAgbWV0aG9kLnJldHVybnMudHlwZSxcbiAgICAgICAgbWV0aG9kLnJldHVybnMub3B0aW9uYWwsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QucmV0dXJucykge1xuICAgICAgcmV0dXJuIGByZXR1cm4gJHtzdGF0ZW1lbnR9O2A7XG4gICAgfVxuICAgIHJldHVybiBgJHtzdGF0ZW1lbnR9O2A7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHMgYSBjb2xsZWN0aW9uIGludG8gYW4gdW5tb2RpZmlhYmxlIGNvbGxlY3Rpb24gZWxzZSByZXR1cm5zIHRoZSBleGlzdGluZyBzdGF0ZW1lbnQuXG4gICAqIEBwYXJhbSBzdGF0ZW1lbnQgVGhlIHN0YXRlbWVudCB0byB3cmFwIGlmIG5lY2Vzc2FyeS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byB3cmFwLlxuICAgKiBAcGFyYW0gb3B0aW9uYWwgV2hldGhlciB0aGUgdmFsdWUgaXMgb3B0aW9uYWwgKGNhbiBiZSBudWxsL3VuZGVmaW5lZCkgb3Igbm90LlxuICAgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgb3Igb3JpZ2luYWwgc3RhdGVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSB3cmFwQ29sbGVjdGlvbihcbiAgICBzdGF0ZW1lbnQ6IHN0cmluZyxcbiAgICB0eXBlOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4gICAgb3B0aW9uYWw/OiBib29sZWFuLFxuICApOiBzdHJpbmcge1xuICAgIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZSkpIHtcbiAgICAgIGxldCB3cmFwcGVyOiBzdHJpbmc7XG4gICAgICBzd2l0Y2ggKHR5cGUuY29sbGVjdGlvbi5raW5kKSB7XG4gICAgICAgIGNhc2Ugc3BlYy5Db2xsZWN0aW9uS2luZC5BcnJheTpcbiAgICAgICAgICB3cmFwcGVyID0gJ3VubW9kaWZpYWJsZUxpc3QnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwOlxuICAgICAgICAgIHdyYXBwZXIgPSAndW5tb2RpZmlhYmxlTWFwJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29sbGVjdGlvbiBraW5kOiAke3R5cGUuY29sbGVjdGlvbi5raW5kIGFzIGFueX1gLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBcIm9wdGlvbmFsXCIsIHRoZSB2YWx1ZSBuZWVkcyBvdCBiZSBleHBsaWNpdGx5IGNhc3QgdG8gYWxsb3cgZm9yIGNhc2VzIHdoZXJlIHRoZSByYXcgdHlwZSB3YXMgcmV0dXJuZWQuXG4gICAgICByZXR1cm4gb3B0aW9uYWxcbiAgICAgICAgPyBgamF2YS51dGlsLk9wdGlvbmFsLm9mTnVsbGFibGUoKCR7dGhpcy50b0phdmFUeXBlKFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICApfSkoJHtzdGF0ZW1lbnR9KSkubWFwKGphdmEudXRpbC5Db2xsZWN0aW9uczo6JHt3cmFwcGVyfSkub3JFbHNlKG51bGwpYFxuICAgICAgICA6IGBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuJHt3cmFwcGVyfSgke3N0YXRlbWVudH0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJNZXRob2RQYXJhbWV0ZXJzKG1ldGhvZDogc3BlYy5DYWxsYWJsZSkge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIGlmIChtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgZm9yIChjb25zdCBwIG9mIG1ldGhvZC5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIC8vIFdlIGNhbiByZW5kZXIgY292YXJpYW50IHBhcmFtZXRlcnMgb25seSBmb3IgbWV0aG9kcyB0aGF0IGFyZW4ndCBvdmVycmlkYWJsZS4uLiBzbyBvbmx5IGZvciBzdGF0aWMgbWV0aG9kcyBjdXJyZW50bHkuXG4gICAgICAgIHBhcmFtcy5wdXNoKFxuICAgICAgICAgIGBmaW5hbCAke3RoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShwLCB7XG4gICAgICAgICAgICBjb3ZhcmlhbnQ6IChtZXRob2QgYXMgc3BlYy5NZXRob2QpLnN0YXRpYyxcbiAgICAgICAgICB9KX0ke3AudmFyaWFkaWMgPyAnLi4uJyA6ICcnfSAke0phdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUoXG4gICAgICAgICAgICBwLm5hbWUsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckFjY2Vzc0xldmVsKG1ldGhvZDogc3BlYy5DYWxsYWJsZSB8IHNwZWMuUHJvcGVydHkpIHtcbiAgICByZXR1cm4gbWV0aG9kLnByb3RlY3RlZCA/ICdwcm90ZWN0ZWQnIDogJ3B1YmxpYyc7XG4gIH1cblxuICBwcml2YXRlIG1ha2VNb2R1bGVDbGFzcyhtb2R1bGVOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYCR7dGhpcy50b05hdGl2ZUZxbihtb2R1bGVOYW1lKX0uJHtNT0RVTEVfQ0xBU1NfTkFNRX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TW9kdWxlRmlsZShtb2Q6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gbW9kLm5hbWU7XG4gICAgY29uc3QgbW9kdWxlQ2xhc3MgPSB0aGlzLm1ha2VNb2R1bGVDbGFzcyhtb2R1bGVOYW1lKTtcblxuICAgIGNvbnN0IHsgZmlsZVBhdGg6IG1vZHVsZVJlc0ZpbGUsIG5hbWU6IG1vZHVsZVJlc05hbWUgfSA9XG4gICAgICB0aGlzLnRvSmF2YVJlc291cmNlUGF0aChtb2QsIGAke21vZC5uYW1lfS4ke01PRFVMRV9DTEFTU19OQU1FfWApO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShtb2R1bGVSZXNGaWxlKTtcbiAgICBmb3IgKGNvbnN0IGZxbiBvZiBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LnR5cGVzID8/IHt9KSkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7ZnFufT0ke3RoaXMudG9OYXRpdmVGcW4oZnFuLCB7IGJpbmFyeU5hbWU6IHRydWUgfSl9YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUobW9kdWxlUmVzRmlsZSk7XG5cbiAgICBjb25zdCBtb2R1bGVGaWxlID0gdGhpcy50b0phdmFGaWxlUGF0aChtb2QsIHtcbiAgICAgIGFzc2VtYmx5OiBtb2QubmFtZSxcbiAgICAgIGZxbjogYCR7bW9kLm5hbWV9LiR7TU9EVUxFX0NMQVNTX05BTUV9YCxcbiAgICAgIGtpbmQ6IHNwZWMuVHlwZUtpbmQuQ2xhc3MsXG4gICAgICBuYW1lOiBNT0RVTEVfQ0xBU1NfTkFNRSxcbiAgICB9KTtcblxuICAgIHRoaXMuY29kZS5vcGVuRmlsZShtb2R1bGVGaWxlKTtcbiAgICB0aGlzLmNvZGUubGluZShgcGFja2FnZSAke3RoaXMudG9OYXRpdmVOYW1lKG1vZCkucGFja2FnZU5hbWV9O2ApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKG1vZC5kZXBlbmRlbmNpZXMgPz8ge30pLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OycpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5SZWFkZXI7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLmlvLlVuY2hlY2tlZElPRXhjZXB0aW9uOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOycpO1xuICAgIGlmIChPYmplY3Qua2V5cyhtb2QuZGVwZW5kZW5jaWVzID8/IHt9KS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEudXRpbC5MaXN0OycpO1xuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEudXRpbC5NYXA7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlNb2R1bGU7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwdWJsaWMgZmluYWwgY2xhc3MgJHtNT0RVTEVfQ0xBU1NfTkFNRX0gZXh0ZW5kcyBKc2lpTW9kdWxlYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ3ByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gTU9EVUxFX1RZUEVTID0gbG9hZCgpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygncHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBsb2FkKCknKTtcbiAgICB0aGlzLmNvZGUubGluZSgnZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KCk7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgZmluYWwgQ2xhc3NMb2FkZXIgY2wgPSAke01PRFVMRV9DTEFTU19OQU1FfS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGB0cnkgKGZpbmFsIElucHV0U3RyZWFtIGlzID0gY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbShcIiR7bW9kdWxlUmVzTmFtZX1cIik7YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJyAgICAgZmluYWwgUmVhZGVyIHJkID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICcgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJkKSknLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2JyLmxpbmVzKCknKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICAuZmlsdGVyKGxpbmUgLT4gIWxpbmUudHJpbSgpLmlzRW1wdHkoKSknKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCcgIC5mb3JFYWNoKGxpbmUgLT4gJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIFN0cmluZ1tdIHBhcnRzID0gbGluZS5zcGxpdChcIj1cIiwgMik7Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIFN0cmluZyBmcW4gPSBwYXJ0c1swXTsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IHBhcnRzWzFdOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdyZXN1bHQucHV0KGZxbiwgY2xhc3NOYW1lKTsnKTtcbiAgICB0aGlzLmNvZGUudW5pbmRlbnQoJ30pOycpOyAvLyBQcm94eSBmb3IgY2xvc2VCbG9ja1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiknKTtcbiAgICB0aGlzLmNvZGUubGluZSgndGhyb3cgbmV3IFVuY2hlY2tlZElPRXhjZXB0aW9uKGV4Y2VwdGlvbik7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHJlc3VsdDsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICdwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBjYWNoZSA9IG5ldyBIYXNoTWFwPD4oKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIC8vIGN0b3JcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBwdWJsaWMgJHtNT0RVTEVfQ0xBU1NfTkFNRX0oKWApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHN1cGVyKFwiJHttb2R1bGVOYW1lfVwiLCBcIiR7XG4gICAgICAgIG1vZC52ZXJzaW9uXG4gICAgICB9XCIsICR7TU9EVUxFX0NMQVNTX05BTUV9LmNsYXNzLCBcIiR7dGhpcy5nZXRBc3NlbWJseUZpbGVOYW1lKCl9XCIpO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpOyAvLyBjdG9yXG5cbiAgICAvLyBkZXBlbmRlbmNpZXNcbiAgICBpZiAobW9kLmRlcGVuZGVuY2llcyAmJiBPYmplY3Qua2V5cyhtb2QuZGVwZW5kZW5jaWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZXBzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiBPYmplY3Qua2V5cyhtb2QuZGVwZW5kZW5jaWVzKSkge1xuICAgICAgICBkZXBzLnB1c2goYCR7dGhpcy5tYWtlTW9kdWxlQ2xhc3MoZGVwKX0uY2xhc3NgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAgICdwdWJsaWMgTGlzdDxDbGFzczw/IGV4dGVuZHMgSnNpaU1vZHVsZT4+IGdldERlcGVuZGVuY2llcygpJyxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIGFzTGlzdCgke2RlcHMuam9pbignLCAnKX0pO2ApO1xuICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgJ3Byb3RlY3RlZCBDbGFzczw/PiByZXNvbHZlQ2xhc3MoZmluYWwgU3RyaW5nIGZxbikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24nLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnaWYgKCFNT0RVTEVfVFlQRVMuY29udGFpbnNLZXkoZnFuKSknKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICd0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihcIlVua25vd24gSlNJSSB0eXBlOiBcIiArIGZxbik7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ1N0cmluZyBjbGFzc05hbWUgPSBNT0RVTEVfVFlQRVMuZ2V0KGZxbik7Jyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnaWYgKCF0aGlzLmNhY2hlLmNvbnRhaW5zS2V5KGNsYXNzTmFtZSkpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3RoaXMuY2FjaGUucHV0KGNsYXNzTmFtZSwgdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKSk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGNsYXNzTmFtZSk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3ByaXZhdGUgQ2xhc3M8Pz4gZmluZENsYXNzKGZpbmFsIFN0cmluZyBiaW5hcnlOYW1lKScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3RyeScpO1xuICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gQ2xhc3MuZm9yTmFtZShiaW5hcnlOYW1lKTsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2NhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4Y2VwdGlvbiknKTtcbiAgICB0aGlzLmNvZGUubGluZSgndGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgdGhpcy5jb2RlLmNsb3NlRmlsZShtb2R1bGVGaWxlKTtcblxuICAgIHJldHVybiBtb2R1bGVDbGFzcztcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEpzaWlJbml0aWFsaXplcnMoY2xzOiBzcGVjLkNsYXNzVHlwZSkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtjbHMubmFtZX0oZmluYWwgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdFJlZiBvYmpSZWYpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihvYmpSZWYpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7Y2xzLm5hbWV9KGZpbmFsIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuSW5pdGlhbGl6YXRpb25Nb2RlIGluaXRpYWxpemF0aW9uTW9kZSlgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3N1cGVyKGluaXRpYWxpemF0aW9uTW9kZSk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgamF2YSBGUU4gZm9yIGEgSlNJSSBGUU46XG4gICAqIDEuIERldGVybWluZSB3aGljaCBhc3NlbWJseSB0aGUgRlFOIGJlbG9uZ3MgdG8gKGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgRlFOKVxuICAgKiAyLiBMb2NhdGUgdGhlIGB0YXJnZXRzLmphdmEucGFja2FnZWAgdmFsdWUgZm9yIHRoYXQgYXNzZW1ibHkgKHRoaXMgYXNzZW1ibHksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzKVxuICAgKiAzLiBSZXR1cm4gdGhlIGphdmEgRlFOOiBgYDxtb2R1bGUudGFyZ2V0cy5qYXZhLnBhY2thZ2U+LjxGUU4gc3RpcHBlZCBvZiBmaXJzdCBjb21wb25lbnQ+YGBcbiAgICpcbiAgICogUmVjb3JkcyBhbiBhc3NlbWJseSByZWZlcmVuY2UgaWYgdGhlIHJlZmVyZW5jZWQgRlFOIGNvbWVzIGZyb20gYSBkaWZmZXJlbnQgYXNzZW1ibHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcW4gdGhlIEpTSUkgRlFOIHRvIGJlIHVzZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgRlFOLlxuICAgKlxuICAgKiBAdGhyb3dzIGlmIHRoZSBhc3NlbWJseSB0aGUgRlFOIGJlbG9uZ3MgdG8gZG9lcyBub3QgaGF2ZSBhIGB0YXJnZXRzLmphdmEucGFja2FnZWAgc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSB0b05hdGl2ZUZxbihcbiAgICBmcW46IHN0cmluZyxcbiAgICB7IGJpbmFyeU5hbWUgfTogeyBiaW5hcnlOYW1lOiBib29sZWFuIH0gPSB7IGJpbmFyeU5hbWU6IGZhbHNlIH0sXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgW21vZF0gPSBmcW4uc3BsaXQoJy4nKTtcbiAgICBjb25zdCBkZXBNb2QgPSB0aGlzLmZpbmRNb2R1bGUobW9kKTtcbiAgICAvLyBNYWtlIHN1cmUgYW55IGRlcGVuZGVuY3kgKGRpcmVjdCBvciB0cmFuc2l0aXZlKSBvZiB3aGljaCBhbnkgdHlwZSBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQgYnkgdGhlIGdlbmVyYXRlZFxuICAgIC8vIGNvZGUgaXMgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBQT00ncyBkZXBlbmRlbmNpZXMgc2VjdGlvbiAocHJvdGVjdGluZyB0aGUgYXJ0aWZhY3QgZnJvbSBjaGFuZ2VzIGluIHRoZVxuICAgIC8vIGRlcGVuZGVuY2llcycgZGVwZW5kZW5jeSBzdHJ1Y3R1cmUpLlxuICAgIGlmIChtb2QgIT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgdGhpcy5yZWZlcmVuY2VkTW9kdWxlc1ttb2RdID0gZGVwTW9kO1xuXG4gICAgICBjb25zdCB0cmFuc2xhdGVkID0gdHJhbnNsYXRlRnFuKHsgLi4uZGVwTW9kLCBuYW1lOiBtb2QgfSwgZnFuKTtcbiAgICAgIHJldHVybiBbdHJhbnNsYXRlZC5wYWNrYWdlTmFtZSwgLi4udHJhbnNsYXRlZC50eXBlTmFtZXNdLmpvaW4oJy4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lLCB0eXBlTmFtZSB9ID1cbiAgICAgIGZxbiA9PT0gdGhpcy5hc3NlbWJseS5uYW1lXG4gICAgICAgID8gdGhpcy50b05hdGl2ZU5hbWUodGhpcy5hc3NlbWJseSlcbiAgICAgICAgOiB0aGlzLnRvTmF0aXZlTmFtZSh0aGlzLmFzc2VtYmx5LCB0aGlzLmFzc2VtYmx5LnR5cGVzIVtmcW5dKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPVxuICAgICAgdHlwZU5hbWUgJiYgYmluYXJ5TmFtZSA/IHR5cGVOYW1lLnJlcGxhY2UoJy4nLCAnJCcpIDogdHlwZU5hbWU7XG4gICAgcmV0dXJuIGAke3BhY2thZ2VOYW1lfSR7Y2xhc3NOYW1lID8gYC4ke2NsYXNzTmFtZX1gIDogJyd9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBKYXZhIG5hbWUgZm9yIGEganNpaSBhc3NlbWJseSBvciB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gYXNzbSBUaGUgYXNzZW1ibHkgdGhhdCBjb250YWlucyB0aGUgdHlwZVxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB3ZSB3YW50IHRoZSBuYW1lIG9mXG4gICAqL1xuICBwcml2YXRlIHRvTmF0aXZlTmFtZShhc3NtOiBzcGVjLkFzc2VtYmx5KToge1xuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gICAgdHlwZU5hbWU6IHVuZGVmaW5lZDtcbiAgfTtcbiAgcHJpdmF0ZSB0b05hdGl2ZU5hbWUoXG4gICAgYXNzbTogc3BlYy5Bc3NlbWJseSxcbiAgICB0eXBlOiBzcGVjLlR5cGUsXG4gICk6IHsgcGFja2FnZU5hbWU6IHN0cmluZzsgdHlwZU5hbWU6IHN0cmluZyB9O1xuICBwcml2YXRlIHRvTmF0aXZlTmFtZShcbiAgICBhc3NtOiBzcGVjLkFzc2VtYmx5LFxuICAgIHR5cGU/OiBzcGVjLlR5cGUsXG4gICk6IHsgcGFja2FnZU5hbWU6IHN0cmluZzsgdHlwZU5hbWU/OiBzdHJpbmcgfSB7XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICByZXR1cm4geyBwYWNrYWdlTmFtZTogcGFja2FnZU5hbWVGcm9tQXNzZW1ibHkoYXNzbSkgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdHJhbnNsYXRlRnFuKGFzc20sIHR5cGUuZnFuKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGFja2FnZU5hbWU6IHRyYW5zbGF0ZWQucGFja2FnZU5hbWUsXG4gICAgICB0eXBlTmFtZTogdHJhbnNsYXRlZC50eXBlTmFtZXMuam9pbignLicpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYW4gYGBAR2VuZXJhdGVkYGAgYW5ub3RhdGlvbiBob25vcmluZyB0aGUgYGB0aGlzLmVtaXRGdWxsR2VuZXJhdG9ySW5mb2BgIHNldHRpbmcuXG4gICAqL1xuICBwcml2YXRlIGVtaXRHZW5lcmF0ZWRBbm5vdGF0aW9uKCkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmVtaXRGdWxsR2VuZXJhdG9ySW5mb1xuICAgICAgPyBgLCBkYXRlID0gXCIke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1cImBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm9cbiAgICAgID8gYGpzaWktcGFjbWFrLyR7VkVSU0lPTl9ERVNDfWBcbiAgICAgIDogJ2pzaWktcGFjbWFrJztcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQodmFsdWUgPSBcIiR7Z2VuZXJhdG9yfVwiJHtkYXRlfSlgLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRFeGFtcGxlKGV4YW1wbGU6IHN0cmluZywgYXBpOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMucm9zZXR0YS50cmFuc2xhdGVFeGFtcGxlKFxuICAgICAgYXBpLFxuICAgICAgZXhhbXBsZSxcbiAgICAgIFRhcmdldExhbmd1YWdlLkpBVkEsXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U2FtcGxlc0luTWFya2Rvd24obWFya2Rvd246IHN0cmluZywgYXBpOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9zZXR0YS50cmFuc2xhdGVTbmlwcGV0c0luTWFya2Rvd24oXG4gICAgICBhcGksXG4gICAgICBtYXJrZG93bixcbiAgICAgIFRhcmdldExhbmd1YWdlLkpBVkEsXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgICAodHJhbnMpID0+ICh7XG4gICAgICAgIGxhbmd1YWdlOiB0cmFucy5sYW5ndWFnZSxcbiAgICAgICAgc291cmNlOiB0aGlzLnByZWZpeERpc2NsYWltZXIodHJhbnMpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlZml4RGlzY2xhaW1lcih0cmFuc2xhdGVkOiBUcmFuc2xhdGlvbikge1xuICAgIGlmICghdHJhbnNsYXRlZC5kaWRDb21waWxlICYmIElOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkcpIHtcbiAgICAgIHJldHVybiBgLy8gJHtJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HfVxcbiR7dHJhbnNsYXRlZC5zb3VyY2V9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbnMgdGhlIEphdmEgRlFOIG9mIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGludGVyZmFjZXMgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgd2hlbiBhIG5ld1xuICAgKiBkZWZhdWx0IGludGVyZmFjZSBvciBwcm94eSBjbGFzcyBpcyBiZWluZyBlbWl0dGVkLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBmb3Igd2hpY2ggYSBkZWZhdWx0IGludGVyZmFjZSBvciBwcm94eSBpcyBlbWl0dGVkLlxuICAgKiBAcGFyYW0gaW5jbHVkZVRoaXNUeXBlIHdoZXRoZXIgdGhpcyBjbGFzcydzIGRlZmF1bHQgaW50ZXJmYWNlIHNob3VsZCBiZSBpbmNsdWRlZCBvciBub3QuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgbGlzdCBvZiBKYXZhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcy5cbiAgICovXG4gIHByaXZhdGUgZGVmYXVsdEludGVyZmFjZXNGb3IoXG4gICAgdHlwZTogcmVmbGVjdC5DbGFzc1R5cGUgfCByZWZsZWN0LkludGVyZmFjZVR5cGUsXG4gICAgeyBpbmNsdWRlVGhpc1R5cGUgPSBmYWxzZSB9OiB7IGluY2x1ZGVUaGlzVHlwZT86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBpZiAoXG4gICAgICBpbmNsdWRlVGhpc1R5cGUgJiZcbiAgICAgIGhhc0RlZmF1bHRJbnRlcmZhY2VzKHR5cGUuYXNzZW1ibHkpICYmXG4gICAgICB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpXG4gICAgKSB7XG4gICAgICByZXN1bHQuYWRkKFxuICAgICAgICBgJHt0aGlzLnRvTmF0aXZlRnFuKHR5cGUuZnFuKX0uJHtJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGlmYWNlIG9mIHR5cGUuaW50ZXJmYWNlcykge1xuICAgICAgICBpZiAoaGFzRGVmYXVsdEludGVyZmFjZXMoaWZhY2UuYXNzZW1ibHkpKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChcbiAgICAgICAgICAgIGAke3RoaXMudG9OYXRpdmVGcW4oaWZhY2UuZnFuKX0uJHtJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kZWZhdWx0SW50ZXJmYWNlc0ZvcihpZmFjZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hZGQoaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZS5pc0NsYXNzVHlwZSgpICYmIHR5cGUuYmFzZSAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRlZmF1bHRJbnRlcmZhY2VzRm9yKHR5cGUuYmFzZSkpIHtcbiAgICAgICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20ocmVzdWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgbW9kZWxzIHRoZSBQT00gc2NoZW1hIGZvciBhIDxkZXBlbmRlbmN5PiBlbnRpdHlcbiAqIEBzZWUgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL3BvbS5odG1sI0RlcGVuZGVuY2llc1xuICovXG5pbnRlcmZhY2UgTWF2ZW5EZXBlbmRlbmN5IHtcbiAgZ3JvdXBJZDogc3RyaW5nO1xuICBhcnRpZmFjdElkOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcblxuICB0eXBlPzogc3RyaW5nO1xuICBzY29wZT86ICdjb21waWxlJyB8ICdwcm92aWRlZCcgfCAncnVudGltZScgfCAndGVzdCcgfCAnc3lzdGVtJztcbiAgc3lzdGVtUGF0aD86IHN0cmluZztcbiAgb3B0aW9uYWw/OiBib29sZWFuO1xuXG4gICcjY29tbWVudCc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTG9va3MgdXAgdGhlIGBAanNpaS9qYXZhLXJ1bnRpbWVgIHBhY2thZ2UgZnJvbSB0aGUgbG9jYWwgcmVwb3NpdG9yeS5cbiAqIElmIGl0IGNvbnRhaW5zIGEgXCJtYXZlbi1yZXBvXCIgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIGFkZGVkIGFzIGEgbG9jYWwgbWF2ZW4gcmVwb1xuICogc28gd2hlbiB3ZSBidWlsZCBsb2NhbGx5LCB3ZSBidWlsZCBhZ2FpbnN0IGl0IGFuZCBub3QgYWdhaW5zdCB0aGUgb25lIHB1Ymxpc2hlZFxuICogdG8gTWF2ZW4gQ2VudHJhbC5cbiAqL1xuZnVuY3Rpb24gZmluZEphdmFSdW50aW1lTG9jYWxSZXBvc2l0b3J5KCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzLEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMsaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgamF2YVJ1bnRpbWUgPSByZXF1aXJlKCdAanNpaS9qYXZhLXJ1bnRpbWUnKTtcbiAgICBsb2dnaW5nLmluZm8oXG4gICAgICBgVXNpbmcgbG9jYWwgdmVyc2lvbiBvZiB0aGUgSmF2YSBqc2lpIHJ1bnRpbWUgcGFja2FnZSBhdDogJHtqYXZhUnVudGltZS5yZXBvc2l0b3J5fWAsXG4gICAgKTtcbiAgICByZXR1cm4gamF2YVJ1bnRpbWUucmVwb3NpdG9yeTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc051bGxhYmxlKG9wdGlvbmFsVmFsdWU6IHNwZWMuT3B0aW9uYWxWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW9wdGlvbmFsVmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBvcHRpb25hbFZhbHVlLm9wdGlvbmFsIHx8XG4gICAgKHNwZWMuaXNQcmltaXRpdmVUeXBlUmVmZXJlbmNlKG9wdGlvbmFsVmFsdWUudHlwZSkgJiZcbiAgICAgIG9wdGlvbmFsVmFsdWUudHlwZS5wcmltaXRpdmUgPT09IHNwZWMuUHJpbWl0aXZlVHlwZS5BbnkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcmFtSmF2YWRvYyhcbiAgbmFtZTogc3RyaW5nLFxuICBvcHRpb25hbD86IGJvb2xlYW4sXG4gIHN1bW1hcnk/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IFsnQHBhcmFtJywgbmFtZV07XG4gIGlmIChzdW1tYXJ5KSB7XG4gICAgcGFydHMucHVzaChlbmRXaXRoUGVyaW9kKHN1bW1hcnkpKTtcbiAgfVxuICBpZiAoIW9wdGlvbmFsKSB7XG4gICAgcGFydHMucHVzaCgnVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuJyk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBlbmRXaXRoUGVyaW9kKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHMgPSBzLnRyaW1SaWdodCgpO1xuICBpZiAoIXMuZW5kc1dpdGgoJy4nKSkge1xuICAgIHJldHVybiBgJHtzfS5gO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3ZlcnJpZGVzPFQgZXh0ZW5kcyB7IHBhcmFtOiBzcGVjLlBhcmFtZXRlciB9PihcbiAgYWxsUGFyYW1zOiBUW10sXG4pOiBJdGVyYWJsZTxUW10+IHtcbiAgcmV0dXJuIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogZnVuY3Rpb24qICgpIHtcbiAgICAgIHlpZWxkIGFsbFBhcmFtcztcbiAgICAgIHdoaWxlIChhbGxQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBsYXN0UGFyYW0gPSBhbGxQYXJhbXNbYWxsUGFyYW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoIWxhc3RQYXJhbS5wYXJhbS52YXJpYWRpYyAmJiAhbGFzdFBhcmFtLnBhcmFtLm9wdGlvbmFsKSB7XG4gICAgICAgICAgLy8gTmVpdGhlciB2YXJpYWRpYyBub3Igb3B0aW9uYWwgLS0gd2UncmUgZG9uZSBoZXJlIVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhbGxQYXJhbXMgPSBhbGxQYXJhbXMuc2xpY2UoMCwgYWxsUGFyYW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICAvLyBJZiB0aGUgbGFzdFBhcmFtIHdhcyB2YXJpYWRpYywgd2Ugc2hvdWxkbid0IGdlbmVyYXRlIGFuIG92ZXJyaWRlIHdpdGhvdXQgaXQgb25seS5cbiAgICAgICAgaWYgKGxhc3RQYXJhbS5wYXJhbS5vcHRpb25hbCkge1xuICAgICAgICAgIHlpZWxkIGFsbFBhcmFtcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbnR5cGUgQXNzZW1ibHlMaWtlID0gc3BlYy5Bc3NlbWJseUNvbmZpZ3VyYXRpb24gJiB7IG5hbWU6IHN0cmluZyB9O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbmF0aXZlIHBhY2thZ2UgbmFtZSBmcm9tIGFuIGFzc2VtYmx5XG4gKi9cbmZ1bmN0aW9uIHBhY2thZ2VOYW1lRnJvbUFzc2VtYmx5KGFzc206IEFzc2VtYmx5TGlrZSkge1xuICBjb25zdCBqYXZhUGFja2FnZSA9IGFzc20udGFyZ2V0cz8uamF2YT8ucGFja2FnZTtcbiAgaWYgKCFqYXZhUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgbW9kdWxlICR7YXNzbS5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgamF2YS5wYWNrYWdlIHNldHRpbmdgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGphdmFQYWNrYWdlO1xufVxuXG4vKipcbiAqIEFuYWx5emVzIGFuZCB0cmFuc2xhdGVzIGEganNpaSBGUU4gdG8gSmF2YSBjb21wb25lbnRzXG4gKlxuICogVGhlIEZRTiBjYW4gYmUgb2YgdGhlIGFzc2VtYmx5LCBhIHN1Ym1vZHVsZSwgb3IgYSB0eXBlLlxuICpcbiAqIEFueSB0eXBlIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOlxuICpcbiAqIC0gTG9jYXRlZCBpbiB6ZXJvIG9yIG1vcmUgbmVzdGVkIHN1Ym1vZHVsZXMuIEFueSBvZiB0aGVzZSBjYW4gaGF2ZSBhIEphdmFcbiAqICAgcGFja2FnZSBuYW1lIGFzc2lnbmVkLS1pZiBub25lLCB0aGUgbmFtZSBpcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYnlcbiAqICAgc25ha2UgY2FzaW5nLiBBdCBsZWFzdCB0aGUgYXNzZW1ibHkgbXVzdCBoYXZlIGEgSmF2YSBwYWNrYWdlIG5hbWUgYXNzaWduZWQuXG4gKiAtIExvY2F0ZWQgaW4gemVybyBvciBtb3JlIG5lc3RlZCB0eXBlcyAoY2xhc3NlcykuXG4gKlxuICogRmluZCB1cCB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdW50aWwgd2UgZmluZCBhIHN1Ym1vZHVsZSAob3IgdGhlIGFzc2VtYmx5XG4gKiBpdHNlbGYpIHRoYXQgaGFzIGFuIGV4cGxpY2l0IEphdmEgcGFja2FnZSBuYW1lIGRlZmluZWQuXG4gKlxuICogQXBwZW5kIGFsbCB0aGUgbmFtZXNwYWNlcyB0aGF0IHdlIGNyb3NzZWQgdGhhdCBkaWRuJ3QgaGF2ZSBhIHBhY2thZ2UgbmFtZSBkZWZpbmVkLlxuICpcbiAqIFJldHVybnMgdGhlIEphdmEgcGFja2FnZSBuYW1lIGRldGVybWluZWQgdGhpcyB3YXksIGFzIHdlbGwgYXMgdGhlIGhpZXJhcmNoeSBvZiB0eXBlXG4gKiBuYW1lcyBpbnNpZGUgdGhlIHBhY2thZ2UuIGB0eXBlTmFtZXNgIG1heSBiZSBtaXNzaW5nIG9yIGVtcHR5IGlmIHRoZSBGUU4gaW5kaWNhdGVkXG4gKiB0aGUgYXNzZW1ibHkgb3IgYSBzdWJtb2R1bGUsIGNvbnRhaW5zIDEgZWxlbWVudCBpZiB0aGUgRlFOIGluZGljYXRlZCBhIHRvcC1sZXZlbCB0eXBlLFxuICogbXVsdGlwbGUgZWxlbWVudHMgaWYgdGhlIEZRTiBpbmRpY2F0ZWQgYSBuZXN0ZWQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlRnFuKFxuICBhc3NtOiBBc3NlbWJseUxpa2UsXG4gIG9yaWdpbmFsRnFuOiBzdHJpbmcsXG4pOiB7IHBhY2thZ2VOYW1lOiBzdHJpbmc7IHR5cGVOYW1lczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGltcGxpY2l0UGFja2FnZU5hbWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAvLyBXZSB3b3JrIG91cnNlbHZlcyB1cHdhcmQgdGhyb3VnaCB0aGUgRlFOIHVudGlsIHdlJ3ZlIGZvdW5kIGFuIGV4cGxpY2l0IHBhY2thZ2VcbiAgbGV0IHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVGcm9tQXNzZW1ibHkoYXNzbSk7XG4gIGxldCBmcW4gPSBvcmlnaW5hbEZxbjtcbiAgd2hpbGUgKGZxbiAhPT0gJycgJiYgZnFuICE9PSBhc3NtLm5hbWUpIHtcbiAgICBjb25zdCBbcGFyZW50RnFuLCBsYXN0UGFydF0gPSBzcGxpdE5hbWVzcGFjZShmcW4pO1xuXG4gICAgY29uc3Qgc3VibW9kdWxlID0gYXNzbS5zdWJtb2R1bGVzPy5bZnFuXTtcbiAgICBpZiAoc3VibW9kdWxlKSB7XG4gICAgICBjb25zdCBleHBsaWNpdFBhY2thZ2UgPSBzdWJtb2R1bGUudGFyZ2V0cz8uamF2YT8ucGFja2FnZTtcbiAgICAgIGlmIChleHBsaWNpdFBhY2thZ2UpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBleHBsaWNpdFBhY2thZ2U7XG4gICAgICAgIC8vIFdlIGNhbiBzdG9wIHJlY3Vyc2luZywgdHlwZXMgY2Fubm90IGJlIHRoZSBwYXJlbnQgb2YgYSBtb2R1bGUgYW5kIG5vdGhpbmcgdXB3YXJkcyBjYW4gY2hhbmdlXG4gICAgICAgIC8vIHRoZSBwYWNrYWdlIG5hbWUgYW55bW9yZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGltcGxpY2l0UGFja2FnZU5hbWVzLnVuc2hpZnQoYC4ke3RvU25ha2VDYXNlKGxhc3RQYXJ0KX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgaXQncyBub3QgYSBzdWJtb2R1bGUsIGl0IG11c3QgYmUgYSB0eXBlLlxuICAgICAgdHlwZU5hbWVzLnVuc2hpZnQobGFzdFBhcnQpO1xuICAgIH1cblxuICAgIGZxbiA9IHBhcmVudEZxbjtcbiAgfVxuICBpZiAoZnFuID09PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgJyR7b3JpZ2luYWxGcW59JyBpbnNpZGUgJyR7YXNzbS5uYW1lfSdgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHBhY2thZ2VOYW1lOiBgJHtwYWNrYWdlTmFtZX0ke2ltcGxpY2l0UGFja2FnZU5hbWVzLmpvaW4oJycpfWAsXG4gICAgdHlwZU5hbWVzLFxuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgYXNzZW1ibHkgZXhwb3NlcyB0aGUgXCJoYXNEZWZhdWx0SW50ZXJmYWNlc1wiXG4gKiBqc2lpLXBhY21hayBmZWF0dXJlIGZsYWcuXG4gKlxuICogQHBhcmFtIGFzc2VtYmx5IHRoZSBhc3NlbWJseSB0aGF0IGlzIHRlc3RlZFxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIEpzaWkkRGVmYXVsdCBpbnRlcmZhY2VzIGNhbiBiZSB1c2VkXG4gKi9cbmZ1bmN0aW9uIGhhc0RlZmF1bHRJbnRlcmZhY2VzKGFzc2VtYmx5OiByZWZsZWN0LkFzc2VtYmx5KTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWFzc2VtYmx5Lm1ldGFkYXRhPy5qc2lpPy5wYWNtYWs/Lmhhc0RlZmF1bHRJbnRlcmZhY2VzO1xufVxuXG4vKipcbiAqIFdoZWNrcyB3aGV0aGVyIGEgbmFtZSBjb3JyZXNwb25kcyB0byBhIG1ldGhvZCBvbiBgamF2YS5sYW5nLk9iamVjdGAuIEl0IGlzIG5vdFxuICogcG9zc2libGUgdG8gZW1pdCBkZWZhdWx0IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhvc2UgbmFtZXMgYmVjYXVzZVxuICogdGhlc2Ugd291bGQgYWx3YXlzIGJlIHJlcGxhY2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbnMgb24gYE9iamVjdGAuXG4gKlxuICogQHBhcmFtIG5hbWUgdGhlIGNoZWNrZWQgbmFtZVxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2Fubm90IGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBuYW1lLlxuICovXG5mdW5jdGlvbiBpc0phdmFMYW5nT2JqZWN0TWV0aG9kTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEpBVkFfTEFOR19PQkpFQ1RfTUVUSE9EX05BTUVTLmhhcyhuYW1lKTtcbn1cbmNvbnN0IEpBVkFfTEFOR19PQkpFQ1RfTUVUSE9EX05BTUVTID0gbmV3IFNldChbXG4gICdjbG9uZScsXG4gICdlcXVhbHMnLFxuICAnZmluYWxpemUnLFxuICAnZ2V0Q2xhc3MnLFxuICAnaGFzaENvZGUnLFxuICAnbm90aWZ5JyxcbiAgJ25vdGlmeUFsbCcsXG4gICd0b1N0cmluZycsXG4gICd3YWl0Jyxcbl0pO1xuXG4vKipcbiAqIEluIGEgZG90dGVkIHN0cmluZywgc3RyaXAgb2ZmIHRoZSBsYXN0IGRvdHRlZCBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gc3BsaXROYW1lc3BhY2UobnM6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICBjb25zdCBkb3QgPSBucy5sYXN0SW5kZXhPZignLicpO1xuICBpZiAoZG90ID09PSAtMSkge1xuICAgIHJldHVybiBbJycsIG5zXTtcbiAgfVxuICByZXR1cm4gW25zLnN1YnN0cigwLCBkb3QpLCBucy5zdWJzdHIoZG90ICsgMSldO1xufVxuIl19
|