@colijnit/homedecorator 258.1.1 → 258.1.2
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/app/core/enum/icon.enum.d.ts +1 -0
- package/app/core/enum/message-type.enum.d.ts +2 -1
- package/app/core/interface/message-with-payload.interface.d.ts +1 -0
- package/app/core/model/homedecorator-settings-options.d.ts +1 -1
- package/app/core/model/homedecorator-settings.d.ts +3 -0
- package/app/core/service/3dm-api.d.ts +2 -2
- package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
- package/app/core/service/homedecorator-connector-adapter.service.d.ts +9 -1
- package/app/core/service/homedecorator-connector.service.d.ts +15 -2
- package/app/core/service/utils.service.d.ts +1 -1
- package/app/core/utils/object.utils.d.ts +2 -0
- package/app/homedecorator.module.d.ts +2 -1
- package/app/plugins/core3d/service/wall-measurements.service.d.ts +2 -0
- package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +3 -0
- package/app/plugins/product-catalog/product-catalog/product-catalog.component.d.ts +2 -0
- package/app/plugins/product-configurator/product-configurator-selector-list-of-values.component.scss +28 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-button.component.d.ts +19 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-button.component.scss +38 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.d.ts +20 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.scss +0 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.d.ts +19 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-tile.component.scss +56 -0
- package/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.d.ts +20 -0
- package/app/plugins/product-configurator/product-configurator-selector.component.d.ts +26 -0
- package/app/plugins/product-configurator/product-configurator-selector.component.scss +46 -0
- package/app/plugins/product-configurator/product-configurator.component.d.ts +38 -0
- package/app/plugins/product-configurator/product-configurator.component.scss +35 -0
- package/app/plugins/product-configurator/product-configurator.module.d.ts +18 -0
- package/app/plugins/product-configurator/template_variables.scss +13 -0
- package/app/plugins/render/model/blender-render-settings.d.ts +10 -0
- package/app/plugins/render/model/blender-scene-settings.d.ts +18 -0
- package/app/plugins/render/render-controls/render-controls.component.d.ts +19 -7
- package/app/plugins/render/service/new-render.service.d.ts +21 -4
- package/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.scss +1 -1
- package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +5 -0
- package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +4 -0
- package/app/plugins/threedselector/threedselector/threedselector.component.scss +17 -0
- package/app/plugins/threedselector/threedselector.module.d.ts +2 -1
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
- package/assets/icons/circle_regular.svg +0 -0
- package/bundles/colijnit-homedecorator.umd.js +1986 -835
- package/bundles/colijnit-homedecorator.umd.js.map +1 -1
- package/esm2015/app/app.version.js +3 -3
- package/esm2015/app/core/enum/icon.enum.js +2 -1
- package/esm2015/app/core/enum/message-type.enum.js +2 -1
- package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
- package/esm2015/app/core/model/homedecorator-settings-options.js +2 -2
- package/esm2015/app/core/model/homedecorator-settings.js +3 -1
- package/esm2015/app/core/model/icon.js +2 -1
- package/esm2015/app/core/service/3dm-api.js +15 -22
- package/esm2015/app/core/service/homedecorator-app-event.service.js +3 -2
- package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +65 -7
- package/esm2015/app/core/service/homedecorator-connector.service.js +150 -6
- package/esm2015/app/core/service/homedecorator-settings.service.js +8 -1
- package/esm2015/app/core/service/utils.service.js +116 -93
- package/esm2015/app/core/utils/object.utils.js +13 -1
- package/esm2015/app/homedecorator.component.js +1 -2
- package/esm2015/app/homedecorator.module.js +8 -4
- package/esm2015/app/plugins/core3d/core3d/core3d.component.js +2 -2
- package/esm2015/app/plugins/core3d/service/wall-measurements.service.js +7 -1
- package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +98 -50
- package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +4 -4
- package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +21 -11
- package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-button.component.js +67 -0
- package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-dropdown.component.js +57 -0
- package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-list-of-values.component.js +75 -0
- package/esm2015/app/plugins/product-configurator/product-configurator-selector-option-tile.compontent.js +90 -0
- package/esm2015/app/plugins/product-configurator/product-configurator-selector.component.js +253 -0
- package/esm2015/app/plugins/product-configurator/product-configurator.component.js +151 -0
- package/esm2015/app/plugins/product-configurator/product-configurator.module.js +115 -0
- package/esm2015/app/plugins/render/model/blender-render-settings.js +3 -0
- package/esm2015/app/plugins/render/model/blender-scene-settings.js +10 -0
- package/esm2015/app/plugins/render/model/render-parameters.js +3 -3
- package/esm2015/app/plugins/render/render-controls/render-controls.component.js +532 -446
- package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +6 -40
- package/esm2015/app/plugins/render/service/new-render.service.js +212 -44
- package/esm2015/app/plugins/render/service/render.service.js +6 -9
- package/esm2015/app/plugins/room-planner/components/floor-catalog/floor-catalog.component.js +1 -1
- package/esm2015/app/plugins/room-planner/components/texture-picker/texture-picker.component.js +1 -1
- package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +12 -10
- package/esm2015/app/plugins/threedselector/element-buttons/element-buttons.component.js +2 -2
- package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +55 -1
- package/esm2015/app/plugins/threedselector/threedselector/service/load-furniture.service.js +3 -3
- package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +64 -15
- package/esm2015/app/plugins/threedselector/threedselector/utils/asset.utils.js +1 -1
- package/esm2015/app/plugins/threedselector/threedselector.module.js +8 -4
- package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +1 -1
- package/esm2015/app/shared/category-library/category-library.component.js +1 -1
- package/fesm2015/colijnit-homedecorator.js +2522 -1149
- package/fesm2015/colijnit-homedecorator.js.map +1 -1
- package/package.json +4 -4
- package/styles.scss +1 -1
|
@@ -33,6 +33,7 @@ import { DomainName } from '@colijnit/mainapi/build/enum/domain-name.enum';
|
|
|
33
33
|
import { ObjectConfiguration } from '@colijnit/ioneconnector/build/model/object-configuration';
|
|
34
34
|
import { ArticleExtendedRequest } from '@colijnit/articleapi/build/model/article-extended-request';
|
|
35
35
|
import { ArticleExtended } from '@colijnit/articleapi/build/model/article-extended.bo';
|
|
36
|
+
import { CoDocument } from '@colijnit/mainapi/build/model/co-document';
|
|
36
37
|
import * as i0 from "@angular/core";
|
|
37
38
|
import * as i1 from "./homedecorator-app-event.service";
|
|
38
39
|
export class ExternalConnector {
|
|
@@ -119,6 +120,10 @@ export class HomedecoratorConnectorAdapterService {
|
|
|
119
120
|
}
|
|
120
121
|
}
|
|
121
122
|
const externalMainApi = new MainApi(options);
|
|
123
|
+
const loginResponse = yield externalMainApi.connect(this.mainUrl, this.mainSchema, this.mainVersion).catch(e => {
|
|
124
|
+
console.log(e);
|
|
125
|
+
return null;
|
|
126
|
+
});
|
|
122
127
|
const externalVersion = yield externalMainApi.getPublicParams(+options.schema).catch(error => {
|
|
123
128
|
console.log(error);
|
|
124
129
|
return new DataServiceResponseData();
|
|
@@ -128,10 +133,10 @@ export class HomedecoratorConnectorAdapterService {
|
|
|
128
133
|
options.version = catalogSettings.version;
|
|
129
134
|
}
|
|
130
135
|
const externalConfigurator = new Configurator(options);
|
|
131
|
-
const loginResponse =
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
});
|
|
136
|
+
// const loginResponse: LoginResponse = await externalConfigurator.connect().catch(e => {
|
|
137
|
+
// console.log(e);
|
|
138
|
+
// return null;
|
|
139
|
+
// });
|
|
135
140
|
if (loginResponse) {
|
|
136
141
|
const externalArticleApi = new Articles(options);
|
|
137
142
|
externalConfigurator.showLoader.subscribe(value => this.showLoader.next(value));
|
|
@@ -363,6 +368,15 @@ export class HomedecoratorConnectorAdapterService {
|
|
|
363
368
|
catch (e) {
|
|
364
369
|
}
|
|
365
370
|
}
|
|
371
|
+
selectAnswerBySelection(selection, userInput) {
|
|
372
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
373
|
+
try {
|
|
374
|
+
return this.connector.selectAnswerBySelection(selection, false, userInput);
|
|
375
|
+
}
|
|
376
|
+
catch (e) {
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
}
|
|
366
380
|
selectSelection(selection, forceBackToNode, after, connector) {
|
|
367
381
|
try {
|
|
368
382
|
return this.connector.selectSelection(selection, false, forceBackToNode, after, connector);
|
|
@@ -384,10 +398,24 @@ export class HomedecoratorConnectorAdapterService {
|
|
|
384
398
|
catch (e) {
|
|
385
399
|
}
|
|
386
400
|
}
|
|
387
|
-
|
|
401
|
+
getSelectorStructure(showLoader = true) {
|
|
402
|
+
try {
|
|
403
|
+
return this.connector.getSelectorStructure(showLoader);
|
|
404
|
+
}
|
|
405
|
+
catch (e) {
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
navigateTo(chosenOption, showLoader = false) {
|
|
409
|
+
try {
|
|
410
|
+
return this.connector.navigateTo(chosenOption.opvTreeNodeHierarchy, showLoader);
|
|
411
|
+
}
|
|
412
|
+
catch (e) {
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
getImageForSelectorStructure(option, publication, thumbNail = true, showLoader = true) {
|
|
388
416
|
return __awaiter(this, void 0, void 0, function* () {
|
|
389
417
|
try {
|
|
390
|
-
const response = yield this.articleApi.getSingleImage(
|
|
418
|
+
const response = yield this.articleApi.getSingleImage(option.artNodeId, publication, true, thumbNail);
|
|
391
419
|
if (response && response.validationResult && response.validationResult.success && response.resultObject) {
|
|
392
420
|
if (response.resultObject.filePath !== null && response.resultObject.filePath !== undefined && response.resultObject.filePath !== '') {
|
|
393
421
|
return ImageUtils.getFixedImageFilepathUrl(response.resultObject.filePath);
|
|
@@ -404,6 +432,36 @@ export class HomedecoratorConnectorAdapterService {
|
|
|
404
432
|
}
|
|
405
433
|
});
|
|
406
434
|
}
|
|
435
|
+
getImageForAnswerOrSelection(answerOrSelection, publication, thumbNail = true, showLoader = true) {
|
|
436
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
437
|
+
try {
|
|
438
|
+
const response = yield this.articleApi.getSingleImage(answerOrSelection.nodeId, publication, true, thumbNail);
|
|
439
|
+
if (response && response.validationResult && response.validationResult.success && response.resultObject) {
|
|
440
|
+
const coDoc = this._boFactory.makeWithRawBackendData(CoDocument, response.resultObject);
|
|
441
|
+
if (coDoc.filePath !== null && coDoc.filePath !== undefined && coDoc.filePath !== '') {
|
|
442
|
+
return ImageUtils.getFixedImageFilepathUrl(response.resultObject.filePath);
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
const responseString = ImageUtils.getDocBodyWithMimeTypeDefinition(response.resultObject.fileName, thumbNail ? response.resultObject.thumbnailBody : response.resultObject.documentBody);
|
|
446
|
+
if (!responseString) {
|
|
447
|
+
const docResponse = yield this.mainApi.getDocumentContent(coDoc.documentId);
|
|
448
|
+
if (docResponse && docResponse.validationResult && docResponse.validationResult.success && docResponse.resultObject && docResponse.resultObject.documentContent) {
|
|
449
|
+
return ImageUtils.getDocBodyWithMimeTypeDefinition(response.resultObject.fileName, docResponse.resultObject.documentContent);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
return responseString;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
return '';
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
catch (e) {
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
}
|
|
407
465
|
getSkipButtonImageAndText(goodId) {
|
|
408
466
|
return __awaiter(this, void 0, void 0, function* () {
|
|
409
467
|
try {
|
|
@@ -671,4 +729,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
671
729
|
providedIn: 'root'
|
|
672
730
|
}]
|
|
673
731
|
}], ctorParameters: function () { return [{ type: i1.HomedecoratorAppEventService }]; } });
|
|
674
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZWRlY29yYXRvci1jb25uZWN0b3ItYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItY29ubmVjdG9yLWFkYXB0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHN0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBRTFFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUMvRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdEUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx3REFBd0QsQ0FBQztBQUd0RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFHdkQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDO0FBQ3ZHLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdURBQXVELENBQUM7QUFDbEYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sK0RBQStELENBQUM7QUFDcEcsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBRTNFLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDO0FBRTFHLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUNuRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUN2RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0RBQXdELENBQUM7QUFDdkYsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzdFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0RBQWtELENBQUM7QUFDL0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDJEQUEyRCxDQUFDO0FBQ2pHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzREFBc0QsQ0FBQzs7O0FBSXJGLE1BQU0sT0FBTyxpQkFBaUI7Q0FHN0I7QUFRRCx5SUFBeUk7QUFDekksZ0RBQWdEO0FBSWhELE1BQU0sT0FBTyxvQ0FBb0M7SUErQy9DLFlBQ1UsZ0JBQThDO1FBQTlDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBOEI7UUEvQ3hDLHFCQUFnQixHQUFzQixJQUFJLE9BQU8sRUFBWSxDQUFDO1FBQzlELGVBQVUsR0FBcUIsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN0RCxvQkFBZSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRTdELGdDQUEyQixHQUF3QixJQUFJLEdBQUcsQ0FBaUI7WUFDakYsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUMzQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzNCLENBQUMsQ0FBQztRQTBCSSxlQUFVLEdBQXNCLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUt2RCxxQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBRXhDLDZCQUF3QixHQUFxQixFQUFFLENBQUM7UUFJaEQsZUFBVSxHQUEwQixJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFLeEUsQ0FBQztJQXhDRCxJQUFXLFNBQVM7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ3hCO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDL0c7SUFDSCxDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUN6QjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ2hIO0lBQ0gsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDdEI7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUM3RztJQUNILENBQUM7SUFvQlksMEJBQTBCLENBQUMsUUFBa0IsRUFBRSxRQUErQjs7WUFDekYsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUN0QixRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFDekUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQ3RFLEtBQUssRUFDTCxRQUFRLENBQUMsZ0JBQWdCLElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUgsQ0FBQztRQUNKLENBQUM7S0FBQTtJQUVZLGFBQWEsQ0FBQyxPQUFnQixFQUFFLGNBQXVCLEVBQUUsV0FBcUIsRUFBRSxnQkFBeUI7O1lBQ3BILElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO2dCQUMzRCxNQUFNLGNBQWMsR0FBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQztnQkFDL0csSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksY0FBYyxFQUFFO29CQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQzNGO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLGNBQWMsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDMUM7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksY0FBYyxFQUFFO29CQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN0QztnQkFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQzthQUNqQztpQkFBTTtnQkFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUU7b0JBQ25ELElBQUksZ0JBQWdCLEtBQUssSUFBSSxFQUFFO3dCQUM3QixvSEFBb0g7d0JBQ3BILElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO3dCQUNoQyxNQUFNLGtCQUFrQixHQUFtQixJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzt3QkFDMUYsSUFBSSxrQkFBa0IsRUFBRTs0QkFDdEIsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLGtCQUFrQixDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0NBQzFGLE9BQU8sQ0FBQyxRQUFRLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDO2dDQUMvQyxPQUFPLENBQUMsUUFBUSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztnQ0FDL0MsT0FBTyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQzs2QkFDbkM7eUJBQ0Y7NkJBQU07NEJBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsZ0JBQWdCLGFBQWEsQ0FBQyxDQUFDO3lCQUN6RTtxQkFDRjtvQkFDRCxNQUFNLGVBQWUsR0FBWSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdEQsTUFBTSxlQUFlLEdBQTRCLE1BQU0sZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ3BILE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25CLE9BQU8sSUFBSSx1QkFBdUIsRUFBRSxDQUFDO29CQUN2QyxDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsaUJBQWlCLENBQUMsS0FBSyxTQUFTLEVBQUU7d0JBQ3ZFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQzt3QkFDdkUsT0FBTyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDO3FCQUMzQztvQkFDRCxNQUFNLG9CQUFvQixHQUFpQixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckUsTUFBTSxhQUFhLEdBQWtCLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNsRixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNmLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUksYUFBYSxFQUFFO3dCQUNqQixNQUFNLGtCQUFrQixHQUFhLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUMzRCxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDaEYsb0JBQW9CLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUMvRixNQUFNLGlCQUFpQixHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUM7d0JBQ3JFLGlCQUFpQixDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7d0JBQ2hELGlCQUFpQixDQUFDLFNBQVMsR0FBRyxFQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBQyxDQUFDO3dCQUMxSCxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDO3FCQUNyRDtpQkFDRjtnQkFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQzthQUN0QztRQUNILENBQUM7S0FBQTtJQUVZLE1BQU07O1lBQ2pCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQyxDQUFDO0tBQUE7SUFFTSw4QkFBOEI7UUFDbkMsSUFBSSxHQUFXLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUN2RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLGFBQWEsRUFBRTtvQkFDeEQsR0FBRyxHQUFHLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7aUJBQzNDO2FBQ0Y7U0FDRjthQUFNO1lBQ0wsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7YUFDOUI7U0FDRjtRQUNELElBQUksR0FBRyxFQUFFO1lBQ1AsTUFBTSxPQUFPLEdBQVcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdELElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDcEIsT0FBTyxPQUFPLENBQUM7YUFDaEI7U0FDRjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVZLHFCQUFxQixDQUFDLE9BQTBDOztZQUMzRSxhQUFhO1lBQ2IsSUFBSTtnQkFDRixNQUFNLFFBQVEsR0FBNEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvRixJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtvQkFDOUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLDBCQUEwQixFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQTBDLENBQUM7aUJBQzNJO3FCQUFNO29CQUNMLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2FBQ0Y7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRVksc0JBQXNCLENBQUMsR0FBVzs7WUFDN0MsSUFBSTtnQkFDRixNQUFNLFFBQVEsR0FBNEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1RixJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtvQkFDOUUsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDO2lCQUM5QjtxQkFBTTtvQkFDTCxPQUFPLElBQUksQ0FBQztpQkFDYjthQUNGO1lBQUMsT0FBTyxDQUFDLEVBQUU7YUFDWDtRQUNILENBQUM7S0FBQTtJQUVNLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxlQUF3QjtRQUM5RCxJQUFJO1lBQ0YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztTQUNqRTtRQUFDLE9BQU8sQ0FBQyxFQUFFO1NBQ1g7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsVUFBa0IsRUFBRSxhQUFxQixFQUFFLGFBQXFCO1FBQ3RGLElBQUk7WUFDRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNsRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1NBQ1g7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFDLFVBQWtCLEVBQUUsMkJBQW9DO1FBQzFFLElBQUk7WUFDRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1NBQzdFO1FBQUMsT0FBTyxDQUFDLEVBQUU7U0FDWDtJQUNILENBQUM7SUFFWSxrQkFBa0I7O1lBQzdCLElBQUk7Z0JBQ0YsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ3BELE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUMsQ0FBQyxDQUFDO2dCQUNILHdCQUF3QjtnQkFDeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNqQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUN2QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7d0JBQzNELE1BQU0sU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7NEJBQy9DLE9BQU8sS0FBSyxDQUFDO3dCQUNmLENBQUMsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRUQsK0JBQStCO0lBQ2xCLFVBQVUsQ0FBQyxHQUFXLEVBQUUsTUFBYzs7WUFDakQsTUFBTSxNQUFNLEdBQVcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ2hEO1lBQ0QsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQztLQUFBO0lBRVksa0JBQWtCLENBQUMsTUFBYyxFQUFFLE1BQWM7O1lBQzVELElBQUk7Z0JBQ0YsTUFBTSxRQUFRLEdBQTRCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ25HLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUM5RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFZLENBQUM7aUJBQ3RHO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRUQsa0NBQWtDO0lBQ2xDLG9DQUFvQztJQUNwQyxJQUFJO0lBRUoseUNBQXlDO0lBQ3pDLDRDQUE0QztJQUM1QyxJQUFJO0lBRUcsMEJBQTBCO1FBQy9CLElBQUk7WUFDRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUMvQztRQUFDLE9BQU8sQ0FBQyxFQUFFO1NBQ1g7SUFDSCxDQUFDO0lBRVksa0JBQWtCOztZQUM3QixJQUFJO2dCQUNGLE1BQU0sUUFBUSxHQUE0QixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQy9FLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUM5RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQWdCLENBQUM7aUJBQzdHO2dCQUNELE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRVksYUFBYTs7WUFDeEIsSUFBSTtnQkFDRixNQUFNLFFBQVEsR0FBNEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMxRSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtvQkFDOUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFlLENBQUM7aUJBQzNHO2dCQUNELE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRVksZUFBZTs7WUFDMUIsSUFBSTtnQkFDRixNQUFNLFFBQVEsR0FBNEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ2xGLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUM5RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQWtCLENBQUM7aUJBQ2pIO2dCQUNELE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRU0seUJBQXlCLENBQUMsTUFBYyxFQUNkLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLGlCQUEwQixLQUFLLEVBQy9CLGFBQXNCLElBQUksRUFDMUIsVUFBbUIsRUFDbkIsc0JBQTBEO1FBQ3pGLElBQUk7WUFDRixhQUFhO1lBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUM7U0FDdEo7UUFBQyxPQUFPLENBQUMsRUFBRTtTQUNYO0lBQ0gsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCx1REFBdUQ7SUFDdkQsSUFBSTtJQUVTLHNCQUFzQixDQUFDLEVBQVU7O1lBQzVDLElBQUk7Z0JBQ0YsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDbEQ7cUJBQU07b0JBQ0wsT0FBTyxJQUFJLHVCQUF1QixFQUFFLENBQUM7aUJBQ3RDO2FBQ0Y7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRVksWUFBWSxDQUFDLE1BQWMsRUFBRSxTQUFrQjs7WUFDMUQsSUFBSTtnQkFDRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDOUQ7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRU0sWUFBWSxDQUFDLHdCQUFpQyxJQUFJO1FBQ3ZELElBQUk7WUFDRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDdEM7UUFBQyxPQUFPLENBQUMsRUFBRTtTQUNYO0lBQ0gsQ0FBQztJQUVNLGVBQWUsQ0FDcEIsU0FBb0IsRUFBRSxlQUF5QixFQUFFLEtBQWUsRUFBRSxTQUFrQjtRQUNwRixJQUFJO1lBQ0YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDNUY7UUFBQyxPQUFPLENBQUMsRUFBRTtTQUNYO0lBQ0gsQ0FBQztJQUVNLGVBQWUsQ0FBQyxTQUFvQjtRQUN6QyxJQUFJO1lBQ0YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNsRDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1NBQ1g7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsU0FBb0I7UUFDMUMsSUFBSTtZQUNGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNuRDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1NBQ1g7SUFDSCxDQUFDO0lBRVksNEJBQTRCLENBQ3ZDLGlCQUFxQyxFQUFFLFdBQW1CLEVBQUUsWUFBcUIsSUFBSSxFQUFFLGFBQXNCLElBQUk7O1lBQ2pILElBQUk7Z0JBQ0YsTUFBTSxRQUFRLEdBQTRCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZJLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7b0JBQ3ZHLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsS0FBSyxFQUFFLEVBQUU7d0JBQ3BJLE9BQU8sVUFBVSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzVFO3lCQUFNO3dCQUNMLE9BQU8sVUFBVSxDQUFDLGdDQUFnQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUMvRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUN6RjtpQkFDRjtxQkFBTTtvQkFDTCxPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGO1lBQUMsT0FBTyxDQUFDLEVBQUU7YUFDWDtRQUNILENBQUM7S0FBQTtJQUVZLHlCQUF5QixDQUFDLE1BQWU7O1lBQ3BELElBQUk7Z0JBQ0YsTUFBTSxRQUFRLEdBQTRCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3hHLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUM5RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQW1CLENBQUM7aUJBQ3hHO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRU0sOEJBQThCLENBQUMsaUJBQXFDLEVBQUUsWUFBcUIsSUFBSTtRQUNwRyxPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRVksYUFBYSxDQUFDLE1BQWM7O1lBQ3ZDLElBQUk7Z0JBQ0YsTUFBTSxRQUFRLEdBQTRCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEcsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7b0JBQzlFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBa0IsQ0FBQztpQkFDaEg7Z0JBQ0QsT0FBTyxFQUFFLENBQUM7YUFDWDtZQUFDLE9BQU8sQ0FBQyxFQUFFO2FBQ1g7UUFDSCxDQUFDO0tBQUE7SUFFWSxvQkFBb0IsQ0FBQyxTQUF3Qjs7WUFDeEQsSUFBSTtnQkFDRixNQUFNLFFBQVEsR0FBNEIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNsRyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtvQkFDOUUsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDO2lCQUM5QjtxQkFBTTtvQkFDTCxPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGO1lBQUMsT0FBTyxDQUFDLEVBQUU7YUFDWDtRQUNILENBQUM7S0FBQTtJQUVZLGVBQWUsQ0FBQyxRQUFnQixFQUFFLFlBQW9COztZQUNqRSxJQUFJO2dCQUNGLE1BQU0sUUFBUSxHQUE0QixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUN0RyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtvQkFDOUUsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDO2lCQUM5QjtxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtvQkFDN0MsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3RFO3FCQUFNO29CQUNMLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2FBQ0Y7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRVkseUJBQXlCOztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsT0FBTzthQUNSO1lBQ0QsTUFBTSxRQUFRLEdBQTRCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDaEcsT0FBTyxJQUFJLHVCQUF1QixFQUFFLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtnQkFDOUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQXdCLENBQUM7YUFDN0g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQzthQUNwRDtRQUNILENBQUM7S0FBQTtJQUVZLGlCQUFpQixDQUFDLGdCQUF3Qjs7WUFDckQsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNyQixPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsTUFBTSxRQUFRLEdBQTRCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BHLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO2dCQUM5RSxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7b0JBQ3pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBbUIsQ0FBQztpQkFDeEc7cUJBQU07b0JBQ0wsT0FBTyxJQUFJLENBQUM7aUJBQ2I7YUFDRjtpQkFBTTtnQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO2FBQ3JHO1FBQ0gsQ0FBQztLQUFBO0lBRUQsa0dBQWtHO0lBQ2xHLHNHQUFzRztJQUN0RyxzRkFBc0Y7SUFDdEYsbUNBQW1DO0lBQ25DLCtIQUErSDtJQUMvSCxlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLFFBQVE7SUFDUixhQUFhO0lBQ2IsMkdBQTJHO0lBQzNHLE1BQU07SUFDTixJQUFJO0lBRVMsb0JBQW9CLENBQUMsTUFBYzs7WUFDOUMsSUFBSTtnQkFDRixNQUFNLE1BQU0sR0FBNEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRixJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUM5RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBaUMsQ0FBQztpQkFDdkg7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztpQkFDbEQ7YUFDRjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2FBQ1g7UUFDSCxDQUFDO0tBQUE7SUFFWSxvQkFBb0IsQ0FBQyxlQUF1Qjs7WUFDdkQsSUFBSTtnQkFDRixNQUFNLE1BQU0sR0FBNEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNwRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUM5RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQWlDLENBQUM7aUJBQ2xJO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7aUJBQ2xEO2FBQ0Y7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1FBQ0gsQ0FBQztLQUFBO0lBRUQsRUFBRTtJQUNXLGNBQWMsQ0FBQyxHQUFXOztZQUNyQyxNQUFNLE1BQU0sR0FBNEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRixJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO2dCQUM5RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQTJCLENBQUM7YUFDM0c7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQzthQUNsRDtRQUNILENBQUM7S0FBQTtJQUVZLHdCQUF3Qjs7WUFDbkMsSUFBSTtnQkFDRixtQkFBbUI7Z0JBQ25CLE1BQU0sTUFBTSxHQUE0QixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDaEgsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtvQkFDOUQsT0FBaUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUMxSDtxQkFBTTtvQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO2lCQUNsRDthQUNGO1lBQUMsT0FBTyxDQUFDLEVBQUU7YUFDWDtRQUNILENBQUM7S0FBQTtJQUVZLHNCQUFzQixDQUFDLGVBQXVCLEVBQUUsTUFBMEIsRUFBRSxVQUFvQjs7WUFDM0csSUFBSTtnQkFDRixNQUFNLFFBQVEsR0FBNEIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzFILElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO29CQUM5RSxPQUF1QyxJQUFJLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDeEk7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztvQkFDbkQsT0FBTyxJQUFJLENBQUM7aUJBQ2I7YUFDRjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2FBQ1g7UUFDSCxDQUFDO0tBQUE7SUFFTSx1QkFBdUIsQ0FBQyxFQUFVO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9ILENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsSUFBSSxDQUFDLDJCQUEyQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxTQUFTLENBQUM7UUFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFWSxzQkFBc0I7O1lBQ2pDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUM1QixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNsRSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDNUIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7b0JBQ2xELElBQUksV0FBVyxDQUFDLGdCQUFnQixLQUFLLElBQUksRUFBRTt3QkFDekMsTUFBTSxZQUFZLEdBQW1CLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUNoRyxJQUFJLFlBQVksRUFBRTs0QkFDaEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzt5QkFDMUM7cUJBQ0Y7aUJBQ0Y7YUFDRjtRQUNILENBQUM7S0FBQTtJQUdZLGtCQUFrQixDQUFDLGFBQXFCOztZQUNuRCxNQUFNLGFBQWEsR0FBMkIsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNFLGFBQWEsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQzVDLE1BQU0sTUFBTSxHQUE0QixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO2dCQUM5RCxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMzRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQStCLENBQUM7aUJBQ3ZIO3FCQUFNO29CQUNMLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2FBQ0Y7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQzthQUNsRDtRQUNILENBQUM7S0FBQTtJQUVELDJJQUEySTtJQUMzSSxrSEFBa0g7SUFDbEgsd0VBQXdFO0lBQ3hFLElBQUk7SUFDSixFQUFFO0lBQ0YsOEpBQThKO0lBQzlKLDRFQUE0RTtJQUM1RSx1REFBdUQ7SUFDdkQsc0RBQXNEO0lBQ3RELDJEQUEyRDtJQUMzRCxrREFBa0Q7SUFDbEQsMkRBQTJEO0lBQzNELDhEQUE4RDtJQUM5RCwrSEFBK0g7SUFDL0gsSUFBSTtJQUVJLDBCQUEwQixDQUFDLElBQVk7UUFDN0MsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlDLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7a0lBbGxCVSxvQ0FBb0M7c0lBQXBDLG9DQUFvQyxjQUZuQyxNQUFNOzRGQUVQLG9DQUFvQztrQkFIaEQsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uJztcclxuaW1wb3J0IHtRdWVzdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9xdWVzdGlvbic7XHJcbmltcG9ydCB7QW5zd2VyUHJpY2V9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyLXByaWNlJztcclxuaW1wb3J0IHtBcnRpY2xlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2FydGljbGUnO1xyXG5pbXBvcnQge0RlY29Ob2RlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZSc7XHJcbmltcG9ydCB7U2tpcEJ1dHRvbkluZm99IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2tpcC1idXR0b24taW5mbyc7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yU3RhdGlzdGljc0Vudmlyb25tZW50fSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2NvbmZpZ3VyYXRvci1zdGF0aXN0aWNzLWVudmlyb25tZW50JztcclxuaW1wb3J0IHtPcHRpb25zfSBmcm9tICdAY29saWpuaXQvaW9uZWNvbm5lY3Rvci9idWlsZC9tb2RlbC9vcHRpb25zJztcclxuaW1wb3J0IHtDb25maWd1cmF0b3J9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGknO1xyXG5pbXBvcnQge0ludGVybmFsUGFyYW19IGZyb20gJ0Bjb2xpam5pdC9tYWluYXBpL2J1aWxkL2VudW0vaW50ZXJuYWwtcGFyYW0uZW51bSc7XHJcbmltcG9ydCB7UXVlc3Rpb25BbmRBbnN3ZXJzfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uLWFuZC1hbnN3ZXJzJztcclxuaW1wb3J0IHtNYWluQXBpfSBmcm9tICdAY29saWpuaXQvbWFpbmFwaSc7XHJcbmltcG9ydCB7RGF0YVNlcnZpY2VSZXNwb25zZURhdGF9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhJztcclxuaW1wb3J0IHtBcnRpY2xlc30gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvYXJ0aWNsZXMnO1xyXG5pbXBvcnQge0FydGljbGVUZXh0fSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2FydGljbGUtdGV4dC5ibyc7XHJcbmltcG9ydCB7QnVzaW5lc3NPYmplY3RGYWN0b3J5fSBmcm9tICdAY29saWpuaXQvaW9uZWNvbm5lY3Rvci9idWlsZC9zZXJ2aWNlL2J1c2luZXNzLW9iamVjdC1mYWN0b3J5JztcclxuaW1wb3J0IHtJbWFnZVV0aWxzfSBmcm9tICdAY29saWpuaXQvaW9uZWNvbm5lY3Rvci9idWlsZC91dGlscy9pbWFnZS11dGlscyc7XHJcbmltcG9ydCB7RXh0ZXJuYWxDYXRhbG9nU3RhcnR1cEluZm9SZXF1ZXN0fSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9tb2RlbC9leHRlcm5hbC1jYXRhbG9nLXN0YXJ0dXAtaW5mby1yZXF1ZXN0JztcclxuaW1wb3J0IHtFeHRlcm5hbENhdGFsb2dTdGFydHVwSW5mb30gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvbW9kZWwvZXh0ZXJuYWwtY2F0YWxvZy1zdGFydHVwLWluZm8nO1xyXG5pbXBvcnQge0xvZ2luUmVzcG9uc2V9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL2xvZ2luLXJlc3BvbnNlJztcclxuaW1wb3J0IHtDYXRhbG9nRGVmaW5pdGlvbn0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvbW9kZWwvY2F0YWxvZy1kZWZpbml0aW9uLmJvJztcclxuaW1wb3J0IHtFeHRlcm5hbFNvdXJjZX0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvbW9kZWwvZXh0ZXJuYWwtc291cmNlLmJvJztcclxuaW1wb3J0IHtBcnRpY2xlRnVsbE9iamVjdH0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZS1mdWxsLW9iamVjdCc7XHJcbmltcG9ydCB7QXJ0aWNsZUNhdGVnb3J5fSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2FydGljbGUtY2F0ZWdvcnknO1xyXG5pbXBvcnQge0FydGljbGVGbGF0fSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9tb2RlbC9hcnRpY2xlLWZsYXQuYm8nO1xyXG5pbXBvcnQge1VzZXJSb2xlVHlwZX0gZnJvbSAnLi4vZW51bS91c2VyLXJvbGUtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuL2hvbWVkZWNvcmF0b3ItYXBwLWV2ZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQge0NvRG9tYWluVmFsdWV9IGZyb20gJ0Bjb2xpam5pdC9tYWluYXBpL2J1aWxkL21vZGVsL2NvLWRvbWFpbi12YWx1ZS5ibyc7XHJcbmltcG9ydCB7RG9tYWluTmFtZX0gZnJvbSAnQGNvbGlqbml0L21haW5hcGkvYnVpbGQvZW51bS9kb21haW4tbmFtZS5lbnVtJztcclxuaW1wb3J0IHtPYmplY3RDb25maWd1cmF0aW9ufSBmcm9tICdAY29saWpuaXQvaW9uZWNvbm5lY3Rvci9idWlsZC9tb2RlbC9vYmplY3QtY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7QXJ0aWNsZUV4dGVuZGVkUmVxdWVzdH0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZS1leHRlbmRlZC1yZXF1ZXN0JztcclxuaW1wb3J0IHtBcnRpY2xlRXh0ZW5kZWR9IGZyb20gJ0Bjb2xpam5pdC9hcnRpY2xlYXBpL2J1aWxkL21vZGVsL2FydGljbGUtZXh0ZW5kZWQuYm8nO1xyXG5pbXBvcnQge01ldGFkYXRhfSBmcm9tICcuLi8uLi9wbHVnaW5zL2NvcmUzZC9pdGVtcy9tZXRhZGF0YSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvclNldHRpbmdzfSBmcm9tICcuLi9tb2RlbC9ob21lZGVjb3JhdG9yLXNldHRpbmdzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBFeHRlcm5hbENvbm5lY3RvciB7XHJcbiAgcHVibGljIGxvZ2luUmVzcG9uc2U6IExvZ2luUmVzcG9uc2U7XHJcbiAgcHVibGljIGNvbm5lY3RvcjogQ29ubmVjdG9yO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RvciB7XHJcbiAgY29ubmVjdG9yPzogQ29uZmlndXJhdG9yO1xyXG4gIGFydGljbGVBcGk/OiBBcnRpY2xlcztcclxuICBtYWluQXBpPzogTWFpbkFwaTtcclxufVxyXG5cclxuLy8gU29sZSByZXNwb25zaWJpbGl0eSBpcyBzaW1wbHkgdG8gd3JhcCBhcm91bmQgYSBjb2xpam4uQ29ubmVjdG9yIHRvIGNyZWF0ZSBhIHN0YWJsZSBpbm5lciBpbnRlcmZhY2UgdG8gdGhlIGxpYnJhcnkgaW4gYSAxOjEgbWV0aG9kIHdheS5cclxuLy8gT25seSB0byBiZSB1c2VkIGJ5IHRoZSBJT25lQ29udHJvbGxlclNlcnZpY2UuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEhvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZSB7XHJcbiAgcHVibGljIHJlYWRvbmx5IHF1ZXN0aW9uUmVjZWl2ZWQ6IFN1YmplY3Q8UXVlc3Rpb24+ID0gbmV3IFN1YmplY3Q8UXVlc3Rpb24+KCk7XHJcbiAgcHVibGljIHJlYWRvbmx5IHNob3dMb2FkZXI6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uUmVzZXQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBwcml2YXRlIF9wdWJsaWNhdGlvbkNvZGVGb3JVc2VyUm9sZTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KFtcclxuICAgIFtVc2VyUm9sZVR5cGUuQ3VzdG9tZXIsIDE2XSxcclxuICAgIFtVc2VyUm9sZVR5cGUuRW1wbG95ZWUsIDFdXHJcbiAgXSk7XHJcblxyXG4gIHB1YmxpYyBnZXQgY29ubmVjdG9yKCk6IENvbmZpZ3VyYXRvciB7XHJcbiAgICBpZiAoIXRoaXMuZXh0ZXJuYWxTb3VyY2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RvcnNbdGhpcy5leHRlcm5hbFNvdXJjZV0gPyB0aGlzLmNvbm5lY3RvcnNbdGhpcy5leHRlcm5hbFNvdXJjZV0uY29ubmVjdG9yLmNvbm5lY3RvciA6IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFydGljbGVBcGkoKTogQXJ0aWNsZXMge1xyXG4gICAgaWYgKCF0aGlzLmV4dGVybmFsU291cmNlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9hcnRpY2xlQXBpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yc1t0aGlzLmV4dGVybmFsU291cmNlXSA/IHRoaXMuY29ubmVjdG9yc1t0aGlzLmV4dGVybmFsU291cmNlXS5jb25uZWN0b3IuYXJ0aWNsZUFwaSA6IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG1haW5BcGkoKTogTWFpbkFwaSB7XHJcbiAgICBpZiAoIXRoaXMuZXh0ZXJuYWxTb3VyY2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX21haW5BcGk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JzW3RoaXMuZXh0ZXJuYWxTb3VyY2VdID8gdGhpcy5jb25uZWN0b3JzW3RoaXMuZXh0ZXJuYWxTb3VyY2VdLmNvbm5lY3Rvci5tYWluQXBpIDogbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb25uZWN0b3JzOiBFeHRlcm5hbENvbm5lY3RvciA9IG5ldyBFeHRlcm5hbENvbm5lY3RvcigpO1xyXG4gIHB1YmxpYyBleHRlcm5hbFNvdXJjZTogc3RyaW5nO1xyXG4gIHB1YmxpYyBsb2dpblJlc3BvbnNlOiBMb2dpblJlc3BvbnNlO1xyXG5cclxuICBwcml2YXRlIF9jYXRhbG9nRGVmaW5pdGlvbnM6IENhdGFsb2dEZWZpbml0aW9uW107XHJcbiAgcHJpdmF0ZSBfZXh0ZXJuYWxTb3VyY2VzOiBFeHRlcm5hbFNvdXJjZVtdID0gW107XHJcbiAgcHJpdmF0ZSBfY2F0YWxvZ0RlZmluaXRpb25zT3JpZ2luYWw6IENhdGFsb2dEZWZpbml0aW9uW107XHJcbiAgcHJpdmF0ZSBfZXh0ZXJuYWxTb3VyY2VzT3JpZ2luYWw6IEV4dGVybmFsU291cmNlW10gPSBbXTtcclxuICBwcml2YXRlIF9jb25uZWN0b3I/OiBDb25maWd1cmF0b3I7XHJcbiAgcHJpdmF0ZSBfYXJ0aWNsZUFwaTogQXJ0aWNsZXM7XHJcbiAgcHJpdmF0ZSBfbWFpbkFwaTogTWFpbkFwaTtcclxuICBwcml2YXRlIF9ib0ZhY3Rvcnk6IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSA9IG5ldyBCdXNpbmVzc09iamVjdEZhY3RvcnkoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9hcHBFdmVudFNlcnZpY2U6IEhvbWVkZWNvcmF0b3JBcHBFdmVudFNlcnZpY2VcclxuICApIHtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0Q29ubmVjdGlvbkZyb21NZXRhZGF0YShtZXRhZGF0YTogTWV0YWRhdGEsIHNldHRpbmdzOiBIb21lZGVjb3JhdG9yU2V0dGluZ3MpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuaW5pdENvbm5lY3RvcihcclxuICAgICAgbWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncyA/IG1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3Muc2V0dGluZ3MgOiBzZXR0aW5ncyxcclxuICAgICAgbWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncyA/IG1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MubmFtZSA6IHVuZGVmaW5lZCxcclxuICAgICAgZmFsc2UsXHJcbiAgICAgIG1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MgJiYgbWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZUlkID8gbWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZUlkIDogbnVsbFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0Q29ubmVjdG9yKG9wdGlvbnM6IE9wdGlvbnMsIGV4dGVybmFsU291cmNlPzogc3RyaW5nLCBmb3JjZVJlbG9hZD86IGJvb2xlYW4sIGV4dGVybmFsU291cmNlSWQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChleHRlcm5hbFNvdXJjZSA9PT0gdW5kZWZpbmVkIHx8IGV4dGVybmFsU291cmNlID09PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHJlbmV3Q29ubmVjdG9yOiBib29sZWFuID0gKHRoaXMuX2Nvbm5lY3RvciA/IHRoaXMuX2Nvbm5lY3Rvci51cmwgIT09IG9wdGlvbnMudXJsIDogZmFsc2UpIHx8IGZvcmNlUmVsb2FkO1xyXG4gICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RvciB8fCByZW5ld0Nvbm5lY3Rvcikge1xyXG4gICAgICAgIHRoaXMuX2Nvbm5lY3RvciA9IG5ldyBDb25maWd1cmF0b3Iob3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5sb2dpblJlc3BvbnNlID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yLmNvbm5lY3QoKTtcclxuICAgICAgICB0aGlzLl9jb25uZWN0b3Iuc2hvd0xvYWRlci5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy5zaG93TG9hZGVyLm5leHQodmFsdWUpKTtcclxuICAgICAgICB0aGlzLl9jb25uZWN0b3IuY29ubmVjdGlvblJlc2V0SW5hY3Rpdml0eS5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy5jb25uZWN0aW9uUmVzZXQubmV4dCgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuX2FydGljbGVBcGkgfHwgcmVuZXdDb25uZWN0b3IpIHtcclxuICAgICAgICB0aGlzLl9hcnRpY2xlQXBpID0gbmV3IEFydGljbGVzKG9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5fbWFpbkFwaSB8fCByZW5ld0Nvbm5lY3Rvcikge1xyXG4gICAgICAgIHRoaXMuX21haW5BcGkgPSBuZXcgTWFpbkFwaShvcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmV4dGVybmFsU291cmNlID0gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLmNvbm5lY3RvcnMuaGFzT3duUHJvcGVydHkoZXh0ZXJuYWxTb3VyY2UpKSB7XHJcbiAgICAgICAgaWYgKGV4dGVybmFsU291cmNlSWQgIT09IG51bGwpIHtcclxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBzZXQgdGhpcy5leHRlcm5hbFNvdXJjZSA9IHVuZGVmaW5lZCB0byBnZXQgdGhlIGRhdGEgb2YgdGhlIEhPU1QgYW5kIG5vdCB0aGUgcHJldmlvdXMgZXh0ZXJuYWwgc291cmNlXHJcbiAgICAgICAgICB0aGlzLmV4dGVybmFsU291cmNlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgY29uc3QgZXh0ZXJuYWxTb3VyY2VEYXRhOiBFeHRlcm5hbFNvdXJjZSA9IHRoaXMuZ2V0RXh0ZXJuYWxTb3VyY2VGcm9tSWQoZXh0ZXJuYWxTb3VyY2VJZCk7XHJcbiAgICAgICAgICBpZiAoZXh0ZXJuYWxTb3VyY2VEYXRhKSB7XHJcbiAgICAgICAgICAgIGlmIChleHRlcm5hbFNvdXJjZURhdGEucGFzc3dvcmQgIT09IHVuZGVmaW5lZCAmJiBleHRlcm5hbFNvdXJjZURhdGEudXNlcm5hbWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIG9wdGlvbnMucGFzc3dvcmQgPSBleHRlcm5hbFNvdXJjZURhdGEucGFzc3dvcmQ7XHJcbiAgICAgICAgICAgICAgb3B0aW9ucy51c2VybmFtZSA9IGV4dGVybmFsU291cmNlRGF0YS51c2VybmFtZTtcclxuICAgICAgICAgICAgICBvcHRpb25zLnVzZUxvZ2luRW5jcnlwdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEV4dGVybmFsIHNvdXJjZSB3aXRoIGlkICR7ZXh0ZXJuYWxTb3VyY2VJZH0gbm90IGZvdW5kIWApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBleHRlcm5hbE1haW5BcGk6IE1haW5BcGkgPSBuZXcgTWFpbkFwaShvcHRpb25zKTtcclxuICAgICAgICBjb25zdCBleHRlcm5hbFZlcnNpb246IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgZXh0ZXJuYWxNYWluQXBpLmdldFB1YmxpY1BhcmFtcygrb3B0aW9ucy5zY2hlbWEpLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNlcnZpY2VSZXNwb25zZURhdGEoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoZXh0ZXJuYWxWZXJzaW9uICYmIGV4dGVybmFsVmVyc2lvblsnY2F0YWxvZ1NldHRpbmdzJ10gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29uc3QgY2F0YWxvZ1NldHRpbmdzID0gSlNPTi5wYXJzZShleHRlcm5hbFZlcnNpb25bJ2NhdGFsb2dTZXR0aW5ncyddKTtcclxuICAgICAgICAgIG9wdGlvbnMudmVyc2lvbiA9IGNhdGFsb2dTZXR0aW5ncy52ZXJzaW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBleHRlcm5hbENvbmZpZ3VyYXRvcjogQ29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcihvcHRpb25zKTtcclxuICAgICAgICBjb25zdCBsb2dpblJlc3BvbnNlOiBMb2dpblJlc3BvbnNlID0gYXdhaXQgZXh0ZXJuYWxDb25maWd1cmF0b3IuY29ubmVjdCgpLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAobG9naW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgY29uc3QgZXh0ZXJuYWxBcnRpY2xlQXBpOiBBcnRpY2xlcyA9IG5ldyBBcnRpY2xlcyhvcHRpb25zKTtcclxuICAgICAgICAgIGV4dGVybmFsQ29uZmlndXJhdG9yLnNob3dMb2FkZXIuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMuc2hvd0xvYWRlci5uZXh0KHZhbHVlKSk7XHJcbiAgICAgICAgICBleHRlcm5hbENvbmZpZ3VyYXRvci5jb25uZWN0aW9uUmVzZXRJbmFjdGl2aXR5LnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLmNvbm5lY3Rpb25SZXNldC5uZXh0KCkpO1xyXG4gICAgICAgICAgY29uc3QgZXh0ZXJuYWxDb25uZWN0b3I6IEV4dGVybmFsQ29ubmVjdG9yID0gbmV3IEV4dGVybmFsQ29ubmVjdG9yKCk7XHJcbiAgICAgICAgICBleHRlcm5hbENvbm5lY3Rvci5sb2dpblJlc3BvbnNlID0gbG9naW5SZXNwb25zZTtcclxuICAgICAgICAgIGV4dGVybmFsQ29ubmVjdG9yLmNvbm5lY3RvciA9IHtjb25uZWN0b3I6IGV4dGVybmFsQ29uZmlndXJhdG9yLCBtYWluQXBpOiBleHRlcm5hbE1haW5BcGksIGFydGljbGVBcGk6IGV4dGVybmFsQXJ0aWNsZUFwaX07XHJcbiAgICAgICAgICB0aGlzLmNvbm5lY3RvcnNbZXh0ZXJuYWxTb3VyY2VdID0gZXh0ZXJuYWxDb25uZWN0b3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZXh0ZXJuYWxTb3VyY2UgPSBleHRlcm5hbFNvdXJjZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2dPdXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rvci5sb2dPdXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRQdWJsaWNhdGlvbkNvZGVCYXNlZE9uTG9naW4oKTogbnVtYmVyIHtcclxuICAgIGxldCByb2w6IHN0cmluZztcclxuICAgIGlmICh0aGlzLmV4dGVybmFsU291cmNlKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbm5lY3RvcnMuaGFzT3duUHJvcGVydHkodGhpcy5leHRlcm5hbFNvdXJjZSkpIHtcclxuICAgICAgICBjb25zdCBleHRlcm5hbENvbm5lY3RvciA9IHRoaXMuY29ubmVjdG9yc1t0aGlzLmV4dGVybmFsU291cmNlXTtcclxuICAgICAgICBpZiAoZXh0ZXJuYWxDb25uZWN0b3IgJiYgZXh0ZXJuYWxDb25uZWN0b3IubG9naW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgcm9sID0gZXh0ZXJuYWxDb25uZWN0b3IubG9naW5SZXNwb25zZS5yb2w7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5sb2dpblJlc3BvbnNlKSB7XHJcbiAgICAgICAgcm9sID0gdGhpcy5sb2dpblJlc3BvbnNlLnJvbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHJvbCkge1xyXG4gICAgICBjb25zdCBwdWJDb2RlOiBudW1iZXIgPSB0aGlzLl9nZXRQdWJsaWNhdGlvbkNvZGVGb3JSb2xlKHJvbCk7XHJcbiAgICAgIGlmIChwdWJDb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHB1YkNvZGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFdlYlZpZXdTdGFydHVwSW5mbyhyZXF1ZXN0OiBFeHRlcm5hbENhdGFsb2dTdGFydHVwSW5mb1JlcXVlc3QpOiBQcm9taXNlPEV4dGVybmFsQ2F0YWxvZ1N0YXJ0dXBJbmZvPiB7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmFydGljbGVBcGkuZ2V0V2Vidmlld1N0YXJ0dXBJbmZvKHJlcXVlc3QpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoRXh0ZXJuYWxDYXRhbG9nU3RhcnR1cEluZm8sIHJlc3BvbnNlLnJlc3VsdE9iamVjdCkgYXMgdW5rbm93biBhcyBFeHRlcm5hbENhdGFsb2dTdGFydHVwSW5mbztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEdvb2RJZEZyb21BcnRpY2xlTnIoc2t1OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldEdvb2RJZEZyb21BcnRpY2xlTnIoc2t1KTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXROb2RlSW5zdGFuY2UoZ29vZElkOiBudW1iZXIsIHNob3dBbW91bnRGaWVsZDogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuaW5pdE5vZGVJbnN0YW5jZShnb29kSWQsIHNob3dBbW91bnRGaWVsZCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hhbmdlQ29ubmVjdGlvbihpbnN0YW5jZUlkOiBzdHJpbmcsIG9sZENvbm5lY3Rpb246IHN0cmluZywgbmV3Q29ubmVjdGlvbjogc3RyaW5nKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmNoYW5nZUNvbm5lY3Rpb24oaW5zdGFuY2VJZCwgb2xkQ29ubmVjdGlvbiwgbmV3Q29ubmVjdGlvbik7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29weUluc3RhbmNlKGluc3RhbmNlSWQ6IHN0cmluZywgc2hvdWxkU2F2ZUN1cnJlbnRJbnN0YW5jZUlkOiBib29sZWFuKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmNvcHlJbnN0YW5jZShpbnN0YW5jZUlkLCBzaG91bGRTYXZlQ3VycmVudEluc3RhbmNlSWQpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNhdmVDb25maWd1cmF0aW9ucygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdG9yLnNhdmVDb25maWd1cmF0aW9ucygpLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgICAgLy8gc2F2ZSBleHRlcm5hbCBzb3VyY2VzXHJcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY29ubmVjdG9ycykge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3RvcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgY29uc3QgY29ubmVjdG9yID0gdGhpcy5jb25uZWN0b3JzW2tleV0uY29ubmVjdG9yLmNvbm5lY3RvcjtcclxuICAgICAgICAgIGF3YWl0IGNvbm5lY3Rvci5zYXZlQ29uZmlndXJhdGlvbnMoKS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBAcmV0dXJucyBUaGUgaW5pdGlhbCBhcnRpY2xlXHJcbiAgcHVibGljIGFzeW5jIGdldEFydGljbGUoc2t1OiBzdHJpbmcsIGJyYW5jaDogc3RyaW5nKTogUHJvbWlzZTxBcnRpY2xlPiB7XHJcbiAgICBjb25zdCBnb29kSWQ6IG51bWJlciA9IGF3YWl0IHRoaXMuZ2V0R29vZElkRnJvbUFydGljbGVOcihza3UpO1xyXG4gICAgaWYgKGdvb2RJZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRBcnRpY2xlUXVpY2tTZWwoZ29vZElkLCBicmFuY2gpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QXJ0aWNsZVF1aWNrU2VsKGdvb2RJZDogbnVtYmVyLCBicmFuY2g6IHN0cmluZyk6IFByb21pc2U8QXJ0aWNsZT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldEFydGljbGVRdWlja1NlbChnb29kSWQsIGJyYW5jaCk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlLCByZXNwb25zZS5yZXN1bHRPYmplY3Qub0FydGljbGVbMF0pIGFzIEFydGljbGU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgbG9hZFNlbGVjdGlvbnMoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmNvbm5lY3Rvci5nZXRTZWxlY3Rpb25zKCk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBwdWJsaWMgZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCk6IHZvaWQge1xyXG4gIC8vICAgdGhpcy5jb25uZWN0b3IuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCk7XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzQXN5bmMoKTogUHJvbWlzZTxRdWVzdGlvbkFuZEFuc3dlcnM+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRRdWVzdGlvbkFuZEFuc3dlcnMoKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRTZWxlY3Rpb25zQXN5bmMoKTogUHJvbWlzZTxTZWxlY3Rpb25bXT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0U2VsZWN0aW9ucygpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoU2VsZWN0aW9uLCByZXNwb25zZS5yZXN1bHRPYmplY3RzKSBhcyBTZWxlY3Rpb25bXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGVjb3NBc3luYygpOiBQcm9taXNlPERlY29Ob2RlW10+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldERlY29zKCk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShEZWNvTm9kZSwgcmVzcG9uc2UucmVzdWx0T2JqZWN0cykgYXMgRGVjb05vZGVbXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QW5zd2VyUHJpY2VzKCk6IFByb21pc2U8QW5zd2VyUHJpY2VbXT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0QW5zd2Vyc1ByaWNlcygpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoQW5zd2VyUHJpY2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdHMpIGFzIEFuc3dlclByaWNlW107XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEpzb25Db25maWd1cmVkQXJ0aWNsZXMoZ29vZElkOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZFR5cGU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsU291cmNlOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZD86IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0b3JTdGF0aXN0aWNzPzogQ29uZmlndXJhdG9yU3RhdGlzdGljc0Vudmlyb25tZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgcmV0dXJuIHRoaXMuYXJ0aWNsZUFwaS5nZXRKc29uQXJ0aWNsZUZsYXRUcmVlKGdvb2RJZCwgZ29vZFR5cGUsIHF1YW50aXR5LCBleHRlcm5hbFNvdXJjZSwgc2hvd0xvYWRlciwgaW5zdGFuY2VJZC50b1N0cmluZygpLCBjb25maWd1cmF0b3JTdGF0aXN0aWNzKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBnZXRKc29uTWF0Y2hUYWJsZUFydGljbGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldEpzb25NYXRjaFRhYmxlQXJ0aWNsZXMoKTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRJbnN0YW5jZVRvQ29uZmlndXJlKGlkOiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoaWQgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3Iuc2V0SW5zdGFuY2VUb0NvbmZpZ3VyZShpZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyLCB1c2VySW5wdXQ/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3Iuc2VsZWN0QW5zd2VyKGFuc3dlciwgZmFsc2UsIHVzZXJJbnB1dCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsQW5zd2VyKGdldEFuc3dlcnNBbmRRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuY2FuY2VsQW5zd2VyKCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0U2VsZWN0aW9uKFxyXG4gICAgc2VsZWN0aW9uOiBTZWxlY3Rpb24sIGZvcmNlQmFja1RvTm9kZT86IGJvb2xlYW4sIGFmdGVyPzogYm9vbGVhbiwgY29ubmVjdG9yPzogc3RyaW5nKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlLCBmb3JjZUJhY2tUb05vZGUsIGFmdGVyLCBjb25uZWN0b3IpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbik6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5kZWxldGVTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXBsYWNlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnJlcGxhY2VTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRJbWFnZUZvckFuc3dlck9yU2VsZWN0aW9uKFxyXG4gICAgYW5zd2VyT3JTZWxlY3Rpb246IEFuc3dlciB8IFNlbGVjdGlvbiwgcHVibGljYXRpb246IG51bWJlciwgdGh1bWJOYWlsOiBib29sZWFuID0gdHJ1ZSwgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldFNpbmdsZUltYWdlKGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCwgcHVibGljYXRpb24sIHRydWUsIHRodW1iTmFpbCk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0T2JqZWN0LmZpbGVQYXRoICE9PSBudWxsICYmIHJlc3BvbnNlLnJlc3VsdE9iamVjdC5maWxlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlLnJlc3VsdE9iamVjdC5maWxlUGF0aCAhPT0gJycpIHtcclxuICAgICAgICAgIHJldHVybiBJbWFnZVV0aWxzLmdldEZpeGVkSW1hZ2VGaWxlcGF0aFVybChyZXNwb25zZS5yZXN1bHRPYmplY3QuZmlsZVBhdGgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gSW1hZ2VVdGlscy5nZXREb2NCb2R5V2l0aE1pbWVUeXBlRGVmaW5pdGlvbihyZXNwb25zZS5yZXN1bHRPYmplY3QuZmlsZU5hbWUsXHJcbiAgICAgICAgICAgIHRodW1iTmFpbCA/IHJlc3BvbnNlLnJlc3VsdE9iamVjdC50aHVtYm5haWxCb2R5IDogcmVzcG9uc2UucmVzdWx0T2JqZWN0LmRvY3VtZW50Qm9keSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFNraXBCdXR0b25JbWFnZUFuZFRleHQoZ29vZElkPzogbnVtYmVyKTogUHJvbWlzZTxTa2lwQnV0dG9uSW5mbz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0U2tpcEJ1dHRvbkltYWdlQW5kVGV4dChnb29kSWQsIGZhbHNlKTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFNraXBCdXR0b25JbmZvLCByZXNwb25zZS5yZXN1bHRPYmplY3QpIGFzIFNraXBCdXR0b25JbmZvO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE1vb2RJbWFnZUZvckFuc3dlclNlbGVjdGlvbihhbnN3ZXJPclNlbGVjdGlvbjogQW5zd2VyIHwgU2VsZWN0aW9uLCB0aHVtYk5haWw6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLmdldEltYWdlRm9yQW5zd2VyT3JTZWxlY3Rpb24oYW5zd2VyT3JTZWxlY3Rpb24sIDMyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBbnN3ZXJJbmZvKGFuc3dlcjogQW5zd2VyKTogUHJvbWlzZTxBcnRpY2xlVGV4dFtdPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRBbnN3ZXJUZXh0cyhhbnN3ZXIubm9kZUlkLCBmYWxzZSk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShBcnRpY2xlVGV4dCwgcmVzcG9uc2UucmVzdWx0T2JqZWN0KSBhcyBBcnRpY2xlVGV4dFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRJbnRlcm5hbFBhcmFtZXRlcihwYXJhbWV0ZXI6IEludGVybmFsUGFyYW0pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5tYWluQXBpLmdldEludGVybmFsUGFyYW1ldGVyVmFsdWUocGFyYW1ldGVyKTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzdG9yZTNETW9kZWxDRE4oZmlsZW5hbWU6IHN0cmluZywgZmlsZUNvbnRlbnRzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5tYWluQXBpLnVwbG9hZE1vZGVsVG9DRE4oZmlsZW5hbWUsIGZpbGVDb250ZW50cyk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHRPYmplY3Q7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0Lm1lc3NhZ2VzWzBdLm1lc3NhZ2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldENhdGFsb2dEZWZpbml0aW9uc0xpc3QoKTogUHJvbWlzZTxDYXRhbG9nRGVmaW5pdGlvbltdPiB7XHJcbiAgICBpZiAoIXRoaXMuYXJ0aWNsZUFwaSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmFydGljbGVBcGkuZ2V0Q2F0YWxvZ0RlZmluaXRpb25zKCkuY2F0Y2goZSA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgRGF0YVNlcnZpY2VSZXNwb25zZURhdGEoKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShDYXRhbG9nRGVmaW5pdGlvbiwgcmVzcG9uc2UucmVzdWx0T2JqZWN0cykgYXMgQ2F0YWxvZ0RlZmluaXRpb25bXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IocmVzcG9uc2UudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEV4dGVybmFsU291cmNlKGV4dGVybmFsU291cmNlSWQ6IG51bWJlcik6IFByb21pc2U8RXh0ZXJuYWxTb3VyY2U+IHtcclxuICAgIGlmICghZXh0ZXJuYWxTb3VyY2VJZCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuYXJ0aWNsZUFwaS5nZXRFeHRlcm5hbFNvdXJjZShleHRlcm5hbFNvdXJjZUlkKTtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICBpZiAocmVzcG9uc2UucmVzdWx0T2JqZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEV4dGVybmFsU291cmNlLCByZXNwb25zZS5yZXN1bHRPYmplY3QpIGFzIEV4dGVybmFsU291cmNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlICYmIHJlc3BvbnNlLm1lc3NhZ2UgPyByZXNwb25zZS5tZXNzYWdlIDogJ0Vycm9yIHJldHJpZXZpbmcgZXh0ZXJuYWwgc291cmNlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgYXN5bmMgZ2V0RXh0ZXJuYWxTb3VyY2VzQnlHcm91cChncm91cDogRXh0ZXJuYWxTb3VyY2VHcm91cCk6IFByb21pc2U8RXh0ZXJuYWxTb3VyY2VbXT4ge1xyXG4gIC8vICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldEV4dGVybmFsU291cmNlc0J5R3JvdXAoZ3JvdXApO1xyXG4gIC8vICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgLy8gICAgIGlmIChyZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAvLyAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoRXh0ZXJuYWxTb3VyY2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdHMpIGFzIEV4dGVybmFsU291cmNlW107XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIG51bGw7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIGNvbnNvbGUuZXJyb3IocmVzcG9uc2UgJiYgcmVzcG9uc2UubWVzc2FnZSA/IHJlc3BvbnNlLm1lc3NhZ2UgOiAnRXJyb3IgcmV0cmlldmluZyBleHRlcm5hbCBzb3VyY2UnKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlRnVsbE9iamVjdChnb29kSWQ6IG51bWJlcik6IFByb21pc2U8QXJ0aWNsZUZ1bGxPYmplY3Q+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmFydGljbGVBcGkuZ2V0QXJ0aWNsZUZ1bGxPYmplY3QoZ29vZElkKTtcclxuICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQXJ0aWNsZUZ1bGxPYmplY3QsIHJlc3VsdC5yZXN1bHRPYmplY3QpIGFzIHVua25vd24gYXMgQXJ0aWNsZUZ1bGxPYmplY3Q7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QXJ0aWNsZUNhdGVnb3JpZXMocHVibGljYXRpb25Db2RlOiBudW1iZXIpOiBQcm9taXNlPEFydGljbGVDYXRlZ29yeVtdPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldEFydGljbGVDYXRlZ29yaWVzKHB1YmxpY2F0aW9uQ29kZSk7XHJcbiAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KEFydGljbGVDYXRlZ29yeSwgcmVzdWx0LnJlc3VsdE9iamVjdHMpIGFzIHVua25vd24gYXMgQXJ0aWNsZUNhdGVnb3J5W107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlRmxhdChza3U6IHN0cmluZyk6IFByb21pc2U8QXJ0aWNsZUZsYXQ+IHtcclxuICAgIGNvbnN0IHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmFydGljbGVBcGkuZ2V0QXJ0aWNsZUZsYXQoc2t1KTtcclxuICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlRmxhdCwgcmVzdWx0LnJlc3VsdE9iamVjdCkgYXMgdW5rbm93biBhcyBBcnRpY2xlRmxhdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRNb2RlbFBsYWNlbWVudE9wdGlvbnMoKTogUHJvbWlzZTxDb0RvbWFpblZhbHVlW10+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIERPTV8zRF9QTEFDRU1FTlRcclxuICAgICAgY29uc3QgcmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMubWFpbkFwaS5nZXREb21haW5Db2xsZWN0aW9uKCdOTCcsIERvbWFpbk5hbWUuRG9tM0RQbGFjZW1lbnQpO1xyXG4gICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIHJldHVybiA8Q29Eb21haW5WYWx1ZVtdPjx1bmtub3duPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KENvRG9tYWluVmFsdWUsIHJlc3VsdC5yZXN1bHRPYmplY3RzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRPYmplY3RDb25maWd1cmF0aW9uKHNjcmVlbkNmZ01vZHVsZTogc3RyaW5nLCBwYXJhbXM/OiBzdHJpbmcgfCBzdHJpbmdbXSwgaW5zZXJ0TW9kZT86IGJvb2xlYW4pOiBQcm9taXNlPE9iamVjdENvbmZpZ3VyYXRpb25bXT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5tYWluQXBpLmdldE9iamVjdENvbmZpZ3VyYXRpb25zKHNjcmVlbkNmZ01vZHVsZSwgcGFyYW1zLCBpbnNlcnRNb2RlKTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIDxPYmplY3RDb25maWd1cmF0aW9uW10+PHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoT2JqZWN0Q29uZmlndXJhdGlvbiwgcmVzcG9uc2UucmVzdWx0T2JqZWN0cyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRFeHRlcm5hbFNvdXJjZUZyb21JZChpZDogbnVtYmVyKTogRXh0ZXJuYWxTb3VyY2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V4dGVybmFsU291cmNlcyAmJiB0aGlzLl9leHRlcm5hbFNvdXJjZXMubGVuZ3RoID4gMCA/IHRoaXMuX2V4dGVybmFsU291cmNlcy5maW5kKGUgPT4gZS5zb3VyY2VJZCA9PT0gaWQpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlRXh0ZXJuYWxTb3VyY2VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2F0YWxvZ0RlZmluaXRpb25zT3JpZ2luYWwgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jYXRhbG9nRGVmaW5pdGlvbnMpO1xyXG4gICAgdGhpcy5fY2F0YWxvZ0RlZmluaXRpb25zLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9jYXRhbG9nRGVmaW5pdGlvbnMgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9leHRlcm5hbFNvdXJjZXNPcmlnaW5hbCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2V4dGVybmFsU291cmNlcyk7XHJcbiAgICB0aGlzLl9leHRlcm5hbFNvdXJjZXMubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldEV4dGVybmFsU291cmNlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhdGFsb2dEZWZpbml0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2NhdGFsb2dEZWZpbml0aW9uc09yaWdpbmFsKTtcclxuICAgIHRoaXMuX2NhdGFsb2dEZWZpbml0aW9uc09yaWdpbmFsLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9jYXRhbG9nRGVmaW5pdGlvbnNPcmlnaW5hbCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuX2V4dGVybmFsU291cmNlcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2V4dGVybmFsU291cmNlc09yaWdpbmFsKTtcclxuICAgIHRoaXMuX2V4dGVybmFsU291cmNlc09yaWdpbmFsLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZUV4dGVybmFsU291cmNlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9jYXRhbG9nRGVmaW5pdGlvbnMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZXh0ZXJuYWxTb3VyY2VzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9jYXRhbG9nRGVmaW5pdGlvbnMgPSBhd2FpdCB0aGlzLmdldENhdGFsb2dEZWZpbml0aW9uc0xpc3QoKTtcclxuICAgIGlmICh0aGlzLl9jYXRhbG9nRGVmaW5pdGlvbnMpIHtcclxuICAgICAgZm9yIChjb25zdCBjYXRhbG9nSXRlbSBvZiB0aGlzLl9jYXRhbG9nRGVmaW5pdGlvbnMpIHtcclxuICAgICAgICBpZiAoY2F0YWxvZ0l0ZW0uZXh0ZXJuYWxTb3VyY2VJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY29uc3QgZXh0ZXJuYWxEYXRhOiBFeHRlcm5hbFNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0RXh0ZXJuYWxTb3VyY2UoY2F0YWxvZ0l0ZW0uZXh0ZXJuYWxTb3VyY2VJZCk7XHJcbiAgICAgICAgICBpZiAoZXh0ZXJuYWxEYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dGVybmFsU291cmNlcy5wdXNoKGV4dGVybmFsRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFydGljbGVFeHRlbmRlZChhcnRpY2xlTnVtYmVyOiBzdHJpbmcpOiBQcm9taXNlPEFydGljbGVFeHRlbmRlZD4ge1xyXG4gICAgY29uc3QgcmVxdWVzdE9iamVjdDogQXJ0aWNsZUV4dGVuZGVkUmVxdWVzdCA9IG5ldyBBcnRpY2xlRXh0ZW5kZWRSZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0T2JqZWN0LmFydGljbGVOdW1iZXIgPSBhcnRpY2xlTnVtYmVyO1xyXG4gICAgY29uc3QgcmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuYXJ0aWNsZUFwaS5zZWFyY2hBcnRpY2xlcyhyZXF1ZXN0T2JqZWN0LCB0cnVlKTtcclxuICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIGlmIChyZXN1bHQucmVzdWx0T2JqZWN0cyAmJiByZXN1bHQucmVzdWx0T2JqZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEFydGljbGVFeHRlbmRlZCwgcmVzdWx0LnJlc3VsdE9iamVjdHNbMF0pIGFzIHVua25vd24gYXMgQXJ0aWNsZUV4dGVuZGVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgYXN5bmMgYWRkVG9DYXJ0KGdvb2RJZDogbnVtYmVyLCBnb29kVHlwZTogR29vZFR5cGUsIGluc3RhbmNlSWQ6IG51bWJlciwgc2Vzc2lvbklkOiBzdHJpbmcsIHF1YW50aXR5OiBudW1iZXIgPSAxKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgLy8gICBjb25zdCBqc29uOiBzdHJpbmcgPSBhd2FpdCB0aGlzLl9nZXRKU09ORnJvbUFydGljbGVPYmplY3QoZ29vZElkLCBnb29kVHlwZSwgaW5zdGFuY2VJZCwgc2Vzc2lvbklkLCBxdWFudGl0eSk7XHJcbiAgLy8gICB0aGlzLl9hcHBFdmVudFNlcnZpY2UuYWRkVG9DYXJ0Lm5leHQoe2FydGljbGU6IGpzb24sIHF1YW50aXR5OiAxfSk7XHJcbiAgLy8gfVxyXG4gIC8vXHJcbiAgLy8gcHJpdmF0ZSBhc3luYyBfZ2V0SlNPTkZyb21BcnRpY2xlT2JqZWN0KGdvb2RJZDogbnVtYmVyLCBnb29kVHlwZTogR29vZFR5cGUsIGluc3RhbmNlSWQ6IG51bWJlciwgc2Vzc2lvbklkOiBzdHJpbmcsIHF1YW50aXR5OiBudW1iZXIgPSAxKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAvLyAgIGNvbnN0IGNvbmZpZ3VyYXRvclN0YXRpc3RpY3MgPSBuZXcgQ29uZmlndXJhdG9yU3RhdGlzdGljc0Vudmlyb25tZW50KCk7XHJcbiAgLy8gICBjb25maWd1cmF0b3JTdGF0aXN0aWNzLnVzZXJUeXBlID0gJ0hvbWVkZWNvcmF0b3InO1xyXG4gIC8vICAgY29uZmlndXJhdG9yU3RhdGlzdGljcy50cmFuc2FjdGlvblR5cGUgPSAnU2FsZXMnO1xyXG4gIC8vICAgY29uZmlndXJhdG9yU3RhdGlzdGljcy5hY3Rpb25Eb21haW4gPSAnSG9tZWRlY29yYXRvcic7XHJcbiAgLy8gICBjb25maWd1cmF0b3JTdGF0aXN0aWNzLnNlc3Npb25JZCA9IHNlc3Npb25JZDtcclxuICAvLyAgIGNvbmZpZ3VyYXRvclN0YXRpc3RpY3Mud2ViSG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xyXG4gIC8vICAgY29uZmlndXJhdG9yU3RhdGlzdGljcy5idW5kbGVIb3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XHJcbiAgLy8gICByZXR1cm4gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldEpzb25BcnRpY2xlRmxhdFRyZWUoZ29vZElkLCBnb29kVHlwZSwgcXVhbnRpdHksIHRydWUsIGluc3RhbmNlSWQsIGNvbmZpZ3VyYXRvclN0YXRpc3RpY3MpO1xyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UHVibGljYXRpb25Db2RlRm9yUm9sZShyb2xlOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX3B1YmxpY2F0aW9uQ29kZUZvclVzZXJSb2xlLmhhcyhyb2xlKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fcHVibGljYXRpb25Db2RlRm9yVXNlclJvbGUuZ2V0KHJvbGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
732
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZWRlY29yYXRvci1jb25uZWN0b3ItYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItY29ubmVjdG9yLWFkYXB0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHN0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBRTFFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUMvRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdEUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx3REFBd0QsQ0FBQztBQUd0RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFHdkQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDO0FBQ3ZHLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdURBQXVELENBQUM7QUFDbEYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sK0RBQStELENBQUM7QUFDcEcsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBRTNFLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDO0FBRTFHLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHdEQUF3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QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQge0Fuc3dlcn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hbnN3ZXInO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9zZWxlY3Rpb24nO1xyXG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uJztcclxuaW1wb3J0IHtBbnN3ZXJQcmljZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hbnN3ZXItcHJpY2UnO1xyXG5pbXBvcnQge0FydGljbGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZSc7XHJcbmltcG9ydCB7RGVjb05vZGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvZGVjby1ub2RlJztcclxuaW1wb3J0IHtTa2lwQnV0dG9uSW5mb30gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9za2lwLWJ1dHRvbi1pbmZvJztcclxuaW1wb3J0IHtDb25maWd1cmF0b3JTdGF0aXN0aWNzRW52aXJvbm1lbnR9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvY29uZmlndXJhdG9yLXN0YXRpc3RpY3MtZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge09wdGlvbnN9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL29wdGlvbnMnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRvcn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaSc7XHJcbmltcG9ydCB7SW50ZXJuYWxQYXJhbX0gZnJvbSAnQGNvbGlqbml0L21haW5hcGkvYnVpbGQvZW51bS9pbnRlcm5hbC1wYXJhbS5lbnVtJztcclxuaW1wb3J0IHtRdWVzdGlvbkFuZEFuc3dlcnN9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvcXVlc3Rpb24tYW5kLWFuc3dlcnMnO1xyXG5pbXBvcnQge01haW5BcGl9IGZyb20gJ0Bjb2xpam5pdC9tYWluYXBpJztcclxuaW1wb3J0IHtEYXRhU2VydmljZVJlc3BvbnNlRGF0YX0gZnJvbSAnQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvZGF0YS1zZXJ2aWNlLXJlc3BvbnNlLWRhdGEnO1xyXG5pbXBvcnQge0FydGljbGVzfSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9hcnRpY2xlcyc7XHJcbmltcG9ydCB7QXJ0aWNsZVRleHR9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZS10ZXh0LmJvJztcclxuaW1wb3J0IHtCdXNpbmVzc09iamVjdEZhY3Rvcnl9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL3NlcnZpY2UvYnVzaW5lc3Mtb2JqZWN0LWZhY3RvcnknO1xyXG5pbXBvcnQge0ltYWdlVXRpbHN9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL3V0aWxzL2ltYWdlLXV0aWxzJztcclxuaW1wb3J0IHtFeHRlcm5hbENhdGFsb2dTdGFydHVwSW5mb1JlcXVlc3R9IGZyb20gJ0Bjb2xpam5pdC9hcnRpY2xlYXBpL2J1aWxkL21vZGVsL2V4dGVybmFsLWNhdGFsb2ctc3RhcnR1cC1pbmZvLXJlcXVlc3QnO1xyXG5pbXBvcnQge0V4dGVybmFsQ2F0YWxvZ1N0YXJ0dXBJbmZvfSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9tb2RlbC9leHRlcm5hbC1jYXRhbG9nLXN0YXJ0dXAtaW5mbyc7XHJcbmltcG9ydCB7TG9naW5SZXNwb25zZX0gZnJvbSAnQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvbG9naW4tcmVzcG9uc2UnO1xyXG5pbXBvcnQge0NhdGFsb2dEZWZpbml0aW9ufSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9tb2RlbC9jYXRhbG9nLWRlZmluaXRpb24uYm8nO1xyXG5pbXBvcnQge0V4dGVybmFsU291cmNlfSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9tb2RlbC9leHRlcm5hbC1zb3VyY2UuYm8nO1xyXG5pbXBvcnQge0FydGljbGVGdWxsT2JqZWN0fSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9tb2RlbC9hcnRpY2xlLWZ1bGwtb2JqZWN0JztcclxuaW1wb3J0IHtBcnRpY2xlQ2F0ZWdvcnl9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZS1jYXRlZ29yeSc7XHJcbmltcG9ydCB7QXJ0aWNsZUZsYXR9IGZyb20gJ0Bjb2xpam5pdC9hcnRpY2xlYXBpL2J1aWxkL21vZGVsL2FydGljbGUtZmxhdC5ibyc7XHJcbmltcG9ydCB7VXNlclJvbGVUeXBlfSBmcm9tICcuLi9lbnVtL3VzZXItcm9sZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBFdmVudFNlcnZpY2V9IGZyb20gJy4vaG9tZWRlY29yYXRvci1hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7Q29Eb21haW5WYWx1ZX0gZnJvbSAnQGNvbGlqbml0L21haW5hcGkvYnVpbGQvbW9kZWwvY28tZG9tYWluLXZhbHVlLmJvJztcclxuaW1wb3J0IHtEb21haW5OYW1lfSBmcm9tICdAY29saWpuaXQvbWFpbmFwaS9idWlsZC9lbnVtL2RvbWFpbi1uYW1lLmVudW0nO1xyXG5pbXBvcnQge09iamVjdENvbmZpZ3VyYXRpb259IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL29iamVjdC1jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHtBcnRpY2xlRXh0ZW5kZWRSZXF1ZXN0fSBmcm9tICdAY29saWpuaXQvYXJ0aWNsZWFwaS9idWlsZC9tb2RlbC9hcnRpY2xlLWV4dGVuZGVkLXJlcXVlc3QnO1xyXG5pbXBvcnQge0FydGljbGVFeHRlbmRlZH0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZS1leHRlbmRlZC5ibyc7XHJcbmltcG9ydCB7TWV0YWRhdGF9IGZyb20gJy4uLy4uL3BsdWdpbnMvY29yZTNkL2l0ZW1zL21ldGFkYXRhJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3N9IGZyb20gJy4uL21vZGVsL2hvbWVkZWNvcmF0b3Itc2V0dGluZ3MnO1xyXG5pbXBvcnQge0NvRG9jdW1lbnR9IGZyb20gJ0Bjb2xpam5pdC9tYWluYXBpL2J1aWxkL21vZGVsL2NvLWRvY3VtZW50JztcclxuaW1wb3J0IHtTZWxlY3RvclN0cnVjdHVyZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9zZWxlY3Rvci1zdHJ1Y3R1cmUuYm8nO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV4dGVybmFsQ29ubmVjdG9yIHtcclxuICBwdWJsaWMgbG9naW5SZXNwb25zZTogTG9naW5SZXNwb25zZTtcclxuICBwdWJsaWMgY29ubmVjdG9yOiBDb25uZWN0b3I7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdG9yIHtcclxuICBjb25uZWN0b3I/OiBDb25maWd1cmF0b3I7XHJcbiAgYXJ0aWNsZUFwaT86IEFydGljbGVzO1xyXG4gIG1haW5BcGk/OiBNYWluQXBpO1xyXG59XHJcblxyXG4vLyBTb2xlIHJlc3BvbnNpYmlsaXR5IGlzIHNpbXBseSB0byB3cmFwIGFyb3VuZCBhIGNvbGlqbi5Db25uZWN0b3IgdG8gY3JlYXRlIGEgc3RhYmxlIGlubmVyIGludGVyZmFjZSB0byB0aGUgbGlicmFyeSBpbiBhIDE6MSBtZXRob2Qgd2F5LlxyXG4vLyBPbmx5IHRvIGJlIHVzZWQgYnkgdGhlIElPbmVDb250cm9sbGVyU2VydmljZS5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgSG9tZWRlY29yYXRvckNvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgcXVlc3Rpb25SZWNlaXZlZDogU3ViamVjdDxRdWVzdGlvbj4gPSBuZXcgU3ViamVjdDxRdWVzdGlvbj4oKTtcclxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd0xvYWRlcjogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25SZXNldDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIHB1YmxpYyBtYWluVXJsOiBzdHJpbmc7XHJcbiAgcHVibGljIG1haW5TY2hlbWE6IHN0cmluZztcclxuICBwdWJsaWMgbWFpblZlcnNpb246IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBfcHVibGljYXRpb25Db2RlRm9yVXNlclJvbGU6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPihbXHJcbiAgICBbVXNlclJvbGVUeXBlLkN1c3RvbWVyLCAxNl0sXHJcbiAgICBbVXNlclJvbGVUeXBlLkVtcGxveWVlLCAxXVxyXG4gIF0pO1xyXG5cclxuICBwdWJsaWMgZ2V0IGNvbm5lY3RvcigpOiBDb25maWd1cmF0b3Ige1xyXG4gICAgaWYgKCF0aGlzLmV4dGVybmFsU291cmNlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0b3I7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JzW3RoaXMuZXh0ZXJuYWxTb3VyY2VdID8gdGhpcy5jb25uZWN0b3JzW3RoaXMuZXh0ZXJuYWxTb3VyY2VdLmNvbm5lY3Rvci5jb25uZWN0b3IgOiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhcnRpY2xlQXBpKCk6IEFydGljbGVzIHtcclxuICAgIGlmICghdGhpcy5leHRlcm5hbFNvdXJjZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fYXJ0aWNsZUFwaTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RvcnNbdGhpcy5leHRlcm5hbFNvdXJjZV0gPyB0aGlzLmNvbm5lY3RvcnNbdGhpcy5leHRlcm5hbFNvdXJjZV0uY29ubmVjdG9yLmFydGljbGVBcGkgOiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBtYWluQXBpKCk6IE1haW5BcGkge1xyXG4gICAgaWYgKCF0aGlzLmV4dGVybmFsU291cmNlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9tYWluQXBpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yc1t0aGlzLmV4dGVybmFsU291cmNlXSA/IHRoaXMuY29ubmVjdG9yc1t0aGlzLmV4dGVybmFsU291cmNlXS5jb25uZWN0b3IubWFpbkFwaSA6IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29ubmVjdG9yczogRXh0ZXJuYWxDb25uZWN0b3IgPSBuZXcgRXh0ZXJuYWxDb25uZWN0b3IoKTtcclxuICBwdWJsaWMgZXh0ZXJuYWxTb3VyY2U6IHN0cmluZztcclxuICBwdWJsaWMgbG9naW5SZXNwb25zZTogTG9naW5SZXNwb25zZTtcclxuXHJcbiAgcHJpdmF0ZSBfY2F0YWxvZ0RlZmluaXRpb25zOiBDYXRhbG9nRGVmaW5pdGlvbltdO1xyXG4gIHByaXZhdGUgX2V4dGVybmFsU291cmNlczogRXh0ZXJuYWxTb3VyY2VbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2NhdGFsb2dEZWZpbml0aW9uc09yaWdpbmFsOiBDYXRhbG9nRGVmaW5pdGlvbltdO1xyXG4gIHByaXZhdGUgX2V4dGVybmFsU291cmNlc09yaWdpbmFsOiBFeHRlcm5hbFNvdXJjZVtdID0gW107XHJcbiAgcHJpdmF0ZSBfY29ubmVjdG9yPzogQ29uZmlndXJhdG9yO1xyXG4gIHByaXZhdGUgX2FydGljbGVBcGk6IEFydGljbGVzO1xyXG4gIHByaXZhdGUgX21haW5BcGk6IE1haW5BcGk7XHJcbiAgcHJpdmF0ZSBfYm9GYWN0b3J5OiBCdXNpbmVzc09iamVjdEZhY3RvcnkgPSBuZXcgQnVzaW5lc3NPYmplY3RGYWN0b3J5KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfYXBwRXZlbnRTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdENvbm5lY3Rpb25Gcm9tTWV0YWRhdGEobWV0YWRhdGE6IE1ldGFkYXRhLCBzZXR0aW5nczogSG9tZWRlY29yYXRvclNldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmluaXRDb25uZWN0b3IoXHJcbiAgICAgIG1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MgPyBtZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLnNldHRpbmdzIDogc2V0dGluZ3MsXHJcbiAgICAgIG1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MgPyBtZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLm5hbWUgOiB1bmRlZmluZWQsXHJcbiAgICAgIGZhbHNlLFxyXG4gICAgICBtZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzICYmIG1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MuZXh0ZXJuYWxTb3VyY2VJZCA/IG1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MuZXh0ZXJuYWxTb3VyY2VJZCA6IG51bGxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdENvbm5lY3RvcihvcHRpb25zOiBPcHRpb25zLCBleHRlcm5hbFNvdXJjZT86IHN0cmluZywgZm9yY2VSZWxvYWQ/OiBib29sZWFuLCBleHRlcm5hbFNvdXJjZUlkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoZXh0ZXJuYWxTb3VyY2UgPT09IHVuZGVmaW5lZCB8fCBleHRlcm5hbFNvdXJjZSA9PT0gbnVsbCkge1xyXG4gICAgICBjb25zdCByZW5ld0Nvbm5lY3RvcjogYm9vbGVhbiA9ICh0aGlzLl9jb25uZWN0b3IgPyB0aGlzLl9jb25uZWN0b3IudXJsICE9PSBvcHRpb25zLnVybCA6IGZhbHNlKSB8fCBmb3JjZVJlbG9hZDtcclxuICAgICAgaWYgKCF0aGlzLl9jb25uZWN0b3IgfHwgcmVuZXdDb25uZWN0b3IpIHtcclxuICAgICAgICB0aGlzLl9jb25uZWN0b3IgPSBuZXcgQ29uZmlndXJhdG9yKG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMubG9naW5SZXNwb25zZSA9IGF3YWl0IHRoaXMuX2Nvbm5lY3Rvci5jb25uZWN0KCk7XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdG9yLnNob3dMb2FkZXIuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMuc2hvd0xvYWRlci5uZXh0KHZhbHVlKSk7XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdG9yLmNvbm5lY3Rpb25SZXNldEluYWN0aXZpdHkuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMuY29ubmVjdGlvblJlc2V0Lm5leHQoKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLl9hcnRpY2xlQXBpIHx8IHJlbmV3Q29ubmVjdG9yKSB7XHJcbiAgICAgICAgdGhpcy5fYXJ0aWNsZUFwaSA9IG5ldyBBcnRpY2xlcyhvcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuX21haW5BcGkgfHwgcmVuZXdDb25uZWN0b3IpIHtcclxuICAgICAgICB0aGlzLl9tYWluQXBpID0gbmV3IE1haW5BcGkob3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5leHRlcm5hbFNvdXJjZSA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5jb25uZWN0b3JzLmhhc093blByb3BlcnR5KGV4dGVybmFsU291cmNlKSkge1xyXG4gICAgICAgIGlmIChleHRlcm5hbFNvdXJjZUlkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gc2V0IHRoaXMuZXh0ZXJuYWxTb3VyY2UgPSB1bmRlZmluZWQgdG8gZ2V0IHRoZSBkYXRhIG9mIHRoZSBIT1NUIGFuZCBub3QgdGhlIHByZXZpb3VzIGV4dGVybmFsIHNvdXJjZVxyXG4gICAgICAgICAgdGhpcy5leHRlcm5hbFNvdXJjZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIGNvbnN0IGV4dGVybmFsU291cmNlRGF0YTogRXh0ZXJuYWxTb3VyY2UgPSB0aGlzLmdldEV4dGVybmFsU291cmNlRnJvbUlkKGV4dGVybmFsU291cmNlSWQpO1xyXG4gICAgICAgICAgaWYgKGV4dGVybmFsU291cmNlRGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoZXh0ZXJuYWxTb3VyY2VEYXRhLnBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgZXh0ZXJuYWxTb3VyY2VEYXRhLnVzZXJuYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBvcHRpb25zLnBhc3N3b3JkID0gZXh0ZXJuYWxTb3VyY2VEYXRhLnBhc3N3b3JkO1xyXG4gICAgICAgICAgICAgIG9wdGlvbnMudXNlcm5hbWUgPSBleHRlcm5hbFNvdXJjZURhdGEudXNlcm5hbWU7XHJcbiAgICAgICAgICAgICAgb3B0aW9ucy51c2VMb2dpbkVuY3J5cHRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFeHRlcm5hbCBzb3VyY2Ugd2l0aCBpZCAke2V4dGVybmFsU291cmNlSWR9IG5vdCBmb3VuZCFgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxNYWluQXBpOiBNYWluQXBpID0gbmV3IE1haW5BcGkob3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgbG9naW5SZXNwb25zZTogTG9naW5SZXNwb25zZSA9IGF3YWl0IGV4dGVybmFsTWFpbkFwaS5jb25uZWN0KHRoaXMubWFpblVybCwgdGhpcy5tYWluU2NoZW1hLCB0aGlzLm1haW5WZXJzaW9uKS5jYXRjaChlID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxWZXJzaW9uOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IGV4dGVybmFsTWFpbkFwaS5nZXRQdWJsaWNQYXJhbXMoK29wdGlvbnMuc2NoZW1hKS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGV4dGVybmFsVmVyc2lvbiAmJiBleHRlcm5hbFZlcnNpb25bJ2NhdGFsb2dTZXR0aW5ncyddICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNvbnN0IGNhdGFsb2dTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXh0ZXJuYWxWZXJzaW9uWydjYXRhbG9nU2V0dGluZ3MnXSk7XHJcbiAgICAgICAgICBvcHRpb25zLnZlcnNpb24gPSBjYXRhbG9nU2V0dGluZ3MudmVyc2lvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxDb25maWd1cmF0b3I6IENvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3Iob3B0aW9ucyk7XHJcbiAgICAgICAgLy8gY29uc3QgbG9naW5SZXNwb25zZTogTG9naW5SZXNwb25zZSA9IGF3YWl0IGV4dGVybmFsQ29uZmlndXJhdG9yLmNvbm5lY3QoKS5jYXRjaChlID0+IHtcclxuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgICAgIC8vICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgaWYgKGxvZ2luUmVzcG9uc2UpIHtcclxuICAgICAgICAgIGNvbnN0IGV4dGVybmFsQXJ0aWNsZUFwaTogQXJ0aWNsZXMgPSBuZXcgQXJ0aWNsZXMob3B0aW9ucyk7XHJcbiAgICAgICAgICBleHRlcm5hbENvbmZpZ3VyYXRvci5zaG93TG9hZGVyLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnNob3dMb2FkZXIubmV4dCh2YWx1ZSkpO1xyXG4gICAgICAgICAgZXh0ZXJuYWxDb25maWd1cmF0b3IuY29ubmVjdGlvblJlc2V0SW5hY3Rpdml0eS5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy5jb25uZWN0aW9uUmVzZXQubmV4dCgpKTtcclxuICAgICAgICAgIGNvbnN0IGV4dGVybmFsQ29ubmVjdG9yOiBFeHRlcm5hbENvbm5lY3RvciA9IG5ldyBFeHRlcm5hbENvbm5lY3RvcigpO1xyXG4gICAgICAgICAgZXh0ZXJuYWxDb25uZWN0b3IubG9naW5SZXNwb25zZSA9IGxvZ2luUmVzcG9uc2U7XHJcbiAgICAgICAgICBleHRlcm5hbENvbm5lY3Rvci5jb25uZWN0b3IgPSB7Y29ubmVjdG9yOiBleHRlcm5hbENvbmZpZ3VyYXRvciwgbWFpbkFwaTogZXh0ZXJuYWxNYWluQXBpLCBhcnRpY2xlQXBpOiBleHRlcm5hbEFydGljbGVBcGl9O1xyXG4gICAgICAgICAgdGhpcy5jb25uZWN0b3JzW2V4dGVybmFsU291cmNlXSA9IGV4dGVybmFsQ29ubmVjdG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmV4dGVybmFsU291cmNlID0gZXh0ZXJuYWxTb3VyY2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9nT3V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0b3IubG9nT3V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UHVibGljYXRpb25Db2RlQmFzZWRPbkxvZ2luKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcm9sOiBzdHJpbmc7XHJcbiAgICBpZiAodGhpcy5leHRlcm5hbFNvdXJjZSkge1xyXG4gICAgICBpZiAodGhpcy5jb25uZWN0b3JzLmhhc093blByb3BlcnR5KHRoaXMuZXh0ZXJuYWxTb3VyY2UpKSB7XHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxDb25uZWN0b3IgPSB0aGlzLmNvbm5lY3RvcnNbdGhpcy5leHRlcm5hbFNvdXJjZV07XHJcbiAgICAgICAgaWYgKGV4dGVybmFsQ29ubmVjdG9yICYmIGV4dGVybmFsQ29ubmVjdG9yLmxvZ2luUmVzcG9uc2UpIHtcclxuICAgICAgICAgIHJvbCA9IGV4dGVybmFsQ29ubmVjdG9yLmxvZ2luUmVzcG9uc2Uucm9sO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubG9naW5SZXNwb25zZSkge1xyXG4gICAgICAgIHJvbCA9IHRoaXMubG9naW5SZXNwb25zZS5yb2w7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChyb2wpIHtcclxuICAgICAgY29uc3QgcHViQ29kZTogbnVtYmVyID0gdGhpcy5fZ2V0UHVibGljYXRpb25Db2RlRm9yUm9sZShyb2wpO1xyXG4gICAgICBpZiAocHViQ29kZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBwdWJDb2RlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gMjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRXZWJWaWV3U3RhcnR1cEluZm8ocmVxdWVzdDogRXh0ZXJuYWxDYXRhbG9nU3RhcnR1cEluZm9SZXF1ZXN0KTogUHJvbWlzZTxFeHRlcm5hbENhdGFsb2dTdGFydHVwSW5mbz4ge1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldFdlYnZpZXdTdGFydHVwSW5mbyhyZXF1ZXN0KTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEV4dGVybmFsQ2F0YWxvZ1N0YXJ0dXBJbmZvLCByZXNwb25zZS5yZXN1bHRPYmplY3QpIGFzIHVua25vd24gYXMgRXh0ZXJuYWxDYXRhbG9nU3RhcnR1cEluZm87XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRHb29kSWRGcm9tQXJ0aWNsZU5yKHNrdTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuYXJ0aWNsZUFwaS5nZXRHb29kSWRGcm9tQXJ0aWNsZU5yKHNrdSk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHRPYmplY3Q7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0Tm9kZUluc3RhbmNlKGdvb2RJZDogbnVtYmVyLCBzaG93QW1vdW50RmllbGQ6IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmluaXROb2RlSW5zdGFuY2UoZ29vZElkLCBzaG93QW1vdW50RmllbGQpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoYW5nZUNvbm5lY3Rpb24oaW5zdGFuY2VJZDogc3RyaW5nLCBvbGRDb25uZWN0aW9uOiBzdHJpbmcsIG5ld0Nvbm5lY3Rpb246IHN0cmluZyk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5jaGFuZ2VDb25uZWN0aW9uKGluc3RhbmNlSWQsIG9sZENvbm5lY3Rpb24sIG5ld0Nvbm5lY3Rpb24pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvcHlJbnN0YW5jZShpbnN0YW5jZUlkOiBzdHJpbmcsIHNob3VsZFNhdmVDdXJyZW50SW5zdGFuY2VJZDogYm9vbGVhbik6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5jb3B5SW5zdGFuY2UoaW5zdGFuY2VJZCwgc2hvdWxkU2F2ZUN1cnJlbnRJbnN0YW5jZUlkKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzYXZlQ29uZmlndXJhdGlvbnMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rvci5zYXZlQ29uZmlndXJhdGlvbnMoKS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIHNhdmUgZXh0ZXJuYWwgc291cmNlc1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmNvbm5lY3RvcnMpIHtcclxuICAgICAgICBpZiAodGhpcy5jb25uZWN0b3JzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgIGNvbnN0IGNvbm5lY3RvciA9IHRoaXMuY29ubmVjdG9yc1trZXldLmNvbm5lY3Rvci5jb25uZWN0b3I7XHJcbiAgICAgICAgICBhd2FpdCBjb25uZWN0b3Iuc2F2ZUNvbmZpZ3VyYXRpb25zKCkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQHJldHVybnMgVGhlIGluaXRpYWwgYXJ0aWNsZVxyXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlKHNrdTogc3RyaW5nLCBicmFuY2g6IHN0cmluZyk6IFByb21pc2U8QXJ0aWNsZT4ge1xyXG4gICAgY29uc3QgZ29vZElkOiBudW1iZXIgPSBhd2FpdCB0aGlzLmdldEdvb2RJZEZyb21BcnRpY2xlTnIoc2t1KTtcclxuICAgIGlmIChnb29kSWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0QXJ0aWNsZVF1aWNrU2VsKGdvb2RJZCwgYnJhbmNoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFydGljbGVRdWlja1NlbChnb29kSWQ6IG51bWJlciwgYnJhbmNoOiBzdHJpbmcpOiBQcm9taXNlPEFydGljbGU+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuYXJ0aWNsZUFwaS5nZXRBcnRpY2xlUXVpY2tTZWwoZ29vZElkLCBicmFuY2gpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQXJ0aWNsZSwgcmVzcG9uc2UucmVzdWx0T2JqZWN0Lm9BcnRpY2xlWzBdKSBhcyBBcnRpY2xlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIGxvYWRTZWxlY3Rpb25zKCk6IHZvaWQge1xyXG4gIC8vICAgdGhpcy5jb25uZWN0b3IuZ2V0U2VsZWN0aW9ucygpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHVibGljIGdldFF1ZXN0aW9uQW5kQW5zd2VycygpOiB2b2lkIHtcclxuICAvLyAgIHRoaXMuY29ubmVjdG9yLmdldFF1ZXN0aW9uQW5kQW5zd2VycygpO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIGdldFF1ZXN0aW9uQW5kQW5zd2Vyc0FzeW5jKCk6IFByb21pc2U8UXVlc3Rpb25BbmRBbnN3ZXJzPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0U2VsZWN0aW9uc0FzeW5jKCk6IFByb21pc2U8U2VsZWN0aW9uW10+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFNlbGVjdGlvbnMoKTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KFNlbGVjdGlvbiwgcmVzcG9uc2UucmVzdWx0T2JqZWN0cykgYXMgU2VsZWN0aW9uW107XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERlY29zQXN5bmMoKTogUHJvbWlzZTxEZWNvTm9kZVtdPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXREZWNvcygpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoRGVjb05vZGUsIHJlc3BvbnNlLnJlc3VsdE9iamVjdHMpIGFzIERlY29Ob2RlW107XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFuc3dlclByaWNlcygpOiBQcm9taXNlPEFuc3dlclByaWNlW10+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldEFuc3dlcnNQcmljZXMoKTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KEFuc3dlclByaWNlLCByZXNwb25zZS5yZXN1bHRPYmplY3RzKSBhcyBBbnN3ZXJQcmljZVtdO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRKc29uQ29uZmlndXJlZEFydGljbGVzKGdvb2RJZDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RUeXBlOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFNvdXJjZTogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ/OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdG9yU3RhdGlzdGljcz86IENvbmZpZ3VyYXRvclN0YXRpc3RpY3NFbnZpcm9ubWVudCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHJldHVybiB0aGlzLmFydGljbGVBcGkuZ2V0SnNvbkFydGljbGVGbGF0VHJlZShnb29kSWQsIGdvb2RUeXBlLCBxdWFudGl0eSwgZXh0ZXJuYWxTb3VyY2UsIHNob3dMb2FkZXIsIGluc3RhbmNlSWQudG9TdHJpbmcoKSwgY29uZmlndXJhdG9yU3RhdGlzdGljcyk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgZ2V0SnNvbk1hdGNoVGFibGVBcnRpY2xlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRKc29uTWF0Y2hUYWJsZUFydGljbGVzKCk7XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0SW5zdGFuY2VUb0NvbmZpZ3VyZShpZDogc3RyaW5nKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKGlkICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnNldEluc3RhbmNlVG9Db25maWd1cmUoaWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0YVNlcnZpY2VSZXNwb25zZURhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNlbGVjdEFuc3dlcihhbnN3ZXI6IEFuc3dlciwgdXNlcklucHV0Pzogc3RyaW5nKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnNlbGVjdEFuc3dlcihhbnN3ZXIsIGZhbHNlLCB1c2VySW5wdXQpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbEFuc3dlcihnZXRBbnN3ZXJzQW5kUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmNhbmNlbEFuc3dlcigpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuICAgIHB1YmxpYyBhc3luYyBzZWxlY3RBbnN3ZXJCeVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbiwgdXNlcklucHV0Pzogc3RyaW5nKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5zZWxlY3RBbnN3ZXJCeVNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlLCB1c2VySW5wdXQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RTZWxlY3Rpb24oXHJcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbiwgZm9yY2VCYWNrVG9Ob2RlPzogYm9vbGVhbiwgYWZ0ZXI/OiBib29sZWFuLCBjb25uZWN0b3I/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3Iuc2VsZWN0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UsIGZvcmNlQmFja1RvTm9kZSwgYWZ0ZXIsIGNvbm5lY3Rvcik7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmRlbGV0ZVNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcGxhY2VTZWxlY3Rpb24oc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IucmVwbGFjZVNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2VsZWN0b3JTdHJ1Y3R1cmUoc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldFNlbGVjdG9yU3RydWN0dXJlKHNob3dMb2FkZXIpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5hdmlnYXRlVG8oY2hvc2VuT3B0aW9uOiBTZWxlY3RvclN0cnVjdHVyZSwgc2hvd0xvYWRlcjogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5uYXZpZ2F0ZVRvKGNob3Nlbk9wdGlvbi5vcHZUcmVlTm9kZUhpZXJhcmNoeSwgc2hvd0xvYWRlcik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW1hZ2VGb3JTZWxlY3RvclN0cnVjdHVyZShcclxuICAgICAgICBvcHRpb246IFNlbGVjdG9yU3RydWN0dXJlLFxyXG4gICAgICAgIHB1YmxpY2F0aW9uOiBudW1iZXIsXHJcbiAgICAgICAgdGh1bWJOYWlsOiBib29sZWFuID0gdHJ1ZSxcclxuICAgICAgICBzaG93TG9hZGVyOiBib29sZWFuID0gdHJ1ZVxyXG4gICAgKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldFNpbmdsZUltYWdlKG9wdGlvbi5hcnROb2RlSWQsIHB1YmxpY2F0aW9uLCB0cnVlLCB0aHVtYk5haWwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzICYmIHJlc3BvbnNlLnJlc3VsdE9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdE9iamVjdC5maWxlUGF0aCAhPT0gbnVsbCAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QuZmlsZVBhdGggIT09IHVuZGVmaW5lZCAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QuZmlsZVBhdGggIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEltYWdlVXRpbHMuZ2V0Rml4ZWRJbWFnZUZpbGVwYXRoVXJsKHJlc3BvbnNlLnJlc3VsdE9iamVjdC5maWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbWFnZVV0aWxzLmdldERvY0JvZHlXaXRoTWltZVR5cGVEZWZpbml0aW9uKHJlc3BvbnNlLnJlc3VsdE9iamVjdC5maWxlTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJOYWlsID8gcmVzcG9uc2UucmVzdWx0T2JqZWN0LnRodW1ibmFpbEJvZHkgOiByZXNwb25zZS5yZXN1bHRPYmplY3QuZG9jdW1lbnRCb2R5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRJbWFnZUZvckFuc3dlck9yU2VsZWN0aW9uKFxyXG4gICAgYW5zd2VyT3JTZWxlY3Rpb246IEFuc3dlciB8IFNlbGVjdGlvbiwgcHVibGljYXRpb246IG51bWJlciwgdGh1bWJOYWlsOiBib29sZWFuID0gdHJ1ZSwgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldFNpbmdsZUltYWdlKGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCwgcHVibGljYXRpb24sIHRydWUsIHRodW1iTmFpbCk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgICBjb25zdCBjb0RvYzogQ29Eb2N1bWVudCA9IHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKENvRG9jdW1lbnQsIHJlc3BvbnNlLnJlc3VsdE9iamVjdCkgYXMgQ29Eb2N1bWVudDtcclxuICAgICAgICBpZiAoY29Eb2MuZmlsZVBhdGggIT09IG51bGwgJiYgY29Eb2MuZmlsZVBhdGggIT09IHVuZGVmaW5lZCAmJiBjb0RvYy5maWxlUGF0aCAhPT0gJycpIHtcclxuICAgICAgICAgIHJldHVybiBJbWFnZVV0aWxzLmdldEZpeGVkSW1hZ2VGaWxlcGF0aFVybChyZXNwb25zZS5yZXN1bHRPYmplY3QuZmlsZVBhdGgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCByZXNwb25zZVN0cmluZzogc3RyaW5nID0gSW1hZ2VVdGlscy5nZXREb2NCb2R5V2l0aE1pbWVUeXBlRGVmaW5pdGlvbihyZXNwb25zZS5yZXN1bHRPYmplY3QuZmlsZU5hbWUsXHJcbiAgICAgICAgICAgIHRodW1iTmFpbCA/IHJlc3BvbnNlLnJlc3VsdE9iamVjdC50aHVtYm5haWxCb2R5IDogcmVzcG9uc2UucmVzdWx0T2JqZWN0LmRvY3VtZW50Qm9keSk7XHJcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvY1Jlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMubWFpbkFwaS5nZXREb2N1bWVudENvbnRlbnQoY29Eb2MuZG9jdW1lbnRJZCk7XHJcbiAgICAgICAgICAgIGlmIChkb2NSZXNwb25zZSAmJiBkb2NSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIGRvY1Jlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiBkb2NSZXNwb25zZS5yZXN1bHRPYmplY3QgJiYgZG9jUmVzcG9uc2UucmVzdWx0T2JqZWN0LmRvY3VtZW50Q29udGVudCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBJbWFnZVV0aWxzLmdldERvY0JvZHlXaXRoTWltZVR5cGVEZWZpbml0aW9uKHJlc3BvbnNlLnJlc3VsdE9iamVjdC5maWxlTmFtZSwgZG9jUmVzcG9uc2UucmVzdWx0T2JqZWN0LmRvY3VtZW50Q29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVN0cmluZztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0U2tpcEJ1dHRvbkltYWdlQW5kVGV4dChnb29kSWQ/OiBudW1iZXIpOiBQcm9taXNlPFNraXBCdXR0b25JbmZvPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRTa2lwQnV0dG9uSW1hZ2VBbmRUZXh0KGdvb2RJZCwgZmFsc2UpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoU2tpcEJ1dHRvbkluZm8sIHJlc3BvbnNlLnJlc3VsdE9iamVjdCkgYXMgU2tpcEJ1dHRvbkluZm87XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TW9vZEltYWdlRm9yQW5zd2VyU2VsZWN0aW9uKGFuc3dlck9yU2VsZWN0aW9uOiBBbnN3ZXIgfCBTZWxlY3Rpb24sIHRodW1iTmFpbDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0SW1hZ2VGb3JBbnN3ZXJPclNlbGVjdGlvbihhbnN3ZXJPclNlbGVjdGlvbiwgMzIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFuc3dlckluZm8oYW5zd2VyOiBBbnN3ZXIpOiBQcm9taXNlPEFydGljbGVUZXh0W10+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldEFuc3dlclRleHRzKGFuc3dlci5ub2RlSWQsIGZhbHNlKTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KEFydGljbGVUZXh0LCByZXNwb25zZS5yZXN1bHRPYmplY3QpIGFzIEFydGljbGVUZXh0W107XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEludGVybmFsUGFyYW1ldGVyKHBhcmFtZXRlcjogSW50ZXJuYWxQYXJhbSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLm1haW5BcGkuZ2V0SW50ZXJuYWxQYXJhbWV0ZXJWYWx1ZShwYXJhbWV0ZXIpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0T2JqZWN0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHN0b3JlM0RNb2RlbENETihmaWxlbmFtZTogc3RyaW5nLCBmaWxlQ29udGVudHM6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLm1haW5BcGkudXBsb2FkTW9kZWxUb0NETihmaWxlbmFtZSwgZmlsZUNvbnRlbnRzKTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgICAgfSBlbHNlIGlmICghcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQubWVzc2FnZXNbMF0ubWVzc2FnZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Q2F0YWxvZ0RlZmluaXRpb25zTGlzdCgpOiBQcm9taXNlPENhdGFsb2dEZWZpbml0aW9uW10+IHtcclxuICAgIGlmICghdGhpcy5hcnRpY2xlQXBpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuYXJ0aWNsZUFwaS5nZXRDYXRhbG9nRGVmaW5pdGlvbnMoKS5jYXRjaChlID0+IHtcclxuICAgICAgcmV0dXJuIG5ldyBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSgpO1xyXG4gICAgfSk7XHJcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KENhdGFsb2dEZWZpbml0aW9uLCByZXNwb25zZS5yZXN1bHRPYmplY3RzKSBhcyBDYXRhbG9nRGVmaW5pdGlvbltdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RXh0ZXJuYWxTb3VyY2UoZXh0ZXJuYWxTb3VyY2VJZDogbnVtYmVyKTogUHJvbWlzZTxFeHRlcm5hbFNvdXJjZT4ge1xyXG4gICAgaWYgKCFleHRlcm5hbFNvdXJjZUlkKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLmdldEV4dGVybmFsU291cmNlKGV4dGVybmFsU291cmNlSWQpO1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoRXh0ZXJuYWxTb3VyY2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdCkgYXMgRXh0ZXJuYWxTb3VyY2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IocmVzcG9uc2UgJiYgcmVzcG9uc2UubWVzc2FnZSA/IHJlc3BvbnNlLm1lc3NhZ2UgOiAnRXJyb3IgcmV0cmlldmluZyBleHRlcm5hbCBzb3VyY2UnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBhc3luYyBnZXRFeHRlcm5hbFNvdXJjZXNCeUdyb3VwKGdyb3VwOiBFeHRlcm5hbFNvdXJjZUdyb3VwKTogUHJvbWlzZTxFeHRlcm5hbFNvdXJjZVtdPiB7XHJcbiAgLy8gICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmFydGljbGVBcGkuZ2V0RXh0ZXJuYWxTb3VyY2VzQnlHcm91cChncm91cCk7XHJcbiAgLy8gICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAvLyAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdE9iamVjdCkge1xyXG4gIC8vICAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShFeHRlcm5hbFNvdXJjZSwgcmVzcG9uc2UucmVzdWx0T2JqZWN0cykgYXMgRXh0ZXJuYWxTb3VyY2VbXTtcclxuICAvLyAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICByZXR1cm4gbnVsbDtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZSAmJiByZXNwb25zZS5tZXNzYWdlID8gcmVzcG9uc2UubWVzc2FnZSA6ICdFcnJvciByZXRyaWV2aW5nIGV4dGVybmFsIHNvdXJjZScpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFydGljbGVGdWxsT2JqZWN0KGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxBcnRpY2xlRnVsbE9iamVjdD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuYXJ0aWNsZUFwaS5nZXRBcnRpY2xlRnVsbE9iamVjdChnb29kSWQpO1xyXG4gICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlRnVsbE9iamVjdCwgcmVzdWx0LnJlc3VsdE9iamVjdCkgYXMgdW5rbm93biBhcyBBcnRpY2xlRnVsbE9iamVjdDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlQ2F0ZWdvcmllcyhwdWJsaWNhdGlvbkNvZGU6IG51bWJlcik6IFByb21pc2U8QXJ0aWNsZUNhdGVnb3J5W10+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmFydGljbGVBcGkuZ2V0QXJ0aWNsZUNhdGVnb3JpZXMocHVibGljYXRpb25Db2RlKTtcclxuICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoQXJ0aWNsZUNhdGVnb3J5LCByZXN1bHQucmVzdWx0T2JqZWN0cykgYXMgdW5rbm93biBhcyBBcnRpY2xlQ2F0ZWdvcnlbXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vXHJcbiAgcHVibGljIGFzeW5jIGdldEFydGljbGVGbGF0KHNrdTogc3RyaW5nKTogUHJvbWlzZTxBcnRpY2xlRmxhdD4ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuYXJ0aWNsZUFwaS5nZXRBcnRpY2xlRmxhdChza3UpO1xyXG4gICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEFydGljbGVGbGF0LCByZXN1bHQucmVzdWx0T2JqZWN0KSBhcyB1bmtub3duIGFzIEFydGljbGVGbGF0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcihyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldE1vZGVsUGxhY2VtZW50T3B0aW9ucygpOiBQcm9taXNlPENvRG9tYWluVmFsdWVbXT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gRE9NXzNEX1BMQUNFTUVOVFxyXG4gICAgICBjb25zdCByZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5tYWluQXBpLmdldERvbWFpbkNvbGxlY3Rpb24oJ05MJywgRG9tYWluTmFtZS5Eb20zRFBsYWNlbWVudCk7XHJcbiAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIDxDb0RvbWFpblZhbHVlW10+PHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoQ29Eb21haW5WYWx1ZSwgcmVzdWx0LnJlc3VsdE9iamVjdHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldE9iamVjdENvbmZpZ3VyYXRpb24oc2NyZWVuQ2ZnTW9kdWxlOiBzdHJpbmcsIHBhcmFtcz86IHN0cmluZyB8IHN0cmluZ1tdLCBpbnNlcnRNb2RlPzogYm9vbGVhbik6IFByb21pc2U8T2JqZWN0Q29uZmlndXJhdGlvbltdPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLm1haW5BcGkuZ2V0T2JqZWN0Q29uZmlndXJhdGlvbnMoc2NyZWVuQ2ZnTW9kdWxlLCBwYXJhbXMsIGluc2VydE1vZGUpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gPE9iamVjdENvbmZpZ3VyYXRpb25bXT48dW5rbm93bj50aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShPYmplY3RDb25maWd1cmF0aW9uLCByZXNwb25zZS5yZXN1bHRPYmplY3RzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlLnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEV4dGVybmFsU291cmNlRnJvbUlkKGlkOiBudW1iZXIpOiBFeHRlcm5hbFNvdXJjZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXh0ZXJuYWxTb3VyY2VzICYmIHRoaXMuX2V4dGVybmFsU291cmNlcy5sZW5ndGggPiAwID8gdGhpcy5fZXh0ZXJuYWxTb3VyY2VzLmZpbmQoZSA9PiBlLnNvdXJjZUlkID09PSBpZCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmVFeHRlcm5hbFNvdXJjZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYXRhbG9nRGVmaW5pdGlvbnNPcmlnaW5hbCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2NhdGFsb2dEZWZpbml0aW9ucyk7XHJcbiAgICB0aGlzLl9jYXRhbG9nRGVmaW5pdGlvbnMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2NhdGFsb2dEZWZpbml0aW9ucyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuX2V4dGVybmFsU291cmNlc09yaWdpbmFsID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZXh0ZXJuYWxTb3VyY2VzKTtcclxuICAgIHRoaXMuX2V4dGVybmFsU291cmNlcy5sZW5ndGggPSAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0RXh0ZXJuYWxTb3VyY2VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2F0YWxvZ0RlZmluaXRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY2F0YWxvZ0RlZmluaXRpb25zT3JpZ2luYWwpO1xyXG4gICAgdGhpcy5fY2F0YWxvZ0RlZmluaXRpb25zT3JpZ2luYWwubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2NhdGFsb2dEZWZpbml0aW9uc09yaWdpbmFsID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fZXh0ZXJuYWxTb3VyY2VzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZXh0ZXJuYWxTb3VyY2VzT3JpZ2luYWwpO1xyXG4gICAgdGhpcy5fZXh0ZXJuYWxTb3VyY2VzT3JpZ2luYWwubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwcmVwYXJlRXh0ZXJuYWxTb3VyY2VzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX2NhdGFsb2dEZWZpbml0aW9ucykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9leHRlcm5hbFNvdXJjZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2NhdGFsb2dEZWZpbml0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0Q2F0YWxvZ0RlZmluaXRpb25zTGlzdCgpO1xyXG4gICAgaWYgKHRoaXMuX2NhdGFsb2dEZWZpbml0aW9ucykge1xyXG4gICAgICBmb3IgKGNvbnN0IGNhdGFsb2dJdGVtIG9mIHRoaXMuX2NhdGFsb2dEZWZpbml0aW9ucykge1xyXG4gICAgICAgIGlmIChjYXRhbG9nSXRlbS5leHRlcm5hbFNvdXJjZUlkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb25zdCBleHRlcm5hbERhdGE6IEV4dGVybmFsU291cmNlID0gYXdhaXQgdGhpcy5nZXRFeHRlcm5hbFNvdXJjZShjYXRhbG9nSXRlbS5leHRlcm5hbFNvdXJjZUlkKTtcclxuICAgICAgICAgIGlmIChleHRlcm5hbERhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXh0ZXJuYWxTb3VyY2VzLnB1c2goZXh0ZXJuYWxEYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QXJ0aWNsZUV4dGVuZGVkKGFydGljbGVOdW1iZXI6IHN0cmluZyk6IFByb21pc2U8QXJ0aWNsZUV4dGVuZGVkPiB7XHJcbiAgICBjb25zdCByZXF1ZXN0T2JqZWN0OiBBcnRpY2xlRXh0ZW5kZWRSZXF1ZXN0ID0gbmV3IEFydGljbGVFeHRlbmRlZFJlcXVlc3QoKTtcclxuICAgIHJlcXVlc3RPYmplY3QuYXJ0aWNsZU51bWJlciA9IGFydGljbGVOdW1iZXI7XHJcbiAgICBjb25zdCByZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5hcnRpY2xlQXBpLnNlYXJjaEFydGljbGVzKHJlcXVlc3RPYmplY3QsIHRydWUpO1xyXG4gICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgaWYgKHJlc3VsdC5yZXN1bHRPYmplY3RzICYmIHJlc3VsdC5yZXN1bHRPYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQXJ0aWNsZUV4dGVuZGVkLCByZXN1bHQucmVzdWx0T2JqZWN0c1swXSkgYXMgdW5rbm93biBhcyBBcnRpY2xlRXh0ZW5kZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBhc3luYyBhZGRUb0NhcnQoZ29vZElkOiBudW1iZXIsIGdvb2RUeXBlOiBHb29kVHlwZSwgaW5zdGFuY2VJZDogbnVtYmVyLCBzZXNzaW9uSWQ6IHN0cmluZywgcXVhbnRpdHk6IG51bWJlciA9IDEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIGNvbnN0IGpzb246IHN0cmluZyA9IGF3YWl0IHRoaXMuX2dldEpTT05Gcm9tQXJ0aWNsZU9iamVjdChnb29kSWQsIGdvb2RUeXBlLCBpbnN0YW5jZUlkLCBzZXNzaW9uSWQsIHF1YW50aXR5KTtcclxuICAvLyAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hZGRUb0NhcnQubmV4dCh7YXJ0aWNsZToganNvbiwgcXVhbnRpdHk6IDF9KTtcclxuICAvLyB9XHJcbiAgLy9cclxuICAvLyBwcml2YXRlIGFzeW5jIF9nZXRKU09ORnJvbUFydGljbGVPYmplY3QoZ29vZElkOiBudW1iZXIsIGdvb2RUeXBlOiBHb29kVHlwZSwgaW5zdGFuY2VJZDogbnVtYmVyLCBzZXNzaW9uSWQ6IHN0cmluZywgcXVhbnRpdHk6IG51bWJlciA9IDEpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gIC8vICAgY29uc3QgY29uZmlndXJhdG9yU3RhdGlzdGljcyA9IG5ldyBDb25maWd1cmF0b3JTdGF0aXN0aWNzRW52aXJvbm1lbnQoKTtcclxuICAvLyAgIGNvbmZpZ3VyYXRvclN0YXRpc3RpY3MudXNlclR5cGUgPSAnSG9tZWRlY29yYXRvcic7XHJcbiAgLy8gICBjb25maWd1cmF0b3JTdGF0aXN0aWNzLnRyYW5zYWN0aW9uVHlwZSA9ICdTYWxlcyc7XHJcbiAgLy8gICBjb25maWd1cmF0b3JTdGF0aXN0aWNzLmFjdGlvbkRvbWFpbiA9ICdIb21lZGVjb3JhdG9yJztcclxuICAvLyAgIGNvbmZpZ3VyYXRvclN0YXRpc3RpY3Muc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xyXG4gIC8vICAgY29uZmlndXJhdG9yU3RhdGlzdGljcy53ZWJIb3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XHJcbiAgLy8gICBjb25maWd1cmF0b3JTdGF0aXN0aWNzLmJ1bmRsZUhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDtcclxuICAvLyAgIHJldHVybiBhd2FpdCB0aGlzLmFydGljbGVBcGkuZ2V0SnNvbkFydGljbGVGbGF0VHJlZShnb29kSWQsIGdvb2RUeXBlLCBxdWFudGl0eSwgdHJ1ZSwgaW5zdGFuY2VJZCwgY29uZmlndXJhdG9yU3RhdGlzdGljcyk7XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIF9nZXRQdWJsaWNhdGlvbkNvZGVGb3JSb2xlKHJvbGU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fcHVibGljYXRpb25Db2RlRm9yVXNlclJvbGUuaGFzKHJvbGUpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9wdWJsaWNhdGlvbkNvZGVGb3JVc2VyUm9sZS5nZXQocm9sZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuIl19
|