@huntsman-cancer-institute/cod 17.2.6 → 17.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cod.module.d.ts +13 -13
- package/esm2022/cod.module.mjs +8 -9
- package/esm2022/components/attribute-absolute.component.mjs +56 -18
- package/esm2022/components/attribute-default.component.mjs +2 -5
- package/esm2022/components/attribute-edit.component.mjs +35 -3
- package/esm2022/components/attribute-flex.component.mjs +51 -11
- package/esm2022/services/attribute.service.mjs +24 -1
- package/fesm2022/huntsman-cancer-institute-cod.mjs +558 -426
- package/fesm2022/huntsman-cancer-institute-cod.mjs.map +1 -1
- package/package.json +4 -4
- package/services/attribute.service.d.ts +4 -0
|
@@ -45,6 +45,7 @@ export class AttributeService {
|
|
|
45
45
|
this.updatedAttributeValues = [];
|
|
46
46
|
this.slicedAttributeValues = [];
|
|
47
47
|
this.uniqueId = 0;
|
|
48
|
+
this._editButtonsEnabled = true; //Preserve old default
|
|
48
49
|
if (isDevMode()) {
|
|
49
50
|
console.debug("Created New AttributeService");
|
|
50
51
|
}
|
|
@@ -55,6 +56,16 @@ export class AttributeService {
|
|
|
55
56
|
this.notifyAttributes();
|
|
56
57
|
}
|
|
57
58
|
}
|
|
59
|
+
get editButtonsEnabled() {
|
|
60
|
+
return this._editButtonsEnabled;
|
|
61
|
+
}
|
|
62
|
+
;
|
|
63
|
+
set editButtonsEnabled(enabled) {
|
|
64
|
+
if (enabled !== this._editButtonsEnabled) {
|
|
65
|
+
this._editButtonsEnabled = enabled;
|
|
66
|
+
this.notifyAttributes();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
58
69
|
getAttributeValueCountByAttribute(idAttribute) {
|
|
59
70
|
return this.http.get(this.attributeEndpoint + "attribute-value-count", { params: new HttpParams().set("idAttribute", idAttribute.toString()) });
|
|
60
71
|
}
|
|
@@ -512,6 +523,7 @@ export class AttributeService {
|
|
|
512
523
|
if (!attributeValueSet.attributeValues) {
|
|
513
524
|
attributeValueSet.attributeValues = [];
|
|
514
525
|
}
|
|
526
|
+
this.checkAvsEditable();
|
|
515
527
|
this.attributeValueSetSubject.next(attributeValueSet);
|
|
516
528
|
this.loadingSubject.next(false);
|
|
517
529
|
this.dirty.next(false);
|
|
@@ -521,6 +533,17 @@ export class AttributeService {
|
|
|
521
533
|
this.attributeValueSetSubject.next(undefined);
|
|
522
534
|
});
|
|
523
535
|
}
|
|
536
|
+
checkAvsEditable() {
|
|
537
|
+
let url = this.attributeEndpoint + "attribute-value-set/" + this.idAttributeValueSet + "/can-edit";
|
|
538
|
+
let ac = this.attributeConfigurationSubject.getValue();
|
|
539
|
+
let queryParams = new HttpParams()
|
|
540
|
+
.set("codeAttributeSecurityContext", ac.codeAttributeSecurityContext)
|
|
541
|
+
.set("codeAttributeContext", ac.codeAttributeContext)
|
|
542
|
+
.set("idParentObject", (this.idParentObject) ? this.idParentObject.toString() : "");
|
|
543
|
+
this.http.get(url, { params: queryParams }).subscribe((canEdit) => {
|
|
544
|
+
this.editButtonsEnabled = canEdit;
|
|
545
|
+
});
|
|
546
|
+
}
|
|
524
547
|
getBaseWindowDimension(baseWindowTemplate) {
|
|
525
548
|
this.http.get(this.attributeEndpoint + "base-window-dimension", { params: new HttpParams().set("baseWindowTemplate", baseWindowTemplate) })
|
|
526
549
|
.subscribe((dimension) => {
|
|
@@ -1249,4 +1272,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
|
|
|
1249
1272
|
type: Inject,
|
|
1250
1273
|
args: [ATTRIBUTE_ENDPOINT]
|
|
1251
1274
|
}] }] });
|
|
1252
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL3NlcnZpY2VzL2F0dHJpYnV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBV2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFHckUsTUFBTSxDQUFDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUE4QzNCLFlBQW9CLGlCQUFvQyxFQUNwQyxJQUFnQixFQUNoQixNQUFjLEVBQ2MsaUJBQXlCO1FBSHJELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Msc0JB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QUFFO1lBQ2hGLE9BQU8sTUFBTSxDQUFDLDRCQUE0QixLQUFLLElBQUksQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxpQ0FBaUM7UUFDL0IsT0FBTyxJQUFJLENBQUMsOEJBQThCLENBQUM7SUFDN0MsQ0FBQztJQUVELGFBQWEsQ0FBQyxvQkFBNEIsRUFBRSw0QkFBb0M7UUFDOUUsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDN0QsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEtBQUssb0JBQW9CLElBQUksSUFBSSxDQUFDLDRCQUE0QixLQUFLLDRCQUE0QixDQUFDO1FBQ2xJLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxvQkFBNEIsRUFBRSw0QkFBb0MsRUFBRSxTQUFpQjtRQUNqRyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxvQkFBb0I7bUJBQ3BELElBQUksQ0FBQyw0QkFBNEIsS0FBSyw0QkFBNEI7bUJBQ2xFLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQzs4R0F6OENVLGdCQUFnQixtR0FpRFAsa0JBQWtCO2tIQWpEM0IsZ0JBQWdCOzsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVOzswQkFrREksTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIGlzRGV2TW9kZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwUGFyYW1zfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuXHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmltcG9ydCB7RGljdGlvbmFyeVNlcnZpY2V9IGZyb20gXCJAaHVudHNtYW4tY2FuY2VyLWluc3RpdHV0ZS9kaWN0aW9uYXJ5LXNlcnZpY2VcIjtcclxuXHJcbmltcG9ydCB7QXR0cmlidXRlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNob2ljZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jaG9pY2UuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jb25maWd1cmF0aW9uLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZVZhbHVlU2V0fSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLXZhbHVlLXNldC5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNvbmZpZ3VyYXRpb24uZHRvXCI7XHJcbmltcG9ydCB7R3JhcGhpY2FsQXR0cmlidXRlfSBmcm9tIFwiLi4vbW9kZWwvZ3JhcGhpY2FsLWF0dHJpYnV0ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDb250YWluZXJ9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY29udGFpbmVyLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZVZhbHVlR3JpZFJvd30gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy5lbnRpdHlcIjtcclxuaW1wb3J0IHtQcmVFdmFsRFRPfSBmcm9tIFwiLi4vbW9kZWwvcHJlLWV2YWwuZHRvXCI7XHJcbmltcG9ydCB7RGljdGlvbmFyeUVudHJpZXNEVE99IGZyb20gXCIuLi9tb2RlbC9kaWN0aW9uYXJ5LWVudHJpZXMuZHRvXCI7XHJcblxyXG5cclxuZXhwb3J0IGxldCBBVFRSSUJVVEVfRU5EUE9JTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcImF0dHJpYnV0ZUVuZHBvaW50XCIpO1xyXG5leHBvcnQgY29uc3QgQk9PTEVBTjogc3RyaW5nW10gPSBbXCJOXCIsIFwiWVwiXTtcclxuZXhwb3J0IGNvbnN0IEVYVEVOREVEX0JPT0xFQU46IHN0cmluZ1tdID0gW1wiTlwiLCBcIllcIiwgXCJVXCJdO1xyXG5cclxuLyoqXHJcbiAqIEEgc2VydmljZSBjcmVhdGVkIGZvciBlYWNoIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLiAgVGhpcyBtYWtlcyBjYWxscyB0byB0aGUgYmFja2VuZCB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb25cclxuICogYW5kIHZhbHVlIHNldC4gIEl0IGFsc28gc3RvcmVzIGNvbW1vbiBkYXRhIHRoYXQgZGlmZmVyZW50IGF0dHJpYnV0ZXMgbWlnaHQgbmVlZCAoZS5nLiBhIGxpc3Qgb2YgYXR0cmlidXRlIGNob2ljZXMpLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlU2VydmljZSB7XHJcblxyXG4gIG5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBudW1iZXI7XHJcbiAgaWRGaWx0ZXIxOiBudW1iZXI7XHJcbiAgaWRGaWx0ZXIyOiBudW1iZXI7XHJcbiAgaWRBdHRyaWJ1dGVWYWx1ZVNldDogbnVtYmVyO1xyXG4gIGlkUGFyZW50T2JqZWN0OiBudW1iZXI7XHJcbiAgYm91bmREYXRhOiBhbnk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGZpbHRlcjFMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgZmlsdGVyMkxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBkaWN0aW9uYXJ5TGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG5cclxuXHJcbiAgcG9zdENvbmZpZ3VyYXRpb25TdWJqZWN0OiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uRGltZW5zaW9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4odW5kZWZpbmVkKTtcclxuXHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1tdPih1bmRlZmluZWQpO1xyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0TG9hZGluZ1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPPih1bmRlZmluZWQpO1xyXG5cclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPih1bmRlZmluZWQpO1xyXG4gIGF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0OiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPigpO1xyXG5cclxuICBsb2FkaW5nU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGF0dHJpYnV0ZU1hcDogTWFwPG51bWJlciwgQXR0cmlidXRlPiA9IG5ldyBNYXA8bnVtYmVyLCBBdHRyaWJ1dGU+KCk7XHJcblxyXG4gIHdpZHRoOiBudW1iZXI7XHJcblxyXG4gIGNvbnRhaW5lclVwZGF0ZWQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIGdyaWRSb3dTYXZlZDogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PigpO1xyXG4gIGdyaWRSb3dEZWxldGVkOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+KCk7XHJcbiAgZGlydHk6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10gPSBbXTtcclxuICBzbGljZWRBdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSB1bmlxdWVJZDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWN0aW9uYXJ5U2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChBVFRSSUJVVEVfRU5EUE9JTlQpIHByaXZhdGUgYXR0cmlidXRlRW5kcG9pbnQ6IHN0cmluZykge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJDcmVhdGVkIE5ldyBBdHRyaWJ1dGVTZXJ2aWNlXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Qm91bmREYXRhKGJvdW5kRGF0YTogYW55KSB7XHJcbiAgICB0aGlzLmJvdW5kRGF0YSA9IGJvdW5kRGF0YTtcclxuXHJcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICB0aGlzLm5vdGlmeUF0dHJpYnV0ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEF0dHJpYnV0ZVZhbHVlQ291bnRCeUF0dHJpYnV0ZShpZEF0dHJpYnV0ZTogbnVtYmVyKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4odGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLWNvdW50XCIsIHtwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiaWRBdHRyaWJ1dGVcIiwgaWRBdHRyaWJ1dGUudG9TdHJpbmcoKSl9KTtcclxuICB9XHJcblxyXG4gIGdldEF0dHJpYnV0ZVZhbHVlQ291bnRCeUNvbnRhaW5lcihpZEF0dHJpYnV0ZUNvbnRhaW5lcjogbnVtYmVyKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4odGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLWNvdW50XCIsIHtwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiaWRBdHRyaWJ1dGVDb250YWluZXJcIiwgaWRBdHRyaWJ1dGVDb250YWluZXIudG9TdHJpbmcoKSl9KTtcclxuICB9XHJcblxyXG4gIGdldERpY3Rpb25hcnlWYWx1ZUNvdW50KGlkQXR0cmlidXRlRGljdGlvbmFyeTogbnVtYmVyKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4odGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLWRpY3Rpb25hcnktY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZURpY3Rpb25hcnlcIiwgaWRBdHRyaWJ1dGVEaWN0aW9uYXJ5LnRvU3RyaW5nKCkpfSk7XHJcbiAgfVxyXG5cclxuICBmZXRjaEF0dHJpYnV0ZUNvbnRleHQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkF0dHJpYnV0ZUNvbnRleHRcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5GaWx0ZXIxXCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuRmlsdGVyMlwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkF0dHJpYnV0ZURpY3Rpb25hcnlcIilcclxuICAgIF0pLnN1YnNjcmliZSgocmVzcG9uc2VzOiBhbnlbXSkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5TGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbNF0pO1xyXG4gICAgICB0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1syXSk7XHJcbiAgICAgIHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzNdKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb250ZXh0TGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbMV0pO1xyXG5cclxuICAgICAgcmVzcG9uc2VzWzBdLnNvcnQodGhpcy5zb3J0QXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbMF0pO1xyXG5cclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vR2V0cyB0aGUgZGljdGlvbmFyeSBlbnRyaWVzIGZyb20gdGhlIG1hcCAoc28gd2UgZG9uJ3QgbG9hZCBvdmVyIGFuZCBvdmVyIGFuZCBvdmVyIGZvciB0aGUgc2FtZSBkaWN0aW9uYXJ5KVxyXG4gIGdldERpY3Rpb25hcnlFbnRyaWVzKGF0dHJpYnV0ZTogQXR0cmlidXRlLCB2YWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10sIGdyb3VwQXR0cmlidXRlUm93SWQ/OiBudW1iZXIsIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZT86IEF0dHJpYnV0ZVZhbHVlKTogT2JzZXJ2YWJsZTxEaWN0aW9uYXJ5RW50cmllc0RUTz4ge1xyXG4gICAgbGV0IGJzID0gbmV3IFN1YmplY3Q8RGljdGlvbmFyeUVudHJpZXNEVE8+KCk7XHJcblxyXG4gICAgLy9IYW5kbGUgWFBBVEhcclxuICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS54cGF0aCkge1xyXG4gICAgICBsZXQgZW50cmllc0RUTyA9IG5ldyBEaWN0aW9uYXJ5RW50cmllc0RUTygpO1xyXG4gICAgICBsZXQgeHBhdGggPSBhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS54cGF0aDtcclxuXHJcbiAgICAgIC8vRmlsdGVyZWQgYnkgYW5vdGhlciBkaWN0aW9uYXJ5PyBQYXJzZSB0byBnZXQgYXJyYXkgb2YgYWxsIGRpY3Rpb25hcnkgY2xhc3MgbmFtZXMgbmVlZGVkXHJcbiAgICAgIGxldCBkaWN0Q2xhc3Nlczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgbGV0IHBvcyA9IDA7XHJcbiAgICAgIHdoaWxlICh4cGF0aC5pbmRleE9mKFwiL0RpY3Rpb25hcmllcy9EaWN0aW9uYXJ5XCIsIHBvcykgPj0gMCkge1xyXG4gICAgICAgIGxldCBzdGFydCA9IHhwYXRoLmluZGV4T2YoXCIvRGljdGlvbmFyaWVzL0RpY3Rpb25hcnlcIiwgcG9zKTtcclxuICAgICAgICBzdGFydCA9IHhwYXRoLmluZGV4T2YoXCInXCIsIHN0YXJ0KTtcclxuICAgICAgICBsZXQgZW5kID0geHBhdGguaW5kZXhPZihcIidcIiwgc3RhcnQgKyAxKTtcclxuICAgICAgICBkaWN0Q2xhc3Nlcy5wdXNoKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoLnN1YnN0cmluZyhzdGFydCArIDEsIGVuZCkpXHJcbiAgICAgICAgcG9zID0gZW5kO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL1BvdGVudGlhbGx5IGxvYWQgbXVsdGlwbGUgZGljdGlvbmFyaWVzXHJcbiAgICAgIGxldCBmb3JrQ2FsbHMgPSBbXTtcclxuICAgICAgZm9yIChsZXQgY2xhc3NOYW1lIG9mIGRpY3RDbGFzc2VzKSB7XHJcbiAgICAgICAgZm9ya0NhbGxzLnB1c2godGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllc0FzWE1MKGNsYXNzTmFtZSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL0RlYWwgd2l0aCB0aGUgcmVzdWx0cyB0b2dldGhlclxyXG4gICAgICBmb3JrSm9pbihmb3JrQ2FsbHMpLnN1YnNjcmliZSgocmVzcG9uc2VzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIC8vV2UncmUgb25seSBnb2luZyB0byBkbyB4cGF0aCBvbiB0aGUgeG1sIGZvciB0aGUgZmlyc3QgZGljdGlvbmFyeVxyXG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgICBsZXQgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwb25zZXNbMF0sIFwiYXBwbGljYXRpb24veG1sXCIpO1xyXG5cclxuICAgICAgICAvL0hhdmUgdG8gZXZhbHVhdGUgc3ViLWV4cHJlc3Npb24uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBzdXBwb3J0IGV4cHJlc3Npb25zIGxpa2UgW0B4ID0gKC94cGF0aC1zdWItZXhwcmVzc2lvbildXHJcbiAgICAgICAgbGV0IHNlY29uZGFyeVhtbCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAocmVzcG9uc2VzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgIHNlY29uZGFyeVhtbCA9IHJlc3BvbnNlc1sxXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUHJlLWV2YWx1YXRlIGFuZCBzaW1wbGlmeSBYUEFUSFxyXG4gICAgICAgIGxldCBkdG86UHJlRXZhbERUTyA9IHRoaXMucHJlRXZhbHVhdGVYcGF0aChhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS54cGF0aCwgc2Vjb25kYXJ5WG1sLCBncm91cEF0dHJpYnV0ZVJvd0lkLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpO1xyXG5cclxuICAgICAgICAvL0V2YWx1YXRlIFhQQVRIIGV4cHJlc3Npb25cclxuICAgICAgICBsZXQgZW50cmllcyA9IFtdO1xyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllc0luY2x1ZGVTZWxlY3RlZFZhbHVlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgIGxldCB4UGF0aFJlc3VsdCA9IGRvY3VtZW50LmV2YWx1YXRlKGR0by5leHByZXNzaW9uLCBkb2MsIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9UWVBFLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAvL0l0ZXJhdGUgeHBhdGggcmVzdWx0cyAobm9kZXMpXHJcbiAgICAgICAgICB2YXIgbm9kZSA9IG51bGw7XHJcbiAgICAgICAgICB3aGlsZShub2RlID0geFBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSkge1xyXG5cclxuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRKc29uRW50cnlGcm9tTm9kZShub2RlKTtcclxuICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9Y2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIE5vIG1hdGNoaW5nIGVudHJpZXMgaGVyZS5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vV2hhdCBhYm91dCBkaWN0aW9uYXJ5IGVudHJpZXMgd2hlcmUgaXNBY3RpdmU9J04nLCBidXQgdGhlIGlkIHdhcyB1c2VkIGluIGEgcHJldmlvdXNseSBzYXZlZCB2YWx1ZT9cclxuICAgICAgICAvL1dlIGFkZCB0aGF0IHZhbHVlIHRvIHRoZSBkcm9wZG93biwgaW4gdGhhdCBjYXNlLCBzbyBpdCBjYW4gYmUgc2VsZWN0ZWRcclxuICAgICAgICAvL1JlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSBvbmx5IGdldHMgcGFzc2VkIGluIHdoZW4gdGhlIGZpbHRlciBhdHRyaWJ1dGUgY2hhbmdlcy4gSW4gdGhhdCBzY2VuYXJpbyB3ZSBkbyBub3Qgd2FudCB0byBhZGQgdGhlIG9sZCB2YWx1ZSB0byB0aGUgbGlzdFxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuaXNNdWx0aVZhbHVlICE9PSBcIllcIikge1xyXG4gICAgICAgICAgZm9yIChsZXQgYXYgb2YgdmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGxldCBwcmVzZW50OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoYXYgJiYgISByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgICAgICBmb3IodmFyIGkgPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllc1tpXS52YWx1ZSA9PT0gYXYudmFsdWVJZERpY3Rpb25hcnkpIHtcclxuICAgICAgICAgICAgICAgICAgcHJlc2VudCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAvL0lmIHRoZSBjdXJyZW50bHkgc2F2ZWQgdmFsdWUgaXMgbm90IGluIHRoZSBsaXN0LCBhZGQgaXQuXHJcbiAgICAgICAgICAgICAgaWYgKCEgcHJlc2VudCkge1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IHhwYXRoID0gXCIvRGljdGlvbmFyaWVzL0RpY3Rpb25hcnlbQGNsYXNzTmFtZT0nXCIgKyBhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS5jbGFzc05hbWUgKyBcIiddL0RpY3Rpb25hcnlFbnRyeVtAdmFsdWU9J1wiICsgYXYudmFsdWVJZERpY3Rpb25hcnkgKyBcIiddXCI7XHJcbiAgICAgICAgICAgICAgICAvL1RoZSBlbnRyeSB3YXMgcHJvYmFibHkgYWxyZWFkeSBsb2FkZWQsIGJ1dCBleGNsdWRlZCBieSB0aGUgeHBhdGguIFdlIGNhbiB1c2UgdGhhdC5cclxuICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LmV2YWx1YXRlKHhwYXRoLCBkb2MsIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9VTk9SREVSRURfTk9ERV9UWVBFLCBudWxsKS5zaW5nbGVOb2RlVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2godGhpcy5nZXRKc29uRW50cnlGcm9tTm9kZShub2RlKSk7XHJcbiAgICAgICAgICAgICAgICAgIGVudHJpZXNEVE8uZW50cmllc0luY2x1ZGVTZWxlY3RlZFZhbHVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvL1NldCB0aGUgYmVoYXZpb3Igc3ViamVjdCB3aXRoIHRoZSBmaWx0ZXJlZCB2YWx1ZXMgZm9yIHRoZSBkaWN0aW9uYXJ5XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzID0gZW50cmllcztcclxuICAgICAgICBlbnRyaWVzRFRPLnJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZTtcclxuICAgICAgICBicy5uZXh0KGVudHJpZXNEVE8pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcbiAgICAvL05vbi14cGF0aFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vRGljdGlvbmF5U2VydmljZSBqdXN0IHVzZWQgaHR0cCBnZXQsIHNvIHNob3VsZCBub3QgbmVlZCB0byB1bnN1YnNjcmliZSwgc2luY2UgaHR0cCBkb2VzIHRoYXRcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RHJvcGRvd25FbnRyaWVzKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LmNsYXNzTmFtZSkuc3Vic2NyaWJlKChlbnRyaWVzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIC8vTWFrZSB2YWx1ZSBmaWVsZHNcclxuICAgICAgICBmb3IodmFyIGkgPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICBlbnRyaWVzW2ldLnZhbHVlID0gZW50cmllc1tpXS5pZC50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVudHJpZXNEVE8gPSBuZXcgRGljdGlvbmFyeUVudHJpZXNEVE8oKTtcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXMgPSBlbnRyaWVzO1xyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllc0luY2x1ZGVTZWxlY3RlZFZhbHVlID0gdHJ1ZTsgLy9BIGJpdCBvZiBhbiBhc3N1bXB0aW9uLCBidXQgaWYgaXQgaXNuJ3QgZmlsdGVyZWQsIGl0IGhhZCBiZXR0ZXIgaW5jbHVkZSBhbGwgdGhlIHZhbHVlcyFcclxuICAgICAgICBicy5uZXh0KGVudHJpZXNEVE8pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYnM7XHJcbiAgfVxyXG5cclxuICBnZXRKc29uRW50cnlGcm9tTm9kZShub2RlOiBhbnkpOiBhbnkge1xyXG4gICAgLy9DcmVhdGUgSlNPTiBvYmplY3RzIGZyb20gdGhlIG5vZGVzXHJcbiAgICBsZXQgZW50cnk6IGFueSA9IHt9O1xyXG4gICAgZm9yKHZhciBpID0gbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGVudHJ5W25vZGUuYXR0cmlidXRlc1tpXS5uYW1lXSA9IG5vZGUuYXR0cmlidXRlc1tpXS52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZW50cnk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZUV2YWx1YXRlWHBhdGgoeHBhdGg6IHN0cmluZywgc2Vjb25kYXJ5WG1sOiBzdHJpbmcsIGdyb3VwQXR0cmlidXRlUm93SWQ6IG51bWJlciwgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IFByZUV2YWxEVE8ge1xyXG4gICAgbGV0IGR0bzpQcmVFdmFsRFRPID0gbmV3IFByZUV2YWxEVE8oKTtcclxuXHJcbiAgICAvL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXHJcbiAgICB3aGlsZSAoeHBhdGguaW5kZXhPZihcIi9TZWN1cml0eUFkdmlzb3IvQGNvZGVDYW5jZXJHcm91cFwiKSA+PSAwKSB7XHJcbiAgICAgIHhwYXRoID0geHBhdGgucmVwbGFjZShcIi9TZWN1cml0eUFkdmlzb3IvQGNvZGVDYW5jZXJHcm91cFwiLCBcIidcIiArIHRoaXMuZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QoKS52YWx1ZS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ICsgXCInXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVwbGFjZSBzb21lIG9mIHRoZSBjb250ZXh0IHBhcmFtZXRlcnMgJHt4LnZhbHVlfSAtIFRoaXMgaXMgbW9yZSBBbHRpbyBzcGVjaWZpYyBzdHVmZiB0aGF0IHdhcyB1c2VkIGluIENDUlxyXG4gICAgbGV0IHBhcmFtUG9zID0geHBhdGguc2VhcmNoKFwiXFxcXCR7W0EtWmEtejAtOV9dK1xcXFwudmFsdWV9XCIpO1xyXG4gICAgd2hpbGUgKHBhcmFtUG9zID49IDApIHtcclxuICAgICAgbGV0IHByZWZpeCA9IHhwYXRoLnN1YnN0cmluZygwLCBwYXJhbVBvcyk7XHJcbiAgICAgIGxldCB2YXJOYW1lID0geHBhdGguc3Vic3RyaW5nKHBhcmFtUG9zICsgMiwgeHBhdGguaW5kZXhPZihcIi5cIiwgcGFyYW1Qb3MpKTtcclxuICAgICAgbGV0IHN1ZmZpeCA9IHhwYXRoLnN1YnN0cmluZyh4cGF0aC5pbmRleE9mKFwifVwiLCBwYXJhbVBvcykgKyAxKTtcclxuXHJcbiAgICAgIHZhciBhdjtcclxuXHJcbiAgICAgIC8vSWYgdGhlcmUgSVMgYSByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUsIHdlIGNhbiB1c2UgdGhlIHZhbHVlIGRpcmVjdGx5LiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGZpbmQgaXQgaW4gdGhlIEFWU1xyXG4gICAgICBpZiAoISByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpIHtcclxuXHJcbiAgICAgICAgLy9GaW5kIHRoZSBhdHRyaWJ1dGUsIG1hdGNoaW5nIHRoZSB2YXJOYW1lLlxyXG4gICAgICAgIC8vRG8gdGhpcyBmaXJzdCwgc28gd2UgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSByZWxhdGVkIGF0dHJpYnV0ZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIGlzIGFscmVhZHkgYSB2YWx1ZVxyXG5cclxuICAgICAgICAvL0l0ZXJhdGUgYXR0cmlidXRlcyB0byBmaW5kIG9uZSB0aGF0IG1hdGNoZXMgdGhlIHZhbHVlXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVNYXAuZm9yRWFjaCgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpID0+IHtcclxuICAgICAgICAgIC8vQXR0cmlidXRlcyB0aGF0IG1hdGNoIHRoZSBuYW1lXHJcbiAgICAgICAgICBpZiAoYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWUgPT09IHZhck5hbWUpIHtcclxuICAgICAgICAgICAgZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL0lmIHRoaXMgaXMgYSBncmlkLCBsb29rIGZvciBhdHRyaWJ1dGVzIGluIHRoZSByb3dcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBncmlkQ29sdW1uQXR0cmlidXRlICBvZiBhdHRyaWJ1dGUuYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgIC8vSWYgdGhlIG5hbWUgbWF0Y2hlcyBBTkQgdGhlIHZhbHVlIGluIHRoZSBBVlMgd2FzIHBhcnQgb2YgdGhlIFNBTUUgUk9XIHdlIGFyZSBldmFsdWF0aW5nIFhQQVRIIGZvciwgd2UgY2FuIHVzZSB0aGUgdmFsdWUgZm9yIGV2YWx1YXRpb25cclxuICAgICAgICAgICAgICBpZiAoZ3JpZENvbHVtbkF0dHJpYnV0ZS5hdHRyaWJ1dGVOYW1lID09PSB2YXJOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGdyaWRDb2x1bW5BdHRyaWJ1dGU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgbGV0IGF2cyA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgLy9JZiB3ZSBmb3VuZCB0aGUgYXR0cmlidXRlIGFuZCBoYXZlIHZhbHVlcy4uLlxyXG4gICAgICAgIGlmIChkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSAmJiBhdnMpIHtcclxuXHJcbiAgICAgICAgICAvL0xvb2sgdGhyb3VnaCBhbGwgdGhlIHZhbHVlcyB0byBmaW5kIHRoZSBvbmUgZm9yIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSAoYW5kIFNBTUUgZ3JpZCByb3cgaWYgaW4gYSBncmlkIHJvdylcclxuICAgICAgICAgIGF2ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kKChhdikgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy9JZiB0aGlzIGlzIGFuIEFWIGZvciBhIGdyaWQgcm93LCBpdCBtdXN0IGJlIGZvciB0aGUgc2FtZSBncmlkIHJvdyB3ZSBhcmUgbG9va2luZyBmb3JcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gJ3VuZGVmaW5lZCcgJiYgYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vSWYgd2UgbG9va2VkIHVwIHRoZSBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHZhbHVlIGJ5IGlkIEFORCB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGlzIHRoZSBvbmUgd2UgYXIgbG9va2luZyBmb3IgZnJvbSB0aGUgWFBBVEgsIHdlIGNhbiB1c2UgaXQgZm9yIGV2YWx1YXRpb25cclxuICAgICAgICAgICAgIC8vRm91bmQgYW4gQXR0cmlidXRlVmFsdWUgdGhhdCB0aGUgZGljdGlvbmFyeSBpcyBmaWx0ZXJlZCBieVxyXG4gICAgICAgICAgICBpZiAoZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgPT09IGF2LmlkQXR0cmlidXRlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy9Vc2UgdGhlIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSBpZiBwcm92aWRlZCAodGhpcyBoYXBwZW5zIHdoZW4gYWxyZWFkeSBrbm93biwgZHVyaW5nIGNoYW5nZXMgdG8gdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlKVxyXG4gICAgICBpZiAocmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgeHBhdGggPSBwcmVmaXggKyBcIidcIiArIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZS52YWx1ZSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICB9XHJcbiAgICAgIC8vRm91bmQgdGhlIEF0dHJpYnV0ZVZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHRoYXQgdGhlIGRpY3Rpb25hcnkgaXMgZmlsdGVyZWQgYnlcclxuICAgICAgZWxzZSBpZiAoYXYpIHtcclxuICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJ1wiICsgYXYudmFsdWUgKyBcIidcIiArIHN1ZmZpeDtcclxuICAgICAgfVxyXG4gICAgICAvL0RpZG4ndCBmaW5kIGFuIGF0dHJpYnV0ZSBmb3IgdmFyTmFtZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvL01heWJlIHRoZSB2YXJOYW1lIGlzIGZyb20gZWxzZXdoZXJlIGluIHRoZSBhcHAgKG5vbi1DT0QpLCBhbmQgcHJvdmlkZWQgaW4gYm91bmREYXRhXHJcbiAgICAgICAgaWYgKHRoaXMuYm91bmREYXRhICYmIHRoaXMuYm91bmREYXRhW3Zhck5hbWVdKSB7XHJcbiAgICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJ1wiICsgdGhpcy5ib3VuZERhdGFbdmFyTmFtZV0gKyBcIidcIiArIHN1ZmZpeDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9Ob3RoaW5nIG1hdGNoZXMuIENoYW5nZSB0byBlbXB0eSBzdHJpbmcuIFdpbGwgcHJvYmFibHkgcmVzdWx0IGluIE5PIGVudHJpZXMsIHdoaWNoIHdvdWxkIGJlIGNvcnJlY3QuXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJydcIiArIHN1ZmZpeDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHBhcmFtUG9zID0geHBhdGguc2VhcmNoKFwiXFxcXCR7W0EtWmEtejAtOV9dK1xcXFwudmFsdWV9XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSGF2ZSB0byBldmFsdWF0ZSBzdWItZXhwcmVzc2lvbi4gVGhpcyBoYW5kbGVzIGV4cHJlc3Npb25zIGxpa2UgW0B4ID0gKC94cGF0aC1zdWItZXhwcmVzc2lvbildXHJcbiAgICBsZXQgaW5FeHByZXNzaW9uUG9zID0geHBhdGguc2VhcmNoKFwiXFxcXFtAW0EtWmEtejAtOV9dK1xcXFxzKj1cXFxccypcXFxcKFwiKTtcclxuXHJcbiAgICBpZiAoaW5FeHByZXNzaW9uUG9zID4gMCAmJiBzZWNvbmRhcnlYbWwpIHtcclxuICAgICAgbGV0IHByZWZpeCA9IHhwYXRoLnN1YnN0cmluZygwLCBpbkV4cHJlc3Npb25Qb3MgKyAxKTtcclxuICAgICAgbGV0IGV4cHJlc3Npb25FbmQgPSB4cGF0aC5pbmRleE9mKFwiKVwiLCBpbkV4cHJlc3Npb25Qb3MpO1xyXG4gICAgICBsZXQgdmFyaWFibGUgPSB4cGF0aC5zdWJzdHJpbmcoaW5FeHByZXNzaW9uUG9zICsgMSwgeHBhdGguaW5kZXhPZihcIj1cIiwgaW5FeHByZXNzaW9uUG9zKSk7XHJcbiAgICAgIGxldCBzdWJFeHByZXNzaW9uID0geHBhdGguc3Vic3RyaW5nKHhwYXRoLmluZGV4T2YoXCIoXCIsIGluRXhwcmVzc2lvblBvcykgKyAxLCBleHByZXNzaW9uRW5kKTtcclxuICAgICAgbGV0IHN1ZmZpeCA9IHhwYXRoLnN1YnN0cmluZyhleHByZXNzaW9uRW5kICsgMSk7XHJcblxyXG4gICAgICB4cGF0aCA9IHByZWZpeDtcclxuXHJcbiAgICAgIC8vRXZhbHVhdGUgWFBBVEggZXhwcmVzc2lvblxyXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgIGxldCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHNlY29uZGFyeVhtbCwgXCJhcHBsaWNhdGlvbi94bWxcIik7XHJcbiAgICAgIGxldCB4UGF0aFJlc3VsdCA9IGRvY3VtZW50LmV2YWx1YXRlKHN1YkV4cHJlc3Npb24sIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xyXG5cclxuICAgICAgLy9JdGVyYXRlIHhwYXRoIHJlc3VsdHMgKG5vZGVzKVxyXG4gICAgICB2YXIgbm9kZSA9IHhQYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XHJcblxyXG4gICAgICB3aGlsZShub2RlKSB7XHJcbiAgICAgICAgeHBhdGggPSB4cGF0aCArIHZhcmlhYmxlICsgXCI9J1wiICsgbm9kZS5ub2RlVmFsdWUgKyBcIidcIlxyXG5cclxuICAgICAgICBub2RlID0geFBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKTtcclxuXHJcbiAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgIHhwYXRoID0geHBhdGggKyBcIiBvciBcIjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHhwYXRoID0geHBhdGggKyBzdWZmaXg7XHJcbiAgICB9XHJcblxyXG4gICAgZHRvLmV4cHJlc3Npb24gPSB4cGF0aDtcclxuICAgIHJldHVybiBkdG87XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnRBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0KGE6IGFueSwgYjogYW55KSB7XHJcbiAgICByZXR1cm4gYS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpKTtcclxuICB9XHJcblxyXG4gIGZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3QoY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dD86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJmZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0OiBcIiArIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zXCI7XHJcbiAgICBsZXQgcGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlQ29uZmlndXJhdGlvbltdPih1cmwsIHtwYXJhbXM6IHBhcmFtc30pLnN1YnNjcmliZSgoY29uZmlndXJhdGlvbkxpc3Q6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25bXSkgPT4ge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0TG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcblxyXG4gICAgICBsZXQgZHRvczogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGNmZyBvZiBjb25maWd1cmF0aW9uTGlzdCkge1xyXG4gICAgICAgIGxldCBkdG86IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8gPSB0aGlzLmdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oY2ZnKTtcclxuICAgICAgICBpZiAoZHRvKSB7XHJcbiAgICAgICAgICBkdG9zLnB1c2goZHRvKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGR0b3Muc29ydCh0aGlzLnNvcnRBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdCk7XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0U3ViamVjdC5uZXh0KGR0b3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnRBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdChhOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPLCBiOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKSB7XHJcbiAgICBjb25zdCBkaXNwbGF5YSA9IGEuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXlcclxuICAgICAgKyBhLmV4dGVuc2lvbkRlc2NyaXB0aW9uXHJcbiAgICAgICsgKGEuZmlsdGVyMURpc3BsYXkgfHwgXCJcIilcclxuICAgICAgKyAoYS5maWx0ZXIyRGlzcGxheSB8fCBcIlwiKTtcclxuXHJcbiAgICBjb25zdCBkaXNwbGF5YiA9IGIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXlcclxuICAgICAgKyBiLmV4dGVuc2lvbkRlc2NyaXB0aW9uXHJcbiAgICAgICsgKGIuZmlsdGVyMURpc3BsYXkgfHwgXCJcIilcclxuICAgICAgKyAoYi5maWx0ZXIyRGlzcGxheSB8fCBcIlwiKTtcclxuXHJcbiAgICByZXR1cm4gZGlzcGxheWEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGRpc3BsYXliLnRvTG93ZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgLy9Vc2VkIGJ5IGNvZC1lZGl0b3JcclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5pZEZpbHRlcjEgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmlkRmlsdGVyMiA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlQXR0cmlidXRlQ29uZmlndXJhdGlvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9uc1wiLCBhdHRyaWJ1dGVDb25maWd1cmF0aW9uKS5zdWJzY3JpYmUoKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuXHJcbiAgICAgIHRoaXMucG9zdENvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcIi9lZGl0b3IvYXR0cmlidXRlLWNvbmZpZ3VyYXRpb24vXCIgKyBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUlkKGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogbnVtYmVyLCBpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXIsIGlkUGFyZW50T2JqZWN0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gIT09IC0xKSB7XHJcbiAgICAgIHRoaXMubmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgbG9hZCBpZiB0aGUgQXR0cmlidXRlQ29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZFxyXG4gICAgaWYgKHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uICE9PSBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgLy9DbGVhciBBU0FQXHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgPSBpZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG4gICAgICB0aGlzLmlkRmlsdGVyMSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5pZEZpbHRlcjIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlTWFwLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuXHJcbiAgICAgIHRoaXMuZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGlkQXR0cmlidXRlVmFsdWVTZXQsIGlkUGFyZW50T2JqZWN0KTtcclxuICAgIH1cclxuICAgIC8vT3IgbG9hZCB0aGUgQXR0cmlidXRlVmFsdWVTZXQgaWYgdGhhdCBjaGFuZ2VkIChwb3NzaWJsZSB0byBzd2l0Y2ggZnJvbSBvbmUgZXZlbnQgdG8gYW5vdGhlciBvZiB0aGUgc2FtZSB0eXBlLCBmb3IgZXhhbXBsZVxyXG4gICAgLy9UaGUgQXR0cmlidXRlQ29uZmlndXJhdGlvbiBtdXN0IGFsc28gaGF2ZSBmaW5pc2hlZCBsb2FkaW5nIGFuZCBub3QgYWxyZWFkeSB3b3JraW5nIG9uIGxvYWRpbmcgdGhlIHZhbHVlc1xyXG4gICAgZWxzZSBpZiAodGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ICE9PSBpZEF0dHJpYnV0ZVZhbHVlU2V0ICYmIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQsIGlkUGFyZW50T2JqZWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gaWRlbnRpZmllcnMgdG8gYmUgdXNlZCBieSB0aGlzIHNlcnZpY2UuICBUaGlzIHByb21wdHMgYSBuZXcgY29uZmlndXJhdGlvblxyXG4gICAqIHJlcXVlc3QgdG8gYmUgbWFkZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEZpbHRlcjFcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRGaWx0ZXIyXHJcbiAgICovXHJcbi8qIFRoaXMgaXMgY29tbWVudGVkIG91dCBmb3Igbm93IGJlY2F1c2UgaXQgaXMgYm90aCB1bmltcGxlbWVudGVkIGFuZCBpbmNvbXBsZXRlIChsb2FkaW5nIGEgY29uZmlndXJhdGlvblxyXG4gKiBmaWx0ZXIgd291bGQgcmVhbGx5IGFsc28gcmVxdWlyZSB0aGUgYXR0cmlidXRlIGNvbnRleHQgYW5kIGF0dHJpYnV0ZXNlY3VyaXR5IGNvbnRleHQgcGx1cyBhIHNlcnZpY2Ugb25cclxuICogdGhlIGJhY2sgZW5kIHRoYXQgYWN0dWFsbHkgZG9lcyB0aGlzIHdvcmsuIEZvciBub3csIG9ubHkgbG9hZGluZyBieSBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cclxuICpcclxuICBzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uQnlGaWx0ZXIoaWRGaWx0ZXIxOiBudW1iZXIsIGlkRmlsdGVyMj86IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uQnlGaWx0ZXI6IFwiICsgaWRGaWx0ZXIxICsgXCIgXCIgKyBpZEZpbHRlcjIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIC8vdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmlkRmlsdGVyMSA9IGlkRmlsdGVyMTtcclxuICAgIHRoaXMuaWRGaWx0ZXIyID0gaWRGaWx0ZXIyO1xyXG5cclxuICAgIHRoaXMuZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uKCk7XHJcbiAgfVxyXG4qL1xyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBpZCBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHNldC4gIFRoaXMgd2lsbCBwcm9tcHQgYSByZXF1ZXN0IHRvIHB1bGwgdGhpcyBmcm9tIHRoZSBiYWNrZW5kLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlVmFsdWVTZXRcclxuICAgKi9cclxuICBzZXRBdHRyaWJ1dGVWYWx1ZVNldChpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXIsIGlkUGFyZW50T2JqZWN0OiBudW1iZXIpIHtcclxuICAgIC8vT25seSBsb2FkIHRoZSBBdHRyaWJ1dGVWYWx1ZVNldCBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkXHJcbiAgICBpZiAodGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ICE9PSBpZEF0dHJpYnV0ZVZhbHVlU2V0KSB7XHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IGlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcblxyXG4gICAgICB0aGlzLmZldGNoQXR0cmlidXRlVmFsdWVTZXQoaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlcXVlc3QgdG8gZG93bmxvYWQgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uLlxyXG4gICAqL1xyXG4gIGZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbihpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXIsIGlkUGFyZW50T2JqZWN0OiBudW1iZXIpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9PT0gLTEpIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCg8QXR0cmlidXRlQ29uZmlndXJhdGlvbj57XHJcbiAgICAgICAgaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiAtMlxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmc7XHJcbiAgICBpZiAodGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gJiYgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPiAtMSkge1xyXG4gICAgICB1cmwgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9ucy9cIiArIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9UaGlzIGlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZFxyXG5cdCAgLy91cmwgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9ucy9maWx0ZXIvXCIgKyB0aGlzLmlkRmlsdGVyMTtcclxuICAgICAgLy9pZiAodGhpcy5pZEZpbHRlcjIpIHtcclxuICAgICAgICAvL3VybCArPSBcIi9cIiArIHRoaXMuaWRGaWx0ZXIyO1xyXG4gICAgICAvL31cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHVybCkuc3Vic2NyaWJlKChhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuXHJcbiAgICAgIC8vTm93IGxvYWQgdGhlIGF0dHJpYnV0ZVZhbHVlU2V0IC0gVGhpcyB3aWxsIGFsd2F5cyBoYXBwZW4gd2hlbiBhIG5ldyBjb25maWd1cmF0aW9uIGlzIGxvYWRlZFxyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB1bmRlZmluZWQ7IC8vRm9yY2UgaXQgdG8gY2hhbmdlIGluIHRoaXMgc2NlbmFyaW9cclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVWYWx1ZVNldChpZEF0dHJpYnV0ZVZhbHVlU2V0LCBpZFBhcmVudE9iamVjdCk7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24odW5kZWZpbmVkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZU1hcC5jbGVhcigpO1xyXG5cclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQXR0cmlidXRlU2VydmljZS5zZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uXCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmJhc2VXaW5kb3dUZW1wbGF0ZSkge1xyXG4gICAgICAgIHRoaXMuZ2V0QmFzZVdpbmRvd0RpbWVuc2lvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmJhc2VXaW5kb3dUZW1wbGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmF0dHJpYnV0ZUNvbnRhaW5lcnMpIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmF0dHJpYnV0ZUNvbnRhaW5lcnMuc29ydCgoYTogQXR0cmlidXRlQ29udGFpbmVyLCBiOiBBdHRyaWJ1dGVDb250YWluZXIpID0+IHtcclxuICAgICAgICAgIGlmIChhLnNvcnRPcmRlciA8IGIuc29ydE9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS5zb3J0T3JkZXIgPiBiLnNvcnRPcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGVDb250YWluZXIgb2YgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRmlyc3Qgc29ydCBhdHRyaWJ1dGVzIHVzaW5nIHRoZSB5IGFuZCB4IHBvc2l0aW9uaW5nLiAgSWYgdXNpbmcgYWJzb2x1dGUgcG9zaXRpb24sIHRoZSBvcmRlciBkb2Vzbid0IG1hdHRlcixcclxuICAgICAgICAgKiBidXQgaWYgd2Ugd2FudCB0aGUgYWJzb2x1dGUgcG9zaXRpb25pbmcgdG8gZ3VpZGUgYXV0byBsYXlvdXQsIHRoZW4gdXNlIHRoaXMgb3JkZXIuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYXR0cmlidXRlQ29udGFpbmVyLmdyYXBoaWNhbEF0dHJpYnV0ZXMuc29ydCgoYTogR3JhcGhpY2FsQXR0cmlidXRlLCBiOiBHcmFwaGljYWxBdHRyaWJ1dGUpID0+IHtcclxuICAgICAgICAgIGlmIChhLnRhYk9yZGVyIDwgYi50YWJPcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGEudGFiT3JkZXIgPiBiLnRhYk9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVDb250YWluZXIuZ3JhcGhpY2FsQXR0cmlidXRlcykge1xyXG4gICAgICAgICAgdGhpcy5hdHRyaWJ1dGVNYXAuc2V0KGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSwgYXR0cmlidXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodGhpcy5nZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pKTtcclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSByZXF1ZXN0IHRvIHB1bGwgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzZXQuXHJcbiAgICogUmVxdWlyZWQgdGhlIEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gdG8gYmUgcHJlLWxvYWRlZFxyXG4gICAqL1xyXG4gIGZldGNoQXR0cmlidXRlVmFsdWVTZXQoaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5pZFBhcmVudE9iamVjdCA9IGlkUGFyZW50T2JqZWN0O1xyXG5cclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1zZXQvXCIgKyB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKGlkUGFyZW50T2JqZWN0KT9pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuICAgIC8vQ2xlYXIgQVNBUFxyXG4gICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlVmFsdWVTZXQ+KHVybCwge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlU2V0OiBBdHRyaWJ1dGVWYWx1ZVNldCkgPT4ge1xyXG4gICAgICAvL0luaXRpYWxpemUgYXR0cmlidXRlVmFsdWVzIGlmIGl0IGRvZXMgbm90IGV4aXN0XHJcbiAgICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlU2V0LmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlU2V0LmF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmFzZVdpbmRvd0RpbWVuc2lvbihiYXNlV2luZG93VGVtcGxhdGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5odHRwLmdldCh0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJiYXNlLXdpbmRvdy1kaW1lbnNpb25cIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJiYXNlV2luZG93VGVtcGxhdGVcIiwgYmFzZVdpbmRvd1RlbXBsYXRlKX0pXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRpbWVuc2lvbjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRGltZW5zaW9uU3ViamVjdC5uZXh0KGRpbWVuc2lvbik7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3VycmVudGx5IGEgc2ltcGxlIG5vdGlmaWVyIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gb3IgYXR0cmlidXRlIHZhbHVlIHNldCBoYXMgY2hhbmdlZCBhbmQgY29tcG9uZW50cyBtYXkgbmVlZCB0byBiZSByZWZyZXNoZWQuXHJcbiAgICpcclxuICAgKi9cclxuICBub3RpZnlBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb250YWluZXJVcGRhdGVkLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQb3N0IHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBhZnRlciBlZGl0aW5nLiAgUG9zdCB0aGUgZW50aXJlIHRoaW5nIGFzIGl0IGNhc2NhZGVzIGRvd24uICBUaGUgZWRpdG9yIGFsbG93cyB5b3VcclxuICAgKiB0byBtb2RpZnkgZXZlcnkgY29udGFpbmVyIGFuZCBvbmx5IHRoZW4gc2F2ZSB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb259IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBwb3N0QXR0cmlidXRlQ29uZmlndXJhdGlvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9ucy9cIiArIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICB0aGlzLnNldE5lZ2F0aXZlSWRzVG9VbmRlZmluZWQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCBhdHRyaWJ1dGVDb25maWd1cmF0aW9uKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy8gUHJldmVudCBlcnJvciBpbiBzdWJzZXF1ZW50IHNhdmVzLiBTZWUgTWV0YWJ1aWxkZXIgLyBNQi0yM1xyXG4gICAgICB0aGlzLmh0dHAuZ2V0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHVybCkuc3Vic2NyaWJlKChhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wb3N0Q29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzZXQuICBXaGVuIGVkaXRpbmcsIGF0dHJpYnV0ZXMgYWxyZWFkeSBwb3N0IHRoZWlyIHVwZGF0ZWQgdmFsdWVzIHRvIHRoaXMgc2VydmljZXMgdW5kZXJcclxuICAgKiBhIHNlcGFyYXRlIGFycmF5LiAgV2hhdCB3ZSBkbyBpcyBtZXJnZSBpbiB0aGVzZSB1cGRhdGVkIG9yIGNyZWF0ZWQgdmFsdWVzIHdpdGggdGhlIGN1cnJlbnQgYXR0cmlidXRlIHZhbHVlIHNldCAoYXZzKS5cclxuICAgKiBXaGlsZSBkb2luZyB0aGlzLCBzZXQgdGhlIGlkIG9mIHRoZSBhdnMgYW5kIG51bGxpZnkgYW55IG5lZ2F0aXZlIGlkcy5cclxuICAgKi9cclxuICB1cGRhdGVBdHRyaWJ1dGVWYWx1ZVNldCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtc2V0L1wiIDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAodGhpcy5pZFBhcmVudE9iamVjdCk/dGhpcy5pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuICAgIGxldCBhdnM6IEF0dHJpYnV0ZVZhbHVlU2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKSk7XHJcbiAgICBmb3IgKGxldCBpID0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPCAwKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXZzLmF0dHJpYnV0ZVZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXNbal0gPSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV07XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnNwbGljZShpLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXZzLmF0dHJpYnV0ZVZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGosIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhdnMuYXR0cmlidXRlVmFsdWVzID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5jb25jYXQodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzKTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHJlc3VsdFN1YmplY3Q6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+KCk7XHJcblxyXG4gICAgdGhpcy5odHRwLnB1dCh1cmwsIGF2cywge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlU2V0OiBBdHRyaWJ1dGVWYWx1ZVNldCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL0luaXRpYWxpemUgYXR0cmlidXRlVmFsdWVzIGlmIGl0IGRvZXMgbm90IGV4aXN0XHJcbiAgICAgICAgaWYgKCEgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgICAvL1NlbmQgdGhlIHJlc3VsdHMgdG8gdGhlIG9ic2VydmVyIChpZiBhbnkpLCB0aGVuIGNvbXBsZXRlXHJcbiAgICAgICAgcmVzdWx0U3ViamVjdC5uZXh0KGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgICByZXN1bHRTdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgICAgcmVzdWx0U3ViamVjdC5lcnJvcihlcnJvcik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj59XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlydHlTdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXJ0eTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0O1xyXG4gICAqXHJcbiAgICogQHJldHVybnMge0JlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD59XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVTZXQoKTogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdDtcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPn1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3QoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGJhc2VkIHVwb24gdGhlIGlkQXR0cmlidXRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlc1xyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGVWYWx1ZVtdfVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZVZhbHVlcyhpZEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiBBdHRyaWJ1dGVWYWx1ZVtdIHtcclxuXHJcbiAgICBsZXQgYXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdID0gW107XHJcblxyXG4gICAgaWYodGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG5cclxuICAgICAgLy9HbyB0aHJvdWdoIGFsbCB0aGUgdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVzIGZpcnN0IChzbyB3ZSBwcmVzZXJ2ZSBhY3Jvc3MgY2hhbmdpbmcgdGFicywgZXRjKVxyXG4gICAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlICYmICghZ3JvdXBBdHRyaWJ1dGVSb3dJZCB8fCBncm91cEF0dHJpYnV0ZVJvd0lkID09PSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUgJiYgKCFncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGdyb3VwQXR0cmlidXRlUm93SWQgPT09IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5ncm91cEF0dHJpYnV0ZVJvd0lkKSkge1xyXG4gICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL0dvIHRocm91Z2ggYWxsIHRoZSByZWd1bGFyIGF0dHJpYnV0ZXNcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlVmFsdWUgb2YgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXMpIHtcclxuICAgICAgICAvL1JlZ3VsYXIgYXR0cmlidXRlcyAobm9ybWFsIGFuZCBncm91cCwgd2hpY2ggZ2V0IG11bHRpcGxlKVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUgfHwgYXR0cmlidXRlVmFsdWUuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIC8vSWYgcm93IGlkIHNwZWNpZmllZCwgb25seSBjYXJlIGFib3V0IHZhbHVlcyBmb3IgdGhhdCByb3dcclxuICAgICAgICAgIGlmICh0eXBlb2YgZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gJ3VuZGVmaW5lZCcgfHwgYXR0cmlidXRlVmFsdWUuZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkge1xyXG5cclxuICAgICAgICAgICAgLy9JZiBub3QgYWxyZWFkeSBhZGRlZC4uLlxyXG4gICAgICAgICAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZXMuZmluZCgoZXhpc3RpbmcpID0+IGV4aXN0aW5nLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpKSB7XHJcblxyXG4gICAgICAgICAgICAgIC8vRG9uJ3Qgd2FudCB0aGUgb3JpZ2luYWwgaWYgaXQgd2FzIHJlbW92ZWQgKHNsaWNlZClcclxuICAgICAgICAgICAgICBpZiAoISB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maW5kKChzYXYpID0+IHNhdi5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZVZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgYXR0cmlidXRlVmFsdWUpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBjaGlsZCBhdHRyaWJ1dGVzIG9mIHRoZSBpZEF0dHJpYnV0ZS4gIE1vc3QgbGlrZWx5IGZvciBhdHRyaWJ1dGVzIHRoYXQgZGVmaW5lIGNvbHVtbnMgb2YgYSBncmlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZVtdfVxyXG4gICAqL1xyXG4gIGdldEdyb3VwQXR0cmlidXRlcyhpZEF0dHJpYnV0ZTogbnVtYmVyKTogQXR0cmlidXRlW10ge1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZVtdID0gW107XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVNYXAuZm9yRWFjaCgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpID0+IHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gYXR0cmlidXRlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgd2lkdGggd2hpY2ggaXMgYSByZXF1aXJlbWVudCBvZiB0aGUgYWJzb2x1dGUgcG9zaXRpb25pbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcclxuICAgKi9cclxuICBzZXRXaWR0aCh3aWR0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHdpZHRoLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge251bWJlcn1cclxuICAgKi9cclxuICBnZXRXaWR0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMud2lkdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGFycmF5IG9mIGF0dHJpYnV0ZSBjaG9pY2VzIGZvciB0aGUgaWRBdHRyaWJ1dGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVcclxuICAgKiBAcmV0dXJucyB7QXR0cmlidXRlQ2hvaWNlW119XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlQ2hvaWNlcyhpZEF0dHJpYnV0ZTogbnVtYmVyKTogQXR0cmlidXRlQ2hvaWNlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwLmdldChpZEF0dHJpYnV0ZSkuYXR0cmlidXRlQ2hvaWNlcztcclxuICB9XHJcblxyXG4gIGdldExvYWRpbmdTdWJqZWN0KCk6IFN1YmplY3Q8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGNvbnRhaW5lclVwZGF0ZWQgc3ViamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtTdWJqZWN0PG51bWJlcj59XHJcbiAgICovXHJcbiAgZ2V0Q29udGFpbmVyVXBkYXRlZCgpOiBTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lclVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRHcmlkUm93U2F2ZWRTdWJqZWN0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkUm93U2F2ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRHcmlkUm93RGVsZXRlZFN1YmplY3QoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRSb3dEZWxldGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIHVwZGF0ZWQgYW5kIGRlbGV0ZWQgYXR0cmlidXRlIHZhbHVlIGFycmF5cy5cclxuICAgKlxyXG4gICAqL1xyXG4gIGNsZWFyVXBkYXRlZEF0dHJpYnV0ZVZhbHVlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcbiAgICB0aGlzLm5vdGlmeUF0dHJpYnV0ZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSB1cGRhdGVkIGFuZCBkZWxldGVkIGdyaWQgcm93IGF0dHJpYnV0ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZ3JpZCByb3dcclxuICAgKlxyXG4gICAqL1xyXG4gIGNsZWFyVXBkYXRlZEdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcmVtYWluaW5nQXR0cmlidXRlcyA9IFtdO1xyXG5cclxuICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcbiAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG5cclxuICAgIC8vU2hvdWxkbid0IGJlIGEgbmVlZCB0byBjaGFuZ2UgZGlydHkgb3Igbm90aWZ5IGF0dHJpYnV0ZXNcclxuICB9XHJcblxyXG4gIHNhdmVHcmlkUm93QXR0cmlidXRlVmFsdWVzKGlkR3JvdXBBdHRyaWJ1dGU6IG51bWJlciwgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcm93VmFsdWVzID0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQgJiYgYXYuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRHcm91cEF0dHJpYnV0ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3dWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgLy9zZXQgdGhlIGlkQXR0cmlidXRlVmFsdWVTZXQgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIGlmICghIHJvd1ZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlU2V0KSB7XHJcbiAgICAgICAgcm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vcmVtb3ZlIGFsbCBuZWdhdGl2ZSBpZHMgKG5ldyB2YWx1ZXMpXHJcbiAgICAgIGlmIChyb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA8IDApIHtcclxuICAgICAgICByb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRm9yIG11bHRpIHZhbHVlcyB0aGF0IHdlcmUgc2xpY2VkIChkZS1zZWxlY3RlZCkgd2UncmUgZ29pbmcgdG8gZmluZCB0aGVtIGFuZCBudWxsIG91dCB0aGUgdmFsdWUsIGluc3RlYWQgb2YgcmVtb3ZpbmcuXHJcbiAgICAvL1RoYXQgbWVhbnMgdGhleSBhY3RhdWxseSBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSByb3dWYWx1ZXNcclxuICAgIC8vUmVtb3ZlZCBtdWx0aSB2YWx1ZXMgd2l0aGluIGFuIGV4aXN0aW5nIHJvd1xyXG4gICAgbGV0IHJlbW92ZWRWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlbW92ZWRWYWx1ZXNbaV0udmFsdWVBdHRyaWJ1dGVDaG9pY2UgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHJlbW92ZWRWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHJvd1ZhbHVlcy5wdXNoKHJlbW92ZWRWYWx1ZXNbaV0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBhdmdyOkF0dHJpYnV0ZVZhbHVlR3JpZFJvdyA9IDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+e1xyXG4gICAgICAgIGlkQXR0cmlidXRlVmFsdWVTZXQ6IHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCxcclxuICAgICAgICBpZEdyb3VwQXR0cmlidXRlOiBpZEdyb3VwQXR0cmlidXRlLFxyXG4gICAgICAgIGdyb3VwQXR0cmlidXRlUm93SWQ6IGdyb3VwQXR0cmlidXRlUm93SWQsXHJcbiAgICAgICAgYXR0cmlidXRlVmFsdWVzOiByb3dWYWx1ZXNcclxuICAgICAgfTtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtZ3JpZC1yb3cvXCIgO1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBsZXQgcXVlcnlQYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVDb250ZXh0KVxyXG4gICAgLnNldChcImlkUGFyZW50T2JqZWN0XCIsICh0aGlzLmlkUGFyZW50T2JqZWN0KT90aGlzLmlkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICAvL1NhdmUgbmV3IHJvd1xyXG4gICAgaWYgKGdyb3VwQXR0cmlidXRlUm93SWQgPCAwKSB7XHJcbiAgICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgYXZnciwge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdzogQXR0cmlidXRlVmFsdWVHcmlkUm93KSA9PiB7XHJcblxyXG4gICAgICAgIC8vQWRkIHRoZSBncmlkIHJvdyB0byB0aGUgb3JpZ2luYWwgYXR0cmlidXRlIHZhbHVlc1xyXG4gICAgICAgIGxldCBhdnM6QXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMucHVzaChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIHRoZSB1cGRhdGVkIGFuZCBzbGljZWQgdmFsdWVzIGZvciB0aGUgZ3JpZCByb3csIG5vdyAodGhlc2UgYXJlIHRoZSBvbGQgb25lcyB3aXRoIHRoZSBuZWdhdGl2ZSByb3dpZClcclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vVXBkYXRlIGV4aXN0aW5nIHJvd1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaHR0cC5wdXQodXJsLCBhdmdyLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVHcmlkUm93OiBBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cpID0+IHtcclxuXHJcbiAgICAgICAgLy9BZGQgdGhlIGdyaWQgcm93IHRvIHRoZSBvcmlnaW5hbCBhdHRyaWJ1dGUgdmFsdWVzXHJcbiAgICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIGFsbCBvbGQgdmFsdWVzIGZvciByb3dcclxuICAgICAgICBsZXQgaW5kZXggPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmRJbmRleCgoYXYpPT4gKGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQgJiYgYXYuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRHcm91cEF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAvL1JlbW92ZSB2YWx1ZVxyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIC8vRmluZCB0aGUgbmV4dCBvbmVcclxuICAgICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vQWRkIGFsbCB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMucHVzaChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIHRoZSBzbGljZWQgYW5kIHVwZGF0ZWQgdmFsdWVzIGZvciB0aGUgZ3JpZCByb3dcclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIHVybCwge2JvZHk6IGF2Z3IsIHBhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgIC8vRmlsdGVyIHRvIG9ubHkgYXR0cmlidXRlcyB0byBLRUVQIC0gKGkuZS4gbm90IHRoZSBzYW1lIGdyaWQgb3Igbm90IHRoZSByb3cgYmVpbmcgZGVsZXRlZClcclxuICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcyA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gKGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUgfHwgYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgIHRoaXMuZ3JpZFJvd0RlbGV0ZWQubmV4dChhdmdyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gcmVmcmVzaCBhIGdyaWQgcm93IGFmdGVyIHBsdWdpbiBleGVjdXRpb24gd2l0aG91dCBhZmZlY3Rpbmcgb3RoZXIgYXR0cmlidXRlIHZhbHVlc1xyXG4gICAqIE5vcm1hbGx5IHNhdmluZyB0aGUgZ3JpZCByb3cgdXBkYXRlcyB0aGUgdmFsdWVzLCBidXQgc29tZSBhcHBsaWNhdGlvbnMgZXhlY3V0ZSBhIHN1YnNlcXVlbnQgcGx1Z2luIGFuZCBuZWVkIGFuIGV4dHJhIHJlZnJlc2ggdG8gcGljayB1cCBjaGFuZ2VzLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWVHcmlkUm93fSBhdmdyXHJcbiAgICovXHJcbiAgcmVmcmVzaEdyaWRSb3coYXZncjogQXR0cmlidXRlVmFsdWVHcmlkUm93KSB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtZ3JpZC1yb3cvXCIgO1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuICBcclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJpZEdyb3VwQXR0cmlidXRlXCIsIGF2Z3IuaWRHcm91cEF0dHJpYnV0ZSlcclxuICAgIC5zZXQoXCJncm91cEF0dHJpYnV0ZVJvd0lkXCIsIGF2Z3IuZ3JvdXBBdHRyaWJ1dGVSb3dJZClcclxuICAgIC5zZXQoXCJpZEF0dHJpYnV0ZVZhbHVlU2V0XCIsIGF2Z3IuaWRBdHRyaWJ1dGVWYWx1ZVNldClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuICBcclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuICBcclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlVmFsdWVHcmlkUm93Pih1cmwsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG4gICAgICBcclxuICAgICAgLy9Ob3RlIHRoYXQgdGhlIHNsaWNlZCBhbmQgdXBkYXRlZCB2YWx1ZXMgZm9yIHRoZSBncmlkIHJvdyB3ZXJlIGFscmVhZHkgY2xlYW5lZCB1cCBkdXJpbmcgdGhlIHNhdmVcclxuICBcclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICBcclxuICAgICAgLy9SZW1vdmUgYWxsIG9sZCB2YWx1ZXMgZm9yIHJvd1xyXG4gICAgICBsZXQgaW5kZXggPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmRJbmRleCgoYXYpPT4gKGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5ncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5pZEdyb3VwQXR0cmlidXRlKSk7XHJcbiAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgLy9SZW1vdmUgdmFsdWVcclxuICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgXHJcbiAgICAgICAgLy9GaW5kIHRoZSBuZXh0IG9uZVxyXG4gICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAmJiBhdi5pZEdyb3VwQXR0cmlidXRlID09PSBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuaWRHcm91cEF0dHJpYnV0ZSkpO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vQWRkIGFsbCB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXNbaV0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXNoIGFuIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIG1hcC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKi9cclxuICBwdXNoQXR0cmlidXRlKGF0dHJpYnV0ZTogQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZU1hcC5zZXQoYXR0cmlidXRlLmlkQXR0cmlidXRlLCBhdHRyaWJ1dGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZU11bHRpQ2hvaWNlKGF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IHZvaWQge1xyXG4gICAgLy9SZW1vdmUgZnJvbSBzbGljZWQgaWYgcHJlc2VudFxyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZSAmJiB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9PT0gYXR0cmlidXRlVmFsdWUudmFsdWVBdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSBzbGljZWQgYXR0cmlidXRlIHZhbHVlcyAobm8gbG9uZ2VyIHJlbW92aW5nKVxyXG4gICAgaWYgKGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgLy9PdGhlcndpc2UgcHVzaCB0aGUgdmFsdWUsIHNvIGl0IHdpbGwgYmUgc2F2ZWRcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnB1c2hBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdXNoQXR0cmlidXRlVmFsdWVNdWx0aURpY3QoYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogdm9pZCB7XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBpZiBwcmVzZW50XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlICYmIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBhdHRyaWJ1dGUgdmFsdWVzIChubyBsb25nZXIgcmVtb3ZpbmcpXHJcbiAgICBpZiAoaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL090aGVyd2lzZSBwdXNoIHRoZSB2YWx1ZSwgc28gaXQgd2lsbCBiZSBzYXZlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYSBuZXcgb3IgdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWUuICBUaGUgY3VycmVudCBvbmUgaXMganVzdCByZW1vdmVkIGFuZCB0aGUgbmV3IG9uZSBhcHBlbmRlZCB0byB0aGUgYXJyYXkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZVZhbHVlfSBhdHRyaWJ1dGVWYWx1ZVxyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwicHVzaEF0dHJpYnV0ZVZhbHVlXCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWUpO1xyXG5cclxuICAgIC8vT25seSBzZXR0aW5nIGRpcnR5IGZvciBub24gZ3JpZC1yb3dzICh0aG9zZSBhcmUgc2F2ZWQgaW1tZWRpYXRlbHkpXHJcbiAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciBwdXNoaW5nIG11bHRpcGxlIGF0dHJpYnV0ZSB2YWx1ZXMgYXQgb25jZS4gIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIGZvciBhIG11bHRpIGNob2ljZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZVZhbHVlW119IGF0dHJpYnV0ZVZhbHVlc1xyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZXMoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIGF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJwdXNoQXR0cmlidXRlVmFsdWVzXCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZVZhbHVlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlICE9PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGogPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2pdID0gYXR0cmlidXRlVmFsdWVzW2ldO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBzZXR0aW5nIGRpcnR5IGZvciBub24gZ3JpZC1yb3dzICh0aG9zZSBhcmUgc2F2ZWQgaW1tZWRpYXRlbHkpXHJcbiAgICBpZiAoISBhdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZSkge1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXNoIGEgdmFsdWUgaW4gdGhlIGNhc2Ugd2hlcmUgYW4gYXR0cmlidXRlIHZhbHVlIGRvZXNuJ3QgZXhpc3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZX0gYXR0cmlidXRlXHJcbiAgICogQHBhcmFtIHZhbHVlXHJcbiAgICovXHJcbiAgcHVzaFZhbHVlKGF0dHJpYnV0ZTogQXR0cmlidXRlLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlID0gPEF0dHJpYnV0ZVZhbHVlPntcclxuICAgICAgaWRBdHRyaWJ1dGU6IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSxcclxuICAgICAgaWRBdHRyaWJ1dGVWYWx1ZVNldDogdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSBcIlRYVFwiKSB7XHJcbiAgICAgIGF0dHJpYnV0ZVZhbHVlLnZhbHVlTG9uZ1RleHQgPSB7XHJcbiAgICAgICAgaWRMb25nVGV4dDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHRleHREYXRhOiB2YWx1ZVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhbiBhdHRyaWJ1dGUgdmFsdWUuICBUeXBpY2FsbHkgaW4gdGhlIGNhc2Ugb2YgYSBtdWx0aSBzZWxlY3Qgd2hlcmUgdGhlIHVuc2VsZWN0ZWQgdmFsdWUgaXMgcmVtb3ZlZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZUNob2ljZX0gYXR0cmlidXRlQ2hvaWNlXHJcbiAgICovXHJcbiAgc3BsaWNlQXR0cmlidXRlVmFsdWVDaG9pY2UoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIGF0dHJpYnV0ZUNob2ljZTogQXR0cmlidXRlQ2hvaWNlKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInNsaWNlQXR0cmlidXRlVmFsdWU6IFwiICsgYXR0cmlidXRlLmlkQXR0cmlidXRlICsgXCIsIFwiICsgYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlICYmIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9PT0gYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVzIChub3QgcHJldmlvdXNseSBzYXZlZClcclxuICAgIGlmIChpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgLy9BZGQgdG8gc2xpY2VkIHZhbHVlcyAocHJldmlvdXNseSBzYXZlZCAtIG5lZWQgdG8gcmVtb3ZlKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlXHJcbiAgICAgICAgICAgICYmIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLnB1c2godGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IGZsYWdnaW5nIGRpcnR5IGZvciBub24tZ3JpZCByb3dzICh0aG9zZSBhcmUgc2F2ZWQgaW1tZWRpYXRlbHkpXHJcbiAgICBpZiAoISBhdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZSkge1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFR5cGljYWxseSBpbiB0aGUgY2FzZSBvZiBhIG11bHRpIHNlbGVjdCB3aGVyZSB0aGUgdW5zZWxlY3RlZCB2YWx1ZSBpcyByZW1vdmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ2hvaWNlfSBhdHRyaWJ1dGVDaG9pY2VcclxuICAgKi9cclxuICBzcGxpY2VBdHRyaWJ1dGVWYWx1ZURpY3QoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2xpY2VBdHRyaWJ1dGVWYWx1ZTogXCIgKyBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgKyBcIiwgXCIgKyB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSAmJiB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVzIChub3QgcHJldmlvdXNseSBzYXZlZClcclxuICAgIGlmIChpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgLy9BZGQgdG8gc2xpY2VkIHZhbHVlcyAocHJldmlvdXNseSBzYXZlZCAtIG5lZWQgdG8gcmVtb3ZlKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlXHJcbiAgICAgICAgICAgICYmIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMucHVzaCh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgZmxhZ2dpbmcgZGlydHkgZm9yIG5vbi1ncmlkIHJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlIGJhc2VkIHVwb24gdGhlIGlkQXR0cmlidXRlLiAgVGhpcyBpcyBmcm9tIHRoZSBtYXAgb2YgYXR0cmlidXRlcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVxyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGV9XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlKGlkQXR0cmlidXRlOiBudW1iZXIpOiBBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwLmdldChpZEF0dHJpYnV0ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3IgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uLCBzZXQgYWxsIG9mIHRoZSBuZWdhdGl2ZSBpZHMgdG8gdW5kZWZpbmVkIHByaW9yIHRvIHBvc3RpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb259IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBzZXROZWdhdGl2ZUlkc1RvVW5kZWZpbmVkKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGlmIChhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA8IDApIHtcclxuICAgICAgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgYXR0cmlidXRlQ29udGFpbmVyIG9mIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycykge1xyXG4gICAgICBpZiAoYXR0cmlidXRlQ29udGFpbmVyLmlkQXR0cmlidXRlQ29udGFpbmVyICA8IDApIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250YWluZXIuaWRBdHRyaWJ1dGVDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVDb250YWluZXIuZ3JhcGhpY2FsQXR0cmlidXRlcykge1xyXG5cclxuICAgICAgICBpZiAoYXR0cmlidXRlLmlkQXR0cmlidXRlICA8IDApIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlQ2hvaWNlcykge1xyXG4gICAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlQ2hvaWNlIG9mIGF0dHJpYnV0ZS5hdHRyaWJ1dGVDaG9pY2VzKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVbXCJ2YWx1ZVwiXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGUgIDwgMCkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlICA8IDApIHtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgY29udGV4dCBjb2RlIGFuZCBpZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gY29uZmlndXJhdGlvblxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAgICovXHJcbiAgZ2V0Q29uZmlndXJhdGlvbk5hbWUoY29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyk6IHN0cmluZyB7XHJcbiAgICBpZiAoY29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBcIk5ld1wiO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBjb25maWd1cmF0aW9uLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHREaXNwbGF5ICsgXCI6IFwiICsgY29uZmlndXJhdGlvbi5leHRlbnNpb25EZXNjcmlwdGlvbjtcclxuXHJcbiAgICBpZiAoY29uZmlndXJhdGlvbi5pZEZpbHRlcjEpIHtcclxuICAgICAgbmFtZSArPSBcIiAtIFwiICsgY29uZmlndXJhdGlvbi5maWx0ZXIxRGlzcGxheTtcclxuICAgIH1cclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkRmlsdGVyMikge1xyXG4gICAgICBuYW1lICs9IFwiIC0gXCIgKyBjb25maWd1cmF0aW9uLmZpbHRlcjJEaXNwbGF5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKGNmZzogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8ge1xyXG4gICAgaWYgKCFjZmcpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZHRvOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPID0gPEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8+e1xyXG4gICAgICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IGNmZy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24sXHJcbiAgICAgIGNvZGVBdHRyaWJ1dGVDb250ZXh0OiBjZmcuY29kZUF0dHJpYnV0ZUNvbnRleHQsXHJcbiAgICAgIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ6IGNmZy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0LFxyXG4gICAgICBpZEZpbHRlcjE6IGNmZy5pZEZpbHRlcjEsXHJcbiAgICAgIGlkRmlsdGVyMjogY2ZnLmlkRmlsdGVyMlxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBkdG8uZXh0ZW5zaW9uRGVzY3JpcHRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoY3R4OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY3R4LmNvZGVBdHRyaWJ1dGVDb250ZXh0ID09PSBjZmcuY29kZUF0dHJpYnV0ZUNvbnRleHQ7XHJcbiAgICAgIH0pWzBdLmV4dGVuc2lvbkRlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkpIHtcclxuICAgICAgbGV0IHJlc3VsdDogYW55W10gPSB0aGlzLmF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXIxTGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dFxyXG4gICAgICAgICAgJiYgZmlsdGVyLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuaWRGaWx0ZXIxID09PSBjZmcuaWRGaWx0ZXIxO1xyXG4gICAgICB9KTtcclxuICAgICAgZHRvLmZpbHRlcjFEaXNwbGF5ID0gKHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoID4gMCkgPyByZXN1bHRbMF0uZGlzcGxheSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXIyTGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dFxyXG4gICAgICAgICAgJiYgZmlsdGVyLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuaWRGaWx0ZXIxID09PSBjZmcuaWRGaWx0ZXIxXHJcbiAgICAgICAgICAmJiBmaWx0ZXIuaWRGaWx0ZXIyID09PSBjZmcuaWRGaWx0ZXIyO1xyXG4gICAgICB9KTtcclxuICAgICAgZHRvLmZpbHRlcjJEaXNwbGF5ID0gKHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoID4gMCkgPyByZXN1bHRbMF0uZGlzcGxheSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZHRvO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VjdXJpdHlDb2RlQ29udGV4dChjb2RlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZTtcclxuICAgIH0pWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXRGaWx0ZXIxRm9yKGNvZGVBdHRyaWJ1dGVDb250ZXh0OiBzdHJpbmcsIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ6IHN0cmluZyk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtLmNvZGVBdHRyaWJ1dGVDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlQ29udGV4dCAmJiBpdGVtLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcjJGb3IoY29kZUF0dHJpYnV0ZUNvbnRleHQ6IHN0cmluZywgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogc3RyaW5nLCBpZEZpbHRlcjE6IG51bWJlcik6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtLmNvZGVBdHRyaWJ1dGVDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlQ29udGV4dFxyXG4gICAgICAgICYmIGl0ZW0uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFxyXG4gICAgICAgICYmIGl0ZW0uaWRGaWx0ZXIxID09PSBpZEZpbHRlcjE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYWNrIG5ldyBpZEF0dHJpYnV0ZVZhbHVlcyB2aWEgYSBuZWdhdGl2ZSBudW1iZXIgZm9yIGludGVybmFsIHRyYWNraW5nLiAgUmVtb3ZlIHRoaXMgZmFrZSBpZCBwcmlvciB0byBwb3N0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge251bWJlcn1cclxuICAgKi9cclxuICBnZXRVbmlxdWVJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIC0tdGhpcy51bmlxdWVJZDtcclxuICB9XHJcbn1cclxuIl19
|
|
1275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL3NlcnZpY2VzL2F0dHJpYnV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBV2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFHckUsTUFBTSxDQUFDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUErQzNCLFlBQW9CLGlCQUFvQyxFQUNwQyxJQUFnQixFQUNoQixNQUFjLEVBQ2MsaUJBQXlCO1FBSHJELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Msc0JB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QUMsTUFBVyxFQUFFLEVBQUU7WUFDaEYsT0FBTyxNQUFNLENBQUMsNEJBQTRCLEtBQUssSUFBSSxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELGlDQUFpQztRQUMvQixPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsYUFBYSxDQUFDLG9CQUE0QixFQUFFLDRCQUFvQztRQUM5RSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEtBQUssNEJBQTRCLENBQUM7UUFDbEksQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLG9CQUE0QixFQUFFLDRCQUFvQyxFQUFFLFNBQWlCO1FBQ2pHLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixLQUFLLG9CQUFvQjttQkFDcEQsSUFBSSxDQUFDLDRCQUE0QixLQUFLLDRCQUE0QjttQkFDbEUsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDOzhHQXQrQ1UsZ0JBQWdCLG1HQWtEUCxrQkFBa0I7a0hBbEQzQixnQkFBZ0I7OzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQW1ESSxNQUFNOzJCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgaXNEZXZNb2RlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBQYXJhbXN9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5cclxuaW1wb3J0IHtEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSBcIkBodW50c21hbi1jYW5jZXItaW5zdGl0dXRlL2RpY3Rpb25hcnktc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ2hvaWNlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNob2ljZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVWYWx1ZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS12YWx1ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNvbmZpZ3VyYXRpb24uZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWVTZXR9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUtc2V0LmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE99IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi5kdG9cIjtcclxuaW1wb3J0IHtHcmFwaGljYWxBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9ncmFwaGljYWwtYXR0cmlidXRlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbnRhaW5lcn0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jb250YWluZXIuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWVHcmlkUm93fSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLXZhbHVlLWdyaWQtcm93LmVudGl0eVwiO1xyXG5pbXBvcnQge1ByZUV2YWxEVE99IGZyb20gXCIuLi9tb2RlbC9wcmUtZXZhbC5kdG9cIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5RW50cmllc0RUT30gZnJvbSBcIi4uL21vZGVsL2RpY3Rpb25hcnktZW50cmllcy5kdG9cIjtcclxuXHJcblxyXG5leHBvcnQgbGV0IEFUVFJJQlVURV9FTkRQT0lOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXR0cmlidXRlRW5kcG9pbnRcIik7XHJcbmV4cG9ydCBjb25zdCBCT09MRUFOOiBzdHJpbmdbXSA9IFtcIk5cIiwgXCJZXCJdO1xyXG5leHBvcnQgY29uc3QgRVhURU5ERURfQk9PTEVBTjogc3RyaW5nW10gPSBbXCJOXCIsIFwiWVwiLCBcIlVcIl07XHJcblxyXG4vKipcclxuICogQSBzZXJ2aWNlIGNyZWF0ZWQgZm9yIGVhY2ggYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuICBUaGlzIG1ha2VzIGNhbGxzIHRvIHRoZSBiYWNrZW5kIHRvIGdldCB0aGUgY29uZmlndXJhdGlvblxyXG4gKiBhbmQgdmFsdWUgc2V0LiAgSXQgYWxzbyBzdG9yZXMgY29tbW9uIGRhdGEgdGhhdCBkaWZmZXJlbnQgYXR0cmlidXRlcyBtaWdodCBuZWVkIChlLmcuIGEgbGlzdCBvZiBhdHRyaWJ1dGUgY2hvaWNlcykuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVTZXJ2aWNlIHtcclxuXHJcbiAgbmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IG51bWJlcjtcclxuICBpZEZpbHRlcjE6IG51bWJlcjtcclxuICBpZEZpbHRlcjI6IG51bWJlcjtcclxuICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXI7XHJcbiAgaWRQYXJlbnRPYmplY3Q6IG51bWJlcjtcclxuICBib3VuZERhdGE6IGFueTtcclxuXHJcbiAgYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgZmlsdGVyMUxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBmaWx0ZXIyTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGRpY3Rpb25hcnlMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcblxyXG5cclxuICBwb3N0Q29uZmlndXJhdGlvblN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EaW1lbnNpb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih1bmRlZmluZWQpO1xyXG5cclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8+KHVuZGVmaW5lZCk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3Q6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+KCk7XHJcblxyXG4gIGxvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlTWFwOiBNYXA8bnVtYmVyLCBBdHRyaWJ1dGU+ID0gbmV3IE1hcDxudW1iZXIsIEF0dHJpYnV0ZT4oKTtcclxuXHJcbiAgd2lkdGg6IG51bWJlcjtcclxuXHJcbiAgY29udGFpbmVyVXBkYXRlZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgZ3JpZFJvd1NhdmVkOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+KCk7XHJcbiAgZ3JpZFJvd0RlbGV0ZWQ6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4oKTtcclxuICBkaXJ0eTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgdXBkYXRlZEF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG4gIHNsaWNlZEF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHVuaXF1ZUlkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2VkaXRCdXR0b25zRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7IC8vUHJlc2VydmUgb2xkIGRlZmF1bHRcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWN0aW9uYXJ5U2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChBVFRSSUJVVEVfRU5EUE9JTlQpIHByaXZhdGUgYXR0cmlidXRlRW5kcG9pbnQ6IHN0cmluZykge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJDcmVhdGVkIE5ldyBBdHRyaWJ1dGVTZXJ2aWNlXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Qm91bmREYXRhKGJvdW5kRGF0YTogYW55KSB7XHJcbiAgICB0aGlzLmJvdW5kRGF0YSA9IGJvdW5kRGF0YTtcclxuXHJcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICB0aGlzLm5vdGlmeUF0dHJpYnV0ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZWRpdEJ1dHRvbnNFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VkaXRCdXR0b25zRW5hYmxlZDtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc2V0IGVkaXRCdXR0b25zRW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XHJcbiAgICBpZiAoZW5hYmxlZCAhPT0gdGhpcy5fZWRpdEJ1dHRvbnNFbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuX2VkaXRCdXR0b25zRW5hYmxlZCA9IGVuYWJsZWQ7XHJcbiAgICAgIHRoaXMubm90aWZ5QXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVDb3VudEJ5QXR0cmlidXRlKGlkQXR0cmlidXRlOiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZVwiLCBpZEF0dHJpYnV0ZS50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVDb3VudEJ5Q29udGFpbmVyKGlkQXR0cmlidXRlQ29udGFpbmVyOiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZUNvbnRhaW5lclwiLCBpZEF0dHJpYnV0ZUNvbnRhaW5lci50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGljdGlvbmFyeVZhbHVlQ291bnQoaWRBdHRyaWJ1dGVEaWN0aW9uYXJ5OiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtZGljdGlvbmFyeS1jb3VudFwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImlkQXR0cmlidXRlRGljdGlvbmFyeVwiLCBpZEF0dHJpYnV0ZURpY3Rpb25hcnkudG9TdHJpbmcoKSl9KTtcclxuICB9XHJcblxyXG4gIGZldGNoQXR0cmlidXRlQ29udGV4dCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgZm9ya0pvaW4oW1xyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlQ29udGV4dFwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkZpbHRlcjFcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5GaWx0ZXIyXCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlRGljdGlvbmFyeVwiKVxyXG4gICAgXSkuc3Vic2NyaWJlKChyZXNwb25zZXM6IGFueVtdKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1s0XSk7XHJcbiAgICAgIHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzJdKTtcclxuICAgICAgdGhpcy5maWx0ZXIyTGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbM10pO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1sxXSk7XHJcblxyXG4gICAgICByZXNwb25zZXNbMF0uc29ydCh0aGlzLnNvcnRBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0KTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1swXSk7XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy9HZXRzIHRoZSBkaWN0aW9uYXJ5IGVudHJpZXMgZnJvbSB0aGUgbWFwIChzbyB3ZSBkb24ndCBsb2FkIG92ZXIgYW5kIG92ZXIgYW5kIG92ZXIgZm9yIHRoZSBzYW1lIGRpY3Rpb25hcnkpXHJcbiAgZ2V0RGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlczogQXR0cmlidXRlVmFsdWVbXSwgZ3JvdXBBdHRyaWJ1dGVSb3dJZD86IG51bWJlciwgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlPzogQXR0cmlidXRlVmFsdWUpOiBPYnNlcnZhYmxlPERpY3Rpb25hcnlFbnRyaWVzRFRPPiB7XHJcbiAgICBsZXQgYnMgPSBuZXcgU3ViamVjdDxEaWN0aW9uYXJ5RW50cmllc0RUTz4oKTtcclxuXHJcbiAgICAvL0hhbmRsZSBYUEFUSFxyXG4gICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoKSB7XHJcbiAgICAgIGxldCBlbnRyaWVzRFRPID0gbmV3IERpY3Rpb25hcnlFbnRyaWVzRFRPKCk7XHJcbiAgICAgIGxldCB4cGF0aCA9IGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoO1xyXG5cclxuICAgICAgLy9GaWx0ZXJlZCBieSBhbm90aGVyIGRpY3Rpb25hcnk/IFBhcnNlIHRvIGdldCBhcnJheSBvZiBhbGwgZGljdGlvbmFyeSBjbGFzcyBuYW1lcyBuZWVkZWRcclxuICAgICAgbGV0IGRpY3RDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBsZXQgcG9zID0gMDtcclxuICAgICAgd2hpbGUgKHhwYXRoLmluZGV4T2YoXCIvRGljdGlvbmFyaWVzL0RpY3Rpb25hcnlcIiwgcG9zKSA+PSAwKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0geHBhdGguaW5kZXhPZihcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVwiLCBwb3MpO1xyXG4gICAgICAgIHN0YXJ0ID0geHBhdGguaW5kZXhPZihcIidcIiwgc3RhcnQpO1xyXG4gICAgICAgIGxldCBlbmQgPSB4cGF0aC5pbmRleE9mKFwiJ1wiLCBzdGFydCArIDEpO1xyXG4gICAgICAgIGRpY3RDbGFzc2VzLnB1c2goYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGguc3Vic3RyaW5nKHN0YXJ0ICsgMSwgZW5kKSlcclxuICAgICAgICBwb3MgPSBlbmQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vUG90ZW50aWFsbHkgbG9hZCBtdWx0aXBsZSBkaWN0aW9uYXJpZXNcclxuICAgICAgbGV0IGZvcmtDYWxscyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjbGFzc05hbWUgb2YgZGljdENsYXNzZXMpIHtcclxuICAgICAgICBmb3JrQ2FsbHMucHVzaCh0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzQXNYTUwoY2xhc3NOYW1lKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vRGVhbCB3aXRoIHRoZSByZXN1bHRzIHRvZ2V0aGVyXHJcbiAgICAgIGZvcmtKb2luKGZvcmtDYWxscykuc3Vic2NyaWJlKChyZXNwb25zZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgLy9XZSdyZSBvbmx5IGdvaW5nIHRvIGRvIHhwYXRoIG9uIHRoZSB4bWwgZm9yIHRoZSBmaXJzdCBkaWN0aW9uYXJ5XHJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICAgIGxldCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3BvbnNlc1swXSwgXCJhcHBsaWNhdGlvbi94bWxcIik7XHJcblxyXG4gICAgICAgIC8vSGF2ZSB0byBldmFsdWF0ZSBzdWItZXhwcmVzc2lvbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgZXhwcmVzc2lvbnMgbGlrZSBbQHggPSAoL3hwYXRoLXN1Yi1leHByZXNzaW9uKV1cclxuICAgICAgICBsZXQgc2Vjb25kYXJ5WG1sID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChyZXNwb25zZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgc2Vjb25kYXJ5WG1sID0gcmVzcG9uc2VzWzFdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9QcmUtZXZhbHVhdGUgYW5kIHNpbXBsaWZ5IFhQQVRIXHJcbiAgICAgICAgbGV0IGR0bzpQcmVFdmFsRFRPID0gdGhpcy5wcmVFdmFsdWF0ZVhwYXRoKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoLCBzZWNvbmRhcnlYbWwsIGdyb3VwQXR0cmlidXRlUm93SWQsIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vRXZhbHVhdGUgWFBBVEggZXhwcmVzc2lvblxyXG4gICAgICAgIGxldCBlbnRyaWVzID0gW107XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgbGV0IHhQYXRoUmVzdWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoZHRvLmV4cHJlc3Npb24sIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xyXG5cclxuICAgICAgICAgIC8vSXRlcmF0ZSB4cGF0aCByZXN1bHRzIChub2RlcylcclxuICAgICAgICAgIHZhciBub2RlID0gbnVsbDtcclxuICAgICAgICAgIHdoaWxlKG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGUpO1xyXG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1jYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gTm8gbWF0Y2hpbmcgZW50cmllcyBoZXJlLlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9XaGF0IGFib3V0IGRpY3Rpb25hcnkgZW50cmllcyB3aGVyZSBpc0FjdGl2ZT0nTicsIGJ1dCB0aGUgaWQgd2FzIHVzZWQgaW4gYSBwcmV2aW91c2x5IHNhdmVkIHZhbHVlP1xyXG4gICAgICAgIC8vV2UgYWRkIHRoYXQgdmFsdWUgdG8gdGhlIGRyb3Bkb3duLCBpbiB0aGF0IGNhc2UsIHNvIGl0IGNhbiBiZSBzZWxlY3RlZFxyXG4gICAgICAgIC8vUmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlIG9ubHkgZ2V0cyBwYXNzZWQgaW4gd2hlbiB0aGUgZmlsdGVyIGF0dHJpYnV0ZSBjaGFuZ2VzLiBJbiB0aGF0IHNjZW5hcmlvIHdlIGRvIG5vdCB3YW50IHRvIGFkZCB0aGUgb2xkIHZhbHVlIHRvIHRoZSBsaXN0XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5pc011bHRpVmFsdWUgIT09IFwiWVwiKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBhdiBvZiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHByZXNlbnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChhdiAmJiAhIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIGZvcih2YXIgaSA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzW2ldLnZhbHVlID09PSBhdi52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIC8vSWYgdGhlIGN1cnJlbnRseSBzYXZlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIGxpc3QsIGFkZCBpdC5cclxuICAgICAgICAgICAgICBpZiAoISBwcmVzZW50KSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgeHBhdGggPSBcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVtAY2xhc3NOYW1lPSdcIiArIGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LmNsYXNzTmFtZSArIFwiJ10vRGljdGlvbmFyeUVudHJ5W0B2YWx1ZT0nXCIgKyBhdi52YWx1ZUlkRGljdGlvbmFyeSArIFwiJ11cIjtcclxuICAgICAgICAgICAgICAgIC8vVGhlIGVudHJ5IHdhcyBwcm9iYWJseSBhbHJlYWR5IGxvYWRlZCwgYnV0IGV4Y2x1ZGVkIGJ5IHRoZSB4cGF0aC4gV2UgY2FuIHVzZSB0aGF0LlxyXG4gICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZXZhbHVhdGUoeHBhdGgsIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1VOT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpLnNpbmdsZU5vZGVWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaCh0aGlzLmdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGUpKTtcclxuICAgICAgICAgICAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8vU2V0IHRoZSBiZWhhdmlvciBzdWJqZWN0IHdpdGggdGhlIGZpbHRlcmVkIHZhbHVlcyBmb3IgdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXMgPSBlbnRyaWVzO1xyXG4gICAgICAgIGVudHJpZXNEVE8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGR0by5yZWZlcmVuY2VkQXR0cmlidXRlO1xyXG4gICAgICAgIGJzLm5leHQoZW50cmllc0RUTyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuICAgIC8vTm9uLXhwYXRoXHJcbiAgICBlbHNlIHtcclxuICAgICAgLy9EaWN0aW9uYXlTZXJ2aWNlIGp1c3QgdXNlZCBodHRwIGdldCwgc28gc2hvdWxkIG5vdCBuZWVkIHRvIHVuc3Vic2NyaWJlLCBzaW5jZSBodHRwIGRvZXMgdGhhdFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlEcm9wZG93bkVudHJpZXMoYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkuY2xhc3NOYW1lKS5zdWJzY3JpYmUoKGVudHJpZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgLy9NYWtlIHZhbHVlIGZpZWxkc1xyXG4gICAgICAgIGZvcih2YXIgaSA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgIGVudHJpZXNbaV0udmFsdWUgPSBlbnRyaWVzW2ldLmlkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZW50cmllc0RUTyA9IG5ldyBEaWN0aW9uYXJ5RW50cmllc0RUTygpO1xyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllcyA9IGVudHJpZXM7XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSB0cnVlOyAvL0EgYml0IG9mIGFuIGFzc3VtcHRpb24sIGJ1dCBpZiBpdCBpc24ndCBmaWx0ZXJlZCwgaXQgaGFkIGJldHRlciBpbmNsdWRlIGFsbCB0aGUgdmFsdWVzIVxyXG4gICAgICAgIGJzLm5leHQoZW50cmllc0RUTyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBicztcclxuICB9XHJcblxyXG4gIGdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGU6IGFueSk6IGFueSB7XHJcbiAgICAvL0NyZWF0ZSBKU09OIG9iamVjdHMgZnJvbSB0aGUgbm9kZXNcclxuICAgIGxldCBlbnRyeTogYW55ID0ge307XHJcbiAgICBmb3IodmFyIGkgPSBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgZW50cnlbbm9kZS5hdHRyaWJ1dGVzW2ldLm5hbWVdID0gbm9kZS5hdHRyaWJ1dGVzW2ldLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBlbnRyeTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlRXZhbHVhdGVYcGF0aCh4cGF0aDogc3RyaW5nLCBzZWNvbmRhcnlYbWw6IHN0cmluZywgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogUHJlRXZhbERUTyB7XHJcbiAgICBsZXQgZHRvOlByZUV2YWxEVE8gPSBuZXcgUHJlRXZhbERUTygpO1xyXG5cclxuICAgIC8vU2VjdXJpdHlBZHZpc29yL0Bjb2RlQ2FuY2VyR3JvdXBcclxuICAgIHdoaWxlICh4cGF0aC5pbmRleE9mKFwiL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXCIpID49IDApIHtcclxuICAgICAgeHBhdGggPSB4cGF0aC5yZXBsYWNlKFwiL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXCIsIFwiJ1wiICsgdGhpcy5nZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdCgpLnZhbHVlLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgKyBcIidcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXBsYWNlIHNvbWUgb2YgdGhlIGNvbnRleHQgcGFyYW1ldGVycyAke3gudmFsdWV9IC0gVGhpcyBpcyBtb3JlIEFsdGlvIHNwZWNpZmljIHN0dWZmIHRoYXQgd2FzIHVzZWQgaW4gQ0NSXHJcbiAgICBsZXQgcGFyYW1Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcJHtbQS1aYS16MC05X10rXFxcXC52YWx1ZX1cIik7XHJcbiAgICB3aGlsZSAocGFyYW1Qb3MgPj0gMCkge1xyXG4gICAgICBsZXQgcHJlZml4ID0geHBhdGguc3Vic3RyaW5nKDAsIHBhcmFtUG9zKTtcclxuICAgICAgbGV0IHZhck5hbWUgPSB4cGF0aC5zdWJzdHJpbmcocGFyYW1Qb3MgKyAyLCB4cGF0aC5pbmRleE9mKFwiLlwiLCBwYXJhbVBvcykpO1xyXG4gICAgICBsZXQgc3VmZml4ID0geHBhdGguc3Vic3RyaW5nKHhwYXRoLmluZGV4T2YoXCJ9XCIsIHBhcmFtUG9zKSArIDEpO1xyXG5cclxuICAgICAgdmFyIGF2O1xyXG5cclxuICAgICAgLy9JZiB0aGVyZSBJUyBhIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSwgd2UgY2FuIHVzZSB0aGUgdmFsdWUgZGlyZWN0bHkuIE90aGVyd2lzZSB3ZSB0cnkgdG8gZmluZCBpdCBpbiB0aGUgQVZTXHJcbiAgICAgIGlmICghIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG5cclxuICAgICAgICAvL0ZpbmQgdGhlIGF0dHJpYnV0ZSwgbWF0Y2hpbmcgdGhlIHZhck5hbWUuXHJcbiAgICAgICAgLy9EbyB0aGlzIGZpcnN0LCBzbyB3ZSBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHJlbGF0ZWQgYXR0cmlidXRlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIHZhbHVlXHJcblxyXG4gICAgICAgIC8vSXRlcmF0ZSBhdHRyaWJ1dGVzIHRvIGZpbmQgb25lIHRoYXQgbWF0Y2hlcyB0aGUgdmFsdWVcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5mb3JFYWNoKChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgLy9BdHRyaWJ1dGVzIHRoYXQgbWF0Y2ggdGhlIG5hbWVcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlTmFtZSA9PT0gdmFyTmFtZSkge1xyXG4gICAgICAgICAgICBkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vSWYgdGhpcyBpcyBhIGdyaWQsIGxvb2sgZm9yIGF0dHJpYnV0ZXMgaW4gdGhlIHJvd1xyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGdyaWRDb2x1bW5BdHRyaWJ1dGUgIG9mIGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgLy9JZiB0aGUgbmFtZSBtYXRjaGVzIEFORCB0aGUgdmFsdWUgaW4gdGhlIEFWUyB3YXMgcGFydCBvZiB0aGUgU0FNRSBST1cgd2UgYXJlIGV2YWx1YXRpbmcgWFBBVEggZm9yLCB3ZSBjYW4gdXNlIHRoZSB2YWx1ZSBmb3IgZXZhbHVhdGlvblxyXG4gICAgICAgICAgICAgIGlmIChncmlkQ29sdW1uQXR0cmlidXRlLmF0dHJpYnV0ZU5hbWUgPT09IHZhck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGR0by5yZWZlcmVuY2VkQXR0cmlidXRlID0gZ3JpZENvbHVtbkF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAgICAgICBsZXQgYXZzID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuICAgICAgICAvL0lmIHdlIGZvdW5kIHRoZSBhdHRyaWJ1dGUgYW5kIGhhdmUgdmFsdWVzLi4uXHJcbiAgICAgICAgaWYgKGR0by5yZWZlcmVuY2VkQXR0cmlidXRlICYmIGF2cykge1xyXG5cclxuICAgICAgICAgIC8vTG9vayB0aHJvdWdoIGFsbCB0aGUgdmFsdWVzIHRvIGZpbmQgdGhlIG9uZSBmb3IgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIChhbmQgU0FNRSBncmlkIHJvdyBpZiBpbiBhIGdyaWQgcm93KVxyXG4gICAgICAgICAgYXYgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmQoKGF2KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvL0lmIHRoaXMgaXMgYW4gQVYgZm9yIGEgZ3JpZCByb3csIGl0IG11c3QgYmUgZm9yIHRoZSBzYW1lIGdyaWQgcm93IHdlIGFyZSBsb29raW5nIGZvclxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBncm91cEF0dHJpYnV0ZVJvd0lkICE9PSAndW5kZWZpbmVkJyAmJiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgLy9JZiB3ZSBsb29rZWQgdXAgdGhlIGF0dHJpYnV0ZSBtYXRjaGluZyB0aGUgdmFsdWUgYnkgaWQgQU5EIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaXMgdGhlIG9uZSB3ZSBhciBsb29raW5nIGZvciBmcm9tIHRoZSBYUEFUSCwgd2UgY2FuIHVzZSBpdCBmb3IgZXZhbHVhdGlvblxyXG4gICAgICAgICAgICAgLy9Gb3VuZCBhbiBBdHRyaWJ1dGVWYWx1ZSB0aGF0IHRoZSBkaWN0aW9uYXJ5IGlzIGZpbHRlcmVkIGJ5XHJcbiAgICAgICAgICAgIGlmIChkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSA9PT0gYXYuaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL1VzZSB0aGUgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlIGlmIHByb3ZpZGVkICh0aGlzIGhhcHBlbnMgd2hlbiBhbHJlYWR5IGtub3duLCBkdXJpbmcgY2hhbmdlcyB0byB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUpXHJcbiAgICAgIGlmIChyZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJ1wiICsgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlLnZhbHVlICsgXCInXCIgKyBzdWZmaXg7XHJcbiAgICAgIH1cclxuICAgICAgLy9Gb3VuZCB0aGUgQXR0cmlidXRlVmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdGhhdCB0aGUgZGljdGlvbmFyeSBpcyBmaWx0ZXJlZCBieVxyXG4gICAgICBlbHNlIGlmIChhdikge1xyXG4gICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyBhdi52YWx1ZSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICB9XHJcbiAgICAgIC8vRGlkbid0IGZpbmQgYW4gYXR0cmlidXRlIGZvciB2YXJOYW1lXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vTWF5YmUgdGhlIHZhck5hbWUgaXMgZnJvbSBlbHNld2hlcmUgaW4gdGhlIGFwcCAobm9uLUNPRCksIGFuZCBwcm92aWRlZCBpbiBib3VuZERhdGFcclxuICAgICAgICBpZiAodGhpcy5ib3VuZERhdGEgJiYgdGhpcy5ib3VuZERhdGFbdmFyTmFtZV0pIHtcclxuICAgICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyB0aGlzLmJvdW5kRGF0YVt2YXJOYW1lXSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL05vdGhpbmcgbWF0Y2hlcy4gQ2hhbmdlIHRvIGVtcHR5IHN0cmluZy4gV2lsbCBwcm9iYWJseSByZXN1bHQgaW4gTk8gZW50cmllcywgd2hpY2ggd291bGQgYmUgY29ycmVjdC5cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInJ1wiICsgc3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcGFyYW1Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcJHtbQS1aYS16MC05X10rXFxcXC52YWx1ZX1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9IYXZlIHRvIGV2YWx1YXRlIHN1Yi1leHByZXNzaW9uLiBUaGlzIGhhbmRsZXMgZXhwcmVzc2lvbnMgbGlrZSBbQHggPSAoL3hwYXRoLXN1Yi1leHByZXNzaW9uKV1cclxuICAgIGxldCBpbkV4cHJlc3Npb25Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcW0BbQS1aYS16MC05X10rXFxcXHMqPVxcXFxzKlxcXFwoXCIpO1xyXG5cclxuICAgIGlmIChpbkV4cHJlc3Npb25Qb3MgPiAwICYmIHNlY29uZGFyeVhtbCkge1xyXG4gICAgICBsZXQgcHJlZml4ID0geHBhdGguc3Vic3RyaW5nKDAsIGluRXhwcmVzc2lvblBvcyArIDEpO1xyXG4gICAgICBsZXQgZXhwcmVzc2lvbkVuZCA9IHhwYXRoLmluZGV4T2YoXCIpXCIsIGluRXhwcmVzc2lvblBvcyk7XHJcbiAgICAgIGxldCB2YXJpYWJsZSA9IHhwYXRoLnN1YnN0cmluZyhpbkV4cHJlc3Npb25Qb3MgKyAxLCB4cGF0aC5pbmRleE9mKFwiPVwiLCBpbkV4cHJlc3Npb25Qb3MpKTtcclxuICAgICAgbGV0IHN1YkV4cHJlc3Npb24gPSB4cGF0aC5zdWJzdHJpbmcoeHBhdGguaW5kZXhPZihcIihcIiwgaW5FeHByZXNzaW9uUG9zKSArIDEsIGV4cHJlc3Npb25FbmQpO1xyXG4gICAgICBsZXQgc3VmZml4ID0geHBhdGguc3Vic3RyaW5nKGV4cHJlc3Npb25FbmQgKyAxKTtcclxuXHJcbiAgICAgIHhwYXRoID0gcHJlZml4O1xyXG5cclxuICAgICAgLy9FdmFsdWF0ZSBYUEFUSCBleHByZXNzaW9uXHJcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgbGV0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc2Vjb25kYXJ5WG1sLCBcImFwcGxpY2F0aW9uL3htbFwiKTtcclxuICAgICAgbGV0IHhQYXRoUmVzdWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoc3ViRXhwcmVzc2lvbiwgZG9jLCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XHJcblxyXG4gICAgICAvL0l0ZXJhdGUgeHBhdGggcmVzdWx0cyAobm9kZXMpXHJcbiAgICAgIHZhciBub2RlID0geFBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKTtcclxuXHJcbiAgICAgIHdoaWxlKG5vZGUpIHtcclxuICAgICAgICB4cGF0aCA9IHhwYXRoICsgdmFyaWFibGUgKyBcIj0nXCIgKyBub2RlLm5vZGVWYWx1ZSArIFwiJ1wiXHJcblxyXG4gICAgICAgIG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgeHBhdGggPSB4cGF0aCArIFwiIG9yIFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgeHBhdGggPSB4cGF0aCArIHN1ZmZpeDtcclxuICAgIH1cclxuXHJcbiAgICBkdG8uZXhwcmVzc2lvbiA9IHhwYXRoO1xyXG4gICAgcmV0dXJuIGR0bztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3QoYTogYW55LCBiOiBhbnkpIHtcclxuICAgIHJldHVybiBhLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdChjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcImZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3Q6IFwiICsgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdExvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnNcIjtcclxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uW10+KHVybCwge3BhcmFtczogcGFyYW1zfSkuc3Vic2NyaWJlKChjb25maWd1cmF0aW9uTGlzdDogQXR0cmlidXRlQ29uZmlndXJhdGlvbltdKSA9PiB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuXHJcbiAgICAgIGxldCBkdG9zOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgY2ZnIG9mIGNvbmZpZ3VyYXRpb25MaXN0KSB7XHJcbiAgICAgICAgbGV0IGR0bzogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyA9IHRoaXMuZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyhjZmcpO1xyXG4gICAgICAgIGlmIChkdG8pIHtcclxuICAgICAgICAgIGR0b3MucHVzaChkdG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZHRvcy5zb3J0KHRoaXMuc29ydEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KTtcclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RTdWJqZWN0Lm5leHQoZHRvcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KGE6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8sIGI6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8pIHtcclxuICAgIGNvbnN0IGRpc3BsYXlhID0gYS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheVxyXG4gICAgICArIGEuZXh0ZW5zaW9uRGVzY3JpcHRpb25cclxuICAgICAgKyAoYS5maWx0ZXIxRGlzcGxheSB8fCBcIlwiKVxyXG4gICAgICArIChhLmZpbHRlcjJEaXNwbGF5IHx8IFwiXCIpO1xyXG5cclxuICAgIGNvbnN0IGRpc3BsYXliID0gYi5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheVxyXG4gICAgICArIGIuZXh0ZW5zaW9uRGVzY3JpcHRpb25cclxuICAgICAgKyAoYi5maWx0ZXIxRGlzcGxheSB8fCBcIlwiKVxyXG4gICAgICArIChiLmZpbHRlcjJEaXNwbGF5IHx8IFwiXCIpO1xyXG5cclxuICAgIHJldHVybiBkaXNwbGF5YS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoZGlzcGxheWIudG9Mb3dlckNhc2UoKSk7XHJcbiAgfVxyXG5cclxuICAvL1VzZWQgYnkgY29kLWVkaXRvclxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmlkRmlsdGVyMSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIyID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zXCIsIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG5cclxuICAgICAgdGhpcy5wb3N0Q29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFwiL2VkaXRvci9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi9cIiArIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkJ5SWQoaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBudW1iZXIsIGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAhPT0gLTEpIHtcclxuICAgICAgdGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBsb2FkIGlmIHRoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkXHJcbiAgICBpZiAodGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gIT09IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAvL0NsZWFyIEFTQVBcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IGlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIHRoaXMuaWRGaWx0ZXIxID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmlkRmlsdGVyMiA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVNYXAuY2xlYXIoKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG5cclxuICAgICAgdGhpcy5mZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgLy9PciBsb2FkIHRoZSBBdHRyaWJ1dGVWYWx1ZVNldCBpZiB0aGF0IGNoYW5nZWQgKHBvc3NpYmxlIHRvIHN3aXRjaCBmcm9tIG9uZSBldmVudCB0byBhbm90aGVyIG9mIHRoZSBzYW1lIHR5cGUsIGZvciBleGFtcGxlXHJcbiAgICAvL1RoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIG11c3QgYWxzbyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgYW5kIG5vdCBhbHJlYWR5IHdvcmtpbmcgb24gbG9hZGluZyB0aGUgdmFsdWVzXHJcbiAgICBlbHNlIGlmICh0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgIT09IGlkQXR0cmlidXRlVmFsdWVTZXQgJiYgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlVmFsdWVTZXQoaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBpZGVudGlmaWVycyB0byBiZSB1c2VkIGJ5IHRoaXMgc2VydmljZS4gIFRoaXMgcHJvbXB0cyBhIG5ldyBjb25maWd1cmF0aW9uXHJcbiAgICogcmVxdWVzdCB0byBiZSBtYWRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkRmlsdGVyMVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEZpbHRlcjJcclxuICAgKi9cclxuLyogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGZvciBub3cgYmVjYXVzZSBpdCBpcyBib3RoIHVuaW1wbGVtZW50ZWQgYW5kIGluY29tcGxldGUgKGxvYWRpbmcgYSBjb25maWd1cmF0aW9uXHJcbiAqIGZpbHRlciB3b3VsZCByZWFsbHkgYWxzbyByZXF1aXJlIHRoZSBhdHRyaWJ1dGUgY29udGV4dCBhbmQgYXR0cmlidXRlc2VjdXJpdHkgY29udGV4dCBwbHVzIGEgc2VydmljZSBvblxyXG4gKiB0aGUgYmFjayBlbmQgdGhhdCBhY3R1YWxseSBkb2VzIHRoaXMgd29yay4gRm9yIG5vdywgb25seSBsb2FkaW5nIGJ5IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gKlxyXG4gIHNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUZpbHRlcihpZEZpbHRlcjE6IG51bWJlciwgaWRGaWx0ZXIyPzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUZpbHRlcjogXCIgKyBpZEZpbHRlcjEgKyBcIiBcIiArIGlkRmlsdGVyMik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgLy90aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIxID0gaWRGaWx0ZXIxO1xyXG4gICAgdGhpcy5pZEZpbHRlcjIgPSBpZEZpbHRlcjI7XHJcblxyXG4gICAgdGhpcy5mZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oKTtcclxuICB9XHJcbiovXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGlkIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgc2V0LiAgVGhpcyB3aWxsIHByb21wdCBhIHJlcXVlc3QgdG8gcHVsbCB0aGlzIGZyb20gdGhlIGJhY2tlbmQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVWYWx1ZVNldFxyXG4gICAqL1xyXG4gIHNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcikge1xyXG4gICAgLy9Pbmx5IGxvYWQgdGhlIEF0dHJpYnV0ZVZhbHVlU2V0IGlmIGl0IGhhcyBiZWVuIGNoYW5nZWRcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgIT09IGlkQXR0cmlidXRlVmFsdWVTZXQpIHtcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuXHJcbiAgICAgIHRoaXMuZmV0Y2hBdHRyaWJ1dGVWYWx1ZVNldChpZFBhcmVudE9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVxdWVzdCB0byBkb3dubG9hZCB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICovXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID09PSAtMSkge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPntcclxuICAgICAgICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IC0yXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGxldCB1cmw6IHN0cmluZztcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAmJiB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA+IC0xKSB7XHJcbiAgICAgIHVybCA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL1wiICsgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL1RoaXMgaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkXHJcblx0ICAvL3VybCA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL2ZpbHRlci9cIiArIHRoaXMuaWRGaWx0ZXIxO1xyXG4gICAgICAvL2lmICh0aGlzLmlkRmlsdGVyMikge1xyXG4gICAgICAgIC8vdXJsICs9IFwiL1wiICsgdGhpcy5pZEZpbHRlcjI7XHJcbiAgICAgIC8vfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odXJsKS5zdWJzY3JpYmUoKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgLy9Ob3cgbG9hZCB0aGUgYXR0cmlidXRlVmFsdWVTZXQgLSBUaGlzIHdpbGwgYWx3YXlzIGhhcHBlbiB3aGVuIGEgbmV3IGNvbmZpZ3VyYXRpb24gaXMgbG9hZGVkXHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IHVuZGVmaW5lZDsgLy9Gb3JjZSBpdCB0byBjaGFuZ2UgaW4gdGhpcyBzY2VuYXJpb1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQsIGlkUGFyZW50T2JqZWN0KTtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbih1bmRlZmluZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLmNsZWFyKCk7XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVTZXJ2aWNlLnNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYmFzZVdpbmRvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5nZXRCYXNlV2luZG93RGltZW5zaW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYmFzZVdpbmRvd1RlbXBsYXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycykge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycy5zb3J0KChhOiBBdHRyaWJ1dGVDb250YWluZXIsIGI6IEF0dHJpYnV0ZUNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGEuc29ydE9yZGVyIDwgYi5zb3J0T3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLnNvcnRPcmRlciA+IGIuc29ydE9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZUNvbnRhaW5lciBvZiBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmF0dHJpYnV0ZUNvbnRhaW5lcnMpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGaXJzdCBzb3J0IGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHkgYW5kIHggcG9zaXRpb25pbmcuICBJZiB1c2luZyBhYnNvbHV0ZSBwb3NpdGlvbiwgdGhlIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLFxyXG4gICAgICAgICAqIGJ1dCBpZiB3ZSB3YW50IHRoZSBhYnNvbHV0ZSBwb3NpdGlvbmluZyB0byBndWlkZSBhdXRvIGxheW91dCwgdGhlbiB1c2UgdGhpcyBvcmRlci5cclxuICAgICAgICAgKi9cclxuICAgICAgICBhdHRyaWJ1dGVDb250YWluZXIuZ3JhcGhpY2FsQXR0cmlidXRlcy5zb3J0KChhOiBHcmFwaGljYWxBdHRyaWJ1dGUsIGI6IEdyYXBoaWNhbEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGEudGFiT3JkZXIgPCBiLnRhYk9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS50YWJPcmRlciA+IGIudGFiT3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5zZXQoYXR0cmlidXRlLmlkQXR0cmlidXRlLCBhdHRyaWJ1dGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh0aGlzLmdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oYXR0cmlidXRlQ29uZmlndXJhdGlvbikpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlcXVlc3QgdG8gcHVsbCB0aGUgYXR0cmlidXRlIHZhbHVlIHNldC5cclxuICAgKiBSZXF1aXJlZCB0aGUgQXR0cmlidXRlQ29uZmlndXJhdGlvbiB0byBiZSBwcmUtbG9hZGVkXHJcbiAgICovXHJcbiAgZmV0Y2hBdHRyaWJ1dGVWYWx1ZVNldChpZFBhcmVudE9iamVjdDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmlkUGFyZW50T2JqZWN0ID0gaWRQYXJlbnRPYmplY3Q7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLXNldC9cIiArIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAoaWRQYXJlbnRPYmplY3QpP2lkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG4gICAgLy9DbGVhciBBU0FQXHJcbiAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVWYWx1ZVNldD4odXJsLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVTZXQ6IEF0dHJpYnV0ZVZhbHVlU2V0KSA9PiB7XHJcbiAgICAgIC8vSW5pdGlhbGl6ZSBhdHRyaWJ1dGVWYWx1ZXMgaWYgaXQgZG9lcyBub3QgZXhpc3RcclxuICAgICAgaWYgKCEgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2hlY2tBdnNFZGl0YWJsZSgpO1xyXG5cclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNoZWNrQXZzRWRpdGFibGUoKTogdm9pZCB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtc2V0L1wiICsgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ICsgXCIvY2FuLWVkaXRcIjtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAodGhpcy5pZFBhcmVudE9iamVjdCk/dGhpcy5pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG4gIFxyXG4gICAgdGhpcy5odHRwLmdldDxib29sZWFuPih1cmwsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChjYW5FZGl0OiBib29sZWFuKSA9PiB7XHJcbiAgICAgIHRoaXMuZWRpdEJ1dHRvbnNFbmFibGVkID0gY2FuRWRpdDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmFzZVdpbmRvd0RpbWVuc2lvbihiYXNlV2luZG93VGVtcGxhdGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5odHRwLmdldCh0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJiYXNlLXdpbmRvdy1kaW1lbnNpb25cIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJiYXNlV2luZG93VGVtcGxhdGVcIiwgYmFzZVdpbmRvd1RlbXBsYXRlKX0pXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRpbWVuc2lvbjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRGltZW5zaW9uU3ViamVjdC5uZXh0KGRpbWVuc2lvbik7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3VycmVudGx5IGEgc2ltcGxlIG5vdGlmaWVyIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gb3IgYXR0cmlidXRlIHZhbHVlIHNldCBoYXMgY2hhbmdlZCBhbmQgY29tcG9uZW50cyBtYXkgbmVlZCB0byBiZSByZWZyZXNoZWQuXHJcbiAgICpcclxuICAgKi9cclxuICBub3RpZnlBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb250YWluZXJVcGRhdGVkLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQb3N0IHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBhZnRlciBlZGl0aW5nLiAgUG9zdCB0aGUgZW50aXJlIHRoaW5nIGFzIGl0IGNhc2NhZGVzIGRvd24uICBUaGUgZWRpdG9yIGFsbG93cyB5b3VcclxuICAgKiB0byBtb2RpZnkgZXZlcnkgY29udGFpbmVyIGFuZCBvbmx5IHRoZW4gc2F2ZSB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb259IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBwb3N0QXR0cmlidXRlQ29uZmlndXJhdGlvbihhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogdm9pZCB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9ucy9cIiArIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICB0aGlzLnNldE5lZ2F0aXZlSWRzVG9VbmRlZmluZWQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCBhdHRyaWJ1dGVDb25maWd1cmF0aW9uKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy8gUHJldmVudCBlcnJvciBpbiBzdWJzZXF1ZW50IHNhdmVzLiBTZWUgTWV0YWJ1aWxkZXIgLyBNQi0yM1xyXG4gICAgICB0aGlzLmh0dHAuZ2V0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHVybCkuc3Vic2NyaWJlKChhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wb3N0Q29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzZXQuICBXaGVuIGVkaXRpbmcsIGF0dHJpYnV0ZXMgYWxyZWFkeSBwb3N0IHRoZWlyIHVwZGF0ZWQgdmFsdWVzIHRvIHRoaXMgc2VydmljZXMgdW5kZXJcclxuICAgKiBhIHNlcGFyYXRlIGFycmF5LiAgV2hhdCB3ZSBkbyBpcyBtZXJnZSBpbiB0aGVzZSB1cGRhdGVkIG9yIGNyZWF0ZWQgdmFsdWVzIHdpdGggdGhlIGN1cnJlbnQgYXR0cmlidXRlIHZhbHVlIHNldCAoYXZzKS5cclxuICAgKiBXaGlsZSBkb2luZyB0aGlzLCBzZXQgdGhlIGlkIG9mIHRoZSBhdnMgYW5kIG51bGxpZnkgYW55IG5lZ2F0aXZlIGlkcy5cclxuICAgKi9cclxuICB1cGRhdGVBdHRyaWJ1dGVWYWx1ZVNldCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtc2V0L1wiIDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAodGhpcy5pZFBhcmVudE9iamVjdCk/dGhpcy5pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuICAgIGxldCBhdnM6IEF0dHJpYnV0ZVZhbHVlU2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKSk7XHJcbiAgICBmb3IgKGxldCBpID0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPCAwKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXZzLmF0dHJpYnV0ZVZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXNbal0gPSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV07XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnNwbGljZShpLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXZzLmF0dHJpYnV0ZVZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGosIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhdnMuYXR0cmlidXRlVmFsdWVzID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5jb25jYXQodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzKTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHJlc3VsdFN1YmplY3Q6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+KCk7XHJcblxyXG4gICAgdGhpcy5odHRwLnB1dCh1cmwsIGF2cywge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlU2V0OiBBdHRyaWJ1dGVWYWx1ZVNldCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL0luaXRpYWxpemUgYXR0cmlidXRlVmFsdWVzIGlmIGl0IGRvZXMgbm90IGV4aXN0XHJcbiAgICAgICAgaWYgKCEgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgICAvL1NlbmQgdGhlIHJlc3VsdHMgdG8gdGhlIG9ic2VydmVyIChpZiBhbnkpLCB0aGVuIGNvbXBsZXRlXHJcbiAgICAgICAgcmVzdWx0U3ViamVjdC5uZXh0KGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgICByZXN1bHRTdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgICAgcmVzdWx0U3ViamVjdC5lcnJvcihlcnJvcik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj59XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlydHlTdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXJ0eTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0O1xyXG4gICAqXHJcbiAgICogQHJldHVybnMge0JlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD59XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVTZXQoKTogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdDtcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPn1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3QoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGJhc2VkIHVwb24gdGhlIGlkQXR0cmlidXRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlc1xyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGVWYWx1ZVtdfVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZVZhbHVlcyhpZEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiBBdHRyaWJ1dGVWYWx1ZVtdIHtcclxuXHJcbiAgICBsZXQgYXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdID0gW107XHJcblxyXG4gICAgaWYodGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG5cclxuICAgICAgLy9HbyB0aHJvdWdoIGFsbCB0aGUgdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVzIGZpcnN0IChzbyB3ZSBwcmVzZXJ2ZSBhY3Jvc3MgY2hhbmdpbmcgdGFicywgZXRjKVxyXG4gICAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlICYmICghZ3JvdXBBdHRyaWJ1dGVSb3dJZCB8fCBncm91cEF0dHJpYnV0ZVJvd0lkID09PSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUgJiYgKCFncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGdyb3VwQXR0cmlidXRlUm93SWQgPT09IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5ncm91cEF0dHJpYnV0ZVJvd0lkKSkge1xyXG4gICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL0dvIHRocm91Z2ggYWxsIHRoZSByZWd1bGFyIGF0dHJpYnV0ZXNcclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlVmFsdWUgb2YgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXMpIHtcclxuICAgICAgICAvL1JlZ3VsYXIgYXR0cmlidXRlcyAobm9ybWFsIGFuZCBncm91cCwgd2hpY2ggZ2V0IG11bHRpcGxlKVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUgfHwgYXR0cmlidXRlVmFsdWUuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIC8vSWYgcm93IGlkIHNwZWNpZmllZCwgb25seSBjYXJlIGFib3V0IHZhbHVlcyBmb3IgdGhhdCByb3dcclxuICAgICAgICAgIGlmICh0eXBlb2YgZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gJ3VuZGVmaW5lZCcgfHwgYXR0cmlidXRlVmFsdWUuZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkge1xyXG5cclxuICAgICAgICAgICAgLy9JZiBub3QgYWxyZWFkeSBhZGRlZC4uLlxyXG4gICAgICAgICAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZXMuZmluZCgoZXhpc3RpbmcpID0+IGV4aXN0aW5nLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpKSB7XHJcblxyXG4gICAgICAgICAgICAgIC8vRG9uJ3Qgd2FudCB0aGUgb3JpZ2luYWwgaWYgaXQgd2FzIHJlbW92ZWQgKHNsaWNlZClcclxuICAgICAgICAgICAgICBpZiAoISB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maW5kKChzYXYpID0+IHNhdi5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZVZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgYXR0cmlidXRlVmFsdWUpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBjaGlsZCBhdHRyaWJ1dGVzIG9mIHRoZSBpZEF0dHJpYnV0ZS4gIE1vc3QgbGlrZWx5IGZvciBhdHRyaWJ1dGVzIHRoYXQgZGVmaW5lIGNvbHVtbnMgb2YgYSBncmlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZVtdfVxyXG4gICAqL1xyXG4gIGdldEdyb3VwQXR0cmlidXRlcyhpZEF0dHJpYnV0ZTogbnVtYmVyKTogQXR0cmlidXRlW10ge1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM6IEF0dHJpYnV0ZVtdID0gW107XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVNYXAuZm9yRWFjaCgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpID0+IHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gYXR0cmlidXRlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgd2lkdGggd2hpY2ggaXMgYSByZXF1aXJlbWVudCBvZiB0aGUgYWJzb2x1dGUgcG9zaXRpb25pbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcclxuICAgKi9cclxuICBzZXRXaWR0aCh3aWR0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHdpZHRoLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge251bWJlcn1cclxuICAgKi9cclxuICBnZXRXaWR0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMud2lkdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGFycmF5IG9mIGF0dHJpYnV0ZSBjaG9pY2VzIGZvciB0aGUgaWRBdHRyaWJ1dGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVcclxuICAgKiBAcmV0dXJucyB7QXR0cmlidXRlQ2hvaWNlW119XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlQ2hvaWNlcyhpZEF0dHJpYnV0ZTogbnVtYmVyKTogQXR0cmlidXRlQ2hvaWNlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwLmdldChpZEF0dHJpYnV0ZSkuYXR0cmlidXRlQ2hvaWNlcztcclxuICB9XHJcblxyXG4gIGdldExvYWRpbmdTdWJqZWN0KCk6IFN1YmplY3Q8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGNvbnRhaW5lclVwZGF0ZWQgc3ViamVjdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtTdWJqZWN0PG51bWJlcj59XHJcbiAgICovXHJcbiAgZ2V0Q29udGFpbmVyVXBkYXRlZCgpOiBTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lclVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRHcmlkUm93U2F2ZWRTdWJqZWN0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkUm93U2F2ZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRHcmlkUm93RGVsZXRlZFN1YmplY3QoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRSb3dEZWxldGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIHVwZGF0ZWQgYW5kIGRlbGV0ZWQgYXR0cmlidXRlIHZhbHVlIGFycmF5cy5cclxuICAgKlxyXG4gICAqL1xyXG4gIGNsZWFyVXBkYXRlZEF0dHJpYnV0ZVZhbHVlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcbiAgICB0aGlzLm5vdGlmeUF0dHJpYnV0ZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSB1cGRhdGVkIGFuZCBkZWxldGVkIGdyaWQgcm93IGF0dHJpYnV0ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZ3JpZCByb3dcclxuICAgKlxyXG4gICAqL1xyXG4gIGNsZWFyVXBkYXRlZEdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcmVtYWluaW5nQXR0cmlidXRlcyA9IFtdO1xyXG5cclxuICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcbiAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG5cclxuICAgIC8vU2hvdWxkbid0IGJlIGEgbmVlZCB0byBjaGFuZ2UgZGlydHkgb3Igbm90aWZ5IGF0dHJpYnV0ZXNcclxuICB9XHJcblxyXG4gIHNhdmVHcmlkUm93QXR0cmlidXRlVmFsdWVzKGlkR3JvdXBBdHRyaWJ1dGU6IG51bWJlciwgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcm93VmFsdWVzID0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQgJiYgYXYuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRHcm91cEF0dHJpYnV0ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3dWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgLy9zZXQgdGhlIGlkQXR0cmlidXRlVmFsdWVTZXQgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIGlmICghIHJvd1ZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlU2V0KSB7XHJcbiAgICAgICAgcm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vcmVtb3ZlIGFsbCBuZWdhdGl2ZSBpZHMgKG5ldyB2YWx1ZXMpXHJcbiAgICAgIGlmIChyb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA8IDApIHtcclxuICAgICAgICByb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRm9yIG11bHRpIHZhbHVlcyB0aGF0IHdlcmUgc2xpY2VkIChkZS1zZWxlY3RlZCkgd2UncmUgZ29pbmcgdG8gZmluZCB0aGVtIGFuZCBudWxsIG91dCB0aGUgdmFsdWUsIGluc3RlYWQgb2YgcmVtb3ZpbmcuXHJcbiAgICAvL1RoYXQgbWVhbnMgdGhleSBhY3RhdWxseSBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSByb3dWYWx1ZXNcclxuICAgIC8vUmVtb3ZlZCBtdWx0aSB2YWx1ZXMgd2l0aGluIGFuIGV4aXN0aW5nIHJvd1xyXG4gICAgbGV0IHJlbW92ZWRWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlbW92ZWRWYWx1ZXNbaV0udmFsdWVBdHRyaWJ1dGVDaG9pY2UgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHJlbW92ZWRWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHJvd1ZhbHVlcy5wdXNoKHJlbW92ZWRWYWx1ZXNbaV0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBhdmdyOkF0dHJpYnV0ZVZhbHVlR3JpZFJvdyA9IDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+e1xyXG4gICAgICAgIGlkQXR0cmlidXRlVmFsdWVTZXQ6IHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCxcclxuICAgICAgICBpZEdyb3VwQXR0cmlidXRlOiBpZEdyb3VwQXR0cmlidXRlLFxyXG4gICAgICAgIGdyb3VwQXR0cmlidXRlUm93SWQ6IGdyb3VwQXR0cmlidXRlUm93SWQsXHJcbiAgICAgICAgYXR0cmlidXRlVmFsdWVzOiByb3dWYWx1ZXNcclxuICAgICAgfTtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtZ3JpZC1yb3cvXCIgO1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBsZXQgcXVlcnlQYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVDb250ZXh0KVxyXG4gICAgLnNldChcImlkUGFyZW50T2JqZWN0XCIsICh0aGlzLmlkUGFyZW50T2JqZWN0KT90aGlzLmlkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICAvL1NhdmUgbmV3IHJvd1xyXG4gICAgaWYgKGdyb3VwQXR0cmlidXRlUm93SWQgPCAwKSB7XHJcbiAgICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgYXZnciwge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdzogQXR0cmlidXRlVmFsdWVHcmlkUm93KSA9PiB7XHJcblxyXG4gICAgICAgIC8vQWRkIHRoZSBncmlkIHJvdyB0byB0aGUgb3JpZ2luYWwgYXR0cmlidXRlIHZhbHVlc1xyXG4gICAgICAgIGxldCBhdnM6QXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMucHVzaChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIHRoZSB1cGRhdGVkIGFuZCBzbGljZWQgdmFsdWVzIGZvciB0aGUgZ3JpZCByb3csIG5vdyAodGhlc2UgYXJlIHRoZSBvbGQgb25lcyB3aXRoIHRoZSBuZWdhdGl2ZSByb3dpZClcclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vVXBkYXRlIGV4aXN0aW5nIHJvd1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaHR0cC5wdXQodXJsLCBhdmdyLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVHcmlkUm93OiBBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cpID0+IHtcclxuXHJcbiAgICAgICAgLy9BZGQgdGhlIGdyaWQgcm93IHRvIHRoZSBvcmlnaW5hbCBhdHRyaWJ1dGUgdmFsdWVzXHJcbiAgICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIGFsbCBvbGQgdmFsdWVzIGZvciByb3dcclxuICAgICAgICBsZXQgaW5kZXggPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmRJbmRleCgoYXYpPT4gKGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQgJiYgYXYuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRHcm91cEF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAvL1JlbW92ZSB2YWx1ZVxyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIC8vRmluZCB0aGUgbmV4dCBvbmVcclxuICAgICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vQWRkIGFsbCB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMucHVzaChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIHRoZSBzbGljZWQgYW5kIHVwZGF0ZWQgdmFsdWVzIGZvciB0aGUgZ3JpZCByb3dcclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIHVybCwge2JvZHk6IGF2Z3IsIHBhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgIC8vRmlsdGVyIHRvIG9ubHkgYXR0cmlidXRlcyB0byBLRUVQIC0gKGkuZS4gbm90IHRoZSBzYW1lIGdyaWQgb3Igbm90IHRoZSByb3cgYmVpbmcgZGVsZXRlZClcclxuICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcyA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gKGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUgfHwgYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgIHRoaXMuZ3JpZFJvd0RlbGV0ZWQubmV4dChhdmdyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gcmVmcmVzaCBhIGdyaWQgcm93IGFmdGVyIHBsdWdpbiBleGVjdXRpb24gd2l0aG91dCBhZmZlY3Rpbmcgb3RoZXIgYXR0cmlidXRlIHZhbHVlc1xyXG4gICAqIE5vcm1hbGx5IHNhdmluZyB0aGUgZ3JpZCByb3cgdXBkYXRlcyB0aGUgdmFsdWVzLCBidXQgc29tZSBhcHBsaWNhdGlvbnMgZXhlY3V0ZSBhIHN1YnNlcXVlbnQgcGx1Z2luIGFuZCBuZWVkIGFuIGV4dHJhIHJlZnJlc2ggdG8gcGljayB1cCBjaGFuZ2VzLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWVHcmlkUm93fSBhdmdyXHJcbiAgICovXHJcbiAgcmVmcmVzaEdyaWRSb3coYXZncjogQXR0cmlidXRlVmFsdWVHcmlkUm93KSB7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtZ3JpZC1yb3cvXCIgO1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuICBcclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJpZEdyb3VwQXR0cmlidXRlXCIsIGF2Z3IuaWRHcm91cEF0dHJpYnV0ZSlcclxuICAgIC5zZXQoXCJncm91cEF0dHJpYnV0ZVJvd0lkXCIsIGF2Z3IuZ3JvdXBBdHRyaWJ1dGVSb3dJZClcclxuICAgIC5zZXQoXCJpZEF0dHJpYnV0ZVZhbHVlU2V0XCIsIGF2Z3IuaWRBdHRyaWJ1dGVWYWx1ZVNldClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuICBcclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuICBcclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlVmFsdWVHcmlkUm93Pih1cmwsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG4gICAgICBcclxuICAgICAgLy9Ob3RlIHRoYXQgdGhlIHNsaWNlZCBhbmQgdXBkYXRlZCB2YWx1ZXMgZm9yIHRoZSBncmlkIHJvdyB3ZXJlIGFscmVhZHkgY2xlYW5lZCB1cCBkdXJpbmcgdGhlIHNhdmVcclxuICBcclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICBcclxuICAgICAgLy9SZW1vdmUgYWxsIG9sZCB2YWx1ZXMgZm9yIHJvd1xyXG4gICAgICBsZXQgaW5kZXggPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmRJbmRleCgoYXYpPT4gKGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5ncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5pZEdyb3VwQXR0cmlidXRlKSk7XHJcbiAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgLy9SZW1vdmUgdmFsdWVcclxuICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgXHJcbiAgICAgICAgLy9GaW5kIHRoZSBuZXh0IG9uZVxyXG4gICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAmJiBhdi5pZEdyb3VwQXR0cmlidXRlID09PSBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuaWRHcm91cEF0dHJpYnV0ZSkpO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vQWRkIGFsbCB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXNbaV0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXNoIGFuIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIG1hcC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKi9cclxuICBwdXNoQXR0cmlidXRlKGF0dHJpYnV0ZTogQXR0cmlidXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZU1hcC5zZXQoYXR0cmlidXRlLmlkQXR0cmlidXRlLCBhdHRyaWJ1dGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZU11bHRpQ2hvaWNlKGF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IHZvaWQge1xyXG4gICAgLy9SZW1vdmUgZnJvbSBzbGljZWQgaWYgcHJlc2VudFxyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZSAmJiB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9PT0gYXR0cmlidXRlVmFsdWUudmFsdWVBdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSBzbGljZWQgYXR0cmlidXRlIHZhbHVlcyAobm8gbG9uZ2VyIHJlbW92aW5nKVxyXG4gICAgaWYgKGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgLy9PdGhlcndpc2UgcHVzaCB0aGUgdmFsdWUsIHNvIGl0IHdpbGwgYmUgc2F2ZWRcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnB1c2hBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdXNoQXR0cmlidXRlVmFsdWVNdWx0aURpY3QoYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogdm9pZCB7XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBpZiBwcmVzZW50XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlICYmIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBhdHRyaWJ1dGUgdmFsdWVzIChubyBsb25nZXIgcmVtb3ZpbmcpXHJcbiAgICBpZiAoaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL090aGVyd2lzZSBwdXNoIHRoZSB2YWx1ZSwgc28gaXQgd2lsbCBiZSBzYXZlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYSBuZXcgb3IgdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWUuICBUaGUgY3VycmVudCBvbmUgaXMganVzdCByZW1vdmVkIGFuZCB0aGUgbmV3IG9uZSBhcHBlbmRlZCB0byB0aGUgYXJyYXkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZVZhbHVlfSBhdHRyaWJ1dGVWYWx1ZVxyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwicHVzaEF0dHJpYnV0ZVZhbHVlXCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWUpO1xyXG5cclxuICAgIC8vT25seSBzZXR0aW5nIGRpcnR5IGZvciBub24gZ3JpZC1yb3dzICh0aG9zZSBhcmUgc2F2ZWQgaW1tZWRpYXRlbHkpXHJcbiAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciBwdXNoaW5nIG11bHRpcGxlIGF0dHJpYnV0ZSB2YWx1ZXMgYXQgb25jZS4gIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIGZvciBhIG11bHRpIGNob2ljZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZVZhbHVlW119IGF0dHJpYnV0ZVZhbHVlc1xyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZXMoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIGF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJwdXNoQXR0cmlidXRlVmFsdWVzXCIpO1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZVZhbHVlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlICE9PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGogPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2pdID0gYXR0cmlidXRlVmFsdWVzW2ldO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBzZXR0aW5nIGRpcnR5IGZvciBub24gZ3JpZC1yb3dzICh0aG9zZSBhcmUgc2F2ZWQgaW1tZWRpYXRlbHkpXHJcbiAgICBpZiAoISBhdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZSkge1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXNoIGEgdmFsdWUgaW4gdGhlIGNhc2Ugd2hlcmUgYW4gYXR0cmlidXRlIHZhbHVlIGRvZXNuJ3QgZXhpc3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZX0gYXR0cmlidXRlXHJcbiAgICogQHBhcmFtIHZhbHVlXHJcbiAgICovXHJcbiAgcHVzaFZhbHVlKGF0dHJpYnV0ZTogQXR0cmlidXRlLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlID0gPEF0dHJpYnV0ZVZhbHVlPntcclxuICAgICAgaWRBdHRyaWJ1dGU6IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSxcclxuICAgICAgaWRBdHRyaWJ1dGVWYWx1ZVNldDogdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSBcIlRYVFwiKSB7XHJcbiAgICAgIGF0dHJpYnV0ZVZhbHVlLnZhbHVlTG9uZ1RleHQgPSB7XHJcbiAgICAgICAgaWRMb25nVGV4dDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHRleHREYXRhOiB2YWx1ZVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhbiBhdHRyaWJ1dGUgdmFsdWUuICBUeXBpY2FsbHkgaW4gdGhlIGNhc2Ugb2YgYSBtdWx0aSBzZWxlY3Qgd2hlcmUgdGhlIHVuc2VsZWN0ZWQgdmFsdWUgaXMgcmVtb3ZlZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZUNob2ljZX0gYXR0cmlidXRlQ2hvaWNlXHJcbiAgICovXHJcbiAgc3BsaWNlQXR0cmlidXRlVmFsdWVDaG9pY2UoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIGF0dHJpYnV0ZUNob2ljZTogQXR0cmlidXRlQ2hvaWNlKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInNsaWNlQXR0cmlidXRlVmFsdWU6IFwiICsgYXR0cmlidXRlLmlkQXR0cmlidXRlICsgXCIsIFwiICsgYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlICYmIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9PT0gYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVzIChub3QgcHJldmlvdXNseSBzYXZlZClcclxuICAgIGlmIChpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgLy9BZGQgdG8gc2xpY2VkIHZhbHVlcyAocHJldmlvdXNseSBzYXZlZCAtIG5lZWQgdG8gcmVtb3ZlKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlXHJcbiAgICAgICAgICAgICYmIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLnB1c2godGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IGZsYWdnaW5nIGRpcnR5IGZvciBub24tZ3JpZCByb3dzICh0aG9zZSBhcmUgc2F2ZWQgaW1tZWRpYXRlbHkpXHJcbiAgICBpZiAoISBhdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZSkge1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFR5cGljYWxseSBpbiB0aGUgY2FzZSBvZiBhIG11bHRpIHNlbGVjdCB3aGVyZSB0aGUgdW5zZWxlY3RlZCB2YWx1ZSBpcyByZW1vdmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ2hvaWNlfSBhdHRyaWJ1dGVDaG9pY2VcclxuICAgKi9cclxuICBzcGxpY2VBdHRyaWJ1dGVWYWx1ZURpY3QoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2xpY2VBdHRyaWJ1dGVWYWx1ZTogXCIgKyBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgKyBcIiwgXCIgKyB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSAmJiB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVzIChub3QgcHJldmlvdXNseSBzYXZlZClcclxuICAgIGlmIChpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgLy9BZGQgdG8gc2xpY2VkIHZhbHVlcyAocHJldmlvdXNseSBzYXZlZCAtIG5lZWQgdG8gcmVtb3ZlKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlXHJcbiAgICAgICAgICAgICYmIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMucHVzaCh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgZmxhZ2dpbmcgZGlydHkgZm9yIG5vbi1ncmlkIHJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlIGJhc2VkIHVwb24gdGhlIGlkQXR0cmlidXRlLiAgVGhpcyBpcyBmcm9tIHRoZSBtYXAgb2YgYXR0cmlidXRlcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVxyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGV9XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlKGlkQXR0cmlidXRlOiBudW1iZXIpOiBBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwLmdldChpZEF0dHJpYnV0ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3IgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uLCBzZXQgYWxsIG9mIHRoZSBuZWdhdGl2ZSBpZHMgdG8gdW5kZWZpbmVkIHByaW9yIHRvIHBvc3RpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb259IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBzZXROZWdhdGl2ZUlkc1RvVW5kZWZpbmVkKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGlmIChhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA8IDApIHtcclxuICAgICAgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgYXR0cmlidXRlQ29udGFpbmVyIG9mIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycykge1xyXG4gICAgICBpZiAoYXR0cmlidXRlQ29udGFpbmVyLmlkQXR0cmlidXRlQ29udGFpbmVyICA8IDApIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250YWluZXIuaWRBdHRyaWJ1dGVDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVDb250YWluZXIuZ3JhcGhpY2FsQXR0cmlidXRlcykge1xyXG5cclxuICAgICAgICBpZiAoYXR0cmlidXRlLmlkQXR0cmlidXRlICA8IDApIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlQ2hvaWNlcykge1xyXG4gICAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlQ2hvaWNlIG9mIGF0dHJpYnV0ZS5hdHRyaWJ1dGVDaG9pY2VzKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVbXCJ2YWx1ZVwiXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGUgIDwgMCkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlICA8IDApIHtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgY29udGV4dCBjb2RlIGFuZCBpZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gY29uZmlndXJhdGlvblxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAgICovXHJcbiAgZ2V0Q29uZmlndXJhdGlvbk5hbWUoY29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyk6IHN0cmluZyB7XHJcbiAgICBpZiAoY29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBcIk5ld1wiO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBjb25maWd1cmF0aW9uLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHREaXNwbGF5ICsgXCI6IFwiICsgY29uZmlndXJhdGlvbi5leHRlbnNpb25EZXNjcmlwdGlvbjtcclxuXHJcbiAgICBpZiAoY29uZmlndXJhdGlvbi5pZEZpbHRlcjEpIHtcclxuICAgICAgbmFtZSArPSBcIiAtIFwiICsgY29uZmlndXJhdGlvbi5maWx0ZXIxRGlzcGxheTtcclxuICAgIH1cclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkRmlsdGVyMikge1xyXG4gICAgICBuYW1lICs9IFwiIC0gXCIgKyBjb25maWd1cmF0aW9uLmZpbHRlcjJEaXNwbGF5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKGNmZzogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8ge1xyXG4gICAgaWYgKCFjZmcpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZHRvOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPID0gPEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8+e1xyXG4gICAgICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IGNmZy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24sXHJcbiAgICAgIGNvZGVBdHRyaWJ1dGVDb250ZXh0OiBjZmcuY29kZUF0dHJpYnV0ZUNvbnRleHQsXHJcbiAgICAgIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ6IGNmZy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0LFxyXG4gICAgICBpZEZpbHRlcjE6IGNmZy5pZEZpbHRlcjEsXHJcbiAgICAgIGlkRmlsdGVyMjogY2ZnLmlkRmlsdGVyMlxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBkdG8uZXh0ZW5zaW9uRGVzY3JpcHRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoY3R4OiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gY3R4LmNvZGVBdHRyaWJ1dGVDb250ZXh0ID09PSBjZmcuY29kZUF0dHJpYnV0ZUNvbnRleHQ7XHJcbiAgICAgIH0pWzBdLmV4dGVuc2lvbkRlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkpIHtcclxuICAgICAgbGV0IHJlc3VsdDogYW55W10gPSB0aGlzLmF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXIxTGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dFxyXG4gICAgICAgICAgJiYgZmlsdGVyLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuaWRGaWx0ZXIxID09PSBjZmcuaWRGaWx0ZXIxO1xyXG4gICAgICB9KTtcclxuICAgICAgZHRvLmZpbHRlcjFEaXNwbGF5ID0gKHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoID4gMCkgPyByZXN1bHRbMF0uZGlzcGxheSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXIyTGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChmaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dFxyXG4gICAgICAgICAgJiYgZmlsdGVyLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuaWRGaWx0ZXIxID09PSBjZmcuaWRGaWx0ZXIxXHJcbiAgICAgICAgICAmJiBmaWx0ZXIuaWRGaWx0ZXIyID09PSBjZmcuaWRGaWx0ZXIyO1xyXG4gICAgICB9KTtcclxuICAgICAgZHRvLmZpbHRlcjJEaXNwbGF5ID0gKHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoID4gMCkgPyByZXN1bHRbMF0uZGlzcGxheSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZHRvO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VjdXJpdHlDb2RlQ29udGV4dChjb2RlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZTtcclxuICAgIH0pWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXRGaWx0ZXIxRm9yKGNvZGVBdHRyaWJ1dGVDb250ZXh0OiBzdHJpbmcsIGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ6IHN0cmluZyk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtLmNvZGVBdHRyaWJ1dGVDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlQ29udGV4dCAmJiBpdGVtLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcjJGb3IoY29kZUF0dHJpYnV0ZUNvbnRleHQ6IHN0cmluZywgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogc3RyaW5nLCBpZEZpbHRlcjE6IG51bWJlcik6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBpdGVtLmNvZGVBdHRyaWJ1dGVDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlQ29udGV4dFxyXG4gICAgICAgICYmIGl0ZW0uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFxyXG4gICAgICAgICYmIGl0ZW0uaWRGaWx0ZXIxID09PSBpZEZpbHRlcjE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYWNrIG5ldyBpZEF0dHJpYnV0ZVZhbHVlcyB2aWEgYSBuZWdhdGl2ZSBudW1iZXIgZm9yIGludGVybmFsIHRyYWNraW5nLiAgUmVtb3ZlIHRoaXMgZmFrZSBpZCBwcmlvciB0byBwb3N0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge251bWJlcn1cclxuICAgKi9cclxuICBnZXRVbmlxdWVJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIC0tdGhpcy51bmlxdWVJZDtcclxuICB9XHJcbn1cclxuIl19
|