@cdktn/provider-generator 0.23.0 → 0.24.0-pre.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/get/__tests__/constructs-maker.test.js +2 -2
- package/build/get/__tests__/generator/complex-computed-types.test.js +4 -3
- package/build/get/__tests__/generator/deep-nested-attributes.test.js +5 -4
- package/build/get/__tests__/generator/description-escaping.test.js +6 -5
- package/build/get/__tests__/generator/empty-provider-resources.test.js +4 -3
- package/build/get/__tests__/generator/export-sharding.test.js +5 -4
- package/build/get/__tests__/generator/module-generator.test.js +7 -6
- package/build/get/__tests__/generator/nested-types.test.js +5 -4
- package/build/get/__tests__/generator/provider.test.js +5 -4
- package/build/get/__tests__/generator/resource-types.test.js +8 -7
- package/build/get/__tests__/generator/skipped-attributes.test.js +5 -4
- package/build/get/__tests__/generator/types.test.js +51 -28
- package/build/get/__tests__/generator/versions-file.test.js +4 -3
- package/build/get/__tests__/util.d.ts +9 -0
- package/build/get/__tests__/util.js +24 -2
- package/build/get/generator/resource-parser.d.ts +1 -0
- package/build/get/generator/resource-parser.js +29 -3
- package/package.json +3 -3
- package/src/get/__tests__/generator/__snapshots__/types.test.ts.snap +608 -0
- package/src/get/__tests__/generator/fixtures/case-insensitive-base-name-collision.test.fixture.json +82 -0
|
@@ -76,8 +76,9 @@ function deduplicateAttributesWithSameName(attributes) {
|
|
|
76
76
|
});
|
|
77
77
|
}
|
|
78
78
|
class Parser {
|
|
79
|
-
constructor(classNames) {
|
|
79
|
+
constructor(classNames, usedBaseNames) {
|
|
80
80
|
this.classNames = classNames;
|
|
81
|
+
this.usedBaseNames = usedBaseNames;
|
|
81
82
|
this.structs = new Array();
|
|
82
83
|
}
|
|
83
84
|
uniqueClassName(className) {
|
|
@@ -87,6 +88,29 @@ class Parser {
|
|
|
87
88
|
this.classNames.push(className);
|
|
88
89
|
return className;
|
|
89
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Ensure base names are unique case-insensitively.
|
|
93
|
+
*
|
|
94
|
+
* Affected languages:
|
|
95
|
+
* - Go: JSII-generated Go package names are fully lowercased, so
|
|
96
|
+
* `load-balancer-backendset` and `load-balancer-backend-set` both
|
|
97
|
+
* become package `loadbalancerbackendset`, causing a hard build failure:
|
|
98
|
+
* "case-insensitive file name collision".
|
|
99
|
+
* - C#: JSII generates PascalCase directories like
|
|
100
|
+
* `LoadBalancerBackendset/` and `LoadBalancerBackendSet/` which the C#
|
|
101
|
+
* compiler treats case-insensitively, causing CS2002 and CS0234 errors.
|
|
102
|
+
*/
|
|
103
|
+
uniqueBaseName(baseName) {
|
|
104
|
+
const pascalName = (0, codemaker_1.toPascalCase)(baseName);
|
|
105
|
+
const key = pascalName.toLowerCase();
|
|
106
|
+
const existing = this.usedBaseNames.get(key);
|
|
107
|
+
if (existing !== undefined && existing !== pascalName) {
|
|
108
|
+
baseName = `${baseName}A`;
|
|
109
|
+
return this.uniqueBaseName(baseName);
|
|
110
|
+
}
|
|
111
|
+
this.usedBaseNames.set(key, pascalName);
|
|
112
|
+
return baseName;
|
|
113
|
+
}
|
|
90
114
|
resourceFrom(fqpn, type, schema, terraformSchemaType, constraint) {
|
|
91
115
|
let baseName = type;
|
|
92
116
|
const providerNameFromConstraint = constraint
|
|
@@ -117,6 +141,7 @@ class Parser {
|
|
|
117
141
|
};
|
|
118
142
|
}
|
|
119
143
|
baseName = sanitizeClassOrNamespaceName(baseName, isProvider);
|
|
144
|
+
baseName = this.uniqueBaseName(baseName);
|
|
120
145
|
const className = this.uniqueClassName((0, codemaker_1.toPascalCase)(baseName));
|
|
121
146
|
// avoid naming collision - see https://github.com/hashicorp/terraform-cdk/issues/299
|
|
122
147
|
const configStructName = this.uniqueClassName(`${className}Config`);
|
|
@@ -463,13 +488,14 @@ class Parser {
|
|
|
463
488
|
class ResourceParser {
|
|
464
489
|
constructor() {
|
|
465
490
|
this.uniqueClassnames = [];
|
|
491
|
+
this.uniqueBaseNames = new Map();
|
|
466
492
|
this.resources = {};
|
|
467
493
|
}
|
|
468
494
|
parse(fqpn, type, schema, terraformType, constraint) {
|
|
469
495
|
if (this.resources[type]) {
|
|
470
496
|
return this.resources[type];
|
|
471
497
|
}
|
|
472
|
-
const parser = new Parser(this.uniqueClassnames);
|
|
498
|
+
const parser = new Parser(this.uniqueClassnames, this.uniqueBaseNames);
|
|
473
499
|
const resource = parser.resourceFrom(fqpn, type, schema, terraformType, constraint);
|
|
474
500
|
this.resources[type] = resource;
|
|
475
501
|
return resource;
|
|
@@ -494,4 +520,4 @@ class ResourceParser {
|
|
|
494
520
|
}
|
|
495
521
|
}
|
|
496
522
|
exports.ResourceParser = ResourceParser;
|
|
497
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dldC9nZW5lcmF0b3IvcmVzb3VyY2UtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMseUNBQW1FO0FBQ25FLDRDQVV3QjtBQUN4Qiw0REFBdUU7QUFDdkUscUNBWWtCO0FBQ2xCLHFEQUF3RDtBQUN4RCw2REFBMkQ7QUFFM0Qsc0VBQXNFO0FBQ3RFLHlKQUF5SjtBQUN6SixNQUFNLGdDQUFnQyxHQUFHO0lBQ3ZDLFlBQVk7SUFDWixXQUFXO0lBQ1gsS0FBSztJQUNMLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87Q0FDUixDQUFDO0FBRUYsTUFBTSx5QkFBeUIsR0FBRztJQUNoQyxtSEFBbUg7SUFDbkgsU0FBUztJQUNULDJCQUEyQjtJQUMzQixTQUFTO0NBQ1YsQ0FBQztBQUVGLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxTQUFpQixFQUFXLEVBQUU7SUFDcEUsT0FBTztRQUNMLFFBQVE7UUFDUixRQUFRO1FBQ1IsVUFBVTtRQUNWLEdBQUcsZ0NBQWdDO1FBQ25DLEdBQUcseUJBQXlCO0tBQzdCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUVGLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxTQUFpQixFQUFXLEVBQUU7SUFDL0QsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xELENBQUMsQ0FBQztBQUVGLE1BQU0sV0FBVyxHQUFHLENBQUMsUUFBc0IsRUFBRSxRQUFnQixFQUFVLEVBQUU7SUFDdkUsSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDekIsT0FBTyx5QkFBeUIsQ0FB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LE1BQU0sRUFDTixhQUFhLEVBQ2IsVUFBVSxDQUNYLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUNoQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsMERBQTBEO0lBQ25ELHVCQUF1QixDQUFDLGFBQXFCO1FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsOERBQThEO0lBQ3ZELDJCQUEyQixDQUFDLGFBQXFCO1FBQ3RELGtGQUFrRjtRQUNsRixJQUFJLGFBQWEsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3ZDLGFBQWEsR0FBRyxlQUFlLENBQUM7UUFDbEMsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsYUFBYSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEQsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNGO0FBL0NELHdDQStDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSwgdG9QYXNjYWxDYXNlLCB0b1NuYWtlQ2FzZSB9IGZyb20gXCJjb2RlbWFrZXJcIjtcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQXR0cmlidXRlTmVzdGVkVHlwZSxcbiAgQXR0cmlidXRlVHlwZSxcbiAgQmxvY2ssXG4gIEJsb2NrVHlwZSxcbiAgQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICBpc0F0dHJpYnV0ZU5lc3RlZFR5cGUsXG4gIGlzTmVzdGVkVHlwZUF0dHJpYnV0ZSxcbiAgU2NoZW1hLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IFByb3ZpZGVyTmFtZSwgRlFQTiwgcGFyc2VGUVBOIH0gZnJvbSBcIkBjZGt0bi9wcm92aWRlci1zY2hlbWFcIjtcbmltcG9ydCB7XG4gIFJlc291cmNlTW9kZWwsXG4gIEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU3RydWN0LFxuICBTY29wZSxcbiAgQXR0cmlidXRlTW9kZWwsXG4gIFNpbXBsZUF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgTGlzdEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU2V0QXR0cmlidXRlVHlwZU1vZGVsLFxuICBNYXBBdHRyaWJ1dGVUeXBlTW9kZWwsXG4gIFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU2tpcHBlZEF0dHJpYnV0ZVR5cGVNb2RlbCxcbn0gZnJvbSBcIi4vbW9kZWxzXCI7XG5pbXBvcnQgeyBkZXRlY3RBdHRyaWJ1dGVMb29wcyB9IGZyb20gXCIuL2xvb3AtZGV0ZWN0aW9uXCI7XG5pbXBvcnQgeyBzaG91bGRTa2lwQXR0cmlidXRlIH0gZnJvbSBcIi4vc2tpcHBlZC1hdHRyaWJ1dGVzXCI7XG5cbi8vIENhbid0IGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgbGlrZSBcImV4cG9ydCAqIGFzIDxrZXl3b3JkPiBmcm9tIC4uLiBcIlxuLy8gZmlsdGVyZWQgZnJvbSBhbGwga2V5d29yZHMgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvNTAzNjA0Yzg4NGJkMDU1N2M4NTFiMTFiNjk5ZWY5OGNkYjY1YjkzYi9zcmMvY29tcGlsZXIvdHlwZXMudHMjTDExNC1MMTk3XG5jb25zdCBSRVNFUlZFRF9LRVlXT1JEU19GT1JfTkFNRVNQQUNFUyA9IFtcbiAgXCJpbXBsZW1lbnRzXCIsXG4gIFwiaW50ZXJmYWNlXCIsXG4gIFwibGV0XCIsXG4gIFwicGFja2FnZVwiLFxuICBcInByaXZhdGVcIixcbiAgXCJwcm90ZWN0ZWRcIixcbiAgXCJwdWJsaWNcIixcbiAgXCJzdGF0aWNcIixcbiAgXCJ5aWVsZFwiLFxuICBcImF3YWl0XCIsXG5dO1xuXG5jb25zdCBDT0xMSURJTkdfTkFNRVNQQUNFX05BTUVTID0gW1xuICAvLyBlLmcuIGhhc2hpY29ycC9jb25zdWwg4oCTIGNvbGxpZGVzIHdpdGggdGhlIExJQ0VOU0UgZmlsZSBvbiBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW1zIGluIHRoZSBHbyBwYWNrYWdlICgjMjYyNylcbiAgXCJsaWNlbnNlXCIsXG4gIC8vIGNvbGxpZGVzIGZvciBHbyBwYWNrYWdlc1xuICBcInZlcnNpb25cIixcbl07XG5cbmNvbnN0IGlzUmVzZXJ2ZWRDbGFzc09yTmFtZXNwYWNlTmFtZSA9IChjbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJvYmplY3RcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgLi4uUkVTRVJWRURfS0VZV09SRFNfRk9SX05BTUVTUEFDRVMsXG4gICAgLi4uQ09MTElESU5HX05BTUVTUEFDRV9OQU1FUyxcbiAgXS5pbmNsdWRlcyhjbGFzc05hbWUudG9Mb3dlckNhc2UoKSk7XG59O1xuXG5jb25zdCBpc1Jlc2VydmVkU3RydWN0Q2xhc3NOYW1lID0gKGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBjbGFzc05hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChcImxpc3RcIik7XG59O1xuXG5jb25zdCBnZXRGaWxlTmFtZSA9IChwcm92aWRlcjogUHJvdmlkZXJOYW1lLCBiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKGJhc2VOYW1lID09PSBcImluZGV4XCIpIHtcbiAgICByZXR1cm4gXCJpbmRleC1yZXNvdXJjZS9pbmRleC50c1wiO1xuICB9XG5cbiAgaWYgKGJhc2VOYW1lID09PSBgJHtwcm92aWRlcn1fcHJvdmlkZXJgKSB7XG4gICAgcmV0dXJuIFwicHJvdmlkZXIvaW5kZXgudHNcIjtcbiAgfVxuXG4gIHJldHVybiBgJHt0b1NuYWtlQ2FzZShiYXNlTmFtZSkucmVwbGFjZSgvXy9nLCBcIi1cIil9L2luZGV4LnRzYDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUNsYXNzT3JOYW1lc3BhY2VOYW1lKFxuICBiYXNlTmFtZTogc3RyaW5nLFxuICBpc1Byb3ZpZGVyID0gZmFsc2UsXG4pIHtcbiAgY29uc3QgcmVzb3VyY2VJc05hbWVkUHJvdmlkZXIgPSAhaXNQcm92aWRlciAmJiBiYXNlTmFtZSA9PT0gXCJwcm92aWRlclwiO1xuXG4gIGlmIChpc1Jlc2VydmVkQ2xhc3NPck5hbWVzcGFjZU5hbWUoYmFzZU5hbWUpIHx8IHJlc291cmNlSXNOYW1lZFByb3ZpZGVyKSB7XG4gICAgcmV0dXJuIGAke2Jhc2VOYW1lfV9yZXNvdXJjZWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2VOYW1lO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGF0dHJpYnV0ZXMgdGhhdCBtYXkgY29uZmxpY3QgYWZ0ZXIgYmVpbmcgc25ha2UgY2FzZWRcbiAqIEV4YW1wbGU6IG9jaV9jb3JlX2lwc2VjX2Nvbm5lY3Rpb25fdHVubmVsX21hbmFnZW1lbnQgKGhhc2hpY29ycC9vY2lAPTUuMjEuMCkgaGFzIGJncF9pcHY2X3N0YXRlIGFuZCBiZ3BfaXB2NnN0YXRlXG4gKiAod2hpY2ggYm90aCByZXN1bHQgaW4gXCJiZ3BJcHY2U3RhdGVcIiB3aGVuIGNhbWVsLWNhc2VkLCB3aXRoIHRoZSBzZWNvbmQgb25lIGJlaW5nIGRlcHJlY2F0ZWQ6IHRydWUpXG4gKiBBcyB3ZSBjdXJyZW50bHkgZG9uJ3QgaGFuZGxlIGFueSBkZXByZWNhdGVkIG9uZXMgYXQgYWxsLCB3ZSdsbCBqdXN0IGRlbGV0ZSBvbmUgb2YgdGhlIHR3byBhdHRyaWJ1dGVzIGZvciBub3dcbiAqIEBwYXJhbSBhdHRyaWJ1dGVzXG4gKi9cbmZ1bmN0aW9uIGRlZHVwbGljYXRlQXR0cmlidXRlc1dpdGhTYW1lTmFtZShcbiAgYXR0cmlidXRlczogQXR0cmlidXRlTW9kZWxbXSxcbik6IEF0dHJpYnV0ZU1vZGVsW10ge1xuICByZXR1cm4gYXR0cmlidXRlcy5maWx0ZXIoKGF0dHIsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGhhc090aGVyV2l0aFNhbWVOYW1lID0gYXR0cmlidXRlc1xuICAgICAgLnNsaWNlKGlkeCArIDEpIC8vIG9ubHkgc2VhcmNoIGFmdGVyIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBhdHRyaWJ1dGUgdG8gYXZvaWQgZGVsZXRpbmcgYm90aFxuICAgICAgLnNvbWUoKG90aGVyKSA9PiBvdGhlci5uYW1lID09PSBhdHRyLm5hbWUgJiYgb3RoZXIgIT09IGF0dHIpO1xuICAgIHJldHVybiAhaGFzT3RoZXJXaXRoU2FtZU5hbWU7XG4gIH0pO1xufVxuXG5jbGFzcyBQYXJzZXIge1xuICBwcml2YXRlIHN0cnVjdHMgPSBuZXcgQXJyYXk8U3RydWN0PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xhc3NOYW1lczogc3RyaW5nW10pIHt9XG5cbiAgcHJpdmF0ZSB1bmlxdWVDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNsYXNzTmFtZXMuaW5jbHVkZXMoY2xhc3NOYW1lKSkge1xuICAgICAgY2xhc3NOYW1lID0gYCR7Y2xhc3NOYW1lfUFgO1xuICAgIH1cbiAgICB0aGlzLmNsYXNzTmFtZXMucHVzaChjbGFzc05hbWUpO1xuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBwdWJsaWMgcmVzb3VyY2VGcm9tKFxuICAgIGZxcG46IEZRUE4sXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hLFxuICAgIHRlcnJhZm9ybVNjaGVtYVR5cGU6IHN0cmluZyxcbiAgICBjb25zdHJhaW50PzogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICApOiBSZXNvdXJjZU1vZGVsIHtcbiAgICBsZXQgYmFzZU5hbWUgPSB0eXBlO1xuXG4gICAgY29uc3QgcHJvdmlkZXJOYW1lRnJvbUNvbnN0cmFpbnQgPSBjb25zdHJhaW50XG4gICAgICA/IChjb25zdHJhaW50Lm5hbWUgYXMgUHJvdmlkZXJOYW1lKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvdmlkZXJOYW1lRnJvbUZRUE4gPSBwYXJzZUZRUE4oZnFwbikubmFtZTtcblxuICAgIGlmIChiYXNlTmFtZS5zdGFydHNXaXRoKGAke3Byb3ZpZGVyTmFtZUZyb21GUVBOfV9gKSkge1xuICAgICAgYmFzZU5hbWUgPSBiYXNlTmFtZS5zdWJzdHIocHJvdmlkZXJOYW1lRnJvbUZRUE4ubGVuZ3RoICsgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdmlkZXJOYW1lID0gcHJvdmlkZXJOYW1lRnJvbUNvbnN0cmFpbnRcbiAgICAgID8gcHJvdmlkZXJOYW1lRnJvbUNvbnN0cmFpbnRcbiAgICAgIDogcHJvdmlkZXJOYW1lRnJvbUZRUE47XG5cbiAgICBjb25zdCBpc1Byb3ZpZGVyID0gdGVycmFmb3JtU2NoZW1hVHlwZSA9PT0gXCJwcm92aWRlclwiO1xuICAgIGlmIChpc1Byb3ZpZGVyKSB7XG4gICAgICBiYXNlTmFtZSA9IGAke3Byb3ZpZGVyTmFtZX1fJHtiYXNlTmFtZX1gO1xuICAgICAgaWYgKCEoXCJhdHRyaWJ1dGVzXCIgaW4gc2NoZW1hLmJsb2NrKSkge1xuICAgICAgICBzY2hlbWEuYmxvY2sgPSB7XG4gICAgICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICAgICAgYmxvY2tfdHlwZXM6IChzY2hlbWEuYmxvY2sgYXMgQmxvY2spLmJsb2NrX3R5cGVzIHx8IHt9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gc29tZWhvdyBtaXNzaW5nIGZyb20gcHJvdmlkZXIgc2NoZW1hXG4gICAgICBzY2hlbWEuYmxvY2suYXR0cmlidXRlc1tcImFsaWFzXCJdID0ge1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJBbGlhcyBuYW1lXCIsXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGJhc2VOYW1lID0gc2FuaXRpemVDbGFzc09yTmFtZXNwYWNlTmFtZShiYXNlTmFtZSwgaXNQcm92aWRlcik7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLnVuaXF1ZUNsYXNzTmFtZSh0b1Bhc2NhbENhc2UoYmFzZU5hbWUpKTtcbiAgICAvLyBhdm9pZCBuYW1pbmcgY29sbGlzaW9uIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9pc3N1ZXMvMjk5XG4gICAgY29uc3QgY29uZmlnU3RydWN0TmFtZSA9IHRoaXMudW5pcXVlQ2xhc3NOYW1lKGAke2NsYXNzTmFtZX1Db25maWdgKTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKHByb3ZpZGVyTmFtZSwgYmFzZU5hbWUpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSBgcHJvdmlkZXJzLyR7dG9TbmFrZUNhc2UocHJvdmlkZXJOYW1lKX0vJHtmaWxlTmFtZX1gO1xuICAgIGxldCBhdHRyaWJ1dGVzID0gdGhpcy5yZW5kZXJBdHRyaWJ1dGVzRm9yQmxvY2soXG4gICAgICBuZXcgU2NvcGUoe1xuICAgICAgICBuYW1lOiBiYXNlTmFtZSxcbiAgICAgICAgaXNQcm92aWRlcixcbiAgICAgICAgcGFyZW50OiBpc1Byb3ZpZGVyXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IG5ldyBTY29wZSh7IG5hbWU6IHByb3ZpZGVyTmFtZSwgaXNQcm92aWRlcjogdHJ1ZSB9KSxcbiAgICAgIH0pLFxuICAgICAgc2NoZW1hLmJsb2NrLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBnZXRTdHJ1Y3RBdHRyaWJ1dGUoXG4gICAgICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNb2RlbFtdLFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICk6IEF0dHJpYnV0ZU1vZGVsIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZmluZCgoYXR0KSA9PiB7XG4gICAgICAgIHJldHVybiBhdHQudGVycmFmb3JtTmFtZSA9PT0gZmlyc3Q7XG4gICAgICB9KTtcbiAgICAgIGlmICghYXR0cmlidXRlKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIHRvIGZpbmQgcmVjdXJzaXZlIGF0dHJpYnV0ZSBhdCBwYXRoOiAke3BhdGh9YCxcbiAgICAgICAgKTtcbiAgICAgIGlmICghYXR0cmlidXRlLnR5cGUuc3RydWN0KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIHRvIGZpbmQgc3RydWN0IHR5cGUgYXR0cmlidXRlIGF0IHBhdGg6ICR7cGF0aH0gYnV0IGdvdCAke2F0dHJpYnV0ZS50eXBlLnN0b3JlZENsYXNzVHlwZX1gLFxuICAgICAgICApO1xuICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSByZXR1cm4gYXR0cmlidXRlO1xuICAgICAgcmV0dXJuIGdldFN0cnVjdEF0dHJpYnV0ZShcbiAgICAgICAgYXR0cmlidXRlLnR5cGUuc3RydWN0LmF0dHJpYnV0ZXMsXG4gICAgICAgIHJlc3Quam9pbihcIi5cIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEludHJvZHVjZSByZWN1cnNpb24gZm9yIHNvbWUgYXR0cmlidXRlc1xuICAgIGNvbnN0IHJlY3Vyc2l2ZUF0dHJpYnV0ZVBhdGhzID0gZGV0ZWN0QXR0cmlidXRlTG9vcHMoYXR0cmlidXRlcyk7XG5cbiAgICBPYmplY3QuZW50cmllcyhyZWN1cnNpdmVBdHRyaWJ1dGVQYXRocykuZm9yRWFjaChcbiAgICAgIChbYXR0cmlidXRlUGF0aCwgc3RydWN0UGF0aF0pID0+IHtcbiAgICAgICAgLy8gVE9ETzogYnVpbGQgdGhpcyB0byBiZSBhIGJpdCBtb3JlIGRlZmVuc2l2ZSAoZS5nLiByZW1vdmUgISBvcGVyYXRvcilcbiAgICAgICAgY29uc3QgcmVjdXJzaW9uVGFyZ2V0U3RydWN0QXR0cmlidXRlID0gZ2V0U3RydWN0QXR0cmlidXRlKFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgc3RydWN0UGF0aCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBhdHRyaWJ1dGVQYXRoLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHBhcnRzLnBvcCgpO1xuICAgICAgICBjb25zdCBwYXJlbnRBdHRyaWJ1dGUgPSBnZXRTdHJ1Y3RBdHRyaWJ1dGUoYXR0cmlidXRlcywgcGFydHMuam9pbihcIi5cIikpO1xuICAgICAgICBjb25zdCBpbmRleFRvUmVwbGFjZSA9XG4gICAgICAgICAgcGFyZW50QXR0cmlidXRlLnR5cGUuc3RydWN0IS5hdHRyaWJ1dGVzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChhdHQpID0+IGF0dC50ZXJyYWZvcm1OYW1lID09PSBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChpbmRleFRvUmVwbGFjZSA9PT0gLTEpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBhdHRyaWJ1dGUgYXQgcGF0aCBcIiArIGF0dHJpYnV0ZVBhdGgpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0F0dHJpYnV0ZSA9XG4gICAgICAgICAgcGFyZW50QXR0cmlidXRlLnR5cGUuc3RydWN0IS5hdHRyaWJ1dGVzW2luZGV4VG9SZXBsYWNlXTtcblxuICAgICAgICBwYXJlbnRBdHRyaWJ1dGUudHlwZS5zdHJ1Y3QhLmF0dHJpYnV0ZXNbaW5kZXhUb1JlcGxhY2VdID1cbiAgICAgICAgICByZWN1cnNpb25UYXJnZXRTdHJ1Y3RBdHRyaWJ1dGU7IC8vIGludHJvZHVjZSByZWN1cnNpb25cblxuICAgICAgICAvLyB1Z2x5LCBwbHMgY8y2Ycy2bMy2bMy2IHJlZmFjdG9yIG1lIG1heWJlXG4gICAgICAgIC8vIHdlIHN0b3JlIGFsbCBzdHJ1Y3RzIGluIHRoaXMuc3RydWN0cyDigJMgbm93IHdlIG5lZWQgdG8gZGlzcG9zZSBhbGwgc3RydWN0cyB0aGF0IGFyZSBwYXJ0IG9mIHByZXZpb3VzQXR0cmlidXRlXG4gICAgICAgIGNvbnN0IGRpc3Bvc2VTdHJ1Y3RzID0gKGF0dHI6IEF0dHJpYnV0ZU1vZGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGF0dHIudHlwZS5zdHJ1Y3QpIHtcbiAgICAgICAgICAgIGF0dHIudHlwZS5zdHJ1Y3QuYXR0cmlidXRlcy5mb3JFYWNoKGRpc3Bvc2VTdHJ1Y3RzKTtcbiAgICAgICAgICAgIHRoaXMuc3RydWN0cyA9IHRoaXMuc3RydWN0cy5maWx0ZXIoKHMpID0+IHMgIT09IGF0dHIudHlwZS5zdHJ1Y3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkaXNwb3NlU3RydWN0cyhwcmV2aW91c0F0dHJpYnV0ZSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhdHRyaWJ1dGVzID0gZGVkdXBsaWNhdGVBdHRyaWJ1dGVzV2l0aFNhbWVOYW1lKGF0dHJpYnV0ZXMpO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNb2RlbCA9IG5ldyBSZXNvdXJjZU1vZGVsKHtcbiAgICAgIHRlcnJhZm9ybVR5cGU6IHR5cGUsXG4gICAgICBiYXNlTmFtZSxcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzY2hlbWEsXG4gICAgICBmcXBuLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIHRlcnJhZm9ybVNjaGVtYVR5cGUsXG4gICAgICBzdHJ1Y3RzOiB0aGlzLnN0cnVjdHMsXG4gICAgICBjb25maWdTdHJ1Y3ROYW1lLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc291cmNlTW9kZWw7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckF0dHJpYnV0ZVR5cGUoXG4gICAgc2NvcGU6IFNjb3BlW10sXG4gICAgYXR0cmlidXRlVHlwZTogQXR0cmlidXRlVHlwZSB8IEF0dHJpYnV0ZU5lc3RlZFR5cGUsXG4gICAgcGFyZW50S2luZD86IHN0cmluZyxcbiAgKTogQXR0cmlidXRlVHlwZU1vZGVsIHtcbiAgICBjb25zdCBwYXJlbnQgPSBzY29wZVtzY29wZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoc2hvdWxkU2tpcEF0dHJpYnV0ZShwYXJlbnQuYmFzZU5hbWUpKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcEF0dHJpYnV0ZVR5cGVNb2RlbChuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwiYW55XCIpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZVR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlVHlwZSkge1xuICAgICAgICBjYXNlIFwiYm9vbFwiOlxuICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwiYm9vbGVhblwiKTtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwic3RyaW5nXCIpO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVBdHRyaWJ1dGVUeXBlTW9kZWwoXCJudW1iZXJcIik7XG4gICAgICAgIGNhc2UgXCJkeW5hbWljXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXBBdHRyaWJ1dGVUeXBlTW9kZWwobmV3IFNpbXBsZUF0dHJpYnV0ZVR5cGVNb2RlbChcImFueVwiKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHByaW1pdGl2ZSB0eXBlICR7YXR0cmlidXRlVHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVUeXBlKSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZVR5cGUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBhcnJheWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBba2luZCwgdHlwZV0gPSBhdHRyaWJ1dGVUeXBlO1xuXG4gICAgICBpZiAoa2luZCA9PT0gXCJzZXRcIiB8fCBraW5kID09PSBcImxpc3RcIikge1xuICAgICAgICBjb25zdCBlbGVtZW50VHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB0eXBlIGFzIEF0dHJpYnV0ZVR5cGUsXG4gICAgICAgICAgW2tpbmQsIHBhcmVudEtpbmRdLmpvaW4oXCJcIiksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBraW5kID09PSBcImxpc3RcIlxuICAgICAgICAgID8gbmV3IExpc3RBdHRyaWJ1dGVUeXBlTW9kZWwoZWxlbWVudFR5cGUsIGZhbHNlLCBmYWxzZSlcbiAgICAgICAgICA6IG5ldyBTZXRBdHRyaWJ1dGVUeXBlTW9kZWwoZWxlbWVudFR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kID09PSBcIm1hcFwiKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB0eXBlIGFzIEF0dHJpYnV0ZVR5cGUsXG4gICAgICAgICAgW2tpbmQsIHBhcmVudEtpbmRdLmpvaW4oXCJcIiksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgTWFwQXR0cmlidXRlVHlwZU1vZGVsKHZhbHVlVHlwZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IG9iakF0dHJpYnV0ZXMgPSB0eXBlIGFzIHsgW25hbWU6IHN0cmluZ106IEF0dHJpYnV0ZVR5cGUgfTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlczogeyBbbmFtZTogc3RyaW5nXTogQXR0cmlidXRlIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdHlwZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqQXR0cmlidXRlcykpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzW25hbWVdID0geyB0eXBlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICBwYXJlbnRLaW5kID8/IGtpbmQsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQXR0cmlidXRlTmVzdGVkVHlwZShhdHRyaWJ1dGVUeXBlKSkge1xuICAgICAgbGV0IHN0cnVjdCA9IHVuZGVmaW5lZDtcbiAgICAgIGxldCB0eXBlTW9kZWwgPSB1bmRlZmluZWQ7XG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlKSB7XG4gICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IExpc3RBdHRyaWJ1dGVUeXBlTW9kZWwoXG4gICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgICAgICBzdHJ1Y3QgPSB0aGlzLmFkZEFub255bW91c1N0cnVjdChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgYXR0cmlidXRlVHlwZS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgYXR0cmlidXRlVHlwZS5uZXN0aW5nX21vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0eXBlTW9kZWwgPSBuZXcgU2V0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IE1hcEF0dHJpYnV0ZVR5cGVNb2RlbChcbiAgICAgICAgICAgIG5ldyBTdHJ1Y3RBdHRyaWJ1dGVUeXBlTW9kZWwoc3RydWN0KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic2luZ2xlXCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYG5lc3RlZF90eXBlIHdpdGggbmVzdGluZ19tb2RlIFwiJHtcbiAgICAgICAgICAgICAgYXR0cmlidXRlVHlwZS5uZXN0aW5nX21vZGVcbiAgICAgICAgICAgIH1cIiBub3Qgc3VwcG9ydGVkIChhdHRyaWJ1dGUgc2NvcGU6ICR7c2NvcGVcbiAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy5mdWxsTmFtZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIsXCIpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVNb2RlbDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gdHlwZSAke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZVR5cGUpfWApO1xuICB9XG5cbiAgcHVibGljIHJlbmRlckF0dHJpYnV0ZXNGb3JCbG9jayhwYXJlbnRUeXBlOiBTY29wZSwgYmxvY2s6IEJsb2NrKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheTxBdHRyaWJ1dGVNb2RlbD4oKTtcblxuICAgIGZvciAoY29uc3QgW3RlcnJhZm9ybUF0dHJpYnV0ZU5hbWUsIGF0dF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICBibG9jay5hdHRyaWJ1dGVzIHx8IHt9LFxuICAgICkpIHtcbiAgICAgIGxldCB0eXBlOiBBdHRyaWJ1dGVUeXBlTW9kZWw7XG4gICAgICBsZXQgZm9yY2VQbGFpbkdldHRlclR5cGUgPSBmYWxzZTtcbiAgICAgIGlmIChzaG91bGRTa2lwQXR0cmlidXRlKHBhcmVudFR5cGUuZnVsbE5hbWUodGVycmFmb3JtQXR0cmlidXRlTmFtZSkpKSB7XG4gICAgICAgIHR5cGUgPSBuZXcgU2tpcHBlZEF0dHJpYnV0ZVR5cGVNb2RlbCgpO1xuICAgICAgICBmb3JjZVBsYWluR2V0dGVyVHlwZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gdGhpcy5yZW5kZXJBdHRyaWJ1dGVUeXBlKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgICAgICBuZXcgU2NvcGUoe1xuICAgICAgICAgICAgICBuYW1lOiB0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHBhcmVudFR5cGUsXG4gICAgICAgICAgICAgIGlzUHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICAgICAgaXNDb21wdXRlZDogISFhdHQuY29tcHV0ZWQsXG4gICAgICAgICAgICAgIGlzT3B0aW9uYWw6ICEhYXR0Lm9wdGlvbmFsLFxuICAgICAgICAgICAgICBpc1JlcXVpcmVkOiAhIWF0dC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgaXNOZXN0ZWRUeXBlOiBpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYXR0LnR5cGUgfHwgYXR0Lm5lc3RlZF90eXBlLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gdG9DYW1lbENhc2UodGVycmFmb3JtQXR0cmlidXRlTmFtZSk7XG5cbiAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50VHlwZS5mdWxsTmFtZSh0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYXR0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgc3RvcmFnZU5hbWU6IGBfJHtuYW1lfWAsXG4gICAgICAgICAgY29tcHV0ZWQ6ICEhYXR0LmNvbXB1dGVkLFxuICAgICAgICAgIG9wdGlvbmFsOiAhIWF0dC5vcHRpb25hbCxcbiAgICAgICAgICB0ZXJyYWZvcm1OYW1lOiB0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICByZXF1aXJlZDogISFhdHQucmVxdWlyZWQsXG4gICAgICAgICAgZm9yY2VQbGFpbkdldHRlclR5cGUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtibG9ja1R5cGVOYW1lLCBibG9ja1R5cGVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgYmxvY2suYmxvY2tfdHlwZXMgfHwge30sXG4gICAgKSkge1xuICAgICAgaWYgKHNob3VsZFNraXBBdHRyaWJ1dGUocGFyZW50VHlwZS5mdWxsTmFtZShibG9ja1R5cGVOYW1lKSkpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRvQ2FtZWxDYXNlKGJsb2NrVHlwZU5hbWUpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBuZXcgU2NvcGUoe1xuICAgICAgICAgIG5hbWU6IGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgcGFyZW50OiBwYXJlbnRUeXBlLFxuICAgICAgICAgIGlzUHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgICBuZXcgQXR0cmlidXRlTW9kZWwoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybU5hbWU6IGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50LmZ1bGxOYW1lKGJsb2NrVHlwZU5hbWUpLFxuICAgICAgICAgICAgdHlwZTogbmV3IFNraXBwZWRBdHRyaWJ1dGVUeXBlTW9kZWwoKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtibG9ja1R5cGVOYW1lfSBibG9ja2AsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBjcmVhdGUgYSBzdHJ1Y3QgZm9yIHRoaXMgYmxvY2tcbiAgICAgIGxldCBibG9ja0F0dHJpYnV0ZXMgPSB0aGlzLnJlbmRlckF0dHJpYnV0ZXNGb3JCbG9jayhcbiAgICAgICAgbmV3IFNjb3BlKHtcbiAgICAgICAgICBuYW1lOiBgJHtwYXJlbnRUeXBlLm5hbWV9XyR7YmxvY2tUeXBlTmFtZX1gLFxuICAgICAgICAgIHBhcmVudDogcGFyZW50VHlwZSxcbiAgICAgICAgICBpc1Byb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgaW5CbG9ja1R5cGU6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgICBibG9ja1R5cGUuYmxvY2ssXG4gICAgICApO1xuXG4gICAgICBibG9ja0F0dHJpYnV0ZXMgPSBkZWR1cGxpY2F0ZUF0dHJpYnV0ZXNXaXRoU2FtZU5hbWUoYmxvY2tBdHRyaWJ1dGVzKTtcblxuICAgICAgY29uc3QgYmxvY2tTdHJ1Y3QgPSB0aGlzLmFkZFN0cnVjdChcbiAgICAgICAgW1xuICAgICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgICAgbmV3IFNjb3BlKHtcbiAgICAgICAgICAgIG5hbWU6IGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudFR5cGUsXG4gICAgICAgICAgICBpc1Byb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICAgIGJsb2NrQXR0cmlidXRlcyxcbiAgICAgICAgYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSxcbiAgICAgICAgKGJsb2NrVHlwZS5uZXN0aW5nX21vZGUgPT09IFwibGlzdFwiIHx8XG4gICAgICAgICAgYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSA9PT0gXCJzZXRcIikgJiZcbiAgICAgICAgICBibG9ja1R5cGUubWF4X2l0ZW1zID09PSAxLFxuICAgICAgKTtcblxuICAgICAgLy8gZGVmaW5lIHRoZSBhdHRyaWJ1dGVcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgYXR0cmlidXRlRm9yQmxvY2tUeXBlKFxuICAgICAgICAgIGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgYmxvY2tUeXBlLFxuICAgICAgICAgIGJsb2NrU3RydWN0LFxuICAgICAgICAgIHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICBwYXJlbnRUeXBlLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlcztcblxuICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZUZvckJsb2NrVHlwZShcbiAgICAgIHRlcnJhZm9ybU5hbWU6IHN0cmluZyxcbiAgICAgIGJsb2NrVHlwZTogQmxvY2tUeXBlLFxuICAgICAgc3RydWN0OiBTdHJ1Y3QsXG4gICAgICBpc1Byb3ZpZGVyOiBib29sZWFuLFxuICAgICAgcGFyZW50OiBTY29wZSxcbiAgICApOiBBdHRyaWJ1dGVNb2RlbCB7XG4gICAgICBjb25zdCBuYW1lID0gdG9DYW1lbENhc2UodGVycmFmb3JtTmFtZSk7XG4gICAgICBsZXQgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgICBsZXQgcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgICAgIHN3aXRjaCAoYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSkge1xuICAgICAgICBjYXNlIFwic2luZ2xlXCI6XG4gICAgICAgICAgb3B0aW9uYWwgPSAhc3RydWN0LmF0dHJpYnV0ZXMuc29tZSgoeCkgPT4gIXgub3B0aW9uYWwpO1xuICAgICAgICAgIHJlcXVpcmVkID0gIXN0cnVjdC5hdHRyaWJ1dGVzLnNvbWUoKHgpID0+ICF4LnJlcXVpcmVkKTtcblxuICAgICAgICAgIC8vIFRoaXMgaXMgZm9yIGJ1ZyAjMzU3MCBhcyBib3RoIG9wdGlvbmFsIGFuZCByZXF1aXJlZCBldmFsdWF0ZSB0byBmYWxzZSB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXNcbiAgICAgICAgICAvLyAodGhpcyB0aGVuIGNhdXNlcyB0aGUgY29tcHV0ZWQgYmxvY2sgdG8gbm90IGJlIHBhcnQgb2YgYXNzaWduYWJsZUF0dHJpYnV0ZXMgYW5kIHRodXMgc2tpcHBlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUpXG4gICAgICAgICAgLy8gSGVuY2U6IElmIGJvdGggb3B0aW9uYWwgYW5kIHJlcXVpcmVkIGFyZSBmYWxzZSwgc2V0IG9wdGlvbmFsIHRvIHRydWUgSUYgYXQgbGVhc3Qgb25lXG4gICAgICAgICAgLy8gYXR0cmlidXRlIGluIHRoZSBibG9jayBoYXMgb3B0aW9uYWwgPSB0cnVlIG9yIHJlcXVpcmVkID0gdHJ1ZSwgYXMgdGhpcyB3b3VsZCBtZWFuIHRoYXQgYXQgbGVhc3Qgc29tZXRoaW5nIGNhbiBiZSBzZXRcbiAgICAgICAgICAvLyBhbmQgdGhlIGJsb2NrIGlzIG5vdCBhbGwgY29tcHV0ZWQuXG4gICAgICAgICAgaWYgKCFvcHRpb25hbCAmJiAhcmVxdWlyZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbmFsID0gc3RydWN0LmF0dHJpYnV0ZXMuc29tZSgoeCkgPT4geC5vcHRpb25hbCB8fCB4LnJlcXVpcmVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1OYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtRnVsbE5hbWU6IHBhcmVudC5mdWxsTmFtZSh0ZXJyYWZvcm1OYW1lKSxcbiAgICAgICAgICAgIHR5cGU6IG5ldyBTdHJ1Y3RBdHRyaWJ1dGVUeXBlTW9kZWwoc3RydWN0KSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHt0ZXJyYWZvcm1OYW1lfSBibG9ja2AsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIG9wdGlvbmFsLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IGlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVNb2RlbCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtTmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybUZ1bGxOYW1lOiBwYXJlbnQuZnVsbE5hbWUodGVycmFmb3JtTmFtZSksXG4gICAgICAgICAgICB0eXBlOiBuZXcgTWFwQXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke3RlcnJhZm9ybU5hbWV9IGJsb2NrYCxcbiAgICAgICAgICAgIHN0b3JhZ2VOYW1lOiBgXyR7bmFtZX1gLFxuICAgICAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IGlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcImxpc3RcIjpcbiAgICAgICAgY2FzZSBcInNldFwiOlxuICAgICAgICAgIG9wdGlvbmFsID1cbiAgICAgICAgICAgIGJsb2NrVHlwZS5taW5faXRlbXMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBibG9ja1R5cGUubWluX2l0ZW1zIDwgMTtcbiAgICAgICAgICByZXF1aXJlZCA9XG4gICAgICAgICAgICBibG9ja1R5cGUubWluX2l0ZW1zID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJsb2NrVHlwZS5taW5faXRlbXMgPiAwO1xuICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlTW9kZWwoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybU5hbWU6IHRlcnJhZm9ybU5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50LmZ1bGxOYW1lKHRlcnJhZm9ybU5hbWUpLFxuICAgICAgICAgICAgdHlwZTpcbiAgICAgICAgICAgICAgYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSA9PT0gXCJsaXN0XCJcbiAgICAgICAgICAgICAgICA/IG5ldyBMaXN0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZS5tYXhfaXRlbXMgPT09IDEsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBuZXcgU2V0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZS5tYXhfaXRlbXMgPT09IDEsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke3RlcnJhZm9ybU5hbWV9IGJsb2NrYCxcbiAgICAgICAgICAgIHN0b3JhZ2VOYW1lOiBgXyR7bmFtZX1gLFxuICAgICAgICAgICAgb3B0aW9uYWwsXG4gICAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgICBwcm92aWRlcjogaXNQcm92aWRlcixcbiAgICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZEFub255bW91c1N0cnVjdChcbiAgICBzY29wZTogU2NvcGVbXSxcbiAgICBhdHRyczogeyBbbmFtZTogc3RyaW5nXTogQXR0cmlidXRlIH0gfCB1bmRlZmluZWQsXG4gICAgbmVzdGluZ19tb2RlOiBzdHJpbmcsXG4gICkge1xuICAgIGxldCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5PEF0dHJpYnV0ZU1vZGVsPigpO1xuICAgIGNvbnN0IHBhcmVudCA9IHNjb3BlW3Njb3BlLmxlbmd0aCAtIDFdO1xuICAgIGlmIChhdHRycykge1xuICAgICAgZm9yIChjb25zdCBbdGVycmFmb3JtTmFtZSwgYXR0XSBvZiBPYmplY3QuZW50cmllcyhhdHRycyB8fCB7fSkpIHtcbiAgICAgICAgLy8gbmVzdGVkIHR5cGVzIHN1cHBvcnQgY29tcHV0ZWQsIG9wdGlvbmFsIGFuZCByZXF1aXJlZCBvbiBhdHRyaWJ1dGUgbGV2ZWxcbiAgICAgICAgLy8gaWYgcGFyZW50IGlzIGNvbXB1dGVkLCBjaGlsZCBhbHdheXMgaXMgY29tcHV0ZWQgYXMgd2VsbFxuICAgICAgICBjb25zdCBjb21wdXRlZCA9XG4gICAgICAgICAgISFwYXJlbnQuaXNDb21wdXRlZCB8fCAocGFyZW50LmlzTmVzdGVkVHlwZSAmJiAhIWF0dC5jb21wdXRlZCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbmFsID0gcGFyZW50LmlzTmVzdGVkVHlwZVxuICAgICAgICAgID8gISFhdHQub3B0aW9uYWxcbiAgICAgICAgICA6ICEhcGFyZW50LmlzT3B0aW9uYWw7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gcGFyZW50LmlzTmVzdGVkVHlwZVxuICAgICAgICAgID8gISFhdHQucmVxdWlyZWRcbiAgICAgICAgICA6ICEhcGFyZW50LmlzUmVxdWlyZWQ7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0b0NhbWVsQ2FzZSh0ZXJyYWZvcm1OYW1lKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBbXG4gICAgICAgICAgICAuLi5zY29wZSxcbiAgICAgICAgICAgIG5ldyBTY29wZSh7XG4gICAgICAgICAgICAgIG5hbWU6IHRlcnJhZm9ybU5hbWUsXG4gICAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgICAgaXNQcm92aWRlcjogcGFyZW50LmlzUHJvdmlkZXIsXG4gICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6IGNvbXB1dGVkLFxuICAgICAgICAgICAgICBpc09wdGlvbmFsOiBvcHRpb25hbCxcbiAgICAgICAgICAgICAgaXNSZXF1aXJlZDogcmVxdWlyZWQsXG4gICAgICAgICAgICAgIGlzTmVzdGVkVHlwZTogcGFyZW50LmlzTmVzdGVkVHlwZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYXR0LnR5cGUgfHwgYXR0Lm5lc3RlZF90eXBlLFxuICAgICAgICApO1xuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIGNvbXB1dGVkOiBjb21wdXRlZCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhdHQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBvcHRpb25hbDogb3B0aW9uYWwsXG4gICAgICAgICAgICB0ZXJyYWZvcm1OYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtRnVsbE5hbWU6IHBhcmVudC5mdWxsTmFtZSh0ZXJyYWZvcm1OYW1lKSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBwcm92aWRlcjogcGFyZW50LmlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZDogcmVxdWlyZWQsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXR0cmlidXRlcyA9IGRlZHVwbGljYXRlQXR0cmlidXRlc1dpdGhTYW1lTmFtZShhdHRyaWJ1dGVzKTtcblxuICAgIHJldHVybiB0aGlzLmFkZFN0cnVjdChzY29wZSwgYXR0cmlidXRlcywgbmVzdGluZ19tb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU3RydWN0KFxuICAgIHNjb3BlOiBTY29wZVtdLFxuICAgIGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZU1vZGVsW10sXG4gICAgbmVzdGluZ19tb2RlOiBzdHJpbmcsXG4gICAgaXNTaW5nbGVJdGVtID0gZmFsc2UsXG4gICkge1xuICAgIGNvbnN0IHBvc3NpYmxlTmFtZSA9IHRvUGFzY2FsQ2FzZShcbiAgICAgIHNjb3BlLm1hcCgoeCkgPT4gdG9TbmFrZUNhc2UoeC5uYW1lKSkuam9pbihcIl9cIiksXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy51bmlxdWVDbGFzc05hbWUoXG4gICAgICBpc1Jlc2VydmVkU3RydWN0Q2xhc3NOYW1lKHBvc3NpYmxlTmFtZSlcbiAgICAgICAgPyBgJHtwb3NzaWJsZU5hbWV9U3RydWN0YFxuICAgICAgICA6IHBvc3NpYmxlTmFtZSxcbiAgICApO1xuXG4gICAgY29uc3QgcGFyZW50ID0gc2NvcGVbc2NvcGUubGVuZ3RoIC0gMV07XG4gICAgLy8gYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSA9PiBsaXN0L3NldCAmIGJsb2NrVHlwZS5tYXhfaXRlbXMgPT09IDEsXG4gICAgY29uc3QgaXNDbGFzcyA9IChwYXJlbnQuaXNDb21wdXRlZCAmJiAhcGFyZW50LmlzT3B0aW9uYWwpIHx8IGlzU2luZ2xlSXRlbTtcbiAgICBjb25zdCBpc0Fub255bW91cyA9IHRydWU7XG4gICAgY29uc3QgcyA9IG5ldyBTdHJ1Y3QoXG4gICAgICBuYW1lLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGlzQ2xhc3MsXG4gICAgICBpc0Fub255bW91cyxcbiAgICAgIGlzU2luZ2xlSXRlbSxcbiAgICAgIG5lc3RpbmdfbW9kZSxcbiAgICApO1xuICAgIHRoaXMuc3RydWN0cy5wdXNoKHMpO1xuICAgIHJldHVybiBzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZVBhcnNlciB7XG4gIHByaXZhdGUgdW5pcXVlQ2xhc3NuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByZXNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW9kZWw+ID0ge307XG5cbiAgcHVibGljIHBhcnNlKFxuICAgIGZxcG46IEZRUE4sXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hLFxuICAgIHRlcnJhZm9ybVR5cGU6IHN0cmluZyxcbiAgICBjb25zdHJhaW50PzogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICApOiBSZXNvdXJjZU1vZGVsIHtcbiAgICBpZiAodGhpcy5yZXNvdXJjZXNbdHlwZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc291cmNlc1t0eXBlXTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHRoaXMudW5pcXVlQ2xhc3NuYW1lcyk7XG4gICAgY29uc3QgcmVzb3VyY2UgPSBwYXJzZXIucmVzb3VyY2VGcm9tKFxuICAgICAgZnFwbixcbiAgICAgIHR5cGUsXG4gICAgICBzY2hlbWEsXG4gICAgICB0ZXJyYWZvcm1UeXBlLFxuICAgICAgY29uc3RyYWludCxcbiAgICApO1xuICAgIHRoaXMucmVzb3VyY2VzW3R5cGVdID0gcmVzb3VyY2U7XG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgLy8gVXNlZCBieSBjb252ZXJ0IHRvIGRldGVybWluZSB0aGUgcmlnaHQgbmFtZSBmb3IgYSBjbGFzc1xuICBwdWJsaWMgZ2V0Q2xhc3NOYW1lRm9yUmVzb3VyY2UodGVycmFmb3JtVHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlc1t0ZXJyYWZvcm1UeXBlXTtcbiAgICByZXR1cm4gcmVzb3VyY2UgPyByZXNvdXJjZS5jbGFzc05hbWUgOiBcIlwiO1xuICB9XG5cbiAgLy8gVXNlZCBieSBjb252ZXJ0IHRvIGRldGVybWluZSB0aGUgcmlnaHQgbmFtZSBmb3IgYSBuYW1lc3BhY2VcbiAgcHVibGljIGdldE5hbWVzcGFjZU5hbWVGb3JSZXNvdXJjZSh0ZXJyYWZvcm1UeXBlOiBzdHJpbmcpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2UgZXh0ZXJuYWwgcHJvdmlkZXIgc2luY2UgdGhlIG5hbWUgb2YgcmVzb3VyY2UgZG9lc24ndCBoYXZlIGEgcHJlZml4XG4gICAgaWYgKHRlcnJhZm9ybVR5cGUgPT09IFwiZGF0YV9leHRlcm5hbF9cIikge1xuICAgICAgdGVycmFmb3JtVHlwZSA9IFwiZGF0YV9leHRlcm5hbFwiO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZXNbdGVycmFmb3JtVHlwZV07XG4gICAgaWYgKCFyZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IGZvbGRlciA9IGBwcm92aWRlcnMvJHtyZXNvdXJjZS5wcm92aWRlcn1gO1xuICAgIHJldHVybiByZXNvdXJjZS5maWxlUGF0aC5yZXBsYWNlKGAke2ZvbGRlcn0vYCwgXCJcIikucmVwbGFjZShcIi9pbmRleC50c1wiLCBcIlwiKTtcbiAgfVxufVxuIl19
|
|
523
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dldC9nZW5lcmF0b3IvcmVzb3VyY2UtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMseUNBQW1FO0FBQ25FLDRDQVV3QjtBQUN4Qiw0REFBdUU7QUFDdkUscUNBWWtCO0FBQ2xCLHFEQUF3RDtBQUN4RCw2REFBMkQ7QUFFM0Qsc0VBQXNFO0FBQ3RFLHlKQUF5SjtBQUN6SixNQUFNLGdDQUFnQyxHQUFHO0lBQ3ZDLFlBQVk7SUFDWixXQUFXO0lBQ1gsS0FBSztJQUNMLFNBQVM7SUFDVCxTQUFTO0lBQ1QsV0FBVztJQUNYLFFBQVE7SUFDUixRQUFRO0lBQ1IsT0FBTztJQUNQLE9BQU87Q0FDUixDQUFDO0FBRUYsTUFBTSx5QkFBeUIsR0FBRztJQUNoQyxtSEFBbUg7SUFDbkgsU0FBUztJQUNULDJCQUEyQjtJQUMzQixTQUFTO0NBQ1YsQ0FBQztBQUVGLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxTQUFpQixFQUFXLEVBQUU7SUFDcEUsT0FBTztRQUNMLFFBQVE7UUFDUixRQUFRO1FBQ1IsVUFBVTtRQUNWLEdBQUcsZ0NBQWdDO1FBQ25DLEdBQUcseUJBQXlCO0tBQzdCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUVGLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxTQUFpQixFQUFXLEVBQUU7SUFDL0QsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xELENBQUMsQ0FBQztBQUVGLE1BQU0sV0FBVyxHQUFHLENBQUMsUUFBc0IsRUFBRSxRQUFnQixFQUFVLEVBQUU7SUFDdkUsSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDekIsT0FBTyx5QkFBeUIsQ0FB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Q3ZELDJCQUEyQixDQUFDLGFBQXFCO1FBQ3RELGtGQUFrRjtRQUNsRixJQUFJLGFBQWEsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3ZDLGFBQWEsR0FBRyxlQUFlLENBQUM7UUFDbEMsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsYUFBYSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEQsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNGO0FBaERELHdDQWdEQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSwgdG9QYXNjYWxDYXNlLCB0b1NuYWtlQ2FzZSB9IGZyb20gXCJjb2RlbWFrZXJcIjtcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQXR0cmlidXRlTmVzdGVkVHlwZSxcbiAgQXR0cmlidXRlVHlwZSxcbiAgQmxvY2ssXG4gIEJsb2NrVHlwZSxcbiAgQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICBpc0F0dHJpYnV0ZU5lc3RlZFR5cGUsXG4gIGlzTmVzdGVkVHlwZUF0dHJpYnV0ZSxcbiAgU2NoZW1hLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IFByb3ZpZGVyTmFtZSwgRlFQTiwgcGFyc2VGUVBOIH0gZnJvbSBcIkBjZGt0bi9wcm92aWRlci1zY2hlbWFcIjtcbmltcG9ydCB7XG4gIFJlc291cmNlTW9kZWwsXG4gIEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU3RydWN0LFxuICBTY29wZSxcbiAgQXR0cmlidXRlTW9kZWwsXG4gIFNpbXBsZUF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgTGlzdEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU2V0QXR0cmlidXRlVHlwZU1vZGVsLFxuICBNYXBBdHRyaWJ1dGVUeXBlTW9kZWwsXG4gIFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU2tpcHBlZEF0dHJpYnV0ZVR5cGVNb2RlbCxcbn0gZnJvbSBcIi4vbW9kZWxzXCI7XG5pbXBvcnQgeyBkZXRlY3RBdHRyaWJ1dGVMb29wcyB9IGZyb20gXCIuL2xvb3AtZGV0ZWN0aW9uXCI7XG5pbXBvcnQgeyBzaG91bGRTa2lwQXR0cmlidXRlIH0gZnJvbSBcIi4vc2tpcHBlZC1hdHRyaWJ1dGVzXCI7XG5cbi8vIENhbid0IGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgbGlrZSBcImV4cG9ydCAqIGFzIDxrZXl3b3JkPiBmcm9tIC4uLiBcIlxuLy8gZmlsdGVyZWQgZnJvbSBhbGwga2V5d29yZHMgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvNTAzNjA0Yzg4NGJkMDU1N2M4NTFiMTFiNjk5ZWY5OGNkYjY1YjkzYi9zcmMvY29tcGlsZXIvdHlwZXMudHMjTDExNC1MMTk3XG5jb25zdCBSRVNFUlZFRF9LRVlXT1JEU19GT1JfTkFNRVNQQUNFUyA9IFtcbiAgXCJpbXBsZW1lbnRzXCIsXG4gIFwiaW50ZXJmYWNlXCIsXG4gIFwibGV0XCIsXG4gIFwicGFja2FnZVwiLFxuICBcInByaXZhdGVcIixcbiAgXCJwcm90ZWN0ZWRcIixcbiAgXCJwdWJsaWNcIixcbiAgXCJzdGF0aWNcIixcbiAgXCJ5aWVsZFwiLFxuICBcImF3YWl0XCIsXG5dO1xuXG5jb25zdCBDT0xMSURJTkdfTkFNRVNQQUNFX05BTUVTID0gW1xuICAvLyBlLmcuIGhhc2hpY29ycC9jb25zdWwg4oCTIGNvbGxpZGVzIHdpdGggdGhlIExJQ0VOU0UgZmlsZSBvbiBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW1zIGluIHRoZSBHbyBwYWNrYWdlICgjMjYyNylcbiAgXCJsaWNlbnNlXCIsXG4gIC8vIGNvbGxpZGVzIGZvciBHbyBwYWNrYWdlc1xuICBcInZlcnNpb25cIixcbl07XG5cbmNvbnN0IGlzUmVzZXJ2ZWRDbGFzc09yTmFtZXNwYWNlTmFtZSA9IChjbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJvYmplY3RcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgLi4uUkVTRVJWRURfS0VZV09SRFNfRk9SX05BTUVTUEFDRVMsXG4gICAgLi4uQ09MTElESU5HX05BTUVTUEFDRV9OQU1FUyxcbiAgXS5pbmNsdWRlcyhjbGFzc05hbWUudG9Mb3dlckNhc2UoKSk7XG59O1xuXG5jb25zdCBpc1Jlc2VydmVkU3RydWN0Q2xhc3NOYW1lID0gKGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBjbGFzc05hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChcImxpc3RcIik7XG59O1xuXG5jb25zdCBnZXRGaWxlTmFtZSA9IChwcm92aWRlcjogUHJvdmlkZXJOYW1lLCBiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKGJhc2VOYW1lID09PSBcImluZGV4XCIpIHtcbiAgICByZXR1cm4gXCJpbmRleC1yZXNvdXJjZS9pbmRleC50c1wiO1xuICB9XG5cbiAgaWYgKGJhc2VOYW1lID09PSBgJHtwcm92aWRlcn1fcHJvdmlkZXJgKSB7XG4gICAgcmV0dXJuIFwicHJvdmlkZXIvaW5kZXgudHNcIjtcbiAgfVxuXG4gIHJldHVybiBgJHt0b1NuYWtlQ2FzZShiYXNlTmFtZSkucmVwbGFjZSgvXy9nLCBcIi1cIil9L2luZGV4LnRzYDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUNsYXNzT3JOYW1lc3BhY2VOYW1lKFxuICBiYXNlTmFtZTogc3RyaW5nLFxuICBpc1Byb3ZpZGVyID0gZmFsc2UsXG4pIHtcbiAgY29uc3QgcmVzb3VyY2VJc05hbWVkUHJvdmlkZXIgPSAhaXNQcm92aWRlciAmJiBiYXNlTmFtZSA9PT0gXCJwcm92aWRlclwiO1xuXG4gIGlmIChpc1Jlc2VydmVkQ2xhc3NPck5hbWVzcGFjZU5hbWUoYmFzZU5hbWUpIHx8IHJlc291cmNlSXNOYW1lZFByb3ZpZGVyKSB7XG4gICAgcmV0dXJuIGAke2Jhc2VOYW1lfV9yZXNvdXJjZWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2VOYW1lO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGF0dHJpYnV0ZXMgdGhhdCBtYXkgY29uZmxpY3QgYWZ0ZXIgYmVpbmcgc25ha2UgY2FzZWRcbiAqIEV4YW1wbGU6IG9jaV9jb3JlX2lwc2VjX2Nvbm5lY3Rpb25fdHVubmVsX21hbmFnZW1lbnQgKGhhc2hpY29ycC9vY2lAPTUuMjEuMCkgaGFzIGJncF9pcHY2X3N0YXRlIGFuZCBiZ3BfaXB2NnN0YXRlXG4gKiAod2hpY2ggYm90aCByZXN1bHQgaW4gXCJiZ3BJcHY2U3RhdGVcIiB3aGVuIGNhbWVsLWNhc2VkLCB3aXRoIHRoZSBzZWNvbmQgb25lIGJlaW5nIGRlcHJlY2F0ZWQ6IHRydWUpXG4gKiBBcyB3ZSBjdXJyZW50bHkgZG9uJ3QgaGFuZGxlIGFueSBkZXByZWNhdGVkIG9uZXMgYXQgYWxsLCB3ZSdsbCBqdXN0IGRlbGV0ZSBvbmUgb2YgdGhlIHR3byBhdHRyaWJ1dGVzIGZvciBub3dcbiAqIEBwYXJhbSBhdHRyaWJ1dGVzXG4gKi9cbmZ1bmN0aW9uIGRlZHVwbGljYXRlQXR0cmlidXRlc1dpdGhTYW1lTmFtZShcbiAgYXR0cmlidXRlczogQXR0cmlidXRlTW9kZWxbXSxcbik6IEF0dHJpYnV0ZU1vZGVsW10ge1xuICByZXR1cm4gYXR0cmlidXRlcy5maWx0ZXIoKGF0dHIsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGhhc090aGVyV2l0aFNhbWVOYW1lID0gYXR0cmlidXRlc1xuICAgICAgLnNsaWNlKGlkeCArIDEpIC8vIG9ubHkgc2VhcmNoIGFmdGVyIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBhdHRyaWJ1dGUgdG8gYXZvaWQgZGVsZXRpbmcgYm90aFxuICAgICAgLnNvbWUoKG90aGVyKSA9PiBvdGhlci5uYW1lID09PSBhdHRyLm5hbWUgJiYgb3RoZXIgIT09IGF0dHIpO1xuICAgIHJldHVybiAhaGFzT3RoZXJXaXRoU2FtZU5hbWU7XG4gIH0pO1xufVxuXG5jbGFzcyBQYXJzZXIge1xuICBwcml2YXRlIHN0cnVjdHMgPSBuZXcgQXJyYXk8U3RydWN0PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2xhc3NOYW1lczogc3RyaW5nW10sXG4gICAgcHJpdmF0ZSB1c2VkQmFzZU5hbWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICApIHt9XG5cbiAgcHJpdmF0ZSB1bmlxdWVDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNsYXNzTmFtZXMuaW5jbHVkZXMoY2xhc3NOYW1lKSkge1xuICAgICAgY2xhc3NOYW1lID0gYCR7Y2xhc3NOYW1lfUFgO1xuICAgIH1cbiAgICB0aGlzLmNsYXNzTmFtZXMucHVzaChjbGFzc05hbWUpO1xuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGJhc2UgbmFtZXMgYXJlIHVuaXF1ZSBjYXNlLWluc2Vuc2l0aXZlbHkuXG4gICAqXG4gICAqIEFmZmVjdGVkIGxhbmd1YWdlczpcbiAgICogLSBHbzogSlNJSS1nZW5lcmF0ZWQgR28gcGFja2FnZSBuYW1lcyBhcmUgZnVsbHkgbG93ZXJjYXNlZCwgc29cbiAgICogICBgbG9hZC1iYWxhbmNlci1iYWNrZW5kc2V0YCBhbmQgYGxvYWQtYmFsYW5jZXItYmFja2VuZC1zZXRgIGJvdGhcbiAgICogICBiZWNvbWUgcGFja2FnZSBgbG9hZGJhbGFuY2VyYmFja2VuZHNldGAsIGNhdXNpbmcgYSBoYXJkIGJ1aWxkIGZhaWx1cmU6XG4gICAqICAgXCJjYXNlLWluc2Vuc2l0aXZlIGZpbGUgbmFtZSBjb2xsaXNpb25cIi5cbiAgICogLSBDIzogSlNJSSBnZW5lcmF0ZXMgUGFzY2FsQ2FzZSBkaXJlY3RvcmllcyBsaWtlXG4gICAqICAgYExvYWRCYWxhbmNlckJhY2tlbmRzZXQvYCBhbmQgYExvYWRCYWxhbmNlckJhY2tlbmRTZXQvYCB3aGljaCB0aGUgQyNcbiAgICogICBjb21waWxlciB0cmVhdHMgY2FzZS1pbnNlbnNpdGl2ZWx5LCBjYXVzaW5nIENTMjAwMiBhbmQgQ1MwMjM0IGVycm9ycy5cbiAgICovXG4gIHByaXZhdGUgdW5pcXVlQmFzZU5hbWUoYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFzY2FsTmFtZSA9IHRvUGFzY2FsQ2FzZShiYXNlTmFtZSk7XG4gICAgY29uc3Qga2V5ID0gcGFzY2FsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy51c2VkQmFzZU5hbWVzLmdldChrZXkpO1xuXG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcgIT09IHBhc2NhbE5hbWUpIHtcbiAgICAgIGJhc2VOYW1lID0gYCR7YmFzZU5hbWV9QWA7XG4gICAgICByZXR1cm4gdGhpcy51bmlxdWVCYXNlTmFtZShiYXNlTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VkQmFzZU5hbWVzLnNldChrZXksIHBhc2NhbE5hbWUpO1xuICAgIHJldHVybiBiYXNlTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvdXJjZUZyb20oXG4gICAgZnFwbjogRlFQTixcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWEsXG4gICAgdGVycmFmb3JtU2NoZW1hVHlwZTogc3RyaW5nLFxuICAgIGNvbnN0cmFpbnQ/OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsXG4gICk6IFJlc291cmNlTW9kZWwge1xuICAgIGxldCBiYXNlTmFtZSA9IHR5cGU7XG5cbiAgICBjb25zdCBwcm92aWRlck5hbWVGcm9tQ29uc3RyYWludCA9IGNvbnN0cmFpbnRcbiAgICAgID8gKGNvbnN0cmFpbnQubmFtZSBhcyBQcm92aWRlck5hbWUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm92aWRlck5hbWVGcm9tRlFQTiA9IHBhcnNlRlFQTihmcXBuKS5uYW1lO1xuXG4gICAgaWYgKGJhc2VOYW1lLnN0YXJ0c1dpdGgoYCR7cHJvdmlkZXJOYW1lRnJvbUZRUE59X2ApKSB7XG4gICAgICBiYXNlTmFtZSA9IGJhc2VOYW1lLnN1YnN0cihwcm92aWRlck5hbWVGcm9tRlFQTi5sZW5ndGggKyAxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm92aWRlck5hbWUgPSBwcm92aWRlck5hbWVGcm9tQ29uc3RyYWludFxuICAgICAgPyBwcm92aWRlck5hbWVGcm9tQ29uc3RyYWludFxuICAgICAgOiBwcm92aWRlck5hbWVGcm9tRlFQTjtcblxuICAgIGNvbnN0IGlzUHJvdmlkZXIgPSB0ZXJyYWZvcm1TY2hlbWFUeXBlID09PSBcInByb3ZpZGVyXCI7XG4gICAgaWYgKGlzUHJvdmlkZXIpIHtcbiAgICAgIGJhc2VOYW1lID0gYCR7cHJvdmlkZXJOYW1lfV8ke2Jhc2VOYW1lfWA7XG4gICAgICBpZiAoIShcImF0dHJpYnV0ZXNcIiBpbiBzY2hlbWEuYmxvY2spKSB7XG4gICAgICAgIHNjaGVtYS5ibG9jayA9IHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICBibG9ja190eXBlczogKHNjaGVtYS5ibG9jayBhcyBCbG9jaykuYmxvY2tfdHlwZXMgfHwge30sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBzb21laG93IG1pc3NpbmcgZnJvbSBwcm92aWRlciBzY2hlbWFcbiAgICAgIHNjaGVtYS5ibG9jay5hdHRyaWJ1dGVzW1wiYWxpYXNcIl0gPSB7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkFsaWFzIG5hbWVcIixcbiAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgIGNvbXB1dGVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgYmFzZU5hbWUgPSBzYW5pdGl6ZUNsYXNzT3JOYW1lc3BhY2VOYW1lKGJhc2VOYW1lLCBpc1Byb3ZpZGVyKTtcbiAgICBiYXNlTmFtZSA9IHRoaXMudW5pcXVlQmFzZU5hbWUoYmFzZU5hbWUpO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy51bmlxdWVDbGFzc05hbWUodG9QYXNjYWxDYXNlKGJhc2VOYW1lKSk7XG4gICAgLy8gYXZvaWQgbmFtaW5nIGNvbGxpc2lvbiAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1jZGsvaXNzdWVzLzI5OVxuICAgIGNvbnN0IGNvbmZpZ1N0cnVjdE5hbWUgPSB0aGlzLnVuaXF1ZUNsYXNzTmFtZShgJHtjbGFzc05hbWV9Q29uZmlnYCk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZShwcm92aWRlck5hbWUsIGJhc2VOYW1lKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gYHByb3ZpZGVycy8ke3RvU25ha2VDYXNlKHByb3ZpZGVyTmFtZSl9LyR7ZmlsZU5hbWV9YDtcbiAgICBsZXQgYXR0cmlidXRlcyA9IHRoaXMucmVuZGVyQXR0cmlidXRlc0ZvckJsb2NrKFxuICAgICAgbmV3IFNjb3BlKHtcbiAgICAgICAgbmFtZTogYmFzZU5hbWUsXG4gICAgICAgIGlzUHJvdmlkZXIsXG4gICAgICAgIHBhcmVudDogaXNQcm92aWRlclxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBuZXcgU2NvcGUoeyBuYW1lOiBwcm92aWRlck5hbWUsIGlzUHJvdmlkZXI6IHRydWUgfSksXG4gICAgICB9KSxcbiAgICAgIHNjaGVtYS5ibG9jayxcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gZ2V0U3RydWN0QXR0cmlidXRlKFxuICAgICAgYXR0cmlidXRlczogQXR0cmlidXRlTW9kZWxbXSxcbiAgICAgIHBhdGg6IHN0cmluZyxcbiAgICApOiBBdHRyaWJ1dGVNb2RlbCB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmZpbmQoKGF0dCkgPT4ge1xuICAgICAgICByZXR1cm4gYXR0LnRlcnJhZm9ybU5hbWUgPT09IGZpcnN0O1xuICAgICAgfSk7XG4gICAgICBpZiAoIWF0dHJpYnV0ZSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCB0byBmaW5kIHJlY3Vyc2l2ZSBhdHRyaWJ1dGUgYXQgcGF0aDogJHtwYXRofWAsXG4gICAgICAgICk7XG4gICAgICBpZiAoIWF0dHJpYnV0ZS50eXBlLnN0cnVjdClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCB0byBmaW5kIHN0cnVjdCB0eXBlIGF0dHJpYnV0ZSBhdCBwYXRoOiAke3BhdGh9IGJ1dCBnb3QgJHthdHRyaWJ1dGUudHlwZS5zdG9yZWRDbGFzc1R5cGV9YCxcbiAgICAgICAgKTtcbiAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGF0dHJpYnV0ZTtcbiAgICAgIHJldHVybiBnZXRTdHJ1Y3RBdHRyaWJ1dGUoXG4gICAgICAgIGF0dHJpYnV0ZS50eXBlLnN0cnVjdC5hdHRyaWJ1dGVzLFxuICAgICAgICByZXN0LmpvaW4oXCIuXCIpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJbnRyb2R1Y2UgcmVjdXJzaW9uIGZvciBzb21lIGF0dHJpYnV0ZXNcbiAgICBjb25zdCByZWN1cnNpdmVBdHRyaWJ1dGVQYXRocyA9IGRldGVjdEF0dHJpYnV0ZUxvb3BzKGF0dHJpYnV0ZXMpO1xuXG4gICAgT2JqZWN0LmVudHJpZXMocmVjdXJzaXZlQXR0cmlidXRlUGF0aHMpLmZvckVhY2goXG4gICAgICAoW2F0dHJpYnV0ZVBhdGgsIHN0cnVjdFBhdGhdKSA9PiB7XG4gICAgICAgIC8vIFRPRE86IGJ1aWxkIHRoaXMgdG8gYmUgYSBiaXQgbW9yZSBkZWZlbnNpdmUgKGUuZy4gcmVtb3ZlICEgb3BlcmF0b3IpXG4gICAgICAgIGNvbnN0IHJlY3Vyc2lvblRhcmdldFN0cnVjdEF0dHJpYnV0ZSA9IGdldFN0cnVjdEF0dHJpYnV0ZShcbiAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgIHN0cnVjdFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gYXR0cmlidXRlUGF0aC5zcGxpdChcIi5cIik7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBwYXJ0cy5wb3AoKTtcbiAgICAgICAgY29uc3QgcGFyZW50QXR0cmlidXRlID0gZ2V0U3RydWN0QXR0cmlidXRlKGF0dHJpYnV0ZXMsIHBhcnRzLmpvaW4oXCIuXCIpKTtcbiAgICAgICAgY29uc3QgaW5kZXhUb1JlcGxhY2UgPVxuICAgICAgICAgIHBhcmVudEF0dHJpYnV0ZS50eXBlLnN0cnVjdCEuYXR0cmlidXRlcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoYXR0KSA9PiBhdHQudGVycmFmb3JtTmFtZSA9PT0gYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICBpZiAoaW5kZXhUb1JlcGxhY2UgPT09IC0xKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgYXR0cmlidXRlIGF0IHBhdGggXCIgKyBhdHRyaWJ1dGVQYXRoKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNBdHRyaWJ1dGUgPVxuICAgICAgICAgIHBhcmVudEF0dHJpYnV0ZS50eXBlLnN0cnVjdCEuYXR0cmlidXRlc1tpbmRleFRvUmVwbGFjZV07XG5cbiAgICAgICAgcGFyZW50QXR0cmlidXRlLnR5cGUuc3RydWN0IS5hdHRyaWJ1dGVzW2luZGV4VG9SZXBsYWNlXSA9XG4gICAgICAgICAgcmVjdXJzaW9uVGFyZ2V0U3RydWN0QXR0cmlidXRlOyAvLyBpbnRyb2R1Y2UgcmVjdXJzaW9uXG5cbiAgICAgICAgLy8gdWdseSwgcGxzIGPMtmHMtmzMtmzMtiByZWZhY3RvciBtZSBtYXliZVxuICAgICAgICAvLyB3ZSBzdG9yZSBhbGwgc3RydWN0cyBpbiB0aGlzLnN0cnVjdHMg4oCTIG5vdyB3ZSBuZWVkIHRvIGRpc3Bvc2UgYWxsIHN0cnVjdHMgdGhhdCBhcmUgcGFydCBvZiBwcmV2aW91c0F0dHJpYnV0ZVxuICAgICAgICBjb25zdCBkaXNwb3NlU3RydWN0cyA9IChhdHRyOiBBdHRyaWJ1dGVNb2RlbCkgPT4ge1xuICAgICAgICAgIGlmIChhdHRyLnR5cGUuc3RydWN0KSB7XG4gICAgICAgICAgICBhdHRyLnR5cGUuc3RydWN0LmF0dHJpYnV0ZXMuZm9yRWFjaChkaXNwb3NlU3RydWN0cyk7XG4gICAgICAgICAgICB0aGlzLnN0cnVjdHMgPSB0aGlzLnN0cnVjdHMuZmlsdGVyKChzKSA9PiBzICE9PSBhdHRyLnR5cGUuc3RydWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZGlzcG9zZVN0cnVjdHMocHJldmlvdXNBdHRyaWJ1dGUpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXR0cmlidXRlcyA9IGRlZHVwbGljYXRlQXR0cmlidXRlc1dpdGhTYW1lTmFtZShhdHRyaWJ1dGVzKTtcblxuICAgIGNvbnN0IHJlc291cmNlTW9kZWwgPSBuZXcgUmVzb3VyY2VNb2RlbCh7XG4gICAgICB0ZXJyYWZvcm1UeXBlOiB0eXBlLFxuICAgICAgYmFzZU5hbWUsXG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgc2NoZW1hLFxuICAgICAgZnFwbixcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICB0ZXJyYWZvcm1TY2hlbWFUeXBlLFxuICAgICAgc3RydWN0czogdGhpcy5zdHJ1Y3RzLFxuICAgICAgY29uZmlnU3RydWN0TmFtZSxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXNvdXJjZU1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBdHRyaWJ1dGVUeXBlKFxuICAgIHNjb3BlOiBTY29wZVtdLFxuICAgIGF0dHJpYnV0ZVR5cGU6IEF0dHJpYnV0ZVR5cGUgfCBBdHRyaWJ1dGVOZXN0ZWRUeXBlLFxuICAgIHBhcmVudEtpbmQ/OiBzdHJpbmcsXG4gICk6IEF0dHJpYnV0ZVR5cGVNb2RlbCB7XG4gICAgY29uc3QgcGFyZW50ID0gc2NvcGVbc2NvcGUubGVuZ3RoIC0gMV07XG4gICAgaWYgKHNob3VsZFNraXBBdHRyaWJ1dGUocGFyZW50LmJhc2VOYW1lKSkge1xuICAgICAgcmV0dXJuIG5ldyBNYXBBdHRyaWJ1dGVUeXBlTW9kZWwobmV3IFNpbXBsZUF0dHJpYnV0ZVR5cGVNb2RlbChcImFueVwiKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZVR5cGUpIHtcbiAgICAgICAgY2FzZSBcImJvb2xcIjpcbiAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUF0dHJpYnV0ZVR5cGVNb2RlbChcImJvb2xlYW5cIik7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUF0dHJpYnV0ZVR5cGVNb2RlbChcInN0cmluZ1wiKTtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwibnVtYmVyXCIpO1xuICAgICAgICBjYXNlIFwiZHluYW1pY1wiOlxuICAgICAgICAgIHJldHVybiBuZXcgTWFwQXR0cmlidXRlVHlwZU1vZGVsKG5ldyBTaW1wbGVBdHRyaWJ1dGVUeXBlTW9kZWwoXCJhbnlcIikpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBwcmltaXRpdmUgdHlwZSAke2F0dHJpYnV0ZVR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlVHlwZSkpIHtcbiAgICAgIGlmIChhdHRyaWJ1dGVUeXBlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgYXJyYXlgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgW2tpbmQsIHR5cGVdID0gYXR0cmlidXRlVHlwZTtcblxuICAgICAgaWYgKGtpbmQgPT09IFwic2V0XCIgfHwga2luZCA9PT0gXCJsaXN0XCIpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSB0aGlzLnJlbmRlckF0dHJpYnV0ZVR5cGUoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgdHlwZSBhcyBBdHRyaWJ1dGVUeXBlLFxuICAgICAgICAgIFtraW5kLCBwYXJlbnRLaW5kXS5qb2luKFwiXCIpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ga2luZCA9PT0gXCJsaXN0XCJcbiAgICAgICAgICA/IG5ldyBMaXN0QXR0cmlidXRlVHlwZU1vZGVsKGVsZW1lbnRUeXBlLCBmYWxzZSwgZmFsc2UpXG4gICAgICAgICAgOiBuZXcgU2V0QXR0cmlidXRlVHlwZU1vZGVsKGVsZW1lbnRUeXBlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2luZCA9PT0gXCJtYXBcIikge1xuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLnJlbmRlckF0dHJpYnV0ZVR5cGUoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgdHlwZSBhcyBBdHRyaWJ1dGVUeXBlLFxuICAgICAgICAgIFtraW5kLCBwYXJlbnRLaW5kXS5qb2luKFwiXCIpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IE1hcEF0dHJpYnV0ZVR5cGVNb2RlbCh2YWx1ZVR5cGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2luZCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBjb25zdCBvYmpBdHRyaWJ1dGVzID0gdHlwZSBhcyB7IFtuYW1lOiBzdHJpbmddOiBBdHRyaWJ1dGVUeXBlIH07XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IEF0dHJpYnV0ZSB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKG9iakF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgYXR0cmlidXRlc1tuYW1lXSA9IHsgdHlwZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0cnVjdCA9IHRoaXMuYWRkQW5vbnltb3VzU3RydWN0KFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgcGFyZW50S2luZCA/PyBraW5kLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0F0dHJpYnV0ZU5lc3RlZFR5cGUoYXR0cmlidXRlVHlwZSkpIHtcbiAgICAgIGxldCBzdHJ1Y3QgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgdHlwZU1vZGVsID0gdW5kZWZpbmVkO1xuICAgICAgc3dpdGNoIChhdHRyaWJ1dGVUeXBlLm5lc3RpbmdfbW9kZSkge1xuICAgICAgICBjYXNlIFwibGlzdFwiOlxuICAgICAgICAgIHN0cnVjdCA9IHRoaXMuYWRkQW5vbnltb3VzU3RydWN0KFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVUeXBlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBhdHRyaWJ1dGVUeXBlLm5lc3RpbmdfbW9kZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHR5cGVNb2RlbCA9IG5ldyBMaXN0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic2V0XCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IFNldEF0dHJpYnV0ZVR5cGVNb2RlbChcbiAgICAgICAgICAgIG5ldyBTdHJ1Y3RBdHRyaWJ1dGVUeXBlTW9kZWwoc3RydWN0KSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgIHN0cnVjdCA9IHRoaXMuYWRkQW5vbnltb3VzU3RydWN0KFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVUeXBlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBhdHRyaWJ1dGVUeXBlLm5lc3RpbmdfbW9kZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHR5cGVNb2RlbCA9IG5ldyBNYXBBdHRyaWJ1dGVUeXBlTW9kZWwoXG4gICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInNpbmdsZVwiOlxuICAgICAgICAgIHN0cnVjdCA9IHRoaXMuYWRkQW5vbnltb3VzU3RydWN0KFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVUeXBlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBhdHRyaWJ1dGVUeXBlLm5lc3RpbmdfbW9kZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHR5cGVNb2RlbCA9IG5ldyBTdHJ1Y3RBdHRyaWJ1dGVUeXBlTW9kZWwoc3RydWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBuZXN0ZWRfdHlwZSB3aXRoIG5lc3RpbmdfbW9kZSBcIiR7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlXG4gICAgICAgICAgICB9XCIgbm90IHN1cHBvcnRlZCAoYXR0cmlidXRlIHNjb3BlOiAke3Njb3BlXG4gICAgICAgICAgICAgIC5tYXAoKHMpID0+IHMuZnVsbE5hbWUpXG4gICAgICAgICAgICAgIC5qb2luKFwiLFwiKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlTW9kZWw7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHR5cGUgJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGVUeXBlKX1gKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXJBdHRyaWJ1dGVzRm9yQmxvY2socGFyZW50VHlwZTogU2NvcGUsIGJsb2NrOiBCbG9jaykge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXk8QXR0cmlidXRlTW9kZWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFt0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lLCBhdHRdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgYmxvY2suYXR0cmlidXRlcyB8fCB7fSxcbiAgICApKSB7XG4gICAgICBsZXQgdHlwZTogQXR0cmlidXRlVHlwZU1vZGVsO1xuICAgICAgbGV0IGZvcmNlUGxhaW5HZXR0ZXJUeXBlID0gZmFsc2U7XG4gICAgICBpZiAoc2hvdWxkU2tpcEF0dHJpYnV0ZShwYXJlbnRUeXBlLmZ1bGxOYW1lKHRlcnJhZm9ybUF0dHJpYnV0ZU5hbWUpKSkge1xuICAgICAgICB0eXBlID0gbmV3IFNraXBwZWRBdHRyaWJ1dGVUeXBlTW9kZWwoKTtcbiAgICAgICAgZm9yY2VQbGFpbkdldHRlclR5cGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBbXG4gICAgICAgICAgICBwYXJlbnRUeXBlLFxuICAgICAgICAgICAgbmV3IFNjb3BlKHtcbiAgICAgICAgICAgICAgbmFtZTogdGVycmFmb3JtQXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRUeXBlLFxuICAgICAgICAgICAgICBpc1Byb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6ICEhYXR0LmNvbXB1dGVkLFxuICAgICAgICAgICAgICBpc09wdGlvbmFsOiAhIWF0dC5vcHRpb25hbCxcbiAgICAgICAgICAgICAgaXNSZXF1aXJlZDogISFhdHQucmVxdWlyZWQsXG4gICAgICAgICAgICAgIGlzTmVzdGVkVHlwZTogaXNOZXN0ZWRUeXBlQXR0cmlidXRlKGF0dCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGF0dC50eXBlIHx8IGF0dC5uZXN0ZWRfdHlwZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZSA9IHRvQ2FtZWxDYXNlKHRlcnJhZm9ybUF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICBhdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgIG5ldyBBdHRyaWJ1dGVNb2RlbCh7XG4gICAgICAgICAgdGVycmFmb3JtRnVsbE5hbWU6IHBhcmVudFR5cGUuZnVsbE5hbWUodGVycmFmb3JtQXR0cmlidXRlTmFtZSksXG4gICAgICAgICAgZGVzY3JpcHRpb246IGF0dC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHN0b3JhZ2VOYW1lOiBgXyR7bmFtZX1gLFxuICAgICAgICAgIGNvbXB1dGVkOiAhIWF0dC5jb21wdXRlZCxcbiAgICAgICAgICBvcHRpb25hbDogISFhdHQub3B0aW9uYWwsXG4gICAgICAgICAgdGVycmFmb3JtTmFtZTogdGVycmFmb3JtQXR0cmlidXRlTmFtZSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHByb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgcmVxdWlyZWQ6ICEhYXR0LnJlcXVpcmVkLFxuICAgICAgICAgIGZvcmNlUGxhaW5HZXR0ZXJUeXBlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbYmxvY2tUeXBlTmFtZSwgYmxvY2tUeXBlXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIGJsb2NrLmJsb2NrX3R5cGVzIHx8IHt9LFxuICAgICkpIHtcbiAgICAgIGlmIChzaG91bGRTa2lwQXR0cmlidXRlKHBhcmVudFR5cGUuZnVsbE5hbWUoYmxvY2tUeXBlTmFtZSkpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0b0NhbWVsQ2FzZShibG9ja1R5cGVOYW1lKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gbmV3IFNjb3BlKHtcbiAgICAgICAgICBuYW1lOiBibG9ja1R5cGVOYW1lLFxuICAgICAgICAgIHBhcmVudDogcGFyZW50VHlwZSxcbiAgICAgICAgICBpc1Byb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgIH0pO1xuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1OYW1lOiBibG9ja1R5cGVOYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtRnVsbE5hbWU6IHBhcmVudC5mdWxsTmFtZShibG9ja1R5cGVOYW1lKSxcbiAgICAgICAgICAgIHR5cGU6IG5ldyBTa2lwcGVkQXR0cmlidXRlVHlwZU1vZGVsKCksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7YmxvY2tUeXBlTmFtZX0gYmxvY2tgLFxuICAgICAgICAgICAgc3RvcmFnZU5hbWU6IGBfJHtuYW1lfWAsXG4gICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiBmYWxzZSxcbiAgICAgICAgICAgIHByb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gY3JlYXRlIGEgc3RydWN0IGZvciB0aGlzIGJsb2NrXG4gICAgICBsZXQgYmxvY2tBdHRyaWJ1dGVzID0gdGhpcy5yZW5kZXJBdHRyaWJ1dGVzRm9yQmxvY2soXG4gICAgICAgIG5ldyBTY29wZSh7XG4gICAgICAgICAgbmFtZTogYCR7cGFyZW50VHlwZS5uYW1lfV8ke2Jsb2NrVHlwZU5hbWV9YCxcbiAgICAgICAgICBwYXJlbnQ6IHBhcmVudFR5cGUsXG4gICAgICAgICAgaXNQcm92aWRlcjogcGFyZW50VHlwZS5pc1Byb3ZpZGVyLFxuICAgICAgICAgIGluQmxvY2tUeXBlOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgICAgYmxvY2tUeXBlLmJsb2NrLFxuICAgICAgKTtcblxuICAgICAgYmxvY2tBdHRyaWJ1dGVzID0gZGVkdXBsaWNhdGVBdHRyaWJ1dGVzV2l0aFNhbWVOYW1lKGJsb2NrQXR0cmlidXRlcyk7XG5cbiAgICAgIGNvbnN0IGJsb2NrU3RydWN0ID0gdGhpcy5hZGRTdHJ1Y3QoXG4gICAgICAgIFtcbiAgICAgICAgICBwYXJlbnRUeXBlLFxuICAgICAgICAgIG5ldyBTY29wZSh7XG4gICAgICAgICAgICBuYW1lOiBibG9ja1R5cGVOYW1lLFxuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRUeXBlLFxuICAgICAgICAgICAgaXNQcm92aWRlcjogcGFyZW50VHlwZS5pc1Byb3ZpZGVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgICBibG9ja0F0dHJpYnV0ZXMsXG4gICAgICAgIGJsb2NrVHlwZS5uZXN0aW5nX21vZGUsXG4gICAgICAgIChibG9ja1R5cGUubmVzdGluZ19tb2RlID09PSBcImxpc3RcIiB8fFxuICAgICAgICAgIGJsb2NrVHlwZS5uZXN0aW5nX21vZGUgPT09IFwic2V0XCIpICYmXG4gICAgICAgICAgYmxvY2tUeXBlLm1heF9pdGVtcyA9PT0gMSxcbiAgICAgICk7XG5cbiAgICAgIC8vIGRlZmluZSB0aGUgYXR0cmlidXRlXG4gICAgICBhdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgIGF0dHJpYnV0ZUZvckJsb2NrVHlwZShcbiAgICAgICAgICBibG9ja1R5cGVOYW1lLFxuICAgICAgICAgIGJsb2NrVHlwZSxcbiAgICAgICAgICBibG9ja1N0cnVjdCxcbiAgICAgICAgICBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgcGFyZW50VHlwZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG5cbiAgICBmdW5jdGlvbiBhdHRyaWJ1dGVGb3JCbG9ja1R5cGUoXG4gICAgICB0ZXJyYWZvcm1OYW1lOiBzdHJpbmcsXG4gICAgICBibG9ja1R5cGU6IEJsb2NrVHlwZSxcbiAgICAgIHN0cnVjdDogU3RydWN0LFxuICAgICAgaXNQcm92aWRlcjogYm9vbGVhbixcbiAgICAgIHBhcmVudDogU2NvcGUsXG4gICAgKTogQXR0cmlidXRlTW9kZWwge1xuICAgICAgY29uc3QgbmFtZSA9IHRvQ2FtZWxDYXNlKHRlcnJhZm9ybU5hbWUpO1xuICAgICAgbGV0IG9wdGlvbmFsOiBib29sZWFuO1xuICAgICAgbGV0IHJlcXVpcmVkOiBib29sZWFuO1xuXG4gICAgICBzd2l0Y2ggKGJsb2NrVHlwZS5uZXN0aW5nX21vZGUpIHtcbiAgICAgICAgY2FzZSBcInNpbmdsZVwiOlxuICAgICAgICAgIG9wdGlvbmFsID0gIXN0cnVjdC5hdHRyaWJ1dGVzLnNvbWUoKHgpID0+ICF4Lm9wdGlvbmFsKTtcbiAgICAgICAgICByZXF1aXJlZCA9ICFzdHJ1Y3QuYXR0cmlidXRlcy5zb21lKCh4KSA9PiAheC5yZXF1aXJlZCk7XG5cbiAgICAgICAgICAvLyBUaGlzIGlzIGZvciBidWcgIzM1NzAgYXMgYm90aCBvcHRpb25hbCBhbmQgcmVxdWlyZWQgZXZhbHVhdGUgdG8gZmFsc2UgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzXG4gICAgICAgICAgLy8gKHRoaXMgdGhlbiBjYXVzZXMgdGhlIGNvbXB1dGVkIGJsb2NrIHRvIG5vdCBiZSBwYXJ0IG9mIGFzc2lnbmFibGVBdHRyaWJ1dGVzIGFuZCB0aHVzIHNraXBwZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlKVxuICAgICAgICAgIC8vIEhlbmNlOiBJZiBib3RoIG9wdGlvbmFsIGFuZCByZXF1aXJlZCBhcmUgZmFsc2UsIHNldCBvcHRpb25hbCB0byB0cnVlIElGIGF0IGxlYXN0IG9uZVxuICAgICAgICAgIC8vIGF0dHJpYnV0ZSBpbiB0aGUgYmxvY2sgaGFzIG9wdGlvbmFsID0gdHJ1ZSBvciByZXF1aXJlZCA9IHRydWUsIGFzIHRoaXMgd291bGQgbWVhbiB0aGF0IGF0IGxlYXN0IHNvbWV0aGluZyBjYW4gYmUgc2V0XG4gICAgICAgICAgLy8gYW5kIHRoZSBibG9jayBpcyBub3QgYWxsIGNvbXB1dGVkLlxuICAgICAgICAgIGlmICghb3B0aW9uYWwgJiYgIXJlcXVpcmVkKSB7XG4gICAgICAgICAgICBvcHRpb25hbCA9IHN0cnVjdC5hdHRyaWJ1dGVzLnNvbWUoKHgpID0+IHgub3B0aW9uYWwgfHwgeC5yZXF1aXJlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVNb2RlbCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtTmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybUZ1bGxOYW1lOiBwYXJlbnQuZnVsbE5hbWUodGVycmFmb3JtTmFtZSksXG4gICAgICAgICAgICB0eXBlOiBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7dGVycmFmb3JtTmFtZX0gYmxvY2tgLFxuICAgICAgICAgICAgc3RvcmFnZU5hbWU6IGBfJHtuYW1lfWAsXG4gICAgICAgICAgICBvcHRpb25hbCxcbiAgICAgICAgICAgIGNvbXB1dGVkOiBmYWxzZSxcbiAgICAgICAgICAgIHByb3ZpZGVyOiBpc1Byb3ZpZGVyLFxuICAgICAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlTW9kZWwoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybU5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50LmZ1bGxOYW1lKHRlcnJhZm9ybU5hbWUpLFxuICAgICAgICAgICAgdHlwZTogbmV3IE1hcEF0dHJpYnV0ZVR5cGVNb2RlbChcbiAgICAgICAgICAgICAgbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHt0ZXJyYWZvcm1OYW1lfSBibG9ja2AsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiBmYWxzZSxcbiAgICAgICAgICAgIHByb3ZpZGVyOiBpc1Byb3ZpZGVyLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgICAgICBvcHRpb25hbCA9XG4gICAgICAgICAgICBibG9ja1R5cGUubWluX2l0ZW1zID09PSB1bmRlZmluZWQgPyB0cnVlIDogYmxvY2tUeXBlLm1pbl9pdGVtcyA8IDE7XG4gICAgICAgICAgcmVxdWlyZWQgPVxuICAgICAgICAgICAgYmxvY2tUeXBlLm1pbl9pdGVtcyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBibG9ja1R5cGUubWluX2l0ZW1zID4gMDtcbiAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1OYW1lOiB0ZXJyYWZvcm1OYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtRnVsbE5hbWU6IHBhcmVudC5mdWxsTmFtZSh0ZXJyYWZvcm1OYW1lKSxcbiAgICAgICAgICAgIHR5cGU6XG4gICAgICAgICAgICAgIGJsb2NrVHlwZS5uZXN0aW5nX21vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgPyBuZXcgTGlzdEF0dHJpYnV0ZVR5cGVNb2RlbChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpLFxuICAgICAgICAgICAgICAgICAgICBibG9ja1R5cGUubWF4X2l0ZW1zID09PSAxLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogbmV3IFNldEF0dHJpYnV0ZVR5cGVNb2RlbChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpLFxuICAgICAgICAgICAgICAgICAgICBibG9ja1R5cGUubWF4X2l0ZW1zID09PSAxLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHt0ZXJyYWZvcm1OYW1lfSBibG9ja2AsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIG9wdGlvbmFsLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IGlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgc2NvcGU6IFNjb3BlW10sXG4gICAgYXR0cnM6IHsgW25hbWU6IHN0cmluZ106IEF0dHJpYnV0ZSB9IHwgdW5kZWZpbmVkLFxuICAgIG5lc3RpbmdfbW9kZTogc3RyaW5nLFxuICApIHtcbiAgICBsZXQgYXR0cmlidXRlcyA9IG5ldyBBcnJheTxBdHRyaWJ1dGVNb2RlbD4oKTtcbiAgICBjb25zdCBwYXJlbnQgPSBzY29wZVtzY29wZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoYXR0cnMpIHtcbiAgICAgIGZvciAoY29uc3QgW3RlcnJhZm9ybU5hbWUsIGF0dF0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cnMgfHwge30pKSB7XG4gICAgICAgIC8vIG5lc3RlZCB0eXBlcyBzdXBwb3J0IGNvbXB1dGVkLCBvcHRpb25hbCBhbmQgcmVxdWlyZWQgb24gYXR0cmlidXRlIGxldmVsXG4gICAgICAgIC8vIGlmIHBhcmVudCBpcyBjb21wdXRlZCwgY2hpbGQgYWx3YXlzIGlzIGNvbXB1dGVkIGFzIHdlbGxcbiAgICAgICAgY29uc3QgY29tcHV0ZWQgPVxuICAgICAgICAgICEhcGFyZW50LmlzQ29tcHV0ZWQgfHwgKHBhcmVudC5pc05lc3RlZFR5cGUgJiYgISFhdHQuY29tcHV0ZWQpO1xuICAgICAgICBjb25zdCBvcHRpb25hbCA9IHBhcmVudC5pc05lc3RlZFR5cGVcbiAgICAgICAgICA/ICEhYXR0Lm9wdGlvbmFsXG4gICAgICAgICAgOiAhIXBhcmVudC5pc09wdGlvbmFsO1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IHBhcmVudC5pc05lc3RlZFR5cGVcbiAgICAgICAgICA/ICEhYXR0LnJlcXVpcmVkXG4gICAgICAgICAgOiAhIXBhcmVudC5pc1JlcXVpcmVkO1xuICAgICAgICBjb25zdCBuYW1lID0gdG9DYW1lbENhc2UodGVycmFmb3JtTmFtZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnJlbmRlckF0dHJpYnV0ZVR5cGUoXG4gICAgICAgICAgW1xuICAgICAgICAgICAgLi4uc2NvcGUsXG4gICAgICAgICAgICBuZXcgU2NvcGUoe1xuICAgICAgICAgICAgICBuYW1lOiB0ZXJyYWZvcm1OYW1lLFxuICAgICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICAgIGlzUHJvdmlkZXI6IHBhcmVudC5pc1Byb3ZpZGVyLFxuICAgICAgICAgICAgICBpc0NvbXB1dGVkOiBjb21wdXRlZCxcbiAgICAgICAgICAgICAgaXNPcHRpb25hbDogb3B0aW9uYWwsXG4gICAgICAgICAgICAgIGlzUmVxdWlyZWQ6IHJlcXVpcmVkLFxuICAgICAgICAgICAgICBpc05lc3RlZFR5cGU6IHBhcmVudC5pc05lc3RlZFR5cGUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGF0dC50eXBlIHx8IGF0dC5uZXN0ZWRfdHlwZSxcbiAgICAgICAgKTtcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgIG5ldyBBdHRyaWJ1dGVNb2RlbCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc3RvcmFnZU5hbWU6IGBfJHtuYW1lfWAsXG4gICAgICAgICAgICBjb21wdXRlZDogY29tcHV0ZWQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYXR0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgb3B0aW9uYWw6IG9wdGlvbmFsLFxuICAgICAgICAgICAgdGVycmFmb3JtTmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybUZ1bGxOYW1lOiBwYXJlbnQuZnVsbE5hbWUodGVycmFmb3JtTmFtZSksXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IHBhcmVudC5pc1Byb3ZpZGVyLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dHJpYnV0ZXMgPSBkZWR1cGxpY2F0ZUF0dHJpYnV0ZXNXaXRoU2FtZU5hbWUoYXR0cmlidXRlcyk7XG5cbiAgICByZXR1cm4gdGhpcy5hZGRTdHJ1Y3Qoc2NvcGUsIGF0dHJpYnV0ZXMsIG5lc3RpbmdfbW9kZSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFN0cnVjdChcbiAgICBzY29wZTogU2NvcGVbXSxcbiAgICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNb2RlbFtdLFxuICAgIG5lc3RpbmdfbW9kZTogc3RyaW5nLFxuICAgIGlzU2luZ2xlSXRlbSA9IGZhbHNlLFxuICApIHtcbiAgICBjb25zdCBwb3NzaWJsZU5hbWUgPSB0b1Bhc2NhbENhc2UoXG4gICAgICBzY29wZS5tYXAoKHgpID0+IHRvU25ha2VDYXNlKHgubmFtZSkpLmpvaW4oXCJfXCIpLFxuICAgICk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMudW5pcXVlQ2xhc3NOYW1lKFxuICAgICAgaXNSZXNlcnZlZFN0cnVjdENsYXNzTmFtZShwb3NzaWJsZU5hbWUpXG4gICAgICAgID8gYCR7cG9zc2libGVOYW1lfVN0cnVjdGBcbiAgICAgICAgOiBwb3NzaWJsZU5hbWUsXG4gICAgKTtcblxuICAgIGNvbnN0IHBhcmVudCA9IHNjb3BlW3Njb3BlLmxlbmd0aCAtIDFdO1xuICAgIC8vIGJsb2NrVHlwZS5uZXN0aW5nX21vZGUgPT4gbGlzdC9zZXQgJiBibG9ja1R5cGUubWF4X2l0ZW1zID09PSAxLFxuICAgIGNvbnN0IGlzQ2xhc3MgPSAocGFyZW50LmlzQ29tcHV0ZWQgJiYgIXBhcmVudC5pc09wdGlvbmFsKSB8fCBpc1NpbmdsZUl0ZW07XG4gICAgY29uc3QgaXNBbm9ueW1vdXMgPSB0cnVlO1xuICAgIGNvbnN0IHMgPSBuZXcgU3RydWN0KFxuICAgICAgbmFtZSxcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBpc0NsYXNzLFxuICAgICAgaXNBbm9ueW1vdXMsXG4gICAgICBpc1NpbmdsZUl0ZW0sXG4gICAgICBuZXN0aW5nX21vZGUsXG4gICAgKTtcbiAgICB0aGlzLnN0cnVjdHMucHVzaChzKTtcbiAgICByZXR1cm4gcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VQYXJzZXIge1xuICBwcml2YXRlIHVuaXF1ZUNsYXNzbmFtZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgdW5pcXVlQmFzZU5hbWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlc291cmNlczogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VNb2RlbD4gPSB7fTtcblxuICBwdWJsaWMgcGFyc2UoXG4gICAgZnFwbjogRlFQTixcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWEsXG4gICAgdGVycmFmb3JtVHlwZTogc3RyaW5nLFxuICAgIGNvbnN0cmFpbnQ/OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsXG4gICk6IFJlc291cmNlTW9kZWwge1xuICAgIGlmICh0aGlzLnJlc291cmNlc1t0eXBlXSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzW3R5cGVdO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIodGhpcy51bmlxdWVDbGFzc25hbWVzLCB0aGlzLnVuaXF1ZUJhc2VOYW1lcyk7XG4gICAgY29uc3QgcmVzb3VyY2UgPSBwYXJzZXIucmVzb3VyY2VGcm9tKFxuICAgICAgZnFwbixcbiAgICAgIHR5cGUsXG4gICAgICBzY2hlbWEsXG4gICAgICB0ZXJyYWZvcm1UeXBlLFxuICAgICAgY29uc3RyYWludCxcbiAgICApO1xuICAgIHRoaXMucmVzb3VyY2VzW3R5cGVdID0gcmVzb3VyY2U7XG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgLy8gVXNlZCBieSBjb252ZXJ0IHRvIGRldGVybWluZSB0aGUgcmlnaHQgbmFtZSBmb3IgYSBjbGFzc1xuICBwdWJsaWMgZ2V0Q2xhc3NOYW1lRm9yUmVzb3VyY2UodGVycmFmb3JtVHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlc1t0ZXJyYWZvcm1UeXBlXTtcbiAgICByZXR1cm4gcmVzb3VyY2UgPyByZXNvdXJjZS5jbGFzc05hbWUgOiBcIlwiO1xuICB9XG5cbiAgLy8gVXNlZCBieSBjb252ZXJ0IHRvIGRldGVybWluZSB0aGUgcmlnaHQgbmFtZSBmb3IgYSBuYW1lc3BhY2VcbiAgcHVibGljIGdldE5hbWVzcGFjZU5hbWVGb3JSZXNvdXJjZSh0ZXJyYWZvcm1UeXBlOiBzdHJpbmcpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2UgZXh0ZXJuYWwgcHJvdmlkZXIgc2luY2UgdGhlIG5hbWUgb2YgcmVzb3VyY2UgZG9lc24ndCBoYXZlIGEgcHJlZml4XG4gICAgaWYgKHRlcnJhZm9ybVR5cGUgPT09IFwiZGF0YV9leHRlcm5hbF9cIikge1xuICAgICAgdGVycmFmb3JtVHlwZSA9IFwiZGF0YV9leHRlcm5hbFwiO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZXNbdGVycmFmb3JtVHlwZV07XG4gICAgaWYgKCFyZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IGZvbGRlciA9IGBwcm92aWRlcnMvJHtyZXNvdXJjZS5wcm92aWRlcn1gO1xuICAgIHJldHVybiByZXNvdXJjZS5maWxlUGF0aC5yZXBsYWNlKGAke2ZvbGRlcn0vYCwgXCJcIikucmVwbGFjZShcIi9pbmRleC50c1wiLCBcIlwiKTtcbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cdktn/provider-generator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0-pre.3",
|
|
4
4
|
"description": "Exposes API to generate Terraform CDK provider bindings",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
],
|
|
38
38
|
"license": "MPL-2.0",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@cdktn/commons": "0.
|
|
41
|
-
"@cdktn/provider-schema": "0.
|
|
40
|
+
"@cdktn/commons": "0.24.0-pre.3",
|
|
41
|
+
"@cdktn/provider-schema": "0.24.0-pre.3",
|
|
42
42
|
"codemaker": "1.128.0",
|
|
43
43
|
"fs-extra": "8.1.0",
|
|
44
44
|
"glob": "10.5.0",
|