jsii-pacmak 1.41.0 → 1.42.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.
@@ -249,11 +249,17 @@ class BasePythonClassType {
249
249
  addMember(member) {
250
250
  this.members.push(member);
251
251
  }
252
+ get apiLocation() {
253
+ if (!this.fqn) {
254
+ throw new Error(`Cannot make apiLocation for ${this.pythonName}, does not have FQN`);
255
+ }
256
+ return { api: 'type', fqn: this.fqn };
257
+ }
252
258
  emit(code, context) {
253
259
  context = nestedContext(context, this.fqn);
254
260
  const classParams = this.getClassParams(context);
255
261
  openSignature(code, 'class', this.pythonName, classParams);
256
- this.generator.emitDocString(code, this.docs, {
262
+ this.generator.emitDocString(code, this.apiLocation, this.docs, {
257
263
  documentableItem: `class-${this.pythonName}`,
258
264
  trailingNewLine: true,
259
265
  });
@@ -299,6 +305,9 @@ class BaseMethod {
299
305
  this.liftedProp = opts.liftedProp;
300
306
  this.parent = opts.parent;
301
307
  }
308
+ get apiLocation() {
309
+ return { api: 'member', fqn: this.parent.fqn, memberName: this.jsiiMethod };
310
+ }
302
311
  requiredImports(context) {
303
312
  return type_name_1.mergePythonImports(type_name_1.toTypeName(this.returns).requiredImports(context), ...this.parameters.map((param) => type_name_1.toTypeName(param).requiredImports(context)), ...liftedProperties(this.liftedProp));
304
313
  function* liftedProperties(struct) {
@@ -413,7 +422,7 @@ class BaseMethod {
413
422
  }
414
423
  pythonParams.unshift(slugifyAsNeeded(this.implicitParameter, pythonParams.map((param) => param.split(':')[0].trim())));
415
424
  openSignature(code, 'def', this.pythonName, pythonParams, false, returnType);
416
- this.generator.emitDocString(code, this.docs, {
425
+ this.generator.emitDocString(code, this.apiLocation, this.docs, {
417
426
  arguments: documentableArgs,
418
427
  documentableItem: `method-${this.pythonName}`,
419
428
  });
@@ -441,7 +450,7 @@ class BaseMethod {
441
450
  });
442
451
  // We need to build up a list of properties, which are mandatory, these are the
443
452
  // ones we will specifiy to start with in our dictionary literal.
444
- const liftedProps = this.getLiftedProperties(context.resolver).map((p) => new StructField(this.generator, p));
453
+ const liftedProps = this.getLiftedProperties(context.resolver).map((p) => new StructField(this.generator, p, this.parent));
445
454
  const assignments = liftedProps
446
455
  .map((p) => p.pythonName)
447
456
  .map((v) => `${v}=${v}`);
@@ -527,6 +536,10 @@ class BaseProperty {
527
536
  this.abstract = abstract;
528
537
  this.immutable = immutable;
529
538
  this.isStatic = isStatic;
539
+ this.parent = opts.parent;
540
+ }
541
+ get apiLocation() {
542
+ return { api: 'member', fqn: this.parent.fqn, memberName: this.jsName };
530
543
  }
531
544
  requiredImports(context) {
532
545
  return type_name_1.toTypeName(this.type).requiredImports(context);
@@ -541,7 +554,7 @@ class BaseProperty {
541
554
  code.line('@abc.abstractmethod');
542
555
  }
543
556
  openSignature(code, 'def', this.pythonName, [this.implicitParameter], true, pythonType);
544
- this.generator.emitDocString(code, this.docs, {
557
+ this.generator.emitDocString(code, this.apiLocation, this.docs, {
545
558
  documentableItem: `prop-${this.pythonName}`,
546
559
  });
547
560
  if ((this.shouldEmitBody || forceEmitBody) &&
@@ -586,7 +599,7 @@ class Interface extends BasePythonClassType {
586
599
  typeAnnotation: false,
587
600
  })}) # type: ignore[misc]`);
588
601
  openSignature(code, 'class', this.proxyClassName, proxyBases);
589
- this.generator.emitDocString(code, this.docs, {
602
+ this.generator.emitDocString(code, this.apiLocation, this.docs, {
590
603
  documentableItem: `class-${this.pythonName}`,
591
604
  trailingNewLine: true,
592
605
  });
@@ -678,7 +691,7 @@ class Struct extends BasePythonClassType {
678
691
  * Find all fields (inherited as well)
679
692
  */
680
693
  get allMembers() {
681
- return this.thisInterface.allProperties.map((x) => new StructField(this.generator, x.spec));
694
+ return this.thisInterface.allProperties.map((x) => new StructField(this.generator, x.spec, this.thisInterface));
682
695
  }
683
696
  get thisInterface() {
684
697
  if (this.fqn == null) {
@@ -723,7 +736,7 @@ class Struct extends BasePythonClassType {
723
736
  name: m.pythonName,
724
737
  docs: m.docs,
725
738
  }));
726
- this.generator.emitDocString(code, this.docs, {
739
+ this.generator.emitDocString(code, this.apiLocation, this.docs, {
727
740
  arguments: args,
728
741
  documentableItem: `class-${this.pythonName}`,
729
742
  });
@@ -766,14 +779,18 @@ class Struct extends BasePythonClassType {
766
779
  }
767
780
  }
768
781
  class StructField {
769
- constructor(generator, prop) {
782
+ constructor(generator, prop, parent) {
770
783
  this.generator = generator;
771
784
  this.prop = prop;
785
+ this.parent = parent;
772
786
  this.pythonName = toPythonPropertyName(prop.name);
773
787
  this.jsiiName = prop.name;
774
788
  this.type = prop;
775
789
  this.docs = prop.docs;
776
790
  }
791
+ get apiLocation() {
792
+ return { api: 'member', fqn: this.parent.fqn, memberName: this.jsiiName };
793
+ }
777
794
  get optional() {
778
795
  return !!this.type.optional;
779
796
  }
@@ -797,7 +814,7 @@ class StructField {
797
814
  return type_name_1.toTypeName(this.type).pythonType(context);
798
815
  }
799
816
  emitDocString(code) {
800
- this.generator.emitDocString(code, this.docs, {
817
+ this.generator.emitDocString(code, this.apiLocation, this.docs, {
801
818
  documentableItem: `prop-${this.pythonName}`,
802
819
  });
803
820
  }
@@ -974,20 +991,24 @@ class Enum extends BasePythonClassType {
974
991
  }
975
992
  }
976
993
  class EnumMember {
977
- constructor(generator, pythonName, value, docs) {
994
+ constructor(generator, pythonName, value, docs, parent) {
978
995
  this.generator = generator;
979
996
  this.pythonName = pythonName;
980
997
  this.value = value;
981
998
  this.docs = docs;
999
+ this.parent = parent;
982
1000
  this.pythonName = pythonName;
983
1001
  this.value = value;
984
1002
  }
1003
+ get apiLocation() {
1004
+ return { api: 'member', fqn: this.parent.fqn, memberName: this.value };
1005
+ }
985
1006
  dependsOnModules() {
986
1007
  return new Set();
987
1008
  }
988
1009
  emit(code, _context) {
989
1010
  code.line(`${this.pythonName} = "${this.value}"`);
990
- this.generator.emitDocString(code, this.docs, {
1011
+ this.generator.emitDocString(code, this.apiLocation, this.docs, {
991
1012
  documentableItem: `enum-${this.pythonName}`,
992
1013
  });
993
1014
  }
@@ -1483,7 +1504,7 @@ class PythonGenerator extends generator_1.Generator {
1483
1504
  this.types = new Map();
1484
1505
  }
1485
1506
  // eslint-disable-next-line complexity
1486
- emitDocString(code, docs, options = {}) {
1507
+ emitDocString(code, apiLocation, docs, options = {}) {
1487
1508
  var _a, _b, _c, _d;
1488
1509
  if ((!docs || Object.keys(docs).length === 0) && !options.arguments) {
1489
1510
  return;
@@ -1525,7 +1546,7 @@ class PythonGenerator extends generator_1.Generator {
1525
1546
  }
1526
1547
  if (docs.remarks) {
1527
1548
  brk();
1528
- lines.push(...markdown_1.md2rst(this.convertMarkdown((_a = docs.remarks) !== null && _a !== void 0 ? _a : '')).split('\n'));
1549
+ lines.push(...markdown_1.md2rst(this.convertMarkdown((_a = docs.remarks) !== null && _a !== void 0 ? _a : '', apiLocation)).split('\n'));
1529
1550
  brk();
1530
1551
  }
1531
1552
  if ((_c = (_b = options.arguments) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0 > 0) {
@@ -1562,7 +1583,7 @@ class PythonGenerator extends generator_1.Generator {
1562
1583
  brk();
1563
1584
  lines.push('Example::');
1564
1585
  lines.push('');
1565
- const exampleText = this.convertExample(docs.example);
1586
+ const exampleText = this.convertExample(docs.example, apiLocation);
1566
1587
  for (const line of exampleText.split('\n')) {
1567
1588
  lines.push(` ${line}`);
1568
1589
  }
@@ -1589,16 +1610,12 @@ class PythonGenerator extends generator_1.Generator {
1589
1610
  code.line();
1590
1611
  }
1591
1612
  }
1592
- convertExample(example) {
1593
- const snippet = jsii_rosetta_1.typeScriptSnippetFromSource(example, 'example', jsii_rosetta_1.enforcesStrictMode(this.assembly));
1594
- const translated = this.rosetta.translateSnippet(snippet, jsii_rosetta_1.TargetLanguage.PYTHON);
1595
- if (!translated) {
1596
- return example;
1597
- }
1613
+ convertExample(example, apiLoc) {
1614
+ const translated = this.rosetta.translateExample(apiLoc, example, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly));
1598
1615
  return this.prefixDisclaimer(translated);
1599
1616
  }
1600
- convertMarkdown(markdown) {
1601
- return this.rosetta.translateSnippetsInMarkdown(markdown, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly), (trans) => ({
1617
+ convertMarkdown(markdown, apiLoc) {
1618
+ return this.rosetta.translateSnippetsInMarkdown(apiLoc, markdown, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly), (trans) => ({
1602
1619
  language: trans.language,
1603
1620
  source: this.prefixDisclaimer(trans),
1604
1621
  }));
@@ -1652,11 +1669,12 @@ class PythonGenerator extends generator_1.Generator {
1652
1669
  const submoduleLike = ns === this.assembly.name
1653
1670
  ? this.assembly
1654
1671
  : (_a = this.assembly.submodules) === null || _a === void 0 ? void 0 : _a[ns];
1672
+ const readmeLocation = { api: 'moduleReadme', moduleFqn: ns };
1655
1673
  const module = new PythonModule(type_name_1.toPackageName(ns, this.assembly), ns, {
1656
1674
  assembly: this.assembly,
1657
1675
  assemblyFilename: this.getAssemblyFileName(),
1658
1676
  package: this.package,
1659
- moduleDocumentation: (submoduleLike === null || submoduleLike === void 0 ? void 0 : submoduleLike.readme) ? this.convertMarkdown((_b = submoduleLike.readme) === null || _b === void 0 ? void 0 : _b.markdown).trim()
1677
+ moduleDocumentation: (submoduleLike === null || submoduleLike === void 0 ? void 0 : submoduleLike.readme) ? this.convertMarkdown((_b = submoduleLike.readme) === null || _b === void 0 ? void 0 : _b.markdown, readmeLocation).trim()
1660
1678
  : undefined,
1661
1679
  });
1662
1680
  this.package.addModule(module);
@@ -1758,7 +1776,7 @@ class PythonGenerator extends generator_1.Generator {
1758
1776
  onInterfaceProperty(ifc, prop) {
1759
1777
  let ifaceProperty;
1760
1778
  if (ifc.datatype) {
1761
- ifaceProperty = new StructField(this, prop);
1779
+ ifaceProperty = new StructField(this, prop, ifc);
1762
1780
  }
1763
1781
  else {
1764
1782
  ifaceProperty = new InterfaceProperty(this, toPythonPropertyName(prop.name, prop.const, prop.protected), prop.name, prop, prop.docs, { immutable: prop.immutable, isStatic: prop.static, parent: ifc });
@@ -1769,7 +1787,7 @@ class PythonGenerator extends generator_1.Generator {
1769
1787
  this.addPythonType(new Enum(this, util_2.toPythonIdentifier(enm.name), enm.fqn, {}, enm.docs));
1770
1788
  }
1771
1789
  onEnumMember(enm, member) {
1772
- this.getPythonType(enm.fqn).addMember(new EnumMember(this, util_2.toPythonIdentifier(member.name), member.name, member.docs));
1790
+ this.getPythonType(enm.fqn).addMember(new EnumMember(this, util_2.toPythonIdentifier(member.name), member.name, member.docs, enm));
1773
1791
  }
1774
1792
  onInterfaceMethodOverload(_ifc, _overload, _originalMethod) {
1775
1793
  throw new Error('Unhandled Type: InterfaceMethodOverload');
@@ -2031,4 +2049,4 @@ function nestedContext(context, fqn) {
2031
2049
  };
2032
2050
  }
2033
2051
  const isDeprecated = (x) => { var _a; return ((_a = x.docs) === null || _a === void 0 ? void 0 : _a.deprecated) !== undefined; };
2034
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FNc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQXlDO0FBQ3pDLGtEQU00QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLHdCQUlXO0FBRVgsb0dBQW9HO0FBQ3BHLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDbkMsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsQ0FDdkIsQ0FBQztBQUVGLDJFQUEyRTtBQUMzRSwrRkFBK0Y7QUFDL0YsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0IsTUFBcUIsTUFBTyxTQUFRLGVBQU07SUFHeEMsWUFBbUIsT0FBc0I7UUFDdkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBYyxFQUFFLE9BQWU7UUFDdkQsTUFBTSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFpQixFQUFFLE1BQWM7UUFDbEQsNkJBQTZCO1FBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMs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Q0FBQyxHQUFHLE9BQUMsT0FBTyxDQUFDLG1CQUFtQixtQ0FBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDL0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUI7S0FDbEMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQWEsRUFBRSxFQUFFLFdBQUMsT0FBQSxPQUFBLENBQUMsQ0FBQyxJQUFJLDBDQUFFLFVBQVUsTUFBSyxTQUFTLENBQUEsRUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQ29kZU1ha2VyLCB0b1NuYWtlQ2FzZSB9IGZyb20gJ2NvZGVtYWtlcic7XG5pbXBvcnQgKiBhcyBlc2NhcGVTdHJpbmdSZWdleHAgZnJvbSAnZXNjYXBlLXN0cmluZy1yZWdleHAnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHtcbiAgVGFyZ2V0TGFuZ3VhZ2UsXG4gIFRyYW5zbGF0aW9uLFxuICBSb3NldHRhLFxuICBlbmZvcmNlc1N0cmljdE1vZGUsXG4gIHR5cGVTY3JpcHRTbmlwcGV0RnJvbVNvdXJjZSxcbn0gZnJvbSAnanNpaS1yb3NldHRhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEdlbmVyYXRvciwgR2VuZXJhdG9yT3B0aW9ucyB9IGZyb20gJy4uL2dlbmVyYXRvcic7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQgeyBtZDJyc3QgfSBmcm9tICcuLi9tYXJrZG93bic7XG5pbXBvcnQgeyBUYXJnZXQsIFRhcmdldE9wdGlvbnMgfSBmcm9tICcuLi90YXJnZXQnO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IHJlbmRlclN1bW1hcnkgfSBmcm9tICcuL191dGlscyc7XG5pbXBvcnQge1xuICBOYW1pbmdDb250ZXh0LFxuICB0b1R5cGVOYW1lLFxuICBQeXRob25JbXBvcnRzLFxuICBtZXJnZVB5dGhvbkltcG9ydHMsXG4gIHRvUGFja2FnZU5hbWUsXG59IGZyb20gJy4vcHl0aG9uL3R5cGUtbmFtZSc7XG5pbXBvcnQgeyBkaWUsIHRvUHl0aG9uSWRlbnRpZmllciB9IGZyb20gJy4vcHl0aG9uL3V0aWwnO1xuaW1wb3J0IHsgdG9QeXRob25WZXJzaW9uUmFuZ2UsIHRvUmVsZWFzZVZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24tdXRpbHMnO1xuXG5pbXBvcnQge1xuICBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfQ09NUElMSU5HLFxuICBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HLFxuICBUYXJnZXROYW1lLFxufSBmcm9tICcuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgcmVxdWlyZW1lbnRzRmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgX19kaXJuYW1lLFxuICAncHl0aG9uJyxcbiAgJ3JlcXVpcmVtZW50cy1kZXYudHh0Jyxcbik7XG5cbi8vIHdlIHVzZSBzaW5nbGUtcXVvdGVzIGZvciBtdWx0aS1saW5lIHN0cmluZ3MgdG8gYWxsb3cgZXhhbXBsZXMgd2l0aGluIHRoZVxuLy8gZG9jc3RyaW5ncyB0aGVtc2VsdmVzIHRvIGluY2x1ZGUgZG91YmxlLXF1b3RlcyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjU2OSlcbmNvbnN0IERPQ1NUUklOR19RVU9URVMgPSBcIicnJ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQeXRob24gZXh0ZW5kcyBUYXJnZXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IFB5dGhvbkdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ29kZShvdXREaXI6IHN0cmluZywgdGFyYmFsbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZ2VuZXJhdGVDb2RlKG91dERpciwgdGFyYmFsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoc291cmNlRGlyOiBzdHJpbmcsIG91dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggdmlydHVhbCBlbnZcbiAgICBjb25zdCB2ZW52ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4oc291cmNlRGlyLCAnLmVudi0nKSk7XG4gICAgY29uc3QgdmVudkJpbiA9IHBhdGguam9pbihcbiAgICAgIHZlbnYsXG4gICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ1NjcmlwdHMnIDogJ2JpbicsXG4gICAgKTtcbiAgICBhd2FpdCBzaGVsbCgncHl0aG9uMycsIFtcbiAgICAgICctbScsXG4gICAgICAndmVudicsXG4gICAgICAnLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlcycsIC8vIEFsbG93IHVzaW5nIGdsb2JhbGx5IGluc3RhbGxlZCBwYWNrYWdlcyAoc2F2ZXMgdGltZSAmIGRpc2sgc3BhY2UpXG4gICAgICB2ZW52LFxuICAgIF0pO1xuICAgIGNvbnN0IGVudiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgUEFUSDogYCR7dmVudkJpbn06JHtwcm9jZXNzLmVudi5QQVRIfWAsXG4gICAgICBWSVJUVUFMX0VOVjogdmVudixcbiAgICB9O1xuICAgIGNvbnN0IHB5dGhvbiA9IHBhdGguam9pbih2ZW52QmluLCAncHl0aG9uJyk7XG5cbiAgICAvLyBJbnN0YWxsIHRoZSBuZWNlc3NhcnkgdGhpbmdzXG4gICAgYXdhaXQgc2hlbGwoXG4gICAgICBweXRob24sXG4gICAgICBbJy1tJywgJ3BpcCcsICdpbnN0YWxsJywgJy0tbm8taW5wdXQnLCAnLXInLCByZXF1aXJlbWVudHNGaWxlXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICAgIGVudixcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFjdHVhbGx5IHBhY2thZ2UgdXAgb3VyIGNvZGUsIGJvdGggYXMgYSBzZGlzdCBhbmQgYSB3aGVlbCBmb3IgcHVibGlzaGluZy5cbiAgICBhd2FpdCBzaGVsbChweXRob24sIFsnc2V0dXAucHknLCAnc2Rpc3QnLCAnLS1kaXN0LWRpcicsIG91dERpcl0sIHtcbiAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgZW52LFxuICAgIH0pO1xuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgcHl0aG9uLFxuICAgICAgWyctbScsICdwaXAnLCAnd2hlZWwnLCAnLS1uby1kZXBzJywgJy0td2hlZWwtZGlyJywgb3V0RGlyLCBzb3VyY2VEaXJdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52LFxuICAgICAgICByZXRyeTogeyBtYXhBdHRlbXB0czogNSB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHNoZWxsKHB5dGhvbiwgWyctbScsICd0d2luZScsICdjaGVjaycsIHBhdGguam9pbihvdXREaXIsICcqJyldLCB7XG4gICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgIGVudixcbiAgICB9KTtcbiAgfVxufVxuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICMgQ09ERSBHRU5FUkFUT1IgI1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmludGVyZmFjZSBFbWl0Q29udGV4dCBleHRlbmRzIE5hbWluZ0NvbnRleHQge1xuICAvKiogQGRlcHJlY2F0ZWQgVGhlIFR5cGVSZXNvbHZlciAqL1xuICByZWFkb25seSByZXNvbHZlcjogVHlwZVJlc29sdmVyO1xufVxuXG5jb25zdCBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gcGF0aC5qb2luKC4uLm5hbWUuc3BsaXQoJy4nKSk7XG59O1xuXG5jb25zdCB0b1B5dGhvbk1ldGhvZE5hbWUgPSAobmFtZTogc3RyaW5nLCBwcm90ZWN0ZWRJdGVtID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xuICBsZXQgdmFsdWUgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgdG9QeXRob25Qcm9wZXJ0eU5hbWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgY29uc3RhbnQgPSBmYWxzZSxcbiAgcHJvdGVjdGVkSXRlbSA9IGZhbHNlLFxuKTogc3RyaW5nID0+IHtcbiAgbGV0IHZhbHVlID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcblxuICBpZiAoY29uc3RhbnQpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZ2l2ZW4gc2lnbmF0dXJlJ3MgcGFyYW1ldGVyIG5hbWUgdG8gd2hhdCBzaG91bGQgYmUgZW1pdHRlZCBpbiBQeXRob24uIEl0IHNsdWdpZmllcyB0aGVcbiAqIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG5hbWVzIHRoYXQgY29sbGlkZSB3aXRoIGEgbGlmdGVkIHByb3AgYnkgYXBwZW5kaW5nIHRyYWlsaW5nIGBfYC4gVGhlcmUgaXMgbm9cbiAqIHJpc2sgb2YgY29uZmxpY3Rpbmcgd2l0aCBhbiBvdGhlciBwb3NpdGlvbmFsIHBhcmFtZXRlciB0aGF0IGVuZHMgd2l0aCBhIGBfYCBjaGFyYWN0ZXIgYmVjYXVzZVxuICogdGhpcyBpcyBwcm9oaWJpdGVkIGJ5IHRoZSBganNpaWAgY29tcGlsZXIgKHBhcmFtZXRlciBuYW1lcyBNVVNUIGJlIGNhbWVsQ2FzZSwgYW5kIG9ubHkgYSBzaW5nbGVcbiAqIGBfYCBpcyBwZXJtaXR0ZWQgd2hlbiBpdCBpcyBvbiAqKmxlYWRpbmcqKiBwb3NpdGlvbilcbiAqXG4gKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0aGF0IG5lZWRzIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gbGlmdGVkUGFyYW1OYW1lcyAgdGhlIGxpc3Qgb2YgXCJsaWZ0ZWRcIiBrZXl3b3JkIHBhcmFtZXRlcnMgaW4gdGhpcyBzaWduYXR1cmUuIFRoaXMgbXVzdCBiZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQgd2hlbiBnZW5lcmF0aW5nIGEgbmFtZSBmb3IgYSBwYXJhbWV0ZXIgdGhhdCAqKmlzKiogbGlmdGVkLlxuICovXG5mdW5jdGlvbiB0b1B5dGhvblBhcmFtZXRlck5hbWUoXG4gIG5hbWU6IHN0cmluZyxcbiAgbGlmdGVkUGFyYW1OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG5cbiAgd2hpbGUgKGxpZnRlZFBhcmFtTmFtZXMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXN1bHQgKz0gJ18nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgc2V0RGlmZmVyZW5jZSA9IDxUPihzZXRBOiBTZXQ8VD4sIHNldEI6IFNldDxUPik6IFNldDxUPiA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8VD4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHNldEEpIHtcbiAgICBpZiAoIXNldEIuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQcmVwYXJlIHB5dGhvbiBtZW1iZXJzIGZvciBlbWlzc2lvbi5cbiAqXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lLCB0aGV5IHdpbGwgYWxsIG1hcCB0byB0aGUgc2FtZSBweXRob25cbiAqIG5hbWUsIHNvIHdlIHdpbGwgZmlsdGVyIGFsbCBkZXByZWNhdGVkIG1lbWJlcnMgYW5kIGV4cGVjdCB0aGF0IHRoZXJlIHdpbGwgYmUgb25seSBvbmVcbiAqIGxlZnQuXG4gKlxuICogUmV0dXJucyB0aGUgbWVtYmVycyBpbiBhIHNvcnRlZCBsaXN0LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTWVtYmVycyhtZW1iZXJzOiBQeXRob25CYXNlW10sIHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpIHtcbiAgLy8gY3JlYXRlIGEgbWFwIGZyb20gcHl0aG9uIG5hbWUgdG8gbGlzdCBvZiBtZW1iZXJzXG4gIGNvbnN0IG1hcDogeyBbcHl0aG9uTmFtZTogc3RyaW5nXTogUHl0aG9uQmFzZVtdIH0gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lbWJlcnMpIHtcbiAgICBsZXQgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdO1xuICAgIGlmICghbGlzdCkge1xuICAgICAgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdID0gW107XG4gICAgfVxuXG4gICAgbGlzdC5wdXNoKG0pO1xuICB9XG5cbiAgLy8gbm93IHJldHVybiBhbGwgdGhlIG1lbWJlcnNcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgbGlzdF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgIGxldCBtZW1iZXI7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgbWVtYmVyIGZvciB0aGlzIG5vcm1hbGl6ZWQgbmFtZSwgdGhlbiB1c2UgaXRcbiAgICAgIG1lbWJlciA9IGxpc3RbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlIGZvdW5kIG1vcmUgdGhhbiBvbmUgbWVtYmVyIHdpdGggdGhlIHNhbWUgcHl0aG9uIG5hbWUsIGZpbHRlciBhbGxcbiAgICAgIC8vIGRlcHJlY2F0ZWQgdmVyc2lvbnMgYW5kIGNoZWNrIHRoYXQgd2UgYXJlIGxlZnQgd2l0aCBleGFjdGx5IG9uZS5cbiAgICAgIC8vIG90aGVyd2lzZSwgdGhleSB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yNTA4XG4gICAgICBjb25zdCBub25EZXByZWNhdGVkID0gbGlzdC5maWx0ZXIoKHgpID0+ICFpc0RlcHJlY2F0ZWQoeCkpO1xuICAgICAgaWYgKG5vbkRlcHJlY2F0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG5vbi1kZXByZWNhdGVkIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub25EZXByZWNhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cIiwgYnV0IGFsbCBvZiB0aGVtIGFyZSBkZXByZWNhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWVtYmVyID0gbm9uRGVwcmVjYXRlZFswXTtcbiAgICB9XG5cbiAgICByZXQucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcmV0dXJuIHNvcnRNZW1iZXJzKHJldCwgcmVzb2x2ZXIpO1xufVxuXG5jb25zdCBzb3J0TWVtYmVycyA9IChcbiAgbWVtYmVyczogUHl0aG9uQmFzZVtdLFxuICByZXNvbHZlcjogVHlwZVJlc29sdmVyLFxuKTogUHl0aG9uQmFzZVtdID0+IHtcbiAgbGV0IHNvcnRhYmxlID0gbmV3IEFycmF5PHtcbiAgICBtZW1iZXI6IFB5dGhvbkJhc2UgJiBJU29ydGFibGVUeXBlO1xuICAgIGRlcGVuZHNPbjogU2V0PFB5dGhvblR5cGU+O1xuICB9PigpO1xuICBjb25zdCBzb3J0ZWQgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8UHl0aG9uQmFzZT4oKTtcblxuICAvLyBUaGUgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBkbywgaXMgcHVzaCBhbnkgaXRlbSB3aGljaCBpcyBub3Qgc29ydGFibGUgdG8gdGhlIHZlcnlcbiAgLy8gZnJvbnQgb2YgdGhlIGxpc3QuIFRoaXMgd2lsbCBiZSB0aGluZ3MgbGlrZSBtZXRob2RzLCBwcm9wZXJ0aWVzLCBldGMuXG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICBpZiAoIWlzU29ydGFibGVUeXBlKG1lbWJlcikpIHtcbiAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICBzZWVuLmFkZChtZW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3J0YWJsZS5wdXNoKHsgbWVtYmVyLCBkZXBlbmRzT246IG5ldyBTZXQobWVtYmVyLmRlcGVuZHNPbihyZXNvbHZlcikpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB0aGF0IHdlJ3ZlIHB1bGxlZCBvdXQgZXZlcnl0aGluZyB0aGF0IGNvdWxkbid0IHBvc3NpYmx5IGhhdmUgZGVwZW5kZW5jaWVzLFxuICAvLyB3ZSB3aWxsIGdvIHRocm91Z2ggdGhlIHJlbWFpbmluZyBpdGVtcywgYW5kIHB1bGwgb2ZmIGFueSBpdGVtcyB3aGljaCBoYXZlIG5vXG4gIC8vIGRlcGVuZGVuY2llcyB0aGF0IHdlIGhhdmVuJ3QgYWxyZWFkeSBzb3J0ZWQuXG4gIHdoaWxlIChzb3J0YWJsZS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCB7IG1lbWJlciwgZGVwZW5kc09uIH0gb2Ygc29ydGFibGUpIHtcbiAgICAgIGNvbnN0IGRpZmYgPSBzZXREaWZmZXJlbmNlKGRlcGVuZHNPbiwgc2Vlbik7XG4gICAgICBpZiAoWy4uLmRpZmZdLmZpbmQoKGRlcCkgPT4gIShkZXAgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSA9PSBudWxsKSB7XG4gICAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICAgIHNlZW4uYWRkKG1lbWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdG92ZXIgPSBzb3J0YWJsZS5maWx0ZXIoKHsgbWVtYmVyIH0pID0+ICFzZWVuLmhhcyhtZW1iZXIpKTtcbiAgICBpZiAobGVmdG92ZXIubGVuZ3RoID09PSBzb3J0YWJsZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBzb3J0IG1lbWJlcnMgKGNpcmN1bGFyIGRlcGVuZGVuY3k/KS4gTGVmdG92ZXI6ICR7bGVmdG92ZXJcbiAgICAgICAgICAubWFwKChsbykgPT4gbG8ubWVtYmVyLnB5dGhvbk5hbWUpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvcnRhYmxlID0gbGVmdG92ZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNvcnRlZDtcbn07XG5cbmludGVyZmFjZSBQeXRob25CYXNlIHtcbiAgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuXG4gIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCwgb3B0cz86IGFueSk6IHZvaWQ7XG5cbiAgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cztcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGUgZXh0ZW5kcyBQeXRob25CYXNlIHtcbiAgLy8gVGhlIEpTSUkgRlFOIGZvciB0aGlzIGl0ZW0sIGlmIHRoaXMgaXRlbSBkb2Vzbid0IGV4aXN0IGFzIGEgSlNJSSB0eXBlLCB0aGVuIGl0XG4gIC8vIGRvZXNuJ3QgaGF2ZSBhIEZRTiBhbmQgaXQgc2hvdWxkIGJlIG51bGw7XG4gIHJlYWRvbmx5IGZxbj86IHN0cmluZztcblxuICBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTb3J0YWJsZVR5cGUge1xuICBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXTtcbn1cblxuZnVuY3Rpb24gaXNTb3J0YWJsZVR5cGUoYXJnOiB1bmtub3duKTogYXJnIGlzIElTb3J0YWJsZVR5cGUge1xuICByZXR1cm4gKGFyZyBhcyBQYXJ0aWFsPElTb3J0YWJsZVR5cGU+KS5kZXBlbmRzT24gIT09IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGVPcHRzIHtcbiAgYmFzZXM/OiBzcGVjLlR5cGVSZWZlcmVuY2VbXTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZVB5dGhvbkNsYXNzVHlwZSBpbXBsZW1lbnRzIFB5dGhvblR5cGUsIElTb3J0YWJsZVR5cGUge1xuICBwcm90ZWN0ZWQgYmFzZXM6IHNwZWMuVHlwZVJlZmVyZW5jZVtdO1xuICBwcm90ZWN0ZWQgbWVtYmVyczogUHl0aG9uQmFzZVtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VwYXJhdGVNZW1iZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IFB5dGhvblR5cGVPcHRzLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGNvbnN0IHsgYmFzZXMgPSBbXSB9ID0gb3B0cztcblxuICAgIHRoaXMuYmFzZXMgPSBiYXNlcztcbiAgICB0aGlzLm1lbWJlcnMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5PFB5dGhvblR5cGU+KCk7XG4gICAgY29uc3QgcGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KHRoaXMuZnFuISk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJldHVybiBhbnkgYmFzZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgbW9kdWxlIGF0IHRoZSBzYW1lIGxldmVsIG9mXG4gICAgLy8gbmVzdGluZy5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBiYXNlIG9mIHRoaXMuYmFzZXMpIHtcbiAgICAgIGlmIChzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKGJhc2UpKSB7XG4gICAgICAgIGlmIChyZXNvbHZlci5pc0luTW9kdWxlKGJhc2UpKSB7XG4gICAgICAgICAgLy8gR2l2ZW4gYSBiYXNlLCB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgYmFzZSdzIHBhcmVudCB0aGF0IGlzIHRoZSBzYW1lIGFzXG4gICAgICAgICAgLy8gb3VyIHBhcmVudCwgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF0IHRoZVxuICAgICAgICAgIC8vIHNhbWUgbGV2ZWwgb2Ygb3VyIG93bi5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBtaWdodCBuZWVkIHRvIHJlY3Vyc2UgaW50byBvdXIgbWVtYmVycyB0byBhbHNvIGZpbmQgdGhlaXJcbiAgICAgICAgICAvLyAgICAgICBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgbGV0IGJhc2VJdGVtID0gcmVzb2x2ZXIuZ2V0VHlwZShiYXNlKTtcbiAgICAgICAgICBsZXQgYmFzZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChiYXNlKTtcbiAgICAgICAgICB3aGlsZSAoYmFzZVBhcmVudCAhPT0gcGFyZW50KSB7XG4gICAgICAgICAgICBiYXNlSXRlbSA9IGJhc2VQYXJlbnQ7XG4gICAgICAgICAgICBiYXNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGJhc2VJdGVtLmZxbiEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc2Vlbi5oYXMoYmFzZUl0ZW0uZnFuISkpIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGJhc2VJdGVtKTtcbiAgICAgICAgICAgIHNlZW4uYWRkKGJhc2VJdGVtLmZxbiEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZXBlbmRlbmNpZXM7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIC4uLnRoaXMuYmFzZXMubWFwKChiYXNlKSA9PiB0b1R5cGVOYW1lKGJhc2UpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgICAuLi50aGlzLm1lbWJlcnMubWFwKChtZW0pID0+IG1lbS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWVtYmVyKG1lbWJlcjogUHl0aG9uQmFzZSkge1xuICAgIHRoaXMubWVtYmVycy5wdXNoKG1lbWJlcik7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuXG4gICAgY29uc3QgY2xhc3NQYXJhbXMgPSB0aGlzLmdldENsYXNzUGFyYW1zKGNvbnRleHQpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBjbGFzc1BhcmFtcyk7XG5cbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5ib3VuZFJlc29sdmVyKGNvbnRleHQucmVzb2x2ZXIpO1xuICAgICAgbGV0IHNob3VsZFNlcGFyYXRlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgICBpZiAoc2hvdWxkU2VwYXJhdGUpIHtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRTZXBhcmF0ZSA9IHRoaXMuc2VwYXJhdGVNZW1iZXJzO1xuICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCB7IC4uLmNvbnRleHQsIHJlc29sdmVyIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBib3VuZFJlc29sdmVyKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBUeXBlUmVzb2x2ZXIge1xuICAgIGlmICh0aGlzLmZxbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlci5iaW5kKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgQmFzZU1ldGhvZE9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG59XG5cbmludGVyZmFjZSBCYXNlTWV0aG9kRW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlTWV0aG9kIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJldHVybkZyb21KU0lJTWV0aG9kOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHNwZWMuUGFyYW1ldGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXR1cm5zOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW4sXG4gICAgb3B0czogQmFzZU1ldGhvZE9wdHMsXG4gICkge1xuICAgIHRoaXMuYWJzdHJhY3QgPSAhIW9wdHMuYWJzdHJhY3Q7XG4gICAgdGhpcy5saWZ0ZWRQcm9wID0gb3B0cy5saWZ0ZWRQcm9wO1xuICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHRvVHlwZU5hbWUodGhpcy5yZXR1cm5zKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICAuLi50aGlzLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT5cbiAgICAgICAgdG9UeXBlTmFtZShwYXJhbSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgKSxcbiAgICAgIC4uLmxpZnRlZFByb3BlcnRpZXModGhpcy5saWZ0ZWRQcm9wKSxcbiAgICApO1xuXG4gICAgZnVuY3Rpb24qIGxpZnRlZFByb3BlcnRpZXMoXG4gICAgICBzdHJ1Y3Q6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHVuZGVmaW5lZCxcbiAgICApOiBJdGVyYWJsZUl0ZXJhdG9yPFB5dGhvbkltcG9ydHM+IHtcbiAgICAgIGlmIChzdHJ1Y3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc3RydWN0LnByb3BlcnRpZXMgPz8gW10pIHtcbiAgICAgICAgeWllbGQgdG9UeXBlTmFtZShwcm9wLnR5cGUpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiBzdHJ1Y3QuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBpZmFjZSA9IGNvbnRleHQucmVzb2x2ZXIuZGVyZWZlcmVuY2UoYmFzZSkgYXMgc3BlYy5JbnRlcmZhY2VUeXBlO1xuICAgICAgICBmb3IgKGNvbnN0IGltcG9ydHMgb2YgbGlmdGVkUHJvcGVydGllcyhpZmFjZSkpIHtcbiAgICAgICAgICB5aWVsZCBpbXBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlTWV0aG9kRW1pdE9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgcmVuZGVyQWJzdHJhY3QgPSB0cnVlLCBmb3JjZUVtaXRCb2R5ID0gZmFsc2UgfSA9IG9wdHMgPz8ge307XG5cbiAgICBjb25zdCByZXR1cm5UeXBlOiBzdHJpbmcgPSB0b1R5cGVOYW1lKHRoaXMucmV0dXJucykucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgIC8vIFdlIGNhbm5vdCAoY3VycmVudGx5PykgYmxpbmRseSB1c2UgdGhlIG5hbWVzIGdpdmVuIHRvIHVzIGJ5IHRoZSBKU0lJIGZvclxuICAgIC8vIGluaXRpYWxpemVycywgYmVjYXVzZSBvdXIga2V5d29yZCBsaWZ0aW5nIHdpbGwgYWxsb3cgdHdvIG5hbWVzIHRvIGNsYXNoLlxuICAgIC8vIFRoaXMgY2FuIGhvcGVmdWxseSBiZSByZW1vdmVkIG9uY2Ugd2UgZ2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjg4XG4gICAgLy8gcmVzb2x2ZWQsIHNvIGJ1aWxkIHVwIGEgbGlzdCBvZiBhbGwgb2YgdGhlIHByb3AgbmFtZXMgc28gd2UgY2FuIGNoZWNrIGFnYWluc3RcbiAgICAvLyB0aGVtIGxhdGVyLlxuICAgIGNvbnN0IGxpZnRlZFByb3BOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmICh0aGlzLmxpZnRlZFByb3A/LnByb3BlcnRpZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHRoaXMubGlmdGVkUHJvcC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxpZnRlZFByb3BOYW1lcy5hZGQodG9QeXRob25QYXJhbWV0ZXJOYW1lKHByb3AubmFtZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHVybiBhIGxpc3Qgb2YgSlNJSSBwYXJhbWV0ZXJzLCBpbnRvIFB5dGhvbiBzdHlsZSBhcmd1bWVudHMgd2l0aFxuICAgIC8vIGdyYWR1YWwgdHlwaW5nLCBzbyB3ZSdsbCBoYXZlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzLCBhbmRcbiAgICAvLyBidWlsZCB0aGUgbGlzdCwgY29udmVydGluZyBhcyB3ZSBnby5cbiAgICBjb25zdCBweXRob25QYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiB0aGlzLnBhcmFtZXRlcnMpIHtcbiAgICAgIC8vIFdlIGNhbm5vdCAoY3VycmVudGx5PykgYmxpbmRseSB1c2UgdGhlIG5hbWVzIGdpdmVuIHRvIHVzIGJ5IHRoZSBKU0lJIGZvclxuICAgICAgLy8gaW5pdGlhbGl6ZXJzLCBiZWNhdXNlIG91ciBrZXl3b3JkIGxpZnRpbmcgd2lsbCBhbGxvdyB0d28gbmFtZXMgdG8gY2xhc2guXG4gICAgICAvLyBUaGlzIGNhbiBob3BlZnVsbHkgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI4OFxuICAgICAgLy8gcmVzb2x2ZWQuXG4gICAgICBjb25zdCBwYXJhbU5hbWU6IHN0cmluZyA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShcbiAgICAgICAgcGFyYW0ubmFtZSxcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShwYXJhbSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhcmFtRGVmYXVsdCA9IHBhcmFtLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG5cbiAgICAgIHB5dGhvblBhcmFtcy5wdXNoKGAke3BhcmFtTmFtZX06ICR7cGFyYW1UeXBlfSR7cGFyYW1EZWZhdWx0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY3VtZW50YWJsZUFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLnBhcmFtZXRlcnNcbiAgICAgIC8vIElmIHRoZXJlJ3MgbGlmdGVkUHJvcHMsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBzdHJ1Y3QgYW5kIGl0IHdvbid0IGJlIF9hY3R1YWxseV8gZW1pdHRlZC5cbiAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PlxuICAgICAgICB0aGlzLmxpZnRlZFByb3AgIT0gbnVsbCA/IGluZGV4IDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDEgOiB0cnVlLFxuICAgICAgKVxuICAgICAgLm1hcCgocGFyYW0pID0+ICh7XG4gICAgICAgIC4uLnBhcmFtLFxuICAgICAgICBuYW1lOiB0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSwgbGlmdGVkUHJvcE5hbWVzKSxcbiAgICAgIH0pKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBsaWZ0ZWQgcGFyYW1ldGVyLCB0aGVuIHdlJ2xsIGRyb3AgdGhlIGxhc3QgYXJndW1lbnQgdG8gb3VyIHBhcmFtc1xuICAgIC8vIGFuZCB0aGVuIHdlJ2xsIGxpZnQgYWxsIG9mIHRoZSBwYXJhbXMgb2YgdGhlIGxpZnRlZCB0eXBlIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgLy8gdG8gdGhlIGZ1bmN0aW9uLlxuICAgIGlmICh0aGlzLmxpZnRlZFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVtb3ZlIG91ciBsYXN0IGl0ZW0uXG4gICAgICBweXRob25QYXJhbXMucG9wKCk7XG4gICAgICBjb25zdCBsaWZ0ZWRQcm9wZXJ0aWVzID0gdGhpcy5nZXRMaWZ0ZWRQcm9wZXJ0aWVzKGNvbnRleHQucmVzb2x2ZXIpO1xuXG4gICAgICBpZiAobGlmdGVkUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuICAgICAgICAvLyBBbGwgb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUga2V5d29yZCBvbmx5IGFyZ3VtZW50cywgc28gd2UnbGwgbWFyayB0aGVtXG4gICAgICAgIC8vIGFzIHN1Y2guXG4gICAgICAgIHB5dGhvblBhcmFtcy5wdXNoKCcqJyk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiBvdXIgcHJvcHMsIGFuZCByZWZsZWN0IHRoZW0gaW50byBvdXIgcGFyYW1zLlxuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgbGlmdGVkUHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwcm9wLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUocHJvcCkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwYXJhbURlZmF1bHQgPSBwcm9wLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG5cbiAgICAgICAgICBweXRob25QYXJhbXMucHVzaChgJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX0ke3BhcmFtRGVmYXVsdH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEb2N1bWVudCB0aGVtIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgICBkb2N1bWVudGFibGVBcmdzLnB1c2goLi4ubGlmdGVkUHJvcGVydGllcyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMucGFyYW1ldGVycy5sZW5ndGggPj0gMSAmJlxuICAgICAgdGhpcy5wYXJhbWV0ZXJzW3RoaXMucGFyYW1ldGVycy5sZW5ndGggLSAxXS52YXJpYWRpY1xuICAgICkge1xuICAgICAgLy8gQW5vdGhlciBzaXR1YXRpb24gd2UgY291bGQgYmUgaW4sIGlzIHRoYXQgaW5zdGVhZCBvZiBoYXZpbmcgYSBwbGFpbiBwYXJhbWV0ZXJcbiAgICAgIC8vIHdlIGhhdmUgYSB2YXJpYWRpYyBwYXJhbWV0ZXIgd2hlcmUgd2UgbmVlZCB0byBleHBhbmQgdGhlIGxhc3QgcGFyYW1ldGVyIGFzIGFcbiAgICAgIC8vICphcmdzLlxuICAgICAgcHl0aG9uUGFyYW1zLnBvcCgpO1xuXG4gICAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gdGhpcy5wYXJhbWV0ZXJzLnNsaWNlKC0xKVswXTtcbiAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShsYXN0UGFyYW1ldGVyLm5hbWUpO1xuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShsYXN0UGFyYW1ldGVyLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAgIHB5dGhvblBhcmFtcy5wdXNoKGAqJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmICh0aGlzLmpzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgbmVlZGVkIGJlY2F1c2UgbXlweSBkb2VzIG5vdCBrbm93IGhvdyB0byBjaGVjayBkZWNvcmF0ZWQgZGVjbGFyYXRpb25zXG4gICAgICBkZWNvcmF0b3JzLnB1c2goYEBqc2lpLm1lbWJlcihqc2lpX25hbWU9XCIke3RoaXMuanNOYW1lfVwiKWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlY29yYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goYEAke3RoaXMuZGVjb3JhdG9yfWApO1xuICAgIH1cblxuICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goJ0BhYmMuYWJzdHJhY3RtZXRob2QnKTtcbiAgICB9XG5cbiAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgbmVlZGVkIGJlY2F1c2UgbXlweSBkb2VzIG5vdCBrbm93IGhvdyB0byBjaGVjayBkZWNvcmF0ZWQgZGVjbGFyYXRpb25zXG4gICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzXG4gICAgICAgIC5qb2luKCcgIyB0eXBlOiBpZ25vcmVbbWlzY11cXG4nKVxuICAgICAgICAuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIGNvZGUubGluZShkZWNvcmF0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB5dGhvblBhcmFtcy51bnNoaWZ0KFxuICAgICAgc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgICB0aGlzLmltcGxpY2l0UGFyYW1ldGVyLFxuICAgICAgICBweXRob25QYXJhbXMubWFwKChwYXJhbSkgPT4gcGFyYW0uc3BsaXQoJzonKVswXS50cmltKCkpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgb3BlblNpZ25hdHVyZShcbiAgICAgIGNvZGUsXG4gICAgICAnZGVmJyxcbiAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgIHB5dGhvblBhcmFtcyxcbiAgICAgIGZhbHNlLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5kb2NzLCB7XG4gICAgICBhcmd1bWVudHM6IGRvY3VtZW50YWJsZUFyZ3MsXG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgbWV0aG9kLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0Qm9keShcbiAgICAgIGNvZGUsXG4gICAgICBjb250ZXh0LFxuICAgICAgcmVuZGVyQWJzdHJhY3QsXG4gICAgICBmb3JjZUVtaXRCb2R5LFxuICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgcHl0aG9uUGFyYW1zWzBdLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Qm9keShcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgcmVuZGVyQWJzdHJhY3Q6IGJvb2xlYW4sXG4gICAgZm9yY2VFbWl0Qm9keTogYm9vbGVhbixcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICAgIGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZTogc3RyaW5nLFxuICApIHtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMuc2hvdWxkRW1pdEJvZHkgJiYgIWZvcmNlRW1pdEJvZHkpIHx8XG4gICAgICAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdClcbiAgICApIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmxpZnRlZFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVtaXRBdXRvUHJvcHMoY29kZSwgY29udGV4dCwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbWl0SnNpaU1ldGhvZENhbGwoXG4gICAgICAgIGNvZGUsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGxpZnRlZFByb3BOYW1lcyxcbiAgICAgICAgaW1wbGljaXRQYXJhbWV0ZXIsXG4gICAgICAgIHJldHVyblR5cGUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEF1dG9Qcm9wcyhcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgbGlmdGVkUHJvcE5hbWVzOiBTZXQ8c3RyaW5nPixcbiAgKSB7XG4gICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IHRoaXMucGFyYW1ldGVycy5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgYXJnTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShsYXN0UGFyYW1ldGVyLm5hbWUsIGxpZnRlZFByb3BOYW1lcyk7XG4gICAgY29uc3QgdHlwZU5hbWUgPSB0b1R5cGVOYW1lKGxhc3RQYXJhbWV0ZXIudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgcHJvcGVydGllcywgd2hpY2ggYXJlIG1hbmRhdG9yeSwgdGhlc2UgYXJlIHRoZVxuICAgIC8vIG9uZXMgd2Ugd2lsbCBzcGVjaWZpeSB0byBzdGFydCB3aXRoIGluIG91ciBkaWN0aW9uYXJ5IGxpdGVyYWwuXG4gICAgY29uc3QgbGlmdGVkUHJvcHMgPSB0aGlzLmdldExpZnRlZFByb3BlcnRpZXMoY29udGV4dC5yZXNvbHZlcikubWFwKFxuICAgICAgKHApID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgcCksXG4gICAgKTtcbiAgICBjb25zdCBhc3NpZ25tZW50cyA9IGxpZnRlZFByb3BzXG4gICAgICAubWFwKChwKSA9PiBwLnB5dGhvbk5hbWUpXG4gICAgICAubWFwKCh2KSA9PiBgJHt2fT0ke3Z9YCk7XG5cbiAgICBhc3NpZ25DYWxsUmVzdWx0KGNvZGUsIGFyZ05hbWUsIHR5cGVOYW1lLCBhc3NpZ25tZW50cyk7XG4gICAgY29kZS5saW5lKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRKc2lpTWV0aG9kQ2FsbChcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgbGlmdGVkUHJvcE5hbWVzOiBTZXQ8c3RyaW5nPixcbiAgICBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nLFxuICAgIHJldHVyblR5cGU6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgbWV0aG9kUHJlZml4OiBzdHJpbmcgPSB0aGlzLnJldHVybkZyb21KU0lJTWV0aG9kID8gJ3JldHVybiAnIDogJyc7XG5cbiAgICBjb25zdCBqc2lpTWV0aG9kUGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLmNsYXNzQXNGaXJzdFBhcmFtZXRlcikge1xuICAgICAgaWYgKHRoaXMucGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgbm90IGtub3duLicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpIHtcbiAgICAgICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKFxuICAgICAgICAgIHRvVHlwZU5hbWUodGhpcy5wYXJlbnQpLnB5dGhvblR5cGUoe1xuICAgICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzaW5nIHRoZSBkeW5hbWljIGNsYXNzIG9mIGBzZWxmYC5cbiAgICAgICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKGAke2ltcGxpY2l0UGFyYW1ldGVyfS5fX2NsYXNzX19gKTtcbiAgICAgIH1cbiAgICB9XG4gICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKGltcGxpY2l0UGFyYW1ldGVyKTtcbiAgICBpZiAodGhpcy5qc05hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAganNpaU1ldGhvZFBhcmFtcy5wdXNoKGBcIiR7dGhpcy5qc05hbWV9XCJgKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbGFzdCBhcmcgaXMgdmFyaWFkaWMsIGV4cGFuZCB0aGUgdHVwbGVcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiB0aGlzLnBhcmFtZXRlcnMpIHtcbiAgICAgIGxldCBleHByID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUsIGxpZnRlZFByb3BOYW1lcyk7XG4gICAgICBpZiAocGFyYW0udmFyaWFkaWMpIHtcbiAgICAgICAgZXhwciA9IGAqJHtleHByfWA7XG4gICAgICB9XG4gICAgICBwYXJhbXMucHVzaChleHByKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGBqc2lpLiR7dGhpcy5qc2lpTWV0aG9kfSgke2pzaWlNZXRob2RQYXJhbXMuam9pbihcbiAgICAgICcsICcsXG4gICAgKX0sIFske3BhcmFtcy5qb2luKCcsICcpfV0pYDtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgJHttZXRob2RQcmVmaXh9JHtcbiAgICAgICAgdGhpcy5yZXR1cm5Gcm9tSlNJSU1ldGhvZCAmJiByZXR1cm5UeXBlXG4gICAgICAgICAgPyBgdHlwaW5nLmNhc3QoJHtyZXR1cm5UeXBlfSwgJHt2YWx1ZX0pYFxuICAgICAgICAgIDogdmFsdWVcbiAgICAgIH1gLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldExpZnRlZFByb3BlcnRpZXMocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IHNwZWMuUHJvcGVydHlbXSB7XG4gICAgY29uc3QgbGlmdGVkUHJvcGVydGllczogc3BlYy5Qcm9wZXJ0eVtdID0gW107XG5cbiAgICBjb25zdCBzdGFjayA9IFt0aGlzLmxpZnRlZFByb3BdO1xuICAgIGNvbnN0IGtub3duSWZhY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qga25vd25Qcm9wcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoXG4gICAgICBsZXQgY3VycmVudCA9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICBjdXJyZW50ICE9IG51bGw7XG4gICAgICBjdXJyZW50ID0gc3RhY2suc2hpZnQoKVxuICAgICkge1xuICAgICAga25vd25JZmFjZXMuYWRkKGN1cnJlbnQuZnFuKTtcblxuICAgICAgLy8gQWRkIGFueSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBpbnRlcmZhY2UgZGVwZW5kcyBvbiwgdG8gdGhlIGxpc3QuXG4gICAgICBpZiAoY3VycmVudC5pbnRlcmZhY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiBjdXJyZW50LmludGVyZmFjZXMpIHtcbiAgICAgICAgICBpZiAoa25vd25JZmFjZXMuaGFzKGlmYWNlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2gocmVzb2x2ZXIuZGVyZWZlcmVuY2UoaWZhY2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSk7XG4gICAgICAgICAga25vd25JZmFjZXMuYWRkKGlmYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgaW50ZXJmYWNlIHRvIG91ciBsaXN0IG9mIHByb3BlcnRpZXMuXG4gICAgICBpZiAoY3VycmVudC5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGN1cnJlbnQucHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChrbm93blByb3BzLmhhcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlmdGVkUHJvcGVydGllcy5wdXNoKHByb3ApO1xuICAgICAgICAgIGtub3duUHJvcHMuYWRkKHByb3AubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGlmdGVkUHJvcGVydGllcztcbiAgfVxufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5T3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgaXNTdGF0aWM/OiBib29sZWFuO1xuICBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5RW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlUHJvcGVydHkgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1tdXRhYmxlOiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHNwZWMuT3B0aW9uYWxWYWx1ZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IEJhc2VQcm9wZXJ0eU9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgYWJzdHJhY3QgPSBmYWxzZSwgaW1tdXRhYmxlID0gZmFsc2UsIGlzU3RhdGljID0gZmFsc2UgfSA9IG9wdHM7XG5cbiAgICB0aGlzLmFic3RyYWN0ID0gYWJzdHJhY3Q7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlUHJvcGVydHlFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcbiAgICBjb25zdCBweXRob25UeXBlID0gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgaXMgbmVlZGVkIGJlY2F1c2UgbXlweSBjYW5ub3QgY2hlY2sgZGVjb3JhdGVkIHRoaW5nc1xuICAgIGNvZGUubGluZShgQCR7dGhpcy5kZWNvcmF0b3J9ICMgdHlwZTogaWdub3JlW21pc2NdYCk7XG4gICAgY29kZS5saW5lKGBAanNpaS5tZW1iZXIoanNpaV9uYW1lPVwiJHt0aGlzLmpzTmFtZX1cIilgKTtcbiAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgY29kZS5saW5lKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgfVxuICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICBjb2RlLFxuICAgICAgJ2RlZicsXG4gICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICBbdGhpcy5pbXBsaWNpdFBhcmFtZXRlcl0sXG4gICAgICB0cnVlLFxuICAgICAgcHl0aG9uVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgcHJvcC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICh0aGlzLnNob3VsZEVtaXRCb2R5IHx8IGZvcmNlRW1pdEJvZHkpICYmXG4gICAgICAoIXJlbmRlckFic3RyYWN0IHx8ICF0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIGpzaWkuJHt0aGlzLmpzaWlHZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIikpYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfVxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKCF0aGlzLmltbXV0YWJsZSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBAJHt0aGlzLnB5dGhvbk5hbWV9LnNldHRlciR7XG4gICAgICAgICAgdGhpcy5pc1N0YXRpYyA/ICcgIyB0eXBlOiBpZ25vcmVbbm8tcmVkZWZdJyA6ICcnXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICAgIGNvZGUubGluZSgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgICAgfVxuICAgICAgb3BlblNpZ25hdHVyZShcbiAgICAgICAgY29kZSxcbiAgICAgICAgJ2RlZicsXG4gICAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgICAgW3RoaXMuaW1wbGljaXRQYXJhbWV0ZXIsIGB2YWx1ZTogJHtweXRob25UeXBlfWBdLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgJ05vbmUnLFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuc2hvdWxkRW1pdEJvZHkgfHwgZm9yY2VFbWl0Qm9keSkgJiZcbiAgICAgICAgKCFyZW5kZXJBYnN0cmFjdCB8fCAhdGhpcy5hYnN0cmFjdClcbiAgICAgICkge1xuICAgICAgICBjb2RlLmxpbmUoXG4gICAgICAgICAgYGpzaWkuJHt0aGlzLmpzaWlTZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIiwgdmFsdWUpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgICB9XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgSW50ZXJmYWNlIGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmludGVyZmFjZSgnLCBbYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgXSwgJyknKTtcblxuICAgIC8vIEZpcnN0IHdlIGRvIG91ciBub3JtYWwgY2xhc3MgbG9naWMgZm9yIGVtaXR0aW5nIG91ciBtZW1iZXJzLlxuICAgIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIC8vIFRoZW4sIHdlIGhhdmUgdG8gZW1pdCBhIFByb3h5IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgb3VyIHByb3h5IGludGVyZmFjZS5cbiAgICBjb25zdCBwcm94eUJhc2VzOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKFxuICAgICAgKGIpID0+XG4gICAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBiZWNhdXNlIE15UHkgY2Fubm90IGNoZWNrIGR5bmFtaWMgYmFzZSBjbGFzc2VzIChuYXR1cmFsbHkpXG4gICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7XG4gICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG4gICAgY29kZS5saW5lKGBfX2pzaWlfdHlwZV9fOiB0eXBpbmcuQ2xhc3NWYXJbc3RyXSA9IFwiJHt0aGlzLmZxbn1cImApO1xuXG4gICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLm1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VwYXJhdGVNZW1iZXJzKSB7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCwgeyBmb3JjZUVtaXRCb2R5OiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAnIyBBZGRpbmcgYSBcIl9fanNpaV9wcm94eV9jbGFzc19fKCk6IHR5cGluZy5UeXBlXCIgZnVuY3Rpb24gdG8gdGhlIGludGVyZmFjZScsXG4gICAgKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG5cbiAgICBwYXJhbXMucHVzaCgndHlwaW5nX2V4dGVuc2lvbnMuUHJvdG9jb2wnKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBJbnRlcmZhY2VNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnaW52b2tlJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmNsYXNzIEludGVyZmFjZVByb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2J1aWx0aW5zLnByb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kOiBzdHJpbmcgPSAnZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgU3RydWN0IGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHByb3RlY3RlZCBkaXJlY3RNZW1iZXJzID0gbmV3IEFycmF5PFN0cnVjdEZpZWxkPigpO1xuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZCB7XG4gICAgaWYgKCEobWVtYmVyIGluc3RhbmNlb2YgU3RydWN0RmllbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYWRkIFN0cnVjdEZpZWxkIHRvIFN0cnVjdCcpO1xuICAgIH1cbiAgICB0aGlzLmRpcmVjdE1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBjb25zdCBiYXNlSW50ZXJmYWNlcyA9IHRoaXMuZ2V0Q2xhc3NQYXJhbXMoY29udGV4dCk7XG5cbiAgICBjb2RlLmluZGVudCgnQGpzaWkuZGF0YV90eXBlKCcpO1xuICAgIGNvZGUubGluZShganNpaV90eXBlPSR7SlNPTi5zdHJpbmdpZnkodGhpcy5mcW4pfSxgKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnanNpaV9zdHJ1Y3RfYmFzZXM9WycsIGJhc2VJbnRlcmZhY2VzLCAnXSwnKTtcbiAgICBhc3NpZ25EaWN0aW9uYXJ5KGNvZGUsICduYW1lX21hcHBpbmcnLCB0aGlzLnByb3BlcnR5TWFwKCksICcsJywgdHJ1ZSk7XG4gICAgY29kZS51bmluZGVudCgnKScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBiYXNlSW50ZXJmYWNlcyk7XG4gICAgdGhpcy5lbWl0Q29uc3RydWN0b3IoY29kZSwgY29udGV4dCk7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgdGhpcy5lbWl0R2V0dGVyKG1lbWJlciwgY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0TWFnaWNNZXRob2RzKGNvZGUpO1xuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMuYWxsTWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCBmaWVsZHMgKGluaGVyaXRlZCBhcyB3ZWxsKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYWxsTWVtYmVycygpOiBTdHJ1Y3RGaWVsZFtdIHtcbiAgICByZXR1cm4gdGhpcy50aGlzSW50ZXJmYWNlLmFsbFByb3BlcnRpZXMubWFwKFxuICAgICAgKHgpID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgeC5zcGVjKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdGhpc0ludGVyZmFjZSgpIHtcbiAgICBpZiAodGhpcy5mcW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGUU4gbm90IHNldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbS5maW5kSW50ZXJmYWNlKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5hbGxNZW1iZXJzO1xuXG4gICAgY29uc3Qga3dhcmdzID0gbWVtYmVycy5tYXAoKG0pID0+IG0uY29uc3RydWN0b3JEZWNsKGNvbnRleHQpKTtcblxuICAgIGNvbnN0IGltcGxpY2l0UGFyYW1ldGVyID0gc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgJ3NlbGYnLFxuICAgICAgbWVtYmVycy5tYXAoKG0pID0+IG0ucHl0aG9uTmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RvckFyZ3VtZW50cyA9XG4gICAgICBrd2FyZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IFtpbXBsaWNpdFBhcmFtZXRlciwgJyonLCAuLi5rd2FyZ3NdXG4gICAgICAgIDogW2ltcGxpY2l0UGFyYW1ldGVyXTtcblxuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsICdfX2luaXRfXycsIGNvbnN0cnVjdG9yQXJndW1lbnRzLCBmYWxzZSwgJ05vbmUnKTtcbiAgICB0aGlzLmVtaXRDb25zdHJ1Y3RvckRvY3N0cmluZyhjb2RlKTtcblxuICAgIC8vIFJlLXR5cGUgc3RydWN0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIFwiZGljdFwiXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0uaXNTdHJ1Y3QodGhpcy5nZW5lcmF0b3IpKSkge1xuICAgICAgLy8gTm90ZSB0aGF0IFwiTm9uZVwiIGlzIE5PVCBhbiBpbnN0YW5jZSBvZiBkaWN0ICh0aGF0J3MgY29udmVuaWVudCEpXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobWVtYmVyLnR5cGUudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29kZS5vcGVuQmxvY2soYGlmIGlzaW5zdGFuY2UoJHttZW1iZXIucHl0aG9uTmFtZX0sIGRpY3QpYCk7XG4gICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyLnB5dGhvbk5hbWV9ID0gJHt0eXBlTmFtZX0oKioke21lbWJlci5weXRob25OYW1lfSlgKTtcbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmVkIHByb3BlcnRpZXMsIHRob3NlIHdpbGwgYWx3YXlzIGJlIHB1dCBpbnRvIHRoZSBkaWN0XG4gICAgYXNzaWduRGljdGlvbmFyeShcbiAgICAgIGNvZGUsXG4gICAgICBgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX3ZhbHVlczogdHlwaW5nLkRpY3Rbc3RyLCB0eXBpbmcuQW55XWAsXG4gICAgICBtZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICFtLm9wdGlvbmFsKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChtZW1iZXIpID0+XG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke21lbWJlci5weXRob25OYW1lfWAsXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIE9wdGlvbmFsIHByb3BlcnRpZXMsIHdpbGwgb25seSBiZSBwdXQgaW50byB0aGUgZGljdCBpZiB0aGV5J3JlIG5vdCBOb25lXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0ub3B0aW9uYWwpKSB7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgaWYgJHttZW1iZXIucHl0aG9uTmFtZX0gaXMgbm90IE5vbmVgKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll92YWx1ZXNbXCIke21lbWJlci5weXRob25OYW1lfVwiXSA9ICR7bWVtYmVyLnB5dGhvbk5hbWV9YCxcbiAgICAgICk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yRG9jc3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvbnN0IGFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLmFsbE1lbWJlcnMubWFwKChtKSA9PiAoe1xuICAgICAgbmFtZTogbS5weXRob25OYW1lLFxuICAgICAgZG9jczogbS5kb2NzLFxuICAgIH0pKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuZG9jcywge1xuICAgICAgYXJndW1lbnRzOiBhcmdzLFxuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRHZXR0ZXIoXG4gICAgbWVtYmVyOiBTdHJ1Y3RGaWVsZCxcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICkge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPSBtZW1iZXIudHlwZUFubm90YXRpb24oY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoJ0BidWlsdGlucy5wcm9wZXJ0eScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsIG1lbWJlci5weXRob25OYW1lLCBbJ3NlbGYnXSwgdHJ1ZSwgcHl0aG9uVHlwZSk7XG4gICAgbWVtYmVyLmVtaXREb2NTdHJpbmcoY29kZSk7XG4gICAgY29kZS5saW5lKFxuICAgICAgYHJlc3VsdCA9IHNlbGYuX3ZhbHVlcy5nZXQoJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9KWAsXG4gICAgKTtcbiAgICBpZiAoIW1lbWJlci5vcHRpb25hbCkge1xuICAgICAgLy8gQWRkIGFuIGFzc2VydGlvbiB0byBtYXllIE15UFkgaGFwcHkhXG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBhc3NlcnQgcmVzdWx0IGlzIG5vdCBOb25lLCBcIlJlcXVpcmVkIHByb3BlcnR5ICcke21lbWJlci5weXRob25OYW1lfScgaXMgbWlzc2luZ1wiYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvZGUubGluZShgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIHJlc3VsdClgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1hZ2ljTWV0aG9kcyhjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fZXFfXyhzZWxmLCByaHM6IHR5cGluZy5BbnkpIC0+IGJ1aWx0aW5zLmJvb2wnKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAncmV0dXJuIGlzaW5zdGFuY2UocmhzLCBzZWxmLl9fY2xhc3NfXykgYW5kIHJocy5fdmFsdWVzID09IHNlbGYuX3ZhbHVlcycsXG4gICAgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19uZV9fKHNlbGYsIHJoczogdHlwaW5nLkFueSkgLT4gYnVpbHRpbnMuYm9vbCcpO1xuICAgIGNvZGUubGluZSgncmV0dXJuIG5vdCAocmhzID09IHNlbGYpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fcmVwcl9fKHNlbGYpIC0+IHN0cicpO1xuICAgIGNvZGUuaW5kZW50KGByZXR1cm4gXCIke3RoaXMucHl0aG9uTmFtZX0oJXMpXCIgJSBcIiwgXCIuam9pbihgKTtcbiAgICBjb2RlLmxpbmUoJ2sgKyBcIj1cIiArIHJlcHIodikgZm9yIGssIHYgaW4gc2VsZi5fdmFsdWVzLml0ZW1zKCknKTtcbiAgICBjb2RlLnVuaW5kZW50KCcpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIHByb3BlcnR5TWFwKCkge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5hbGxNZW1iZXJzKSB7XG4gICAgICByZXQucHVzaChcbiAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobWVtYmVyLnB5dGhvbk5hbWUpfTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtZW1iZXIuanNpaU5hbWUsXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cblxuY2xhc3MgU3RydWN0RmllbGQgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGpzaWlOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3BlYy5PcHRpb25hbFZhbHVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBwcm9wOiBzcGVjLlByb3BlcnR5LFxuICApIHtcbiAgICB0aGlzLnB5dGhvbk5hbWUgPSB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUpO1xuICAgIHRoaXMuanNpaU5hbWUgPSBwcm9wLm5hbWU7XG4gICAgdGhpcy50eXBlID0gcHJvcDtcbiAgICB0aGlzLmRvY3MgPSBwcm9wLmRvY3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9wdGlvbmFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMudHlwZS5vcHRpb25hbDtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N0cnVjdChnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1N0cnVjdChnZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbSwgdGhpcy50eXBlLnR5cGUpO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yRGVjbChjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG9wdCA9IHRoaXMub3B0aW9uYWwgPyAnID0gTm9uZScgOiAnJztcbiAgICByZXR1cm4gYCR7dGhpcy5weXRob25OYW1lfTogJHt0aGlzLnR5cGVBbm5vdGF0aW9uKHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBwYXJhbWV0ZXJUeXBlOiB0cnVlLFxuICAgIH0pfSR7b3B0fWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBQeXRob24gdHlwZSBhbm5vdGF0aW9uIGZvciB0aGlzIHR5cGVcbiAgICovXG4gIHB1YmxpYyB0eXBlQW5ub3RhdGlvbihjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucHl0aG9uVHlwZShjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0RG9jU3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgcHJvcC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IHRoaXMudHlwZUFubm90YXRpb24oY29udGV4dCk7XG4gICAgY29kZS5saW5lKGAke3RoaXMucHl0aG9uTmFtZX06ICR7cmVzb2x2ZWRUeXBlfWApO1xuICAgIHRoaXMuZW1pdERvY1N0cmluZyhjb2RlKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2xhc3NPcHRzIGV4dGVuZHMgUHl0aG9uVHlwZU9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGludGVyZmFjZXM/OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZVtdO1xuICBhYnN0cmFjdEJhc2VzPzogc3BlYy5DbGFzc1R5cGVbXTtcbn1cblxuY2xhc3MgQ2xhc3MgZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIGltcGxlbWVudHMgSVNvcnRhYmxlVHlwZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJzdHJhY3Q6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJzdHJhY3RCYXNlczogc3BlYy5DbGFzc1R5cGVbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcmZhY2VzOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZVtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgb3B0czogQ2xhc3NPcHRzLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgc3VwZXIoZ2VuZXJhdG9yLCBuYW1lLCBmcW4sIG9wdHMsIGRvY3MpO1xuXG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbnRlcmZhY2VzID0gW10sIGFic3RyYWN0QmFzZXMgPSBbXSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzO1xuICAgIHRoaXMuYWJzdHJhY3RCYXNlcyA9IGFic3RyYWN0QmFzZXM7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQeXRob25UeXBlW10ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogUHl0aG9uVHlwZVtdID0gc3VwZXIuZGVwZW5kc09uKHJlc29sdmVyKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBpZmFjZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgbW9kdWxlIGF0IHRoZSBzYW1lIGxldmVsIG9mXG4gICAgLy8gbmVzdGluZy5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBpZmFjZSBvZiB0aGlzLmludGVyZmFjZXMpIHtcbiAgICAgIGlmIChyZXNvbHZlci5pc0luTW9kdWxlKGlmYWNlKSkge1xuICAgICAgICAvLyBHaXZlbiBhIGlmYWNlLCB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgaWZhY2VzJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWVcbiAgICAgICAgLy8gYXMgb3VyIHBhcmVudCwgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF0IHRoZVxuICAgICAgICAvLyBzYW1lIGxldmVsIG9mIG91ciBvd24uXG4gICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAvLyAgICAgICBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGxldCBpZmFjZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGlmYWNlKTtcbiAgICAgICAgbGV0IGlmYWNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGlmYWNlKTtcbiAgICAgICAgd2hpbGUgKGlmYWNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICBpZmFjZUl0ZW0gPSBpZmFjZVBhcmVudDtcbiAgICAgICAgICBpZmFjZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChpZmFjZUl0ZW0uZnFuISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlZW4uaGFzKGlmYWNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGlmYWNlSXRlbSk7XG4gICAgICAgICAgc2Vlbi5hZGQoaWZhY2VJdGVtLmZxbiEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgc3VwZXIucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLCAvLyBUYWtlcyBjYXJlIG9mIGJhc2UgJiBtZW1iZXJzXG4gICAgICAuLi50aGlzLmludGVyZmFjZXMubWFwKChiYXNlKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKGJhc2UpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICAvLyBGaXJzdCB3ZSBlbWl0IG91ciBpbXBsbWVudHMgZGVjb3JhdG9yXG4gICAgaWYgKHRoaXMuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzOiBzdHJpbmdbXSA9IHRoaXMuaW50ZXJmYWNlcy5tYXAoKGIpID0+XG4gICAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICAgICk7XG4gICAgICBjb2RlLmxpbmUoYEBqc2lpLmltcGxlbWVudHMoJHtpbnRlcmZhY2VzLmpvaW4oJywgJyl9KWApO1xuICAgIH1cblxuICAgIC8vIFRoZW4gd2UgZG8gb3VyIG5vcm1hbCBjbGFzcyBsb2dpYyBmb3IgZW1pdHRpbmcgb3VyIG1lbWJlcnMuXG4gICAgc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcblxuICAgIC8vIFRoZW4sIGlmIG91ciBjbGFzcyBpcyBBYnN0cmFjdCwgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIGFuZCByZWRvIGFsbCBvZlxuICAgIC8vIHRoaXMgbG9naWMsIGV4Y2VwdCBvbmx5IGVtaXRpbmcgYWJzdHJhY3QgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcyBub25cbiAgICAvLyBhYnN0cmFjdCwgYW5kIHN1YmNsYXNzaW5nIG91ciBpbml0aWFsIGNsYXNzLlxuICAgIGlmICh0aGlzLmFic3RyYWN0KSB7XG4gICAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG5cbiAgICAgIGNvbnN0IHByb3h5QmFzZXMgPSBbdGhpcy5weXRob25OYW1lXTtcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiB0aGlzLmFic3RyYWN0QmFzZXMpIHtcbiAgICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGJlY2F1c2UgTXlQeSBjYW5ub3QgY2hlY2sgZHluYW1pYyBiYXNlIGNsYXNzZXMgKG5hdHVyYWxseSlcbiAgICAgICAgcHJveHlCYXNlcy5wdXNoKFxuICAgICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYmFzZSkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcblxuICAgICAgLy8gRmlsdGVyIG91ciBsaXN0IG9mIG1lbWJlcnMgdG8gKm9ubHkqIGJlIGFic3RyYWN0IG1lbWJlcnMsIGFuZCBub3QgYW55XG4gICAgICAvLyBvdGhlciB0eXBlcy5cbiAgICAgIGNvbnN0IGFic3RyYWN0TWVtYmVycyA9IHRoaXMubWVtYmVycy5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIChtIGluc3RhbmNlb2YgQmFzZU1ldGhvZCB8fCBtIGluc3RhbmNlb2YgQmFzZVByb3BlcnR5KSAmJiBtLmFic3RyYWN0LFxuICAgICAgKTtcbiAgICAgIGlmIChhYnN0cmFjdE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhYnN0cmFjdE1lbWJlcnMpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZXBhcmF0ZU1lbWJlcnMpIHtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQsIHsgcmVuZGVyQWJzdHJhY3Q6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICAgIH1cblxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgQWRkaW5nIGEgXCJfX2pzaWlfcHJveHlfY2xhc3NfXygpOiB0eXBpbmcuVHlwZVwiIGZ1bmN0aW9uIHRvIHRoZSBhYnN0cmFjdCBjbGFzcycsXG4gICAgICApO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG4gICAgY29uc3QgbWV0YWNsYXNzOiBzdHJpbmcgPSB0aGlzLmFic3RyYWN0ID8gJ0pTSUlBYnN0cmFjdENsYXNzJyA6ICdKU0lJTWV0YSc7XG5cbiAgICBwYXJhbXMucHVzaChgbWV0YWNsYXNzPWpzaWkuJHttZXRhY2xhc3N9YCk7XG4gICAgcGFyYW1zLnB1c2goYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBTdGF0aWNNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcj86IHN0cmluZyA9ICdidWlsdGlucy5jbGFzc21ldGhvZCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ2Nscyc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnc2ludm9rZSc7XG59XG5cbmNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2NyZWF0ZSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmV0dXJuRnJvbUpTSUlNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2ludm9rZSc7XG59XG5cbmNsYXNzIEFzeW5jTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2FpbnZva2UnO1xufVxuXG5jbGFzcyBTdGF0aWNQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdqc2lpLnB5dGhvbi5jbGFzc3Byb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnY2xzJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdzZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzc2V0Jztcbn1cblxuY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBCYXNlUHJvcGVydHkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmcgPSAnYnVpbHRpbnMucHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NldCc7XG59XG5cbmNsYXNzIEVudW0gZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcGFyYXRlTWVtYmVycyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmVudW0oJywgW2Bqc2lpX3R5cGU9XCIke3RoaXMuZnFufVwiYF0sICcpJyk7XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoX2NvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2VudW0uRW51bSddO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cbn1cblxuY2xhc3MgRW51bU1lbWJlciBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsdWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICB0aGlzLnB5dGhvbk5hbWUgPSBweXRob25OYW1lO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRzT25Nb2R1bGVzKCkge1xuICAgIHJldHVybiBuZXcgU2V0PHN0cmluZz4oKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgX2NvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29kZS5saW5lKGAke3RoaXMucHl0aG9uTmFtZX0gPSBcIiR7dGhpcy52YWx1ZX1cImApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgZW51bS0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhfY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuaW50ZXJmYWNlIE1vZHVsZU9wdHMge1xuICByZWFkb25seSBhc3NlbWJseTogc3BlYy5Bc3NlbWJseTtcbiAgcmVhZG9ubHkgYXNzZW1ibHlGaWxlbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsb2FkQXNzZW1ibHk/OiBib29sZWFuO1xuICByZWFkb25seSBwYWNrYWdlPzogUGFja2FnZTtcblxuICAvKipcbiAgICogVGhlIGRvY3N0cmluZyB0byBlbWl0IGF0IHRoZSB0b3Agb2YgdGhpcyBtb2R1bGUsIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsZURvY3VtZW50YXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHl0aG9uIG1vZHVsZVxuICpcbiAqIFdpbGwgYmUgY2FsbGVkIGZvciBqc2lpIHN1Ym1vZHVsZXMgYW5kIG5hbWVzcGFjZXMuXG4gKi9cbmNsYXNzIFB5dGhvbk1vZHVsZSBpbXBsZW1lbnRzIFB5dGhvblR5cGUge1xuICAvKipcbiAgICogQ29udmVydGVkIHRvIHB1dCBvbiB0aGUgbW9kdWxlXG4gICAqXG4gICAqIFRoZSBmb3JtYXQgaXMgaW4gbWFya2Rvd24sIHdpdGggY29kZSBzYW1wbGVzIGNvbnZlcnRlZCBmcm9tIFRTIHRvIFB5dGhvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2R1bGVEb2N1bWVudGF0aW9uPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZW1ibHk6IHNwZWMuQXNzZW1ibHk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZW1ibHlGaWxlbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRBc3NlbWJseTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1iZXJzID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVzID0gbmV3IEFycmF5PFB5dGhvbk1vZHVsZT4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0czogTW9kdWxlT3B0cyxcbiAgKSB7XG4gICAgdGhpcy5hc3NlbWJseSA9IG9wdHMuYXNzZW1ibHk7XG4gICAgdGhpcy5hc3NlbWJseUZpbGVuYW1lID0gb3B0cy5hc3NlbWJseUZpbGVuYW1lO1xuICAgIHRoaXMubG9hZEFzc2VtYmx5ID0gISFvcHRzLmxvYWRBc3NlbWJseTtcbiAgICB0aGlzLm1vZHVsZURvY3VtZW50YXRpb24gPSBvcHRzLm1vZHVsZURvY3VtZW50YXRpb247XG4gIH1cblxuICBwdWJsaWMgYWRkTWVtYmVyKG1lbWJlcjogUHl0aG9uQmFzZSkge1xuICAgIHRoaXMubWVtYmVycy5wdXNoKG1lbWJlcik7XG4gIH1cblxuICBwdWJsaWMgYWRkUHl0aG9uTW9kdWxlKHB5TW9kOiBQeXRob25Nb2R1bGUpIHtcbiAgICBhc3NlcnQoXG4gICAgICAhdGhpcy5sb2FkQXNzZW1ibHksXG4gICAgICAnUHl0aG9uTW9kdWxlLmFkZFB5dGhvbk1vZHVsZSBDQU5OT1QgYmUgY2FsbGVkIG9uIGFzc2VtYmx5LWxvYWRpbmcgbW9kdWxlcyAoaXQgd291bGQgY2F1c2UgYSBsb2FkIGN5Y2xlKSEnLFxuICAgICk7XG4gICAgdGhpcy5tb2R1bGVzLnB1c2gocHlNb2QpO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICAuLi50aGlzLm1lbWJlcnMubWFwKChtZW0pID0+IG1lbS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgdGhpcy5lbWl0TW9kdWxlRG9jdW1lbnRhdGlvbihjb2RlKTtcblxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5mcW5cbiAgICAgID8gY29udGV4dC5yZXNvbHZlci5iaW5kKHRoaXMuZnFuLCB0aGlzLnB5dGhvbk5hbWUpXG4gICAgICA6IGNvbnRleHQucmVzb2x2ZXI7XG4gICAgY29udGV4dCA9IHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBzdWJtb2R1bGU6IHRoaXMuZnFuID8/IGNvbnRleHQuc3VibW9kdWxlLFxuICAgICAgcmVzb2x2ZXIsXG4gICAgfTtcblxuICAgIC8vIEJlZm9yZSB3ZSB3cml0ZSBhbnl0aGluZyBlbHNlLCB3ZSBuZWVkIHRvIHdyaXRlIG91dCBvdXIgbW9kdWxlIGhlYWRlcnMsIHRoaXNcbiAgICAvLyBpcyB3aGVyZSB3ZSBoYW5kbGUgc3R1ZmYgbGlrZSBpbXBvcnRzLCBhbnkgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24sIGV0Yy5cbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBhYmMnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBidWlsdGlucycpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGRhdGV0aW1lJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgZW51bScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHR5cGluZycpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGpzaWknKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBwdWJsaWNhdGlvbicpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHR5cGluZ19leHRlbnNpb25zJyk7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byB3cml0ZSBvdXQgdGhlIGtlcm5lbCBsb2FkIGxpbmUuXG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICB0aGlzLmVtaXREZXBlbmRlbmN5SW1wb3J0cyhjb2RlKTtcblxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBlbWl0TGlzdChcbiAgICAgICAgY29kZSxcbiAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fID0ganNpaS5KU0lJQXNzZW1ibHkubG9hZCgnLFxuICAgICAgICBbXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS5uYW1lKSxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5LnZlcnNpb24pLFxuICAgICAgICAgICdfX25hbWVfX1swOi02XScsXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseUZpbGVuYW1lKX1gLFxuICAgICAgICBdLFxuICAgICAgICAnKScsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGVuIHdlIG11c3QgaW1wb3J0IHRoZSAuX2pzaWkgc3VicGFja2FnZS5cbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgbGV0IGRpc3RhbmNlRnJvbVJvb3QgPSAwO1xuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGN1cnIgPSB0aGlzLmZxbiE7XG4gICAgICAgIGN1cnIgIT09IHRoaXMuYXNzZW1ibHkubmFtZTtcbiAgICAgICAgY3VyciA9IGN1cnIuc3Vic3RyaW5nKDAsIGN1cnIubGFzdEluZGV4T2YoJy4nKSlcbiAgICAgICkge1xuICAgICAgICBkaXN0YW5jZUZyb21Sb290Kys7XG4gICAgICB9XG4gICAgICBjb2RlLmxpbmUoYGZyb20gJHsnLicucmVwZWF0KGRpc3RhbmNlRnJvbVJvb3QgKyAxKX1fanNpaSBpbXBvcnQgKmApO1xuXG4gICAgICB0aGlzLmVtaXRSZXF1aXJlZEltcG9ydHMoY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBhbGwgb2Ygb3VyIG1lbWJlcnMuXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgcHJlcGFyZU1lbWJlcnModGhpcy5tZW1iZXJzLCByZXNvbHZlcikpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBtZW1iZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBXaGF0ZXZlciBuYW1lcyB3ZSd2ZSBleHBvcnRlZCwgd2UnbGwgd3JpdGUgb3V0IG91ciBfX2FsbF9fIHRoYXQgbGlzdHMgdGhlbS5cbiAgICBjb25zdCBleHBvcnRlZE1lbWJlcnMgPSB0aGlzLm1lbWJlcnMubWFwKChtKSA9PiBgXCIke20ucHl0aG9uTmFtZX1cImApO1xuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgZXhwb3J0ZWRNZW1iZXJzLnB1c2goJ1wiX19qc2lpX2Fzc2VtYmx5X19cIicpO1xuICAgIH1cblxuICAgIC8vIERlY2xhcmUgdGhlIGxpc3Qgb2YgXCJwdWJsaWNcIiBtZW1iZXJzIHRoaXMgbW9kdWxlIGV4cG9ydHNcbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgIH1cbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIGlmIChleHBvcnRlZE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5pbmRlbnQoJ19fYWxsX18gPSBbJyk7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBleHBvcnRlZE1lbWJlcnMuc29ydCgpKSB7XG4gICAgICAgIC8vIFdyaXRpbmcgb25lIGJ5IGxpbmUgbWlnaHQgYmUgX2EgbG90XyBvZiBsaW5lcywgYnV0IGl0J2xsIG1ha2UgcmV2aWV3aW5nIGNoYW5nZXMgdG8gdGhlIGxpc3QgZWFzaWVyLiBUcnVzdCBtZS5cbiAgICAgICAgY29kZS5saW5lKGAke21lbWJlcn0sYCk7XG4gICAgICB9XG4gICAgICBjb2RlLnVuaW5kZW50KCddJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnX19hbGxfXzogdHlwaW5nLkxpc3RbdHlwaW5nLkFueV0gPSBbXScpO1xuICAgIH1cblxuICAgIC8vIE5leHQgdXAsIHdlJ2xsIHVzZSBwdWJsaWNhdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgb2YgdGhlIG5vbi1wdWJsaWMgbmFtZXNcbiAgICAvLyBnZXQgaGlkZGVuIGZyb20gZGlyKCksIHRhYi1jb21wbGV0ZSwgZXRjLlxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgncHVibGljYXRpb24ucHVibGlzaCgpJyk7XG5cbiAgICAvLyBGaW5hbGx5LCB3ZSdsbCBsb2FkIGFsbCByZWdpc3RlcmVkIHB5dGhvbiBtb2R1bGVzXG4gICAgaWYgKHRoaXMubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgTG9hZGluZyBtb2R1bGVzIHRvIGVuc3VyZSB0aGVpciB0eXBlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBqc2lpIHJ1bnRpbWUgbGlicmFyeScsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgdGhpcy5tb2R1bGVzLnNvcnQoKGwsIHIpID0+XG4gICAgICAgIGwucHl0aG9uTmFtZS5sb2NhbGVDb21wYXJlKHIucHl0aG9uTmFtZSksXG4gICAgICApKSB7XG4gICAgICAgIGNvZGUubGluZShgaW1wb3J0ICR7bW9kdWxlLnB5dGhvbk5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGJpbiBzY3JpcHRzIGlmIGJpbiBzZWN0aW9uIGRlZmluZWQuXG4gICAqL1xuICBwdWJsaWMgZW1pdEJpblNjcmlwdHMoY29kZTogQ29kZU1ha2VyKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNjcmlwdHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgaWYgKHRoaXMuYXNzZW1ibHkuYmluICE9IG51bGwpIHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuYXNzZW1ibHkuYmluKSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdF9maWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgJ3NyYycsXG4gICAgICAgICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSh0aGlzLnB5dGhvbk5hbWUpLFxuICAgICAgICAgICAgJ2JpbicsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5vcGVuRmlsZShzY3JpcHRfZmlsZSk7XG4gICAgICAgICAgY29kZS5saW5lKCcjIS91c3IvYmluL2VudiBweXRob24nKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJ2ltcG9ydCBqc2lpJyk7XG4gICAgICAgICAgY29kZS5saW5lKCdpbXBvcnQgc3lzJyk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgZW1pdExpc3QoXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fID0ganNpaS5KU0lJQXNzZW1ibHkubG9hZCgnLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5LnZlcnNpb24pLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnB5dGhvbk5hbWUucmVwbGFjZSgnLl9qc2lpJywgJycpKSxcbiAgICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseUZpbGVuYW1lKX1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICcpJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGVtaXRMaXN0KFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICdfX2pzaWlfYXNzZW1ibHlfXy5pbnZva2VCaW5TY3JpcHQoJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS5uYW1lKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSksXG4gICAgICAgICAgICAgICdzeXMuYXJndlsxOl0nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICcpJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvZGUuY2xvc2VGaWxlKHNjcmlwdF9maWxlKTtcbiAgICAgICAgICBzY3JpcHRzLnB1c2goc2NyaXB0X2ZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBSRUFETUUgYXMgbW9kdWxlIGRvY3N0cmluZyBpZiB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBtb2R1bGUgKGl0IGxvYWRzIHRoZSBhc3NlbWJseSlcbiAgICovXG4gIHByaXZhdGUgZW1pdE1vZHVsZURvY3VtZW50YXRpb24oY29kZTogQ29kZU1ha2VyKSB7XG4gICAgaWYgKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbikge1xuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgICAgY29kZS5saW5lKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbik7XG4gICAgICBjb2RlLmxpbmUoRE9DU1RSSU5HX1FVT1RFUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGVwZW5kZW5jeUltcG9ydHMoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIChkaXJlY3QpIGRlcGVuZGVuY2llcycgLl9qc2lpIHBhY2thZ2VzLlxuICAgIGNvbnN0IGRlcHMgPSBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgIC5tYXAoXG4gICAgICAgIChkZXApID0+XG4gICAgICAgICAgdGhpcy5hc3NlbWJseS5kZXBlbmRlbmN5Q2xvc3VyZT8uW2RlcF0/LnRhcmdldHM/LnB5dGhvbj8ubW9kdWxlID8/XG4gICAgICAgICAgZGllKGBObyBQeXRob24gdGFyZ2V0IHdhcyBjb25maWdydWVkIGZvciB0aGUgZGVwZW5kZW5jeSBcIiR7ZGVwfVwiLmApLFxuICAgICAgKVxuICAgICAgLm1hcCgobW9kKSA9PiBgJHttb2R9Ll9qc2lpYClcbiAgICAgIC5zb3J0KCk7XG5cbiAgICAvLyBOb3cgYWN0dWFsbHkgd3JpdGUgdGhlIGltcG9ydCBzdGF0ZW1lbnRzLi4uXG4gICAgaWYgKGRlcHMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZU5hbWUgb2YgZGVwcykge1xuICAgICAgICBjb2RlLmxpbmUoYGltcG9ydCAke21vZHVsZU5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVxdWlyZWRJbXBvcnRzKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCByZXF1aXJlZEltcG9ydHMgPSB0aGlzLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRJbXBvcnRzKVxuICAgICAgLm1hcCgoW3NvdXJjZVBhY2thZ2UsIGl0ZW1zXSkgPT4gdG9JbXBvcnRTdGF0ZW1lbnRzKHNvdXJjZVBhY2thZ2UsIGl0ZW1zKSlcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGVsdCkgPT4gWy4uLmFjYywgLi4uZWx0XSxcbiAgICAgICAgbmV3IEFycmF5PHsgZW1pdDogKCkgPT4gdm9pZDsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9PigpLFxuICAgICAgKVxuICAgICAgLnNvcnQoaW1wb3J0Q29tcGFyYXRvcik7XG5cbiAgICBpZiAoc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgc3RhdGVtZW50LmVtaXQoY29kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbXBvcnRTdGF0ZW1lbnRzKFxuICAgICAgc291cmNlUGtnOiBzdHJpbmcsXG4gICAgICBpdGVtczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgICApOiBBcnJheTx7IGVtaXQ6IChjb2RlOiBDb2RlTWFrZXIpID0+IHZvaWQ7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHtcbiAgICAgICAgZW1pdDogKGNvZGU6IENvZGVNYWtlcikgPT4gdm9pZDtcbiAgICAgICAgY29tcGFyaXNvbkJhc2U6IHN0cmluZztcbiAgICAgIH0+KCk7XG4gICAgICBpZiAoaXRlbXMuaGFzKCcnKSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY29tcGFyaXNvbkJhc2U6IGBpbXBvcnQgJHtzb3VyY2VQa2d9YCxcbiAgICAgICAgICBlbWl0KGNvZGUpIHtcbiAgICAgICAgICAgIGNvZGUubGluZSh0aGlzLmNvbXBhcmlzb25CYXNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBpZWNlTWVhbCA9IEFycmF5LmZyb20oaXRlbXMpXG4gICAgICAgIC5maWx0ZXIoKGkpID0+IGkgIT09ICcnKVxuICAgICAgICAuc29ydCgpO1xuICAgICAgaWYgKHBpZWNlTWVhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjb21wYXJpc29uQmFzZTogYGZyb20gJHtzb3VyY2VQa2d9IGltcG9ydGAsXG4gICAgICAgICAgZW1pdDogKGNvZGUpID0+XG4gICAgICAgICAgICBlbWl0TGlzdChjb2RlLCBgZnJvbSAke3NvdXJjZVBrZ30gaW1wb3J0IGAsIHBpZWNlTWVhbCwgJycsIHtcbiAgICAgICAgICAgICAgaWZNdWx0aTogWycoJywgJyknXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW1wb3J0Q29tcGFyYXRvcihcbiAgICAgIGxlZnQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICAgcmlnaHQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBsZWZ0LmNvbXBhcmlzb25CYXNlLnN0YXJ0c1dpdGgoJ2ltcG9ydCcpID09PVxuICAgICAgICByaWdodC5jb21wYXJpc29uQmFzZS5zdGFydHNXaXRoKCdpbXBvcnQnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBsZWZ0LmNvbXBhcmlzb25CYXNlLmxvY2FsZUNvbXBhcmUocmlnaHQuY29tcGFyaXNvbkJhc2UpO1xuICAgICAgfVxuICAgICAgLy8gV2Ugd2FudCBcImZyb20gLmZvbyBpbXBvcnQgKC4uLilcIiB0byBiZSAqYWZ0ZXIqIFwiaW1wb3J0IGJhclwiXG4gICAgICByZXR1cm4gcmlnaHQuY29tcGFyaXNvbkJhc2UubG9jYWxlQ29tcGFyZShsZWZ0LmNvbXBhcmlzb25CYXNlKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VEYXRhIHtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5jbGFzcyBQYWNrYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBQeXRob25Nb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSByb290IG1vZHVsZSBvZiB0aGUgcGFja2FnZVxuICAgKi9cbiAgcHVibGljIHJvb3RNb2R1bGU/OiBQeXRob25Nb2R1bGU7XG5cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBQeXRob25Nb2R1bGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlRGF0YVtdPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgbWV0YWRhdGE6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgcHVibGljIGFkZE1vZHVsZShtb2R1bGU6IFB5dGhvbk1vZHVsZSkge1xuICAgIHRoaXMubW9kdWxlcy5zZXQobW9kdWxlLnB5dGhvbk5hbWUsIG1vZHVsZSk7XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBtb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSBhc3NlbWJseVxuICAgIGlmIChtb2R1bGUuZnFuID09PSB0aGlzLm1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkRGF0YShcbiAgICBtb2R1bGU6IFB5dGhvbk1vZHVsZSxcbiAgICBmaWxlbmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzKG1vZHVsZS5weXRob25OYW1lKSkge1xuICAgICAgdGhpcy5kYXRhLnNldChtb2R1bGUucHl0aG9uTmFtZSwgW10pO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5nZXQobW9kdWxlLnB5dGhvbk5hbWUpIS5wdXNoKHsgZmlsZW5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5tb2R1bGVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5weXRob25OYW1lLmxvY2FsZUNvbXBhcmUoYi5weXRob25OYW1lKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG9mIG91ciBtb2R1bGVzLCBhbmQgd3JpdGUgdGhlbSBvdXQgdG8gZGlzay5cbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2R1bGVzKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihcbiAgICAgICAgJ3NyYycsXG4gICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKG1vZC5weXRob25OYW1lKSxcbiAgICAgICAgJ19faW5pdF9fLnB5JyxcbiAgICAgICk7XG5cbiAgICAgIGNvZGUub3BlbkZpbGUoZmlsZW5hbWUpO1xuICAgICAgbW9kLmVtaXQoY29kZSwgY29udGV4dCk7XG4gICAgICBjb2RlLmNsb3NlRmlsZShmaWxlbmFtZSk7XG5cbiAgICAgIHNjcmlwdHMucHVzaCguLi5tb2QuZW1pdEJpblNjcmlwdHMoY29kZSkpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvdXIgcGFja2FnZSBkYXRhLlxuICAgIGNvbnN0IHBhY2thZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFttb2QsIHBkYXRhXSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBwZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5kYXRhICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUobW9kKSxcbiAgICAgICAgICAgIGRhdGEuZmlsZW5hbWUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvZGUub3BlbkZpbGUoZmlsZXBhdGgpO1xuICAgICAgICAgIGNvZGUubGluZShkYXRhLmRhdGEpO1xuICAgICAgICAgIGNvZGUuY2xvc2VGaWxlKGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYWNrYWdlRGF0YVttb2RdID0gcGRhdGEubWFwKChwZCkgPT4gcGQuZmlsZW5hbWUpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgb3VyIGxpc3Qgb2YgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2RlcE5hbWUsIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgdGhpcy5tZXRhZGF0YS5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgKSkge1xuICAgICAgY29uc3QgZGVwSW5mbyA9IHRoaXMubWV0YWRhdGEuZGVwZW5kZW5jeUNsb3N1cmUhW2RlcE5hbWVdO1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIGAke2RlcEluZm8udGFyZ2V0cyEucHl0aG9uIS5kaXN0TmFtZX0ke3RvUHl0aG9uVmVyc2lvblJhbmdlKHZlcnNpb24pfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5lZWQgdG8gYWx3YXlzIHdyaXRlIHRoaXMgZmlsZSBhcyB0aGUgYnVpbGQgcHJvY2VzcyBkZXBlbmRzIG9uIGl0LlxuICAgIC8vIE1ha2UgdXAgc29tZSBjb250ZW50cyBpZiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHVzZWZ1bCB0byBzYXkuXG4gICAgY29kZS5vcGVuRmlsZSgnUkVBRE1FLm1kJyk7XG4gICAgY29kZS5saW5lKFxuICAgICAgdGhpcy5yb290TW9kdWxlPy5tb2R1bGVEb2N1bWVudGF0aW9uID8/XG4gICAgICAgIGAke3RoaXMubmFtZX1cXG4keyc9Jy5yZXBlYXQodGhpcy5uYW1lLmxlbmd0aCl9YCxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdSRUFETUUubWQnKTtcblxuICAgIC8vIFN0cmlwIFwiIChidWlsZCBhYmNkZWYpXCIgZnJvbSB0aGUganNpaSB2ZXJzaW9uXG4gICAgY29uc3QganNpaVZlcnNpb25TaW1wbGUgPSB0aGlzLm1ldGFkYXRhLmpzaWlWZXJzaW9uLnJlcGxhY2UoLyAuKiQvLCAnJyk7XG5cbiAgICBjb25zdCBzZXR1cEt3YXJncyA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgbGljZW5zZTogdGhpcy5tZXRhZGF0YS5saWNlbnNlLFxuICAgICAgdXJsOiB0aGlzLm1ldGFkYXRhLmhvbWVwYWdlLFxuICAgICAgbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGU6ICd0ZXh0L21hcmtkb3duJyxcbiAgICAgIGF1dGhvcjpcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5hdXRob3IubmFtZSArXG4gICAgICAgICh0aGlzLm1ldGFkYXRhLmF1dGhvci5lbWFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgPCR7dGhpcy5tZXRhZGF0YS5hdXRob3IuZW1haWx9PmBcbiAgICAgICAgICA6ICcnKSxcbiAgICAgIGJkaXN0X3doZWVsOiB7XG4gICAgICAgIHVuaXZlcnNhbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwcm9qZWN0X3VybHM6IHtcbiAgICAgICAgU291cmNlOiB0aGlzLm1ldGFkYXRhLnJlcG9zaXRvcnkudXJsLFxuICAgICAgfSxcbiAgICAgIHBhY2thZ2VfZGlyOiB7ICcnOiAnc3JjJyB9LFxuICAgICAgcGFja2FnZXM6IG1vZHVsZXMubWFwKChtKSA9PiBtLnB5dGhvbk5hbWUpLFxuICAgICAgcGFja2FnZV9kYXRhOiBwYWNrYWdlRGF0YSxcbiAgICAgIHB5dGhvbl9yZXF1aXJlczogJz49My42JyxcbiAgICAgIGluc3RhbGxfcmVxdWlyZXM6IFtcbiAgICAgICAgYGpzaWkke3RvUHl0aG9uVmVyc2lvblJhbmdlKGBeJHtqc2lpVmVyc2lvblNpbXBsZX1gKX1gLFxuICAgICAgICAncHVibGljYXRpb24+PTAuMC4zJyxcbiAgICAgIF1cbiAgICAgICAgLmNvbmNhdChkZXBlbmRlbmNpZXMpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICBjbGFzc2lmaWVyczogW1xuICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsXG4gICAgICAgICdPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IEphdmFTY3JpcHQnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMgOjogT25seScsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy42JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjcnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOCcsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy45JyxcbiAgICAgICAgJ1R5cGluZyA6OiBUeXBlZCcsXG4gICAgICBdLFxuICAgICAgc2NyaXB0cyxcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0aGlzLm1ldGFkYXRhLmRvY3M/LnN0YWJpbGl0eSkge1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw6XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA0IC0gQmV0YScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuU3RhYmxlOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKFxuICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlJyxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQ6XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA3IC0gSW5hY3RpdmUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gTm8gJ0RldmVsb3BtZW50IFN0YXR1cycgdHJvdmUgY2xhc3NpZmllciBmb3IgeW91IVxuICAgIH1cblxuICAgIGlmIChzcGR4TGljZW5zZUxpc3RbdGhpcy5tZXRhZGF0YS5saWNlbnNlXT8ub3NpQXBwcm92ZWQpIHtcbiAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0xpY2Vuc2UgOjogT1NJIEFwcHJvdmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkaXRpb25hbENsYXNzaWZpZXJzID0gdGhpcy5tZXRhZGF0YS50YXJnZXRzPy5weXRob24/LmNsYXNzaWZpZXJzO1xuICAgIGlmIChhZGRpdGlvbmFsQ2xhc3NpZmllcnMgIT0gbnVsbCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFkZGl0aW9uYWxDbGFzc2lmaWVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgXCJqc2lpLnRhcmdldHMucHl0aG9uLmNsYXNzaWZpZXJzXCIgdmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIGlmIHByb3ZpZGVkLCBidXQgZm91bmQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGFkZGl0aW9uYWxDbGFzc2lmaWVycyxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGRpc2NvdXJhZ2UgdXNpbmcgdGhvc2Ugc2luY2Ugd2UgYXV0b21hdGljYWxseSBzZXQgYSB2YWx1ZSBmb3IgdGhlbVxuICAgICAgZm9yIChsZXQgY2xhc3NpZmllciBvZiBhZGRpdGlvbmFsQ2xhc3NpZmllcnMuc29ydCgpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIFwianNpaS50YXJnZXRzLnB5dGhvbi5jbGFzc2lmaWVyc1wiIHZhbHVlIGNhbiBvbmx5IGNvbnRhaW4gc3RyaW5ncywgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIGNsYXNzaWZpZXIsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSdsbCBzcGxpdCBvbiBgOjpgIGFuZCByZS1qb2luIGxhdGVyIHNvIGNsYXNzaWZpZXJzIGFyZSBcIm5vcm1hbGl6ZWRcIiB0byBhIHN0YW5kYXJkIHNwYWNpbmdcbiAgICAgICAgY29uc3QgcGFydHMgPSBjbGFzc2lmaWVyLnNwbGl0KCc6OicpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpO1xuICAgICAgICBjb25zdCByZXNlcnZlZENsYXNzaWZpZXJzID0gW1xuICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMnLFxuICAgICAgICAgICdMaWNlbnNlJyxcbiAgICAgICAgICAnT3BlcmF0aW5nIFN5c3RlbScsXG4gICAgICAgICAgJ1R5cGluZycsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChyZXNlcnZlZENsYXNzaWZpZXJzLmluY2x1ZGVzKHBhcnRzWzBdKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBgQ2xhc3NpZmllcnMgc3RhcnRpbmcgd2l0aCAke3Jlc2VydmVkQ2xhc3NpZmllcnNcbiAgICAgICAgICAgICAgLm1hcCgoeCkgPT4gYFwiJHt4fSA6OlwiYClcbiAgICAgICAgICAgICAgLmpvaW4oXG4gICAgICAgICAgICAgICAgJywgJyxcbiAgICAgICAgICAgICAgKX0gYXJlIGF1dG9tYXRpY2FsbHkgc2V0IGFuZCBzaG91bGQgbm90IGJlIG1hbnVhbGx5IGNvbmZpZ3VyZWRgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2xhc3NpZmllciA9IHBhcnRzLmpvaW4oJyA6OiAnKTtcbiAgICAgICAgaWYgKHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLmluY2x1ZGVzKGNsYXNzaWZpZXIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaChjbGFzc2lmaWVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBOZWVkIGEgc2V0dXAucHkgdG8gbWFrZSB0aGlzIFBhY2thZ2UsIGFjdHVhbGx5IGEgUGFja2FnZS5cbiAgICBjb2RlLm9wZW5GaWxlKCdzZXR1cC5weScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGpzb24nKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBzZXR1cHRvb2xzJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdrd2FyZ3MgPSBqc29uLmxvYWRzKCcpO1xuICAgIGNvZGUubGluZSgnICAgIFwiXCJcIicpO1xuICAgIGNvZGUubGluZShKU09OLnN0cmluZ2lmeShzZXR1cEt3YXJncywgbnVsbCwgNCkpO1xuICAgIGNvZGUubGluZSgnXCJcIlwiJyk7XG4gICAgY29kZS5saW5lKCcpJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ3dpdGggb3BlbihcIlJFQURNRS5tZFwiLCBlbmNvZGluZz1cInV0ZjhcIikgYXMgZnAnKTtcbiAgICBjb2RlLmxpbmUoJ2t3YXJnc1tcImxvbmdfZGVzY3JpcHRpb25cIl0gPSBmcC5yZWFkKCknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoJ3NldHVwdG9vbHMuc2V0dXAoKiprd2FyZ3MpJyk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ3NldHVwLnB5Jyk7XG5cbiAgICAvLyBCZWNhdXNlIHdlJ3JlIGdvb2QgY2l0aXplbnMsIHdlJ3JlIGdvaW5nIHRvIGdvIGFoZWFkIGFuZCBzdXBwb3J0IHB5cHJvamVjdC50b21sXG4gICAgLy8gYXMgd2VsbC5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBlYXNpZXIgdG8ganVzdCB1c2UgYSBUT01MIGxpYnJhcnkgdG8gd3JpdGUgdGhpcyBvdXQuXG4gICAgY29kZS5vcGVuRmlsZSgncHlwcm9qZWN0LnRvbWwnKTtcbiAgICBjb2RlLmxpbmUoJ1tidWlsZC1zeXN0ZW1dJyk7XG4gICAgY29uc3QgYnVpbGRUb29scyA9IGZzXG4gICAgICAucmVhZEZpbGVTeW5jKHJlcXVpcmVtZW50c0ZpbGUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IC9eXFxzKiguKylcXHMqI1xccypidWlsZC1zeXN0ZW1cXHMqJC8uZXhlYyhsaW5lKT8uWzFdPy50cmltKCkpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYnVpbGRUb29scywgZW50cnkpID0+IChlbnRyeSA/IFsuLi5idWlsZFRvb2xzLCBlbnRyeV0gOiBidWlsZFRvb2xzKSxcbiAgICAgICAgbmV3IEFycmF5PHN0cmluZz4oKSxcbiAgICAgICk7XG4gICAgY29kZS5saW5lKGByZXF1aXJlcyA9IFske2J1aWxkVG9vbHMubWFwKCh4KSA9PiBgXCIke3h9XCJgKS5qb2luKCcsICcpfV1gKTtcbiAgICBjb2RlLmxpbmUoJ2J1aWxkLWJhY2tlbmQgPSBcInNldHVwdG9vbHMuYnVpbGRfbWV0YVwiJyk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ3B5cHJvamVjdC50b21sJyk7XG5cbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd3JpdGUgb3V0IGEgTUFOSUZFU1QuaW4gdG8gZW5zdXJlIHRoYXQgYWxsIG9mIG91ciByZXF1aXJlZFxuICAgIC8vIGZpbGVzIGFyZSBpbmNsdWRlZC5cbiAgICBjb2RlLm9wZW5GaWxlKCdNQU5JRkVTVC5pbicpO1xuICAgIGNvZGUubGluZSgnaW5jbHVkZSBweXByb2plY3QudG9tbCcpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdNQU5JRkVTVC5pbicpO1xuICB9XG59XG5cbnR5cGUgRmluZE1vZHVsZUNhbGxiYWNrID0gKGZxbjogc3RyaW5nKSA9PiBzcGVjLkFzc2VtYmx5Q29uZmlndXJhdGlvbjtcbnR5cGUgRmluZFR5cGVDYWxsYmFjayA9IChmcW46IHN0cmluZykgPT4gc3BlYy5UeXBlO1xuXG5jbGFzcyBUeXBlUmVzb2x2ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZFRvPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kUmUhOiBSZWdFeHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlTmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZSE6IFJlZ0V4cDtcbiAgcHJpdmF0ZSByZWFkb25seSBmaW5kTW9kdWxlOiBGaW5kTW9kdWxlQ2FsbGJhY2s7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZFR5cGU6IEZpbmRUeXBlQ2FsbGJhY2s7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPixcbiAgICBmaW5kTW9kdWxlOiBGaW5kTW9kdWxlQ2FsbGJhY2ssXG4gICAgZmluZFR5cGU6IEZpbmRUeXBlQ2FsbGJhY2ssXG4gICAgYm91bmRUbz86IHN0cmluZyxcbiAgICBtb2R1bGVOYW1lPzogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgdGhpcy5maW5kTW9kdWxlID0gZmluZE1vZHVsZTtcbiAgICB0aGlzLmZpbmRUeXBlID0gZmluZFR5cGU7XG4gICAgdGhpcy5tb2R1bGVOYW1lID0gbW9kdWxlTmFtZTtcbiAgICB0aGlzLmJvdW5kVG8gPSBib3VuZFRvICE9PSB1bmRlZmluZWQgPyB0aGlzLnRvUHl0aG9uRlFOKGJvdW5kVG8pIDogYm91bmRUbztcblxuICAgIGlmICh0aGlzLm1vZHVsZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tb2R1bGVSZSA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKHRoaXMubW9kdWxlTmFtZSl9KVxcXFwuKC4rKSRgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ib3VuZFRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYm91bmRSZSA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKHRoaXMuYm91bmRUbyl9KVxcXFwuKC4rKSRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYmluZChmcW46IHN0cmluZywgbW9kdWxlTmFtZT86IHN0cmluZyk6IFR5cGVSZXNvbHZlciB7XG4gICAgcmV0dXJuIG5ldyBUeXBlUmVzb2x2ZXIoXG4gICAgICB0aGlzLnR5cGVzLFxuICAgICAgdGhpcy5maW5kTW9kdWxlLFxuICAgICAgdGhpcy5maW5kVHlwZSxcbiAgICAgIGZxbixcbiAgICAgIG1vZHVsZU5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG1vZHVsZU5hbWUuc3RhcnRzV2l0aCgnLicpXG4gICAgICAgICAgPyBgJHt0aGlzLm1vZHVsZU5hbWV9JHttb2R1bGVOYW1lfWBcbiAgICAgICAgICA6IG1vZHVsZU5hbWVcbiAgICAgICAgOiB0aGlzLm1vZHVsZU5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luTW9kdWxlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9XG4gICAgICB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0aGlzLnRvUHl0aG9uRlFOKHR5cGVSZWYuZnFuKSA6IHR5cGVSZWY7XG4gICAgcmV0dXJuIHRoaXMubW9kdWxlUmUudGVzdChweXRob25UeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luTmFtZXNwYWNlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9XG4gICAgICB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0aGlzLnRvUHl0aG9uRlFOKHR5cGVSZWYuZnFuKSA6IHR5cGVSZWY7XG4gICAgcmV0dXJuIHRoaXMuYm91bmRSZS50ZXN0KHB5dGhvblR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmVudCh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIGNvbnN0IGZxbiA9IHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJyA/IHR5cGVSZWYuZnFuIDogdHlwZVJlZjtcbiAgICBjb25zdCBtYXRjaGVzID0gL14oLispXFwuW14uXSskLy5leGVjKGZxbik7XG4gICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEZRTjogJHtmcW59YCk7XG4gICAgfVxuICAgIGNvbnN0IFssIHBhcmVudEZRTl0gPSBtYXRjaGVzO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHlwZXMuZ2V0KHBhcmVudEZRTik7XG5cbiAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgcGFyZW50OiAgJHtwYXJlbnRGUU59YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWZpbmluZ1B5dGhvbk1vZHVsZShcbiAgICB0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBmcW4gPSB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0eXBlUmVmLmZxbiA6IHR5cGVSZWY7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy50eXBlcy5nZXQoZnFuKTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGxldCBtb2QgPSBwYXJlbnQ7XG4gICAgICB3aGlsZSAoIShtb2QgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSB7XG4gICAgICAgIG1vZCA9IHRoaXMuZ2V0UGFyZW50KG1vZC5mcW4hKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtb2QucHl0aG9uTmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaGVzID0gL14oW14uXSspXFwuLy5leGVjKGZxbik7XG4gICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEZRTjogJHtmcW59YCk7XG4gICAgfVxuICAgIGNvbnN0IFssIGFzc21dID0gbWF0Y2hlcztcbiAgICByZXR1cm4gdGhpcy5maW5kTW9kdWxlKGFzc20pLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlO1xuICB9XG5cbiAgcHVibGljIGdldFR5cGUodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlcy5nZXQodHlwZVJlZi5mcW4pO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIHR5cGU6IFwiJHt0eXBlUmVmLmZxbn1cImApO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHVibGljIGRlcmVmZXJlbmNlKHR5cGVSZWY6IHN0cmluZyB8IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKTogc3BlYy5UeXBlIHtcbiAgICBpZiAodHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0eXBlUmVmID0gdHlwZVJlZi5mcW47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmRUeXBlKHR5cGVSZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1B5dGhvbkZRTihmcW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgW2Fzc2VtYmx5TmFtZSwgLi4ucXVhbGlmaWVkSWRlbnRpZmllcnNdID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZnFuUGFydHM6IHN0cmluZ1tdID0gW1xuICAgICAgdGhpcy5maW5kTW9kdWxlKGFzc2VtYmx5TmFtZSkudGFyZ2V0cyEucHl0aG9uIS5tb2R1bGUsXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBxdWFsaWZpZWRJZGVudGlmaWVycykge1xuICAgICAgZnFuUGFydHMucHVzaCh0b1B5dGhvbklkZW50aWZpZXIocGFydCkpO1xuICAgIH1cblxuICAgIHJldHVybiBmcW5QYXJ0cy5qb2luKCcuJyk7XG4gIH1cbn1cblxuY2xhc3MgUHl0aG9uR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHtcbiAgcHJpdmF0ZSBwYWNrYWdlITogUGFja2FnZTtcbiAgcHJpdmF0ZSByb290TW9kdWxlPzogUHl0aG9uTW9kdWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3NldHRhOiBSb3NldHRhLFxuICAgIG9wdGlvbnM6IEdlbmVyYXRvck9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrRm9ybWF0dGVyID0gKHMpID0+IGAke3N9OmA7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2tGb3JtYXR0ZXIgPSAoX3MpID0+IGZhbHNlO1xuXG4gICAgdGhpcy50eXBlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHB1YmxpYyBlbWl0RG9jU3RyaW5nKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczoge1xuICAgICAgYXJndW1lbnRzPzogRG9jdW1lbnRhYmxlQXJndW1lbnRbXTtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW0/OiBzdHJpbmc7XG4gICAgICB0cmFpbGluZ05ld0xpbmU/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgaWYgKCghZG9jcyB8fCBPYmplY3Qua2V5cyhkb2NzKS5sZW5ndGggPT09IDApICYmICFvcHRpb25zLmFyZ3VtZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRvY3MpIHtcbiAgICAgIGRvY3MgPSB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAoZG9jcy5zdW1tYXJ5KSB7XG4gICAgICBsaW5lcy5wdXNoKG1kMnJzdChyZW5kZXJTdW1tYXJ5KGRvY3MpKSk7XG4gICAgICBicmsoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnJrKCkge1xuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0udHJpbSgpICE9PSAnJykge1xuICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBibG9jayhoZWFkaW5nOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZG9CcmsgPSB0cnVlKSB7XG4gICAgICBpZiAoZG9CcmspIHtcbiAgICAgICAgYnJrKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb250ZW50TGluZXMgPSBtZDJyc3QoY29udGVudCkuc3BsaXQoJ1xcbicpO1xuICAgICAgaWYgKGNvbnRlbnRMaW5lcy5sZW5ndGggPD0gMSkge1xuICAgICAgICBsaW5lcy5wdXNoKGA6JHtoZWFkaW5nfTogJHtjb250ZW50TGluZXMuam9pbignJyl9YC50cmltKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgOiR7aGVhZGluZ306YCk7XG4gICAgICAgIGJyaygpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudExpbmVzKSB7XG4gICAgICAgICAgbGluZXMucHVzaChsaW5lLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkb0Jyaykge1xuICAgICAgICBicmsoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZG9jcy5yZW1hcmtzKSB7XG4gICAgICBicmsoKTtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIC4uLm1kMnJzdCh0aGlzLmNvbnZlcnRNYXJrZG93bihkb2NzLnJlbWFya3MgPz8gJycpKS5zcGxpdCgnXFxuJyksXG4gICAgICApO1xuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXJndW1lbnRzPy5sZW5ndGggPz8gMCA+IDApIHtcbiAgICAgIGJyaygpO1xuICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBvcHRpb25zLmFyZ3VtZW50cyEpIHtcbiAgICAgICAgLy8gQWRkIGEgbGluZSBmb3IgZXZlcnkgYXJndW1lbnQuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRpb24sIHdlIG5lZWRcbiAgICAgICAgLy8gdGhlIGRvY3N0cmluZyBzbyB0aGF0IHRoZSBTcGhpbnggZXh0ZW5zaW9uIGNhbiBhZGQgdGhlIHR5cGUgYW5ub3RhdGlvbnMuXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYDpwYXJhbSAke3RvUHl0aG9uUGFyYW1ldGVyTmFtZShwYXJhbS5uYW1lKX06ICR7b25lbGluZURlc2NyaXB0aW9uKFxuICAgICAgICAgICAgcGFyYW0uZG9jcyxcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgICBibG9jaygnZGVmYXVsdCcsIGRvY3MuZGVmYXVsdCk7XG4gICAgfVxuICAgIGlmIChkb2NzLnJldHVybnMpIHtcbiAgICAgIGJsb2NrKCdyZXR1cm4nLCBkb2NzLnJldHVybnMpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5kZXByZWNhdGVkKSB7XG4gICAgICBibG9jaygnZGVwcmVjYXRlZCcsIGRvY3MuZGVwcmVjYXRlZCk7XG4gICAgfVxuICAgIGlmIChkb2NzLnNlZSkge1xuICAgICAgYmxvY2soJ3NlZScsIGRvY3Muc2VlLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkb2NzLnN0YWJpbGl0eSAmJiBzaG91bGRNZW50aW9uU3RhYmlsaXR5KGRvY3Muc3RhYmlsaXR5KSkge1xuICAgICAgYmxvY2soJ3N0YWJpbGl0eScsIGRvY3Muc3RhYmlsaXR5LCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkb2NzLnN1YmNsYXNzYWJsZSkge1xuICAgICAgYmxvY2soJ3N1YmNsYXNzYWJsZScsICdZZXMnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhkb2NzLmN1c3RvbSA/PyB7fSkpIHtcbiAgICAgIGJsb2NrKGssIHYsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5leGFtcGxlKSB7XG4gICAgICBicmsoKTtcbiAgICAgIGxpbmVzLnB1c2goJ0V4YW1wbGU6OicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBjb25zdCBleGFtcGxlVGV4dCA9IHRoaXMuY29udmVydEV4YW1wbGUoZG9jcy5leGFtcGxlKTtcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGV4YW1wbGVUZXh0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgJHtsaW5lfWApO1xuICAgICAgfVxuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09ICcnKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29kZS5saW5lKGAke0RPQ1NUUklOR19RVU9URVN9JHtsaW5lc1swXX0ke0RPQ1NUUklOR19RVU9URVN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZShgJHtET0NTVFJJTkdfUVVPVEVTfSR7bGluZXNbMF19YCk7XG4gICAgICBsaW5lcy5zcGxpY2UoMCwgMSk7XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb2RlLmxpbmUobGluZSk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudHJhaWxpbmdOZXdMaW5lKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29udmVydEV4YW1wbGUoZXhhbXBsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzbmlwcGV0ID0gdHlwZVNjcmlwdFNuaXBwZXRGcm9tU291cmNlKFxuICAgICAgZXhhbXBsZSxcbiAgICAgICdleGFtcGxlJyxcbiAgICAgIGVuZm9yY2VzU3RyaWN0TW9kZSh0aGlzLmFzc2VtYmx5KSxcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJvc2V0dGEudHJhbnNsYXRlU25pcHBldChcbiAgICAgIHNuaXBwZXQsXG4gICAgICBUYXJnZXRMYW5ndWFnZS5QWVRIT04sXG4gICAgKTtcbiAgICBpZiAoIXRyYW5zbGF0ZWQpIHtcbiAgICAgIHJldHVybiBleGFtcGxlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQpO1xuICB9XG5cbiAgcHVibGljIGNvbnZlcnRNYXJrZG93bihtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZVNuaXBwZXRzSW5NYXJrZG93bihcbiAgICAgIG1hcmtkb3duLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICAgKHRyYW5zKSA9PiAoe1xuICAgICAgICBsYW5ndWFnZTogdHJhbnMubGFuZ3VhZ2UsXG4gICAgICAgIHNvdXJjZTogdGhpcy5wcmVmaXhEaXNjbGFpbWVyKHRyYW5zKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByZWZpeERpc2NsYWltZXIodHJhbnNsYXRlZDogVHJhbnNsYXRpb24pIHtcbiAgICBpZiAodHJhbnNsYXRlZC5kaWRDb21waWxlICYmIElOQ09NUExFVEVfRElTQ0xBSU1FUl9DT01QSUxJTkcpIHtcbiAgICAgIHJldHVybiBgIyAke0lOQ09NUExFVEVfRElTQ0xBSU1FUl9DT01QSUxJTkd9XFxuJHt0cmFuc2xhdGVkLnNvdXJjZX1gO1xuICAgIH1cbiAgICBpZiAoIXRyYW5zbGF0ZWQuZGlkQ29tcGlsZSAmJiBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HKSB7XG4gICAgICByZXR1cm4gYCMgJHtJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HfVxcbiR7dHJhbnNsYXRlZC5zb3VyY2V9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldFB5dGhvblR5cGUoZnFuOiBzdHJpbmcpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlcy5nZXQoZnFuKTtcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvY2F0ZSB0eXBlOiBcIiR7ZnFufVwiYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXNzZW1ibHlPdXRwdXREaXIoYXNzbTogc3BlYy5Bc3NlbWJseSkge1xuICAgIHJldHVybiBwYXRoLmpvaW4oXG4gICAgICAnc3JjJyxcbiAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKHRoaXMuZ2V0QXNzZW1ibHlNb2R1bGVOYW1lKGFzc20pKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5Bc3NlbWJseShhc3NtOiBzcGVjLkFzc2VtYmx5LCBfZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnBhY2thZ2UgPSBuZXcgUGFja2FnZShcbiAgICAgIGFzc20udGFyZ2V0cyEucHl0aG9uIS5kaXN0TmFtZSxcbiAgICAgIHRvUmVsZWFzZVZlcnNpb24oYXNzbS52ZXJzaW9uLCBUYXJnZXROYW1lLlBZVEhPTiksXG4gICAgICBhc3NtLFxuICAgICk7XG5cbiAgICAvLyBUaGlzIGlzIHRoZSAnPHBhY2thZ2VuYW1lPi5fanNpaScgbW9kdWxlIGZvciB0aGlzIGFzc2VtYmx5XG4gICAgY29uc3QgYXNzZW1ibHlNb2R1bGUgPSBuZXcgUHl0aG9uTW9kdWxlKFxuICAgICAgdGhpcy5nZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbSksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGFzc2VtYmx5OiBhc3NtLFxuICAgICAgICBhc3NlbWJseUZpbGVuYW1lOiB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSxcbiAgICAgICAgbG9hZEFzc2VtYmx5OiB0cnVlLFxuICAgICAgICBwYWNrYWdlOiB0aGlzLnBhY2thZ2UsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkTW9kdWxlKGFzc2VtYmx5TW9kdWxlKTtcbiAgICB0aGlzLnBhY2thZ2UuYWRkRGF0YShhc3NlbWJseU1vZHVsZSwgdGhpcy5nZXRBc3NlbWJseUZpbGVOYW1lKCksIHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRBc3NlbWJseShhc3NtOiBzcGVjLkFzc2VtYmx5LCBfZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUeXBlUmVzb2x2ZXIoXG4gICAgICB0aGlzLnR5cGVzLFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRNb2R1bGUoZnFuKSxcbiAgICAgIChmcW46IHN0cmluZykgPT4gdGhpcy5maW5kVHlwZShmcW4pLFxuICAgICk7XG4gICAgdGhpcy5wYWNrYWdlLndyaXRlKHRoaXMuY29kZSwge1xuICAgICAgYXNzZW1ibHk6IGFzc20sXG4gICAgICBlbWl0dGVkVHlwZXM6IG5ldyBTZXQoKSxcbiAgICAgIHJlc29sdmVyLFxuICAgICAgc3VibW9kdWxlOiBhc3NtLm5hbWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCBiZSBjYWxsZWQgZm9yIGFzc2VtYmx5IHJvb3QsIG5hbWVzcGFjZXMgYW5kIHN1Ym1vZHVsZXMgKGFueXRoaW5nIHRoYXQgY29udGFpbnMgb3RoZXIgdHlwZXMsIGJhc2VkIG9uIGl0cyBGUU4pXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CZWdpbk5hbWVzcGFjZShuczogc3RyaW5nKSB7XG4gICAgLy8gJ25zJyBjb250YWlucyBzb21ldGhpbmcgbGlrZSAnQHNjb3BlL2pzaWktY2FsYy1iYXNlLW9mLWJhc2UnXG4gICAgY29uc3Qgc3VibW9kdWxlTGlrZSA9XG4gICAgICBucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lXG4gICAgICAgID8gdGhpcy5hc3NlbWJseVxuICAgICAgICA6IHRoaXMuYXNzZW1ibHkuc3VibW9kdWxlcz8uW25zXTtcblxuICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBQeXRob25Nb2R1bGUodG9QYWNrYWdlTmFtZShucywgdGhpcy5hc3NlbWJseSksIG5zLCB7XG4gICAgICBhc3NlbWJseTogdGhpcy5hc3NlbWJseSxcbiAgICAgIGFzc2VtYmx5RmlsZW5hbWU6IHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLFxuICAgICAgcGFja2FnZTogdGhpcy5wYWNrYWdlLFxuICAgICAgbW9kdWxlRG9jdW1lbnRhdGlvbjogc3VibW9kdWxlTGlrZT8ucmVhZG1lXG4gICAgICAgID8gdGhpcy5jb252ZXJ0TWFya2Rvd24oc3VibW9kdWxlTGlrZS5yZWFkbWU/Lm1hcmtkb3duKS50cmltKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkTW9kdWxlKG1vZHVsZSk7XG4gICAgdGhpcy50eXBlcy5zZXQobnMsIG1vZHVsZSk7XG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIC8vIFRoaXMgYXBwbGllcyByZWN1cnNpdmVseSB0byBzdWJtb2R1bGVzLCBzbyBubyBuZWVkIHRvIGR1cGxpY2F0ZSFcbiAgICAgIHRoaXMucGFja2FnZS5hZGREYXRhKG1vZHVsZSwgJ3B5LnR5cGVkJywgJycpO1xuICAgIH1cblxuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSEuYWRkUHl0aG9uTW9kdWxlKG1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdE1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2xhc3MgPSBuZXcgQ2xhc3MoXG4gICAgICB0aGlzLFxuICAgICAgdG9QeXRob25JZGVudGlmaWVyKGNscy5uYW1lKSxcbiAgICAgIGNscy5mcW4sXG4gICAgICB7XG4gICAgICAgIGFic3RyYWN0LFxuICAgICAgICBiYXNlczogY2xzLmJhc2UgPyBbdGhpcy5maW5kVHlwZShjbHMuYmFzZSldIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcmZhY2VzOiBjbHMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSxcbiAgICAgICAgYWJzdHJhY3RCYXNlczogYWJzdHJhY3QgPyB0aGlzLmdldEFic3RyYWN0QmFzZXMoY2xzKSA6IFtdLFxuICAgICAgfSxcbiAgICAgIGNscy5kb2NzLFxuICAgICk7XG5cbiAgICBpZiAoY2xzLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBjbHMuaW5pdGlhbGl6ZXI7XG5cbiAgICAgIGtsYXNzLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEluaXRpYWxpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgJ19faW5pdF9fJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY2xzLmluaXRpYWxpemVyLmRvY3MsXG4gICAgICAgICAgZmFsc2UsIC8vIE5ldmVyIHN0YXRpY1xuICAgICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKGNscy5pbml0aWFsaXplciksIHBhcmVudDogY2xzIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShrbGFzcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY01ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgdHJ1ZSwgLy8gQWx3YXlzIHN0YXRpY1xuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY1Byb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY1Byb3BlcnR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUsIHByb3AuY29uc3QpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gbWV0aG9kO1xuXG4gICAgaWYgKG1ldGhvZC5hc3luYykge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEFzeW5jTWV0aG9kKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IE1ldGhvZChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSwgbWV0aG9kLnByb3RlY3RlZCksXG4gICAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCwgcHJvcC5wcm90ZWN0ZWQpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVW5pb25Qcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uOiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5vblByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIGxldCBpZmFjZTogSW50ZXJmYWNlIHwgU3RydWN0O1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2UgPSBuZXcgU3RydWN0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMuZnFuLFxuICAgICAgICB7IGJhc2VzOiBpZmMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSB9LFxuICAgICAgICBpZmMuZG9jcyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmYWNlID0gbmV3IEludGVyZmFjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25JZGVudGlmaWVyKGlmYy5uYW1lKSxcbiAgICAgICAgaWZjLmZxbixcbiAgICAgICAgeyBiYXNlczogaWZjLmludGVyZmFjZXM/Lm1hcCgoYmFzZSkgPT4gdGhpcy5maW5kVHlwZShiYXNlKSkgfSxcbiAgICAgICAgaWZjLmRvY3MsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShpZmFjZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRJbnRlcmZhY2UoX2lmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IG1ldGhvZDtcblxuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShpZmMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgSW50ZXJmYWNlTWV0aG9kKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUsIG1ldGhvZC5wcm90ZWN0ZWQpLFxuICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksIHBhcmVudDogaWZjIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VQcm9wZXJ0eShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIGxldCBpZmFjZVByb3BlcnR5OiBJbnRlcmZhY2VQcm9wZXJ0eSB8IFN0cnVjdEZpZWxkO1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLCBwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBJbnRlcmZhY2VQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0LCBwcm9wLnByb3RlY3RlZCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7IGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsIGlzU3RhdGljOiBwcm9wLnN0YXRpYywgcGFyZW50OiBpZmMgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGlmYy5mcW4pLmFkZE1lbWJlcihpZmFjZVByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoXG4gICAgICBuZXcgRW51bSh0aGlzLCB0b1B5dGhvbklkZW50aWZpZXIoZW5tLm5hbWUpLCBlbm0uZnFuLCB7fSwgZW5tLmRvY3MpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbnVtTWVtYmVyKGVubTogc3BlYy5FbnVtVHlwZSwgbWVtYmVyOiBzcGVjLkVudW1NZW1iZXIpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoZW5tLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IEVudW1NZW1iZXIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uSWRlbnRpZmllcihtZW1iZXIubmFtZSksXG4gICAgICAgIG1lbWJlci5uYW1lLFxuICAgICAgICBtZW1iZXIuZG9jcyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZE92ZXJsb2FkKFxuICAgIF9pZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IEludGVyZmFjZU1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IE1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IFN0YXRpY01ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtOiBzcGVjLkFzc2VtYmx5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXNzbS50YXJnZXRzIS5weXRob24hLm1vZHVsZX0uX2pzaWlgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJlbnRGUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG0gPSAvXiguKylcXC5bXi5dKyQvLmV4ZWMoZnFuKTtcblxuICAgIGlmIChtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwYXJlbnQgRlFOIG9mOiAke2Zxbn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbVsxXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyZW50KGZxbjogc3RyaW5nKTogUHl0aG9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHl0aG9uVHlwZSh0aGlzLmdldFBhcmVudEZRTihmcW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHl0aG9uVHlwZSh0eXBlOiBQeXRob25UeXBlKSB7XG4gICAgaWYgKHR5cGUuZnFuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBhIFB5dGhvbiB0eXBlIHdpdGhvdXQgYSBGUU4uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQYXJlbnQodHlwZS5mcW4pLmFkZE1lbWJlcih0eXBlKTtcbiAgICB0aGlzLnR5cGVzLnNldCh0eXBlLmZxbiwgdHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldGxpZnRlZFByb3AoXG4gICAgbWV0aG9kOiBzcGVjLk1ldGhvZCB8IHNwZWMuSW5pdGlhbGl6ZXIsXG4gICk6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gSWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gdGhpcyBtZXRob2QsIGFuZCBpZiB0aGUgbGFzdCBwYXJhbWV0ZXIncyB0eXBlIGlzXG4gICAgLy8gYSBkYXRhdHlwZSBpbnRlcmZhY2UsIHRoZW4gd2Ugd2FudCB0byBsaWZ0IHRoZSBtZW1iZXJzIG9mIHRoYXQgbGFzdCBwYXJhbXRlclxuICAgIC8vIGFzIGtleXdvcmQgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgaWYgKG1ldGhvZC5wYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCA+PSAxKSB7XG4gICAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gbWV0aG9kLnBhcmFtZXRlcnMhLnNsaWNlKC0xKVswXTtcbiAgICAgIGlmIChcbiAgICAgICAgIWxhc3RQYXJhbWV0ZXIudmFyaWFkaWMgJiZcbiAgICAgICAgc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShsYXN0UGFyYW1ldGVyLnR5cGUpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbGFzdFBhcmFtZXRlclR5cGUgPSB0aGlzLmZpbmRUeXBlKGxhc3RQYXJhbWV0ZXIudHlwZS5mcW4pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3BlYy5pc0ludGVyZmFjZVR5cGUobGFzdFBhcmFtZXRlclR5cGUpICYmXG4gICAgICAgICAgbGFzdFBhcmFtZXRlclR5cGUuZGF0YXR5cGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGxhc3RQYXJhbWV0ZXJUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWJzdHJhY3RCYXNlcyhjbHM6IHNwZWMuQ2xhc3NUeXBlKTogc3BlYy5DbGFzc1R5cGVbXSB7XG4gICAgY29uc3QgYWJzdHJhY3RCYXNlczogc3BlYy5DbGFzc1R5cGVbXSA9IFtdO1xuXG4gICAgaWYgKGNscy5iYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmZpbmRUeXBlKGNscy5iYXNlKTtcblxuICAgICAgaWYgKCFzcGVjLmlzQ2xhc3NUeXBlKGJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIGluaGVyaXRlbmNlIHRoYXQgaXNuJ3QgYSBjbGFzcz9cIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChiYXNlLmFic3RyYWN0KSB7XG4gICAgICAgIGFic3RyYWN0QmFzZXMucHVzaChiYXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWJzdHJhY3RCYXNlcztcbiAgfVxufVxuXG4vKipcbiAqIFBvc2l0aW9uYWwgYXJndW1lbnQgb3Iga2V5d29yZCBwYXJhbWV0ZXJcbiAqL1xuaW50ZXJmYWNlIERvY3VtZW50YWJsZUFyZ3VtZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkb2NzPzogc3BlYy5Eb2NzO1xufVxuXG4vKipcbiAqIFJlbmRlciBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBnaXZlbiBkb2NzLCB1c2VkIGZvciBtZXRob2QgYXJndW1lbnRzIGFuZCBpbmxpbmVkIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gb25lbGluZURlc2NyaXB0aW9uKGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCkge1xuICAvLyBPbmx5IGNvbnNpZGVyIGEgc3Vic2V0IG9mIGZpZWxkcyBoZXJlLCB3ZSBkb24ndCBoYXZlIGEgbG90IG9mIGZvcm1hdHRpbmcgc3BhY2VcbiAgaWYgKCFkb2NzIHx8IE9iamVjdC5rZXlzKGRvY3MpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnLSc7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IFtdO1xuICBpZiAoZG9jcy5zdW1tYXJ5KSB7XG4gICAgcGFydHMucHVzaChtZDJyc3QocmVuZGVyU3VtbWFyeShkb2NzKSkpO1xuICB9XG4gIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICBwYXJ0cy5wdXNoKG1kMnJzdChkb2NzLnJlbWFya3MpKTtcbiAgfVxuICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgcGFydHMucHVzaChgRGVmYXVsdDogJHttZDJyc3QoZG9jcy5kZWZhdWx0KX1gKTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbignICcpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkTWVudGlvblN0YWJpbGl0eShzOiBzcGVjLlN0YWJpbGl0eSkge1xuICAvLyBEb24ndCByZW5kZXIgXCJzdGFibGVcIiBvciBcImV4dGVybmFsXCIsIHRob3NlIGFyZSBib3RoIHN0YWJsZSBieSBpbXBsaWNhdGlvbi5cbiAgcmV0dXJuIHMgPT09IHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQgfHwgcyA9PT0gc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsO1xufVxuXG5mdW5jdGlvbiBpc1N0cnVjdChcbiAgdHlwZVN5c3RlbTogcmVmbGVjdC5UeXBlU3lzdGVtLFxuICByZWY6IHNwZWMuVHlwZVJlZmVyZW5jZSxcbik6IGJvb2xlYW4ge1xuICBpZiAoIXNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UocmVmKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB0eXBlID0gdHlwZVN5c3RlbS50cnlGaW5kRnFuKHJlZi5mcW4pO1xuICByZXR1cm4gISEodHlwZT8uaXNJbnRlcmZhY2VUeXBlKCkgJiYgdHlwZT8uaXNEYXRhVHlwZSgpKTtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGBfYCBhdCB0aGUgZW5kIG9mIGBuYW1lYCB1bnRpbCBpdCBubyBsb25nZXIgY29uZmxpY3RzIHdpdGggYW55IG9mIHRoZVxuICogZW50cmllcyBpbiBgaW5Vc2VgLlxuICpcbiAqIEBwYXJhbSBuYW1lICB0aGUgbmFtZSB0byBiZSBzbHVnaWZpZWQuXG4gKiBAcGFyYW0gaW5Vc2UgdGhlIG5hbWVzIHRoYXQgYXJlIGFscmVhZHkgYmVpbmcgdXNlZC5cbiAqXG4gKiBAcmV0dXJucyB0aGUgc2x1Z2lmaWVkIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHNsdWdpZnlBc05lZWRlZChuYW1lOiBzdHJpbmcsIGluVXNlOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGluVXNlU2V0ID0gbmV3IFNldChpblVzZSk7XG4gIHdoaWxlIChpblVzZVNldC5oYXMobmFtZSkpIHtcbiAgICBuYW1lID0gYCR7bmFtZX1fYDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEJFSE9MRDogSGVscGVycyB0byBvdXRwdXQgY29kZSB0aGF0IGxvb2tzIGxpa2Ugd2hhdCBCbGFjayB3b3VsZCBmb3JtYXQgaW50by4uLlxuLy9cbi8vIEBzZWUgaHR0cHM6Ly9ibGFjay5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvdGhlX2JsYWNrX2NvZGVfc3R5bGUuaHRtbFxuXG5jb25zdCBUQVJHRVRfTElORV9MRU5HVEggPSA4ODtcblxuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnY2xhc3MnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiB2b2lkO1xuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnZGVmJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZ0NvbW1hOiBib29sZWFuLFxuICByZXR1cm5UeXBlOiBzdHJpbmcsXG4pOiB2b2lkO1xuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnY2xhc3MnIHwgJ2RlZicsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmdDb21tYSA9IGZhbHNlLFxuICByZXR1cm5UeXBlPzogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke2tleXdvcmR9ICR7bmFtZX1gO1xuICBjb25zdCBzdWZmaXggPSByZXR1cm5UeXBlID8gYCAtPiAke3JldHVyblR5cGV9YCA6ICcnO1xuICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUub3BlbkJsb2NrKGAke3ByZWZpeH0ke3JldHVyblR5cGUgPyAnKCknIDogJyd9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YocGFyYW1zLCBqb2luKTtcblxuICBjb25zdCBoYXNDb21tZW50cyA9ICFwYXJhbXMuc29tZSgocGFyYW0pID0+IC8jIC4rJC8uZXhlYyhwYXJhbSkpO1xuXG4gIGlmIChcbiAgICBoYXNDb21tZW50cyAmJlxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICBzdWZmaXgubGVuZ3RoICtcbiAgICAgICAgMlxuICApIHtcbiAgICBjb2RlLm9wZW5CbG9jayhgJHtwcmVmaXh9KCR7cGFyYW1zLmpvaW4oam9pbil9KSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvZGUuaW5kZW50KGAke3ByZWZpeH0oYCk7XG4gIGlmIChcbiAgICAhaGFzQ29tbWVudHMgJiZcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICAodHJhaWxpbmdDb21tYSA/IDEgOiAwKVxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cGFyYW1zLmpvaW4oam9pbil9JHt0cmFpbGluZ0NvbW1hID8gJywnIDogJyd9YCk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgIGNvZGUubGluZShwYXJhbS5yZXBsYWNlKC8oXFxzKiMgLispPyQvLCAnLCQxJykpO1xuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KGZhbHNlKTtcbiAgY29kZS5vcGVuQmxvY2soYCkke3N1ZmZpeH1gKTtcbn1cblxuZnVuY3Rpb24gYXNzaWduQ2FsbFJlc3VsdChcbiAgY29kZTogQ29kZU1ha2VyLFxuICB2YXJpYWJsZTogc3RyaW5nLFxuICBmdW5jdDogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke3ZhcmlhYmxlfSA9ICR7ZnVuY3R9KGA7XG4gIGNvbnN0IHN1ZmZpeCA9ICcpJztcblxuICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YocGFyYW1zLCBqb2luKTtcblxuICBpZiAoXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgam9pblNpemUgK1xuICAgICAgc3VmZml4Lmxlbmd0aFxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7cGFyYW1zLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29kZS5pbmRlbnQocHJlZml4KTtcbiAgaWYgKFRBUkdFVF9MSU5FX0xFTkdUSCA+IGNvZGUuY3VycmVudEluZGVudExlbmd0aCArIGVsZW1lbnRzU2l6ZSArIGpvaW5TaXplKSB7XG4gICAgY29kZS5saW5lKHBhcmFtcy5qb2luKGpvaW4pKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29kZS5saW5lKGAke3BhcmFtfSxgKTtcbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChzdWZmaXgpO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25EaWN0aW9uYXJ5KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHZhcmlhYmxlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmc/OiBzdHJpbmcsXG4gIGNvbXBhY3QgPSBmYWxzZSxcbik6IHZvaWQge1xuICBjb25zdCBzcGFjZSA9IGNvbXBhY3QgPyAnJyA6ICcgJztcblxuICBjb25zdCBwcmVmaXggPSBgJHt2YXJpYWJsZX0ke3NwYWNlfT0ke3NwYWNlfXtgO1xuICBjb25zdCBzdWZmaXggPSBgfSR7dHJhaWxpbmcgPz8gJyd9YDtcblxuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY29tcGFjdCkge1xuICAgIGNvbnN0IGpvaW4gPSAnLCAnO1xuICAgIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YoZWxlbWVudHMsIGpvaW4pO1xuICAgIGlmIChcbiAgICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICBzdWZmaXgubGVuZ3RoXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7ZWxlbWVudHMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb2RlLmluZGVudChwcmVmaXgpO1xuICBmb3IgKGNvbnN0IGVsdCBvZiBlbGVtZW50cykge1xuICAgIGNvZGUubGluZShgJHtlbHR9LGApO1xuICB9XG4gIGNvZGUudW5pbmRlbnQoc3VmZml4KTtcbn1cblxuZnVuY3Rpb24gZW1pdExpc3QoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGVsZW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgc3VmZml4OiBzdHJpbmcsXG4gIG9wdHM/OiB7IGlmTXVsdGk6IFtzdHJpbmcsIHN0cmluZ10gfSxcbikge1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihlbGVtZW50cywgam9pbik7XG4gIGlmIChcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICBqb2luU2l6ZSArXG4gICAgICBzdWZmaXgubGVuZ3RoXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtlbGVtZW50cy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IFtiZWZvcmUsIGFmdGVyXSA9IG9wdHM/LmlmTXVsdGkgPz8gWycnLCAnJ107XG5cbiAgY29kZS5pbmRlbnQoYCR7cHJlZml4fSR7YmVmb3JlfWApO1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgY29kZS5saW5lKGVsZW1lbnRzWzBdKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXG4gICAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICsgZWxlbWVudHNTaXplICsgam9pblNpemVcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShlbGVtZW50cy5qb2luKGpvaW4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBlbHQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgY29kZS5saW5lKGAke2VsdH0sYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoYCR7YWZ0ZXJ9JHtzdWZmaXh9YCk7XG59XG5cbmZ1bmN0aW9uIHRvdGFsU2l6ZU9mKHN0cmluZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBqb2luOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50c1NpemU6IHN0cmluZ3NcbiAgICAgIC5tYXAoKHN0cikgPT4gc3RyLmxlbmd0aClcbiAgICAgIC5yZWR1Y2UoKGFjYywgZWx0KSA9PiBhY2MgKyBlbHQsIDApLFxuICAgIGpvaW5TaXplOiBzdHJpbmdzLmxlbmd0aCA+IDEgPyBqb2luLmxlbmd0aCAqIChzdHJpbmdzLmxlbmd0aCAtIDEpIDogMCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbmVzdGVkQ29udGV4dChcbiAgY29udGV4dDogRW1pdENvbnRleHQsXG4gIGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogRW1pdENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIC4uLmNvbnRleHQsXG4gICAgc3Vycm91bmRpbmdUeXBlRnFuczpcbiAgICAgIGZxbiAhPSBudWxsXG4gICAgICAgID8gWy4uLihjb250ZXh0LnN1cnJvdW5kaW5nVHlwZUZxbnMgPz8gW10pLCBmcW5dXG4gICAgICAgIDogY29udGV4dC5zdXJyb3VuZGluZ1R5cGVGcW5zLFxuICB9O1xufVxuXG5jb25zdCBpc0RlcHJlY2F0ZWQgPSAoeDogUHl0aG9uQmFzZSkgPT4geC5kb2NzPy5kZXByZWNhdGVkICE9PSB1bmRlZmluZWQ7XG4iXX0=
2052
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FNc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQXlDO0FBQ3pDLGtEQU00QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLHdCQUlXO0FBRVgsb0dBQW9HO0FBQ3BHLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDbkMsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsQ0FDdkIsQ0FBQztBQUVGLDJFQUEyRTtBQUMzRSwrRkFBK0Y7QUFDL0YsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0IsTUFBcUIsTUFBTyxTQUFRLGVBQU07SUFHeEMsWUFBbUIsT0FBc0I7UUFDdkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBYyxFQUFFLE9BQWU7UUFDdkQsTUFBTSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFpQixFQUFFLE1BQWM7UUFDbEQsNkJBQTZCO1FBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMs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QyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEUsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FDcEIsT0FBb0IsRUFDcEIsR0FBdUI7O0lBRXZCLE9BQU87UUFDTCxHQUFHLE9BQU87UUFDVixtQkFBbUIsRUFDakIsR0FBRyxJQUFJLElBQUk7WUFDVCxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQUMsT0FBTyxDQUFDLG1CQUFtQixtQ0FBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDL0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUI7S0FDbEMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQWEsRUFBRSxFQUFFLFdBQUMsT0FBQSxPQUFBLENBQUMsQ0FBQyxJQUFJLDBDQUFFLFVBQVUsTUFBSyxTQUFTLENBQUEsRUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQ29kZU1ha2VyLCB0b1NuYWtlQ2FzZSB9IGZyb20gJ2NvZGVtYWtlcic7XG5pbXBvcnQgKiBhcyBlc2NhcGVTdHJpbmdSZWdleHAgZnJvbSAnZXNjYXBlLXN0cmluZy1yZWdleHAnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHtcbiAgVGFyZ2V0TGFuZ3VhZ2UsXG4gIFRyYW5zbGF0aW9uLFxuICBSb3NldHRhLFxuICBlbmZvcmNlc1N0cmljdE1vZGUsXG4gIEFwaUxvY2F0aW9uLFxufSBmcm9tICdqc2lpLXJvc2V0dGEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgR2VuZXJhdG9yLCBHZW5lcmF0b3JPcHRpb25zIH0gZnJvbSAnLi4vZ2VuZXJhdG9yJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuLi9sb2dnaW5nJztcbmltcG9ydCB7IG1kMnJzdCB9IGZyb20gJy4uL21hcmtkb3duJztcbmltcG9ydCB7IFRhcmdldCwgVGFyZ2V0T3B0aW9ucyB9IGZyb20gJy4uL3RhcmdldCc7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgcmVuZGVyU3VtbWFyeSB9IGZyb20gJy4vX3V0aWxzJztcbmltcG9ydCB7XG4gIE5hbWluZ0NvbnRleHQsXG4gIHRvVHlwZU5hbWUsXG4gIFB5dGhvbkltcG9ydHMsXG4gIG1lcmdlUHl0aG9uSW1wb3J0cyxcbiAgdG9QYWNrYWdlTmFtZSxcbn0gZnJvbSAnLi9weXRob24vdHlwZS1uYW1lJztcbmltcG9ydCB7IGRpZSwgdG9QeXRob25JZGVudGlmaWVyIH0gZnJvbSAnLi9weXRob24vdXRpbCc7XG5pbXBvcnQgeyB0b1B5dGhvblZlcnNpb25SYW5nZSwgdG9SZWxlYXNlVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi11dGlscyc7XG5cbmltcG9ydCB7XG4gIElOQ09NUExFVEVfRElTQ0xBSU1FUl9DT01QSUxJTkcsXG4gIElOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkcsXG4gIFRhcmdldE5hbWUsXG59IGZyb20gJy4nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBzcGR4TGljZW5zZUxpc3QgPSByZXF1aXJlKCdzcGR4LWxpY2Vuc2UtbGlzdCcpO1xuXG5jb25zdCByZXF1aXJlbWVudHNGaWxlID0gcGF0aC5yZXNvbHZlKFxuICBfX2Rpcm5hbWUsXG4gICdweXRob24nLFxuICAncmVxdWlyZW1lbnRzLWRldi50eHQnLFxuKTtcblxuLy8gd2UgdXNlIHNpbmdsZS1xdW90ZXMgZm9yIG11bHRpLWxpbmUgc3RyaW5ncyB0byBhbGxvdyBleGFtcGxlcyB3aXRoaW4gdGhlXG4vLyBkb2NzdHJpbmdzIHRoZW1zZWx2ZXMgdG8gaW5jbHVkZSBkb3VibGUtcXVvdGVzIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yNTY5KVxuY29uc3QgRE9DU1RSSU5HX1FVT1RFUyA9IFwiJycnXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFB5dGhvbiBleHRlbmRzIFRhcmdldCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogVGFyZ2V0T3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5nZW5lcmF0b3IgPSBuZXcgUHl0aG9uR2VuZXJhdG9yKG9wdGlvbnMucm9zZXR0YSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVDb2RlKG91dERpcjogc3RyaW5nLCB0YXJiYWxsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5nZW5lcmF0ZUNvZGUob3V0RGlyLCB0YXJiYWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBidWlsZChzb3VyY2VEaXI6IHN0cmluZywgb3V0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDcmVhdGUgYSBmcmVzaCB2aXJ0dWFsIGVudlxuICAgIGNvbnN0IHZlbnYgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihzb3VyY2VEaXIsICcuZW52LScpKTtcbiAgICBjb25zdCB2ZW52QmluID0gcGF0aC5qb2luKFxuICAgICAgdmVudixcbiAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnU2NyaXB0cycgOiAnYmluJyxcbiAgICApO1xuICAgIGF3YWl0IHNoZWxsKCdweXRob24zJywgW1xuICAgICAgJy1tJyxcbiAgICAgICd2ZW52JyxcbiAgICAgICctLXN5c3RlbS1zaXRlLXBhY2thZ2VzJywgLy8gQWxsb3cgdXNpbmcgZ2xvYmFsbHkgaW5zdGFsbGVkIHBhY2thZ2VzIChzYXZlcyB0aW1lICYgZGlzayBzcGFjZSlcbiAgICAgIHZlbnYsXG4gICAgXSk7XG4gICAgY29uc3QgZW52ID0ge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICBQQVRIOiBgJHt2ZW52QmlufToke3Byb2Nlc3MuZW52LlBBVEh9YCxcbiAgICAgIFZJUlRVQUxfRU5WOiB2ZW52LFxuICAgIH07XG4gICAgY29uc3QgcHl0aG9uID0gcGF0aC5qb2luKHZlbnZCaW4sICdweXRob24nKTtcblxuICAgIC8vIEluc3RhbGwgdGhlIG5lY2Vzc2FyeSB0aGluZ3NcbiAgICBhd2FpdCBzaGVsbChcbiAgICAgIHB5dGhvbixcbiAgICAgIFsnLW0nLCAncGlwJywgJ2luc3RhbGwnLCAnLS1uby1pbnB1dCcsICctcicsIHJlcXVpcmVtZW50c0ZpbGVdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52LFxuICAgICAgICByZXRyeTogeyBtYXhBdHRlbXB0czogNSB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQWN0dWFsbHkgcGFja2FnZSB1cCBvdXIgY29kZSwgYm90aCBhcyBhIHNkaXN0IGFuZCBhIHdoZWVsIGZvciBwdWJsaXNoaW5nLlxuICAgIGF3YWl0IHNoZWxsKHB5dGhvbiwgWydzZXR1cC5weScsICdzZGlzdCcsICctLWRpc3QtZGlyJywgb3V0RGlyXSwge1xuICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICBlbnYsXG4gICAgfSk7XG4gICAgYXdhaXQgc2hlbGwoXG4gICAgICBweXRob24sXG4gICAgICBbJy1tJywgJ3BpcCcsICd3aGVlbCcsICctLW5vLWRlcHMnLCAnLS13aGVlbC1kaXInLCBvdXREaXIsIHNvdXJjZURpcl0sXG4gICAgICB7XG4gICAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgICBlbnYsXG4gICAgICAgIHJldHJ5OiB7IG1heEF0dGVtcHRzOiA1IH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgYXdhaXQgc2hlbGwocHl0aG9uLCBbJy1tJywgJ3R3aW5lJywgJ2NoZWNrJywgcGF0aC5qb2luKG91dERpciwgJyonKV0sIHtcbiAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgZW52LFxuICAgIH0pO1xuICB9XG59XG5cbi8vICMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gIyBDT0RFIEdFTkVSQVRPUiAjXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcblxuaW50ZXJmYWNlIEVtaXRDb250ZXh0IGV4dGVuZHMgTmFtaW5nQ29udGV4dCB7XG4gIC8qKiBAZGVwcmVjYXRlZCBUaGUgVHlwZVJlc29sdmVyICovXG4gIHJlYWRvbmx5IHJlc29sdmVyOiBUeXBlUmVzb2x2ZXI7XG59XG5cbmNvbnN0IHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBwYXRoLmpvaW4oLi4ubmFtZS5zcGxpdCgnLicpKTtcbn07XG5cbmNvbnN0IHRvUHl0aG9uTWV0aG9kTmFtZSA9IChuYW1lOiBzdHJpbmcsIHByb3RlY3RlZEl0ZW0gPSBmYWxzZSk6IHN0cmluZyA9PiB7XG4gIGxldCB2YWx1ZSA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG4gIGlmIChwcm90ZWN0ZWRJdGVtKSB7XG4gICAgdmFsdWUgPSBgXyR7dmFsdWV9YDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCB0b1B5dGhvblByb3BlcnR5TmFtZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBjb25zdGFudCA9IGZhbHNlLFxuICBwcm90ZWN0ZWRJdGVtID0gZmFsc2UsXG4pOiBzdHJpbmcgPT4ge1xuICBsZXQgdmFsdWUgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuXG4gIGlmIChjb25zdGFudCkge1xuICAgIHZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIGlmIChwcm90ZWN0ZWRJdGVtKSB7XG4gICAgdmFsdWUgPSBgXyR7dmFsdWV9YDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBnaXZlbiBzaWduYXR1cmUncyBwYXJhbWV0ZXIgbmFtZSB0byB3aGF0IHNob3VsZCBiZSBlbWl0dGVkIGluIFB5dGhvbi4gSXQgc2x1Z2lmaWVzIHRoZVxuICogcG9zaXRpb25hbCBwYXJhbWV0ZXIgbmFtZXMgdGhhdCBjb2xsaWRlIHdpdGggYSBsaWZ0ZWQgcHJvcCBieSBhcHBlbmRpbmcgdHJhaWxpbmcgYF9gLiBUaGVyZSBpcyBub1xuICogcmlzayBvZiBjb25mbGljdGluZyB3aXRoIGFuIG90aGVyIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHRoYXQgZW5kcyB3aXRoIGEgYF9gIGNoYXJhY3RlciBiZWNhdXNlXG4gKiB0aGlzIGlzIHByb2hpYml0ZWQgYnkgdGhlIGBqc2lpYCBjb21waWxlciAocGFyYW1ldGVyIG5hbWVzIE1VU1QgYmUgY2FtZWxDYXNlLCBhbmQgb25seSBhIHNpbmdsZVxuICogYF9gIGlzIHBlcm1pdHRlZCB3aGVuIGl0IGlzIG9uICoqbGVhZGluZyoqIHBvc2l0aW9uKVxuICpcbiAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgbmVlZHMgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBsaWZ0ZWRQYXJhbU5hbWVzICB0aGUgbGlzdCBvZiBcImxpZnRlZFwiIGtleXdvcmQgcGFyYW1ldGVycyBpbiB0aGlzIHNpZ25hdHVyZS4gVGhpcyBtdXN0IGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb21pdHRlZCB3aGVuIGdlbmVyYXRpbmcgYSBuYW1lIGZvciBhIHBhcmFtZXRlciB0aGF0ICoqaXMqKiBsaWZ0ZWQuXG4gKi9cbmZ1bmN0aW9uIHRvUHl0aG9uUGFyYW1ldGVyTmFtZShcbiAgbmFtZTogc3RyaW5nLFxuICBsaWZ0ZWRQYXJhbU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCksXG4pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcblxuICB3aGlsZSAobGlmdGVkUGFyYW1OYW1lcy5oYXMocmVzdWx0KSkge1xuICAgIHJlc3VsdCArPSAnXyc7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCBzZXREaWZmZXJlbmNlID0gPFQ+KHNldEE6IFNldDxUPiwgc2V0QjogU2V0PFQ+KTogU2V0PFQ+ID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFNldDxUPigpO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc2V0QSkge1xuICAgIGlmICghc2V0Qi5oYXMoaXRlbSkpIHtcbiAgICAgIHJlc3VsdC5hZGQoaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFByZXBhcmUgcHl0aG9uIG1lbWJlcnMgZm9yIGVtaXNzaW9uLlxuICpcbiAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZW1iZXJzIG9mIHRoZSBzYW1lIG5hbWUsIHRoZXkgd2lsbCBhbGwgbWFwIHRvIHRoZSBzYW1lIHB5dGhvblxuICogbmFtZSwgc28gd2Ugd2lsbCBmaWx0ZXIgYWxsIGRlcHJlY2F0ZWQgbWVtYmVycyBhbmQgZXhwZWN0IHRoYXQgdGhlcmUgd2lsbCBiZSBvbmx5IG9uZVxuICogbGVmdC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBtZW1iZXJzIGluIGEgc29ydGVkIGxpc3QuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVNZW1iZXJzKG1lbWJlcnM6IFB5dGhvbkJhc2VbXSwgcmVzb2x2ZXI6IFR5cGVSZXNvbHZlcikge1xuICAvLyBjcmVhdGUgYSBtYXAgZnJvbSBweXRob24gbmFtZSB0byBsaXN0IG9mIG1lbWJlcnNcbiAgY29uc3QgbWFwOiB7IFtweXRob25OYW1lOiBzdHJpbmddOiBQeXRob25CYXNlW10gfSA9IHt9O1xuICBmb3IgKGNvbnN0IG0gb2YgbWVtYmVycykge1xuICAgIGxldCBsaXN0ID0gbWFwW20ucHl0aG9uTmFtZV07XG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICBsaXN0ID0gbWFwW20ucHl0aG9uTmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBsaXN0LnB1c2gobSk7XG4gIH1cblxuICAvLyBub3cgcmV0dXJuIGFsbCB0aGUgbWVtYmVyc1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBsaXN0XSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgbGV0IG1lbWJlcjtcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gaWYgd2UgaGF2ZSBhIHNpbmdsZSBtZW1iZXIgZm9yIHRoaXMgbm9ybWFsaXplZCBuYW1lLCB0aGVuIHVzZSBpdFxuICAgICAgbWVtYmVyID0gbGlzdFswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd2UgZm91bmQgbW9yZSB0aGFuIG9uZSBtZW1iZXIgd2l0aCB0aGUgc2FtZSBweXRob24gbmFtZSwgZmlsdGVyIGFsbFxuICAgICAgLy8gZGVwcmVjYXRlZCB2ZXJzaW9ucyBhbmQgY2hlY2sgdGhhdCB3ZSBhcmUgbGVmdCB3aXRoIGV4YWN0bHkgb25lLlxuICAgICAgLy8gb3RoZXJ3aXNlLCB0aGV5IHdpbGwgb3ZlcndyaXRlIGVhY2ggb3RoZXJcbiAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI1MDhcbiAgICAgIGNvbnN0IG5vbkRlcHJlY2F0ZWQgPSBsaXN0LmZpbHRlcigoeCkgPT4gIWlzRGVwcmVjYXRlZCh4KSk7XG4gICAgICBpZiAobm9uRGVwcmVjYXRlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgbm9uLWRlcHJlY2F0ZWQgbWVtYmVycyB3aGljaCBtYXAgdG8gdGhlIFB5dGhvbiBuYW1lIFwiJHtuYW1lfVwiYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vbkRlcHJlY2F0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgbWVtYmVycyB3aGljaCBtYXAgdG8gdGhlIFB5dGhvbiBuYW1lIFwiJHtuYW1lfVwiLCBidXQgYWxsIG9mIHRoZW0gYXJlIGRlcHJlY2F0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBtZW1iZXIgPSBub25EZXByZWNhdGVkWzBdO1xuICAgIH1cblxuICAgIHJldC5wdXNoKG1lbWJlcik7XG4gIH1cblxuICByZXR1cm4gc29ydE1lbWJlcnMocmV0LCByZXNvbHZlcik7XG59XG5cbmNvbnN0IHNvcnRNZW1iZXJzID0gKFxuICBtZW1iZXJzOiBQeXRob25CYXNlW10sXG4gIHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIsXG4pOiBQeXRob25CYXNlW10gPT4ge1xuICBsZXQgc29ydGFibGUgPSBuZXcgQXJyYXk8e1xuICAgIG1lbWJlcjogUHl0aG9uQmFzZSAmIElTb3J0YWJsZVR5cGU7XG4gICAgZGVwZW5kc09uOiBTZXQ8UHl0aG9uVHlwZT47XG4gIH0+KCk7XG4gIGNvbnN0IHNvcnRlZCA9IG5ldyBBcnJheTxQeXRob25CYXNlPigpO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxQeXRob25CYXNlPigpO1xuXG4gIC8vIFRoZSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvLCBpcyBwdXNoIGFueSBpdGVtIHdoaWNoIGlzIG5vdCBzb3J0YWJsZSB0byB0aGUgdmVyeVxuICAvLyBmcm9udCBvZiB0aGUgbGlzdC4gVGhpcyB3aWxsIGJlIHRoaW5ncyBsaWtlIG1ldGhvZHMsIHByb3BlcnRpZXMsIGV0Yy5cbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgIGlmICghaXNTb3J0YWJsZVR5cGUobWVtYmVyKSkge1xuICAgICAgc29ydGVkLnB1c2gobWVtYmVyKTtcbiAgICAgIHNlZW4uYWRkKG1lbWJlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvcnRhYmxlLnB1c2goeyBtZW1iZXIsIGRlcGVuZHNPbjogbmV3IFNldChtZW1iZXIuZGVwZW5kc09uKHJlc29sdmVyKSkgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTm93IHRoYXQgd2UndmUgcHVsbGVkIG91dCBldmVyeXRoaW5nIHRoYXQgY291bGRuJ3QgcG9zc2libHkgaGF2ZSBkZXBlbmRlbmNpZXMsXG4gIC8vIHdlIHdpbGwgZ28gdGhyb3VnaCB0aGUgcmVtYWluaW5nIGl0ZW1zLCBhbmQgcHVsbCBvZmYgYW55IGl0ZW1zIHdoaWNoIGhhdmUgbm9cbiAgLy8gZGVwZW5kZW5jaWVzIHRoYXQgd2UgaGF2ZW4ndCBhbHJlYWR5IHNvcnRlZC5cbiAgd2hpbGUgKHNvcnRhYmxlLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHsgbWVtYmVyLCBkZXBlbmRzT24gfSBvZiBzb3J0YWJsZSkge1xuICAgICAgY29uc3QgZGlmZiA9IHNldERpZmZlcmVuY2UoZGVwZW5kc09uLCBzZWVuKTtcbiAgICAgIGlmIChbLi4uZGlmZl0uZmluZCgoZGVwKSA9PiAhKGRlcCBpbnN0YW5jZW9mIFB5dGhvbk1vZHVsZSkpID09IG51bGwpIHtcbiAgICAgICAgc29ydGVkLnB1c2gobWVtYmVyKTtcbiAgICAgICAgc2Vlbi5hZGQobWVtYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsZWZ0b3ZlciA9IHNvcnRhYmxlLmZpbHRlcigoeyBtZW1iZXIgfSkgPT4gIXNlZW4uaGFzKG1lbWJlcikpO1xuICAgIGlmIChsZWZ0b3Zlci5sZW5ndGggPT09IHNvcnRhYmxlLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHNvcnQgbWVtYmVycyAoY2lyY3VsYXIgZGVwZW5kZW5jeT8pLiBMZWZ0b3ZlcjogJHtsZWZ0b3ZlclxuICAgICAgICAgIC5tYXAoKGxvKSA9PiBsby5tZW1iZXIucHl0aG9uTmFtZSlcbiAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc29ydGFibGUgPSBsZWZ0b3ZlcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc29ydGVkO1xufTtcblxuaW50ZXJmYWNlIFB5dGhvbkJhc2Uge1xuICByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvY3M/OiBzcGVjLkRvY3M7XG5cbiAgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0LCBvcHRzPzogYW55KTogdm9pZDtcblxuICByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzO1xufVxuXG5pbnRlcmZhY2UgUHl0aG9uVHlwZSBleHRlbmRzIFB5dGhvbkJhc2Uge1xuICAvLyBUaGUgSlNJSSBGUU4gZm9yIHRoaXMgaXRlbSwgaWYgdGhpcyBpdGVtIGRvZXNuJ3QgZXhpc3QgYXMgYSBKU0lJIHR5cGUsIHRoZW4gaXRcbiAgLy8gZG9lc24ndCBoYXZlIGEgRlFOIGFuZCBpdCBzaG91bGQgYmUgbnVsbDtcbiAgcmVhZG9ubHkgZnFuPzogc3RyaW5nO1xuXG4gIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVNvcnRhYmxlVHlwZSB7XG4gIGRlcGVuZHNPbihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHl0aG9uVHlwZVtdO1xufVxuXG5mdW5jdGlvbiBpc1NvcnRhYmxlVHlwZShhcmc6IHVua25vd24pOiBhcmcgaXMgSVNvcnRhYmxlVHlwZSB7XG4gIHJldHVybiAoYXJnIGFzIFBhcnRpYWw8SVNvcnRhYmxlVHlwZT4pLmRlcGVuZHNPbiAhPT0gdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgUHl0aG9uVHlwZU9wdHMge1xuICBiYXNlcz86IHNwZWMuVHlwZVJlZmVyZW5jZVtdO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIGltcGxlbWVudHMgUHl0aG9uVHlwZSwgSVNvcnRhYmxlVHlwZSB7XG4gIHByb3RlY3RlZCBiYXNlczogc3BlYy5UeXBlUmVmZXJlbmNlW107XG4gIHByb3RlY3RlZCBtZW1iZXJzOiBQeXRob25CYXNlW107XG4gIHByb3RlY3RlZCByZWFkb25seSBzZXBhcmF0ZU1lbWJlcnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0czogUHl0aG9uVHlwZU9wdHMsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgY29uc3QgeyBiYXNlcyA9IFtdIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5iYXNlcyA9IGJhc2VzO1xuICAgIHRoaXMubWVtYmVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHl0aG9uVHlwZVtdIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8UHl0aG9uVHlwZT4oKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBiYXNlcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBtb2R1bGUgYXQgdGhlIHNhbWUgbGV2ZWwgb2ZcbiAgICAvLyBuZXN0aW5nLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgdGhpcy5iYXNlcykge1xuICAgICAgaWYgKHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UoYmFzZSkpIHtcbiAgICAgICAgaWYgKHJlc29sdmVyLmlzSW5Nb2R1bGUoYmFzZSkpIHtcbiAgICAgICAgICAvLyBHaXZlbiBhIGJhc2UsIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBiYXNlJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWUgYXNcbiAgICAgICAgICAvLyBvdXIgcGFyZW50LCBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXQgdGhlXG4gICAgICAgICAgLy8gc2FtZSBsZXZlbCBvZiBvdXIgb3duLlxuICAgICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAgIC8vICAgICAgIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICBsZXQgYmFzZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGJhc2UpO1xuICAgICAgICAgIGxldCBiYXNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGJhc2UpO1xuICAgICAgICAgIHdoaWxlIChiYXNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgIGJhc2VJdGVtID0gYmFzZVBhcmVudDtcbiAgICAgICAgICAgIGJhc2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzZWVuLmhhcyhiYXNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYmFzZUl0ZW0pO1xuICAgICAgICAgICAgc2Vlbi5hZGQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgLi4udGhpcy5iYXNlcy5tYXAoKGJhc2UpID0+IHRvVHlwZU5hbWUoYmFzZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKSB7XG4gICAgdGhpcy5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIGlmICghdGhpcy5mcW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBtYWtlIGFwaUxvY2F0aW9uIGZvciAke3RoaXMucHl0aG9uTmFtZX0sIGRvZXMgbm90IGhhdmUgRlFOYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGFwaTogJ3R5cGUnLCBmcW46IHRoaXMuZnFuIH07XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuXG4gICAgY29uc3QgY2xhc3NQYXJhbXMgPSB0aGlzLmdldENsYXNzUGFyYW1zKGNvbnRleHQpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBjbGFzc1BhcmFtcyk7XG5cbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5ib3VuZFJlc29sdmVyKGNvbnRleHQucmVzb2x2ZXIpO1xuICAgICAgbGV0IHNob3VsZFNlcGFyYXRlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgICBpZiAoc2hvdWxkU2VwYXJhdGUpIHtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRTZXBhcmF0ZSA9IHRoaXMuc2VwYXJhdGVNZW1iZXJzO1xuICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCB7IC4uLmNvbnRleHQsIHJlc29sdmVyIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBib3VuZFJlc29sdmVyKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBUeXBlUmVzb2x2ZXIge1xuICAgIGlmICh0aGlzLmZxbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlci5iaW5kKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgQmFzZU1ldGhvZE9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG59XG5cbmludGVyZmFjZSBCYXNlTWV0aG9kRW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlTWV0aG9kIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJldHVybkZyb21KU0lJTWV0aG9kOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHNwZWMuUGFyYW1ldGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXR1cm5zOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW4sXG4gICAgb3B0czogQmFzZU1ldGhvZE9wdHMsXG4gICkge1xuICAgIHRoaXMuYWJzdHJhY3QgPSAhIW9wdHMuYWJzdHJhY3Q7XG4gICAgdGhpcy5saWZ0ZWRQcm9wID0gb3B0cy5saWZ0ZWRQcm9wO1xuICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4geyBhcGk6ICdtZW1iZXInLCBmcW46IHRoaXMucGFyZW50LmZxbiwgbWVtYmVyTmFtZTogdGhpcy5qc2lpTWV0aG9kIH07XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHRvVHlwZU5hbWUodGhpcy5yZXR1cm5zKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICAuLi50aGlzLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT5cbiAgICAgICAgdG9UeXBlTmFtZShwYXJhbSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgKSxcbiAgICAgIC4uLmxpZnRlZFByb3BlcnRpZXModGhpcy5saWZ0ZWRQcm9wKSxcbiAgICApO1xuXG4gICAgZnVuY3Rpb24qIGxpZnRlZFByb3BlcnRpZXMoXG4gICAgICBzdHJ1Y3Q6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHVuZGVmaW5lZCxcbiAgICApOiBJdGVyYWJsZUl0ZXJhdG9yPFB5dGhvbkltcG9ydHM+IHtcbiAgICAgIGlmIChzdHJ1Y3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc3RydWN0LnByb3BlcnRpZXMgPz8gW10pIHtcbiAgICAgICAgeWllbGQgdG9UeXBlTmFtZShwcm9wLnR5cGUpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiBzdHJ1Y3QuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBpZmFjZSA9IGNvbnRleHQucmVzb2x2ZXIuZGVyZWZlcmVuY2UoYmFzZSkgYXMgc3BlYy5JbnRlcmZhY2VUeXBlO1xuICAgICAgICBmb3IgKGNvbnN0IGltcG9ydHMgb2YgbGlmdGVkUHJvcGVydGllcyhpZmFjZSkpIHtcbiAgICAgICAgICB5aWVsZCBpbXBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlTWV0aG9kRW1pdE9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgcmVuZGVyQWJzdHJhY3QgPSB0cnVlLCBmb3JjZUVtaXRCb2R5ID0gZmFsc2UgfSA9IG9wdHMgPz8ge307XG5cbiAgICBjb25zdCByZXR1cm5UeXBlOiBzdHJpbmcgPSB0b1R5cGVOYW1lKHRoaXMucmV0dXJucykucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgIC8vIFdlIGNhbm5vdCAoY3VycmVudGx5PykgYmxpbmRseSB1c2UgdGhlIG5hbWVzIGdpdmVuIHRvIHVzIGJ5IHRoZSBKU0lJIGZvclxuICAgIC8vIGluaXRpYWxpemVycywgYmVjYXVzZSBvdXIga2V5d29yZCBsaWZ0aW5nIHdpbGwgYWxsb3cgdHdvIG5hbWVzIHRvIGNsYXNoLlxuICAgIC8vIFRoaXMgY2FuIGhvcGVmdWxseSBiZSByZW1vdmVkIG9uY2Ugd2UgZ2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjg4XG4gICAgLy8gcmVzb2x2ZWQsIHNvIGJ1aWxkIHVwIGEgbGlzdCBvZiBhbGwgb2YgdGhlIHByb3AgbmFtZXMgc28gd2UgY2FuIGNoZWNrIGFnYWluc3RcbiAgICAvLyB0aGVtIGxhdGVyLlxuICAgIGNvbnN0IGxpZnRlZFByb3BOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmICh0aGlzLmxpZnRlZFByb3A/LnByb3BlcnRpZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHRoaXMubGlmdGVkUHJvcC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxpZnRlZFByb3BOYW1lcy5hZGQodG9QeXRob25QYXJhbWV0ZXJOYW1lKHByb3AubmFtZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHVybiBhIGxpc3Qgb2YgSlNJSSBwYXJhbWV0ZXJzLCBpbnRvIFB5dGhvbiBzdHlsZSBhcmd1bWVudHMgd2l0aFxuICAgIC8vIGdyYWR1YWwgdHlwaW5nLCBzbyB3ZSdsbCBoYXZlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzLCBhbmRcbiAgICAvLyBidWlsZCB0aGUgbGlzdCwgY29udmVydGluZyBhcyB3ZSBnby5cbiAgICBjb25zdCBweXRob25QYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiB0aGlzLnBhcmFtZXRlcnMpIHtcbiAgICAgIC8vIFdlIGNhbm5vdCAoY3VycmVudGx5PykgYmxpbmRseSB1c2UgdGhlIG5hbWVzIGdpdmVuIHRvIHVzIGJ5IHRoZSBKU0lJIGZvclxuICAgICAgLy8gaW5pdGlhbGl6ZXJzLCBiZWNhdXNlIG91ciBrZXl3b3JkIGxpZnRpbmcgd2lsbCBhbGxvdyB0d28gbmFtZXMgdG8gY2xhc2guXG4gICAgICAvLyBUaGlzIGNhbiBob3BlZnVsbHkgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI4OFxuICAgICAgLy8gcmVzb2x2ZWQuXG4gICAgICBjb25zdCBwYXJhbU5hbWU6IHN0cmluZyA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShcbiAgICAgICAgcGFyYW0ubmFtZSxcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShwYXJhbSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhcmFtRGVmYXVsdCA9IHBhcmFtLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG5cbiAgICAgIHB5dGhvblBhcmFtcy5wdXNoKGAke3BhcmFtTmFtZX06ICR7cGFyYW1UeXBlfSR7cGFyYW1EZWZhdWx0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY3VtZW50YWJsZUFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLnBhcmFtZXRlcnNcbiAgICAgIC8vIElmIHRoZXJlJ3MgbGlmdGVkUHJvcHMsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBzdHJ1Y3QgYW5kIGl0IHdvbid0IGJlIF9hY3R1YWxseV8gZW1pdHRlZC5cbiAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PlxuICAgICAgICB0aGlzLmxpZnRlZFByb3AgIT0gbnVsbCA/IGluZGV4IDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDEgOiB0cnVlLFxuICAgICAgKVxuICAgICAgLm1hcCgocGFyYW0pID0+ICh7XG4gICAgICAgIC4uLnBhcmFtLFxuICAgICAgICBuYW1lOiB0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSwgbGlmdGVkUHJvcE5hbWVzKSxcbiAgICAgIH0pKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBsaWZ0ZWQgcGFyYW1ldGVyLCB0aGVuIHdlJ2xsIGRyb3AgdGhlIGxhc3QgYXJndW1lbnQgdG8gb3VyIHBhcmFtc1xuICAgIC8vIGFuZCB0aGVuIHdlJ2xsIGxpZnQgYWxsIG9mIHRoZSBwYXJhbXMgb2YgdGhlIGxpZnRlZCB0eXBlIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgLy8gdG8gdGhlIGZ1bmN0aW9uLlxuICAgIGlmICh0aGlzLmxpZnRlZFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVtb3ZlIG91ciBsYXN0IGl0ZW0uXG4gICAgICBweXRob25QYXJhbXMucG9wKCk7XG4gICAgICBjb25zdCBsaWZ0ZWRQcm9wZXJ0aWVzID0gdGhpcy5nZXRMaWZ0ZWRQcm9wZXJ0aWVzKGNvbnRleHQucmVzb2x2ZXIpO1xuXG4gICAgICBpZiAobGlmdGVkUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuICAgICAgICAvLyBBbGwgb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUga2V5d29yZCBvbmx5IGFyZ3VtZW50cywgc28gd2UnbGwgbWFyayB0aGVtXG4gICAgICAgIC8vIGFzIHN1Y2guXG4gICAgICAgIHB5dGhvblBhcmFtcy5wdXNoKCcqJyk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiBvdXIgcHJvcHMsIGFuZCByZWZsZWN0IHRoZW0gaW50byBvdXIgcGFyYW1zLlxuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgbGlmdGVkUHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwcm9wLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUocHJvcCkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwYXJhbURlZmF1bHQgPSBwcm9wLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG5cbiAgICAgICAgICBweXRob25QYXJhbXMucHVzaChgJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX0ke3BhcmFtRGVmYXVsdH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEb2N1bWVudCB0aGVtIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgICBkb2N1bWVudGFibGVBcmdzLnB1c2goLi4ubGlmdGVkUHJvcGVydGllcyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMucGFyYW1ldGVycy5sZW5ndGggPj0gMSAmJlxuICAgICAgdGhpcy5wYXJhbWV0ZXJzW3RoaXMucGFyYW1ldGVycy5sZW5ndGggLSAxXS52YXJpYWRpY1xuICAgICkge1xuICAgICAgLy8gQW5vdGhlciBzaXR1YXRpb24gd2UgY291bGQgYmUgaW4sIGlzIHRoYXQgaW5zdGVhZCBvZiBoYXZpbmcgYSBwbGFpbiBwYXJhbWV0ZXJcbiAgICAgIC8vIHdlIGhhdmUgYSB2YXJpYWRpYyBwYXJhbWV0ZXIgd2hlcmUgd2UgbmVlZCB0byBleHBhbmQgdGhlIGxhc3QgcGFyYW1ldGVyIGFzIGFcbiAgICAgIC8vICphcmdzLlxuICAgICAgcHl0aG9uUGFyYW1zLnBvcCgpO1xuXG4gICAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gdGhpcy5wYXJhbWV0ZXJzLnNsaWNlKC0xKVswXTtcbiAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShsYXN0UGFyYW1ldGVyLm5hbWUpO1xuICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShsYXN0UGFyYW1ldGVyLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAgIHB5dGhvblBhcmFtcy5wdXNoKGAqJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmICh0aGlzLmpzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgbmVlZGVkIGJlY2F1c2UgbXlweSBkb2VzIG5vdCBrbm93IGhvdyB0byBjaGVjayBkZWNvcmF0ZWQgZGVjbGFyYXRpb25zXG4gICAgICBkZWNvcmF0b3JzLnB1c2goYEBqc2lpLm1lbWJlcihqc2lpX25hbWU9XCIke3RoaXMuanNOYW1lfVwiKWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlY29yYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goYEAke3RoaXMuZGVjb3JhdG9yfWApO1xuICAgIH1cblxuICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goJ0BhYmMuYWJzdHJhY3RtZXRob2QnKTtcbiAgICB9XG5cbiAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgbmVlZGVkIGJlY2F1c2UgbXlweSBkb2VzIG5vdCBrbm93IGhvdyB0byBjaGVjayBkZWNvcmF0ZWQgZGVjbGFyYXRpb25zXG4gICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzXG4gICAgICAgIC5qb2luKCcgIyB0eXBlOiBpZ25vcmVbbWlzY11cXG4nKVxuICAgICAgICAuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIGNvZGUubGluZShkZWNvcmF0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB5dGhvblBhcmFtcy51bnNoaWZ0KFxuICAgICAgc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgICB0aGlzLmltcGxpY2l0UGFyYW1ldGVyLFxuICAgICAgICBweXRob25QYXJhbXMubWFwKChwYXJhbSkgPT4gcGFyYW0uc3BsaXQoJzonKVswXS50cmltKCkpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgb3BlblNpZ25hdHVyZShcbiAgICAgIGNvZGUsXG4gICAgICAnZGVmJyxcbiAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgIHB5dGhvblBhcmFtcyxcbiAgICAgIGZhbHNlLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBhcmd1bWVudHM6IGRvY3VtZW50YWJsZUFyZ3MsXG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgbWV0aG9kLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0Qm9keShcbiAgICAgIGNvZGUsXG4gICAgICBjb250ZXh0LFxuICAgICAgcmVuZGVyQWJzdHJhY3QsXG4gICAgICBmb3JjZUVtaXRCb2R5LFxuICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgcHl0aG9uUGFyYW1zWzBdLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Qm9keShcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgcmVuZGVyQWJzdHJhY3Q6IGJvb2xlYW4sXG4gICAgZm9yY2VFbWl0Qm9keTogYm9vbGVhbixcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICAgIGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZTogc3RyaW5nLFxuICApIHtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMuc2hvdWxkRW1pdEJvZHkgJiYgIWZvcmNlRW1pdEJvZHkpIHx8XG4gICAgICAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdClcbiAgICApIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmxpZnRlZFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVtaXRBdXRvUHJvcHMoY29kZSwgY29udGV4dCwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbWl0SnNpaU1ldGhvZENhbGwoXG4gICAgICAgIGNvZGUsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGxpZnRlZFByb3BOYW1lcyxcbiAgICAgICAgaW1wbGljaXRQYXJhbWV0ZXIsXG4gICAgICAgIHJldHVyblR5cGUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdEF1dG9Qcm9wcyhcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgbGlmdGVkUHJvcE5hbWVzOiBTZXQ8c3RyaW5nPixcbiAgKSB7XG4gICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IHRoaXMucGFyYW1ldGVycy5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgYXJnTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShsYXN0UGFyYW1ldGVyLm5hbWUsIGxpZnRlZFByb3BOYW1lcyk7XG4gICAgY29uc3QgdHlwZU5hbWUgPSB0b1R5cGVOYW1lKGxhc3RQYXJhbWV0ZXIudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBidWlsZCB1cCBhIGxpc3Qgb2YgcHJvcGVydGllcywgd2hpY2ggYXJlIG1hbmRhdG9yeSwgdGhlc2UgYXJlIHRoZVxuICAgIC8vIG9uZXMgd2Ugd2lsbCBzcGVjaWZpeSB0byBzdGFydCB3aXRoIGluIG91ciBkaWN0aW9uYXJ5IGxpdGVyYWwuXG4gICAgY29uc3QgbGlmdGVkUHJvcHMgPSB0aGlzLmdldExpZnRlZFByb3BlcnRpZXMoY29udGV4dC5yZXNvbHZlcikubWFwKFxuICAgICAgKHApID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgcCwgdGhpcy5wYXJlbnQpLFxuICAgICk7XG4gICAgY29uc3QgYXNzaWdubWVudHMgPSBsaWZ0ZWRQcm9wc1xuICAgICAgLm1hcCgocCkgPT4gcC5weXRob25OYW1lKVxuICAgICAgLm1hcCgodikgPT4gYCR7dn09JHt2fWApO1xuXG4gICAgYXNzaWduQ2FsbFJlc3VsdChjb2RlLCBhcmdOYW1lLCB0eXBlTmFtZSwgYXNzaWdubWVudHMpO1xuICAgIGNvZGUubGluZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SnNpaU1ldGhvZENhbGwoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIGxpZnRlZFByb3BOYW1lczogU2V0PHN0cmluZz4sXG4gICAgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyxcbiAgICByZXR1cm5UeXBlOiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IG1ldGhvZFByZWZpeDogc3RyaW5nID0gdGhpcy5yZXR1cm5Gcm9tSlNJSU1ldGhvZCA/ICdyZXR1cm4gJyA6ICcnO1xuXG4gICAgY29uc3QganNpaU1ldGhvZFBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5jbGFzc0FzRmlyc3RQYXJhbWV0ZXIpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IG5vdCBrbm93bi4nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzU3RhdGljKSB7XG4gICAgICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChcbiAgICAgICAgICB0b1R5cGVOYW1lKHRoaXMucGFyZW50KS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2luZyB0aGUgZHluYW1pYyBjbGFzcyBvZiBgc2VsZmAuXG4gICAgICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX19jbGFzc19fYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChpbXBsaWNpdFBhcmFtZXRlcik7XG4gICAgaWYgKHRoaXMuanNOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChgXCIke3RoaXMuanNOYW1lfVwiYCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxhc3QgYXJnIGlzIHZhcmlhZGljLCBleHBhbmQgdGhlIHR1cGxlXG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICBsZXQgZXhwciA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwYXJhbS5uYW1lLCBsaWZ0ZWRQcm9wTmFtZXMpO1xuICAgICAgaWYgKHBhcmFtLnZhcmlhZGljKSB7XG4gICAgICAgIGV4cHIgPSBgKiR7ZXhwcn1gO1xuICAgICAgfVxuICAgICAgcGFyYW1zLnB1c2goZXhwcik7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBganNpaS4ke3RoaXMuanNpaU1ldGhvZH0oJHtqc2lpTWV0aG9kUGFyYW1zLmpvaW4oXG4gICAgICAnLCAnLFxuICAgICl9LCBbJHtwYXJhbXMuam9pbignLCAnKX1dKWA7XG4gICAgY29kZS5saW5lKFxuICAgICAgYCR7bWV0aG9kUHJlZml4fSR7XG4gICAgICAgIHRoaXMucmV0dXJuRnJvbUpTSUlNZXRob2QgJiYgcmV0dXJuVHlwZVxuICAgICAgICAgID8gYHR5cGluZy5jYXN0KCR7cmV0dXJuVHlwZX0sICR7dmFsdWV9KWBcbiAgICAgICAgICA6IHZhbHVlXG4gICAgICB9YCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMaWZ0ZWRQcm9wZXJ0aWVzKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBzcGVjLlByb3BlcnR5W10ge1xuICAgIGNvbnN0IGxpZnRlZFByb3BlcnRpZXM6IHNwZWMuUHJvcGVydHlbXSA9IFtdO1xuXG4gICAgY29uc3Qgc3RhY2sgPSBbdGhpcy5saWZ0ZWRQcm9wXTtcbiAgICBjb25zdCBrbm93bklmYWNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGtub3duUHJvcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKFxuICAgICAgbGV0IGN1cnJlbnQgPSBzdGFjay5zaGlmdCgpO1xuICAgICAgY3VycmVudCAhPSBudWxsO1xuICAgICAgY3VycmVudCA9IHN0YWNrLnNoaWZ0KClcbiAgICApIHtcbiAgICAgIGtub3duSWZhY2VzLmFkZChjdXJyZW50LmZxbik7XG5cbiAgICAgIC8vIEFkZCBhbnkgaW50ZXJmYWNlcyB0aGF0IHRoaXMgaW50ZXJmYWNlIGRlcGVuZHMgb24sIHRvIHRoZSBsaXN0LlxuICAgICAgaWYgKGN1cnJlbnQuaW50ZXJmYWNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWZhY2Ugb2YgY3VycmVudC5pbnRlcmZhY2VzKSB7XG4gICAgICAgICAgaWYgKGtub3duSWZhY2VzLmhhcyhpZmFjZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wdXNoKHJlc29sdmVyLmRlcmVmZXJlbmNlKGlmYWNlKSBhcyBzcGVjLkludGVyZmFjZVR5cGUpO1xuICAgICAgICAgIGtub3duSWZhY2VzLmFkZChpZmFjZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIGludGVyZmFjZSB0byBvdXIgbGlzdCBvZiBwcm9wZXJ0aWVzLlxuICAgICAgaWYgKGN1cnJlbnQucHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBjdXJyZW50LnByb3BlcnRpZXMpIHtcbiAgICAgICAgICBpZiAoa25vd25Qcm9wcy5oYXMocHJvcC5uYW1lKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpZnRlZFByb3BlcnRpZXMucHVzaChwcm9wKTtcbiAgICAgICAgICBrbm93blByb3BzLmFkZChwcm9wLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZnRlZFByb3BlcnRpZXM7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEJhc2VQcm9wZXJ0eU9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGltbXV0YWJsZT86IGJvb2xlYW47XG4gIGlzU3RhdGljPzogYm9vbGVhbjtcbiAgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcbn1cblxuaW50ZXJmYWNlIEJhc2VQcm9wZXJ0eUVtaXRPcHRzIHtcbiAgcmVuZGVyQWJzdHJhY3Q/OiBib29sZWFuO1xuICBmb3JjZUVtaXRCb2R5PzogYm9vbGVhbjtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZVByb3BlcnR5IGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGlzU3RhdGljOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZztcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGltbXV0YWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHNwZWMuT3B0aW9uYWxWYWx1ZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IEJhc2VQcm9wZXJ0eU9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgYWJzdHJhY3QgPSBmYWxzZSwgaW1tdXRhYmxlID0gZmFsc2UsIGlzU3RhdGljID0gZmFsc2UgfSA9IG9wdHM7XG5cbiAgICB0aGlzLmFic3RyYWN0ID0gYWJzdHJhY3Q7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljO1xuICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4geyBhcGk6ICdtZW1iZXInLCBmcW46IHRoaXMucGFyZW50LmZxbiwgbWVtYmVyTmFtZTogdGhpcy5qc05hbWUgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBvcHRzPzogQmFzZVByb3BlcnR5RW1pdE9wdHMsXG4gICkge1xuICAgIGNvbnN0IHsgcmVuZGVyQWJzdHJhY3QgPSB0cnVlLCBmb3JjZUVtaXRCb2R5ID0gZmFsc2UgfSA9IG9wdHMgPz8ge307XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9IHRvVHlwZU5hbWUodGhpcy50eXBlKS5weXRob25UeXBlKGNvbnRleHQpO1xuXG4gICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGlzIG5lZWRlZCBiZWNhdXNlIG15cHkgY2Fubm90IGNoZWNrIGRlY29yYXRlZCB0aGluZ3NcbiAgICBjb2RlLmxpbmUoYEAke3RoaXMuZGVjb3JhdG9yfSAjIHR5cGU6IGlnbm9yZVttaXNjXWApO1xuICAgIGNvZGUubGluZShgQGpzaWkubWVtYmVyKGpzaWlfbmFtZT1cIiR7dGhpcy5qc05hbWV9XCIpYCk7XG4gICAgaWYgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgIGNvZGUubGluZSgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgIH1cbiAgICBvcGVuU2lnbmF0dXJlKFxuICAgICAgY29kZSxcbiAgICAgICdkZWYnLFxuICAgICAgdGhpcy5weXRob25OYW1lLFxuICAgICAgW3RoaXMuaW1wbGljaXRQYXJhbWV0ZXJdLFxuICAgICAgdHJ1ZSxcbiAgICAgIHB5dGhvblR5cGUsXG4gICAgKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYHByb3AtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICAodGhpcy5zaG91bGRFbWl0Qm9keSB8fCBmb3JjZUVtaXRCb2R5KSAmJlxuICAgICAgKCFyZW5kZXJBYnN0cmFjdCB8fCAhdGhpcy5hYnN0cmFjdClcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYHJldHVybiB0eXBpbmcuY2FzdCgke3B5dGhvblR5cGV9LCBqc2lpLiR7dGhpcy5qc2lpR2V0TWV0aG9kfSgke3RoaXMuaW1wbGljaXRQYXJhbWV0ZXJ9LCBcIiR7dGhpcy5qc05hbWV9XCIpKWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJy4uLicpO1xuICAgIH1cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICghdGhpcy5pbW11dGFibGUpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgQCR7dGhpcy5weXRob25OYW1lfS5zZXR0ZXIke1xuICAgICAgICAgIHRoaXMuaXNTdGF0aWMgPyAnICMgdHlwZTogaWdub3JlW25vLXJlZGVmXScgOiAnJ1xuICAgICAgICB9YCxcbiAgICAgICk7XG4gICAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgICBjb2RlLmxpbmUoJ0BhYmMuYWJzdHJhY3RtZXRob2QnKTtcbiAgICAgIH1cbiAgICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICAgIGNvZGUsXG4gICAgICAgICdkZWYnLFxuICAgICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICAgIFt0aGlzLmltcGxpY2l0UGFyYW1ldGVyLCBgdmFsdWU6ICR7cHl0aG9uVHlwZX1gXSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgICdOb25lJyxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLnNob3VsZEVtaXRCb2R5IHx8IGZvcmNlRW1pdEJvZHkpICYmXG4gICAgICAgICghcmVuZGVyQWJzdHJhY3QgfHwgIXRoaXMuYWJzdHJhY3QpXG4gICAgICApIHtcbiAgICAgICAgY29kZS5saW5lKFxuICAgICAgICAgIGBqc2lpLiR7dGhpcy5qc2lpU2V0TWV0aG9kfSgke3RoaXMuaW1wbGljaXRQYXJhbWV0ZXJ9LCBcIiR7dGhpcy5qc05hbWV9XCIsIHZhbHVlKWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlLmxpbmUoJy4uLicpO1xuICAgICAgfVxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEludGVyZmFjZSBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUge1xuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuICAgIGVtaXRMaXN0KGNvZGUsICdAanNpaS5pbnRlcmZhY2UoJywgW2Bqc2lpX3R5cGU9XCIke3RoaXMuZnFufVwiYF0sICcpJyk7XG5cbiAgICAvLyBGaXJzdCB3ZSBkbyBvdXIgbm9ybWFsIGNsYXNzIGxvZ2ljIGZvciBlbWl0dGluZyBvdXIgbWVtYmVycy5cbiAgICBzdXBlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCk7XG5cbiAgICAvLyBUaGVuLCB3ZSBoYXZlIHRvIGVtaXQgYSBQcm94eSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIG91ciBwcm94eSBpbnRlcmZhY2UuXG4gICAgY29uc3QgcHJveHlCYXNlczogc3RyaW5nW10gPSB0aGlzLmJhc2VzLm1hcChcbiAgICAgIChiKSA9PlxuICAgICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgYmVjYXVzZSBNeVB5IGNhbm5vdCBjaGVjayBkeW5hbWljIGJhc2UgY2xhc3NlcyAobmF0dXJhbGx5KVxuICAgICAgICBganNpaS5wcm94eV9mb3IoJHt0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoe1xuICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICB9KX0pICMgdHlwZTogaWdub3JlW21pc2NdYCxcbiAgICApO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5wcm94eUNsYXNzTmFtZSwgcHJveHlCYXNlcyk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBjbGFzcy0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgICAgdHJhaWxpbmdOZXdMaW5lOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvZGUubGluZShgX19qc2lpX3R5cGVfXzogdHlwaW5nLkNsYXNzVmFyW3N0cl0gPSBcIiR7dGhpcy5mcW59XCJgKTtcblxuICAgIGlmICh0aGlzLm1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5tZW1iZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLnNlcGFyYXRlTWVtYmVycykge1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICB9XG4gICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQsIHsgZm9yY2VFbWl0Qm9keTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKCdwYXNzJyk7XG4gICAgfVxuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKFxuICAgICAgJyMgQWRkaW5nIGEgXCJfX2pzaWlfcHJveHlfY2xhc3NfXygpOiB0eXBpbmcuVHlwZVwiIGZ1bmN0aW9uIHRvIHRoZSBpbnRlcmZhY2UnLFxuICAgICk7XG4gICAgY29kZS5saW5lKFxuICAgICAgYHR5cGluZy5jYXN0KHR5cGluZy5BbnksICR7dGhpcy5weXRob25OYW1lfSkuX19qc2lpX3Byb3h5X2NsYXNzX18gPSBsYW1iZGEgOiAke3RoaXMucHJveHlDbGFzc05hbWV9YCxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZnFuICE9IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZW1pdHRlZFR5cGVzLmFkZCh0aGlzLmZxbik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENsYXNzUGFyYW1zKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSB0aGlzLmJhc2VzLm1hcCgoYikgPT5cbiAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICApO1xuXG4gICAgcGFyYW1zLnB1c2goJ3R5cGluZ19leHRlbnNpb25zLlByb3RvY29sJyk7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcHJveHlDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYF8ke3RoaXMucHl0aG9uTmFtZX1Qcm94eWA7XG4gIH1cbn1cblxuY2xhc3MgSW50ZXJmYWNlTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2ludm9rZSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRFbWl0Qm9keTogYm9vbGVhbiA9IGZhbHNlO1xufVxuXG5jbGFzcyBJbnRlcmZhY2VQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdidWlsdGlucy5wcm9wZXJ0eSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZDogc3RyaW5nID0gJ2dldCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kOiBzdHJpbmcgPSAnc2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmNsYXNzIFN0cnVjdCBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUge1xuICBwcm90ZWN0ZWQgZGlyZWN0TWVtYmVycyA9IG5ldyBBcnJheTxTdHJ1Y3RGaWVsZD4oKTtcblxuICBwdWJsaWMgYWRkTWVtYmVyKG1lbWJlcjogUHl0aG9uQmFzZSk6IHZvaWQge1xuICAgIGlmICghKG1lbWJlciBpbnN0YW5jZW9mIFN0cnVjdEZpZWxkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGFkZCBTdHJ1Y3RGaWVsZCB0byBTdHJ1Y3QnKTtcbiAgICB9XG4gICAgdGhpcy5kaXJlY3RNZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgY29uc3QgYmFzZUludGVyZmFjZXMgPSB0aGlzLmdldENsYXNzUGFyYW1zKGNvbnRleHQpO1xuXG4gICAgY29kZS5pbmRlbnQoJ0Bqc2lpLmRhdGFfdHlwZSgnKTtcbiAgICBjb2RlLmxpbmUoYGpzaWlfdHlwZT0ke0pTT04uc3RyaW5naWZ5KHRoaXMuZnFuKX0sYCk7XG4gICAgZW1pdExpc3QoY29kZSwgJ2pzaWlfc3RydWN0X2Jhc2VzPVsnLCBiYXNlSW50ZXJmYWNlcywgJ10sJyk7XG4gICAgYXNzaWduRGljdGlvbmFyeShjb2RlLCAnbmFtZV9tYXBwaW5nJywgdGhpcy5wcm9wZXJ0eU1hcCgpLCAnLCcsIHRydWUpO1xuICAgIGNvZGUudW5pbmRlbnQoJyknKTtcbiAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdjbGFzcycsIHRoaXMucHl0aG9uTmFtZSwgYmFzZUludGVyZmFjZXMpO1xuICAgIHRoaXMuZW1pdENvbnN0cnVjdG9yKGNvZGUsIGNvbnRleHQpO1xuXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5hbGxNZW1iZXJzKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuZW1pdEdldHRlcihtZW1iZXIsIGNvZGUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdE1hZ2ljTWV0aG9kcyhjb2RlKTtcblxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKHRoaXMuZnFuICE9IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZW1pdHRlZFR5cGVzLmFkZCh0aGlzLmZxbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICAuLi50aGlzLmFsbE1lbWJlcnMubWFwKChtZW0pID0+IG1lbS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbGwgZmllbGRzIChpbmhlcml0ZWQgYXMgd2VsbClcbiAgICovXG4gIHByaXZhdGUgZ2V0IGFsbE1lbWJlcnMoKTogU3RydWN0RmllbGRbXSB7XG4gICAgcmV0dXJuIHRoaXMudGhpc0ludGVyZmFjZS5hbGxQcm9wZXJ0aWVzLm1hcChcbiAgICAgICh4KSA9PiBuZXcgU3RydWN0RmllbGQodGhpcy5nZW5lcmF0b3IsIHguc3BlYywgdGhpcy50aGlzSW50ZXJmYWNlKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdGhpc0ludGVyZmFjZSgpIHtcbiAgICBpZiAodGhpcy5mcW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGUU4gbm90IHNldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbS5maW5kSW50ZXJmYWNlKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5hbGxNZW1iZXJzO1xuXG4gICAgY29uc3Qga3dhcmdzID0gbWVtYmVycy5tYXAoKG0pID0+IG0uY29uc3RydWN0b3JEZWNsKGNvbnRleHQpKTtcblxuICAgIGNvbnN0IGltcGxpY2l0UGFyYW1ldGVyID0gc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgJ3NlbGYnLFxuICAgICAgbWVtYmVycy5tYXAoKG0pID0+IG0ucHl0aG9uTmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RvckFyZ3VtZW50cyA9XG4gICAgICBrd2FyZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IFtpbXBsaWNpdFBhcmFtZXRlciwgJyonLCAuLi5rd2FyZ3NdXG4gICAgICAgIDogW2ltcGxpY2l0UGFyYW1ldGVyXTtcblxuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsICdfX2luaXRfXycsIGNvbnN0cnVjdG9yQXJndW1lbnRzLCBmYWxzZSwgJ05vbmUnKTtcbiAgICB0aGlzLmVtaXRDb25zdHJ1Y3RvckRvY3N0cmluZyhjb2RlKTtcblxuICAgIC8vIFJlLXR5cGUgc3RydWN0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIFwiZGljdFwiXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0uaXNTdHJ1Y3QodGhpcy5nZW5lcmF0b3IpKSkge1xuICAgICAgLy8gTm90ZSB0aGF0IFwiTm9uZVwiIGlzIE5PVCBhbiBpbnN0YW5jZSBvZiBkaWN0ICh0aGF0J3MgY29udmVuaWVudCEpXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobWVtYmVyLnR5cGUudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29kZS5vcGVuQmxvY2soYGlmIGlzaW5zdGFuY2UoJHttZW1iZXIucHl0aG9uTmFtZX0sIGRpY3QpYCk7XG4gICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyLnB5dGhvbk5hbWV9ID0gJHt0eXBlTmFtZX0oKioke21lbWJlci5weXRob25OYW1lfSlgKTtcbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmVkIHByb3BlcnRpZXMsIHRob3NlIHdpbGwgYWx3YXlzIGJlIHB1dCBpbnRvIHRoZSBkaWN0XG4gICAgYXNzaWduRGljdGlvbmFyeShcbiAgICAgIGNvZGUsXG4gICAgICBgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX3ZhbHVlczogdHlwaW5nLkRpY3Rbc3RyLCB0eXBpbmcuQW55XWAsXG4gICAgICBtZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICFtLm9wdGlvbmFsKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChtZW1iZXIpID0+XG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke21lbWJlci5weXRob25OYW1lfWAsXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIE9wdGlvbmFsIHByb3BlcnRpZXMsIHdpbGwgb25seSBiZSBwdXQgaW50byB0aGUgZGljdCBpZiB0aGV5J3JlIG5vdCBOb25lXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0ub3B0aW9uYWwpKSB7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgaWYgJHttZW1iZXIucHl0aG9uTmFtZX0gaXMgbm90IE5vbmVgKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll92YWx1ZXNbXCIke21lbWJlci5weXRob25OYW1lfVwiXSA9ICR7bWVtYmVyLnB5dGhvbk5hbWV9YCxcbiAgICAgICk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yRG9jc3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvbnN0IGFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLmFsbE1lbWJlcnMubWFwKChtKSA9PiAoe1xuICAgICAgbmFtZTogbS5weXRob25OYW1lLFxuICAgICAgZG9jczogbS5kb2NzLFxuICAgIH0pKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgYXJndW1lbnRzOiBhcmdzLFxuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRHZXR0ZXIoXG4gICAgbWVtYmVyOiBTdHJ1Y3RGaWVsZCxcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICkge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPSBtZW1iZXIudHlwZUFubm90YXRpb24oY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoJ0BidWlsdGlucy5wcm9wZXJ0eScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsIG1lbWJlci5weXRob25OYW1lLCBbJ3NlbGYnXSwgdHJ1ZSwgcHl0aG9uVHlwZSk7XG4gICAgbWVtYmVyLmVtaXREb2NTdHJpbmcoY29kZSk7XG4gICAgY29kZS5saW5lKFxuICAgICAgYHJlc3VsdCA9IHNlbGYuX3ZhbHVlcy5nZXQoJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9KWAsXG4gICAgKTtcbiAgICBpZiAoIW1lbWJlci5vcHRpb25hbCkge1xuICAgICAgLy8gQWRkIGFuIGFzc2VydGlvbiB0byBtYXllIE15UFkgaGFwcHkhXG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBhc3NlcnQgcmVzdWx0IGlzIG5vdCBOb25lLCBcIlJlcXVpcmVkIHByb3BlcnR5ICcke21lbWJlci5weXRob25OYW1lfScgaXMgbWlzc2luZ1wiYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvZGUubGluZShgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIHJlc3VsdClgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1hZ2ljTWV0aG9kcyhjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fZXFfXyhzZWxmLCByaHM6IHR5cGluZy5BbnkpIC0+IGJ1aWx0aW5zLmJvb2wnKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAncmV0dXJuIGlzaW5zdGFuY2UocmhzLCBzZWxmLl9fY2xhc3NfXykgYW5kIHJocy5fdmFsdWVzID09IHNlbGYuX3ZhbHVlcycsXG4gICAgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19uZV9fKHNlbGYsIHJoczogdHlwaW5nLkFueSkgLT4gYnVpbHRpbnMuYm9vbCcpO1xuICAgIGNvZGUubGluZSgncmV0dXJuIG5vdCAocmhzID09IHNlbGYpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fcmVwcl9fKHNlbGYpIC0+IHN0cicpO1xuICAgIGNvZGUuaW5kZW50KGByZXR1cm4gXCIke3RoaXMucHl0aG9uTmFtZX0oJXMpXCIgJSBcIiwgXCIuam9pbihgKTtcbiAgICBjb2RlLmxpbmUoJ2sgKyBcIj1cIiArIHJlcHIodikgZm9yIGssIHYgaW4gc2VsZi5fdmFsdWVzLml0ZW1zKCknKTtcbiAgICBjb2RlLnVuaW5kZW50KCcpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIHByb3BlcnR5TWFwKCkge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5hbGxNZW1iZXJzKSB7XG4gICAgICByZXQucHVzaChcbiAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobWVtYmVyLnB5dGhvbk5hbWUpfTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBtZW1iZXIuanNpaU5hbWUsXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cblxuY2xhc3MgU3RydWN0RmllbGQgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGpzaWlOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3BlYy5PcHRpb25hbFZhbHVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBwcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5weXRob25OYW1lID0gdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcbiAgICB0aGlzLmpzaWlOYW1lID0gcHJvcC5uYW1lO1xuICAgIHRoaXMudHlwZSA9IHByb3A7XG4gICAgdGhpcy5kb2NzID0gcHJvcC5kb2NzO1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgcmV0dXJuIHsgYXBpOiAnbWVtYmVyJywgZnFuOiB0aGlzLnBhcmVudC5mcW4sIG1lbWJlck5hbWU6IHRoaXMuanNpaU5hbWUgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3B0aW9uYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlLm9wdGlvbmFsO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGlzU3RydWN0KGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU3RydWN0KGdlbmVyYXRvci5yZWZsZWN0QXNzZW1ibHkuc3lzdGVtLCB0aGlzLnR5cGUudHlwZSk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3JEZWNsKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3Qgb3B0ID0gdGhpcy5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuICAgIHJldHVybiBgJHt0aGlzLnB5dGhvbk5hbWV9OiAke3RoaXMudHlwZUFubm90YXRpb24oe1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgfSl9JHtvcHR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFB5dGhvbiB0eXBlIGFubm90YXRpb24gZm9yIHRoaXMgdHlwZVxuICAgKi9cbiAgcHVibGljIHR5cGVBbm5vdGF0aW9uKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIHRvVHlwZU5hbWUodGhpcy50eXBlKS5weXRob25UeXBlKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXREb2NTdHJpbmcoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBwcm9wLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlQW5ub3RhdGlvbihjb250ZXh0KTtcbiAgICBjb2RlLmxpbmUoYCR7dGhpcy5weXRob25OYW1lfTogJHtyZXNvbHZlZFR5cGV9YCk7XG4gICAgdGhpcy5lbWl0RG9jU3RyaW5nKGNvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBDbGFzc09wdHMgZXh0ZW5kcyBQeXRob25UeXBlT3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW50ZXJmYWNlcz86IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG4gIGFic3RyYWN0QmFzZXM/OiBzcGVjLkNsYXNzVHlwZVtdO1xufVxuXG5jbGFzcyBDbGFzcyBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUgaW1wbGVtZW50cyBJU29ydGFibGVUeXBlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdEJhc2VzOiBzcGVjLkNsYXNzVHlwZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVyZmFjZXM6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmcW46IHN0cmluZyxcbiAgICBvcHRzOiBDbGFzc09wdHMsXG4gICAgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBzdXBlcihnZW5lcmF0b3IsIG5hbWUsIGZxbiwgb3B0cywgZG9jcyk7XG5cbiAgICBjb25zdCB7IGFic3RyYWN0ID0gZmFsc2UsIGludGVyZmFjZXMgPSBbXSwgYWJzdHJhY3RCYXNlcyA9IFtdIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5hYnN0cmFjdCA9IGFic3RyYWN0O1xuICAgIHRoaXMuaW50ZXJmYWNlcyA9IGludGVyZmFjZXM7XG4gICAgdGhpcy5hYnN0cmFjdEJhc2VzID0gYWJzdHJhY3RCYXNlcztcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBQeXRob25UeXBlW10gPSBzdXBlci5kZXBlbmRzT24ocmVzb2x2ZXIpO1xuICAgIGNvbnN0IHBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudCh0aGlzLmZxbiEpO1xuXG4gICAgLy8gV2UgbmVlZCB0byByZXR1cm4gYW55IGlmYWNlcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBtb2R1bGUgYXQgdGhlIHNhbWUgbGV2ZWwgb2ZcbiAgICAvLyBuZXN0aW5nLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGlmYWNlIG9mIHRoaXMuaW50ZXJmYWNlcykge1xuICAgICAgaWYgKHJlc29sdmVyLmlzSW5Nb2R1bGUoaWZhY2UpKSB7XG4gICAgICAgIC8vIEdpdmVuIGEgaWZhY2UsIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBpZmFjZXMncyBwYXJlbnQgdGhhdCBpcyB0aGUgc2FtZVxuICAgICAgICAvLyBhcyBvdXIgcGFyZW50LCBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXQgdGhlXG4gICAgICAgIC8vIHNhbWUgbGV2ZWwgb2Ygb3VyIG93bi5cbiAgICAgICAgLy8gVE9ETzogV2UgbWlnaHQgbmVlZCB0byByZWN1cnNlIGludG8gb3VyIG1lbWJlcnMgdG8gYWxzbyBmaW5kIHRoZWlyXG4gICAgICAgIC8vICAgICAgIGRlcGVuZGVuY2llcy5cbiAgICAgICAgbGV0IGlmYWNlSXRlbSA9IHJlc29sdmVyLmdldFR5cGUoaWZhY2UpO1xuICAgICAgICBsZXQgaWZhY2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoaWZhY2UpO1xuICAgICAgICB3aGlsZSAoaWZhY2VQYXJlbnQgIT09IHBhcmVudCkge1xuICAgICAgICAgIGlmYWNlSXRlbSA9IGlmYWNlUGFyZW50O1xuICAgICAgICAgIGlmYWNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGlmYWNlSXRlbS5mcW4hKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2Vlbi5oYXMoaWZhY2VJdGVtLmZxbiEpKSB7XG4gICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goaWZhY2VJdGVtKTtcbiAgICAgICAgICBzZWVuLmFkZChpZmFjZUl0ZW0uZnFuISk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksIC8vIFRha2VzIGNhcmUgb2YgYmFzZSAmIG1lbWJlcnNcbiAgICAgIC4uLnRoaXMuaW50ZXJmYWNlcy5tYXAoKGJhc2UpID0+XG4gICAgICAgIHRvVHlwZU5hbWUoYmFzZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIC8vIEZpcnN0IHdlIGVtaXQgb3VyIGltcGxtZW50cyBkZWNvcmF0b3JcbiAgICBpZiAodGhpcy5pbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGludGVyZmFjZXM6IHN0cmluZ1tdID0gdGhpcy5pbnRlcmZhY2VzLm1hcCgoYikgPT5cbiAgICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICAgKTtcbiAgICAgIGNvZGUubGluZShgQGpzaWkuaW1wbGVtZW50cygke2ludGVyZmFjZXMuam9pbignLCAnKX0pYCk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiB3ZSBkbyBvdXIgbm9ybWFsIGNsYXNzIGxvZ2ljIGZvciBlbWl0dGluZyBvdXIgbWVtYmVycy5cbiAgICBzdXBlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuXG4gICAgLy8gVGhlbiwgaWYgb3VyIGNsYXNzIGlzIEFic3RyYWN0LCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggYW5kIHJlZG8gYWxsIG9mXG4gICAgLy8gdGhpcyBsb2dpYywgZXhjZXB0IG9ubHkgZW1pdGluZyBhYnN0cmFjdCBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGFzIG5vblxuICAgIC8vIGFic3RyYWN0LCBhbmQgc3ViY2xhc3Npbmcgb3VyIGluaXRpYWwgY2xhc3MuXG4gICAgaWYgKHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcblxuICAgICAgY29uc3QgcHJveHlCYXNlcyA9IFt0aGlzLnB5dGhvbk5hbWVdO1xuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIHRoaXMuYWJzdHJhY3RCYXNlcykge1xuICAgICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgYmVjYXVzZSBNeVB5IGNhbm5vdCBjaGVjayBkeW5hbWljIGJhc2UgY2xhc3NlcyAobmF0dXJhbGx5KVxuICAgICAgICBwcm94eUJhc2VzLnB1c2goXG4gICAgICAgICAgYGpzaWkucHJveHlfZm9yKCR7dG9UeXBlTmFtZShiYXNlKS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgICAgfSl9KSAjIHR5cGU6IGlnbm9yZVttaXNjXWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdjbGFzcycsIHRoaXMucHJveHlDbGFzc05hbWUsIHByb3h5QmFzZXMpO1xuXG4gICAgICAvLyBGaWx0ZXIgb3VyIGxpc3Qgb2YgbWVtYmVycyB0byAqb25seSogYmUgYWJzdHJhY3QgbWVtYmVycywgYW5kIG5vdCBhbnlcbiAgICAgIC8vIG90aGVyIHR5cGVzLlxuICAgICAgY29uc3QgYWJzdHJhY3RNZW1iZXJzID0gdGhpcy5tZW1iZXJzLmZpbHRlcihcbiAgICAgICAgKG0pID0+XG4gICAgICAgICAgKG0gaW5zdGFuY2VvZiBCYXNlTWV0aG9kIHx8IG0gaW5zdGFuY2VvZiBCYXNlUHJvcGVydHkpICYmIG0uYWJzdHJhY3QsXG4gICAgICApO1xuICAgICAgaWYgKGFic3RyYWN0TWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIGFic3RyYWN0TWVtYmVycykge1xuICAgICAgICAgIGlmICh0aGlzLnNlcGFyYXRlTWVtYmVycykge1xuICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCwgeyByZW5kZXJBYnN0cmFjdDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGUubGluZSgncGFzcycpO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICAnIyBBZGRpbmcgYSBcIl9fanNpaV9wcm94eV9jbGFzc19fKCk6IHR5cGluZy5UeXBlXCIgZnVuY3Rpb24gdG8gdGhlIGFic3RyYWN0IGNsYXNzJyxcbiAgICAgICk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGB0eXBpbmcuY2FzdCh0eXBpbmcuQW55LCAke3RoaXMucHl0aG9uTmFtZX0pLl9fanNpaV9wcm94eV9jbGFzc19fID0gbGFtYmRhIDogJHt0aGlzLnByb3h5Q2xhc3NOYW1lfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcbiAgICBjb25zdCBtZXRhY2xhc3M6IHN0cmluZyA9IHRoaXMuYWJzdHJhY3QgPyAnSlNJSUFic3RyYWN0Q2xhc3MnIDogJ0pTSUlNZXRhJztcblxuICAgIHBhcmFtcy5wdXNoKGBtZXRhY2xhc3M9anNpaS4ke21ldGFjbGFzc31gKTtcbiAgICBwYXJhbXMucHVzaChganNpaV90eXBlPVwiJHt0aGlzLmZxbn1cImApO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHByb3h5Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBfJHt0aGlzLnB5dGhvbk5hbWV9UHJveHlgO1xuICB9XG59XG5cbmNsYXNzIFN0YXRpY01ldGhvZCBleHRlbmRzIEJhc2VNZXRob2Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yPzogc3RyaW5nID0gJ2J1aWx0aW5zLmNsYXNzbWV0aG9kJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnY2xzJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2Q6IHN0cmluZyA9ICdzaW52b2tlJztcbn1cblxuY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnY3JlYXRlJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXNzQXNGaXJzdFBhcmFtZXRlcjogYm9vbGVhbiA9IHRydWU7XG4gIHByb3RlY3RlZCByZWFkb25seSByZXR1cm5Gcm9tSlNJSU1ldGhvZDogYm9vbGVhbiA9IGZhbHNlO1xufVxuXG5jbGFzcyBNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnaW52b2tlJztcbn1cblxuY2xhc3MgQXN5bmNNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnYWludm9rZSc7XG59XG5cbmNsYXNzIFN0YXRpY1Byb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2pzaWkucHl0aG9uLmNsYXNzcHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdjbHMnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZDogc3RyaW5nID0gJ3NnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NzZXQnO1xufVxuXG5jbGFzcyBQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdidWlsdGlucy5wcm9wZXJ0eSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZDogc3RyaW5nID0gJ2dldCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kOiBzdHJpbmcgPSAnc2V0Jztcbn1cblxuY2xhc3MgRW51bSBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VwYXJhdGVNZW1iZXJzID0gZmFsc2U7XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnQGpzaWkuZW51bSgnLCBbYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgXSwgJyknKTtcbiAgICByZXR1cm4gc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhfY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnZW51bS5FbnVtJ107XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgfVxufVxuXG5jbGFzcyBFbnVtTWVtYmVyIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWx1ZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLnB5dGhvbk5hbWUgPSBweXRob25OYW1lO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7IGFwaTogJ21lbWJlcicsIGZxbjogdGhpcy5wYXJlbnQuZnFuLCBtZW1iZXJOYW1lOiB0aGlzLnZhbHVlIH07XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uTW9kdWxlcygpIHtcbiAgICByZXR1cm4gbmV3IFNldDxzdHJpbmc+KCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIF9jb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvZGUubGluZShgJHt0aGlzLnB5dGhvbk5hbWV9ID0gXCIke3RoaXMudmFsdWV9XCJgKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGVudW0tJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoX2NvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmludGVyZmFjZSBNb2R1bGVPcHRzIHtcbiAgcmVhZG9ubHkgYXNzZW1ibHk6IHNwZWMuQXNzZW1ibHk7XG4gIHJlYWRvbmx5IGFzc2VtYmx5RmlsZW5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9hZEFzc2VtYmx5PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcGFja2FnZT86IFBhY2thZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2NzdHJpbmcgdG8gZW1pdCBhdCB0aGUgdG9wIG9mIHRoaXMgbW9kdWxlLCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBtb2R1bGVEb2N1bWVudGF0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFB5dGhvbiBtb2R1bGVcbiAqXG4gKiBXaWxsIGJlIGNhbGxlZCBmb3IganNpaSBzdWJtb2R1bGVzIGFuZCBuYW1lc3BhY2VzLlxuICovXG5jbGFzcyBQeXRob25Nb2R1bGUgaW1wbGVtZW50cyBQeXRob25UeXBlIHtcbiAgLyoqXG4gICAqIENvbnZlcnRlZCB0byBwdXQgb24gdGhlIG1vZHVsZVxuICAgKlxuICAgKiBUaGUgZm9ybWF0IGlzIGluIG1hcmtkb3duLCB3aXRoIGNvZGUgc2FtcGxlcyBjb252ZXJ0ZWQgZnJvbSBUUyB0byBQeXRob24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kdWxlRG9jdW1lbnRhdGlvbj86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5O1xuICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmx5RmlsZW5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkQXNzZW1ibHk6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtYmVycyA9IG5ldyBBcnJheTxQeXRob25CYXNlPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlcyA9IG5ldyBBcnJheTxQeXRob25Nb2R1bGU+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IE1vZHVsZU9wdHMsXG4gICkge1xuICAgIHRoaXMuYXNzZW1ibHkgPSBvcHRzLmFzc2VtYmx5O1xuICAgIHRoaXMuYXNzZW1ibHlGaWxlbmFtZSA9IG9wdHMuYXNzZW1ibHlGaWxlbmFtZTtcbiAgICB0aGlzLmxvYWRBc3NlbWJseSA9ICEhb3B0cy5sb2FkQXNzZW1ibHk7XG4gICAgdGhpcy5tb2R1bGVEb2N1bWVudGF0aW9uID0gb3B0cy5tb2R1bGVEb2N1bWVudGF0aW9uO1xuICB9XG5cbiAgcHVibGljIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpIHtcbiAgICB0aGlzLm1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGFkZFB5dGhvbk1vZHVsZShweU1vZDogUHl0aG9uTW9kdWxlKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgIXRoaXMubG9hZEFzc2VtYmx5LFxuICAgICAgJ1B5dGhvbk1vZHVsZS5hZGRQeXRob25Nb2R1bGUgQ0FOTk9UIGJlIGNhbGxlZCBvbiBhc3NlbWJseS1sb2FkaW5nIG1vZHVsZXMgKGl0IHdvdWxkIGNhdXNlIGEgbG9hZCBjeWNsZSkhJyxcbiAgICApO1xuICAgIHRoaXMubW9kdWxlcy5wdXNoKHB5TW9kKTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgLi4udGhpcy5tZW1iZXJzLm1hcCgobWVtKSA9PiBtZW0ucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIHRoaXMuZW1pdE1vZHVsZURvY3VtZW50YXRpb24oY29kZSk7XG5cbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuZnFuXG4gICAgICA/IGNvbnRleHQucmVzb2x2ZXIuYmluZCh0aGlzLmZxbiwgdGhpcy5weXRob25OYW1lKVxuICAgICAgOiBjb250ZXh0LnJlc29sdmVyO1xuICAgIGNvbnRleHQgPSB7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgc3VibW9kdWxlOiB0aGlzLmZxbiA/PyBjb250ZXh0LnN1Ym1vZHVsZSxcbiAgICAgIHJlc29sdmVyLFxuICAgIH07XG5cbiAgICAvLyBCZWZvcmUgd2Ugd3JpdGUgYW55dGhpbmcgZWxzZSwgd2UgbmVlZCB0byB3cml0ZSBvdXQgb3VyIG1vZHVsZSBoZWFkZXJzLCB0aGlzXG4gICAgLy8gaXMgd2hlcmUgd2UgaGFuZGxlIHN0dWZmIGxpa2UgaW1wb3J0cywgYW55IHJlcXVpcmVkIGluaXRpYWxpemF0aW9uLCBldGMuXG4gICAgY29kZS5saW5lKCdpbXBvcnQgYWJjJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgYnVpbHRpbnMnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBkYXRldGltZScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGVudW0nKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCB0eXBpbmcnKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBqc2lpJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgcHVibGljYXRpb24nKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCB0eXBpbmdfZXh0ZW5zaW9ucycpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gd3JpdGUgb3V0IHRoZSBrZXJuZWwgbG9hZCBsaW5lLlxuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgdGhpcy5lbWl0RGVwZW5kZW5jeUltcG9ydHMoY29kZSk7XG5cbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgZW1pdExpc3QoXG4gICAgICAgIGNvZGUsXG4gICAgICAgICdfX2pzaWlfYXNzZW1ibHlfXyA9IGpzaWkuSlNJSUFzc2VtYmx5LmxvYWQoJyxcbiAgICAgICAgW1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkubmFtZSksXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS52ZXJzaW9uKSxcbiAgICAgICAgICAnX19uYW1lX19bMDotNl0nLFxuICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHlGaWxlbmFtZSl9YCxcbiAgICAgICAgXSxcbiAgICAgICAgJyknLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlbiB3ZSBtdXN0IGltcG9ydCB0aGUgLl9qc2lpIHN1YnBhY2thZ2UuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGxldCBkaXN0YW5jZUZyb21Sb290ID0gMDtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBjdXJyID0gdGhpcy5mcW4hO1xuICAgICAgICBjdXJyICE9PSB0aGlzLmFzc2VtYmx5Lm5hbWU7XG4gICAgICAgIGN1cnIgPSBjdXJyLnN1YnN0cmluZygwLCBjdXJyLmxhc3RJbmRleE9mKCcuJykpXG4gICAgICApIHtcbiAgICAgICAgZGlzdGFuY2VGcm9tUm9vdCsrO1xuICAgICAgfVxuICAgICAgY29kZS5saW5lKGBmcm9tICR7Jy4nLnJlcGVhdChkaXN0YW5jZUZyb21Sb290ICsgMSl9X2pzaWkgaW1wb3J0ICpgKTtcblxuICAgICAgdGhpcy5lbWl0UmVxdWlyZWRJbXBvcnRzKGNvZGUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIEVtaXQgYWxsIG9mIG91ciBtZW1iZXJzLlxuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHByZXBhcmVNZW1iZXJzKHRoaXMubWVtYmVycywgcmVzb2x2ZXIpKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gV2hhdGV2ZXIgbmFtZXMgd2UndmUgZXhwb3J0ZWQsIHdlJ2xsIHdyaXRlIG91dCBvdXIgX19hbGxfXyB0aGF0IGxpc3RzIHRoZW0uXG4gICAgY29uc3QgZXhwb3J0ZWRNZW1iZXJzID0gdGhpcy5tZW1iZXJzLm1hcCgobSkgPT4gYFwiJHttLnB5dGhvbk5hbWV9XCJgKTtcbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIGV4cG9ydGVkTWVtYmVycy5wdXNoKCdcIl9fanNpaV9hc3NlbWJseV9fXCInKTtcbiAgICB9XG5cbiAgICAvLyBEZWNsYXJlIHRoZSBsaXN0IG9mIFwicHVibGljXCIgbWVtYmVycyB0aGlzIG1vZHVsZSBleHBvcnRzXG4gICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gICAgY29kZS5saW5lKCk7XG5cbiAgICBpZiAoZXhwb3J0ZWRNZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUuaW5kZW50KCdfX2FsbF9fID0gWycpO1xuICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgZXhwb3J0ZWRNZW1iZXJzLnNvcnQoKSkge1xuICAgICAgICAvLyBXcml0aW5nIG9uZSBieSBsaW5lIG1pZ2h0IGJlIF9hIGxvdF8gb2YgbGluZXMsIGJ1dCBpdCdsbCBtYWtlIHJldmlld2luZyBjaGFuZ2VzIHRvIHRoZSBsaXN0IGVhc2llci4gVHJ1c3QgbWUuXG4gICAgICAgIGNvZGUubGluZShgJHttZW1iZXJ9LGApO1xuICAgICAgfVxuICAgICAgY29kZS51bmluZGVudCgnXScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ19fYWxsX186IHR5cGluZy5MaXN0W3R5cGluZy5BbnldID0gW10nKTtcbiAgICB9XG5cbiAgICAvLyBOZXh0IHVwLCB3ZSdsbCB1c2UgcHVibGljYXRpb24gdG8gZW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBub24tcHVibGljIG5hbWVzXG4gICAgLy8gZ2V0IGhpZGRlbiBmcm9tIGRpcigpLCB0YWItY29tcGxldGUsIGV0Yy5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoJ3B1YmxpY2F0aW9uLnB1Ymxpc2goKScpO1xuXG4gICAgLy8gRmluYWxseSwgd2UnbGwgbG9hZCBhbGwgcmVnaXN0ZXJlZCBweXRob24gbW9kdWxlc1xuICAgIGlmICh0aGlzLm1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgICcjIExvYWRpbmcgbW9kdWxlcyB0byBlbnN1cmUgdGhlaXIgdHlwZXMgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUganNpaSBydW50aW1lIGxpYnJhcnknLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIHRoaXMubW9kdWxlcy5zb3J0KChsLCByKSA9PlxuICAgICAgICBsLnB5dGhvbk5hbWUubG9jYWxlQ29tcGFyZShyLnB5dGhvbk5hbWUpLFxuICAgICAgKSkge1xuICAgICAgICBjb2RlLmxpbmUoYGltcG9ydCAke21vZHVsZS5weXRob25OYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBiaW4gc2NyaXB0cyBpZiBiaW4gc2VjdGlvbiBkZWZpbmVkLlxuICAgKi9cbiAgcHVibGljIGVtaXRCaW5TY3JpcHRzKGNvZGU6IENvZGVNYWtlcik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzY3JpcHRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIGlmICh0aGlzLmFzc2VtYmx5LmJpbiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LmJpbikpIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHRfZmlsZSA9IHBhdGguam9pbihcbiAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUodGhpcy5weXRob25OYW1lKSxcbiAgICAgICAgICAgICdiaW4nLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvZGUub3BlbkZpbGUoc2NyaXB0X2ZpbGUpO1xuICAgICAgICAgIGNvZGUubGluZSgnIyEvdXNyL2Jpbi9lbnYgcHl0aG9uJyk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgY29kZS5saW5lKCdpbXBvcnQganNpaScpO1xuICAgICAgICAgIGNvZGUubGluZSgnaW1wb3J0IHN5cycpO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGVtaXRMaXN0KFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICdfX2pzaWlfYXNzZW1ibHlfXyA9IGpzaWkuSlNJSUFzc2VtYmx5LmxvYWQoJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS5uYW1lKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS52ZXJzaW9uKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5weXRob25OYW1lLnJlcGxhY2UoJy5fanNpaScsICcnKSksXG4gICAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHlGaWxlbmFtZSl9YCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBlbWl0TGlzdChcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18uaW52b2tlQmluU2NyaXB0KCcsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkubmFtZSksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpLFxuICAgICAgICAgICAgICAnc3lzLmFyZ3ZbMTpdJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLmNsb3NlRmlsZShzY3JpcHRfZmlsZSk7XG4gICAgICAgICAgc2NyaXB0cy5wdXNoKHNjcmlwdF9maWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCB0aGUgUkVBRE1FIGFzIG1vZHVsZSBkb2NzdHJpbmcgaWYgdGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgbW9kdWxlIChpdCBsb2FkcyB0aGUgYXNzZW1ibHkpXG4gICAqL1xuICBwcml2YXRlIGVtaXRNb2R1bGVEb2N1bWVudGF0aW9uKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGlmICh0aGlzLm1vZHVsZURvY3VtZW50YXRpb24pIHtcbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICAgIGNvZGUubGluZSh0aGlzLm1vZHVsZURvY3VtZW50YXRpb24pO1xuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdERlcGVuZGVuY3lJbXBvcnRzKGNvZGU6IENvZGVNYWtlcikge1xuICAgIC8vIENvbGxlY3QgYWxsIHRoZSAoZGlyZWN0KSBkZXBlbmRlbmNpZXMnIC5fanNpaSBwYWNrYWdlcy5cbiAgICBjb25zdCBkZXBzID0gT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS5kZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAubWFwKFxuICAgICAgICAoZGVwKSA9PlxuICAgICAgICAgIHRoaXMuYXNzZW1ibHkuZGVwZW5kZW5jeUNsb3N1cmU/LltkZXBdPy50YXJnZXRzPy5weXRob24/Lm1vZHVsZSA/P1xuICAgICAgICAgIGRpZShgTm8gUHl0aG9uIHRhcmdldCB3YXMgY29uZmlncnVlZCBmb3IgdGhlIGRlcGVuZGVuY3kgXCIke2RlcH1cIi5gKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKG1vZCkgPT4gYCR7bW9kfS5fanNpaWApXG4gICAgICAuc29ydCgpO1xuXG4gICAgLy8gTm93IGFjdHVhbGx5IHdyaXRlIHRoZSBpbXBvcnQgc3RhdGVtZW50cy4uLlxuICAgIGlmIChkZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGVOYW1lIG9mIGRlcHMpIHtcbiAgICAgICAgY29kZS5saW5lKGBpbXBvcnQgJHttb2R1bGVOYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdFJlcXVpcmVkSW1wb3J0cyhjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgcmVxdWlyZWRJbXBvcnRzID0gdGhpcy5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkSW1wb3J0cylcbiAgICAgIC5tYXAoKFtzb3VyY2VQYWNrYWdlLCBpdGVtc10pID0+IHRvSW1wb3J0U3RhdGVtZW50cyhzb3VyY2VQYWNrYWdlLCBpdGVtcykpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBlbHQpID0+IFsuLi5hY2MsIC4uLmVsdF0sXG4gICAgICAgIG5ldyBBcnJheTx7IGVtaXQ6ICgpID0+IHZvaWQ7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfT4oKSxcbiAgICAgIClcbiAgICAgIC5zb3J0KGltcG9ydENvbXBhcmF0b3IpO1xuXG4gICAgaWYgKHN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHN0YXRlbWVudHMpIHtcbiAgICAgIHN0YXRlbWVudC5lbWl0KGNvZGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW1wb3J0U3RhdGVtZW50cyhcbiAgICAgIHNvdXJjZVBrZzogc3RyaW5nLFxuICAgICAgaXRlbXM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gICAgKTogQXJyYXk8eyBlbWl0OiAoY29kZTogQ29kZU1ha2VyKSA9PiB2b2lkOyBjb21wYXJpc29uQmFzZTogc3RyaW5nIH0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTx7XG4gICAgICAgIGVtaXQ6IChjb2RlOiBDb2RlTWFrZXIpID0+IHZvaWQ7XG4gICAgICAgIGNvbXBhcmlzb25CYXNlOiBzdHJpbmc7XG4gICAgICB9PigpO1xuICAgICAgaWYgKGl0ZW1zLmhhcygnJykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGNvbXBhcmlzb25CYXNlOiBgaW1wb3J0ICR7c291cmNlUGtnfWAsXG4gICAgICAgICAgZW1pdChjb2RlKSB7XG4gICAgICAgICAgICBjb2RlLmxpbmUodGhpcy5jb21wYXJpc29uQmFzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwaWVjZU1lYWwgPSBBcnJheS5mcm9tKGl0ZW1zKVxuICAgICAgICAuZmlsdGVyKChpKSA9PiBpICE9PSAnJylcbiAgICAgICAgLnNvcnQoKTtcbiAgICAgIGlmIChwaWVjZU1lYWwubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY29tcGFyaXNvbkJhc2U6IGBmcm9tICR7c291cmNlUGtnfSBpbXBvcnRgLFxuICAgICAgICAgIGVtaXQ6IChjb2RlKSA9PlxuICAgICAgICAgICAgZW1pdExpc3QoY29kZSwgYGZyb20gJHtzb3VyY2VQa2d9IGltcG9ydCBgLCBwaWVjZU1lYWwsICcnLCB7XG4gICAgICAgICAgICAgIGlmTXVsdGk6IFsnKCcsICcpJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGltcG9ydENvbXBhcmF0b3IoXG4gICAgICBsZWZ0OiB7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfSxcbiAgICAgIHJpZ2h0OiB7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfSxcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGVmdC5jb21wYXJpc29uQmFzZS5zdGFydHNXaXRoKCdpbXBvcnQnKSA9PT1cbiAgICAgICAgcmlnaHQuY29tcGFyaXNvbkJhc2Uuc3RhcnRzV2l0aCgnaW1wb3J0JylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbGVmdC5jb21wYXJpc29uQmFzZS5sb2NhbGVDb21wYXJlKHJpZ2h0LmNvbXBhcmlzb25CYXNlKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIHdhbnQgXCJmcm9tIC5mb28gaW1wb3J0ICguLi4pXCIgdG8gYmUgKmFmdGVyKiBcImltcG9ydCBiYXJcIlxuICAgICAgcmV0dXJuIHJpZ2h0LmNvbXBhcmlzb25CYXNlLmxvY2FsZUNvbXBhcmUobGVmdC5jb21wYXJpc29uQmFzZSk7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBQYWNrYWdlRGF0YSB7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuY2xhc3MgUGFja2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgUHl0aG9uTW9kdWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBtb2R1bGUgb2YgdGhlIHBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyByb290TW9kdWxlPzogUHl0aG9uTW9kdWxlO1xuXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YTogc3BlYy5Bc3NlbWJseTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXMgPSBuZXcgTWFwPHN0cmluZywgUHl0aG9uTW9kdWxlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBuZXcgTWFwPHN0cmluZywgUGFja2FnZURhdGFbXT4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNb2R1bGUobW9kdWxlOiBQeXRob25Nb2R1bGUpIHtcbiAgICB0aGlzLm1vZHVsZXMuc2V0KG1vZHVsZS5weXRob25OYW1lLCBtb2R1bGUpO1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgbW9kdWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgYXNzZW1ibHlcbiAgICBpZiAobW9kdWxlLmZxbiA9PT0gdGhpcy5tZXRhZGF0YS5uYW1lKSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZERhdGEoXG4gICAgbW9kdWxlOiBQeXRob25Nb2R1bGUsXG4gICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICBkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGlmICghdGhpcy5kYXRhLmhhcyhtb2R1bGUucHl0aG9uTmFtZSkpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXQobW9kdWxlLnB5dGhvbk5hbWUsIFtdKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEuZ2V0KG1vZHVsZS5weXRob25OYW1lKSEucHVzaCh7IGZpbGVuYW1lLCBkYXRhIH0pO1xuICB9XG5cbiAgcHVibGljIHdyaXRlKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtb2R1bGVzID0gWy4uLnRoaXMubW9kdWxlcy52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT5cbiAgICAgIGEucHl0aG9uTmFtZS5sb2NhbGVDb21wYXJlKGIucHl0aG9uTmFtZSksXG4gICAgKTtcblxuICAgIGNvbnN0IHNjcmlwdHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiBvdXIgbW9kdWxlcywgYW5kIHdyaXRlIHRoZW0gb3V0IHRvIGRpc2suXG4gICAgZm9yIChjb25zdCBtb2Qgb2YgbW9kdWxlcykge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmpvaW4oXG4gICAgICAgICdzcmMnLFxuICAgICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZShtb2QucHl0aG9uTmFtZSksXG4gICAgICAgICdfX2luaXRfXy5weScsXG4gICAgICApO1xuXG4gICAgICBjb2RlLm9wZW5GaWxlKGZpbGVuYW1lKTtcbiAgICAgIG1vZC5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICAgICAgY29kZS5jbG9zZUZpbGUoZmlsZW5hbWUpO1xuXG4gICAgICBzY3JpcHRzLnB1c2goLi4ubW9kLmVtaXRCaW5TY3JpcHRzKGNvZGUpKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgb3VyIHBhY2thZ2UgZGF0YS5cbiAgICBjb25zdCBwYWNrYWdlRGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgZm9yIChjb25zdCBbbW9kLCBwZGF0YV0gb2YgdGhpcy5kYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IGRhdGEgb2YgcGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAnc3JjJyxcbiAgICAgICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKG1vZCksXG4gICAgICAgICAgICBkYXRhLmZpbGVuYW1lLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb2RlLm9wZW5GaWxlKGZpbGVwYXRoKTtcbiAgICAgICAgICBjb2RlLmxpbmUoZGF0YS5kYXRhKTtcbiAgICAgICAgICBjb2RlLmNsb3NlRmlsZShmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFja2FnZURhdGFbbW9kXSA9IHBkYXRhLm1hcCgocGQpID0+IHBkLmZpbGVuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIG91ciBsaXN0IG9mIGRlcGVuZGVuY2llc1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtkZXBOYW1lLCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIHRoaXMubWV0YWRhdGEuZGVwZW5kZW5jaWVzID8/IHt9LFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGRlcEluZm8gPSB0aGlzLm1ldGFkYXRhLmRlcGVuZGVuY3lDbG9zdXJlIVtkZXBOYW1lXTtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgICBgJHtkZXBJbmZvLnRhcmdldHMhLnB5dGhvbiEuZGlzdE5hbWV9JHt0b1B5dGhvblZlcnNpb25SYW5nZSh2ZXJzaW9uKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOZWVkIHRvIGFsd2F5cyB3cml0ZSB0aGlzIGZpbGUgYXMgdGhlIGJ1aWxkIHByb2Nlc3MgZGVwZW5kcyBvbiBpdC5cbiAgICAvLyBNYWtlIHVwIHNvbWUgY29udGVudHMgaWYgd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB1c2VmdWwgdG8gc2F5LlxuICAgIGNvZGUub3BlbkZpbGUoJ1JFQURNRS5tZCcpO1xuICAgIGNvZGUubGluZShcbiAgICAgIHRoaXMucm9vdE1vZHVsZT8ubW9kdWxlRG9jdW1lbnRhdGlvbiA/P1xuICAgICAgICBgJHt0aGlzLm5hbWV9XFxuJHsnPScucmVwZWF0KHRoaXMubmFtZS5sZW5ndGgpfWAsXG4gICAgKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgnUkVBRE1FLm1kJyk7XG5cbiAgICAvLyBTdHJpcCBcIiAoYnVpbGQgYWJjZGVmKVwiIGZyb20gdGhlIGpzaWkgdmVyc2lvblxuICAgIGNvbnN0IGpzaWlWZXJzaW9uU2ltcGxlID0gdGhpcy5tZXRhZGF0YS5qc2lpVmVyc2lvbi5yZXBsYWNlKC8gLiokLywgJycpO1xuXG4gICAgY29uc3Qgc2V0dXBLd2FyZ3MgPSB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGxpY2Vuc2U6IHRoaXMubWV0YWRhdGEubGljZW5zZSxcbiAgICAgIHVybDogdGhpcy5tZXRhZGF0YS5ob21lcGFnZSxcbiAgICAgIGxvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlOiAndGV4dC9tYXJrZG93bicsXG4gICAgICBhdXRob3I6XG4gICAgICAgIHRoaXMubWV0YWRhdGEuYXV0aG9yLm5hbWUgK1xuICAgICAgICAodGhpcy5tZXRhZGF0YS5hdXRob3IuZW1haWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYDwke3RoaXMubWV0YWRhdGEuYXV0aG9yLmVtYWlsfT5gXG4gICAgICAgICAgOiAnJyksXG4gICAgICBiZGlzdF93aGVlbDoge1xuICAgICAgICB1bml2ZXJzYWw6IHRydWUsXG4gICAgICB9LFxuICAgICAgcHJvamVjdF91cmxzOiB7XG4gICAgICAgIFNvdXJjZTogdGhpcy5tZXRhZGF0YS5yZXBvc2l0b3J5LnVybCxcbiAgICAgIH0sXG4gICAgICBwYWNrYWdlX2RpcjogeyAnJzogJ3NyYycgfSxcbiAgICAgIHBhY2thZ2VzOiBtb2R1bGVzLm1hcCgobSkgPT4gbS5weXRob25OYW1lKSxcbiAgICAgIHBhY2thZ2VfZGF0YTogcGFja2FnZURhdGEsXG4gICAgICBweXRob25fcmVxdWlyZXM6ICc+PTMuNicsXG4gICAgICBpbnN0YWxsX3JlcXVpcmVzOiBbXG4gICAgICAgIGBqc2lpJHt0b1B5dGhvblZlcnNpb25SYW5nZShgXiR7anNpaVZlcnNpb25TaW1wbGV9YCl9YCxcbiAgICAgICAgJ3B1YmxpY2F0aW9uPj0wLjAuMycsXG4gICAgICBdXG4gICAgICAgIC5jb25jYXQoZGVwZW5kZW5jaWVzKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgY2xhc3NpZmllcnM6IFtcbiAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLFxuICAgICAgICAnT3BlcmF0aW5nIFN5c3RlbSA6OiBPUyBJbmRlcGVuZGVudCcsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBKYXZhU2NyaXB0JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzIDo6IE9ubHknLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNicsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy43JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjgnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOScsXG4gICAgICAgICdUeXBpbmcgOjogVHlwZWQnLFxuICAgICAgXSxcbiAgICAgIHNjcmlwdHMsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5tZXRhZGF0YS5kb2NzPy5zdGFiaWxpdHkpIHtcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LlN0YWJsZTpcbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaChcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNyAtIEluYWN0aXZlJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIE5vICdEZXZlbG9wbWVudCBTdGF0dXMnIHRyb3ZlIGNsYXNzaWZpZXIgZm9yIHlvdSFcbiAgICB9XG5cbiAgICBpZiAoc3BkeExpY2Vuc2VMaXN0W3RoaXMubWV0YWRhdGEubGljZW5zZV0/Lm9zaUFwcHJvdmVkKSB7XG4gICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZGl0aW9uYWxDbGFzc2lmaWVycyA9IHRoaXMubWV0YWRhdGEudGFyZ2V0cz8ucHl0aG9uPy5jbGFzc2lmaWVycztcbiAgICBpZiAoYWRkaXRpb25hbENsYXNzaWZpZXJzICE9IG51bGwpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhZGRpdGlvbmFsQ2xhc3NpZmllcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIFwianNpaS50YXJnZXRzLnB5dGhvbi5jbGFzc2lmaWVyc1wiIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpZiBwcm92aWRlZCwgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBhZGRpdGlvbmFsQ2xhc3NpZmllcnMsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBXZSBkaXNjb3VyYWdlIHVzaW5nIHRob3NlIHNpbmNlIHdlIGF1dG9tYXRpY2FsbHkgc2V0IGEgdmFsdWUgZm9yIHRoZW1cbiAgICAgIGZvciAobGV0IGNsYXNzaWZpZXIgb2YgYWRkaXRpb25hbENsYXNzaWZpZXJzLnNvcnQoKSkge1xuICAgICAgICBpZiAodHlwZW9mIGNsYXNzaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBcImpzaWkudGFyZ2V0cy5weXRob24uY2xhc3NpZmllcnNcIiB2YWx1ZSBjYW4gb25seSBjb250YWluIHN0cmluZ3MsIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBjbGFzc2lmaWVyLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UnbGwgc3BsaXQgb24gYDo6YCBhbmQgcmUtam9pbiBsYXRlciBzbyBjbGFzc2lmaWVycyBhcmUgXCJub3JtYWxpemVkXCIgdG8gYSBzdGFuZGFyZCBzcGFjaW5nXG4gICAgICAgIGNvbnN0IHBhcnRzID0gY2xhc3NpZmllci5zcGxpdCgnOjonKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKTtcbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRDbGFzc2lmaWVycyA9IFtcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzJyxcbiAgICAgICAgICAnTGljZW5zZScsXG4gICAgICAgICAgJ09wZXJhdGluZyBTeXN0ZW0nLFxuICAgICAgICAgICdUeXBpbmcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAocmVzZXJ2ZWRDbGFzc2lmaWVycy5pbmNsdWRlcyhwYXJ0c1swXSkpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYENsYXNzaWZpZXJzIHN0YXJ0aW5nIHdpdGggJHtyZXNlcnZlZENsYXNzaWZpZXJzXG4gICAgICAgICAgICAgIC5tYXAoKHgpID0+IGBcIiR7eH0gOjpcImApXG4gICAgICAgICAgICAgIC5qb2luKFxuICAgICAgICAgICAgICAgICcsICcsXG4gICAgICAgICAgICAgICl9IGFyZSBhdXRvbWF0aWNhbGx5IHNldCBhbmQgc2hvdWxkIG5vdCBiZSBtYW51YWxseSBjb25maWd1cmVkYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzaWZpZXIgPSBwYXJ0cy5qb2luKCcgOjogJyk7XG4gICAgICAgIGlmIChzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5pbmNsdWRlcyhjbGFzc2lmaWVyKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goY2xhc3NpZmllcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgTmVlZCBhIHNldHVwLnB5IHRvIG1ha2UgdGhpcyBQYWNrYWdlLCBhY3R1YWxseSBhIFBhY2thZ2UuXG4gICAgY29kZS5vcGVuRmlsZSgnc2V0dXAucHknKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBqc29uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgc2V0dXB0b29scycpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgna3dhcmdzID0ganNvbi5sb2FkcygnKTtcbiAgICBjb2RlLmxpbmUoJyAgICBcIlwiXCInKTtcbiAgICBjb2RlLmxpbmUoSlNPTi5zdHJpbmdpZnkoc2V0dXBLd2FyZ3MsIG51bGwsIDQpKTtcbiAgICBjb2RlLmxpbmUoJ1wiXCJcIicpO1xuICAgIGNvZGUubGluZSgnKScpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCd3aXRoIG9wZW4oXCJSRUFETUUubWRcIiwgZW5jb2Rpbmc9XCJ1dGY4XCIpIGFzIGZwJyk7XG4gICAgY29kZS5saW5lKCdrd2FyZ3NbXCJsb25nX2Rlc2NyaXB0aW9uXCJdID0gZnAucmVhZCgpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdzZXR1cHRvb2xzLnNldHVwKCoqa3dhcmdzKScpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdzZXR1cC5weScpO1xuXG4gICAgLy8gQmVjYXVzZSB3ZSdyZSBnb29kIGNpdGl6ZW5zLCB3ZSdyZSBnb2luZyB0byBnbyBhaGVhZCBhbmQgc3VwcG9ydCBweXByb2plY3QudG9tbFxuICAgIC8vIGFzIHdlbGwuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgZWFzaWVyIHRvIGp1c3QgdXNlIGEgVE9NTCBsaWJyYXJ5IHRvIHdyaXRlIHRoaXMgb3V0LlxuICAgIGNvZGUub3BlbkZpbGUoJ3B5cHJvamVjdC50b21sJyk7XG4gICAgY29kZS5saW5lKCdbYnVpbGQtc3lzdGVtXScpO1xuICAgIGNvbnN0IGJ1aWxkVG9vbHMgPSBmc1xuICAgICAgLnJlYWRGaWxlU3luYyhyZXF1aXJlbWVudHNGaWxlLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChsaW5lKSA9PiAvXlxccyooLispXFxzKiNcXHMqYnVpbGQtc3lzdGVtXFxzKiQvLmV4ZWMobGluZSk/LlsxXT8udHJpbSgpKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGJ1aWxkVG9vbHMsIGVudHJ5KSA9PiAoZW50cnkgPyBbLi4uYnVpbGRUb29scywgZW50cnldIDogYnVpbGRUb29scyksXG4gICAgICAgIG5ldyBBcnJheTxzdHJpbmc+KCksXG4gICAgICApO1xuICAgIGNvZGUubGluZShgcmVxdWlyZXMgPSBbJHtidWlsZFRvb2xzLm1hcCgoeCkgPT4gYFwiJHt4fVwiYCkuam9pbignLCAnKX1dYCk7XG4gICAgY29kZS5saW5lKCdidWlsZC1iYWNrZW5kID0gXCJzZXR1cHRvb2xzLmJ1aWxkX21ldGFcIicpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdweXByb2plY3QudG9tbCcpO1xuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdyaXRlIG91dCBhIE1BTklGRVNULmluIHRvIGVuc3VyZSB0aGF0IGFsbCBvZiBvdXIgcmVxdWlyZWRcbiAgICAvLyBmaWxlcyBhcmUgaW5jbHVkZWQuXG4gICAgY29kZS5vcGVuRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgICBjb2RlLmxpbmUoJ2luY2x1ZGUgcHlwcm9qZWN0LnRvbWwnKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgfVxufVxuXG50eXBlIEZpbmRNb2R1bGVDYWxsYmFjayA9IChmcW46IHN0cmluZykgPT4gc3BlYy5Bc3NlbWJseUNvbmZpZ3VyYXRpb247XG50eXBlIEZpbmRUeXBlQ2FsbGJhY2sgPSAoZnFuOiBzdHJpbmcpID0+IHNwZWMuVHlwZTtcblxuY2xhc3MgVHlwZVJlc29sdmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRUbz86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZFJlITogUmVnRXhwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmUhOiBSZWdFeHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT4sXG4gICAgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrLFxuICAgIGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrLFxuICAgIGJvdW5kVG8/OiBzdHJpbmcsXG4gICAgbW9kdWxlTmFtZT86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgIHRoaXMuZmluZE1vZHVsZSA9IGZpbmRNb2R1bGU7XG4gICAgdGhpcy5maW5kVHlwZSA9IGZpbmRUeXBlO1xuICAgIHRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7XG4gICAgdGhpcy5ib3VuZFRvID0gYm91bmRUbyAhPT0gdW5kZWZpbmVkID8gdGhpcy50b1B5dGhvbkZRTihib3VuZFRvKSA6IGJvdW5kVG87XG5cbiAgICBpZiAodGhpcy5tb2R1bGVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubW9kdWxlUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLm1vZHVsZU5hbWUpfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYm91bmRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJvdW5kUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLmJvdW5kVG8pfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJpbmQoZnFuOiBzdHJpbmcsIG1vZHVsZU5hbWU/OiBzdHJpbmcpOiBUeXBlUmVzb2x2ZXIge1xuICAgIHJldHVybiBuZXcgVHlwZVJlc29sdmVyKFxuICAgICAgdGhpcy50eXBlcyxcbiAgICAgIHRoaXMuZmluZE1vZHVsZSxcbiAgICAgIHRoaXMuZmluZFR5cGUsXG4gICAgICBmcW4sXG4gICAgICBtb2R1bGVOYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJy4nKVxuICAgICAgICAgID8gYCR7dGhpcy5tb2R1bGVOYW1lfSR7bW9kdWxlTmFtZX1gXG4gICAgICAgICAgOiBtb2R1bGVOYW1lXG4gICAgICAgIDogdGhpcy5tb2R1bGVOYW1lLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk1vZHVsZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLm1vZHVsZVJlLnRlc3QocHl0aG9uVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk5hbWVzcGFjZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLmJvdW5kUmUudGVzdChweXRob25UeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJlbnQodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCBmcW4gPSB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0eXBlUmVmLmZxbiA6IHR5cGVSZWY7XG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKC4rKVxcLlteLl0rJC8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBwYXJlbnRGUU5dID0gbWF0Y2hlcztcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnR5cGVzLmdldChwYXJlbnRGUU4pO1xuXG4gICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhcmVudDogICR7cGFyZW50RlFOfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmaW5pbmdQeXRob25Nb2R1bGUoXG4gICAgdHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZnFuID0gdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdHlwZVJlZi5mcW4gOiB0eXBlUmVmO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHlwZXMuZ2V0KGZxbik7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBsZXQgbW9kID0gcGFyZW50O1xuICAgICAgd2hpbGUgKCEobW9kIGluc3RhbmNlb2YgUHl0aG9uTW9kdWxlKSkge1xuICAgICAgICBtb2QgPSB0aGlzLmdldFBhcmVudChtb2QuZnFuISk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbW9kLnB5dGhvbk5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKFteLl0rKVxcLi8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBhc3NtXSA9IG1hdGNoZXM7XG4gICAgcmV0dXJuIHRoaXMuZmluZE1vZHVsZShhc3NtKS50YXJnZXRzIS5weXRob24hLm1vZHVsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUeXBlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKTogUHl0aG9uVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KHR5cGVSZWYuZnFuKTtcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvY2F0ZSB0eXBlOiBcIiR7dHlwZVJlZi5mcW59XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBkZXJlZmVyZW5jZSh0eXBlUmVmOiBzdHJpbmcgfCBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSk6IHNwZWMuVHlwZSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgdHlwZVJlZiA9IHR5cGVSZWYuZnFuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5kVHlwZSh0eXBlUmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9QeXRob25GUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IFthc3NlbWJseU5hbWUsIC4uLnF1YWxpZmllZElkZW50aWZpZXJzXSA9IGZxbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGZxblBhcnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgIHRoaXMuZmluZE1vZHVsZShhc3NlbWJseU5hbWUpLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcXVhbGlmaWVkSWRlbnRpZmllcnMpIHtcbiAgICAgIGZxblBhcnRzLnB1c2godG9QeXRob25JZGVudGlmaWVyKHBhcnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnFuUGFydHMuam9pbignLicpO1xuICB9XG59XG5cbmNsYXNzIFB5dGhvbkdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7XG4gIHByaXZhdGUgcGFja2FnZSE6IFBhY2thZ2U7XG4gIHByaXZhdGUgcm9vdE1vZHVsZT86IFB5dGhvbk1vZHVsZTtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9zZXR0YTogUm9zZXR0YSxcbiAgICBvcHRpb25zOiBHZW5lcmF0b3JPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9ja0Zvcm1hdHRlciA9IChzKSA9PiBgJHtzfTpgO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrRm9ybWF0dGVyID0gKF9zKSA9PiBmYWxzZTtcblxuICAgIHRoaXMudHlwZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBwdWJsaWMgZW1pdERvY1N0cmluZyhcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgYXBpTG9jYXRpb246IEFwaUxvY2F0aW9uLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhcmd1bWVudHM/OiBEb2N1bWVudGFibGVBcmd1bWVudFtdO1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbT86IHN0cmluZztcbiAgICAgIHRyYWlsaW5nTmV3TGluZT86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBpZiAoKCFkb2NzIHx8IE9iamVjdC5rZXlzKGRvY3MpLmxlbmd0aCA9PT0gMCkgJiYgIW9wdGlvbnMuYXJndW1lbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZG9jcykge1xuICAgICAgZG9jcyA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICAgIGxpbmVzLnB1c2gobWQycnN0KHJlbmRlclN1bW1hcnkoZG9jcykpKTtcbiAgICAgIGJyaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBicmsoKSB7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJsb2NrKGhlYWRpbmc6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBkb0JyayA9IHRydWUpIHtcbiAgICAgIGlmIChkb0Jyaykge1xuICAgICAgICBicmsoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRlbnRMaW5lcyA9IG1kMnJzdChjb250ZW50KS5zcGxpdCgnXFxuJyk7XG4gICAgICBpZiAoY29udGVudExpbmVzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYDoke2hlYWRpbmd9OiAke2NvbnRlbnRMaW5lcy5qb2luKCcnKX1gLnRyaW0oKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGA6JHtoZWFkaW5nfTpgKTtcbiAgICAgICAgYnJrKCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50TGluZXMpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRvQnJrKSB7XG4gICAgICAgIGJyaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgLi4ubWQycnN0KHRoaXMuY29udmVydE1hcmtkb3duKGRvY3MucmVtYXJrcyA/PyAnJywgYXBpTG9jYXRpb24pKS5zcGxpdChcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hcmd1bWVudHM/Lmxlbmd0aCA/PyAwID4gMCkge1xuICAgICAgYnJrKCk7XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIG9wdGlvbnMuYXJndW1lbnRzISkge1xuICAgICAgICAvLyBBZGQgYSBsaW5lIGZvciBldmVyeSBhcmd1bWVudC4gRXZlbiBpZiB0aGVyZSBpcyBubyBkZXNjcmlwdGlvbiwgd2UgbmVlZFxuICAgICAgICAvLyB0aGUgZG9jc3RyaW5nIHNvIHRoYXQgdGhlIFNwaGlueCBleHRlbnNpb24gY2FuIGFkZCB0aGUgdHlwZSBhbm5vdGF0aW9ucy5cbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgOnBhcmFtICR7dG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUpfTogJHtvbmVsaW5lRGVzY3JpcHRpb24oXG4gICAgICAgICAgICBwYXJhbS5kb2NzLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyaygpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICAgIGJsb2NrKCdkZWZhdWx0JywgZG9jcy5kZWZhdWx0KTtcbiAgICB9XG4gICAgaWYgKGRvY3MucmV0dXJucykge1xuICAgICAgYmxvY2soJ3JldHVybicsIGRvY3MucmV0dXJucyk7XG4gICAgfVxuICAgIGlmIChkb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIGJsb2NrKCdkZXByZWNhdGVkJywgZG9jcy5kZXByZWNhdGVkKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc2VlKSB7XG4gICAgICBibG9jaygnc2VlJywgZG9jcy5zZWUsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3RhYmlsaXR5ICYmIHNob3VsZE1lbnRpb25TdGFiaWxpdHkoZG9jcy5zdGFiaWxpdHkpKSB7XG4gICAgICBibG9jaygnc3RhYmlsaXR5JywgZG9jcy5zdGFiaWxpdHksIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3ViY2xhc3NhYmxlKSB7XG4gICAgICBibG9jaygnc3ViY2xhc3NhYmxlJywgJ1llcycpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRvY3MuY3VzdG9tID8/IHt9KSkge1xuICAgICAgYmxvY2soaywgdiwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmV4YW1wbGUpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaCgnRXhhbXBsZTo6Jyk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGNvbnN0IGV4YW1wbGVUZXh0ID0gdGhpcy5jb252ZXJ0RXhhbXBsZShkb2NzLmV4YW1wbGUsIGFwaUxvY2F0aW9uKTtcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGV4YW1wbGVUZXh0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgJHtsaW5lfWApO1xuICAgICAgfVxuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09ICcnKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29kZS5saW5lKGAke0RPQ1NUUklOR19RVU9URVN9JHtsaW5lc1swXX0ke0RPQ1NUUklOR19RVU9URVN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZShgJHtET0NTVFJJTkdfUVVPVEVTfSR7bGluZXNbMF19YCk7XG4gICAgICBsaW5lcy5zcGxpY2UoMCwgMSk7XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb2RlLmxpbmUobGluZSk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudHJhaWxpbmdOZXdMaW5lKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29udmVydEV4YW1wbGUoZXhhbXBsZTogc3RyaW5nLCBhcGlMb2M6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZUV4YW1wbGUoXG4gICAgICBhcGlMb2MsXG4gICAgICBleGFtcGxlLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMucHJlZml4RGlzY2xhaW1lcih0cmFuc2xhdGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBjb252ZXJ0TWFya2Rvd24obWFya2Rvd246IHN0cmluZywgYXBpTG9jOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9zZXR0YS50cmFuc2xhdGVTbmlwcGV0c0luTWFya2Rvd24oXG4gICAgICBhcGlMb2MsXG4gICAgICBtYXJrZG93bixcbiAgICAgIFRhcmdldExhbmd1YWdlLlBZVEhPTixcbiAgICAgIGVuZm9yY2VzU3RyaWN0TW9kZSh0aGlzLmFzc2VtYmx5KSxcbiAgICAgICh0cmFucykgPT4gKHtcbiAgICAgICAgbGFuZ3VhZ2U6IHRyYW5zLmxhbmd1YWdlLFxuICAgICAgICBzb3VyY2U6IHRoaXMucHJlZml4RGlzY2xhaW1lcih0cmFucyksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQ6IFRyYW5zbGF0aW9uKSB7XG4gICAgaWYgKHRyYW5zbGF0ZWQuZGlkQ29tcGlsZSAmJiBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfQ09NUElMSU5HKSB7XG4gICAgICByZXR1cm4gYCMgJHtJTkNPTVBMRVRFX0RJU0NMQUlNRVJfQ09NUElMSU5HfVxcbiR7dHJhbnNsYXRlZC5zb3VyY2V9YDtcbiAgICB9XG4gICAgaWYgKCF0cmFuc2xhdGVkLmRpZENvbXBpbGUgJiYgSU5DT01QTEVURV9ESVNDTEFJTUVSX05PTkNPTVBJTElORykge1xuICAgICAgcmV0dXJuIGAjICR7SU5DT01QTEVURV9ESVNDTEFJTUVSX05PTkNPTVBJTElOR31cXG4ke3RyYW5zbGF0ZWQuc291cmNlfWA7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkLnNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQeXRob25UeXBlKGZxbjogc3RyaW5nKTogUHl0aG9uVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KGZxbik7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBsb2NhdGUgdHlwZTogXCIke2Zxbn1cImApO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFzc2VtYmx5T3V0cHV0RGlyKGFzc206IHNwZWMuQXNzZW1ibHkpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKFxuICAgICAgJ3NyYycsXG4gICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSh0aGlzLmdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtKSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgX2ZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5wYWNrYWdlID0gbmV3IFBhY2thZ2UoXG4gICAgICBhc3NtLnRhcmdldHMhLnB5dGhvbiEuZGlzdE5hbWUsXG4gICAgICB0b1JlbGVhc2VWZXJzaW9uKGFzc20udmVyc2lvbiwgVGFyZ2V0TmFtZS5QWVRIT04pLFxuICAgICAgYXNzbSxcbiAgICApO1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgJzxwYWNrYWdlbmFtZT4uX2pzaWknIG1vZHVsZSBmb3IgdGhpcyBhc3NlbWJseVxuICAgIGNvbnN0IGFzc2VtYmx5TW9kdWxlID0gbmV3IFB5dGhvbk1vZHVsZShcbiAgICAgIHRoaXMuZ2V0QXNzZW1ibHlNb2R1bGVOYW1lKGFzc20pLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBhc3NlbWJseTogYXNzbSxcbiAgICAgICAgYXNzZW1ibHlGaWxlbmFtZTogdGhpcy5nZXRBc3NlbWJseUZpbGVOYW1lKCksXG4gICAgICAgIGxvYWRBc3NlbWJseTogdHJ1ZSxcbiAgICAgICAgcGFja2FnZTogdGhpcy5wYWNrYWdlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5wYWNrYWdlLmFkZE1vZHVsZShhc3NlbWJseU1vZHVsZSk7XG4gICAgdGhpcy5wYWNrYWdlLmFkZERhdGEoYXNzZW1ibHlNb2R1bGUsIHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgX2ZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSBuZXcgVHlwZVJlc29sdmVyKFxuICAgICAgdGhpcy50eXBlcyxcbiAgICAgIChmcW46IHN0cmluZykgPT4gdGhpcy5maW5kTW9kdWxlKGZxbiksXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZFR5cGUoZnFuKSxcbiAgICApO1xuICAgIHRoaXMucGFja2FnZS53cml0ZSh0aGlzLmNvZGUsIHtcbiAgICAgIGFzc2VtYmx5OiBhc3NtLFxuICAgICAgZW1pdHRlZFR5cGVzOiBuZXcgU2V0KCksXG4gICAgICByZXNvbHZlcixcbiAgICAgIHN1Ym1vZHVsZTogYXNzbS5uYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgYmUgY2FsbGVkIGZvciBhc3NlbWJseSByb290LCBuYW1lc3BhY2VzIGFuZCBzdWJtb2R1bGVzIChhbnl0aGluZyB0aGF0IGNvbnRhaW5zIG90aGVyIHR5cGVzLCBiYXNlZCBvbiBpdHMgRlFOKVxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQmVnaW5OYW1lc3BhY2UobnM6IHN0cmluZykge1xuICAgIC8vICducycgY29udGFpbnMgc29tZXRoaW5nIGxpa2UgJ0BzY29wZS9qc2lpLWNhbGMtYmFzZS1vZi1iYXNlJ1xuICAgIGNvbnN0IHN1Ym1vZHVsZUxpa2UgPVxuICAgICAgbnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZVxuICAgICAgICA/IHRoaXMuYXNzZW1ibHlcbiAgICAgICAgOiB0aGlzLmFzc2VtYmx5LnN1Ym1vZHVsZXM/Lltuc107XG5cbiAgICBjb25zdCByZWFkbWVMb2NhdGlvbjogQXBpTG9jYXRpb24gPSB7IGFwaTogJ21vZHVsZVJlYWRtZScsIG1vZHVsZUZxbjogbnMgfTtcblxuICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBQeXRob25Nb2R1bGUodG9QYWNrYWdlTmFtZShucywgdGhpcy5hc3NlbWJseSksIG5zLCB7XG4gICAgICBhc3NlbWJseTogdGhpcy5hc3NlbWJseSxcbiAgICAgIGFzc2VtYmx5RmlsZW5hbWU6IHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLFxuICAgICAgcGFja2FnZTogdGhpcy5wYWNrYWdlLFxuICAgICAgbW9kdWxlRG9jdW1lbnRhdGlvbjogc3VibW9kdWxlTGlrZT8ucmVhZG1lXG4gICAgICAgID8gdGhpcy5jb252ZXJ0TWFya2Rvd24oXG4gICAgICAgICAgICBzdWJtb2R1bGVMaWtlLnJlYWRtZT8ubWFya2Rvd24sXG4gICAgICAgICAgICByZWFkbWVMb2NhdGlvbixcbiAgICAgICAgICApLnRyaW0oKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHRoaXMucGFja2FnZS5hZGRNb2R1bGUobW9kdWxlKTtcbiAgICB0aGlzLnR5cGVzLnNldChucywgbW9kdWxlKTtcbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgLy8gVGhpcyBhcHBsaWVzIHJlY3Vyc2l2ZWx5IHRvIHN1Ym1vZHVsZXMsIHNvIG5vIG5lZWQgdG8gZHVwbGljYXRlIVxuICAgICAgdGhpcy5wYWNrYWdlLmFkZERhdGEobW9kdWxlLCAncHkudHlwZWQnLCAnJyk7XG4gICAgfVxuXG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb290TW9kdWxlIS5hZGRQeXRob25Nb2R1bGUobW9kdWxlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmROYW1lc3BhY2UobnM6IHN0cmluZykge1xuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICBkZWxldGUgdGhpcy5yb290TW9kdWxlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQ2xhc3MoY2xzOiBzcGVjLkNsYXNzVHlwZSwgYWJzdHJhY3Q6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBrbGFzcyA9IG5ldyBDbGFzcyhcbiAgICAgIHRoaXMsXG4gICAgICB0b1B5dGhvbklkZW50aWZpZXIoY2xzLm5hbWUpLFxuICAgICAgY2xzLmZxbixcbiAgICAgIHtcbiAgICAgICAgYWJzdHJhY3QsXG4gICAgICAgIGJhc2VzOiBjbHMuYmFzZSA/IFt0aGlzLmZpbmRUeXBlKGNscy5iYXNlKV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVyZmFjZXM6IGNscy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpLFxuICAgICAgICBhYnN0cmFjdEJhc2VzOiBhYnN0cmFjdCA/IHRoaXMuZ2V0QWJzdHJhY3RCYXNlcyhjbHMpIDogW10sXG4gICAgICB9LFxuICAgICAgY2xzLmRvY3MsXG4gICAgKTtcblxuICAgIGlmIChjbHMuaW5pdGlhbGl6ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IGNscy5pbml0aWFsaXplcjtcblxuICAgICAga2xhc3MuYWRkTWVtYmVyKFxuICAgICAgICBuZXcgSW5pdGlhbGl6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICAnX19pbml0X18nLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBjbHMuaW5pdGlhbGl6ZXIuZG9jcyxcbiAgICAgICAgICBmYWxzZSwgLy8gTmV2ZXIgc3RhdGljXG4gICAgICAgICAgeyBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AoY2xzLmluaXRpYWxpemVyKSwgcGFyZW50OiBjbHMgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRQeXRob25UeXBlKGtsYXNzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY01ldGhvZChjbHM6IHNwZWMuQ2xhc3NUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IG1ldGhvZDtcblxuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgU3RhdGljTWV0aG9kKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUpLFxuICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICB0cnVlLCAvLyBBbHdheXMgc3RhdGljXG4gICAgICAgIHtcbiAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgU3RhdGljUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IHByb3AuYWJzdHJhY3QsXG4gICAgICAgICAgaW1tdXRhYmxlOiBwcm9wLmltbXV0YWJsZSxcbiAgICAgICAgICBpc1N0YXRpYzogcHJvcC5zdGF0aWMsXG4gICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICBpZiAobWV0aG9kLmFzeW5jKSB7XG4gICAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgICBuZXcgQXN5bmNNZXRob2QoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUsIG1ldGhvZC5wcm90ZWN0ZWQpLFxuICAgICAgICAgIG1ldGhvZC5uYW1lLFxuICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgICAgbWV0aG9kLmRvY3MsXG4gICAgICAgICAgISFtZXRob2Quc3RhdGljLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFic3RyYWN0OiBtZXRob2QuYWJzdHJhY3QsXG4gICAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgICBuZXcgTWV0aG9kKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0LCBwcm9wLnByb3RlY3RlZCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IHByb3AuYWJzdHJhY3QsXG4gICAgICAgICAgaW1tdXRhYmxlOiBwcm9wLmltbXV0YWJsZSxcbiAgICAgICAgICBpc1N0YXRpYzogcHJvcC5zdGF0aWMsXG4gICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25VbmlvblByb3BlcnR5KFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBfdW5pb246IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLm9uUHJvcGVydHkoY2xzLCBwcm9wKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luSW50ZXJmYWNlKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgbGV0IGlmYWNlOiBJbnRlcmZhY2UgfCBTdHJ1Y3Q7XG5cbiAgICBpZiAoaWZjLmRhdGF0eXBlKSB7XG4gICAgICBpZmFjZSA9IG5ldyBTdHJ1Y3QoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uSWRlbnRpZmllcihpZmMubmFtZSksXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICAgIHsgYmFzZXM6IGlmYy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpIH0sXG4gICAgICAgIGlmYy5kb2NzLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2UgPSBuZXcgSW50ZXJmYWNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMuZnFuLFxuICAgICAgICB7IGJhc2VzOiBpZmMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSB9LFxuICAgICAgICBpZmMuZG9jcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRQeXRob25UeXBlKGlmYWNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEludGVyZmFjZShfaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2QoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gbWV0aG9kO1xuXG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGlmYy5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBJbnRlcmZhY2VNZXRob2QoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSwgbWV0aG9kLnByb3RlY3RlZCksXG4gICAgICAgIG1ldGhvZC5uYW1lLFxuICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgbWV0aG9kLmRvY3MsXG4gICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgeyBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSwgcGFyZW50OiBpZmMgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZVByb3BlcnR5KGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgbGV0IGlmYWNlUHJvcGVydHk6IEludGVyZmFjZVByb3BlcnR5IHwgU3RydWN0RmllbGQ7XG5cbiAgICBpZiAoaWZjLmRhdGF0eXBlKSB7XG4gICAgICBpZmFjZVByb3BlcnR5ID0gbmV3IFN0cnVjdEZpZWxkKHRoaXMsIHByb3AsIGlmYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmYWNlUHJvcGVydHkgPSBuZXcgSW50ZXJmYWNlUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCwgcHJvcC5wcm90ZWN0ZWQpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAgeyBpbW11dGFibGU6IHByb3AuaW1tdXRhYmxlLCBpc1N0YXRpYzogcHJvcC5zdGF0aWMsIHBhcmVudDogaWZjIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShpZmMuZnFuKS5hZGRNZW1iZXIoaWZhY2VQcm9wZXJ0eSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkVudW0oZW5tOiBzcGVjLkVudW1UeXBlKSB7XG4gICAgdGhpcy5hZGRQeXRob25UeXBlKFxuICAgICAgbmV3IEVudW0odGhpcywgdG9QeXRob25JZGVudGlmaWVyKGVubS5uYW1lKSwgZW5tLmZxbiwge30sIGVubS5kb2NzKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW51bU1lbWJlcihlbm06IHNwZWMuRW51bVR5cGUsIG1lbWJlcjogc3BlYy5FbnVtTWVtYmVyKSB7XG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGVubS5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBFbnVtTWVtYmVyKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIobWVtYmVyLm5hbWUpLFxuICAgICAgICBtZW1iZXIubmFtZSxcbiAgICAgICAgbWVtYmVyLmRvY3MsXG4gICAgICAgIGVubSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZE92ZXJsb2FkKFxuICAgIF9pZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IEludGVyZmFjZU1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IE1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IFN0YXRpY01ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtOiBzcGVjLkFzc2VtYmx5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXNzbS50YXJnZXRzIS5weXRob24hLm1vZHVsZX0uX2pzaWlgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJlbnRGUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG0gPSAvXiguKylcXC5bXi5dKyQvLmV4ZWMoZnFuKTtcblxuICAgIGlmIChtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwYXJlbnQgRlFOIG9mOiAke2Zxbn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbVsxXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyZW50KGZxbjogc3RyaW5nKTogUHl0aG9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHl0aG9uVHlwZSh0aGlzLmdldFBhcmVudEZRTihmcW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHl0aG9uVHlwZSh0eXBlOiBQeXRob25UeXBlKSB7XG4gICAgaWYgKHR5cGUuZnFuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBhIFB5dGhvbiB0eXBlIHdpdGhvdXQgYSBGUU4uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQYXJlbnQodHlwZS5mcW4pLmFkZE1lbWJlcih0eXBlKTtcbiAgICB0aGlzLnR5cGVzLnNldCh0eXBlLmZxbiwgdHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldGxpZnRlZFByb3AoXG4gICAgbWV0aG9kOiBzcGVjLk1ldGhvZCB8IHNwZWMuSW5pdGlhbGl6ZXIsXG4gICk6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gSWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gdGhpcyBtZXRob2QsIGFuZCBpZiB0aGUgbGFzdCBwYXJhbWV0ZXIncyB0eXBlIGlzXG4gICAgLy8gYSBkYXRhdHlwZSBpbnRlcmZhY2UsIHRoZW4gd2Ugd2FudCB0byBsaWZ0IHRoZSBtZW1iZXJzIG9mIHRoYXQgbGFzdCBwYXJhbXRlclxuICAgIC8vIGFzIGtleXdvcmQgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgaWYgKG1ldGhvZC5wYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCA+PSAxKSB7XG4gICAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gbWV0aG9kLnBhcmFtZXRlcnMhLnNsaWNlKC0xKVswXTtcbiAgICAgIGlmIChcbiAgICAgICAgIWxhc3RQYXJhbWV0ZXIudmFyaWFkaWMgJiZcbiAgICAgICAgc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShsYXN0UGFyYW1ldGVyLnR5cGUpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbGFzdFBhcmFtZXRlclR5cGUgPSB0aGlzLmZpbmRUeXBlKGxhc3RQYXJhbWV0ZXIudHlwZS5mcW4pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3BlYy5pc0ludGVyZmFjZVR5cGUobGFzdFBhcmFtZXRlclR5cGUpICYmXG4gICAgICAgICAgbGFzdFBhcmFtZXRlclR5cGUuZGF0YXR5cGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGxhc3RQYXJhbWV0ZXJUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWJzdHJhY3RCYXNlcyhjbHM6IHNwZWMuQ2xhc3NUeXBlKTogc3BlYy5DbGFzc1R5cGVbXSB7XG4gICAgY29uc3QgYWJzdHJhY3RCYXNlczogc3BlYy5DbGFzc1R5cGVbXSA9IFtdO1xuXG4gICAgaWYgKGNscy5iYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmZpbmRUeXBlKGNscy5iYXNlKTtcblxuICAgICAgaWYgKCFzcGVjLmlzQ2xhc3NUeXBlKGJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIGluaGVyaXRlbmNlIHRoYXQgaXNuJ3QgYSBjbGFzcz9cIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChiYXNlLmFic3RyYWN0KSB7XG4gICAgICAgIGFic3RyYWN0QmFzZXMucHVzaChiYXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWJzdHJhY3RCYXNlcztcbiAgfVxufVxuXG4vKipcbiAqIFBvc2l0aW9uYWwgYXJndW1lbnQgb3Iga2V5d29yZCBwYXJhbWV0ZXJcbiAqL1xuaW50ZXJmYWNlIERvY3VtZW50YWJsZUFyZ3VtZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkb2NzPzogc3BlYy5Eb2NzO1xufVxuXG4vKipcbiAqIFJlbmRlciBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBnaXZlbiBkb2NzLCB1c2VkIGZvciBtZXRob2QgYXJndW1lbnRzIGFuZCBpbmxpbmVkIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gb25lbGluZURlc2NyaXB0aW9uKGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCkge1xuICAvLyBPbmx5IGNvbnNpZGVyIGEgc3Vic2V0IG9mIGZpZWxkcyBoZXJlLCB3ZSBkb24ndCBoYXZlIGEgbG90IG9mIGZvcm1hdHRpbmcgc3BhY2VcbiAgaWYgKCFkb2NzIHx8IE9iamVjdC5rZXlzKGRvY3MpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnLSc7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IFtdO1xuICBpZiAoZG9jcy5zdW1tYXJ5KSB7XG4gICAgcGFydHMucHVzaChtZDJyc3QocmVuZGVyU3VtbWFyeShkb2NzKSkpO1xuICB9XG4gIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICBwYXJ0cy5wdXNoKG1kMnJzdChkb2NzLnJlbWFya3MpKTtcbiAgfVxuICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgcGFydHMucHVzaChgRGVmYXVsdDogJHttZDJyc3QoZG9jcy5kZWZhdWx0KX1gKTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbignICcpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkTWVudGlvblN0YWJpbGl0eShzOiBzcGVjLlN0YWJpbGl0eSkge1xuICAvLyBEb24ndCByZW5kZXIgXCJzdGFibGVcIiBvciBcImV4dGVybmFsXCIsIHRob3NlIGFyZSBib3RoIHN0YWJsZSBieSBpbXBsaWNhdGlvbi5cbiAgcmV0dXJuIHMgPT09IHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQgfHwgcyA9PT0gc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsO1xufVxuXG5mdW5jdGlvbiBpc1N0cnVjdChcbiAgdHlwZVN5c3RlbTogcmVmbGVjdC5UeXBlU3lzdGVtLFxuICByZWY6IHNwZWMuVHlwZVJlZmVyZW5jZSxcbik6IGJvb2xlYW4ge1xuICBpZiAoIXNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UocmVmKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB0eXBlID0gdHlwZVN5c3RlbS50cnlGaW5kRnFuKHJlZi5mcW4pO1xuICByZXR1cm4gISEodHlwZT8uaXNJbnRlcmZhY2VUeXBlKCkgJiYgdHlwZT8uaXNEYXRhVHlwZSgpKTtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGBfYCBhdCB0aGUgZW5kIG9mIGBuYW1lYCB1bnRpbCBpdCBubyBsb25nZXIgY29uZmxpY3RzIHdpdGggYW55IG9mIHRoZVxuICogZW50cmllcyBpbiBgaW5Vc2VgLlxuICpcbiAqIEBwYXJhbSBuYW1lICB0aGUgbmFtZSB0byBiZSBzbHVnaWZpZWQuXG4gKiBAcGFyYW0gaW5Vc2UgdGhlIG5hbWVzIHRoYXQgYXJlIGFscmVhZHkgYmVpbmcgdXNlZC5cbiAqXG4gKiBAcmV0dXJucyB0aGUgc2x1Z2lmaWVkIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHNsdWdpZnlBc05lZWRlZChuYW1lOiBzdHJpbmcsIGluVXNlOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGluVXNlU2V0ID0gbmV3IFNldChpblVzZSk7XG4gIHdoaWxlIChpblVzZVNldC5oYXMobmFtZSkpIHtcbiAgICBuYW1lID0gYCR7bmFtZX1fYDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEJFSE9MRDogSGVscGVycyB0byBvdXRwdXQgY29kZSB0aGF0IGxvb2tzIGxpa2Ugd2hhdCBCbGFjayB3b3VsZCBmb3JtYXQgaW50by4uLlxuLy9cbi8vIEBzZWUgaHR0cHM6Ly9ibGFjay5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvdGhlX2JsYWNrX2NvZGVfc3R5bGUuaHRtbFxuXG5jb25zdCBUQVJHRVRfTElORV9MRU5HVEggPSA4ODtcblxuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnY2xhc3MnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiB2b2lkO1xuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnZGVmJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZ0NvbW1hOiBib29sZWFuLFxuICByZXR1cm5UeXBlOiBzdHJpbmcsXG4pOiB2b2lkO1xuZnVuY3Rpb24gb3BlblNpZ25hdHVyZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBrZXl3b3JkOiAnY2xhc3MnIHwgJ2RlZicsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmdDb21tYSA9IGZhbHNlLFxuICByZXR1cm5UeXBlPzogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke2tleXdvcmR9ICR7bmFtZX1gO1xuICBjb25zdCBzdWZmaXggPSByZXR1cm5UeXBlID8gYCAtPiAke3JldHVyblR5cGV9YCA6ICcnO1xuICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUub3BlbkJsb2NrKGAke3ByZWZpeH0ke3JldHVyblR5cGUgPyAnKCknIDogJyd9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YocGFyYW1zLCBqb2luKTtcblxuICBjb25zdCBoYXNDb21tZW50cyA9ICFwYXJhbXMuc29tZSgocGFyYW0pID0+IC8jIC4rJC8uZXhlYyhwYXJhbSkpO1xuXG4gIGlmIChcbiAgICBoYXNDb21tZW50cyAmJlxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICBzdWZmaXgubGVuZ3RoICtcbiAgICAgICAgMlxuICApIHtcbiAgICBjb2RlLm9wZW5CbG9jayhgJHtwcmVmaXh9KCR7cGFyYW1zLmpvaW4oam9pbil9KSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvZGUuaW5kZW50KGAke3ByZWZpeH0oYCk7XG4gIGlmIChcbiAgICAhaGFzQ29tbWVudHMgJiZcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICAodHJhaWxpbmdDb21tYSA/IDEgOiAwKVxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cGFyYW1zLmpvaW4oam9pbil9JHt0cmFpbGluZ0NvbW1hID8gJywnIDogJyd9YCk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgIGNvZGUubGluZShwYXJhbS5yZXBsYWNlKC8oXFxzKiMgLispPyQvLCAnLCQxJykpO1xuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KGZhbHNlKTtcbiAgY29kZS5vcGVuQmxvY2soYCkke3N1ZmZpeH1gKTtcbn1cblxuZnVuY3Rpb24gYXNzaWduQ2FsbFJlc3VsdChcbiAgY29kZTogQ29kZU1ha2VyLFxuICB2YXJpYWJsZTogc3RyaW5nLFxuICBmdW5jdDogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke3ZhcmlhYmxlfSA9ICR7ZnVuY3R9KGA7XG4gIGNvbnN0IHN1ZmZpeCA9ICcpJztcblxuICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YocGFyYW1zLCBqb2luKTtcblxuICBpZiAoXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgam9pblNpemUgK1xuICAgICAgc3VmZml4Lmxlbmd0aFxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7cGFyYW1zLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29kZS5pbmRlbnQocHJlZml4KTtcbiAgaWYgKFRBUkdFVF9MSU5FX0xFTkdUSCA+IGNvZGUuY3VycmVudEluZGVudExlbmd0aCArIGVsZW1lbnRzU2l6ZSArIGpvaW5TaXplKSB7XG4gICAgY29kZS5saW5lKHBhcmFtcy5qb2luKGpvaW4pKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29kZS5saW5lKGAke3BhcmFtfSxgKTtcbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChzdWZmaXgpO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25EaWN0aW9uYXJ5KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHZhcmlhYmxlOiBzdHJpbmcsXG4gIGVsZW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmc/OiBzdHJpbmcsXG4gIGNvbXBhY3QgPSBmYWxzZSxcbik6IHZvaWQge1xuICBjb25zdCBzcGFjZSA9IGNvbXBhY3QgPyAnJyA6ICcgJztcblxuICBjb25zdCBwcmVmaXggPSBgJHt2YXJpYWJsZX0ke3NwYWNlfT0ke3NwYWNlfXtgO1xuICBjb25zdCBzdWZmaXggPSBgfSR7dHJhaWxpbmcgPz8gJyd9YDtcblxuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY29tcGFjdCkge1xuICAgIGNvbnN0IGpvaW4gPSAnLCAnO1xuICAgIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YoZWxlbWVudHMsIGpvaW4pO1xuICAgIGlmIChcbiAgICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgICAgam9pblNpemUgK1xuICAgICAgICBzdWZmaXgubGVuZ3RoXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7ZWxlbWVudHMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb2RlLmluZGVudChwcmVmaXgpO1xuICBmb3IgKGNvbnN0IGVsdCBvZiBlbGVtZW50cykge1xuICAgIGNvZGUubGluZShgJHtlbHR9LGApO1xuICB9XG4gIGNvZGUudW5pbmRlbnQoc3VmZml4KTtcbn1cblxuZnVuY3Rpb24gZW1pdExpc3QoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGVsZW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgc3VmZml4OiBzdHJpbmcsXG4gIG9wdHM/OiB7IGlmTXVsdGk6IFtzdHJpbmcsIHN0cmluZ10gfSxcbikge1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihlbGVtZW50cywgam9pbik7XG4gIGlmIChcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICBqb2luU2l6ZSArXG4gICAgICBzdWZmaXgubGVuZ3RoXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtlbGVtZW50cy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IFtiZWZvcmUsIGFmdGVyXSA9IG9wdHM/LmlmTXVsdGkgPz8gWycnLCAnJ107XG5cbiAgY29kZS5pbmRlbnQoYCR7cHJlZml4fSR7YmVmb3JlfWApO1xuICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgY29kZS5saW5lKGVsZW1lbnRzWzBdKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXG4gICAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICsgZWxlbWVudHNTaXplICsgam9pblNpemVcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShlbGVtZW50cy5qb2luKGpvaW4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBlbHQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgY29kZS5saW5lKGAke2VsdH0sYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoYCR7YWZ0ZXJ9JHtzdWZmaXh9YCk7XG59XG5cbmZ1bmN0aW9uIHRvdGFsU2l6ZU9mKHN0cmluZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBqb2luOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50c1NpemU6IHN0cmluZ3NcbiAgICAgIC5tYXAoKHN0cikgPT4gc3RyLmxlbmd0aClcbiAgICAgIC5yZWR1Y2UoKGFjYywgZWx0KSA9PiBhY2MgKyBlbHQsIDApLFxuICAgIGpvaW5TaXplOiBzdHJpbmdzLmxlbmd0aCA+IDEgPyBqb2luLmxlbmd0aCAqIChzdHJpbmdzLmxlbmd0aCAtIDEpIDogMCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbmVzdGVkQ29udGV4dChcbiAgY29udGV4dDogRW1pdENvbnRleHQsXG4gIGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogRW1pdENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIC4uLmNvbnRleHQsXG4gICAgc3Vycm91bmRpbmdUeXBlRnFuczpcbiAgICAgIGZxbiAhPSBudWxsXG4gICAgICAgID8gWy4uLihjb250ZXh0LnN1cnJvdW5kaW5nVHlwZUZxbnMgPz8gW10pLCBmcW5dXG4gICAgICAgIDogY29udGV4dC5zdXJyb3VuZGluZ1R5cGVGcW5zLFxuICB9O1xufVxuXG5jb25zdCBpc0RlcHJlY2F0ZWQgPSAoeDogUHl0aG9uQmFzZSkgPT4geC5kb2NzPy5kZXByZWNhdGVkICE9PSB1bmRlZmluZWQ7XG4iXX0=