igniteui-angular-extras 15.1.1 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/{esm2020 → esm2022}/lib/context-menu/chart-dialog/chart-dialog.component.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/context-menu/context-menu.component.mjs +4 -4
  3. package/{esm2020 → esm2022}/lib/context-menu/igx-context-menu.directive.mjs +4 -4
  4. package/{esm2020 → esm2022}/lib/directives/chart-integration/chart-integration.directive.mjs +4 -4
  5. package/esm2022/lib/directives/conditional-formatting/conditional-formatting.directive.mjs +307 -0
  6. package/esm2022/lib/igniteui-angular-extras.module.mjs +108 -0
  7. package/{esm2020 → esm2022}/lib/pipes/svg.pipe.mjs +4 -4
  8. package/{fesm2020 → fesm2022}/igniteui-angular-extras.mjs +75 -74
  9. package/fesm2022/igniteui-angular-extras.mjs.map +1 -0
  10. package/lib/directives/chart-integration/chart-integration.directive.d.ts +1 -1
  11. package/lib/directives/conditional-formatting/conditional-formatting.directive.d.ts +1 -1
  12. package/lib/igniteui-angular-extras.module.d.ts +2 -1
  13. package/package.json +5 -11
  14. package/esm2020/lib/directives/conditional-formatting/conditional-formatting.directive.mjs +0 -311
  15. package/esm2020/lib/igniteui-angular-extras.module.mjs +0 -104
  16. package/fesm2015/igniteui-angular-extras.mjs +0 -1789
  17. package/fesm2015/igniteui-angular-extras.mjs.map +0 -1
  18. package/fesm2020/igniteui-angular-extras.mjs.map +0 -1
  19. /package/{esm2020 → esm2022}/igniteui-angular-extras.mjs +0 -0
  20. /package/{esm2020 → esm2022}/images/charts.mjs +0 -0
  21. /package/{esm2020 → esm2022}/images/conditions.mjs +0 -0
  22. /package/{esm2020 → esm2022}/lib/directives/chart-integration/chart-types.mjs +0 -0
  23. /package/{esm2020 → esm2022}/lib/directives/chart-integration/initializers.mjs +0 -0
  24. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -286,10 +286,10 @@ export class IgxChartIntegrationDirective {
286
286
  this.customChartComponentOptions.get(chart)[optionsType][property] = options[property];
287
287
  });
288
288
  }
289
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxChartIntegrationDirective, deps: [{ token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Directive }); }
290
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: IgxChartIntegrationDirective, selector: "[igxChartIntegration]", inputs: { chartData: "chartData", useLegend: "useLegend", defaultLabelMemberPath: "defaultLabelMemberPath", scatterChartYAxisValueMemberPath: "scatterChartYAxisValueMemberPath", bubbleChartRadiusMemberPath: "bubbleChartRadiusMemberPath" }, outputs: { onChartTypesDetermined: "onChartTypesDetermined", onChartCreationDone: "onChartCreationDone" }, ngImport: i0 }); }
289
291
  }
290
- IgxChartIntegrationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: IgxChartIntegrationDirective, deps: [{ token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Directive });
291
- IgxChartIntegrationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.3", type: IgxChartIntegrationDirective, selector: "[igxChartIntegration]", inputs: { chartData: "chartData", useLegend: "useLegend", defaultLabelMemberPath: "defaultLabelMemberPath", scatterChartYAxisValueMemberPath: "scatterChartYAxisValueMemberPath", bubbleChartRadiusMemberPath: "bubbleChartRadiusMemberPath" }, outputs: { onChartTypesDetermined: "onChartTypesDetermined", onChartCreationDone: "onChartCreationDone" }, ngImport: i0 });
292
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: IgxChartIntegrationDirective, decorators: [{
292
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxChartIntegrationDirective, decorators: [{
293
293
  type: Directive,
294
294
  args: [{
295
295
  selector: '[igxChartIntegration]'
@@ -309,4 +309,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImpor
309
309
  }], bubbleChartRadiusMemberPath: [{
310
310
  type: Input
311
311
  }] } });
312
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtaW50ZWdyYXRpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci1leHRyYXMvc3JjL2xpYi9kaXJlY3RpdmVzL2NoYXJ0LWludGVncmF0aW9uL2NoYXJ0LWludGVncmF0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRELFNBQVMsRUFDeEUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFDSCxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsRUFDakcscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQy9HLDZCQUE2QixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLGdDQUFnQyxFQUNqSCwrQkFBK0IsRUFBRSxrQ0FBa0MsRUFBRSxnQ0FBZ0MsRUFDckcsNkJBQTZCLEVBQUUsNEJBQTRCLEVBQUUsK0JBQStCLEVBQzVGLDZCQUE2QixFQUNoQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBNEMsdUJBQXVCLEVBQ3RFLHNCQUFzQixFQUFFLDhCQUE4QixFQUFZLE1BQU0sZ0JBQWdCLENBQUM7O0FBVTdGLE1BQU0sT0FBTyw0QkFBNEI7SUFDckMsSUFDVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxTQUFTLENBQUMsWUFBbUI7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMs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LENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7eUhBOVRRLDRCQUE0Qjs2R0FBNUIsNEJBQTRCOzJGQUE1Qiw0QkFBNEI7a0JBSHhDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHVCQUF1QjtpQkFDcEM7K0dBR2MsU0FBUztzQkFEbkIsS0FBSztnQkFxREMsc0JBQXNCO3NCQUQ1QixNQUFNO2dCQUlBLG1CQUFtQjtzQkFEekIsTUFBTTtnQkFJQSxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsc0JBQXNCO3NCQUQ1QixLQUFLO2dCQUlLLGdDQUFnQztzQkFEMUMsS0FBSztnQkFZSywyQkFBMkI7c0JBRHJDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLFxyXG4gICAgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hCYXJTZXJpZXNDb21wb25lbnQsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4RGF0YUNoYXJ0Q29tcG9uZW50LCBJZ3hJdGVtTGVnZW5kQ29tcG9uZW50LCBJZ3hMZWdlbmRDb21wb25lbnQsIElneExpbmVTZXJpZXNDb21wb25lbnQsIElneFBpZUNoYXJ0Q29tcG9uZW50LFxyXG4gICAgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQsIElneFNjYXR0ZXJTZXJpZXNDb21wb25lbnQsIElneFNpemVTY2FsZUNvbXBvbmVudCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQsXHJcbiAgICBJZ3hTdGFja2VkMTAwQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCxcclxuICAgIElneFN0YWNrZWRBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQ29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4U3RhY2tlZExpbmVTZXJpZXNDb21wb25lbnRcclxufSBmcm9tICdpZ25pdGV1aS1hbmd1bGFyLWNoYXJ0cyc7XHJcbmltcG9ydCB7IENIQVJUX1RZUEUsIE9QVElPTlNfVFlQRSB9IGZyb20gJy4vY2hhcnQtdHlwZXMnO1xyXG5pbXBvcnQgeyBDaGFydEluaXRpYWxpemVyLCBJQ2hhcnRDb21wb25lbnRPcHRpb25zLCBJZ3hEYXRhQ2hhcnRJbml0aWFsaXplcixcclxuICAgIElneFBpZUNoYXJ0SW5pdGlhbGl6ZXIsIElneFN0YWNrZWREYXRhQ2hhcnRJbml0aWFsaXplciwgSU9wdGlvbnMgfSBmcm9tICcuL2luaXRpYWxpemVycyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEZXRlcm1pbmVkQ2hhcnRUeXBlc0FyZ3Mge1xyXG4gICAgY2hhcnRzQXZhaWxhYmlsdHk6IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPjtcclxuICAgIGNoYXJ0c0ZvckNyZWF0aW9uOiBDSEFSVF9UWVBFW107XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbaWd4Q2hhcnRJbnRlZ3JhdGlvbl0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJZ3hDaGFydEludGVncmF0aW9uRGlyZWN0aXZlIHtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IGNoYXJ0RGF0YSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhcnREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgY2hhcnREYXRhKHNlbGVjdGVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBjb25zdCBjaGFydHMgPSBuZXcgU2V0KHRoaXMuX2RhdGFDaGFydFR5cGVzKTtcclxuICAgICAgICBjb25zdCBkYXRhTW9kZWwgPSBzZWxlY3RlZERhdGEubGVuZ3RoID8gc2VsZWN0ZWREYXRhWzBdIDoge307XHJcbiAgICAgICAgdGhpcy5fbGFiZWxNZW1iZXJQYXRocyA9IE9iamVjdC5rZXlzKGRhdGFNb2RlbCkuZmlsdGVyKGtleSA9PiB0eXBlb2YgZGF0YU1vZGVsW2tleV0gPT09ICdzdHJpbmcnKTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzID0gT2JqZWN0LmtleXMoZGF0YU1vZGVsKS5maWx0ZXIoa2V5ID0+IHR5cGVvZiBkYXRhTW9kZWxba2V5XSA9PT0gJ251bWJlcicpO1xyXG4gICAgICAgIHRoaXMuX2NoYXJ0RGF0YSA9IHNlbGVjdGVkRGF0YS5tYXAoKGRhdGFSZWNvcmQsIGluZGV4KSA9PiB0aGlzLmFkZEluZGV4TWVtYmVyUGF0aChkYXRhUmVjb3JkLCBpbmRleCArIDEpKTtcclxuICAgICAgICBjb25zdCBhcmdzOiBJRGV0ZXJtaW5lZENoYXJ0VHlwZXNBcmdzID0ge1xyXG4gICAgICAgICAgICBjaGFydHNBdmFpbGFiaWx0eTogbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpLFxyXG4gICAgICAgICAgICBjaGFydHNGb3JDcmVhdGlvbjogW11cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhcnRUeXBlc0RldGVybWluZWQuZW1pdChhcmdzKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjaGFydHMuZm9yRWFjaCgoY2hhcnQsIF8sIHNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb2x1bW5DaGFydCA9IGNoYXJ0LmluZGV4T2YoJ0NvbHVtbicpICE9PSAtMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQmFyQ2hhcnQgPSBjaGFydC5pbmRleE9mKCdCYXInKSAhPT0gLTE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc1BpZUNoYXJ0ID0gY2hhcnQuaW5kZXhPZignUGllJykgIT09IC0xO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoaXNDb2x1bW5DaGFydCB8fCBpc0JhckNoYXJ0IHx8IGlzUGllQ2hhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjaGFydCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb25maWcgcGllIGNoYXJ0XHJcbiAgICAgICAgY29uc3QgY2Fubm90Q3JlYXRlUGllQ2hhcnQgPSBzZWxlY3RlZERhdGEuc29tZShyZWNvcmQgPT4gcmVjb3JkW3RoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMF1dIDw9IDApO1xyXG4gICAgICAgIGlmIChjYW5ub3RDcmVhdGVQaWVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuUElFKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ29uZmlnIHNjYXR0ZXIgY2hhcnQgbWVtYmVyIHBhdGhzXHJcbiAgICAgICAgY29uc3QgY2FuQ3JlYXRlU2NhdHRlckNoYXJ0ID0gdGhpcy5fdmFsdWVNZW1iZXJQYXRocy5sZW5ndGggPj0gMjtcclxuICAgICAgICBjb25zdCBjYW5DcmVhdGVCdWJibGVDaGFydCA9IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMubGVuZ3RoID49IDM7XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVTY2F0dGVyQ2hhcnQpIHtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKTtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfTElORSk7XHJcbiAgICAgICAgICAgIGNoYXJ0cy5kZWxldGUoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5UKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVCdWJibGVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5jaGFydHNBdmFpbGFiaWx0eSA9IHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eTtcclxuICAgICAgICBhcmdzLmNoYXJ0c0ZvckNyZWF0aW9uID0gWy4uLmNoYXJ0c107XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0VHlwZXNEZXRlcm1pbmVkLmVtaXQoYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgb25DaGFydFR5cGVzRGV0ZXJtaW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SURldGVybWluZWRDaGFydFR5cGVzQXJncz4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBvbkNoYXJ0Q3JlYXRpb25Eb25lID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB1c2VMZWdlbmQgPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdExhYmVsTWVtYmVyUGF0aDogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmluZGV4T2YodGhpcy5fc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoIDogdGhpcy5fdmFsdWVNZW1iZXJQYXRoc1swXTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBidWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgocGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoICYmXHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMuaW5kZXhPZih0aGlzLl9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX2J1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCA6IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFydFR5cGVzQXZhaWxhYmlsaXR5ID0gbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpO1xyXG4gICAgcHJpdmF0ZSBjdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMgPSBuZXcgTWFwPENIQVJUX1RZUEUsIElDaGFydENvbXBvbmVudE9wdGlvbnM+KCk7XHJcbiAgICBwcml2YXRlIGRhdGFDaGFydHMgPSBuZXcgTWFwPHN0cmluZywgVHlwZTxhbnk+PigpO1xyXG4gICAgcHJpdmF0ZSBfc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF92YWx1ZU1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9sYWJlbE1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9jaGFydERhdGE6IGFueVtdO1xyXG4gICAgcHJpdmF0ZSBfc2l6ZVNjYWxlID0gbmV3IElneFNpemVTY2FsZUNvbXBvbmVudCgpO1xyXG4gICAgcHJpdmF0ZSBfZGF0YUNoYXJ0VHlwZXMgPSBuZXcgU2V0PENIQVJUX1RZUEU+KCk7XHJcbiAgICBwcml2YXRlIGdldCBfbGFiZWxNZW1iZXJQYXRoKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCAmJiB0aGlzLl9jaGFydERhdGEuc29tZShyID0+IHJbdGhpcy5kZWZhdWx0TGFiZWxNZW1iZXJQYXRoXSAhPT0gdW5kZWZpbmVkKSA/XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCA6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHMubGVuZ3RoID4gMCA/IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHNbMF0gOiAnSW5kZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0IHBpZUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICc4NSUnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICc3NSUnLFxyXG4gICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmNoYXJ0RGF0YSxcclxuICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoOiB0aGlzLl92YWx1ZU1lbWJlclBhdGhzWzBdLFxyXG4gICAgICAgICAgICBsZWdlbmRMYWJlbE1lbWJlclBhdGg6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aCxcclxuICAgICAgICAgICAgbGFiZWxNZW1iZXJQYXRoOiB0aGlzLl9sYWJlbE1lbWJlclBhdGgsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbDogSU9wdGlvbnMgPSB7XHJcbiAgICAgICAgaXNIaWdobGlnaHRpbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFyZWFGaWxsT3BhY2l0eTogLjQsXHJcbiAgICAgICAgbWFya2VyVHlwZTogMyxcclxuICAgICAgICBzaG93RGVmYXVsdFRvb2x0aXA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBzY2F0dGVyQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIG1hcmtlclR5cGU6IDMsXHJcbiAgICAgICAgc2hvd0RlZmF1bHRUb29sdGlwOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgYnViYmxlQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIHJhZGl1c1NjYWxlOiB0aGlzLl9zaXplU2NhbGVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgZGF0YUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnODUlJyxcclxuICAgICAgICAgICAgYXV0b01hcmdpbldpZHRoOiA1MCxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbFpvb21FbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBpc0hvcml6b250YWxab29tRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5jaGFydERhdGFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fR1JPVVBFRCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV9HUk9VUEVELCBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuTElORV9HUk9VUEVELCBJZ3hMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX0dST1VQRUQsIElneEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fU1RBQ0tFRCwgSWd4U3RhY2tlZENvbHVtblNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkFSRUFfU1RBQ0tFRCwgSWd4U3RhY2tlZEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FX1NUQUNLRUQsIElneFN0YWNrZWRMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX1NUQUNLRUQsIElneFN0YWNrZWRCYXJTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQ09MVU1OXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkJBUl8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5ULCBJZ3hTY2F0dGVyU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLlNDQVRURVJfTElORSwgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuUElFLCBJZ3hQaWVDaGFydENvbXBvbmVudCk7XHJcbiAgICAgICAgY29uc3QgaXRlcmFibGUgPSB0aGlzLmRhdGFDaGFydHMua2V5cygpO1xyXG4gICAgICAgIGZvciAobGV0IGhlYWQgPSBpdGVyYWJsZS5uZXh0KCkudmFsdWU7IGhlYWQgIT09IHVuZGVmaW5lZDsgaGVhZCA9IGl0ZXJhYmxlLm5leHQoKS52YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhQ2hhcnRUeXBlcy5hZGQoaGVhZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQoaGVhZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLnNldChoZWFkLCB7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBdmFpbGFibGVDaGFydHMoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gW107XHJcbiAgICAgICAgdGhpcy5jaGFydFR5cGVzQXZhaWxhYmlsaXR5LmZvckVhY2goKGlzQXZhaWxhYmxlLCBjaGFydFR5cGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXMucHVzaChjaGFydFR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5nZXQodHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQodHlwZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVuYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuc2V0KHR5cGUsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYXJ0RmFjdG9yeSh0eXBlOiBDSEFSVF9UWVBFLCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PjtcclxuICAgICAgICBsZXQgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PjtcclxuICAgICAgICB0aGlzLl9zaXplU2NhbGUubWF4aW11bVZhbHVlID0gNjA7XHJcbiAgICAgICAgdGhpcy5fc2l6ZVNjYWxlLm1pbmltdW1WYWx1ZSA9IDEwO1xyXG4gICAgICAgIGNvbnN0IGNoYXJ0VHlwZSA9IHRoaXMuZGF0YUNoYXJ0cy5nZXQodHlwZSk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBDSEFSVF9UWVBFLlBJRSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4UGllQ2hhcnRDb21wb25lbnQpO1xyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4RGF0YUNoYXJ0Q29tcG9uZW50KTtcclxuICAgICAgICAgICAgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMgPSB0aGlzLmdldENoYXJ0T3B0aW9ucyh0eXBlKTtcclxuICAgICAgICBjb25zdCBpbml0aWFsaXplcjogQ2hhcnRJbml0aWFsaXplciA9IHRoaXMuZ2V0SW5pdGlhbGl6ZXIodHlwZSwgY2hhcnRUeXBlKTtcclxuICAgICAgICBpZiAodGhpcy51c2VMZWdlbmQpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kVHlwZSA9IHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gSWd4SXRlbUxlZ2VuZENvbXBvbmVudCA6IElneExlZ2VuZENvbXBvbmVudDtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kRmFjdG9yeSA9IHRoaXMuZmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGxlZ2VuZFR5cGUgYXMgYW55KTtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kQ29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGxlZ2VuZEZhY3RvcnkpO1xyXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJ0T3B0aW9uc1snbGVnZW5kJ10gPSBsZWdlbmRDb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gaW5pdGlhbGl6ZXIuaW5pdENoYXJ0KGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0Q3JlYXRpb25Eb25lLmVtaXQoY2hhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SW5pdGlhbGl6ZXIoY2hhcnRUeXBlOiBDSEFSVF9UWVBFLCBjb21wb25lbnRDbGFzc1JlZik6IENoYXJ0SW5pdGlhbGl6ZXIge1xyXG4gICAgICAgIGlmIChjaGFydFR5cGUuaW5jbHVkZXMoJ1BpZScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4UGllQ2hhcnRJbml0aWFsaXplcigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcnRUeXBlLmluY2x1ZGVzKCdTdGFja2VkJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hTdGFja2VkRGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4RGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENoYXJ0T3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFKTogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucyB7XHJcbiAgICAgICAgY29uc3QgY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zID0ge307XHJcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gdGhpcy5hZGRQaWVDaGFydERhdGFPcHRpb25zKGNoYXJ0Q29tcG9uZW50T3B0aW9ucykgOlxyXG4gICAgICAgICAgICB0aGlzLmFkZERhdGFDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucywgdHlwZS5pbmNsdWRlcygnU3RhY2tlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFBpZUNoYXJ0RGF0YU9wdGlvbnMoY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLnBpZUNoYXJ0T3B0aW9ucywgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KENIQVJUX1RZUEUuUElFKS5jaGFydE9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGREYXRhQ2hhcnREYXRhT3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFLCBjaGFydENvbXBvbmVudE9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMsIHN0YWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydE9wdGlvbnMsIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldCh0eXBlKSk7XHJcbiAgICAgICAgaWYgKHR5cGUuaW5kZXhPZignU2NhdHRlcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNjYXR0ZXJDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbCwgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KHR5cGUpLnNlcmllc01vZGVsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBeGlzTGFiZWxPcHRpb24odHlwZSwgY2hhcnRDb21wb25lbnRPcHRpb25zKTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSU9wdGlvbnNbXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZU1lbWJlclBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goeyAuLi5kYXRhT3B0aW9ucyB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLmNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHN0YWNrZWQgPyBjaGFydENvbXBvbmVudE9wdGlvbnMuc3RhY2tlZEZyYWdtZW50T3B0aW9ucyA9IG9wdGlvbnMgOlxyXG4gICAgICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRTY2F0dGVyQ2hhcnREYXRhT3B0aW9ucyhzY2F0dGVyQ2hhcnQ6IENIQVJUX1RZUEUsIGNoYXJ0Q29tcG9uZW50T3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzTW9kZWwgPSBPYmplY3QuYXNzaWduKHRoaXMuc2NhdHRlckNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsLCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQoc2NhdHRlckNoYXJ0KS5zZXJpZXNNb2RlbCk7XHJcbiAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWyd5TWVtYmVyUGF0aCddID0gdGhpcy5zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aDtcclxuICAgICAgICBpZiAoc2NhdHRlckNoYXJ0ID09PSBDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKSB7XHJcbiAgICAgICAgICAgIGNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCA9IE9iamVjdC5hc3NpZ24oY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsLCB0aGlzLmJ1YmJsZUNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsKTtcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWydyYWRpdXNNZW1iZXJQYXRoJ10gPSB0aGlzLmJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZGVsID0gY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsO1xyXG4gICAgICAgIGNvbnN0IHNlcmllc09wdGlvbnM6IElPcHRpb25zW10gPSBbXTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZpbHRlcih2ID0+ICEodiA9PT0gbW9kZWxbJ3lNZW1iZXJQYXRoJ10gfHxcclxuICAgICAgICAgICAgdiA9PT0gbW9kZWxbJ3JhZGl1c01lbWJlclBhdGgnXSkpLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgJHttb2RlbFsneU1lbWJlclBhdGgnXX0gdnMgJHt2YWx1ZU1lbWJlclBhdGh9YCxcclxuICAgICAgICAgICAgICAgICAgICB4TWVtYmVyUGF0aDogdmFsdWVNZW1iZXJQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsTWVtYmVyUGF0aDogdGhpcy5fbGFiZWxNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzT3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLm1vZGVsIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IHNlcmllc09wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRJbmRleE1lbWJlclBhdGgoZGF0YVJlY29yZCwgaW5kZXgpIHtcclxuICAgICAgICBkYXRhUmVjb3JkID0geyAuLi57IFt0aGlzLl9sYWJlbE1lbWJlclBhdGhdOiBpbmRleCB9LCAuLi5kYXRhUmVjb3JkIH07XHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZWNvcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRBeGlzTGFiZWxPcHRpb24odHlwZTogQ0hBUlRfVFlQRSwgb3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0eXBlLmluZGV4T2YoJ0JhcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBvcHRpb25zLnlBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueUF4aXNPcHRpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRpb25zLnhBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueEF4aXNPcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldENoYXJ0Q29tcG9uZW50T3B0aW9ucyhjaGFydDogQ0hBUlRfVFlQRSwgb3B0aW9uc1R5cGU6IE9QVElPTlNfVFlQRSwgb3B0aW9uczogSU9wdGlvbnMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2gocHJvcGVydHkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KGNoYXJ0KVtvcHRpb25zVHlwZV1bcHJvcGVydHldID0gb3B0aW9uc1twcm9wZXJ0eV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtaW50ZWdyYXRpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci1leHRyYXMvc3JjL2xpYi9kaXJlY3RpdmVzL2NoYXJ0LWludGVncmF0aW9uL2NoYXJ0LWludGVncmF0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRELFNBQVMsRUFDeEUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFDSCxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsRUFDakcscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQy9HLDZCQUE2QixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLGdDQUFnQyxFQUNqSCwrQkFBK0IsRUFBRSxrQ0FBa0MsRUFBRSxnQ0FBZ0MsRUFDckcsNkJBQTZCLEVBQUUsNEJBQTRCLEVBQUUsK0JBQStCLEVBQzVGLDZCQUE2QixFQUNoQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBNEMsdUJBQXVCLEVBQ3RFLHNCQUFzQixFQUFFLDhCQUE4QixFQUFZLE1BQU0sZ0JBQWdCLENBQUM7O0FBVTdGLE1BQU0sT0FBTyw0QkFBNEI7SUFDckMsSUFDVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxTQUFTLENBQUMsWUFBbUI7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMs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LENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0E5VFEsNEJBQTRCO2tHQUE1Qiw0QkFBNEI7OzJGQUE1Qiw0QkFBNEI7a0JBSHhDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHVCQUF1QjtpQkFDcEM7K0dBR2MsU0FBUztzQkFEbkIsS0FBSztnQkFxREMsc0JBQXNCO3NCQUQ1QixNQUFNO2dCQUlBLG1CQUFtQjtzQkFEekIsTUFBTTtnQkFJQSxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsc0JBQXNCO3NCQUQ1QixLQUFLO2dCQUlLLGdDQUFnQztzQkFEMUMsS0FBSztnQkFZSywyQkFBMkI7c0JBRHJDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLFxyXG4gICAgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hCYXJTZXJpZXNDb21wb25lbnQsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4RGF0YUNoYXJ0Q29tcG9uZW50LCBJZ3hJdGVtTGVnZW5kQ29tcG9uZW50LCBJZ3hMZWdlbmRDb21wb25lbnQsIElneExpbmVTZXJpZXNDb21wb25lbnQsIElneFBpZUNoYXJ0Q29tcG9uZW50LFxyXG4gICAgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQsIElneFNjYXR0ZXJTZXJpZXNDb21wb25lbnQsIElneFNpemVTY2FsZUNvbXBvbmVudCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQsXHJcbiAgICBJZ3hTdGFja2VkMTAwQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCxcclxuICAgIElneFN0YWNrZWRBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQ29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4U3RhY2tlZExpbmVTZXJpZXNDb21wb25lbnRcclxufSBmcm9tICdpZ25pdGV1aS1hbmd1bGFyLWNoYXJ0cyc7XHJcbmltcG9ydCB7IENIQVJUX1RZUEUsIE9QVElPTlNfVFlQRSB9IGZyb20gJy4vY2hhcnQtdHlwZXMnO1xyXG5pbXBvcnQgeyBDaGFydEluaXRpYWxpemVyLCBJQ2hhcnRDb21wb25lbnRPcHRpb25zLCBJZ3hEYXRhQ2hhcnRJbml0aWFsaXplcixcclxuICAgIElneFBpZUNoYXJ0SW5pdGlhbGl6ZXIsIElneFN0YWNrZWREYXRhQ2hhcnRJbml0aWFsaXplciwgSU9wdGlvbnMgfSBmcm9tICcuL2luaXRpYWxpemVycyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEZXRlcm1pbmVkQ2hhcnRUeXBlc0FyZ3Mge1xyXG4gICAgY2hhcnRzQXZhaWxhYmlsdHk6IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPjtcclxuICAgIGNoYXJ0c0ZvckNyZWF0aW9uOiBDSEFSVF9UWVBFW107XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbaWd4Q2hhcnRJbnRlZ3JhdGlvbl0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJZ3hDaGFydEludGVncmF0aW9uRGlyZWN0aXZlIHtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IGNoYXJ0RGF0YSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhcnREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgY2hhcnREYXRhKHNlbGVjdGVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBjb25zdCBjaGFydHMgPSBuZXcgU2V0KHRoaXMuX2RhdGFDaGFydFR5cGVzKTtcclxuICAgICAgICBjb25zdCBkYXRhTW9kZWwgPSBzZWxlY3RlZERhdGEubGVuZ3RoID8gc2VsZWN0ZWREYXRhWzBdIDoge307XHJcbiAgICAgICAgdGhpcy5fbGFiZWxNZW1iZXJQYXRocyA9IE9iamVjdC5rZXlzKGRhdGFNb2RlbCkuZmlsdGVyKGtleSA9PiB0eXBlb2YgZGF0YU1vZGVsW2tleV0gPT09ICdzdHJpbmcnKTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzID0gT2JqZWN0LmtleXMoZGF0YU1vZGVsKS5maWx0ZXIoa2V5ID0+IHR5cGVvZiBkYXRhTW9kZWxba2V5XSA9PT0gJ251bWJlcicpO1xyXG4gICAgICAgIHRoaXMuX2NoYXJ0RGF0YSA9IHNlbGVjdGVkRGF0YS5tYXAoKGRhdGFSZWNvcmQsIGluZGV4KSA9PiB0aGlzLmFkZEluZGV4TWVtYmVyUGF0aChkYXRhUmVjb3JkLCBpbmRleCArIDEpKTtcclxuICAgICAgICBjb25zdCBhcmdzOiBJRGV0ZXJtaW5lZENoYXJ0VHlwZXNBcmdzID0ge1xyXG4gICAgICAgICAgICBjaGFydHNBdmFpbGFiaWx0eTogbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpLFxyXG4gICAgICAgICAgICBjaGFydHNGb3JDcmVhdGlvbjogW11cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhcnRUeXBlc0RldGVybWluZWQuZW1pdChhcmdzKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjaGFydHMuZm9yRWFjaCgoY2hhcnQsIF8sIHNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb2x1bW5DaGFydCA9IGNoYXJ0LmluZGV4T2YoJ0NvbHVtbicpICE9PSAtMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQmFyQ2hhcnQgPSBjaGFydC5pbmRleE9mKCdCYXInKSAhPT0gLTE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc1BpZUNoYXJ0ID0gY2hhcnQuaW5kZXhPZignUGllJykgIT09IC0xO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoaXNDb2x1bW5DaGFydCB8fCBpc0JhckNoYXJ0IHx8IGlzUGllQ2hhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjaGFydCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb25maWcgcGllIGNoYXJ0XHJcbiAgICAgICAgY29uc3QgY2Fubm90Q3JlYXRlUGllQ2hhcnQgPSBzZWxlY3RlZERhdGEuc29tZShyZWNvcmQgPT4gcmVjb3JkW3RoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMF1dIDw9IDApO1xyXG4gICAgICAgIGlmIChjYW5ub3RDcmVhdGVQaWVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuUElFKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ29uZmlnIHNjYXR0ZXIgY2hhcnQgbWVtYmVyIHBhdGhzXHJcbiAgICAgICAgY29uc3QgY2FuQ3JlYXRlU2NhdHRlckNoYXJ0ID0gdGhpcy5fdmFsdWVNZW1iZXJQYXRocy5sZW5ndGggPj0gMjtcclxuICAgICAgICBjb25zdCBjYW5DcmVhdGVCdWJibGVDaGFydCA9IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMubGVuZ3RoID49IDM7XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVTY2F0dGVyQ2hhcnQpIHtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKTtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfTElORSk7XHJcbiAgICAgICAgICAgIGNoYXJ0cy5kZWxldGUoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5UKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVCdWJibGVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5jaGFydHNBdmFpbGFiaWx0eSA9IHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eTtcclxuICAgICAgICBhcmdzLmNoYXJ0c0ZvckNyZWF0aW9uID0gWy4uLmNoYXJ0c107XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0VHlwZXNEZXRlcm1pbmVkLmVtaXQoYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgb25DaGFydFR5cGVzRGV0ZXJtaW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SURldGVybWluZWRDaGFydFR5cGVzQXJncz4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBvbkNoYXJ0Q3JlYXRpb25Eb25lID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB1c2VMZWdlbmQgPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdExhYmVsTWVtYmVyUGF0aDogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmluZGV4T2YodGhpcy5fc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoIDogdGhpcy5fdmFsdWVNZW1iZXJQYXRoc1swXTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBidWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgocGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoICYmXHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMuaW5kZXhPZih0aGlzLl9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX2J1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCA6IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFydFR5cGVzQXZhaWxhYmlsaXR5ID0gbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpO1xyXG4gICAgcHJpdmF0ZSBjdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMgPSBuZXcgTWFwPENIQVJUX1RZUEUsIElDaGFydENvbXBvbmVudE9wdGlvbnM+KCk7XHJcbiAgICBwcml2YXRlIGRhdGFDaGFydHMgPSBuZXcgTWFwPHN0cmluZywgVHlwZTxhbnk+PigpO1xyXG4gICAgcHJpdmF0ZSBfc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF92YWx1ZU1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9sYWJlbE1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9jaGFydERhdGE6IGFueVtdO1xyXG4gICAgcHJpdmF0ZSBfc2l6ZVNjYWxlID0gbmV3IElneFNpemVTY2FsZUNvbXBvbmVudCgpO1xyXG4gICAgcHJpdmF0ZSBfZGF0YUNoYXJ0VHlwZXMgPSBuZXcgU2V0PENIQVJUX1RZUEU+KCk7XHJcbiAgICBwcml2YXRlIGdldCBfbGFiZWxNZW1iZXJQYXRoKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCAmJiB0aGlzLl9jaGFydERhdGEuc29tZShyID0+IHJbdGhpcy5kZWZhdWx0TGFiZWxNZW1iZXJQYXRoXSAhPT0gdW5kZWZpbmVkKSA/XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCA6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHMubGVuZ3RoID4gMCA/IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHNbMF0gOiAnSW5kZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0IHBpZUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICc4NSUnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICc3NSUnLFxyXG4gICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmNoYXJ0RGF0YSxcclxuICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoOiB0aGlzLl92YWx1ZU1lbWJlclBhdGhzWzBdLFxyXG4gICAgICAgICAgICBsZWdlbmRMYWJlbE1lbWJlclBhdGg6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aCxcclxuICAgICAgICAgICAgbGFiZWxNZW1iZXJQYXRoOiB0aGlzLl9sYWJlbE1lbWJlclBhdGgsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbDogSU9wdGlvbnMgPSB7XHJcbiAgICAgICAgaXNIaWdobGlnaHRpbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFyZWFGaWxsT3BhY2l0eTogLjQsXHJcbiAgICAgICAgbWFya2VyVHlwZTogMyxcclxuICAgICAgICBzaG93RGVmYXVsdFRvb2x0aXA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBzY2F0dGVyQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIG1hcmtlclR5cGU6IDMsXHJcbiAgICAgICAgc2hvd0RlZmF1bHRUb29sdGlwOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgYnViYmxlQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIHJhZGl1c1NjYWxlOiB0aGlzLl9zaXplU2NhbGVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgZGF0YUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnODUlJyxcclxuICAgICAgICAgICAgYXV0b01hcmdpbldpZHRoOiA1MCxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbFpvb21FbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBpc0hvcml6b250YWxab29tRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5jaGFydERhdGFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fR1JPVVBFRCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV9HUk9VUEVELCBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuTElORV9HUk9VUEVELCBJZ3hMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX0dST1VQRUQsIElneEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fU1RBQ0tFRCwgSWd4U3RhY2tlZENvbHVtblNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkFSRUFfU1RBQ0tFRCwgSWd4U3RhY2tlZEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FX1NUQUNLRUQsIElneFN0YWNrZWRMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX1NUQUNLRUQsIElneFN0YWNrZWRCYXJTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQ09MVU1OXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkJBUl8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5ULCBJZ3hTY2F0dGVyU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLlNDQVRURVJfTElORSwgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuUElFLCBJZ3hQaWVDaGFydENvbXBvbmVudCk7XHJcbiAgICAgICAgY29uc3QgaXRlcmFibGUgPSB0aGlzLmRhdGFDaGFydHMua2V5cygpO1xyXG4gICAgICAgIGZvciAobGV0IGhlYWQgPSBpdGVyYWJsZS5uZXh0KCkudmFsdWU7IGhlYWQgIT09IHVuZGVmaW5lZDsgaGVhZCA9IGl0ZXJhYmxlLm5leHQoKS52YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhQ2hhcnRUeXBlcy5hZGQoaGVhZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQoaGVhZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLnNldChoZWFkLCB7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBdmFpbGFibGVDaGFydHMoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gW107XHJcbiAgICAgICAgdGhpcy5jaGFydFR5cGVzQXZhaWxhYmlsaXR5LmZvckVhY2goKGlzQXZhaWxhYmxlLCBjaGFydFR5cGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXMucHVzaChjaGFydFR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5nZXQodHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQodHlwZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVuYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuc2V0KHR5cGUsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYXJ0RmFjdG9yeSh0eXBlOiBDSEFSVF9UWVBFLCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PjtcclxuICAgICAgICBsZXQgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PjtcclxuICAgICAgICB0aGlzLl9zaXplU2NhbGUubWF4aW11bVZhbHVlID0gNjA7XHJcbiAgICAgICAgdGhpcy5fc2l6ZVNjYWxlLm1pbmltdW1WYWx1ZSA9IDEwO1xyXG4gICAgICAgIGNvbnN0IGNoYXJ0VHlwZSA9IHRoaXMuZGF0YUNoYXJ0cy5nZXQodHlwZSk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBDSEFSVF9UWVBFLlBJRSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4UGllQ2hhcnRDb21wb25lbnQpO1xyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4RGF0YUNoYXJ0Q29tcG9uZW50KTtcclxuICAgICAgICAgICAgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMgPSB0aGlzLmdldENoYXJ0T3B0aW9ucyh0eXBlKTtcclxuICAgICAgICBjb25zdCBpbml0aWFsaXplcjogQ2hhcnRJbml0aWFsaXplciA9IHRoaXMuZ2V0SW5pdGlhbGl6ZXIodHlwZSwgY2hhcnRUeXBlKTtcclxuICAgICAgICBpZiAodGhpcy51c2VMZWdlbmQpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kVHlwZSA9IHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gSWd4SXRlbUxlZ2VuZENvbXBvbmVudCA6IElneExlZ2VuZENvbXBvbmVudDtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kRmFjdG9yeSA9IHRoaXMuZmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGxlZ2VuZFR5cGUgYXMgYW55KTtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kQ29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGxlZ2VuZEZhY3RvcnkpO1xyXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJ0T3B0aW9uc1snbGVnZW5kJ10gPSBsZWdlbmRDb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gaW5pdGlhbGl6ZXIuaW5pdENoYXJ0KGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0Q3JlYXRpb25Eb25lLmVtaXQoY2hhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SW5pdGlhbGl6ZXIoY2hhcnRUeXBlOiBDSEFSVF9UWVBFLCBjb21wb25lbnRDbGFzc1JlZik6IENoYXJ0SW5pdGlhbGl6ZXIge1xyXG4gICAgICAgIGlmIChjaGFydFR5cGUuaW5jbHVkZXMoJ1BpZScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4UGllQ2hhcnRJbml0aWFsaXplcigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcnRUeXBlLmluY2x1ZGVzKCdTdGFja2VkJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hTdGFja2VkRGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4RGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENoYXJ0T3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFKTogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucyB7XHJcbiAgICAgICAgY29uc3QgY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zID0ge307XHJcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gdGhpcy5hZGRQaWVDaGFydERhdGFPcHRpb25zKGNoYXJ0Q29tcG9uZW50T3B0aW9ucykgOlxyXG4gICAgICAgICAgICB0aGlzLmFkZERhdGFDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucywgdHlwZS5pbmNsdWRlcygnU3RhY2tlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFBpZUNoYXJ0RGF0YU9wdGlvbnMoY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLnBpZUNoYXJ0T3B0aW9ucywgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KENIQVJUX1RZUEUuUElFKS5jaGFydE9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGREYXRhQ2hhcnREYXRhT3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFLCBjaGFydENvbXBvbmVudE9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMsIHN0YWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydE9wdGlvbnMsIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldCh0eXBlKSk7XHJcbiAgICAgICAgaWYgKHR5cGUuaW5kZXhPZignU2NhdHRlcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNjYXR0ZXJDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbCwgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KHR5cGUpLnNlcmllc01vZGVsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBeGlzTGFiZWxPcHRpb24odHlwZSwgY2hhcnRDb21wb25lbnRPcHRpb25zKTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSU9wdGlvbnNbXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZU1lbWJlclBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goeyAuLi5kYXRhT3B0aW9ucyB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLmNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHN0YWNrZWQgPyBjaGFydENvbXBvbmVudE9wdGlvbnMuc3RhY2tlZEZyYWdtZW50T3B0aW9ucyA9IG9wdGlvbnMgOlxyXG4gICAgICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRTY2F0dGVyQ2hhcnREYXRhT3B0aW9ucyhzY2F0dGVyQ2hhcnQ6IENIQVJUX1RZUEUsIGNoYXJ0Q29tcG9uZW50T3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzTW9kZWwgPSBPYmplY3QuYXNzaWduKHRoaXMuc2NhdHRlckNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsLCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQoc2NhdHRlckNoYXJ0KS5zZXJpZXNNb2RlbCk7XHJcbiAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWyd5TWVtYmVyUGF0aCddID0gdGhpcy5zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aDtcclxuICAgICAgICBpZiAoc2NhdHRlckNoYXJ0ID09PSBDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKSB7XHJcbiAgICAgICAgICAgIGNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCA9IE9iamVjdC5hc3NpZ24oY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsLCB0aGlzLmJ1YmJsZUNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsKTtcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWydyYWRpdXNNZW1iZXJQYXRoJ10gPSB0aGlzLmJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZGVsID0gY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsO1xyXG4gICAgICAgIGNvbnN0IHNlcmllc09wdGlvbnM6IElPcHRpb25zW10gPSBbXTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZpbHRlcih2ID0+ICEodiA9PT0gbW9kZWxbJ3lNZW1iZXJQYXRoJ10gfHxcclxuICAgICAgICAgICAgdiA9PT0gbW9kZWxbJ3JhZGl1c01lbWJlclBhdGgnXSkpLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgJHttb2RlbFsneU1lbWJlclBhdGgnXX0gdnMgJHt2YWx1ZU1lbWJlclBhdGh9YCxcclxuICAgICAgICAgICAgICAgICAgICB4TWVtYmVyUGF0aDogdmFsdWVNZW1iZXJQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsTWVtYmVyUGF0aDogdGhpcy5fbGFiZWxNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzT3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLm1vZGVsIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IHNlcmllc09wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRJbmRleE1lbWJlclBhdGgoZGF0YVJlY29yZCwgaW5kZXgpIHtcclxuICAgICAgICBkYXRhUmVjb3JkID0geyAuLi57IFt0aGlzLl9sYWJlbE1lbWJlclBhdGhdOiBpbmRleCB9LCAuLi5kYXRhUmVjb3JkIH07XHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZWNvcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRBeGlzTGFiZWxPcHRpb24odHlwZTogQ0hBUlRfVFlQRSwgb3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0eXBlLmluZGV4T2YoJ0JhcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBvcHRpb25zLnlBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueUF4aXNPcHRpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRpb25zLnhBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueEF4aXNPcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldENoYXJ0Q29tcG9uZW50T3B0aW9ucyhjaGFydDogQ0hBUlRfVFlQRSwgb3B0aW9uc1R5cGU6IE9QVElPTlNfVFlQRSwgb3B0aW9uczogSU9wdGlvbnMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2gocHJvcGVydHkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KGNoYXJ0KVtvcHRpb25zVHlwZV1bcHJvcGVydHldID0gb3B0aW9uc1twcm9wZXJ0eV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -0,0 +1,307 @@
1
+ import { Directive, EventEmitter, Input, Output } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { takeUntil } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "igniteui-angular";
6
+ export var ConditionalFormattingType;
7
+ (function (ConditionalFormattingType) {
8
+ ConditionalFormattingType["dataBars"] = "Data Bars";
9
+ ConditionalFormattingType["colorScale"] = "Color Scale";
10
+ ConditionalFormattingType["top10"] = "Top 10";
11
+ ConditionalFormattingType["textContains"] = "Text Contains";
12
+ ConditionalFormattingType["single"] = "Duplicate Values";
13
+ ConditionalFormattingType["unique"] = "Unique Values";
14
+ ConditionalFormattingType["empty"] = "Empty";
15
+ })(ConditionalFormattingType || (ConditionalFormattingType = {}));
16
+ export class IgxConditionalFormattingDirective {
17
+ set formatColors(val) {
18
+ this._formatColors = val;
19
+ }
20
+ get formatColors() {
21
+ return this._formatColors;
22
+ }
23
+ get selectedData() {
24
+ if (!this._selectedData.length) {
25
+ this._selectedData = this.toArray(this.grid.getSelectedData());
26
+ }
27
+ return this._selectedData;
28
+ }
29
+ get textData() {
30
+ return this.selectedData.filter(val => typeof val === 'string');
31
+ }
32
+ get numericData() {
33
+ return this.selectedData.filter(val => typeof val === 'number');
34
+ }
35
+ constructor(grid) {
36
+ this.grid = grid;
37
+ this.onFormattersReady = new EventEmitter();
38
+ this.colorScale = {
39
+ backgroundColor: (rowData, colname, cellValue, rowIndex) => {
40
+ if (!(typeof cellValue === 'number' && this.isWithInFormattedRange(rowIndex, colname))) {
41
+ return;
42
+ }
43
+ return this.lowTresholdValue >= cellValue ? this.formatColors.error :
44
+ this.middleTresholdValue >= cellValue ? this.formatColors.warning : this.formatColors.success;
45
+ }
46
+ };
47
+ this.dataBars = {
48
+ backgroundImage: (rowData, colname, cellValue, rowIndex) => {
49
+ if (!(typeof cellValue === 'number' && this.isWithInFormattedRange(rowIndex, colname))) {
50
+ return;
51
+ }
52
+ const treshold = this.threshold;
53
+ let gradientPercents;
54
+ if (cellValue < 0) {
55
+ const negativeStartingPoint = 100 - treshold;
56
+ gradientPercents = this.getNegativePercentage(cellValue);
57
+ return `linear-gradient(to left, transparent 0% ${negativeStartingPoint}%,
58
+ ${this.formatColors.error} ${negativeStartingPoint}% ${negativeStartingPoint + gradientPercents}%,
59
+ transparent ${gradientPercents}% 100%)`;
60
+ }
61
+ else {
62
+ gradientPercents = this.getPositivePercentage(cellValue);
63
+ return `linear-gradient(to right, transparent 0% ${treshold}%,
64
+ ${this.formatColors.success} ${treshold}% ${treshold + gradientPercents}%,
65
+ transparent ${treshold + gradientPercents}% 100%)`;
66
+ }
67
+ },
68
+ backgroundSize: '100% 80%',
69
+ backgroundRepeat: 'no-repeat',
70
+ backgroundPositionY: 'center'
71
+ };
72
+ this.top10Percent = {
73
+ backgroundColor: (rowData, colname, cellValue, rowIndex) => {
74
+ if (typeof cellValue === 'number' && this.isWithInFormattedRange(rowIndex, colname)
75
+ && cellValue > this.top10PercentTreshold) {
76
+ return this.formatColors.info;
77
+ }
78
+ },
79
+ color: (rowData, colname, cellValue, rowIndex) => {
80
+ if (typeof cellValue === 'number' && this.isWithInFormattedRange(rowIndex, colname)
81
+ && cellValue > this.top10PercentTreshold) {
82
+ return this.formatColors.text;
83
+ }
84
+ }
85
+ };
86
+ this.greaterThan = {
87
+ backgroundColor: (rowData, colname, cellValue, rowIndex) => {
88
+ if (typeof cellValue === 'number' && this.isWithInFormattedRange(rowIndex, colname)
89
+ && cellValue > this.avgValue) {
90
+ return this.formatColors.info;
91
+ }
92
+ },
93
+ color: (rowData, colname, cellValue, rowIndex) => {
94
+ if (typeof cellValue === 'number' && this.isWithInFormattedRange(rowIndex, colname)
95
+ && cellValue > this.avgValue) {
96
+ return this.formatColors.text;
97
+ }
98
+ }
99
+ };
100
+ this.empty = {
101
+ backgroundColor: (rowData, colname, cellValue, rowIndex) => {
102
+ if (this.isWithInFormattedRange(rowIndex, colname) && cellValue === undefined) {
103
+ return this.formatColors.info;
104
+ }
105
+ },
106
+ color: (rowData, colname, cellValue, rowIndex) => {
107
+ if (this.isWithInFormattedRange(rowIndex, colname) && cellValue === undefined) {
108
+ return this.formatColors.text;
109
+ }
110
+ }
111
+ };
112
+ this.duplicates = {
113
+ backgroundColor: (rowData, colname, cellValue, rowIndex) => {
114
+ if (!this.isWithInFormattedRange(rowIndex, colname)) {
115
+ return;
116
+ }
117
+ const arr = typeof cellValue === 'number' ? this.numericData : this.textData;
118
+ return arr.indexOf(cellValue) !== arr.lastIndexOf(cellValue) ? this.formatColors.info : '';
119
+ },
120
+ color: (rowData, colname, cellValue, rowIndex) => {
121
+ if (!this.isWithInFormattedRange(rowIndex, colname)) {
122
+ return;
123
+ }
124
+ const arr = typeof cellValue === 'number' ? this.numericData : this.textData;
125
+ return arr.indexOf(cellValue) !== arr.lastIndexOf(cellValue) ? this.formatColors.text : '';
126
+ }
127
+ };
128
+ this.textContains = {
129
+ backgroundColor: (rowData, colname, cellValue, rowIndex) => {
130
+ if (typeof cellValue === 'string' && this.isWithInFormattedRange(rowIndex, colname) &&
131
+ cellValue.toLowerCase().indexOf(this._valueForComparison.toLowerCase()) !== -1) {
132
+ return this.formatColors.info;
133
+ }
134
+ },
135
+ color: (rowData, colname, cellValue, rowIndex) => {
136
+ if (typeof cellValue === 'string' && this.isWithInFormattedRange(rowIndex, colname) &&
137
+ cellValue.toLowerCase().indexOf(this._valueForComparison.toLowerCase()) !== -1) {
138
+ return this.formatColors.text;
139
+ }
140
+ }
141
+ };
142
+ this.uniques = {
143
+ backgroundColor: (rowData, colname, cellValue, rowIndex) => {
144
+ if (!this.isWithInFormattedRange(rowIndex, colname)) {
145
+ return;
146
+ }
147
+ const arr = typeof cellValue === 'number' ? this.numericData : this.textData;
148
+ return arr.indexOf(cellValue) === arr.lastIndexOf(cellValue) ? this.formatColors.info : '';
149
+ },
150
+ color: (rowData, colname, cellValue, rowIndex) => {
151
+ if (!this.isWithInFormattedRange(rowIndex, colname)) {
152
+ return;
153
+ }
154
+ const arr = typeof cellValue === 'number' ? this.numericData : this.textData;
155
+ return arr.indexOf(cellValue) === arr.lastIndexOf(cellValue) ? this.formatColors.text : '';
156
+ }
157
+ };
158
+ this._formatColors = {
159
+ success: '#4EB862',
160
+ error: '#FF134A',
161
+ warning: '#FBB13C',
162
+ info: '#1377D5',
163
+ text: '#FFF'
164
+ };
165
+ this._numericFormatters = ['Data Bars', 'Color Scale', 'Top 10', 'Greater Than'];
166
+ this._textFormatters = ['Text Contains'];
167
+ this._commonFormattersName = ['Duplicate Values', 'Unique Values', 'Empty'];
168
+ this._selectedData = [];
169
+ this._formattersData = new Map();
170
+ this.destroy$ = new Subject();
171
+ this.formatedRange = new Map();
172
+ this._formattersData.set('Data Bars', this.dataBars);
173
+ this._formattersData.set('Color Scale', this.colorScale);
174
+ this._formattersData.set('Top 10', this.top10Percent);
175
+ this._formattersData.set('Greater Than', this.greaterThan);
176
+ this._formattersData.set('Text Contains', this.textContains);
177
+ this._formattersData.set('Duplicate Values', this.duplicates);
178
+ this._formattersData.set('Unique Values', this.uniques);
179
+ this._formattersData.set('Empty', this.empty);
180
+ }
181
+ ngAfterViewInit() {
182
+ this.grid.rangeSelected.pipe(takeUntil(this.destroy$)).subscribe(() => {
183
+ this.determineFormatters();
184
+ });
185
+ this.grid.cellEdit.pipe(takeUntil(this.destroy$)).subscribe((args) => {
186
+ if ((args.newValue === args.oldValue || !this.formatter)) {
187
+ return;
188
+ }
189
+ if (this.isWithInFormattedRange(args.cellID.rowIndex, args.cellID.columnID - 1)) {
190
+ const value = Number(args.newValue);
191
+ const valueToBeAdded = !Number.isNaN(value) && Number.isFinite(value) ? value : args.newValue;
192
+ this.selectedData.splice(this.selectedData.indexOf(args.oldValue), 1, valueToBeAdded);
193
+ this.recalcCachedValues();
194
+ this.formatCells(this.formatter, undefined, false);
195
+ }
196
+ });
197
+ }
198
+ ngOnDestroy() {
199
+ this.destroy$.next(true);
200
+ this.destroy$.complete();
201
+ }
202
+ formatCells(formatterName, formatRange, reset = true) {
203
+ if (reset) {
204
+ this.resetRange(formatRange);
205
+ }
206
+ this.clearFormatting();
207
+ this.formatter = formatterName;
208
+ this.grid.visibleColumns.forEach(c => {
209
+ if (c.visibleIndex >= this._startColumn && c.visibleIndex <= this._endColumn) {
210
+ c.cellStyles = this._formattersData.get(this.formatter);
211
+ this.grid.notifyChanges();
212
+ }
213
+ });
214
+ }
215
+ clearFormatting() {
216
+ this.formatter = undefined;
217
+ this.grid.visibleColumns.forEach(c => {
218
+ c.cellStyles = undefined;
219
+ this.grid.cdr.detectChanges();
220
+ });
221
+ }
222
+ determineFormatters() {
223
+ const numericData = this.toArray(this.grid.getSelectedData()).some(rec => typeof rec === 'number');
224
+ const textData = this.toArray(this.grid.getSelectedData()).some(rec => typeof rec === 'string');
225
+ const formatters = Array.of(...this._commonFormattersName);
226
+ if (!(numericData) && textData) {
227
+ formatters.splice(0, 0, ...this._textFormatters);
228
+ }
229
+ else if (numericData && !textData) {
230
+ formatters.splice(0, 0, ...this._numericFormatters);
231
+ }
232
+ else {
233
+ formatters.splice(0, 0, ...['Data Bars', 'Color Scale', 'Text Contains']);
234
+ }
235
+ this.onFormattersReady.emit(formatters);
236
+ }
237
+ recalcCachedValues(clearAll = false) {
238
+ if (clearAll) {
239
+ this._startColumn = Math.min(...this.grid.getSelectedRanges().map(r => Number(r.columnStart)));
240
+ this._endColumn = Math.max(...this.grid.getSelectedRanges().map(r => Number(r.columnEnd)));
241
+ this._selectedData = [];
242
+ }
243
+ this._valueForComparison = this.textData[0];
244
+ this._maxValue = Math.max(...this.numericData);
245
+ this._minValue = Math.min(...this.numericData.filter(value => value < 0)) | 0;
246
+ }
247
+ isWithInFormattedRange(rowIndex, colID) {
248
+ const visibleIndex = typeof colID === 'string' ? this.grid.getColumnByName(colID).visibleIndex : colID;
249
+ if (!this.formatedRange.size) {
250
+ return false;
251
+ }
252
+ return this.formatedRange.has(rowIndex) && this.formatedRange.get(rowIndex).has(visibleIndex);
253
+ }
254
+ get middleTresholdValue() { return 0.66 * Math.ceil(this._maxValue); }
255
+ get lowTresholdValue() { return 0.33 * Math.ceil(this._maxValue); }
256
+ get top10PercentTreshold() { return 0.9 * Math.ceil(this._maxValue); }
257
+ get avgValue() {
258
+ return Math.ceil((this.numericData.reduce((a, b) => a + b, 0)) / this.numericData.length);
259
+ }
260
+ get threshold() {
261
+ return Math.ceil(Math.abs(this._minValue) / (this._maxValue + Math.abs(this._minValue)) * 100);
262
+ }
263
+ getPositivePercentage(val) {
264
+ const result = (Math.ceil(val) / (this._maxValue + Math.abs(this._minValue))) * 100;
265
+ return Math.ceil(result);
266
+ }
267
+ getNegativePercentage(val) {
268
+ const result = (Math.abs(val) / (this._maxValue + Math.abs(this._minValue))) * 100;
269
+ return Math.ceil(result);
270
+ }
271
+ resetRange(formatRange) {
272
+ this.formatedRange.clear();
273
+ const customRange = formatRange ? formatRange : this.grid.getSelectedRanges();
274
+ customRange.forEach(range => {
275
+ for (let ri = range.rowStart; ri <= Number(range.rowEnd); ri++) {
276
+ for (let ci = Number(range.columnStart); ci <= Number(range.columnEnd); ci++) {
277
+ this.addToCache(ri, ci);
278
+ }
279
+ }
280
+ });
281
+ this.recalcCachedValues(true);
282
+ }
283
+ addToCache(rowIndex, colIndex, selection = true) {
284
+ this.formatedRange.has(rowIndex) ? this.formatedRange.get(rowIndex).add(colIndex) :
285
+ this.formatedRange.set(rowIndex, new Set()).get(rowIndex).add(colIndex);
286
+ }
287
+ toArray(data) {
288
+ let result = [];
289
+ data.forEach(rec => result = result.concat(Object.values(rec)));
290
+ return result;
291
+ }
292
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxConditionalFormattingDirective, deps: [{ token: i1.IgxGridComponent }], target: i0.ɵɵFactoryTarget.Directive }); }
293
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: IgxConditionalFormattingDirective, selector: "[igxConditionalFormatting]", inputs: { formatter: "formatter", formatColors: "formatColors" }, outputs: { onFormattersReady: "onFormattersReady" }, ngImport: i0 }); }
294
+ }
295
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: IgxConditionalFormattingDirective, decorators: [{
296
+ type: Directive,
297
+ args: [{
298
+ selector: '[igxConditionalFormatting]'
299
+ }]
300
+ }], ctorParameters: function () { return [{ type: i1.IgxGridComponent }]; }, propDecorators: { formatter: [{
301
+ type: Input
302
+ }], formatColors: [{
303
+ type: Input
304
+ }], onFormattersReady: [{
305
+ type: Output
306
+ }] } });
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uYWwtZm9ybWF0dGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyLWV4dHJhcy9zcmMvbGliL2RpcmVjdGl2ZXMvY29uZGl0aW9uYWwtZm9ybWF0dGluZy9jb25kaXRpb25hbC1mb3JtYXR0aW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQVUsS0FBSyxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRTNDLE1BQU0sQ0FBTixJQUFZLHlCQVFYO0FBUkQsV0FBWSx5QkFBeUI7SUFDakMsbURBQXNCLENBQUE7SUFDdEIsdURBQTBCLENBQUE7SUFDMUIsNkNBQWdCLENBQUE7SUFDaEIsMkRBQThCLENBQUE7SUFDOUIsd0RBQTJCLENBQUE7SUFDM0IscURBQXdCLENBQUE7SUFDeEIsNENBQWUsQ0FBQTtBQUNuQixDQUFDLEVBUlcseUJBQXlCLEtBQXpCLHlCQUF5QixRQVFwQztBQVlELE1BQU0sT0FBTyxpQ0FBaUM7SUFJMUMsSUFDVyxZQUFZLENBQUMsR0FBa0I7UUFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7SUFDN0IsQ0FBQztJQUNELElBQVcsWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQXlIRCxJQUFZLFlBQVk7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztTQUFFO1FBQ25HLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBWSxRQUFRO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsSUFBWSxXQUFXO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBcUJELFlBQW1CLElBQXNCO1FBQXRCLFNBQUksR0FBSixJQUFJLENBQWtCO1FBdEpsQyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRWpELGVBQVUsR0FBRztZQUNoQixlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDdkQsSUFBSSxDQUFDLENBQUMsT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRTtvQkFBRSxPQUFPO2lCQUFFO2dCQUNuRyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2pFLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUN2RyxDQUFDO1NBQ0osQ0FBQztRQUVLLGFBQVEsR0FBRztZQUNkLGVBQWUsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUN2RCxJQUFJLENBQUMsQ0FBQyxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFO29CQUFFLE9BQU87aUJBQUU7Z0JBQ25HLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2hDLElBQUksZ0JBQWdCLENBQUM7Z0JBQ3JCLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtvQkFDZixNQUFNLHFCQUFxQixHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7b0JBQzdDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekQsT0FBTywyQ0FBMkMscUJBQXFCO3NCQUNoRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxxQkFBcUIsS0FBSyxxQkFBcUIsR0FBRyxnQkFBZ0I7a0NBQ2xGLGdCQUFnQixTQUFTLENBQUM7aUJBQy9DO3FCQUFNO29CQUNILGdCQUFnQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekQsT0FBTyw0Q0FBNEMsUUFBUTtzQkFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksUUFBUSxLQUFLLFFBQVEsR0FBRyxnQkFBZ0I7a0NBQzFELFFBQVEsR0FBRyxnQkFBZ0IsU0FBUyxDQUFDO2lCQUMxRDtZQUNMLENBQUM7WUFDRCxjQUFjLEVBQUUsVUFBVTtZQUMxQixnQkFBZ0IsRUFBRSxXQUFXO1lBQzdCLG1CQUFtQixFQUFFLFFBQVE7U0FDaEMsQ0FBQztRQUVLLGlCQUFZLEdBQUc7WUFDbEIsZUFBZSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ3ZELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO3VCQUM1RSxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFO29CQUMxQyxPQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO2lCQUNsQztZQUNMLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDN0MsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUM7dUJBQzVFLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7b0JBQzFDLE9BQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7aUJBQ2xDO1lBQ0wsQ0FBQztTQUNKLENBQUM7UUFFSyxnQkFBVyxHQUFHO1lBQ2pCLGVBQWUsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUN2RCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQzt1QkFDaEYsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQzFCLE9BQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7aUJBQ2xDO1lBQ0wsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQzt1QkFDaEYsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQzFCLE9BQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7aUJBQ2xDO1lBQ0wsQ0FBQztTQUNKLENBQUM7UUFFSyxVQUFLLEdBQUc7WUFDWCxlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDdkQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7b0JBQzNFLE9BQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7aUJBQ2xDO1lBQ0wsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtvQkFDM0UsT0FBUSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztpQkFDbEM7WUFDTCxDQUFDO1NBQ0osQ0FBQztRQUVLLGVBQVUsR0FBRztZQUNoQixlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUU7b0JBQUUsT0FBTztpQkFBRTtnQkFDaEUsTUFBTSxHQUFHLEdBQVUsT0FBTyxTQUFTLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNwRixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVoRyxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUFFLE9BQU87aUJBQUU7Z0JBQ2hFLE1BQU0sR0FBRyxHQUFVLE9BQU8sU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDcEYsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEcsQ0FBQztTQUNKLENBQUM7UUFFSyxpQkFBWSxHQUFHO1lBQ2xCLGVBQWUsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUN2RCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztvQkFDL0UsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDaEYsT0FBUSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztpQkFDbEM7WUFDTCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQzdDLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO29CQUMvRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNoRixPQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO2lCQUNsQztZQUNMLENBQUM7U0FDSixDQUFDO1FBRUssWUFBTyxHQUFHO1lBQ2IsZUFBZSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUFFLE9BQU87aUJBQUU7Z0JBQ2hFLE1BQU0sR0FBRyxHQUFVLE9BQU8sU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDcEYsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEcsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRTtvQkFBRSxPQUFPO2lCQUFFO2dCQUNoRSxNQUFNLEdBQUcsR0FBVSxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3BGLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hHLENBQUM7U0FDSixDQUFDO1FBY00sa0JBQWEsR0FBa0I7WUFDbkMsT0FBTyxFQUFFLFNBQVM7WUFDbEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsT0FBTyxFQUFFLFNBQVM7WUFDbEIsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJLEVBQUUsTUFBTTtTQUNmLENBQUM7UUFDTSx1QkFBa0IsR0FBRyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzVFLG9CQUFlLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNwQywwQkFBcUIsR0FBRyxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2RSxrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQU1uQixvQkFBZSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFDekMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDOUIsa0JBQWEsR0FBNkIsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFHN0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLGVBQWU7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2xFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUFFLE9BQU87YUFBRTtZQUNyRSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDN0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDOUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDdEYsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDdEQ7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sV0FBVyxDQUFDLGFBQWEsRUFBRSxXQUFnQixFQUFFLEtBQUssR0FBRyxJQUFJO1FBQzVELElBQUksS0FBSyxFQUFFO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUFFO1FBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUMxRSxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUM3QjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLGVBQWU7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pDLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLG1CQUFtQjtRQUN0QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNuRyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNoRyxNQUFNLFVBQVUsR0FBSSxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxFQUFFO1lBQzVCLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNwRDthQUFNLElBQUksV0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU07WUFDSCxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztTQUM3RTtRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLGtCQUFrQixDQUFDLFFBQVEsR0FBRyxLQUFLO1FBQ3RDLElBQUksUUFBUSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9GLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztTQUMzQjtRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU0sc0JBQXNCLENBQUMsUUFBUSxFQUFFLEtBQUs7UUFDekMsTUFBTSxZQUFZLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN2RyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQy9DLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRCxJQUFZLG1CQUFtQixLQUFLLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5RSxJQUFZLGdCQUFnQixLQUFLLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUzRSxJQUFZLG9CQUFvQixLQUFLLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5RSxJQUFZLFFBQVE7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsSUFBWSxTQUFTO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRU8scUJBQXFCLENBQUMsR0FBRztRQUM3QixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxHQUFHO1FBQzdCLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNuRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLFVBQVUsQ0FBQyxXQUFnQjtRQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDOUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixLQUFLLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQzVELEtBQUssSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtvQkFDMUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7aUJBQzNCO2FBQ0o7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxHQUFHLElBQUk7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ25GLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRU8sT0FBTyxDQUFDLElBQVc7UUFDdkIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDOzhHQXBTUSxpQ0FBaUM7a0dBQWpDLGlDQUFpQzs7MkZBQWpDLGlDQUFpQztrQkFIN0MsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsNEJBQTRCO2lCQUN6Qzt1R0FHVSxTQUFTO3NCQURmLEtBQUs7Z0JBSUssWUFBWTtzQkFEdEIsS0FBSztnQkFTQyxpQkFBaUI7c0JBRHZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSWd4R3JpZENvbXBvbmVudCB9IGZyb20gJ2lnbml0ZXVpLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmV4cG9ydCBlbnVtIENvbmRpdGlvbmFsRm9ybWF0dGluZ1R5cGUge1xyXG4gICAgZGF0YUJhcnMgPSAnRGF0YSBCYXJzJyxcclxuICAgIGNvbG9yU2NhbGUgPSAnQ29sb3IgU2NhbGUnLFxyXG4gICAgdG9wMTAgPSAnVG9wIDEwJyxcclxuICAgIHRleHRDb250YWlucyA9ICdUZXh0IENvbnRhaW5zJyxcclxuICAgIHNpbmdsZSA9ICdEdXBsaWNhdGUgVmFsdWVzJyxcclxuICAgIHVuaXF1ZSA9ICdVbmlxdWUgVmFsdWVzJyxcclxuICAgIGVtcHR5ID0gJ0VtcHR5J1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1hdENvbG9ycyB7XHJcbiAgICBzdWNjZXNzOiBzdHJpbmc7XHJcbiAgICBlcnJvcjogc3RyaW5nO1xyXG4gICAgaW5mbzogc3RyaW5nO1xyXG4gICAgd2FybmluZzogc3RyaW5nO1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW2lneENvbmRpdGlvbmFsRm9ybWF0dGluZ10nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJZ3hDb25kaXRpb25hbEZvcm1hdHRpbmdEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmb3JtYXR0ZXI6IHN0cmluZyB8IENvbmRpdGlvbmFsRm9ybWF0dGluZ1R5cGU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZXQgZm9ybWF0Q29sb3JzKHZhbDogSUZvcm1hdENvbG9ycykgIHtcclxuICAgICAgICB0aGlzLl9mb3JtYXRDb2xvcnMgPSB2YWw7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGZvcm1hdENvbG9ycygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0Q29sb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIG9uRm9ybWF0dGVyc1JlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcclxuXHJcbiAgICBwdWJsaWMgY29sb3JTY2FsZSA9IHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IChyb3dEYXRhLCBjb2xuYW1lLCBjZWxsVmFsdWUsIHJvd0luZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghKHR5cGVvZiBjZWxsVmFsdWUgPT09ICdudW1iZXInICYmIHRoaXMuaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShyb3dJbmRleCwgY29sbmFtZSkpKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb3dUcmVzaG9sZFZhbHVlID49IGNlbGxWYWx1ZSA/IHRoaXMuZm9ybWF0Q29sb3JzLmVycm9yIDpcclxuICAgICAgICAgICAgICAgIHRoaXMubWlkZGxlVHJlc2hvbGRWYWx1ZSA+PSBjZWxsVmFsdWUgPyB0aGlzLmZvcm1hdENvbG9ycy53YXJuaW5nIDogIHRoaXMuZm9ybWF0Q29sb3JzLnN1Y2Nlc3M7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgZGF0YUJhcnMgPSB7XHJcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAocm93RGF0YSwgY29sbmFtZSwgY2VsbFZhbHVlLCByb3dJbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoISh0eXBlb2YgY2VsbFZhbHVlID09PSAnbnVtYmVyJyAmJiB0aGlzLmlzV2l0aEluRm9ybWF0dGVkUmFuZ2Uocm93SW5kZXgsIGNvbG5hbWUpKSkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgY29uc3QgdHJlc2hvbGQgPSB0aGlzLnRocmVzaG9sZDtcclxuICAgICAgICAgICAgbGV0IGdyYWRpZW50UGVyY2VudHM7XHJcbiAgICAgICAgICAgIGlmIChjZWxsVmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZWdhdGl2ZVN0YXJ0aW5nUG9pbnQgPSAxMDAgLSB0cmVzaG9sZDtcclxuICAgICAgICAgICAgICAgIGdyYWRpZW50UGVyY2VudHMgPSB0aGlzLmdldE5lZ2F0aXZlUGVyY2VudGFnZShjZWxsVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgdHJhbnNwYXJlbnQgMCUgJHtuZWdhdGl2ZVN0YXJ0aW5nUG9pbnR9JSxcclxuICAgICAgICAgICAgICAgICAgICAkeyB0aGlzLmZvcm1hdENvbG9ycy5lcnJvcn0gJHtuZWdhdGl2ZVN0YXJ0aW5nUG9pbnR9JSAke25lZ2F0aXZlU3RhcnRpbmdQb2ludCArIGdyYWRpZW50UGVyY2VudHN9JSxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudCAke2dyYWRpZW50UGVyY2VudHN9JSAxMDAlKWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBncmFkaWVudFBlcmNlbnRzID0gdGhpcy5nZXRQb3NpdGl2ZVBlcmNlbnRhZ2UoY2VsbFZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCAwJSAke3RyZXNob2xkfSUsXHJcbiAgICAgICAgICAgICAgICAgICAgJHsgdGhpcy5mb3JtYXRDb2xvcnMuc3VjY2Vzc30gJHt0cmVzaG9sZH0lICR7dHJlc2hvbGQgKyBncmFkaWVudFBlcmNlbnRzfSUsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbnQgJHt0cmVzaG9sZCArIGdyYWRpZW50UGVyY2VudHN9JSAxMDAlKWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGJhY2tncm91bmRTaXplOiAnMTAwJSA4MCUnLFxyXG4gICAgICAgIGJhY2tncm91bmRSZXBlYXQ6ICduby1yZXBlYXQnLFxyXG4gICAgICAgIGJhY2tncm91bmRQb3NpdGlvblk6ICdjZW50ZXInXHJcbiAgICB9O1xyXG5cclxuICAgIHB1YmxpYyB0b3AxMFBlcmNlbnQgPSB7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAocm93RGF0YSwgY29sbmFtZSwgY2VsbFZhbHVlLCByb3dJbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNlbGxWYWx1ZSA9PT0gJ251bWJlcicgJiYgdGhpcy5pc1dpdGhJbkZvcm1hdHRlZFJhbmdlKHJvd0luZGV4LCBjb2xuYW1lKVxyXG4gICAgICAgICAgICAgICAgJiYgY2VsbFZhbHVlID4gdGhpcy50b3AxMFBlcmNlbnRUcmVzaG9sZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICB0aGlzLmZvcm1hdENvbG9ycy5pbmZvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2xvcjogKHJvd0RhdGEsIGNvbG5hbWUsIGNlbGxWYWx1ZSwgcm93SW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjZWxsVmFsdWUgPT09ICdudW1iZXInICYmIHRoaXMuaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShyb3dJbmRleCwgY29sbmFtZSlcclxuICAgICAgICAgICAgICAgICYmIGNlbGxWYWx1ZSA+IHRoaXMudG9wMTBQZXJjZW50VHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAgdGhpcy5mb3JtYXRDb2xvcnMudGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHVibGljIGdyZWF0ZXJUaGFuID0ge1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogKHJvd0RhdGEsIGNvbG5hbWUsIGNlbGxWYWx1ZSwgcm93SW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjZWxsVmFsdWUgPT09ICdudW1iZXInICYmIHRoaXMuaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShyb3dJbmRleCwgY29sbmFtZSlcclxuICAgICAgICAgICAgJiYgY2VsbFZhbHVlID4gdGhpcy5hdmdWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICB0aGlzLmZvcm1hdENvbG9ycy5pbmZvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2xvcjogKHJvd0RhdGEsIGNvbG5hbWUsIGNlbGxWYWx1ZSwgcm93SW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjZWxsVmFsdWUgPT09ICdudW1iZXInICYmIHRoaXMuaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShyb3dJbmRleCwgY29sbmFtZSlcclxuICAgICAgICAgICAgJiYgY2VsbFZhbHVlID4gdGhpcy5hdmdWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICB0aGlzLmZvcm1hdENvbG9ycy50ZXh0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgZW1wdHkgPSB7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAocm93RGF0YSwgY29sbmFtZSwgY2VsbFZhbHVlLCByb3dJbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1dpdGhJbkZvcm1hdHRlZFJhbmdlKHJvd0luZGV4LCBjb2xuYW1lKSAmJiBjZWxsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICB0aGlzLmZvcm1hdENvbG9ycy5pbmZvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2xvcjogKHJvd0RhdGEsIGNvbG5hbWUsIGNlbGxWYWx1ZSwgcm93SW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShyb3dJbmRleCwgY29sbmFtZSkgJiYgY2VsbFZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAgdGhpcy5mb3JtYXRDb2xvcnMudGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHVibGljIGR1cGxpY2F0ZXMgPSB7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAocm93RGF0YSwgY29sbmFtZSwgY2VsbFZhbHVlLCByb3dJbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShyb3dJbmRleCwgY29sbmFtZSkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFycjogYW55W10gPSB0eXBlb2YgY2VsbFZhbHVlID09PSAnbnVtYmVyJyA/IHRoaXMubnVtZXJpY0RhdGEgOiB0aGlzLnRleHREYXRhO1xyXG4gICAgICAgICAgICByZXR1cm4gYXJyLmluZGV4T2YoY2VsbFZhbHVlKSAhPT0gYXJyLmxhc3RJbmRleE9mKGNlbGxWYWx1ZSkgPyAgdGhpcy5mb3JtYXRDb2xvcnMuaW5mbyA6ICcnO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbG9yOiAocm93RGF0YSwgY29sbmFtZSwgY2VsbFZhbHVlLCByb3dJbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShyb3dJbmRleCwgY29sbmFtZSkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFycjogYW55W10gPSB0eXBlb2YgY2VsbFZhbHVlID09PSAnbnVtYmVyJyA/IHRoaXMubnVtZXJpY0RhdGEgOiB0aGlzLnRleHREYXRhO1xyXG4gICAgICAgICAgICByZXR1cm4gYXJyLmluZGV4T2YoY2VsbFZhbHVlKSAhPT0gYXJyLmxhc3RJbmRleE9mKGNlbGxWYWx1ZSkgPyAgdGhpcy5mb3JtYXRDb2xvcnMudGV4dCA6ICcnO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHVibGljIHRleHRDb250YWlucyA9IHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IChyb3dEYXRhLCBjb2xuYW1lLCBjZWxsVmFsdWUsIHJvd0luZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2VsbFZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLmlzV2l0aEluRm9ybWF0dGVkUmFuZ2Uocm93SW5kZXgsIGNvbG5hbWUpICYmXHJcbiAgICAgICAgICAgICAgICBjZWxsVmFsdWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMuX3ZhbHVlRm9yQ29tcGFyaXNvbi50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAgdGhpcy5mb3JtYXRDb2xvcnMuaW5mbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29sb3I6IChyb3dEYXRhLCBjb2xuYW1lLCBjZWxsVmFsdWUsIHJvd0luZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2VsbFZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLmlzV2l0aEluRm9ybWF0dGVkUmFuZ2Uocm93SW5kZXgsIGNvbG5hbWUpICYmXHJcbiAgICAgICAgICAgICAgICBjZWxsVmFsdWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMuX3ZhbHVlRm9yQ29tcGFyaXNvbi50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAgdGhpcy5mb3JtYXRDb2xvcnMudGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHVibGljIHVuaXF1ZXMgPSB7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAocm93RGF0YSwgY29sbmFtZSwgY2VsbFZhbHVlLCByb3dJbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShyb3dJbmRleCwgY29sbmFtZSkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFycjogYW55W10gPSB0eXBlb2YgY2VsbFZhbHVlID09PSAnbnVtYmVyJyA/IHRoaXMubnVtZXJpY0RhdGEgOiB0aGlzLnRleHREYXRhO1xyXG4gICAgICAgICAgICByZXR1cm4gYXJyLmluZGV4T2YoY2VsbFZhbHVlKSA9PT0gYXJyLmxhc3RJbmRleE9mKGNlbGxWYWx1ZSkgPyAgdGhpcy5mb3JtYXRDb2xvcnMuaW5mbyA6ICcnO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29sb3I6IChyb3dEYXRhLCBjb2xuYW1lLCBjZWxsVmFsdWUsIHJvd0luZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1dpdGhJbkZvcm1hdHRlZFJhbmdlKHJvd0luZGV4LCBjb2xuYW1lKSkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgY29uc3QgYXJyOiBhbnlbXSA9IHR5cGVvZiBjZWxsVmFsdWUgPT09ICdudW1iZXInID8gdGhpcy5udW1lcmljRGF0YSA6IHRoaXMudGV4dERhdGE7XHJcbiAgICAgICAgICAgIHJldHVybiBhcnIuaW5kZXhPZihjZWxsVmFsdWUpID09PSBhcnIubGFzdEluZGV4T2YoY2VsbFZhbHVlKSA/ICB0aGlzLmZvcm1hdENvbG9ycy50ZXh0IDogJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGdldCBzZWxlY3RlZERhdGEoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3RlZERhdGEubGVuZ3RoKSB7IHRoaXMuX3NlbGVjdGVkRGF0YSA9IHRoaXMudG9BcnJheSh0aGlzLmdyaWQuZ2V0U2VsZWN0ZWREYXRhKCkpOyB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldCB0ZXh0RGF0YSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGEuZmlsdGVyKHZhbCA9PiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgbnVtZXJpY0RhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRhLmZpbHRlcih2YWwgPT4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfZm9ybWF0Q29sb3JzOiBJRm9ybWF0Q29sb3JzID0ge1xyXG4gICAgICAgIHN1Y2Nlc3M6ICcjNEVCODYyJyxcclxuICAgICAgICBlcnJvcjogJyNGRjEzNEEnLFxyXG4gICAgICAgIHdhcm5pbmc6ICcjRkJCMTNDJyxcclxuICAgICAgICBpbmZvOiAnIzEzNzdENScsXHJcbiAgICAgICAgdGV4dDogJyNGRkYnXHJcbiAgICB9O1xyXG4gICAgcHJpdmF0ZSBfbnVtZXJpY0Zvcm1hdHRlcnMgPSBbJ0RhdGEgQmFycycsICdDb2xvciBTY2FsZScsICdUb3AgMTAnLCAnR3JlYXRlciBUaGFuJ107XHJcbiAgICBwcml2YXRlIF90ZXh0Rm9ybWF0dGVycyA9IFsnVGV4dCBDb250YWlucyddO1xyXG4gICAgcHJpdmF0ZSBfY29tbW9uRm9ybWF0dGVyc05hbWUgPSBbJ0R1cGxpY2F0ZSBWYWx1ZXMnLCAnVW5pcXVlIFZhbHVlcycsICdFbXB0eSddO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWREYXRhID0gW107XHJcbiAgICBwcml2YXRlIF9taW5WYWx1ZTtcclxuICAgIHByaXZhdGUgX21heFZhbHVlO1xyXG4gICAgcHJpdmF0ZSBfc3RhcnRDb2x1bW47XHJcbiAgICBwcml2YXRlIF9lbmRDb2x1bW47XHJcbiAgICBwcml2YXRlIF92YWx1ZUZvckNvbXBhcmlzb247XHJcbiAgICBwcml2YXRlIF9mb3JtYXR0ZXJzRGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgcHJpdmF0ZSBmb3JtYXRlZFJhbmdlOiBNYXA8bnVtYmVyLCBTZXQ8bnVtYmVyPj4gPSBuZXcgTWFwPG51bWJlciwgU2V0PG51bWJlcj4+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIGdyaWQ6IElneEdyaWRDb21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLl9mb3JtYXR0ZXJzRGF0YS5zZXQoJ0RhdGEgQmFycycsIHRoaXMuZGF0YUJhcnMpO1xyXG4gICAgICAgIHRoaXMuX2Zvcm1hdHRlcnNEYXRhLnNldCgnQ29sb3IgU2NhbGUnLCB0aGlzLmNvbG9yU2NhbGUpO1xyXG4gICAgICAgIHRoaXMuX2Zvcm1hdHRlcnNEYXRhLnNldCgnVG9wIDEwJywgdGhpcy50b3AxMFBlcmNlbnQpO1xyXG4gICAgICAgIHRoaXMuX2Zvcm1hdHRlcnNEYXRhLnNldCgnR3JlYXRlciBUaGFuJywgdGhpcy5ncmVhdGVyVGhhbik7XHJcbiAgICAgICAgdGhpcy5fZm9ybWF0dGVyc0RhdGEuc2V0KCdUZXh0IENvbnRhaW5zJywgdGhpcy50ZXh0Q29udGFpbnMpO1xyXG4gICAgICAgIHRoaXMuX2Zvcm1hdHRlcnNEYXRhLnNldCgnRHVwbGljYXRlIFZhbHVlcycsIHRoaXMuZHVwbGljYXRlcyk7XHJcbiAgICAgICAgdGhpcy5fZm9ybWF0dGVyc0RhdGEuc2V0KCdVbmlxdWUgVmFsdWVzJywgdGhpcy51bmlxdWVzKTtcclxuICAgICAgICB0aGlzLl9mb3JtYXR0ZXJzRGF0YS5zZXQoJ0VtcHR5JywgdGhpcy5lbXB0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdyaWQucmFuZ2VTZWxlY3RlZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kZXRlcm1pbmVGb3JtYXR0ZXJzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5ncmlkLmNlbGxFZGl0LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFyZ3M6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoKGFyZ3MubmV3VmFsdWUgPT09IGFyZ3Mub2xkVmFsdWUgfHwgIXRoaXMuZm9ybWF0dGVyKSkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShhcmdzLmNlbGxJRC5yb3dJbmRleCwgYXJncy5jZWxsSUQuY29sdW1uSUQgLSAxKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBOdW1iZXIoYXJncy5uZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVRvQmVBZGRlZCA9ICFOdW1iZXIuaXNOYU4odmFsdWUpICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IGFyZ3MubmV3VmFsdWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YS5zcGxpY2UodGhpcy5zZWxlY3RlZERhdGEuaW5kZXhPZihhcmdzLm9sZFZhbHVlKSwgMSwgdmFsdWVUb0JlQWRkZWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNhbGNDYWNoZWRWYWx1ZXMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0Q2VsbHModGhpcy5mb3JtYXR0ZXIsIHVuZGVmaW5lZCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvcm1hdENlbGxzKGZvcm1hdHRlck5hbWUsIGZvcm1hdFJhbmdlPzogW10sIHJlc2V0ID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmIChyZXNldCkgeyB0aGlzLnJlc2V0UmFuZ2UoZm9ybWF0UmFuZ2UpOyB9XHJcbiAgICAgICAgdGhpcy5jbGVhckZvcm1hdHRpbmcoKTtcclxuICAgICAgICB0aGlzLmZvcm1hdHRlciA9IGZvcm1hdHRlck5hbWU7XHJcbiAgICAgICAgdGhpcy5ncmlkLnZpc2libGVDb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjLnZpc2libGVJbmRleCA+PSB0aGlzLl9zdGFydENvbHVtbiAmJiBjLnZpc2libGVJbmRleCA8PSB0aGlzLl9lbmRDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIGMuY2VsbFN0eWxlcyA9IHRoaXMuX2Zvcm1hdHRlcnNEYXRhLmdldCh0aGlzLmZvcm1hdHRlcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQubm90aWZ5Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyRm9ybWF0dGluZygpIHtcclxuICAgICAgICB0aGlzLmZvcm1hdHRlciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmdyaWQudmlzaWJsZUNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgICAgYy5jZWxsU3R5bGVzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWQuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGV0ZXJtaW5lRm9ybWF0dGVycygpIHtcclxuICAgICAgICBjb25zdCBudW1lcmljRGF0YSA9IHRoaXMudG9BcnJheSh0aGlzLmdyaWQuZ2V0U2VsZWN0ZWREYXRhKCkpLnNvbWUocmVjID0+IHR5cGVvZiByZWMgPT09ICdudW1iZXInKTtcclxuICAgICAgICBjb25zdCB0ZXh0RGF0YSA9IHRoaXMudG9BcnJheSh0aGlzLmdyaWQuZ2V0U2VsZWN0ZWREYXRhKCkpLnNvbWUocmVjID0+IHR5cGVvZiByZWMgPT09ICdzdHJpbmcnKTtcclxuICAgICAgICBjb25zdCBmb3JtYXR0ZXJzID0gIEFycmF5Lm9mKC4uLnRoaXMuX2NvbW1vbkZvcm1hdHRlcnNOYW1lKTtcclxuICAgICAgICBpZiAoIShudW1lcmljRGF0YSkgJiYgdGV4dERhdGEpIHtcclxuICAgICAgICAgICAgZm9ybWF0dGVycy5zcGxpY2UoMCwgMCwgLi4udGhpcy5fdGV4dEZvcm1hdHRlcnMpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobnVtZXJpY0RhdGEgJiYgIXRleHREYXRhKSB7XHJcbiAgICAgICAgICAgIGZvcm1hdHRlcnMuc3BsaWNlKDAsIDAsIC4uLnRoaXMuX251bWVyaWNGb3JtYXR0ZXJzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3JtYXR0ZXJzLnNwbGljZSgwLCAwLCAuLi5bJ0RhdGEgQmFycycsICdDb2xvciBTY2FsZScsICdUZXh0IENvbnRhaW5zJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uRm9ybWF0dGVyc1JlYWR5LmVtaXQoZm9ybWF0dGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY2FsY0NhY2hlZFZhbHVlcyhjbGVhckFsbCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKGNsZWFyQWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0Q29sdW1uID0gTWF0aC5taW4oLi4udGhpcy5ncmlkLmdldFNlbGVjdGVkUmFuZ2VzKCkubWFwKHIgPT4gTnVtYmVyKHIuY29sdW1uU3RhcnQpKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZENvbHVtbiA9IE1hdGgubWF4KC4uLnRoaXMuZ3JpZC5nZXRTZWxlY3RlZFJhbmdlcygpLm1hcChyID0+IE51bWJlcihyLmNvbHVtbkVuZCkpKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRhID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3ZhbHVlRm9yQ29tcGFyaXNvbiA9IHRoaXMudGV4dERhdGFbMF07XHJcbiAgICAgICAgdGhpcy5fbWF4VmFsdWUgPSBNYXRoLm1heCguLi50aGlzLm51bWVyaWNEYXRhKTtcclxuICAgICAgICB0aGlzLl9taW5WYWx1ZSA9IE1hdGgubWluKC4uLnRoaXMubnVtZXJpY0RhdGEuZmlsdGVyKHZhbHVlID0+IHZhbHVlIDwgMCkpIHwgMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNXaXRoSW5Gb3JtYXR0ZWRSYW5nZShyb3dJbmRleCwgY29sSUQpIHtcclxuICAgICAgICBjb25zdCB2aXNpYmxlSW5kZXggPSB0eXBlb2YgY29sSUQgPT09ICdzdHJpbmcnID8gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZShjb2xJRCkudmlzaWJsZUluZGV4IDogY29sSUQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1hdGVkUmFuZ2Uuc2l6ZSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRlZFJhbmdlLmhhcyhyb3dJbmRleCkgJiYgdGhpcy5mb3JtYXRlZFJhbmdlLmdldChyb3dJbmRleCkuaGFzKHZpc2libGVJbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgbWlkZGxlVHJlc2hvbGRWYWx1ZSgpIHsgcmV0dXJuIDAuNjYgKiBNYXRoLmNlaWwodGhpcy5fbWF4VmFsdWUpOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgbG93VHJlc2hvbGRWYWx1ZSgpIHsgcmV0dXJuIDAuMzMgKiBNYXRoLmNlaWwodGhpcy5fbWF4VmFsdWUpOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgdG9wMTBQZXJjZW50VHJlc2hvbGQoKSB7IHJldHVybiAwLjkgKiBNYXRoLmNlaWwodGhpcy5fbWF4VmFsdWUpOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgYXZnVmFsdWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCgodGhpcy5udW1lcmljRGF0YS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSkgLyB0aGlzLm51bWVyaWNEYXRhLmxlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgdGhyZXNob2xkKCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoTWF0aC5hYnModGhpcy5fbWluVmFsdWUpIC8gKHRoaXMuX21heFZhbHVlICsgTWF0aC5hYnModGhpcy5fbWluVmFsdWUpKSAqIDEwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRQb3NpdGl2ZVBlcmNlbnRhZ2UodmFsKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKE1hdGguY2VpbCh2YWwpIC8gKHRoaXMuX21heFZhbHVlICsgTWF0aC5hYnModGhpcy5fbWluVmFsdWUpKSkgKiAxMDA7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChyZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TmVnYXRpdmVQZXJjZW50YWdlKHZhbCkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChNYXRoLmFicyh2YWwpIC8gKHRoaXMuX21heFZhbHVlICsgTWF0aC5hYnModGhpcy5fbWluVmFsdWUpKSkgKiAxMDA7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChyZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzZXRSYW5nZShmb3JtYXRSYW5nZT86IFtdKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtYXRlZFJhbmdlLmNsZWFyKCk7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tUmFuZ2UgPSBmb3JtYXRSYW5nZSA/IGZvcm1hdFJhbmdlIDogdGhpcy5ncmlkLmdldFNlbGVjdGVkUmFuZ2VzKCk7XHJcbiAgICAgICAgY3VzdG9tUmFuZ2UuZm9yRWFjaChyYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJpID0gcmFuZ2Uucm93U3RhcnQ7IHJpIDw9IE51bWJlcihyYW5nZS5yb3dFbmQpOyByaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjaSA9IE51bWJlcihyYW5nZS5jb2x1bW5TdGFydCk7IGNpIDw9IE51bWJlcihyYW5nZS5jb2x1bW5FbmQpOyBjaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUb0NhY2hlKHJpLCBjaSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlY2FsY0NhY2hlZFZhbHVlcyh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFRvQ2FjaGUocm93SW5kZXgsIGNvbEluZGV4LCBzZWxlY3Rpb24gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtYXRlZFJhbmdlLmhhcyhyb3dJbmRleCkgPyB0aGlzLmZvcm1hdGVkUmFuZ2UuZ2V0KHJvd0luZGV4KS5hZGQoY29sSW5kZXgpIDpcclxuICAgICAgICB0aGlzLmZvcm1hdGVkUmFuZ2Uuc2V0KHJvd0luZGV4LCBuZXcgU2V0PG51bWJlcj4oKSkuZ2V0KHJvd0luZGV4KS5hZGQoY29sSW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdG9BcnJheShkYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcclxuICAgICAgICBkYXRhLmZvckVhY2gocmVjID0+IHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoT2JqZWN0LnZhbHVlcyhyZWMpKSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuIl19