@firestitch/report 18.18.0 → 18.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (18) hide show
  1. package/app/reports/dialogs/global-settings/global-settings.component.d.ts +2 -6
  2. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -2
  3. package/app/reports/views/report/fs-ai-report.component.d.ts +1 -0
  4. package/esm2022/app/reports/dialogs/global-settings/components/ai-knowledge/ai-knowledge.component.mjs +8 -6
  5. package/esm2022/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.mjs +3 -3
  6. package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +32 -51
  7. package/esm2022/app/reports/dialogs/instruction-history/instruction-history.component.mjs +5 -5
  8. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +3 -11
  9. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +13 -4
  10. package/fesm2022/{firestitch-report-echarts-qh_mqik9.mjs → firestitch-report-echarts-DKuqS_De.mjs} +2 -2
  11. package/fesm2022/{firestitch-report-echarts-qh_mqik9.mjs.map → firestitch-report-echarts-DKuqS_De.mjs.map} +1 -1
  12. package/fesm2022/{firestitch-report-firestitch-report-D-WG_G5d.mjs → firestitch-report-firestitch-report-CkTkXk5B.mjs} +63 -103
  13. package/fesm2022/firestitch-report-firestitch-report-CkTkXk5B.mjs.map +1 -0
  14. package/fesm2022/firestitch-report.mjs +1 -1
  15. package/package.json +1 -1
  16. package/app/reports/dialogs/global-settings/components/general/general.component.d.ts +0 -8
  17. package/esm2022/app/reports/dialogs/global-settings/components/general/general.component.mjs +0 -34
  18. package/fesm2022/firestitch-report-firestitch-report-D-WG_G5d.mjs.map +0 -1
@@ -214,7 +214,7 @@ export class FsAiReportComponent {
214
214
  toggleMasterMode() {
215
215
  this._canvas?.toggleMasterMode();
216
216
  }
217
- // Report settings — name, page size, export as a package, delete. The
217
+ // Report settings — name, page size, delete. The
218
218
  // dialog performs the delete itself; we react to what it reports back.
219
219
  reportSettings() {
220
220
  const report = this.report();
@@ -354,6 +354,15 @@ export class FsAiReportComponent {
354
354
  this._process.download(format === 'xlsx' ? 'Exporting Excel' : 'Exporting data', this._collector.exportWording(report, snapshot, pageId)
355
355
  .pipe(switchMap(({ lines, titles }) => this._reportData.exportReport(report.id, filters, pageId, frequency, lines, states, titles, {}, format))));
356
356
  }
357
+ // The report's definition as a package (.report.zip) that another server
358
+ // imports as a new report: written server-side, downloaded through the dock.
359
+ exportPackage() {
360
+ const report = this.report();
361
+ if (!report) {
362
+ return;
363
+ }
364
+ this._process.download('Exporting report package', this._reportData.exportPackage(report.id));
365
+ }
357
366
  // React to each chat turn (fs-chat handles the request + persistence); we
358
367
  // only care about the report side effects this context's backend flags.
359
368
  onChatResponse(response) {
@@ -668,7 +677,7 @@ export class FsAiReportComponent {
668
677
  // The bar's date pickers start their weeks on Monday and list the built-in
669
678
  // presets; a preset only sets the days.
670
679
  provideReportDatePicker(),
671
- ], viewQueries: [{ propertyName: "_split", first: true, predicate: ["split"], descendants: true, static: true }, { propertyName: "_chatPanel", first: true, predicate: ["chatPanel"], descendants: true, read: ElementRef }, { propertyName: "_canvas", first: true, predicate: ReportCanvasComponent, descendants: true }, { propertyName: "_reportBar", first: true, predicate: FilterComponent, descendants: true }], ngImport: i0, template: "<div class=\"fs-ai-report fs-column\">\n\n <div class=\"fs-ai-report__header fs-row.align-center\">\n <h2 class=\"fs-ai-report__title fs-flex\">{{ report()?.name }}</h2>\n\n @if (report()) {\n <!-- Report-level filters, inline with the toolbar actions, with the\n report's saved filters in fs-filter's own Saved filters menu.\n fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the\n block is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters()) {\n @for (key of [reportFilterKey()]; track key) {\n <fs-filter\n class=\"fs-ai-report__filters\"\n [config]=\"reportFilterConfig()\">\n </fs-filter>\n }\n }\n\n <!-- What layout editing can add or switch to, and the way out of it.\n One style for all three \u2014 outlined, icon and text. \"Header & footer\"\n is a toggle: it keeps its label and turns gray while it is on. -->\n @if (editMode()) {\n <div class=\"fs-ai-report__edit-tools fs-row.align-center.gap-xs\">\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"fs-ai-report__master\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n </div>\n }\n\n <!-- One icon for both states: it reads as pressed while editing rather\n than swapping to something else. -->\n <button\n mat-icon-button\n type=\"button\"\n class=\"fs-ai-report__toggle\"\n [class.active]=\"editMode()\"\n [matTooltip]=\"editMode() ? 'Done editing' : 'Edit layout'\"\n (click)=\"toggleEditMode()\">\n <mat-icon>dashboard_customize</mat-icon>\n </button>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Export\"\n [fsMenuTriggerFor]=\"exportMenu\">\n <mat-icon>download</mat-icon>\n </button>\n <fs-menu #exportMenu>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n Export Raw Data\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n Export Raw Data (This Page)\n </ng-template>\n }\n <ng-template\n fs-menu-item\n (click)=\"exportData(false, 'xlsx')\">\n Export Excel\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true, 'xlsx')\">\n Export Excel (This Page)\n </ng-template>\n }\n </fs-menu>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Report settings\"\n (click)=\"reportSettings()\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n\n <div\n #split\n class=\"fs-ai-report__split fs-row.align-start\">\n @if (chatEnabled()) {\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n [basePath]=\"chatBasePath()\"\n [ready]=\"chatPageId() !== null\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n }\n\n <div class=\"viewer fs-flex fs-column\">\n @if (report()) {\n <app-report-canvas\n [report]=\"report()\"\n [editMode]=\"editMode()\"\n [pageId]=\"pageId()\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n </div>\n</div>\n", styles: [".fs-ai-report{height:100%;min-height:500px;display:flex;flex-direction:column}.fs-ai-report__header{flex:0 0 auto;margin-bottom:10px}.fs-ai-report__title{margin:0;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fs-ai-report__filters{flex:0 1 auto;min-width:0;display:block;margin:0 5px 0 0}.fs-ai-report__filters ::ng-deep .filter-bar-container{align-items:center!important}.fs-ai-report__filters ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.fs-ai-report__toggle.active{background:#e3ecf7;color:var(--brand-primary-color, #2196f3)}.fs-ai-report__master.active{background:#eceff3}.fs-ai-report__edit-tools{margin:0 5px}.fs-ai-report__split{flex:1 1 auto;min-height:0}.fs-ai-report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:400px;min-width:0;border:none}.fs-ai-report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.fs-ai-report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.fs-ai-report .resizer:before{content:\"\";width:3px;border-radius:3px;background:transparent;transition:background-color .12s ease}.fs-ai-report .resizer:hover:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.fs-ai-report__split.resizing .resizer:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing .chat,.fs-ai-report__split.resizing .viewer{pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i1.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "component", type: FsAiChatComponent, selector: "fs-ai-chat", inputs: ["basePath", "requestData", "ready", "introMessage", "showThinking"], outputs: ["response", "showThinkingChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ReportCanvasComponent, selector: "app-report-canvas", inputs: ["report", "editMode", "pageId"], outputs: ["componentSettings", "reportChanged", "pageChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
680
+ ], viewQueries: [{ propertyName: "_split", first: true, predicate: ["split"], descendants: true, static: true }, { propertyName: "_chatPanel", first: true, predicate: ["chatPanel"], descendants: true, read: ElementRef }, { propertyName: "_canvas", first: true, predicate: ReportCanvasComponent, descendants: true }, { propertyName: "_reportBar", first: true, predicate: FilterComponent, descendants: true }], ngImport: i0, template: "<div class=\"fs-ai-report fs-column\">\n\n <div class=\"fs-ai-report__header fs-row.align-center\">\n <h2 class=\"fs-ai-report__title fs-flex\">{{ report()?.name }}</h2>\n\n @if (report()) {\n <!-- Report-level filters, inline with the toolbar actions, with the\n report's saved filters in fs-filter's own Saved filters menu.\n fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the\n block is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters()) {\n @for (key of [reportFilterKey()]; track key) {\n <fs-filter\n class=\"fs-ai-report__filters\"\n [config]=\"reportFilterConfig()\">\n </fs-filter>\n }\n }\n\n <!-- What layout editing can add or switch to, and the way out of it.\n One style for all three \u2014 outlined, icon and text. \"Header & footer\"\n is a toggle: it keeps its label and turns gray while it is on. -->\n @if (editMode()) {\n <div class=\"fs-ai-report__edit-tools fs-row.align-center.gap-xs\">\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"fs-ai-report__master\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n </div>\n }\n\n <!-- One icon for both states: it reads as pressed while editing rather\n than swapping to something else. -->\n <button\n mat-icon-button\n type=\"button\"\n class=\"fs-ai-report__toggle\"\n [class.active]=\"editMode()\"\n [matTooltip]=\"editMode() ? 'Done editing' : 'Edit layout'\"\n (click)=\"toggleEditMode()\">\n <mat-icon>dashboard_customize</mat-icon>\n </button>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Export\"\n [fsMenuTriggerFor]=\"exportMenu\">\n <mat-icon>download</mat-icon>\n </button>\n <fs-menu #exportMenu>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n Export Raw Data\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n Export Raw Data (This Page)\n </ng-template>\n }\n <ng-template\n fs-menu-item\n (click)=\"exportData(false, 'xlsx')\">\n Export Excel\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true, 'xlsx')\">\n Export Excel (This Page)\n </ng-template>\n }\n <ng-template\n fs-menu-item\n (click)=\"exportPackage()\">\n Export Report Package\n </ng-template>\n </fs-menu>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Report settings\"\n (click)=\"reportSettings()\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n\n <div\n #split\n class=\"fs-ai-report__split fs-row.align-start\">\n @if (chatEnabled()) {\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n [basePath]=\"chatBasePath()\"\n [ready]=\"chatPageId() !== null\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n }\n\n <div class=\"viewer fs-flex fs-column\">\n @if (report()) {\n <app-report-canvas\n [report]=\"report()\"\n [editMode]=\"editMode()\"\n [pageId]=\"pageId()\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n </div>\n</div>\n", styles: [".fs-ai-report{height:100%;min-height:500px;display:flex;flex-direction:column}.fs-ai-report__header{flex:0 0 auto;margin-bottom:10px}.fs-ai-report__title{margin:0;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fs-ai-report__filters{flex:0 1 auto;min-width:0;display:block;margin:0 5px 0 0}.fs-ai-report__filters ::ng-deep .filter-bar-container{align-items:center!important}.fs-ai-report__filters ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.fs-ai-report__toggle.active{background:#e3ecf7;color:var(--brand-primary-color, #2196f3)}.fs-ai-report__master.active{background:#eceff3}.fs-ai-report__edit-tools{margin:0 5px}.fs-ai-report__split{flex:1 1 auto;min-height:0}.fs-ai-report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:400px;min-width:0;border:none}.fs-ai-report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.fs-ai-report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.fs-ai-report .resizer:before{content:\"\";width:3px;border-radius:3px;background:transparent;transition:background-color .12s ease}.fs-ai-report .resizer:hover:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.fs-ai-report__split.resizing .resizer:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing .chat,.fs-ai-report__split.resizing .viewer{pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i1.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "component", type: FsAiChatComponent, selector: "fs-ai-chat", inputs: ["basePath", "requestData", "ready", "introMessage", "showThinking"], outputs: ["response", "showThinkingChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ReportCanvasComponent, selector: "app-report-canvas", inputs: ["report", "editMode", "pageId"], outputs: ["componentSettings", "reportChanged", "pageChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
672
681
  }
673
682
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FsAiReportComponent, decorators: [{
674
683
  type: Component,
@@ -700,7 +709,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
700
709
  MatIconModule,
701
710
  MatTooltipModule,
702
711
  ReportCanvasComponent,
703
- ], template: "<div class=\"fs-ai-report fs-column\">\n\n <div class=\"fs-ai-report__header fs-row.align-center\">\n <h2 class=\"fs-ai-report__title fs-flex\">{{ report()?.name }}</h2>\n\n @if (report()) {\n <!-- Report-level filters, inline with the toolbar actions, with the\n report's saved filters in fs-filter's own Saved filters menu.\n fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the\n block is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters()) {\n @for (key of [reportFilterKey()]; track key) {\n <fs-filter\n class=\"fs-ai-report__filters\"\n [config]=\"reportFilterConfig()\">\n </fs-filter>\n }\n }\n\n <!-- What layout editing can add or switch to, and the way out of it.\n One style for all three \u2014 outlined, icon and text. \"Header & footer\"\n is a toggle: it keeps its label and turns gray while it is on. -->\n @if (editMode()) {\n <div class=\"fs-ai-report__edit-tools fs-row.align-center.gap-xs\">\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"fs-ai-report__master\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n </div>\n }\n\n <!-- One icon for both states: it reads as pressed while editing rather\n than swapping to something else. -->\n <button\n mat-icon-button\n type=\"button\"\n class=\"fs-ai-report__toggle\"\n [class.active]=\"editMode()\"\n [matTooltip]=\"editMode() ? 'Done editing' : 'Edit layout'\"\n (click)=\"toggleEditMode()\">\n <mat-icon>dashboard_customize</mat-icon>\n </button>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Export\"\n [fsMenuTriggerFor]=\"exportMenu\">\n <mat-icon>download</mat-icon>\n </button>\n <fs-menu #exportMenu>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n Export Raw Data\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n Export Raw Data (This Page)\n </ng-template>\n }\n <ng-template\n fs-menu-item\n (click)=\"exportData(false, 'xlsx')\">\n Export Excel\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true, 'xlsx')\">\n Export Excel (This Page)\n </ng-template>\n }\n </fs-menu>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Report settings\"\n (click)=\"reportSettings()\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n\n <div\n #split\n class=\"fs-ai-report__split fs-row.align-start\">\n @if (chatEnabled()) {\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n [basePath]=\"chatBasePath()\"\n [ready]=\"chatPageId() !== null\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n }\n\n <div class=\"viewer fs-flex fs-column\">\n @if (report()) {\n <app-report-canvas\n [report]=\"report()\"\n [editMode]=\"editMode()\"\n [pageId]=\"pageId()\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n </div>\n</div>\n", styles: [".fs-ai-report{height:100%;min-height:500px;display:flex;flex-direction:column}.fs-ai-report__header{flex:0 0 auto;margin-bottom:10px}.fs-ai-report__title{margin:0;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fs-ai-report__filters{flex:0 1 auto;min-width:0;display:block;margin:0 5px 0 0}.fs-ai-report__filters ::ng-deep .filter-bar-container{align-items:center!important}.fs-ai-report__filters ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.fs-ai-report__toggle.active{background:#e3ecf7;color:var(--brand-primary-color, #2196f3)}.fs-ai-report__master.active{background:#eceff3}.fs-ai-report__edit-tools{margin:0 5px}.fs-ai-report__split{flex:1 1 auto;min-height:0}.fs-ai-report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:400px;min-width:0;border:none}.fs-ai-report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.fs-ai-report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.fs-ai-report .resizer:before{content:\"\";width:3px;border-radius:3px;background:transparent;transition:background-color .12s ease}.fs-ai-report .resizer:hover:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.fs-ai-report__split.resizing .resizer:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing .chat,.fs-ai-report__split.resizing .viewer{pointer-events:none}\n"] }]
712
+ ], template: "<div class=\"fs-ai-report fs-column\">\n\n <div class=\"fs-ai-report__header fs-row.align-center\">\n <h2 class=\"fs-ai-report__title fs-flex\">{{ report()?.name }}</h2>\n\n @if (report()) {\n <!-- Report-level filters, inline with the toolbar actions, with the\n report's saved filters in fs-filter's own Saved filters menu.\n fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the\n block is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters()) {\n @for (key of [reportFilterKey()]; track key) {\n <fs-filter\n class=\"fs-ai-report__filters\"\n [config]=\"reportFilterConfig()\">\n </fs-filter>\n }\n }\n\n <!-- What layout editing can add or switch to, and the way out of it.\n One style for all three \u2014 outlined, icon and text. \"Header & footer\"\n is a toggle: it keeps its label and turns gray while it is on. -->\n @if (editMode()) {\n <div class=\"fs-ai-report__edit-tools fs-row.align-center.gap-xs\">\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"fs-ai-report__master\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n </div>\n }\n\n <!-- One icon for both states: it reads as pressed while editing rather\n than swapping to something else. -->\n <button\n mat-icon-button\n type=\"button\"\n class=\"fs-ai-report__toggle\"\n [class.active]=\"editMode()\"\n [matTooltip]=\"editMode() ? 'Done editing' : 'Edit layout'\"\n (click)=\"toggleEditMode()\">\n <mat-icon>dashboard_customize</mat-icon>\n </button>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Export\"\n [fsMenuTriggerFor]=\"exportMenu\">\n <mat-icon>download</mat-icon>\n </button>\n <fs-menu #exportMenu>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n Export Raw Data\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n Export Raw Data (This Page)\n </ng-template>\n }\n <ng-template\n fs-menu-item\n (click)=\"exportData(false, 'xlsx')\">\n Export Excel\n </ng-template>\n @if ((report()?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true, 'xlsx')\">\n Export Excel (This Page)\n </ng-template>\n }\n <ng-template\n fs-menu-item\n (click)=\"exportPackage()\">\n Export Report Package\n </ng-template>\n </fs-menu>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Report settings\"\n (click)=\"reportSettings()\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n\n <div\n #split\n class=\"fs-ai-report__split fs-row.align-start\">\n @if (chatEnabled()) {\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n [basePath]=\"chatBasePath()\"\n [ready]=\"chatPageId() !== null\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n }\n\n <div class=\"viewer fs-flex fs-column\">\n @if (report()) {\n <app-report-canvas\n [report]=\"report()\"\n [editMode]=\"editMode()\"\n [pageId]=\"pageId()\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n </div>\n</div>\n", styles: [".fs-ai-report{height:100%;min-height:500px;display:flex;flex-direction:column}.fs-ai-report__header{flex:0 0 auto;margin-bottom:10px}.fs-ai-report__title{margin:0;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fs-ai-report__filters{flex:0 1 auto;min-width:0;display:block;margin:0 5px 0 0}.fs-ai-report__filters ::ng-deep .filter-bar-container{align-items:center!important}.fs-ai-report__filters ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.fs-ai-report__toggle.active{background:#e3ecf7;color:var(--brand-primary-color, #2196f3)}.fs-ai-report__master.active{background:#eceff3}.fs-ai-report__edit-tools{margin:0 5px}.fs-ai-report__split{flex:1 1 auto;min-height:0}.fs-ai-report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:400px;min-width:0;border:none}.fs-ai-report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.fs-ai-report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.fs-ai-report .resizer:before{content:\"\";width:3px;border-radius:3px;background:transparent;transition:background-color .12s ease}.fs-ai-report .resizer:hover:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.fs-ai-report__split.resizing .resizer:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing .chat,.fs-ai-report__split.resizing .viewer{pointer-events:none}\n"] }]
704
713
  }], ctorParameters: () => [], propDecorators: { _split: [{
705
714
  type: ViewChild,
706
715
  args: ['split', { static: true }]
@@ -714,4 +723,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
714
723
  type: ViewChild,
715
724
  args: [FilterComponent]
716
725
  }] } });
717
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQ0ssZUFBZSxFQUFnQixjQUFjLEdBQ3hELE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFCLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDL0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFDTCwwQkFBMEIsR0FDM0IsTUFBTSwrREFBK0QsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQXdCLE1BQU0seURBQXlELENBQUM7QUFDeEgsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDNUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFRbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsYUFBYSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFDM0csWUFBWSxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsZUFBZSxHQUNyRixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7OztBQUd4RCw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSwyQ0FBMkM7QUF1QzNDLE1BQU0sT0FBTyxtQkFBbUI7SUFFOUIsNEVBQTRFO0lBQzVELFFBQVEsR0FBRyxLQUFLLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRXRELDBFQUEwRTtJQUMxRCxRQUFRLEdBQUcsS0FBSyxDQUFTLFNBQVMsQ0FBQyxDQUFDO0lBRXBELDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLHdFQUF3RTtJQUN4RSx3RUFBd0U7SUFDeEUsbUVBQW1FO0lBQ25ELGNBQWMsR0FBRyxLQUFLLENBQWdCLE1BQU0sQ0FBQyxDQUFDO0lBRTlELDRFQUE0RTtJQUM1RSxlQUFlO0lBQ0MsT0FBTyxHQUFHLE1BQU0sRUFBVSxDQUFDO0lBRTNDLDJFQUEyRTtJQUMzRSwrQkFBK0I7SUFDZixPQUFPLEdBQUcsTUFBTSxFQUFVLENBQUM7SUFFM0MsNEVBQTRFO0lBQzVFLG9EQUFvRDtJQUNwQyxXQUFXLEdBQUcsTUFBTSxFQUFpQixDQUFDO0lBRXRDLE1BQU0sR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQ3JDLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFekMsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSw2REFBNkQ7SUFDN0MsTUFBTSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFckQsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSxpRUFBaUU7SUFDakUsMkVBQTJFO0lBQzNFLDhFQUE4RTtJQUM5RSxvREFBb0Q7SUFDcEMsVUFBVSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFekQsNkRBQTZEO0lBQzdELHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsNERBQTREO0lBQzVELEVBQUU7SUFDRiw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RCxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUMzQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUM1RSxDQUFDLENBQUMsQ0FBQztJQUVILDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsb0NBQW9DO0lBQ3BCLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUU3QixPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCwyRUFBMkU7SUFDM0Usd0NBQXdDO0lBQ3hCLGtCQUFrQixHQUFHLE1BQU0sQ0FBc0IsSUFBSSxDQUFDLENBQUM7SUFFdkUsNEVBQTRFO0lBQzVFLCtEQUErRDtJQUMvQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQy9DLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQztJQUVILHdFQUF3RTtJQUN4RSwwRUFBMEU7SUFDMUUsZ0VBQWdFO0lBQ2hELGVBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzlDLE9BQU87WUFDTCxtRUFBbUU7WUFDbkUsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsMkVBQTJFO1lBQzNFLCtEQUErRDtZQUMvRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtZQUM1Qiw4RUFBOEU7WUFDOUUseUVBQXlFO1lBQ3pFLHFFQUFxRTtZQUNyRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUcsc0VBQXNFO1lBQ3RFLG1DQUFtQztZQUNuQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3RFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsQ0FBQyxDQUFDLENBQUM7SUFHSyxNQUFNLENBQThCO0lBRTVDLDJDQUEyQztJQUVuQyxVQUFVLENBQTJCO0lBRTdDLDBFQUEwRTtJQUMxRSxpQkFBaUI7SUFFVCxPQUFPLENBQXlCO0lBRXhDLHVFQUF1RTtJQUN2RSx5REFBeUQ7SUFFakQsVUFBVSxDQUFtQjtJQUU3QixXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixZQUFZLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDaEQsY0FBYyxHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ3BELGNBQWMsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM3QyxVQUFVLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDbEQsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QixPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUvQixrRUFBa0U7SUFDakQsV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV6Qyx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUscURBQXFEO0lBQzdDLGdCQUFnQixHQUFtQyxJQUFJLENBQUM7SUFFaEUsaUVBQWlFO0lBQ2pFLGtEQUFrRDtJQUMxQyw0QkFBNEIsR0FBa0IsSUFBSSxDQUFDO0lBRTNEO1FBQ0UsMEVBQTBFO1FBQzFFLGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRW5GLHlFQUF5RTtRQUN6RSx3QkFBd0I7UUFDeEIsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILHFEQUFxRDtRQUNyRCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRWpDLHdFQUF3RTtZQUN4RSxzRUFBc0U7WUFDdEUsc0VBQXNFO1lBQ3RFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVyQywwRUFBMEU7WUFDMUUsdUVBQXVFO1lBQ3ZFLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXpCLHNFQUFzRTtnQkFDdEUsaURBQWlEO2dCQUNqRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXhCLElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM1QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILHdFQUF3RTtRQUN4RSwyRUFBMkU7UUFDM0UsbUJBQW1CO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRWpELFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM1QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsbUVBQW1FO0lBQ25FLElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksS0FBSyxDQUFDO0lBQzdDLENBQUM7SUFFTSxPQUFPO1FBQ1osSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLHVFQUF1RTtJQUNoRSxjQUFjO1FBQ25CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFFM0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQXlELHVCQUF1QixFQUFFO1lBQ25ILElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRTtZQUNoQixLQUFLLEVBQUUsT0FBTztTQUNmLENBQUMsQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztRQUU3QyxTQUFTLENBQUMsV0FBVyxFQUFFO2FBQ3BCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDMUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxNQUFNLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFNUIsT0FBTztZQUNULENBQUM7WUFFRCxxRUFBcUU7WUFDckUsdUVBQXVFO1lBQ3ZFLElBQUksTUFBTSxFQUFFLE1BQU0sS0FBSyxPQUFPLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsZ0NBQWdDO0lBQ3pCLGlCQUFpQixDQUFDLFNBQStCO1FBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUUzQiwwRUFBMEU7UUFDMUUsNkVBQTZFO1FBQzdFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNqQywwQkFBMEIsRUFDMUI7WUFDRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM1RSxLQUFLLEVBQUUsT0FBTztTQUNmLENBQ0YsQ0FBQztRQUVGLDRFQUE0RTtRQUM1RSwwRUFBMEU7UUFDMUUsNkVBQTZFO1FBQzdFLDBDQUEwQztRQUMxQyxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDM0IsU0FBUyxDQUFDLGlCQUFpQixDQUFDLGNBQWM7YUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzthQUN4QyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRTFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7YUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMxQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNwQixxRUFBcUU7WUFDckUsd0VBQXdFO1lBQ3hFLHdFQUF3RTtZQUN4RSxJQUFJLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFM0IsT0FBTztZQUNULENBQUM7WUFFRCxnRUFBZ0U7WUFDaEUsOERBQThEO1lBQzlELElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRTNCLE9BQU87WUFDVCxDQUFDO1lBRUQsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSxzREFBc0Q7WUFDdEQsSUFBSSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxvRUFBb0U7SUFDN0QsbUJBQW1CLENBQUMsTUFBcUI7UUFDOUMsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdCLHVEQUF1RDtRQUN2RCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLHFEQUFxRDtJQUM5QyxxQkFBcUI7UUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDaEUsZ0JBQWdCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNmLHNCQUFzQixFQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFRCxrRkFBa0Y7SUFDM0UsU0FBUztRQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNmLGVBQWUsRUFDZixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFRCx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLHdFQUF3RTtJQUN4RSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSx1RUFBdUU7SUFDdkUseUJBQXlCO0lBQ2xCLFVBQVUsQ0FBQyxRQUFRLEdBQUcsS0FBSyxFQUFFLFNBQTZCLEtBQUs7UUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFOUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ3BCLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFDeEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7YUFDcEQsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FDNUQsTUFBTSxDQUFDLEVBQUUsRUFDVCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixFQUFFLEVBQ0YsTUFBTSxDQUNQLENBQUMsQ0FDSCxDQUNKLENBQUM7SUFDSixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLHdFQUF3RTtJQUNqRSxjQUFjLENBQUMsUUFBMEI7UUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsUUFBaUQsQ0FBQztRQUV6RSwyRUFBMkU7UUFDM0UscUVBQXFFO1FBQ3JFLGdDQUFnQztRQUNoQyxJQUFJLGNBQWMsQ0FBQyxhQUFhLElBQUksY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUM7SUFFRCwyRUFBMkU7SUFDM0Usb0JBQW9CO0lBQ2IsYUFBYSxDQUFDLEtBQW1CO1FBQ3RDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV2QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUMzQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFlLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRTtnQkFDZixNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLENBQUMsbUJBQW1CLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pELENBQUMsQ0FBQztZQUVGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsMENBQTBDO0lBQ2xDLGdCQUFnQjtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFDMUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUNqQixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FDOUQsQ0FBQztRQUVGLE9BQU87WUFDTCxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7WUFDMUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pGLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRTtZQUMxQyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7WUFDNUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ25DLENBQUM7SUFDSixDQUFDO0lBRU8sU0FBUyxDQUFDLE9BQWU7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3RFLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUscUVBQXFFO0lBQ3JFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0Usa0NBQWtDO0lBQzFCLGVBQWUsQ0FBQyxNQUFxQjtRQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDMUQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ3ZCLFdBQVcsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFO1lBQ2hDLG1CQUFtQixFQUFFLE9BQU87WUFDNUIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSwwQ0FBMEM7SUFDbEMsY0FBYztRQUNwQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVyRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSwwRUFBMEU7SUFDMUUsNENBQTRDO0lBQ3BDLFdBQVcsQ0FBQyxRQUFnQixFQUFFLFdBQVcsR0FBRyxLQUFLO1FBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUMzQixJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN2RCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQ3JDO2FBQ0EsU0FBUyxDQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFFMUIsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUseUNBQXlDO0lBQ2pDLGFBQWE7UUFDbkIsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsNkJBQTZCO0lBQ3JCLGtCQUFrQjtRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUM7UUFFcEMsNEVBQTRFO1FBQzVFLHdFQUF3RTtRQUN4RSxJQUFJLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMzRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsUUFBUTtZQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ25DLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVQLHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLHdFQUF3RTtRQUN4RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCx5Q0FBeUM7UUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BDLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztZQUMxQixxRUFBcUU7WUFDckUsdUVBQXVFO1lBQ3ZFLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztZQUNyRCxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzdELGdFQUFnRTtZQUNoRSxvRUFBb0U7WUFDcEUsOERBQThEO1lBQzlELEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRTtZQUNoRCxvRUFBb0U7WUFDcEUsbUJBQW1CO1lBQ25CLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFO1lBQzNELFlBQVk7WUFDWiwwREFBMEQ7WUFDMUQsR0FBRyxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDNUYsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ3hFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsbUVBQW1FO0lBQzNELHVCQUF1QixDQUFDLFFBQWdCO1FBQzlDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQztRQUVyRSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsS0FBSyxRQUFRLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdFLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLDRCQUE0QixHQUFHLFFBQVEsQ0FBQztRQUU3QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcscUJBQXFCLENBQUMsWUFBWSxDQUFDO1FBQ25ELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixxQkFBcUIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSx1RUFBdUU7SUFDdkUseUVBQXlFO0lBQ3pFLGlFQUFpRTtJQUNqRSx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLG1FQUFtRTtJQUMzRCxtQkFBbUI7UUFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUM7UUFFM0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pFLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXO2lCQUN6QixZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO2lCQUNsRixJQUFJLENBQ0gsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUF5QixDQUFDLENBQUMsRUFDL0MsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNwRztZQUNILElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUNwQixNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7Z0JBQ2xGLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxFQUFFO29CQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRTt3QkFDckUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUN2RCxPQUFPO3FCQUNSLENBQUM7b0JBQ0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBRTVGLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXO2lCQUN0Qyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM3RixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVc7aUJBQ3RDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRUQseUVBQXlFO0lBQ2pFLGtCQUFrQjtRQUN4QixPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSw0RUFBNEU7SUFDNUUsNEVBQTRFO0lBQzVFLHNFQUFzRTtJQUN0RSx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ2hFLGVBQWUsQ0FBQyxXQUE4QjtRQUNwRCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDbEYsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRTVDLE9BQU87WUFDTCxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7WUFDbEIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO1lBQ3RCLElBQUksT0FBTztnQkFDVCxPQUFPLEVBQUUsQ0FBQztnQkFFVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsdUVBQXVFO0lBQ3ZFLDJFQUEyRTtJQUMzRSxXQUFXO0lBQ0gsY0FBYztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RELGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSwrREFBK0Q7SUFDdkQsV0FBVyxDQUFDLEtBQTBCO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxJQUFJO1lBQ04sQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsT0FBb0MsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRU8sZUFBZSxDQUFDLElBQWlDO1FBQ3ZELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDJDQUEyQztJQUNuQyxXQUFXLENBQUMsS0FBOEIsRUFBRSxRQUFpQjtRQUNuRSxLQUFLLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkYsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxpRUFBaUU7UUFDakUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBc0IsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNuRixrRUFBa0U7UUFDbEUsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLDBFQUEwRTtJQUMxRSxpRUFBaUU7SUFDekQsWUFBWTtRQUNsQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFN0IsT0FBTyxNQUFNO1lBQ1gsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFELENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLG9EQUFvRDtJQUM1QyxVQUFVO1FBQ2hCLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM1RyxDQUFDO3dHQWh2QlUsbUJBQW1COzRGQUFuQixtQkFBbUIsNmlCQS9CbkI7WUFDVCxzRUFBc0U7WUFDdEUsdUVBQXVFO1lBQ3ZFLHdCQUF3QjtZQUN4QiwwRUFBMEU7WUFDMUUsMEJBQTBCO1lBQzFCLDRCQUE0QjtZQUM1QixpQkFBaUI7WUFDakIsZ0JBQWdCO1lBQ2hCLHVCQUF1QjtZQUN2QixtQkFBbUI7WUFDbkIseUVBQXlFO1lBQ3pFLG1FQUFtRTtZQUNuRSxnQkFBZ0I7WUFDaEIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRTtZQUN4RCxzRUFBc0U7WUFDdEUsa0JBQWtCLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNyRywyRUFBMkU7WUFDM0Usd0NBQXdDO1lBQ3hDLHVCQUF1QixFQUFFO1NBQzFCLDhNQWdIK0IsVUFBVSx1REFLL0IscUJBQXFCLDZFQUtyQixlQUFlLGdEQ25ONUIscTNKQXVKQSxxbERENURJLGNBQWMsa0tBQ2QsWUFBWSx3WkFDWixpQkFBaUIsaUxBQ2pCLGVBQWUsd1VBQ2YsYUFBYSxtTEFDYixnQkFBZ0IsNlRBQ2hCLHFCQUFxQjs7NEZBR1osbUJBQW1CO2tCQXRDL0IsU0FBUzsrQkFDRSxjQUFjLG1CQUdQLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQLENBQUMsc0JBQXNCLENBQUMsYUFDdEI7d0JBQ1Qsc0VBQXNFO3dCQUN0RSx1RUFBdUU7d0JBQ3ZFLHdCQUF3Qjt3QkFDeEIsMEVBQTBFO3dCQUMxRSwwQkFBMEI7d0JBQzFCLDRCQUE0Qjt3QkFDNUIsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQix5RUFBeUU7d0JBQ3pFLG1FQUFtRTt3QkFDbkUsZ0JBQWdCO3dCQUNoQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFO3dCQUN4RCxzRUFBc0U7d0JBQ3RFLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ3JHLDJFQUEyRTt3QkFDM0Usd0NBQXdDO3dCQUN4Qyx1QkFBdUIsRUFBRTtxQkFDMUIsV0FDUTt3QkFDUCxjQUFjO3dCQUNkLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixxQkFBcUI7cUJBQ3RCO3dEQW9HTyxNQUFNO3NCQURiLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFLNUIsVUFBVTtzQkFEakIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQU1wQyxPQUFPO3NCQURkLFNBQVM7dUJBQUMscUJBQXFCO2dCQU14QixVQUFVO3NCQURqQixTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBOZ1pvbmUsIFZpZXdDaGlsZCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRGlzcGxheUFwaUVycm9yIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXBpJztcbmltcG9ydCB7XG4gIEJhc2VJdGVtLCBGaWx0ZXJDb21wb25lbnQsIEZpbHRlckNvbmZpZywgRnNGaWx0ZXJNb2R1bGUsIElGaWx0ZXJDb25maWdJdGVtLCBJRmlsdGVyU2F2ZWRGaWx0ZXIsIElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcsXG59IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XG5pbXBvcnQgeyBGc01lbnVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZW51JztcbmltcG9ydCB7IEZzUHJvY2VzcyB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBwcm92aWRlRWNoYXJ0c0NvcmUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XG5cbmltcG9ydCB7IEZzQWlDaGF0Q29tcG9uZW50LCBGc0FpQ2hhdERhdGEsIEZzQWlDaGF0UmVzcG9uc2UgfSBmcm9tICdAZmlyZXN0aXRjaC9haSc7XG5cbmltcG9ydCB7IFJlcG9ydENhbnZhc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRBaUNoYXREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQtYWktY2hhdC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCBDb21wb25lbnRTZXR0aW5nc0RpYWxvZ0RhdGEsIENvbXBvbmVudFNldHRpbmdzUmVzdWx0LFxufSBmcm9tICcuLi8uLi9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXBkZi5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBwdHhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wcHR4LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0VGV4dExheW91dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXRleHQtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0Q2hhdFZpZXdlclN0YXRlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFNhdmVkRmlsdGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtc2F2ZWQtZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LCBSZXBvcnQsIFJlcG9ydENoYXRSZXNwb25zZSxcbiAgUmVwb3J0Q29tcG9uZW50IGFzIFJlcG9ydENvbXBvbmVudE1vZGVsLCBSZXBvcnRGaWx0ZXJHcm91cCxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydEZvcm1hdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWV4cG9ydC1mb3JtYXQudHlwZSc7XG5pbXBvcnQgeyBjaGF0Vmlld2VyRHJpbGxzLCBjaGF0Vmlld2VyTWF0Y2gsIGNoYXRWaWV3ZXJUaWxlcyB9IGZyb20gJy4uLy4uL3JlcG9ydC1jaGF0LXZpZXdlci1zdGF0ZSc7XG5pbXBvcnQgeyBwcm92aWRlUmVwb3J0RGF0ZVBpY2tlciB9IGZyb20gJy4uLy4uL3JlcG9ydC1kYXRlLXByZXNldHMnO1xuaW1wb3J0IHtcbiAgR1JPVVBfQllfSVRFTSwgZmlsdGVySXRlbUZvckdyb3VwLCBncm91cEJ5RmlsdGVySXRlbSwgZ3JvdXBCeVNpZ25hdHVyZSwgZ3JvdXBJdGVtTmFtZSwgZ3JvdXBWYWx1ZXNGcm9tUXVlcnksXG4gIGhhc1BhZ2VHcm91cCwgaXNHcmFudWxhcml0eU9mZmVyZWQsIG1hdGNoRmlsdGVySXRlbSwgbWF0Y2hGcm9tUXVlcnksIHJlcG9ydEJhckdyb3Vwcyxcbn0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBzYXZlZEZpbHRlckdyb3Vwcywgc2F2ZWRGaWx0ZXJWYWx1ZXMgfSBmcm9tICcuLi8uLi9yZXBvcnQtc2F2ZWQtZmlsdGVycyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSwgZGVmYXVsdFNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyB6aXBFeHBvcnRTdGF0ZXMgfSBmcm9tICcuLi8uLi90aWxlLWRhdGEtc3RhdGUnO1xuXG5cbi8vIEEgc2luZ2xlIHJlcG9ydDogdGhlIEFJIGNoYXQgb24gdGhlIGxlZnQgKHVubGVzcyB0aGUgc2VydmVyIHR1cm5zIGl0IG9mZiksXG4vLyB0aGUgcmVwb3J0IGNhbnZhcyBvbiB0aGUgcmlnaHQsIHVuZGVyIGFuIEgyIHRpdGxlICsgc2V0dGluZ3MgZ2Vhci4gVGhlIGhvc3Rcbi8vIHN1cHBsaWVzIFtyZXBvcnRJZF0gKGZyb20gaXRzIHJvdXRlKSBhbmQgc3dpdGNoZXMgcmVwb3J0cyB0aHJvdWdoIGl0cyBvd25cbi8vIHJvdXRlcyDigJQgdGhpcyBjb21wb25lbnQgbmV2ZXIgcGlja3Mgb25lLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtYWktcmVwb3J0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZzLWFpLXJlcG9ydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZzLWFpLXJlcG9ydC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBTZXNzaW9uIGZpbHRlciBzdGF0ZSBpcyBwZXItb3Blbi1yZXBvcnQsIG5vdCBhcHAtZ2xvYmFsOyB0aGUgZXhwb3J0XG4gICAgLy8gc2VydmljZXMgcmVzb2x2ZSBmaWx0ZXJzIHRocm91Z2ggaXQsIHNvIHRoZXkgbGl2ZSBhdCB0aGUgc2FtZSBsZXZlbC5cbiAgICBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UsXG4gICAgLy8gVGhlIGJhcnMnIHNlbGVjdCBsaXN0cywgbmFycm93ZWQgYnkgdGhlIG90aGVyIGZpbHRlcnM7IHBlciBvcGVuIHJlcG9ydC5cbiAgICBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSxcbiAgICBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlLFxuICAgIFJlcG9ydFBwdHhTZXJ2aWNlLFxuICAgIFJlcG9ydFBkZlNlcnZpY2UsXG4gICAgUmVwb3J0VGV4dExheW91dFNlcnZpY2UsXG4gICAgUmVwb3J0RXhwb3J0U2VydmljZSxcbiAgICAvLyBmcy1haS1jaGF0IHNpdHMgaW4gdGhpcyB0ZW1wbGF0ZSwgc28gaXQgcmVzb2x2ZXMgaXRzIGdhdGV3YXkgaGVyZTogdGhlXG4gICAgLy8gcmVwb3J0IG9uZSwgd2hpY2ggYWRkcyB0aGUgdmlld2VyJ3Mgc3RhdGUgdG8gZWFjaCB0dXJuIGl0IHNlbmRzLlxuICAgIFJlcG9ydEFpQ2hhdERhdGEsXG4gICAgeyBwcm92aWRlOiBGc0FpQ2hhdERhdGEsIHVzZUV4aXN0aW5nOiBSZXBvcnRBaUNoYXREYXRhIH0sXG4gICAgLy8gVHJlZS1zaGFrZW4gRUNoYXJ0cyBjb3JlICsgdGhlICdyZXBvcnQnIGhvdXNlIHRoZW1lLCBsb2FkZWQgbGF6aWx5LlxuICAgIHByb3ZpZGVFY2hhcnRzQ29yZSh7IGVjaGFydHM6ICgpID0+IGltcG9ydCgnLi4vLi4vdGhlbWUvZWNoYXJ0cycpLnRoZW4oKG1vZHVsZSkgPT4gbW9kdWxlLmRlZmF1bHQpIH0pLFxuICAgIC8vIFRoZSBiYXIncyBkYXRlIHBpY2tlcnMgc3RhcnQgdGhlaXIgd2Vla3Mgb24gTW9uZGF5IGFuZCBsaXN0IHRoZSBidWlsdC1pblxuICAgIC8vIHByZXNldHM7IGEgcHJlc2V0IG9ubHkgc2V0cyB0aGUgZGF5cy5cbiAgICBwcm92aWRlUmVwb3J0RGF0ZVBpY2tlcigpLFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgRnNGaWx0ZXJNb2R1bGUsXG4gICAgRnNNZW51TW9kdWxlLFxuICAgIEZzQWlDaGF0Q29tcG9uZW50LFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgUmVwb3J0Q2FudmFzQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGc0FpUmVwb3J0Q29tcG9uZW50IHtcblxuICAvLyBUaGUgcmVwb3J0IHRoaXMgdmlldyBpcyBmb2N1c2VkIG9uIOKAlCBzdXBwbGllZCBieSB0aGUgaG9zdCBmcm9tIHRoZSByb3V0ZS5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQVBJIGJhc2UgZm9yIHRoZSByZXBvcnRzICsgY2hhdCBlbmRwb2ludHM7IG92ZXJyaWRlIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIHJlYWRvbmx5IGJhc2VQYXRoID0gaW5wdXQ8c3RyaW5nPigncmVwb3J0cycpO1xuXG4gIC8vIFRoZSBxdWVyeSBwYXJhbSB0aGF0IGNhcnJpZXMgdGhlIHBhZ2Ugb24gc2NyZWVuICg/cGFnZT03KS4gQSByZXBvcnQgb3BlbnNcbiAgLy8gb24gdGhlIHBhZ2UgaXQgbmFtZXMsIGFuZCBlYWNoIG1vdmUgdG8gYW5vdGhlciBwYWdlIHdyaXRlcyBpdCwgaW4gcGxhY2UsXG4gIC8vIHNvIGEgcmVmcmVzaCBvciBhIHNoYXJlZCBsaW5rIGNvbWVzIGJhY2sgdG8gdGhlIHNhbWUgcGFnZS4gSXQgaXMgdGhlIG9ubHlcbiAgLy8gc3RhdGUgYSByZXBvcnQga2VlcHMgaW4gdGhlIFVSTDogaXRzIGZpbHRlcnMgYW5kIHRoZSByZXN0IGxpdmUgaW4gdGhlXG4gIC8vIHJlcG9ydCdzIHN0YXRlIChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLiBBIGhvc3QgdGhhdCBtb3VudHMgc2V2ZXJhbFxuICAvLyByZXBvcnRzIG9uIG9uZSByb3V0ZSwgb3Igd2FudHMgbm8gVVJMIHdyaXRlcywgc2V0cyB0aGlzIHRvIG51bGwuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlUXVlcnlQYXJhbSA9IGlucHV0PHN0cmluZyB8IG51bGw+KCdwYWdlJyk7XG5cbiAgLy8gVGhlIHJlcG9ydCB3YXMgZGVsZXRlZCBmcm9tIGl0cyBzZXR0aW5ncyBkaWFsb2cg4oCUIHRoZSBob3N0IHJvdXRlcyBiYWNrIHRvXG4gIC8vIHRoZSBsaXN0aW5nLlxuICBwdWJsaWMgcmVhZG9ubHkgZGVsZXRlZCA9IG91dHB1dDxudW1iZXI+KCk7XG5cbiAgLy8gVGhlIHJlcG9ydCB3YXMgcmVuYW1lZCAoc2V0dGluZ3MsIG9yIHRoZSBhZ2VudCkg4oCUIHRoZSBob3N0IGNhbiByZWZyZXNoIGFcbiAgLy8gYnJlYWRjcnVtYiAvIGRvY3VtZW50IHRpdGxlLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVuYW1lZCA9IG91dHB1dDxSZXBvcnQ+KCk7XG5cbiAgLy8gVGhlIHZpZXdlciBtb3ZlZCB0byBhbm90aGVyIHBhZ2Ug4oCUIGZvciBob3N0cyB0aGF0IHRyYWNrIHRoZSBvcGVuIHBhZ2UgZm9yXG4gIC8vIHRoZWlyIG93biByZWFzb25zLiBOb3RoaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIFVSTC5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VDaGFuZ2VkID0gb3V0cHV0PG51bWJlciB8IG51bGw+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydCA9IHNpZ25hbDxSZXBvcnQgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRNb2RlID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUaGUgcGFnZSB0aGUgY2FudmFzIHNob3VsZCBvcGVuIG9uOiB0aGUgP3BhZ2U9IHRoZSByZXBvcnQgb3BlbmVkIHdpdGhcbiAgLy8gKHJlYWQgb25jZSBwZXIgcmVwb3J0KS4gQ2xlYXJlZCBhcyBzb29uIGFzIHRoZSBjYW52YXMgcmVwb3J0cyBiYWNrLCBzbyBhXG4gIC8vIGxhdGVyIGluLWFwcCBwYWdlIGNoYW5nZSBpcyBuZXZlciBmb3VnaHQgYnkgYSBzdGFsZSB2YWx1ZS5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VJZCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgcGFnZSB0aGUgY2hhdCBpcyBib3VuZCB0bzogdGhlIG9uZSBvbiBzY3JlZW4uIEEgcmVwb3J0IGNvbnZlcnNhdGlvblxuICAvLyBiZWxvbmdzIHRvIGV4YWN0bHkgb25lIHBhZ2UsIHNvIHRoaXMgYm90aCBzY29wZXMgdGhlIGNvbnZlcnNhdGlvbiBsaXN0IGFuZFxuICAvLyBiZWNvbWVzIHRoZSBuZXcgY29udmVyc2F0aW9uJ3MgcGFnZS4gQSBzaWduYWwgYmVjYXVzZSBpdCBmZWVkc1xuICAvLyBjaGF0QmFzZVBhdGgg4oCUIGNoYW5naW5nIGl0IGlzIHdoYXQgcmVsb2FkcyB0aGUgcGFuZWwgb250byB0aGUgbmV3IHBhZ2Unc1xuICAvLyBjb252ZXJzYXRpb25zLiBOdWxsIHVudGlsIHRoZSBjYW52YXMgcmVwb3J0cyB3aGljaCBwYWdlIGl0IG9wZW5lZCBvbiwgd2hpY2hcbiAgLy8ga2VlcHMgdGhlIGNoYXQgZnJvbSBsaXN0aW5nIGFnYWluc3QgYSBwYWdlIGd1ZXNzLlxuICBwdWJsaWMgcmVhZG9ubHkgY2hhdFBhZ2VJZCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBXaGVyZSB0aGUgY2hhdCdzIGNhbGxzIGdvOiBiZW5lYXRoIHRoZSBwYWdlIGl0IGlzIGJvdW5kIHRvXG4gIC8vICh7YmFzZVBhdGh9L3tyZXBvcnRJZH0vcGFnZXMve3BhZ2VJZH0vY2hhdCwg4oCmL2NvbnZlcnNhdGlvbnMsIOKApikuIEV2ZXJ5XG4gIC8vIGNvbnZlcnNhdGlvbiBpcyByZWFjaGVkIHRocm91Z2ggaXRzIHBhZ2UsIHNvIHRoZSBwYXRoIGNhcnJpZXMgdGhlIHJlcG9ydFxuICAvLyBhbmQgdGhlIHBhZ2UgYW5kIG5vdGhpbmcgcmlkZXMgaW4gdGhlIGNoYXQncyByZXF1ZXN0RGF0YS5cbiAgLy9cbiAgLy8gVGhlIGNoYXQgaXMgaGVsZCBjbG9zZWQgKFtyZWFkeV0gaW4gdGhlIHRlbXBsYXRlKSB1bnRpbCB0aGUgcGFnZSBpcyBrbm93bixcbiAgLy8gc28gdGhlIHBhdGggaXMgbmV2ZXIgY2FsbGVkIHdoaWxlIGNoYXRQYWdlSWQgaXMgbnVsbDogb24gYSBmcmVzaCBsb2FkIHRoZVxuICAvLyByZXBvcnQgaGFzIHRvIGFycml2ZSBhbmQgdGhlIGNhbnZhcyBoYXMgdG8gcmVuZGVyIGJlZm9yZSBhbnkgcGFnZSBleGlzdHMuXG4gIHB1YmxpYyByZWFkb25seSBjaGF0QmFzZVBhdGggPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGAke3RoaXMuYmFzZVBhdGgoKX0vJHt0aGlzLnJlcG9ydElkKCl9L3BhZ2VzLyR7dGhpcy5jaGF0UGFnZUlkKCl9YDtcbiAgfSk7XG5cbiAgLy8gVGhlIGNoYXQgYW5kIGl0cyByZXNpemVyIHNob3cgb25jZSB0aGUgcmVwb3J0IHNheXMgdGhlIHNlcnZlciBrZWVwcyB0aGVcbiAgLy8gY2hhdCBvbiwgc28gYSByZXBvcnQgd2hvc2UgY2hhdCBpcyBvZmYgbmV2ZXIgZmxhc2hlcyBvbmUuIEEgc2VydmVyIHRvb1xuICAvLyBvbGQgdG8gc2VuZCBjaGF0RW5hYmxlZCBrZWVwcyBpdC5cbiAgcHVibGljIHJlYWRvbmx5IGNoYXRFbmFibGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG5cbiAgICByZXR1cm4gISFyZXBvcnQgJiYgcmVwb3J0LmNoYXRFbmFibGVkICE9PSBmYWxzZTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgdG9vbGJhciAoZnMtZmlsdGVyKS4gUmVidWlsdCB3aGVuZXZlciB0aGUgbG9hZGVkXG4gIC8vIHJlcG9ydCAoYW5kIHRodXMgaXRzIGdyb3VwcykgY2hhbmdlcy5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydEZpbHRlckNvbmZpZyA9IHNpZ25hbDxGaWx0ZXJDb25maWcgfCBudWxsPihudWxsKTtcblxuICAvLyBHYXRlcyB0aGUgdG9vbGJhciBmcy1maWx0ZXIgc28gaXQgaXNuJ3QgcmVuZGVyZWQgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvXG4gIC8vIHB1dCBpbiBpdCDigJQgbm8gcmVwb3J0LWxldmVsIGZpbHRlcnMgYW5kIG5vIGdyb3VwLWJ5IGNvbnRyb2wuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRIYXNGaWx0ZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnRHcm91cHMoKS5sZW5ndGggPiAwIHx8ICEhdGhpcy5fZ3JvdXBCeUl0ZW0oKTtcbiAgfSk7XG5cbiAgLy8gZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25seSBvbmNlIChhdCBpbml0KS4gVGhlIHRlbXBsYXRlIGtleXMgdGhlXG4gIC8vIHRvb2xiYXIgZnMtZmlsdGVyIG9uIHRoaXMgc2lnbmF0dXJlIHNvIGl0J3MgcmVjcmVhdGVkIChhbmQgcmUtcmVhZHMgdGhlXG4gIC8vIHJlYnVpbHQgY29uZmlnKSB3aGVuZXZlciB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBzZXQgY2hhbmdlcy5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydEZpbHRlcktleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gVGhlIHN0YXRlIHZlcnNpb24gdGhlIGJhciB3YXMgYnVpbHQgZm9yOiBhIHJlc2V0IHRvIHRoZSBkZWZhdWx0c1xuICAgICAgLy8gcmVwbGFjZXMgZXZlcnkgdmFsdWUgYXQgb25jZS5cbiAgICAgIHRoaXMuX2JhclZlcnNpb24oKSxcbiAgICAgIC8vIFRoZSBlZmZlY3RpdmUgem9uZSBpcyBwYXJ0IG9mIGl0IHRvbzogYSB6b25lIGNoYW5nZSByZS1yZXNvbHZlcyByZWxhdGl2ZVxuICAgICAgLy8gcHJlc2V0cywgYW5kIHRoZSBiYXIgbXVzdCBiZSByZWNyZWF0ZWQgdG8gc2hvdyB0aGUgbmV3IGRheXMuXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS50aW1lem9uZSgpLFxuICAgICAgLy8gVGhlIHN0b3JlZCBkZWZhdWx0IGlzIHBhcnQgb2YgdGhlIHNpZ25hdHVyZTogc2F2aW5nIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0XG4gICAgICAvLyBzZXR0aW5ncyByZWJ1aWxkcyB0aGUgY29uZmlnLCBidXQgd2l0aG91dCBhIGtleSBjaGFuZ2UgZnMtZmlsdGVyIGtlZXBzXG4gICAgICAvLyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAgICAgIGdyb3VwQnlTaWduYXR1cmUodGhpcy5yZXBvcnQoKSksXG4gICAgICAuLi50aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PiBgJHtncm91cC5pZH06JHtncm91cC5sZXZlbH06JHtncm91cC5sYWJlbH06JHtkZWZhdWx0U2lnbmF0dXJlKGdyb3VwKX1gKSxcbiAgICAgIC8vIEEgcGFnZSBncm91cCBzaG93cyBvbiBpdHMgb3duIHBhZ2Ugb25seSwgc28gc3VjaCBhIGJhciBpcyByZWNyZWF0ZWRcbiAgICAgIC8vIHdoZW4gdGhlIHBhZ2Ugb24gc2NyZWVuIGNoYW5nZXMuXG4gICAgICAuLi4oaGFzUGFnZUdyb3VwKHRoaXMucmVwb3J0KCkpID8gW2BwYWdlOiR7dGhpcy5jaGF0UGFnZUlkKCl9YF0gOiBbXSksXG4gICAgXS5qb2luKCd8Jyk7XG4gIH0pO1xuXG4gIEBWaWV3Q2hpbGQoJ3NwbGl0JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBfc3BsaXQhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICAvLyBPbmx5IHdoaWxlIHRoZSBjaGF0IGlzIG9uIChjaGF0RW5hYmxlZCkuXG4gIEBWaWV3Q2hpbGQoJ2NoYXRQYW5lbCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIF9jaGF0UGFuZWw/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvLyBPbmx5IHRoZSBjYW52YXMga25vd3Mgd2hpY2ggcGFnZSBpcyBvbiBzY3JlZW4sIGFuZCBhIHBhZ2Utc2NvcGVkIGV4cG9ydFxuICAvLyBoYXMgdG8gYXNrIGl0LlxuICBAVmlld0NoaWxkKFJlcG9ydENhbnZhc0NvbXBvbmVudClcbiAgcHJpdmF0ZSBfY2FudmFzPzogUmVwb3J0Q2FudmFzQ29tcG9uZW50O1xuXG4gIC8vIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIGJhciwgd2hpbGUgaXQgaXMgZHJhd24uIEEgc2F2ZWQgZmlsdGVyIGJlaW5nXG4gIC8vIHBpY2tlZCByZWFkcyB0aGUgYmFyJ3MgdmFsdWVzIG9mZiBpdCAoX2tlZXBCYXJPblBpY2spLlxuICBAVmlld0NoaWxkKEZpbHRlckNvbXBvbmVudClcbiAgcHJpdmF0ZSBfcmVwb3J0QmFyPzogRmlsdGVyQ29tcG9uZW50O1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX3JlcG9ydEFpQ2hhdERhdGEgPSBpbmplY3QoUmVwb3J0QWlDaGF0RGF0YSk7XG4gIHByaXZhdGUgX3JvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2ZpbHRlck9wdGlvbnMgPSBpbmplY3QoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIF9leHBvcnRTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydEV4cG9ydFNlcnZpY2UpO1xuICBwcml2YXRlIF9jb2xsZWN0b3IgPSBpbmplY3QoUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSk7XG4gIHByaXZhdGUgX3Byb2Nlc3MgPSBpbmplY3QoRnNQcm9jZXNzKTtcbiAgcHJpdmF0ZSBfZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgX3pvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAvLyBUaGUgc3RhdGUgdmVyc2lvbiB0aGUgYmFyIHdhcyBsYXN0IGJ1aWx0IGZvciAocmVwb3J0RmlsdGVyS2V5KS5cbiAgcHJpdmF0ZSByZWFkb25seSBfYmFyVmVyc2lvbiA9IHNpZ25hbCgwKTtcblxuICAvLyBUaGUgcmVwb3J0IGJhcidzIHZhbHVlcyBhcyB0aGV5IHdlcmUgdGhlIG1vbWVudCBmcy1maWx0ZXIgcmVhZCBhIHNhdmVkXG4gIC8vIGZpbHRlcidzIHZhbHVlcywgb3IgbnVsbCBvdXRzaWRlIHRoYXQgbW9tZW50LiBBIHBpY2sgc2V0cyBldmVyeSBpdGVtIG9mXG4gIC8vIHRoZSBiYXIgZnJvbSB0aGUgc2F2ZWQgZmlsdGVyJ3MgdmFsdWVzOyBlYWNoIGl0ZW0gYSBzYXZlZCBmaWx0ZXIgbmV2ZXJcbiAgLy8gaG9sZHMgKHRoZSBncm91cC1ieSBncmFpbiwgdGhlIG1hdGNoLCBhIHBhZ2UncyBvd24gZmlsdGVycykgaXMgcHV0IGJhY2tcbiAgLy8gdG8gaXRzIG5vdGVkIHZhbHVlIGFzIGl0IGlzIHNldCAoX2tlZXBJdGVtT25QaWNrKS5cbiAgcHJpdmF0ZSBfYmFyVmFsdWVzQXRQaWNrOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRoZSByZXBvcnQgdGhlIHNjcmVlbiB3YXMgb3BlbmVkIG9uIGl0cyBmaXJzdCBzYXZlZCBmaWx0ZXIgZm9yXG4gIC8vIChfb3Blbk9uRmlyc3RTYXZlZEZpbHRlciksIG9yIG51bGwgYmVmb3JlIHRoYXQuXG4gIHByaXZhdGUgX29wZW5lZE9uU2F2ZWRGaWx0ZXJSZXBvcnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRWFjaCBjaGF0IHR1cm4gY2FycmllcyB3aGF0IHRoZSB2aWV3ZXIgaGFzIG9uIHNjcmVlbi4gT25seSB0aGUgZnVuY3Rpb25cbiAgICAvLyBpcyBzZXQgaGVyZTsgaXQgaXMgY2FsbGVkIHdoZW4gYSB0dXJuIGlzIHNlbnQuXG4gICAgdGhpcy5fcmVwb3J0QWlDaGF0RGF0YS50dXJuRGF0YSA9ICgpID0+ICh7IHZpZXdlclN0YXRlOiB0aGlzLl9jaGF0Vmlld2VyU3RhdGUoKSB9KTtcblxuICAgIC8vIFBvaW50IHRoZSBzaGFyZWQgZGF0YSBnYXRld2F5IGF0IHRoZSBjb25maWd1cmVkIGJhc2UgZmlyc3QgKGJlZm9yZSBhbnlcbiAgICAvLyBsb2FkIGJlbG93IHJlYWRzIGl0KS5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVwb3J0RGF0YS5iYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGgoKTtcbiAgICB9KTtcblxuICAgIC8vIChSZSlsb2FkIHdoZW5ldmVyIHRoZSBob3N0IHN3aXRjaGVzIHRoZSByZXBvcnQgaWQuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnRJZCgpO1xuXG4gICAgICAvLyBUaGUgcGFnZSB0aGlzIHJlcG9ydCBvcGVucyBvbiwgZnJvbSB0aGUgP3BhZ2U9IHRoZSBVUkwgYWxyZWFkeSBob2xkcy5cbiAgICAgIC8vIFJlYWQgcGVyIHJlcG9ydCByYXRoZXIgdGhhbiBvbmNlIGF0IGNvbnN0cnVjdGlvbjogdGhlIGhvc3QgbWF5IHN3YXBcbiAgICAgIC8vIHJlcG9ydHMgb24gdGhlIHNhbWUgcm91dGUsIGFuZCBlYWNoIGFycml2YWwgY2FycmllcyBpdHMgb3duID9wYWdlPS5cbiAgICAgIGNvbnN0IHBhZ2VJZCA9IHRoaXMuX3BhZ2VJZEZyb21VcmwoKTtcblxuICAgICAgLy8gT25seSB0aGUgcmVwb3J0IGlkIGFuZCB0aGUgcGFnZSBwYXJhbSByZS1ydW4gdGhpcy4gVGhlIHZpZXcgc3RhdGUgYmVsb3dcbiAgICAgIC8vIGlzIHdyaXR0ZW4gaGVyZSBhbmQgcmVhZCBieSB0aGUgY29uZmlnIGJ1aWxkLCBzbyBpdCBzdGF5cyB1bnRyYWNrZWQuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRNb2RlLnNldChmYWxzZSk7XG5cbiAgICAgICAgLy8gQSBuZXcgcmVwb3J0J3MgcGFnZXMgYXJlIG5vdCB0aGlzIHJlcG9ydCdzIHBhZ2VzIOKAlCBkcm9wIHRoZSBiaW5kaW5nXG4gICAgICAgIC8vIHVudGlsIGl0cyBjYW52YXMgc2F5cyB3aGljaCBwYWdlIGl0IGxhbmRlZCBvbi5cbiAgICAgICAgdGhpcy5jaGF0UGFnZUlkLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5wYWdlSWQuc2V0KHBhZ2VJZCk7XG5cbiAgICAgICAgaWYgKHJlcG9ydElkICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlcG9ydC5zZXQobnVsbCk7XG4gICAgICAgICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyByZXNldFRvRGVmYXVsdHMoKSBtb3ZlcyB0aGUgc3RhdGUgdmVyc2lvbi4gVGhlIGJhciBpcyBidWlsdCBhZ2FpbiBmb3JcbiAgICAvLyBpdCwgYW5kIHJlcG9ydEZpbHRlcktleSwgd2hpY2ggY2FycmllcyBpdCwgcmVjcmVhdGVzIGZzLWZpbHRlcjogaXQgcmVhZHNcbiAgICAvLyBpdHMgY29uZmlnIG9uY2UuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKTtcblxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHZlcnNpb24gIT09IHRoaXMuX2JhclZlcnNpb24oKSkge1xuICAgICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVFZGl0TW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRNb2RlLnVwZGF0ZSgoZWRpdE1vZGUpID0+ICFlZGl0TW9kZSk7XG4gIH1cblxuICAvLyBUaGUgZWRpdCB0b29scyBsaXZlIGluIHRoaXMgdG9vbGJhciwgYnV0IHRoZSBjYW52YXMgb3ducyB3aGF0IHRoZXkgYWN0IG9uXG4gIC8vICh0aGUgYWN0aXZlIHBhZ2UsIHRoZSBoZWFkZXIvZm9vdGVyIGJhbmRzLCB3aGljaCBsYXllciBpcyBsaXZlKS5cbiAgcHVibGljIGdldCBpc01hc3Rlck1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbnZhcz8ubWFzdGVyTW9kZSgpID8/IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFkZFRleHQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FudmFzPy5hZGRUZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlTWFzdGVyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jYW52YXM/LnRvZ2dsZU1hc3Rlck1vZGUoKTtcbiAgfVxuXG4gIC8vIFJlcG9ydCBzZXR0aW5ncyDigJQgbmFtZSwgcGFnZSBzaXplLCBleHBvcnQgYXMgYSBwYWNrYWdlLCBkZWxldGUuIFRoZVxuICAvLyBkaWFsb2cgcGVyZm9ybXMgdGhlIGRlbGV0ZSBpdHNlbGY7IHdlIHJlYWN0IHRvIHdoYXQgaXQgcmVwb3J0cyBiYWNrLlxuICBwdWJsaWMgcmVwb3J0U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydElkID0gcmVwb3J0LmlkO1xuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW48UmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHVua25vd24sIFJlcG9ydFNldHRpbmdzUmVzdWx0PihSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogeyByZXBvcnQgfSxcbiAgICAgIHdpZHRoOiAnNDYwcHgnLFxuICAgIH0pO1xuICAgIGNvbnN0IHNldHRpbmdzID0gZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09ICdkZWxldGVkJykge1xuICAgICAgICAgIHRoaXMuZGVsZXRlZC5lbWl0KHJlcG9ydElkKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgc2F2ZSB0aGF0IGZhaWxlZCBwYXJ0IHdheSAoYSByZWZ1c2VkIG5hbWUpIG1heSBzdGlsbCBoYXZlIHN0b3JlZFxuICAgICAgICAvLyB0aGUgZmlsdGVycyBiZWZvcmUgaXQsIHNvIGEgZGlzbWlzc2VkIGRpYWxvZyB0aGF0IHdyb3RlIHJlbG9hZHMgdG9vLlxuICAgICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09ICdzYXZlZCcgfHwgc2V0dGluZ3Mud3JvdGUoKSkge1xuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIENvbXBvbmVudCBzZXR0aW5ncyDigJQgdGl0bGUsIGV4YWN0IGdlb21ldHJ5LCBhbmQgdGhlIGRpYWdub3N0aWMgdmlld3NcbiAgLy8gKFNRTCwgY29uZmlnLCBmaWx0ZXIgd2lyaW5nKS5cbiAgcHVibGljIGNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50TW9kZWwpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0IHx8ICF0aGlzLl9jYW52YXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydC5pZDtcblxuICAgIC8vIFRoZSBkaWFsb2cgZ2V0cyB3aGF0IHRoZSBjb21wb25lbnQncyB0aXRsZSB0b2tlbnMgZmlsbCB3aXRoIHdoZXJlIGl0IGlzXG4gICAgLy8gZHJhd24sIGZvciB0aGUgdGl0bGUncyBJbnNlcnQgZmllbGQgbWVudSBhbmQgdGhlIGxpbmUgc2F5aW5nIGhvdyBpdCByZWFkcy5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLl9kaWFsb2cub3BlbjxDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCwgQ29tcG9uZW50U2V0dGluZ3NEaWFsb2dEYXRhLCBDb21wb25lbnRTZXR0aW5nc1Jlc3VsdD4oXG4gICAgICBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCxcbiAgICAgIHtcbiAgICAgICAgZGF0YTogeyByZXBvcnQsIGNvbXBvbmVudCwgdG9rZW5zOiB0aGlzLl9jYW52YXMuY29tcG9uZW50VG9rZW5zKGNvbXBvbmVudCkgfSxcbiAgICAgICAgd2lkdGg6ICc2NDBweCcsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBGaWx0ZXIgYWRkL3JlbW92ZS9sZXZlbCBjaGFuZ2VzIHBlcnNpc3QgaW1tZWRpYXRlbHkgaW5zaWRlIHRoZSBkaWFsb2cgKG5vXG4gICAgLy8gXCJzYXZlXCIpIGFuZCBjYW4gbGVhdmUgaXQgYnkgYW4gZXhpdCB0aGF0IGNhcnJpZXMgbm8gcmVzdWx0LCBzbyB0aGV5IGFyZVxuICAgIC8vIGFubm91bmNlZCBhcyB0aGV5IGxhbmQuIFRoZSByZWxvYWQgd2FpdHMgZm9yIHRoZSBjbG9zZSBzbyB0aGUgY2FudmFzIGlzbid0XG4gICAgLy8gcmUtcmVuZGVyaW5nIHVuZGVybmVhdGggYW4gb3BlbiBkaWFsb2cuXG4gICAgbGV0IGZpbHRlcnNDaGFuZ2VkID0gZmFsc2U7XG4gICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmZpbHRlcnNDaGFuZ2VkXG4gICAgICAucGlwZSh0YWtlVW50aWwoZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiBmaWx0ZXJzQ2hhbmdlZCA9IHRydWUpO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAvLyBUaGUgZGlhbG9nIGNvbmZpcm1zICsgcGVyZm9ybXMgdGhlIGRlbGV0ZSBpdHNlbGYuIFRoZSBjb21wb25lbnQgaXNcbiAgICAgICAgLy8gZ29uZSBmcm9tIHRoZSByZXBvcnQsIHNvIHJlbG9hZCByYXRoZXIgdGhhbiBwYXRjaGluZyBpdCBvdXQgbG9jYWxseSDigJRcbiAgICAgICAgLy8gaXRzIGZpbHRlcnMgd2VudCB3aXRoIGl0LCB3aGljaCB0aGUgcmVwb3J0IGJhciBoYXMgdG8gYmUgcmVidWlsdCBmb3IuXG4gICAgICAgIGlmIChyZXN1bHQ/LmRlbGV0ZWQpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXBvcnQncyBmaWx0ZXIgZ3JvdXBzIGNoYW5nZWQsIHNvIHRoZSByZXBvcnQgYmFyIGFuZCB0aGVcbiAgICAgICAgLy8gb24tY29tcG9uZW50IHN0cmlwcyBoYXZlIHRvIGJlIHJlYnVpbHQgZnJvbSBhIGZyZXNoIHJlcG9ydC5cbiAgICAgICAgaWYgKGZpbHRlcnNDaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3RoaW5nIGVsc2UgaW4gdGhlIGRpYWxvZyB0b3VjaGVzIHRoZSBxdWVyeSDigJQgdGl0bGUgYW5kIHBhZGRpbmcgYXJlXG4gICAgICAgIC8vIHByZXNlbnRhdGlvbi4gUmVwYWludCB0aGUgb25lIGNvbXBvbmVudCBpdCB3YXMgb3BlbmVkIGZvciBhbmQgbGVhdmVcbiAgICAgICAgLy8gZXZlcnkgb3RoZXIgY29tcG9uZW50J3MgZGF0YSwgYW5kIGl0cyBxdWVyeSwgYWxvbmUuXG4gICAgICAgIGlmIChyZXN1bHQ/LnNldHRpbmdzKSB7XG4gICAgICAgICAgdGhpcy5fY2FudmFzPy5hcHBseUNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudC5pZCwgcmVzdWx0LnNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBUaGUgY2FudmFzIG1vdmVkIHRvIGFub3RoZXIgcGFnZS4gVGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIHN0YXkgYXMgdGhleVxuICAvLyBhcmUgKHRoZXkgbGl2ZSBpbiB0aGUgc3RhdGUgc2VydmljZSk7IHRoZSBwYWdlIGdvZXMgaW50byB0aGUgVVJMLlxuICBwdWJsaWMgb25DYW52YXNQYWdlQ2hhbmdlZChwYWdlSWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBUaGUgYXNrZWQtZm9yIHBhZ2UgaGFzIGJlZW4gY29uc3VtZWQ7IGZyb20gaGVyZSB0aGUgY2FudmFzIG93bnMgdGhlIHBhZ2UuXG4gICAgdGhpcy5wYWdlSWQuc2V0KG51bGwpO1xuICAgIHRoaXMuY2hhdFBhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICAvLyBUaGUgb3BlbiBwYWdlIGlzIHBhcnQgb2YgdGhlIHN0YXRlIHRoZSB0aWxlcyBhbmQgZXhwb3J0cyByZWFkLlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFBhZ2UocGFnZUlkKTtcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQocGFnZUlkKTtcbiAgICB0aGlzLl93cml0ZVBhZ2VUb1VybChwYWdlSWQpO1xuXG4gICAgLy8gVGhlIGJhciBzaG93cyB0aGUgcGFnZSBncm91cHMgb2YgdGhlIHBhZ2Ugb24gc2NyZWVuLlxuICAgIGlmIChoYXNQYWdlR3JvdXAodGhpcy5yZXBvcnQoKSkpIHtcbiAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGNhbnZhcyBjaGFuZ2VkIHRoZSByZXBvcnQncyBzdHJ1Y3R1cmUgKGFkZGVkIGEgcGFnZSkg4oCUIHJlLWZldGNoIHNvIHRoZVxuICAvLyBuZXcgcGFnZSByZW5kZXJzOyB0aGUgY2FudmFzIGxhbmRzIHRoZSB2aWV3IG9uIGl0LlxuICBwdWJsaWMgb25DYW52YXNSZXBvcnRDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKHJlcG9ydCkge1xuICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV4cG9ydCB0aGUgcmVwb3J0IHRvIFBvd2VyUG9pbnQsIGVudGlyZWx5IGNsaWVudC1zaWRlIChuYXRpdmUgZWRpdGFibGVcbiAgLy8gY2hhcnRzOyBwYWdlID0gc2xpZGUpLiBUaGUgZG9jayBzaG93cyBwcm9ncmVzcyB1bnRpbCB0aGUgZmlsZSBzYXZlcy5cbiAgcHVibGljIGV4cG9ydFBvd2VycG9pbnQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3MucnVuKFxuICAgICAgJ0V4cG9ydGluZyBQb3dlclBvaW50JyxcbiAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UucG93ZXJwb2ludChyZXBvcnQpLFxuICAgICk7XG4gIH1cblxuICAvLyBFeHBvcnQgdG8gUERGLCBlbnRpcmVseSBjbGllbnQtc2lkZSAob2Zmc2NyZWVuIEVDaGFydHMgYXQgM8OXOyBwYWdlID0gUERGIHBhZ2UpLlxuICBwdWJsaWMgZXhwb3J0UGRmKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm9jZXNzLnJ1bihcbiAgICAgICdFeHBvcnRpbmcgUERGJyxcbiAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UucGRmKHJlcG9ydCksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSB3aG9sZSByZXBvcnQgYXMgZmlsZXMgaW4gb25lIGFjdGlvbjogdGhlIHNlcnZlciB3cml0ZXMgb25lIENTViBwZXJcbiAgLy8gY29tcG9uZW50LCBlYWNoIHdoYXQgdGhlIHNjcmVlbiBzaG93cyAoYSBjaGFydCBvciBLUEkgYXMgZHJhd24sIGF0IHRoZVxuICAvLyB2aWV3ZXIncyBncm91cC1ieSBncmFpbjsgYSBsaXN0IGluIGZ1bGwpLCBhbmQgemlwcyB0aGVtIGZvbGRlcmVkIGJ5IHBhZ2VcbiAgLy8gd2l0aCBhbiBFeHBvcnQgTm90ZXMudHh0IHRoYXQgcmVjb3JkcyB0aGUgZmlsdGVycyBhcyB0aGUgYmFyIHJlYWRzIHRoZW0uXG4gIC8vIEVhY2ggZmlsZSBjYXJyaWVzIGl0cyB0aWxlJ3Mgb3duIHN0YXRlICh6aXBFeHBvcnRTdGF0ZXMpOiBhIGxpc3QncyBzb3J0LFxuICAvLyBzZWFyY2ggYW5kIGhpZGRlbiBjb2x1bW5zLCBhIGNoYXJ0J3MgZHJpbGwgcGF0aCBhbmQgdGhlIGdyb3VwcyB0aGF0IG1hdGNoXG4gIC8vICdhbnknOyBhIHNlcnZlciB0aGF0IGRvZXMgbm90IHJlYWQgaXQgdXNlcyBlYWNoIGxpc3QncyBzYXZlZCBzb3J0LiBUaGVcbiAgLy8gbm90ZXMgZ2V0IHRoZSBmaWx0ZXIgbGluZXMgYXMgdGhlIGNvdmVyIHdvcmRzIHRoZW0gKGV4cG9ydExpbmVzOyBhIFRoaXNcbiAgLy8gUGFnZSB6aXAgbmFtZXMgb25seSB0aGUgZ3JvdXBzIHRoYXQgcmVhY2ggdGhlIHBhZ2UpLCBhbmQgZWFjaCBmaWxlIGlzXG4gIC8vIG5hbWVkIGFmdGVyIGl0cyB0aWxlJ3MgdGl0bGUgYXMgdGhlIGNhbnZhcyBoZWFkZXIgcmVhZHMgaXQgKHRpdGxlcykuIEFsbFxuICAvLyBvZiBpdCBpcyByZWFkIG9uY2UsIHdoZW4gdGhlIGV4cG9ydCBzdGFydHMgKGV4cG9ydFdvcmRpbmcpLiBgdGhpc1BhZ2VgXG4gIC8vIG5hcnJvd3MgaXQgdG8gdGhlIHBhZ2UgdGhlIGNhbnZhcyBpcyBzaG93aW5nLiBVbmxpa2UgdGhlIFBERi9Qb3dlclBvaW50XG4gIC8vIGV4cG9ydHMgdGhlIGZpbGVzIGFyZSB3cml0dGVuIHNlcnZlci1zaWRlLCBzbyB0aGV5IGFyZSBub3QgY2FwcGVkIGJ5XG4gIC8vIHdoYXQgYSBzbGlkZSBjYW4gaG9sZC5cbiAgcHVibGljIGV4cG9ydERhdGEodGhpc1BhZ2UgPSBmYWxzZSwgZm9ybWF0OiBSZXBvcnRFeHBvcnRGb3JtYXQgPSAnY3N2Jyk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSB0aGlzUGFnZSA/IHRoaXMuX2NhbnZhcz8uYWN0aXZlUGFnZT8uaWQgPz8gbnVsbCA6IG51bGw7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JSZXBvcnQocmVwb3J0LCBwYWdlSWQpO1xuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fY29sbGVjdG9yLnNuYXBzaG90KHJlcG9ydCk7XG4gICAgY29uc3Qgc3RhdGVzID0gemlwRXhwb3J0U3RhdGVzKHJlcG9ydCwgc25hcHNob3Quc3RhdGUsIHBhZ2VJZCwgKGNvbXBvbmVudCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50KSk7XG5cbiAgICB0aGlzLl9wcm9jZXNzLmRvd25sb2FkKFxuICAgICAgZm9ybWF0ID09PSAneGxzeCcgPyAnRXhwb3J0aW5nIEV4Y2VsJyA6ICdFeHBvcnRpbmcgZGF0YScsXG4gICAgICB0aGlzLl9jb2xsZWN0b3IuZXhwb3J0V29yZGluZyhyZXBvcnQsIHNuYXBzaG90LCBwYWdlSWQpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoeyBsaW5lcywgdGl0bGVzIH0pID0+IHRoaXMuX3JlcG9ydERhdGEuZXhwb3J0UmVwb3J0KFxuICAgICAgICAgICAgcmVwb3J0LmlkLFxuICAgICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICAgIGZyZXF1ZW5jeSxcbiAgICAgICAgICAgIGxpbmVzLFxuICAgICAgICAgICAgc3RhdGVzLFxuICAgICAgICAgICAgdGl0bGVzLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgKSksXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWN0IHRvIGVhY2ggY2hhdCB0dXJuIChmcy1jaGF0IGhhbmRsZXMgdGhlIHJlcXVlc3QgKyBwZXJzaXN0ZW5jZSk7IHdlXG4gIC8vIG9ubHkgY2FyZSBhYm91dCB0aGUgcmVwb3J0IHNpZGUgZWZmZWN0cyB0aGlzIGNvbnRleHQncyBiYWNrZW5kIGZsYWdzLlxuICBwdWJsaWMgb25DaGF0UmVzcG9uc2UocmVzcG9uc2U6IEZzQWlDaGF0UmVzcG9uc2UpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0SWQoKTtcbiAgICBpZiAocmVwb3J0SWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydFJlc3BvbnNlID0gcmVzcG9uc2UgYXMgRnNBaUNoYXRSZXNwb25zZSAmIFJlcG9ydENoYXRSZXNwb25zZTtcblxuICAgIC8vIEEgc3RydWN0dXJhbCBjaGFuZ2Ugb3IgYSByZW5hbWUgYm90aCByZS1mZXRjaCB0aGUgcmVwb3J0IChzZXNzaW9uIGZpbHRlclxuICAgIC8vIHZhbHVlcyBzdXJ2aXZlKTsgYSByZW5hbWUgYWRkaXRpb25hbGx5IG5vdGlmaWVzIHRoZSBob3N0IHNvIGl0IGNhblxuICAgIC8vIHJlZnJlc2ggYSBicmVhZGNydW1iIC8gdGl0bGUuXG4gICAgaWYgKHJlcG9ydFJlc3BvbnNlLnJlcG9ydENoYW5nZWQgfHwgcmVwb3J0UmVzcG9uc2UucmVwb3J0UmVuYW1lZCkge1xuICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCwgISFyZXBvcnRSZXNwb25zZS5yZXBvcnRSZW5hbWVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBEcmFnIHRoZSBkaXZpZGVyIGJldHdlZW4gdGhlIGNoYXQgYW5kIGNhbnZhcyBwYW5lcyAocG9pbnRlci1jYXB0dXJlIGxvb3BcbiAgLy8gb3V0c2lkZSBBbmd1bGFyKS5cbiAgcHVibGljIG9uUmVzaXplU3RhcnQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBoYW5kbGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaGFuZGxlLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZXNpemluZycpO1xuXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4gdGhpcy5fcmVzaXplVG8oZS5jbGllbnRYKTtcbiAgICAgIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICAgICAgdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdyZXNpemluZycpO1xuICAgICAgfTtcblxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdoYXQgdGhlIHZpZXdlciBoYXMgb24gc2NyZWVuIGFzIGEgY2hhdCB0dXJuIHNlbmRzIGl0LiBUaGUgY2FudmFzXG4gIC8vIHNlbGVjdGlvbiBjb3VudHMgb25seSBpbiBlZGl0IG1vZGU6IGl0IGlzIGRyYXduIG9ubHkgdGhlbiwgYW5kIGl0IGlzIGtlcHRcbiAgLy8gKG5vdCBjbGVhcmVkKSB3aGVuIGVkaXQgbW9kZSBpcyBsZWZ0LiBUaGUgbWF0Y2ggaXMgc2VudCBvbmx5IHdoaWxlIGl0IGlzXG4gIC8vICdhbnknLCB0aGUgZHJpbGxlZCBjaGFydHMgb25seSB3aGVuIG9uZSBpcyBkcmlsbGVkLCBhbmQgdGhlIHRhYmxlcyBvbmx5XG4gIC8vIHdoZW4gdGhlIGJvdW5kIHBhZ2Ugc2hvd3Mgb25lLCBlYWNoIHdpdGggdGhlIGxheW91dCB0aGUgdmlld2VyIGhhcyBpdCBpblxuICAvLyB3aGlsZSB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgc3RvcmVkIG9uZS5cbiAgcHJpdmF0ZSBfY2hhdFZpZXdlclN0YXRlKCk6IFJlcG9ydENoYXRWaWV3ZXJTdGF0ZSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpO1xuICAgIGNvbnN0IGRyaWxscyA9IGNoYXRWaWV3ZXJEcmlsbHMoc25hcHNob3QsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKS5sb2NhbGUpO1xuICAgIGNvbnN0IHRpbGVzID0gY2hhdFZpZXdlclRpbGVzKFxuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUucmVwb3J0KCksXG4gICAgICB0aGlzLmNoYXRQYWdlSWQoKSxcbiAgICAgIChjb21wb25lbnQpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRTZXNzaW9uTGF5b3V0KGNvbXBvbmVudCksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBncmFudWxhcml0eTogdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCksXG4gICAgICBzZWxlY3RlZENvbXBvbmVudElkOiB0aGlzLmVkaXRNb2RlKCkgPyB0aGlzLl9jYW52YXM/LnNlbGVjdGVkQ29tcG9uZW50SWQoKSA/PyBudWxsIDogbnVsbCxcbiAgICAgIGZpbHRlcnM6IHRoaXMuX2ZpbHRlclN0YXRlLnZpZXdlckZpbHRlcnMoKSxcbiAgICAgIC4uLmNoYXRWaWV3ZXJNYXRjaChzbmFwc2hvdCksXG4gICAgICAuLi4oZHJpbGxzLmxlbmd0aCA/IHsgZHJpbGxzIH0gOiB7fSksXG4gICAgICAuLi4odGlsZXMubGVuZ3RoID8geyB0aWxlcyB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9yZXNpemVUbyhjbGllbnRYOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5fc3BsaXQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAocmVjdC53aWR0aCA9PT0gMCB8fCAhdGhpcy5fY2hhdFBhbmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF0aW8gPSAoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigwLjgsIE1hdGgubWF4KDAuMiwgcmF0aW8pKTtcbiAgICB0aGlzLl9jaGF0UGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtjbGFtcGVkICogMTAwfSVgO1xuICB9XG5cbiAgLy8gVGhlIHBhZ2Ugb24gc2NyZWVuIGludG8gdGhlIFVSTCAoP3BhZ2U9KSwgcmVwbGFjaW5nIHRoZSBjdXJyZW50IGhpc3RvcnlcbiAgLy8gZW50cnkgcmF0aGVyIHRoYW4gYWRkaW5nIG9uZSwgc28gQmFjayBsZWF2ZXMgdGhlIHJlcG9ydCBpbnN0ZWFkIG9mXG4gIC8vIHN0ZXBwaW5nIHRocm91Z2ggaXRzIHBhZ2VzLiBPbmx5IHRoZSBwYWdlIHBhcmFtIGlzIHRvdWNoZWQ7IHRoZSBob3N0J3NcbiAgLy8gb3duIHF1ZXJ5IHBhcmFtcyBzdGF5LiBOb3RoaW5nIGlzIHdyaXR0ZW4gd2hlbiB0aGUgcGFyYW0gaXMgb2ZmLCBvciB3aGVuXG4gIC8vIHRoZSBVUkwgYWxyZWFkeSBuYW1lcyB0aGUgcGFnZS5cbiAgcHJpdmF0ZSBfd3JpdGVQYWdlVG9VcmwocGFnZUlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW0gPSB0aGlzLnBhZ2VRdWVyeVBhcmFtKCk7XG4gICAgaWYgKCFwYXJhbSB8fCAhcGFnZUlkIHx8IHRoaXMuX3BhZ2VJZEZyb21VcmwoKSA9PT0gcGFnZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLl9yb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IFtwYXJhbV06IHBhZ2VJZCB9LFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgcGFnZSBpZCB0aGUgVVJMIGhvbGRzIHJpZ2h0IG5vdyAoP3BhZ2U9KSwgb3IgbnVsbCB3aGVuIHRoZSBwYWdlIHBhcmFtXG4gIC8vIGlzIG9mZiBvciB0aGUgdmFsdWUgaXMgbm90IGEgdXNhYmxlIGlkLlxuICBwcml2YXRlIF9wYWdlSWRGcm9tVXJsKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYWdlUXVlcnlQYXJhbSgpO1xuICAgIGlmICghcGFyYW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IE51bWJlcih0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldChwYXJhbSkpO1xuXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYWdlSWQpICYmIHBhZ2VJZCA+IDAgPyBwYWdlSWQgOiBudWxsO1xuICB9XG5cbiAgLy8gRXZlcnkgbG9hZCBzZXRzIHRoZSB2aWV3ZXIgc3RhdGUgdXAgZm9yIHRoZSByZXBvcnQgKGluaXQpOiBpdHMgZmlyc3RcbiAgLy8gbG9hZCBvcGVucyBpdCBvbiBpdHMgYXV0aG9yZWQgZGVmYXVsdHMsIGFuZCBhIGxhdGVyIG9uZSAoYSBjaGF0IGVkaXQsIGFcbiAgLy8gc2V0dGluZ3Mgc2F2ZSkga2VlcHMgdGhlIHN0YXRlIGluIG1lbW9yeS5cbiAgcHJpdmF0ZSBfbG9hZFJlcG9ydChyZXBvcnRJZDogbnVtYmVyLCBlbWl0UmVuYW1lZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5nZXQocmVwb3J0SWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyZXBvcnQ6IFJlcG9ydCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuaW5pdChyZXBvcnQpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0OiBSZXBvcnQpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG5cbiAgICAgICAgaWYgKGVtaXRSZW5hbWVkKSB7XG4gICAgICAgICAgdGhpcy5yZW5hbWVkLmVtaXQocmVwb3J0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZXBvcnQtbGV2ZWwgZmlsdGVyIGdyb3VwcyBpbiB0aGVpciBzYXZlZCBvcmRlciDigJQgdGhlIG9uZXMgdGhhdCByZW5kZXIgaW5cbiAgLy8gdGhlIHRvb2xiYXIgKGNvbXBvbmVudC1sZXZlbCBncm91cHMgcmVuZGVyIG9uIHRoZWlyIGNvbXBvbmVudHMpLCB3aXRoXG4gIC8vIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4uXG4gIHByaXZhdGUgX3JlcG9ydEdyb3VwcygpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgICByZXR1cm4gcmVwb3J0QmFyR3JvdXBzKHRoaXMucmVwb3J0KCksIHRoaXMuY2hhdFBhZ2VJZCgpKTtcbiAgfVxuXG4gIC8vIChSZSlidWlsZCB0aGUgdG9vbGJhciBmcy1maWx0ZXIgY29uZmlnIOKAlCB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBpdGVtcyBhbmRcbiAgLy8gdGhlbiB0aGUgZ3JvdXAtYnkgY29udHJvbC5cbiAgcHJpdmF0ZSBfYnVpbGRSZXBvcnRDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydD8uaWQgPz8gbnVsbDtcblxuICAgIC8vIERyb3AgYSBncmFpbiB0aGUgY29udHJvbCBubyBsb25nZXIgb2ZmZXJzIOKAlCB0aGUgYWdlbnQgY2FuIG5hcnJvdyB0aGUgbGlzdFxuICAgIC8vIG1pZC1zZXNzaW9uLCBhbmQgYW4gb3ZlcnJpZGUgdGhlIHZpZXdlciBjYW4ndCBzZWUgaXMgd29yc2UgdGhhbiBub25lLlxuICAgIGlmIChyZXBvcnQgJiYgIWlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkpKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRGcmVxdWVuY3kobnVsbCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVhdHVyZXMgPSByZXBvcnQ/LnZpZXdlckZlYXR1cmVzID8/IFtdO1xuICAgIGNvbnN0IGl0ZW1zID0gcmVwb3J0SWRcbiAgICAgID8gdGhpcy5fcmVwb3J0R3JvdXBzKCkubWFwKChncm91cCkgPT5cbiAgICAgICAgZmlsdGVySXRlbUZvckdyb3VwKGdyb3VwLCB0aGlzLl9maWx0ZXJPcHRpb25zLCByZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKSwgZmVhdHVyZXMpKVxuICAgICAgOiBbXTtcblxuICAgIC8vIFRoZSBncm91cC1ieSBjb250cm9sIGxlYWRzIHRoZSBiYXIsIGFoZWFkIG9mIGV2ZXJ5IGZpbHRlcjogaXQgc2V0cyB0aGVcbiAgICAvLyBncmFpbiB0aGUgd2hvbGUgcmVwb3J0IGlzIHJlYWQgYXQsIHNvIGl0IGlzIHRoZSBmaXJzdCB0aGluZyBhIHZpZXdlclxuICAgIC8vIGRlY2lkZXMuIEl0IGlzIG5vdCBhIGZpbHRlciBncm91cCDigJQgaXQgcmUtYnVja2V0cyByb3dzIHJhdGhlciB0aGFuXG4gICAgLy8gbmFycm93aW5nIHRoZW0g4oCUIHNvIGl0IGlzIHBsYWNlZCBoZXJlIHJhdGhlciB0aGFuIG9yZGVyZWQgYW1vbmcgdGhlbS5cbiAgICBjb25zdCBncm91cEJ5SXRlbSA9IHRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gICAgaWYgKGdyb3VwQnlJdGVtKSB7XG4gICAgICBpdGVtcy51bnNoaWZ0KGdyb3VwQnlJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBIb3cgdGhlIGdyb3VwcyBjb21iaW5lIGNsb3NlcyB0aGUgYmFyLlxuICAgIGNvbnN0IG1hdGNoSXRlbSA9IHRoaXMuX21hdGNoSXRlbSgpO1xuICAgIGlmIChtYXRjaEl0ZW0pIHtcbiAgICAgIGl0ZW1zLnB1c2gobWF0Y2hJdGVtKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlZEZpbHRlcnMgPSB0aGlzLl9zYXZlZEZpbHRlcnNDb25maWcoKTtcblxuICAgIHRoaXMuX2JhclZlcnNpb24uc2V0KHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpKTtcbiAgICB0aGlzLnJlcG9ydEZpbHRlckNvbmZpZy5zZXQoe1xuICAgICAgLy8gZnMtZmlsdGVyIG5ldmVyIHRvdWNoZXMgdGhlIFVSTCBvciBwZXJzaXN0cyBmaWx0ZXIgc3RhdGU6IGEgcmVwb3J0XG4gICAgICAvLyBrZWVwcyBubyBzdGF0ZSBpbiB0aGUgVVJMLiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Ugb3ducyB0aGUgdmFsdWVzLlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBzYXZlZEZpbHRlcnMgPyB0aGlzLl9rZWVwT25QaWNrKGl0ZW1zKSA6IGl0ZW1zLFxuICAgICAgY2hhbmdlOiAocXVlcnkpID0+IHRoaXMuX2JhckNoYW5nZWQocXVlcnkgPz8ge30sICEhbWF0Y2hJdGVtKSxcbiAgICAgIC8vICdDbGVhciBmaWx0ZXJzJyBwdXRzIHRoZSBzY3JlZW4gYmFjayBvbiB0aGUgcmVwb3J0J3MgYXV0aG9yZWRcbiAgICAgIC8vIGRlZmF1bHRzIGFuZCBkcm9wcyB0aGUgdGVtcG9yYXJ5IGxheWVyLiBmcy1maWx0ZXIgcmVwb3J0cyBpdHMgb3duXG4gICAgICAvLyBjbGVhcmVkIGl0ZW1zIChjaGFuZ2UpIGp1c3QgYmVmb3JlIHRoaXMsIHNvIHRoZSByZXNldCB3aW5zLlxuICAgICAgY2xlYXI6ICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnJlc2V0VG9EZWZhdWx0cygpLFxuICAgICAgLy8gVGhlIGNoaXAgc2hvd3MgZXhhY3RseSB3aGlsZSB0aGUgc2NyZWVuIGRpZmZlcnMgZnJvbSB3aGF0IGEgY2xlYXJcbiAgICAgIC8vIHJldHVybnMgdG8gKEM1KS5cbiAgICAgIGNsZWFyVmlzaWJsZTogKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZGlmZmVyc0Zyb21EZWZhdWx0cygpLFxuICAgICAgc2F2ZWRGaWx0ZXJzLFxuICAgICAgLy8gZnMtZmlsdGVyIGNhbGxzIGluaXQgb25jZSBpdHMgc2F2ZWQgZmlsdGVycyBhcmUgbG9hZGVkLlxuICAgICAgLi4uKHNhdmVkRmlsdGVycyAmJiByZXBvcnRJZCA/IHsgaW5pdDogKCkgPT4gdGhpcy5fb3Blbk9uRmlyc3RTYXZlZEZpbHRlcihyZXBvcnRJZCkgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgcmVwb3J0IG9wZW5zIG9uIGl0cyBmaXJzdCBzYXZlZCBmaWx0ZXI6IG9uY2UgaXRzIHNhdmVkIGZpbHRlcnMgYXJlXG4gIC8vIGZpcnN0IGxvYWRlZCwgdGhlIGZpcnN0IG9uZSBpcyBwaWNrZWQgYXMgYSB2aWV3ZXIgd291bGQgcGljayBpdCwgc28gaXRcbiAgLy8gYXBwbGllcyBvbiBldmVyeSBwYWdlIHRocm91Z2ggdGhlIHNhbWUgY2hhbmdlIChfYmFyQ2hhbmdlZCkuIE9uY2UgcGVyXG4gIC8vIHJlcG9ydCBvcGVuZWQ6IHRoZSBiYXIgaXMgcmVjcmVhdGVkIGFzIHRoZSBzY3JlZW4gY2hhbmdlcywgYW5kIGEgbGF0ZXJcbiAgLy8gYnVpbGQgbXVzdCBub3QgcGljayBpdCBhZ2FpbiBvdmVyIHRoZSB2aWV3ZXIncyBvd24gZWRpdHMuIFJlb3JkZXJpbmcgdGhlXG4gIC8vIHNhdmVkIGZpbHRlcnMgY2hhbmdlcyB3aGljaCBvbmUgYSByZXBvcnQgb3BlbnMgb24sIGZvciBldmVyeW9uZS5cbiAgcHJpdmF0ZSBfb3Blbk9uRmlyc3RTYXZlZEZpbHRlcihyZXBvcnRJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2F2ZWRGaWx0ZXJDb250cm9sbGVyID0gdGhpcy5fcmVwb3J0QmFyPy5zYXZlZEZpbHRlckNvbnRyb2xsZXI7XG5cbiAgICBpZiAodGhpcy5fb3BlbmVkT25TYXZlZEZpbHRlclJlcG9ydElkID09PSByZXBvcnRJZCB8fCAhc2F2ZWRGaWx0ZXJDb250cm9sbGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlbmVkT25TYXZlZEZpbHRlclJlcG9ydElkID0gcmVwb3J0SWQ7XG5cbiAgICBjb25zdCBbZmlyc3RdID0gc2F2ZWRGaWx0ZXJDb250cm9sbGVyLnNhdmVkRmlsdGVycztcbiAgICBpZiAoZmlyc3QpIHtcbiAgICAgIHNhdmVkRmlsdGVyQ29udHJvbGxlci5zZXRBY3RpdmVGaWx0ZXIoZmlyc3QpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBiYXIncyBzYXZlZCBmaWx0ZXJzLCBzaGFyZWQgYnkgZXZlcnlvbmUgd2hvIG1heSBvcGVuIHRoZSByZXBvcnQsIG9yXG4gIC8vIHVuZGVmaW5lZCB3aGVuIHRoZSBiYXIgaGFzIG5vbmUgdG8gb2ZmZXI6IGEgcmVwb3J0IG5vdCB5ZXQgc2F2ZWQgaGFzIG5vXG4gIC8vIGlkIHRvIGtlZXAgdGhlbSB1bmRlciwgYW5kIGEgYmFyIHdpdGggbm8gcmVwb3J0LXdpZGUgZmlsdGVyIGhhcyBub3RoaW5nXG4gIC8vIGEgc2F2ZWQgZmlsdGVyIGhvbGRzLiBmcy1maWx0ZXIncyBvd24gU2F2ZWQgZmlsdGVycyBtZW51IGxpc3RzIHRoZW0sXG4gIC8vIHNhdmVzIHRoZSBiYXIncyB2YWx1ZXMgYXMgYSBuZXcgb25lIG9yIG92ZXIgdGhlIHBpY2tlZCBvbmUsIG9yZGVycyBhbmRcbiAgLy8gZGVsZXRlcyB0aGVtLiBXaGF0IGl0IHNhdmVzIGlzIGtlcHQgdG8gdGhlIHJlcG9ydC13aWRlIGZpbHRlcnNcbiAgLy8gKHNhdmVkRmlsdGVyVmFsdWVzKTogYSBwYWdlJ3Mgb3duIGZpbHRlcnMsIHRoZSBncmFpbiBhbmQgdGhlIG1hdGNoIGFyZVxuICAvLyBsZWZ0IG91dC4gVGhlIGxpc3QgaXMgcmVhZCBldmVyeSB0aW1lIHRoZSBiYXIgaXMgYnVpbHQ7IG9uZSB0aGF0IGNhbm5vdFxuICAvLyBiZSByZWFkIHNob3dzIGFzIGVtcHR5IHJhdGhlciB0aGFuIGtlZXBpbmcgdGhlIGJhciBmcm9tIGRyYXdpbmcuXG4gIHByaXZhdGUgX3NhdmVkRmlsdGVyc0NvbmZpZygpOiBJRmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0KCk/LmlkID8/IG51bGw7XG5cbiAgICBpZiAoIXJlcG9ydElkIHx8ICFzYXZlZEZpbHRlckdyb3Vwcyh0aGlzLl9yZXBvcnRHcm91cHMoKSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb2FkOiAoKSA9PiB0aGlzLl9yZXBvcnREYXRhXG4gICAgICAgIC5zYXZlZEZpbHRlcnMocmVwb3J0SWQsIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgUmVwb3J0U2F2ZWRGaWx0ZXJbXSkpLFxuICAgICAgICAgIG1hcCgoc2F2ZWRGaWx0ZXJzKSA9PiAoc2F2ZWRGaWx0ZXJzID8/IFtdKS5tYXAoKHNhdmVkRmlsdGVyKSA9PiB0aGlzLl9iYXJTYXZlZEZpbHRlcihzYXZlZEZpbHRlcikpKSxcbiAgICAgICAgKSxcbiAgICAgIHNhdmU6IChzYXZlZEZpbHRlcikgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJzID0gc2F2ZWRGaWx0ZXJWYWx1ZXMoc2F2ZWRGaWx0ZXIuZmlsdGVycywgdGhpcy5fc2F2ZWRGaWx0ZXJHcm91cHMoKSk7XG4gICAgICAgIGNvbnN0IHNhdmUkID0gc2F2ZWRGaWx0ZXIuaWRcbiAgICAgICAgICA/IHRoaXMuX3JlcG9ydERhdGEudXBkYXRlU2F2ZWRGaWx0ZXIocmVwb3J0SWQsIE51bWJlcihzYXZlZEZpbHRlci5pZCksIHtcbiAgICAgICAgICAgIC4uLihzYXZlZEZpbHRlci5uYW1lID8geyBuYW1lOiBzYXZlZEZpbHRlci5uYW1lIH0gOiB7fSksXG4gICAgICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgOiB0aGlzLl9yZXBvcnREYXRhLmNyZWF0ZVNhdmVkRmlsdGVyKHJlcG9ydElkLCB7IG5hbWU6IHNhdmVkRmlsdGVyLm5hbWUgPz8gJycsIGZpbHRlcnMgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNhdmUkLnBpcGUobWFwKChzYXZlZCkgPT4gdGhpcy5fYmFyU2F2ZWRGaWx0ZXIoc2F2ZWQpKSk7XG4gICAgICB9LFxuICAgICAgb3JkZXI6IChzYXZlZEZpbHRlcnMpID0+IHRoaXMuX3JlcG9ydERhdGFcbiAgICAgICAgLnNhdmVTYXZlZEZpbHRlclBvc2l0aW9ucyhyZXBvcnRJZCwgc2F2ZWRGaWx0ZXJzLm1hcCgoc2F2ZWRGaWx0ZXIpID0+IE51bWJlcihzYXZlZEZpbHRlci5pZCkpKVxuICAgICAgICAucGlwZShtYXAoKG9yZGVyZWQpID0+IChvcmRlcmVkID8/IFtdKS5tYXAoKHNhdmVkRmlsdGVyKSA9PiB0aGlzLl9iYXJTYXZlZEZpbHRlcihzYXZlZEZpbHRlcikpKSksXG4gICAgICBkZWxldGU6IChzYXZlZEZpbHRlcikgPT4gdGhpcy5fcmVwb3J0RGF0YVxuICAgICAgICAuZGVsZXRlU2F2ZWRGaWx0ZXIocmVwb3J0SWQsIE51bWJlcihzYXZlZEZpbHRlci5pZCkpXG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiBzYXZlZEZpbHRlcikpLFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgcmVwb3J0LXdpZGUgZmlsdGVyIGdyb3VwczogdGhlIG9uZXMgYSBzYXZlZCBmaWx0ZXIgaG9sZHMuXG4gIHByaXZhdGUgX3NhdmVkRmlsdGVyR3JvdXBzKCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICAgIHJldHVybiBzYXZlZEZpbHRlckdyb3Vwcyh0aGlzLnJlcG9ydCgpPy5maWx0ZXJHcm91cHMpO1xuICB9XG5cbiAgLy8gQSBzYXZlZCBmaWx0ZXIgYXMgdGhlIGJhcidzIG1lbnUgaG9sZHMgaXQuIEl0cyB2YWx1ZXMgYXJlIGtlcHQgdG8gdGhlXG4gIC8vIHJlcG9ydC13aWRlIGZpbHRlcnMgdGhlIHJlcG9ydCBoYXMgbm93IChhIGtleSBpdCBubyBsb25nZXIgaGFzLCBvciBhXG4gIC8vIHZhbHVlIGl0cyBmaWx0ZXIgY2FuIG5vIGxvbmdlciB0YWtlLCBpcyBkcm9wcGVkIHJhdGhlciB0aGFuIGFwcGxpZWQpLCBhbmRcbiAgLy8gZWFjaCByZWFkIG9mIHRoZW0gaGFuZHMgb3V0IGEgY29weSwgc28gbm90aGluZyB0aGUgYmFyIGRvZXMgdG8gdGhlIHZhbHVlc1xuICAvLyBpdCBzZXQgY2hhbmdlcyB0aGUgc2F2ZWQgZmlsdGVyLiBBIHJlYWQgYWxzbyBub3RlcyB0aGUgYmFyJ3MgdmFsdWVzXG4gIC8vIChfa2VlcEJhck9uUGljayk6IHBpY2tpbmcgYSBzYXZlZCBmaWx0ZXIgcmVhZHMgaXRzIHZhbHVlcyBhbmQgc2V0cyB0aGVcbiAgLy8gYmFyIGZyb20gdGhlbSBpbiBvbmUgZ28sIGFuZCB0aGUgaXRlbXMgaXQgZG9lcyBub3QgaG9sZCBhcmUgcHV0IGJhY2suXG4gIHByaXZhdGUgX2JhclNhdmVkRmlsdGVyKHNhdmVkRmlsdGVyOiBSZXBvcnRTYXZlZEZpbHRlcik6IElGaWx0ZXJTYXZlZEZpbHRlciB7XG4gICAgY29uc3QgZmlsdGVycyA9IHNhdmVkRmlsdGVyVmFsdWVzKHNhdmVkRmlsdGVyLmZpbHRlcnMsIHRoaXMuX3NhdmVkRmlsdGVyR3JvdXBzKCkpO1xuICAgIGNvbnN0IGtlZXBCYXIgPSAoKSA9PiB0aGlzLl9rZWVwQmFyT25QaWNrKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHNhdmVkRmlsdGVyLmlkLFxuICAgICAgbmFtZTogc2F2ZWRGaWx0ZXIubmFtZSxcbiAgICAgIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICBrZWVwQmFyKCk7XG5cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gTm90ZXMgdGhlIGJhcidzIHZhbHVlcyBmb3IgYSBwaWNrIG9mIGEgc2F2ZWQgZmlsdGVyIChfYmFyVmFsdWVzQXRQaWNrKS5cbiAgLy8gZnMtZmlsdGVyIHNldHMgdGhlIGJhciBmcm9tIHRoZSBzYXZlZCBmaWx0ZXIncyB2YWx1ZXMgaW4gdGhlIHNhbWUgdGFza1xuICAvLyBhcyBpdCByZWFkcyB0aGVtLCBzbyB0aGUgbm90ZSBpcyBkcm9wcGVkIG9uY2UgdGhpcyB0YXNrIGlzIGRvbmU6IGFueVxuICAvLyBvdGhlciByZWFkIG9mIGEgc2F2ZWQgZmlsdGVyJ3MgdmFsdWVzIChpdHMgcm93IGluIFZpZXcgYWxsLCBhIHNhdmUpIHNldHNcbiAgLy8gbm90aGluZy5cbiAgcHJpdmF0ZSBfa2VlcEJhck9uUGljaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlcG9ydEJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2JhclZhbHVlc0F0UGljayA9IHsgLi4udGhpcy5fcmVwb3J0QmFyLnZhbHVlcyB9O1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuX2JhclZhbHVlc0F0UGljayA9IG51bGwpO1xuICB9XG5cbiAgLy8gVGhlIGJhcidzIGl0ZW1zLCBlYWNoIG9uZSBhIHNhdmVkIGZpbHRlciBkb2VzIG5vdCBob2xkICh0aGUgZ3JvdXAtYnlcbiAgLy8gZ3JhaW4sIHRoZSBtYXRjaCwgYSBwYWdlJ3Mgb3duIGZpbHRlcnMpIHNldCBiYWNrIHRvIGl0cyB2YWx1ZSB3aGVuIGEgcGlja1xuICAvLyBvZiBhIHNhdmVkIGZpbHRlciBzZXRzIGl0LiBmcy1maWx0ZXIgc2V0cyBldmVyeSBpdGVtIGZyb20gYSBzYXZlZCBmaWx0ZXJcbiAgLy8gYW5kIGNhbGxzIGVhY2ggb25lJ3MgY2hhbmdlIGJlZm9yZSBpdCByZXBvcnRzIHRoZSBiYXIncyBjaGFuZ2UsIHNvIHRoZVxuICAvLyBjaGFuZ2UgdGhlIGJhciByZXBvcnRzIGNhcnJpZXMgdGhlc2UgaXRlbXMgYXMgdGhleSB3ZXJlOiB0aGUgcGljayBtb3Zlc1xuICAvLyB0aGUgcmVwb3J0LXdpZGUgZmlsdGVycyBvbmx5LCBvbiBldmVyeSBwYWdlLCB0aHJvdWdoIHRoZSBzYW1lIGNoYW5nZSBhc1xuICAvLyBhIHZpZXdlcidzIG93biBlZGl0IChfYmFyQ2hhbmdlZCkuIE9uIGFueSBvdGhlciBjaGFuZ2UgYW4gaXRlbSdzIGNoYW5nZVxuICAvLyBjb21lcyBhZnRlciB0aGUgYmFyJ3MsIHdpdGggbm8gcGljayBub3RlZCwgYW5kIGRvZXMgbm90aGluZy5cbiAgcHJpdmF0ZSBfa2VlcE9uUGljayhpdGVtczogSUZpbHRlckNvbmZpZ0l0ZW1bXSk6IElGaWx0ZXJDb25maWdJdGVtW10ge1xuICAgIGNvbnN0IGhlbGQgPSBuZXcgU2V0KHRoaXMuX3NhdmVkRmlsdGVyR3JvdXBzKCkubWFwKChncm91cCkgPT4gZ3JvdXBJdGVtTmFtZShncm91cCkpKTtcblxuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+IChoZWxkLmhhcyhpdGVtLm5hbWUpXG4gICAgICA/IGl0ZW1cbiAgICAgIDogeyAuLi5pdGVtLCBjaGFuZ2U6IChiYXJJdGVtOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4pID0+IHRoaXMuX2tlZXBJdGVtT25QaWNrKGJhckl0ZW0pIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2tlZXBJdGVtT25QaWNrKGl0ZW06IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9iYXJWYWx1ZXNBdFBpY2spIHtcbiAgICAgIGl0ZW0uc2V0VmFsdWUodGhpcy5fYmFyVmFsdWVzQXRQaWNrW2l0ZW0ubmFtZV0sIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYmFyJ3MgdmFsdWVzIGludG8gdGhlIHN0YXRlOiBldmVyeSBncm91cCBpdCBzaG93cywgdGhlIGdyYWluIGFuZCxcbiAgLy8gd2hlbiB0aGUgYmFyIGhhcyB0aGUgY29udHJvbCwgdGhlIG1hdGNoLlxuICBwcml2YXRlIF9iYXJDaGFuZ2VkKHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgaGFzTWF0Y2g6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHsgZ3JvdXBJZCwgdmFsdWUgfSBvZiBncm91cFZhbHVlc0Zyb21RdWVyeShxdWVyeSwgdGhpcy5fcmVwb3J0R3JvdXBzKCkpKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRWYWx1ZShncm91cElkLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8vIE5vdCBhIGZpbHRlciBncm91cCDigJQgdGhlIGdyYWluIGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBxdWVyeS5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRGcmVxdWVuY3koKHF1ZXJ5W0dST1VQX0JZX0lURU1dIGFzIENoYXJ0R3JhbnVsYXJpdHkpIHx8IG51bGwpO1xuICAgIC8vIE5vciBpcyB0aGUgbWF0Y2g7IGEgYmFyIHdpdGhvdXQgdGhlIGNvbnRyb2wgbGVhdmVzIGl0IGFzIGl0IGlzLlxuICAgIGlmIChoYXNNYXRjaCkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0TWF0Y2gobWF0Y2hGcm9tUXVlcnkocXVlcnkpKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCBhcyBhbiBmcy1maWx0ZXIgaXRlbSwgb3IgbnVsbCB3aGVuIHRoZSByZXBvcnRcbiAgLy8gaGFzIG5vbmUgdG8gc2hvdy4gU2VlZGVkIGZyb20gdGhlIHNlc3Npb24gc3RhdGUgc28gdGhlIGdyYWluIHRoZSB2aWV3ZXJcbiAgLy8gcGlja2VkIHN1cnZpdmVzIHRoZSByZXBvcnQgYmVpbmcgcmUtZmV0Y2hlZCBhZnRlciBhIGNoYXQgZWRpdC5cbiAgcHJpdmF0ZSBfZ3JvdXBCeUl0ZW0oKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuXG4gICAgcmV0dXJuIHJlcG9ydFxuICAgICAgPyBncm91cEJ5RmlsdGVySXRlbShyZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gVGhlIGJhcidzIE1hdGNoIGNvbnRyb2wsIHNlZWRlZCB3aXRoIHRoZSBtYXRjaCBvbiBzY3JlZW4sIG9yIG51bGwgd2hlblxuICAvLyB0aGUgYmFyIGhvbGRzIGZld2VyIHRoYW4gdHdvIGdyb3VwcyB0aGF0IGNvbWJpbmUuXG4gIHByaXZhdGUgX21hdGNoSXRlbSgpOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICAgIHJldHVybiBtYXRjaEZpbHRlckl0ZW0odGhpcy5yZXBvcnQoKSwgdGhpcy5fcmVwb3J0R3JvdXBzKCksIHRoaXMuY2hhdFBhZ2VJZCgpLCB0aGlzLl9maWx0ZXJTdGF0ZS5tYXRjaCgpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZzLWFpLXJlcG9ydCBmcy1jb2x1bW5cIj5cblxuICA8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0X19oZWFkZXIgZnMtcm93LmFsaWduLWNlbnRlclwiPlxuICAgIDxoMiBjbGFzcz1cImZzLWFpLXJlcG9ydF9fdGl0bGUgZnMtZmxleFwiPnt7IHJlcG9ydCgpPy5uYW1lIH19PC9oMj5cblxuICAgIEBpZiAocmVwb3J0KCkpIHtcbiAgICAgIDwhLS0gUmVwb3J0LWxldmVsIGZpbHRlcnMsIGlubGluZSB3aXRoIHRoZSB0b29sYmFyIGFjdGlvbnMsIHdpdGggdGhlXG4gICAgICAgICAgIHJlcG9ydCdzIHNhdmVkIGZpbHRlcnMgaW4gZnMtZmlsdGVyJ3Mgb3duIFNhdmVkIGZpbHRlcnMgbWVudS5cbiAgICAgICAgICAgZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0LCBzbyBpdCdzIGtleWVkIG9uIHRoZVxuICAgICAgICAgICBmaWx0ZXIgc2lnbmF0dXJlOiB3aGVuIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHNldCBjaGFuZ2VzIHRoZVxuICAgICAgICAgICBibG9jayBpcyByZWNyZWF0ZWQgYW5kIHJlLXJlYWRzIHRoZSByZWJ1aWx0IGNvbmZpZy4gLS0+XG4gICAgICBAaWYgKHJlcG9ydEhhc0ZpbHRlcnMoKSkge1xuICAgICAgICBAZm9yIChrZXkgb2YgW3JlcG9ydEZpbHRlcktleSgpXTsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgPGZzLWZpbHRlclxuICAgICAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fZmlsdGVyc1wiXG4gICAgICAgICAgICAgIFtjb25maWddPVwicmVwb3J0RmlsdGVyQ29uZmlnKClcIj5cbiAgICAgICAgICA8L2ZzLWZpbHRlcj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA8IS0tIFdoYXQgbGF5b3V0IGVkaXRpbmcgY2FuIGFkZCBvciBzd2l0Y2ggdG8sIGFuZCB0aGUgd2F5IG91dCBvZiBpdC5cbiAgICAgICAgICAgT25lIHN0eWxlIGZvciBhbGwgdGhyZWUg4oCUIG91dGxpbmVkLCBpY29uIGFuZCB0ZXh0LiBcIkhlYWRlciAmIGZvb3RlclwiXG4gICAgICAgICAgIGlzIGEgdG9nZ2xlOiBpdCBrZWVwcyBpdHMgbGFiZWwgYW5kIHR1cm5zIGdyYXkgd2hpbGUgaXQgaXMgb24uIC0tPlxuICAgICAgQGlmIChlZGl0TW9kZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2VkaXQtdG9vbHMgZnMtcm93LmFsaWduLWNlbnRlci5nYXAteHNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBhIGJsb2NrIG9mIHRleHRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGV4dCgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+dGl0bGU8L21hdC1pY29uPlxuICAgICAgICAgICAgQWRkIHRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX21hc3RlclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNNYXN0ZXJNb2RlXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNNYXN0ZXJNb2RlID8gJ0JhY2sgdG8gZWRpdGluZyB0aGlzIHBhZ2UnIDogJ0VkaXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyIHNob3duIG9uIGV2ZXJ5IHBhZ2UnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1hc3Rlck1vZGUoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPndlYl9hc3NldDwvbWF0LWljb24+XG4gICAgICAgICAgICBIZWFkZXIgJiBmb290ZXJcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgICAgICBEb25lIGVkaXRpbmdcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gT25lIGljb24gZm9yIGJvdGggc3RhdGVzOiBpdCByZWFkcyBhcyBwcmVzc2VkIHdoaWxlIGVkaXRpbmcgcmF0aGVyXG4gICAgICAgICAgIHRoYW4gc3dhcHBpbmcgdG8gc29tZXRoaW5nIGVsc2UuIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X190b2dnbGVcIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZWRpdE1vZGUoKVwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiZWRpdE1vZGUoKSA/ICdEb25lIGVkaXRpbmcnIDogJ0VkaXQgbGF5b3V0J1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmRhc2hib2FyZF9jdXN0b21pemU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiRXhwb3J0XCJcbiAgICAgICAgICBbZnNNZW51VHJpZ2dlckZvcl09XCJleHBvcnRNZW51XCI+XG4gICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxmcy1tZW51ICNleHBvcnRNZW51PlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFBvd2VycG9pbnQoKVwiPlxuICAgICAgICAgIEV4cG9ydCBQb3dlclBvaW50XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0UGRmKClcIj5cbiAgICAgICAgICBFeHBvcnQgUERGXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSgpXCI+XG4gICAgICAgICAgRXhwb3J0IFJhdyBEYXRhXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIEBpZiAoKHJlcG9ydCgpPy5wYWdlcz8ubGVuZ3RoID8/IDApID4gMSkge1xuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEodHJ1ZSlcIj5cbiAgICAgICAgICAgIEV4cG9ydCBSYXcgRGF0YSAoVGhpcyBQYWdlKVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIH1cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnREYXRhKGZhbHNlLCAneGxzeCcpXCI+XG4gICAgICAgICAgRXhwb3J0IEV4Y2VsXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIEBpZiAoKHJlcG9ydCgpPy5wYWdlcz8ubGVuZ3RoID8/IDApID4gMSkge1xuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEodHJ1ZSwgJ3hsc3gnKVwiPlxuICAgICAgICAgICAgRXhwb3J0IEV4Y2VsIChUaGlzIFBhZ2UpXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgPC9mcy1tZW51PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIlJlcG9ydCBzZXR0aW5nc1wiXG4gICAgICAgICAgKGNsaWNrKT1cInJlcG9ydFNldHRpbmdzKClcIj5cbiAgICAgICAgPG1hdC1pY29uPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgICAgI3NwbGl0XG4gICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fc3BsaXQgZnMtcm93LmFsaWduLXN0YXJ0XCI+XG4gICAgQGlmIChjaGF0RW5hYmxlZCgpKSB7XG4gICAgICA8ZnMtYWktY2hhdFxuICAgICAgICAgICNjaGF0UGFuZWxcbiAgICAgICAgICBjbGFzcz1cImNoYXRcIlxuICAgICAgICAgIFtiYXNlUGF0aF09XCJjaGF0QmFzZVBhdGgoKVwiXG4gICAgICAgICAgW3JlYWR5XT1cImNoYXRQYWdlSWQoKSAhPT0gbnVsbFwiXG4gICAgICAgICAgKHJlc3BvbnNlKT1cIm9uQ2hhdFJlc3BvbnNlKCRldmVudClcIj5cbiAgICAgIDwvZnMtYWktY2hhdD5cblxuICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwicmVzaXplclwiXG4gICAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50KVwiPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPGRpdiBjbGFzcz1cInZpZXdlciBmcy1mbGV4IGZzLWNvbHVtblwiPlxuICAgICAgQGlmIChyZXBvcnQoKSkge1xuICAgICAgICA8YXBwLXJlcG9ydC1jYW52YXNcbiAgICAgICAgICAgIFtyZXBvcnRdPVwicmVwb3J0KClcIlxuICAgICAgICAgICAgW2VkaXRNb2RlXT1cImVkaXRNb2RlKClcIlxuICAgICAgICAgICAgW3BhZ2VJZF09XCJwYWdlSWQoKVwiXG4gICAgICAgICAgICAoY29tcG9uZW50U2V0dGluZ3MpPVwiY29tcG9uZW50U2V0dGluZ3MoJGV2ZW50KVwiXG4gICAgICAgICAgICAocmVwb3J0Q2hhbmdlZCk9XCJvbkNhbnZhc1JlcG9ydENoYW5nZWQoKVwiXG4gICAgICAgICAgICAocGFnZUNoYW5nZWQpPVwib25DYW52YXNQYWdlQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgIDwvYXBwLXJlcG9ydC1jYW52YXM+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
726
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQ0ssZUFBZSxFQUFnQixjQUFjLEdBQ3hELE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxT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QUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUNyRywyRUFBMkU7d0JBQzNFLHdDQUF3Qzt3QkFDeEMsdUJBQXVCLEVBQUU7cUJBQzFCLFdBQ1E7d0JBQ1AsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIscUJBQXFCO3FCQUN0Qjt3REFvR08sTUFBTTtzQkFEYixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSzVCLFVBQVU7c0JBRGpCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFNcEMsT0FBTztzQkFEZCxTQUFTO3VCQUFDLHFCQUFxQjtnQkFNeEIsVUFBVTtzQkFEakIsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZiwgRWxlbWVudFJlZiwgTmdab25lLCBWaWV3Q2hpbGQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IERpc3BsYXlBcGlFcnJvciB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5pbXBvcnQge1xuICBCYXNlSXRlbSwgRmlsdGVyQ29tcG9uZW50LCBGaWx0ZXJDb25maWcsIEZzRmlsdGVyTW9kdWxlLCBJRmlsdGVyQ29uZmlnSXRlbSwgSUZpbHRlclNhdmVkRmlsdGVyLCBJRmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnLFxufSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNNZW51TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVudSc7XG5pbXBvcnQgeyBGc1Byb2Nlc3MgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcblxuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgcHJvdmlkZUVjaGFydHNDb3JlIH0gZnJvbSAnbmd4LWVjaGFydHMnO1xuXG5pbXBvcnQgeyBGc0FpQ2hhdENvbXBvbmVudCwgRnNBaUNoYXREYXRhLCBGc0FpQ2hhdFJlc3BvbnNlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYWknO1xuXG5pbXBvcnQgeyBSZXBvcnRDYW52YXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3JlcG9ydC1jYW52YXMvcmVwb3J0LWNhbnZhcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0QWlDaGF0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LWFpLWNoYXQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCwgQ29tcG9uZW50U2V0dGluZ3NEaWFsb2dEYXRhLCBDb21wb25lbnRTZXR0aW5nc1Jlc3VsdCxcbn0gZnJvbSAnLi4vLi4vZGlhbG9ncy9jb21wb25lbnQtc2V0dGluZ3MvY29tcG9uZW50LXNldHRpbmdzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwgUmVwb3J0U2V0dGluZ3NSZXN1bHQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL3JlcG9ydC1zZXR0aW5ncy9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRQZGZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wZGYuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRQcHR4U2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtcHB0eC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC10ZXh0LWxheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydENoYXRWaWV3ZXJTdGF0ZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWNoYXQtdmlld2VyLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRTYXZlZEZpbHRlciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LXNhdmVkLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgUmVwb3J0LCBSZXBvcnRDaGF0UmVzcG9uc2UsXG4gIFJlcG9ydENvbXBvbmVudCBhcyBSZXBvcnRDb21wb25lbnRNb2RlbCwgUmVwb3J0RmlsdGVyR3JvdXAsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRFeHBvcnRGb3JtYXQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtZm9ybWF0LnR5cGUnO1xuaW1wb3J0IHsgY2hhdFZpZXdlckRyaWxscywgY2hhdFZpZXdlck1hdGNoLCBjaGF0Vmlld2VyVGlsZXMgfSBmcm9tICcuLi8uLi9yZXBvcnQtY2hhdC12aWV3ZXItc3RhdGUnO1xuaW1wb3J0IHsgcHJvdmlkZVJlcG9ydERhdGVQaWNrZXIgfSBmcm9tICcuLi8uLi9yZXBvcnQtZGF0ZS1wcmVzZXRzJztcbmltcG9ydCB7XG4gIEdST1VQX0JZX0lURU0sIGZpbHRlckl0ZW1Gb3JHcm91cCwgZ3JvdXBCeUZpbHRlckl0ZW0sIGdyb3VwQnlTaWduYXR1cmUsIGdyb3VwSXRlbU5hbWUsIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5LFxuICBoYXNQYWdlR3JvdXAsIGlzR3JhbnVsYXJpdHlPZmZlcmVkLCBtYXRjaEZpbHRlckl0ZW0sIG1hdGNoRnJvbVF1ZXJ5LCByZXBvcnRCYXJHcm91cHMsXG59IGZyb20gJy4uLy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgc2F2ZWRGaWx0ZXJHcm91cHMsIHNhdmVkRmlsdGVyVmFsdWVzIH0gZnJvbSAnLi4vLi4vcmVwb3J0LXNhdmVkLWZpbHRlcnMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UsIGRlZmF1bHRTaWduYXR1cmUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgemlwRXhwb3J0U3RhdGVzIH0gZnJvbSAnLi4vLi4vdGlsZS1kYXRhLXN0YXRlJztcblxuXG4vLyBBIHNpbmdsZSByZXBvcnQ6IHRoZSBBSSBjaGF0IG9uIHRoZSBsZWZ0ICh1bmxlc3MgdGhlIHNlcnZlciB0dXJucyBpdCBvZmYpLFxuLy8gdGhlIHJlcG9ydCBjYW52YXMgb24gdGhlIHJpZ2h0LCB1bmRlciBhbiBIMiB0aXRsZSArIHNldHRpbmdzIGdlYXIuIFRoZSBob3N0XG4vLyBzdXBwbGllcyBbcmVwb3J0SWRdIChmcm9tIGl0cyByb3V0ZSkgYW5kIHN3aXRjaGVzIHJlcG9ydHMgdGhyb3VnaCBpdHMgb3duXG4vLyByb3V0ZXMg4oCUIHRoaXMgY29tcG9uZW50IG5ldmVyIHBpY2tzIG9uZS5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWFpLXJlcG9ydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mcy1haS1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mcy1haS1yZXBvcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gU2Vzc2lvbiBmaWx0ZXIgc3RhdGUgaXMgcGVyLW9wZW4tcmVwb3J0LCBub3QgYXBwLWdsb2JhbDsgdGhlIGV4cG9ydFxuICAgIC8vIHNlcnZpY2VzIHJlc29sdmUgZmlsdGVycyB0aHJvdWdoIGl0LCBzbyB0aGV5IGxpdmUgYXQgdGhlIHNhbWUgbGV2ZWwuXG4gICAgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLFxuICAgIC8vIFRoZSBiYXJzJyBzZWxlY3QgbGlzdHMsIG5hcnJvd2VkIGJ5IHRoZSBvdGhlciBmaWx0ZXJzOyBwZXIgb3BlbiByZXBvcnQuXG4gICAgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UsXG4gICAgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSxcbiAgICBSZXBvcnRQcHR4U2VydmljZSxcbiAgICBSZXBvcnRQZGZTZXJ2aWNlLFxuICAgIFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlLFxuICAgIFJlcG9ydEV4cG9ydFNlcnZpY2UsXG4gICAgLy8gZnMtYWktY2hhdCBzaXRzIGluIHRoaXMgdGVtcGxhdGUsIHNvIGl0IHJlc29sdmVzIGl0cyBnYXRld2F5IGhlcmU6IHRoZVxuICAgIC8vIHJlcG9ydCBvbmUsIHdoaWNoIGFkZHMgdGhlIHZpZXdlcidzIHN0YXRlIHRvIGVhY2ggdHVybiBpdCBzZW5kcy5cbiAgICBSZXBvcnRBaUNoYXREYXRhLFxuICAgIHsgcHJvdmlkZTogRnNBaUNoYXREYXRhLCB1c2VFeGlzdGluZzogUmVwb3J0QWlDaGF0RGF0YSB9LFxuICAgIC8vIFRyZWUtc2hha2VuIEVDaGFydHMgY29yZSArIHRoZSAncmVwb3J0JyBob3VzZSB0aGVtZSwgbG9hZGVkIGxhemlseS5cbiAgICBwcm92aWRlRWNoYXJ0c0NvcmUoeyBlY2hhcnRzOiAoKSA9PiBpbXBvcnQoJy4uLy4uL3RoZW1lL2VjaGFydHMnKS50aGVuKChtb2R1bGUpID0+IG1vZHVsZS5kZWZhdWx0KSB9KSxcbiAgICAvLyBUaGUgYmFyJ3MgZGF0ZSBwaWNrZXJzIHN0YXJ0IHRoZWlyIHdlZWtzIG9uIE1vbmRheSBhbmQgbGlzdCB0aGUgYnVpbHQtaW5cbiAgICAvLyBwcmVzZXRzOyBhIHByZXNldCBvbmx5IHNldHMgdGhlIGRheXMuXG4gICAgcHJvdmlkZVJlcG9ydERhdGVQaWNrZXIoKSxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIEZzRmlsdGVyTW9kdWxlLFxuICAgIEZzTWVudU1vZHVsZSxcbiAgICBGc0FpQ2hhdENvbXBvbmVudCxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIFJlcG9ydENhbnZhc0NvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNBaVJlcG9ydENvbXBvbmVudCB7XG5cbiAgLy8gVGhlIHJlcG9ydCB0aGlzIHZpZXcgaXMgZm9jdXNlZCBvbiDigJQgc3VwcGxpZWQgYnkgdGhlIGhvc3QgZnJvbSB0aGUgcm91dGUuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0PG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIEFQSSBiYXNlIGZvciB0aGUgcmVwb3J0cyArIGNoYXQgZW5kcG9pbnRzOyBvdmVycmlkZSB0byBtb3VudCBlbHNld2hlcmUuXG4gIHB1YmxpYyByZWFkb25seSBiYXNlUGF0aCA9IGlucHV0PHN0cmluZz4oJ3JlcG9ydHMnKTtcblxuICAvLyBUaGUgcXVlcnkgcGFyYW0gdGhhdCBjYXJyaWVzIHRoZSBwYWdlIG9uIHNjcmVlbiAoP3BhZ2U9NykuIEEgcmVwb3J0IG9wZW5zXG4gIC8vIG9uIHRoZSBwYWdlIGl0IG5hbWVzLCBhbmQgZWFjaCBtb3ZlIHRvIGFub3RoZXIgcGFnZSB3cml0ZXMgaXQsIGluIHBsYWNlLFxuICAvLyBzbyBhIHJlZnJlc2ggb3IgYSBzaGFyZWQgbGluayBjb21lcyBiYWNrIHRvIHRoZSBzYW1lIHBhZ2UuIEl0IGlzIHRoZSBvbmx5XG4gIC8vIHN0YXRlIGEgcmVwb3J0IGtlZXBzIGluIHRoZSBVUkw6IGl0cyBmaWx0ZXJzIGFuZCB0aGUgcmVzdCBsaXZlIGluIHRoZVxuICAvLyByZXBvcnQncyBzdGF0ZSAoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKS4gQSBob3N0IHRoYXQgbW91bnRzIHNldmVyYWxcbiAgLy8gcmVwb3J0cyBvbiBvbmUgcm91dGUsIG9yIHdhbnRzIG5vIFVSTCB3cml0ZXMsIHNldHMgdGhpcyB0byBudWxsLlxuICBwdWJsaWMgcmVhZG9ubHkgcGFnZVF1ZXJ5UGFyYW0gPSBpbnB1dDxzdHJpbmcgfCBudWxsPigncGFnZScpO1xuXG4gIC8vIFRoZSByZXBvcnQgd2FzIGRlbGV0ZWQgZnJvbSBpdHMgc2V0dGluZ3MgZGlhbG9nIOKAlCB0aGUgaG9zdCByb3V0ZXMgYmFjayB0b1xuICAvLyB0aGUgbGlzdGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGRlbGV0ZWQgPSBvdXRwdXQ8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSByZXBvcnQgd2FzIHJlbmFtZWQgKHNldHRpbmdzLCBvciB0aGUgYWdlbnQpIOKAlCB0aGUgaG9zdCBjYW4gcmVmcmVzaCBhXG4gIC8vIGJyZWFkY3J1bWIgLyBkb2N1bWVudCB0aXRsZS5cbiAgcHVibGljIHJlYWRvbmx5IHJlbmFtZWQgPSBvdXRwdXQ8UmVwb3J0PigpO1xuXG4gIC8vIFRoZSB2aWV3ZXIgbW92ZWQgdG8gYW5vdGhlciBwYWdlIOKAlCBmb3IgaG9zdHMgdGhhdCB0cmFjayB0aGUgb3BlbiBwYWdlIGZvclxuICAvLyB0aGVpciBvd24gcmVhc29ucy4gTm90aGluZyBpcyB3cml0dGVuIHRvIHRoZSBVUkwuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlQ2hhbmdlZCA9IG91dHB1dDxudW1iZXIgfCBudWxsPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnQgPSBzaWduYWw8UmVwb3J0IHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBlZGl0TW9kZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHBhZ2UgdGhlIGNhbnZhcyBzaG91bGQgb3BlbiBvbjogdGhlID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZCB3aXRoXG4gIC8vIChyZWFkIG9uY2UgcGVyIHJlcG9ydCkuIENsZWFyZWQgYXMgc29vbiBhcyB0aGUgY2FudmFzIHJlcG9ydHMgYmFjaywgc28gYVxuICAvLyBsYXRlciBpbi1hcHAgcGFnZSBjaGFuZ2UgaXMgbmV2ZXIgZm91Z2h0IGJ5IGEgc3RhbGUgdmFsdWUuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIHBhZ2UgdGhlIGNoYXQgaXMgYm91bmQgdG86IHRoZSBvbmUgb24gc2NyZWVuLiBBIHJlcG9ydCBjb252ZXJzYXRpb25cbiAgLy8gYmVsb25ncyB0byBleGFjdGx5IG9uZSBwYWdlLCBzbyB0aGlzIGJvdGggc2NvcGVzIHRoZSBjb252ZXJzYXRpb24gbGlzdCBhbmRcbiAgLy8gYmVjb21lcyB0aGUgbmV3IGNvbnZlcnNhdGlvbidzIHBhZ2UuIEEgc2lnbmFsIGJlY2F1c2UgaXQgZmVlZHNcbiAgLy8gY2hhdEJhc2VQYXRoIOKAlCBjaGFuZ2luZyBpdCBpcyB3aGF0IHJlbG9hZHMgdGhlIHBhbmVsIG9udG8gdGhlIG5ldyBwYWdlJ3NcbiAgLy8gY29udmVyc2F0aW9ucy4gTnVsbCB1bnRpbCB0aGUgY2FudmFzIHJlcG9ydHMgd2hpY2ggcGFnZSBpdCBvcGVuZWQgb24sIHdoaWNoXG4gIC8vIGtlZXBzIHRoZSBjaGF0IGZyb20gbGlzdGluZyBhZ2FpbnN0IGEgcGFnZSBndWVzcy5cbiAgcHVibGljIHJlYWRvbmx5IGNoYXRQYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gV2hlcmUgdGhlIGNoYXQncyBjYWxscyBnbzogYmVuZWF0aCB0aGUgcGFnZSBpdCBpcyBib3VuZCB0b1xuICAvLyAoe2Jhc2VQYXRofS97cmVwb3J0SWR9L3BhZ2VzL3twYWdlSWR9L2NoYXQsIOKApi9jb252ZXJzYXRpb25zLCDigKYpLiBFdmVyeVxuICAvLyBjb252ZXJzYXRpb24gaXMgcmVhY2hlZCB0aHJvdWdoIGl0cyBwYWdlLCBzbyB0aGUgcGF0aCBjYXJyaWVzIHRoZSByZXBvcnRcbiAgLy8gYW5kIHRoZSBwYWdlIGFuZCBub3RoaW5nIHJpZGVzIGluIHRoZSBjaGF0J3MgcmVxdWVzdERhdGEuXG4gIC8vXG4gIC8vIFRoZSBjaGF0IGlzIGhlbGQgY2xvc2VkIChbcmVhZHldIGluIHRoZSB0ZW1wbGF0ZSkgdW50aWwgdGhlIHBhZ2UgaXMga25vd24sXG4gIC8vIHNvIHRoZSBwYXRoIGlzIG5ldmVyIGNhbGxlZCB3aGlsZSBjaGF0UGFnZUlkIGlzIG51bGw6IG9uIGEgZnJlc2ggbG9hZCB0aGVcbiAgLy8gcmVwb3J0IGhhcyB0byBhcnJpdmUgYW5kIHRoZSBjYW52YXMgaGFzIHRvIHJlbmRlciBiZWZvcmUgYW55IHBhZ2UgZXhpc3RzLlxuICBwdWJsaWMgcmVhZG9ubHkgY2hhdEJhc2VQYXRoID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBgJHt0aGlzLmJhc2VQYXRoKCl9LyR7dGhpcy5yZXBvcnRJZCgpfS9wYWdlcy8ke3RoaXMuY2hhdFBhZ2VJZCgpfWA7XG4gIH0pO1xuXG4gIC8vIFRoZSBjaGF0IGFuZCBpdHMgcmVzaXplciBzaG93IG9uY2UgdGhlIHJlcG9ydCBzYXlzIHRoZSBzZXJ2ZXIga2VlcHMgdGhlXG4gIC8vIGNoYXQgb24sIHNvIGEgcmVwb3J0IHdob3NlIGNoYXQgaXMgb2ZmIG5ldmVyIGZsYXNoZXMgb25lLiBBIHNlcnZlciB0b29cbiAgLy8gb2xkIHRvIHNlbmQgY2hhdEVuYWJsZWQga2VlcHMgaXQuXG4gIHB1YmxpYyByZWFkb25seSBjaGF0RW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuXG4gICAgcmV0dXJuICEhcmVwb3J0ICYmIHJlcG9ydC5jaGF0RW5hYmxlZCAhPT0gZmFsc2U7XG4gIH0pO1xuXG4gIC8vIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHRvb2xiYXIgKGZzLWZpbHRlcikuIFJlYnVpbHQgd2hlbmV2ZXIgdGhlIGxvYWRlZFxuICAvLyByZXBvcnQgKGFuZCB0aHVzIGl0cyBncm91cHMpIGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJDb25maWcgPSBzaWduYWw8RmlsdGVyQ29uZmlnIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gR2F0ZXMgdGhlIHRvb2xiYXIgZnMtZmlsdGVyIHNvIGl0IGlzbid0IHJlbmRlcmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICAvLyBwdXQgaW4gaXQg4oCUIG5vIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIGFuZCBubyBncm91cC1ieSBjb250cm9sLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SGFzRmlsdGVycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0R3JvdXBzKCkubGVuZ3RoID4gMCB8fCAhIXRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gIH0pO1xuXG4gIC8vIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9ubHkgb25jZSAoYXQgaW5pdCkuIFRoZSB0ZW1wbGF0ZSBrZXlzIHRoZVxuICAvLyB0b29sYmFyIGZzLWZpbHRlciBvbiB0aGlzIHNpZ25hdHVyZSBzbyBpdCdzIHJlY3JlYXRlZCAoYW5kIHJlLXJlYWRzIHRoZVxuICAvLyByZWJ1aWx0IGNvbmZpZykgd2hlbmV2ZXIgdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgc2V0IGNoYW5nZXMuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRGaWx0ZXJLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIFRoZSBzdGF0ZSB2ZXJzaW9uIHRoZSBiYXIgd2FzIGJ1aWx0IGZvcjogYSByZXNldCB0byB0aGUgZGVmYXVsdHNcbiAgICAgIC8vIHJlcGxhY2VzIGV2ZXJ5IHZhbHVlIGF0IG9uY2UuXG4gICAgICB0aGlzLl9iYXJWZXJzaW9uKCksXG4gICAgICAvLyBUaGUgZWZmZWN0aXZlIHpvbmUgaXMgcGFydCBvZiBpdCB0b286IGEgem9uZSBjaGFuZ2UgcmUtcmVzb2x2ZXMgcmVsYXRpdmVcbiAgICAgIC8vIHByZXNldHMsIGFuZCB0aGUgYmFyIG11c3QgYmUgcmVjcmVhdGVkIHRvIHNob3cgdGhlIG5ldyBkYXlzLlxuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUudGltZXpvbmUoKSxcbiAgICAgIC8vIFRoZSBzdG9yZWQgZGVmYXVsdCBpcyBwYXJ0IG9mIHRoZSBzaWduYXR1cmU6IHNhdmluZyBhIG5ldyBkZWZhdWx0IGluIHJlcG9ydFxuICAgICAgLy8gc2V0dGluZ3MgcmVidWlsZHMgdGhlIGNvbmZpZywgYnV0IHdpdGhvdXQgYSBrZXkgY2hhbmdlIGZzLWZpbHRlciBrZWVwc1xuICAgICAgLy8gcmVuZGVyaW5nIHRoZSB2YWx1ZXMgaXQgd2FzIGNyZWF0ZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gICAgICBncm91cEJ5U2lnbmF0dXJlKHRoaXMucmVwb3J0KCkpLFxuICAgICAgLi4udGhpcy5fcmVwb3J0R3JvdXBzKCkubWFwKChncm91cCkgPT4gYCR7Z3JvdXAuaWR9OiR7Z3JvdXAubGV2ZWx9OiR7Z3JvdXAubGFiZWx9OiR7ZGVmYXVsdFNpZ25hdHVyZShncm91cCl9YCksXG4gICAgICAvLyBBIHBhZ2UgZ3JvdXAgc2hvd3Mgb24gaXRzIG93biBwYWdlIG9ubHksIHNvIHN1Y2ggYSBiYXIgaXMgcmVjcmVhdGVkXG4gICAgICAvLyB3aGVuIHRoZSBwYWdlIG9uIHNjcmVlbiBjaGFuZ2VzLlxuICAgICAgLi4uKGhhc1BhZ2VHcm91cCh0aGlzLnJlcG9ydCgpKSA/IFtgcGFnZToke3RoaXMuY2hhdFBhZ2VJZCgpfWBdIDogW10pLFxuICAgIF0uam9pbignfCcpO1xuICB9KTtcblxuICBAVmlld0NoaWxkKCdzcGxpdCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgX3NwbGl0ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgLy8gT25seSB3aGlsZSB0aGUgY2hhdCBpcyBvbiAoY2hhdEVuYWJsZWQpLlxuICBAVmlld0NoaWxkKCdjaGF0UGFuZWwnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHJpdmF0ZSBfY2hhdFBhbmVsPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLy8gT25seSB0aGUgY2FudmFzIGtub3dzIHdoaWNoIHBhZ2UgaXMgb24gc2NyZWVuLCBhbmQgYSBwYWdlLXNjb3BlZCBleHBvcnRcbiAgLy8gaGFzIHRvIGFzayBpdC5cbiAgQFZpZXdDaGlsZChSZXBvcnRDYW52YXNDb21wb25lbnQpXG4gIHByaXZhdGUgX2NhbnZhcz86IFJlcG9ydENhbnZhc0NvbXBvbmVudDtcblxuICAvLyBUaGUgcmVwb3J0LWxldmVsIGZpbHRlciBiYXIsIHdoaWxlIGl0IGlzIGRyYXduLiBBIHNhdmVkIGZpbHRlciBiZWluZ1xuICAvLyBwaWNrZWQgcmVhZHMgdGhlIGJhcidzIHZhbHVlcyBvZmYgaXQgKF9rZWVwQmFyT25QaWNrKS5cbiAgQFZpZXdDaGlsZChGaWx0ZXJDb21wb25lbnQpXG4gIHByaXZhdGUgX3JlcG9ydEJhcj86IEZpbHRlckNvbXBvbmVudDtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9yZXBvcnRBaUNoYXREYXRhID0gaW5qZWN0KFJlcG9ydEFpQ2hhdERhdGEpO1xuICBwcml2YXRlIF9yb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIHByaXZhdGUgX3JvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9maWx0ZXJPcHRpb25zID0gaW5qZWN0KFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZXhwb3J0U2VydmljZSA9IGluamVjdChSZXBvcnRFeHBvcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfY29sbGVjdG9yID0gaW5qZWN0KFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UpO1xuICBwcml2YXRlIF9wcm9jZXNzID0gaW5qZWN0KEZzUHJvY2Vzcyk7XG4gIHByaXZhdGUgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLy8gVGhlIHN0YXRlIHZlcnNpb24gdGhlIGJhciB3YXMgbGFzdCBidWlsdCBmb3IgKHJlcG9ydEZpbHRlcktleSkuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2JhclZlcnNpb24gPSBzaWduYWwoMCk7XG5cbiAgLy8gVGhlIHJlcG9ydCBiYXIncyB2YWx1ZXMgYXMgdGhleSB3ZXJlIHRoZSBtb21lbnQgZnMtZmlsdGVyIHJlYWQgYSBzYXZlZFxuICAvLyBmaWx0ZXIncyB2YWx1ZXMsIG9yIG51bGwgb3V0c2lkZSB0aGF0IG1vbWVudC4gQSBwaWNrIHNldHMgZXZlcnkgaXRlbSBvZlxuICAvLyB0aGUgYmFyIGZyb20gdGhlIHNhdmVkIGZpbHRlcidzIHZhbHVlczsgZWFjaCBpdGVtIGEgc2F2ZWQgZmlsdGVyIG5ldmVyXG4gIC8vIGhvbGRzICh0aGUgZ3JvdXAtYnkgZ3JhaW4sIHRoZSBtYXRjaCwgYSBwYWdlJ3Mgb3duIGZpbHRlcnMpIGlzIHB1dCBiYWNrXG4gIC8vIHRvIGl0cyBub3RlZCB2YWx1ZSBhcyBpdCBpcyBzZXQgKF9rZWVwSXRlbU9uUGljaykuXG4gIHByaXZhdGUgX2JhclZhbHVlc0F0UGljazogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsID0gbnVsbDtcblxuICAvLyBUaGUgcmVwb3J0IHRoZSBzY3JlZW4gd2FzIG9wZW5lZCBvbiBpdHMgZmlyc3Qgc2F2ZWQgZmlsdGVyIGZvclxuICAvLyAoX29wZW5PbkZpcnN0U2F2ZWRGaWx0ZXIpLCBvciBudWxsIGJlZm9yZSB0aGF0LlxuICBwcml2YXRlIF9vcGVuZWRPblNhdmVkRmlsdGVyUmVwb3J0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEVhY2ggY2hhdCB0dXJuIGNhcnJpZXMgd2hhdCB0aGUgdmlld2VyIGhhcyBvbiBzY3JlZW4uIE9ubHkgdGhlIGZ1bmN0aW9uXG4gICAgLy8gaXMgc2V0IGhlcmU7IGl0IGlzIGNhbGxlZCB3aGVuIGEgdHVybiBpcyBzZW50LlxuICAgIHRoaXMuX3JlcG9ydEFpQ2hhdERhdGEudHVybkRhdGEgPSAoKSA9PiAoeyB2aWV3ZXJTdGF0ZTogdGhpcy5fY2hhdFZpZXdlclN0YXRlKCkgfSk7XG5cbiAgICAvLyBQb2ludCB0aGUgc2hhcmVkIGRhdGEgZ2F0ZXdheSBhdCB0aGUgY29uZmlndXJlZCBiYXNlIGZpcnN0IChiZWZvcmUgYW55XG4gICAgLy8gbG9hZCBiZWxvdyByZWFkcyBpdCkuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydERhdGEuYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoKCk7XG4gICAgfSk7XG5cbiAgICAvLyAoUmUpbG9hZCB3aGVuZXZlciB0aGUgaG9zdCBzd2l0Y2hlcyB0aGUgcmVwb3J0IGlkLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0SWQoKTtcblxuICAgICAgLy8gVGhlIHBhZ2UgdGhpcyByZXBvcnQgb3BlbnMgb24sIGZyb20gdGhlID9wYWdlPSB0aGUgVVJMIGFscmVhZHkgaG9sZHMuXG4gICAgICAvLyBSZWFkIHBlciByZXBvcnQgcmF0aGVyIHRoYW4gb25jZSBhdCBjb25zdHJ1Y3Rpb246IHRoZSBob3N0IG1heSBzd2FwXG4gICAgICAvLyByZXBvcnRzIG9uIHRoZSBzYW1lIHJvdXRlLCBhbmQgZWFjaCBhcnJpdmFsIGNhcnJpZXMgaXRzIG93biA/cGFnZT0uXG4gICAgICBjb25zdCBwYWdlSWQgPSB0aGlzLl9wYWdlSWRGcm9tVXJsKCk7XG5cbiAgICAgIC8vIE9ubHkgdGhlIHJlcG9ydCBpZCBhbmQgdGhlIHBhZ2UgcGFyYW0gcmUtcnVuIHRoaXMuIFRoZSB2aWV3IHN0YXRlIGJlbG93XG4gICAgICAvLyBpcyB3cml0dGVuIGhlcmUgYW5kIHJlYWQgYnkgdGhlIGNvbmZpZyBidWlsZCwgc28gaXQgc3RheXMgdW50cmFja2VkLlxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5lZGl0TW9kZS5zZXQoZmFsc2UpO1xuXG4gICAgICAgIC8vIEEgbmV3IHJlcG9ydCdzIHBhZ2VzIGFyZSBub3QgdGhpcyByZXBvcnQncyBwYWdlcyDigJQgZHJvcCB0aGUgYmluZGluZ1xuICAgICAgICAvLyB1bnRpbCBpdHMgY2FudmFzIHNheXMgd2hpY2ggcGFnZSBpdCBsYW5kZWQgb24uXG4gICAgICAgIHRoaXMuY2hhdFBhZ2VJZC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMucGFnZUlkLnNldChwYWdlSWQpO1xuXG4gICAgICAgIGlmIChyZXBvcnRJZCAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXBvcnQuc2V0KG51bGwpO1xuICAgICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gcmVzZXRUb0RlZmF1bHRzKCkgbW92ZXMgdGhlIHN0YXRlIHZlcnNpb24uIFRoZSBiYXIgaXMgYnVpbHQgYWdhaW4gZm9yXG4gICAgLy8gaXQsIGFuZCByZXBvcnRGaWx0ZXJLZXksIHdoaWNoIGNhcnJpZXMgaXQsIHJlY3JlYXRlcyBmcy1maWx0ZXI6IGl0IHJlYWRzXG4gICAgLy8gaXRzIGNvbmZpZyBvbmNlLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCk7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSB0aGlzLl9iYXJWZXJzaW9uKCkpIHtcbiAgICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRWRpdE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZS51cGRhdGUoKGVkaXRNb2RlKSA9PiAhZWRpdE1vZGUpO1xuICB9XG5cbiAgLy8gVGhlIGVkaXQgdG9vbHMgbGl2ZSBpbiB0aGlzIHRvb2xiYXIsIGJ1dCB0aGUgY2FudmFzIG93bnMgd2hhdCB0aGV5IGFjdCBvblxuICAvLyAodGhlIGFjdGl2ZSBwYWdlLCB0aGUgaGVhZGVyL2Zvb3RlciBiYW5kcywgd2hpY2ggbGF5ZXIgaXMgbGl2ZSkuXG4gIHB1YmxpYyBnZXQgaXNNYXN0ZXJNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW52YXM/Lm1hc3Rlck1vZGUoKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUZXh0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbnZhcz8uYWRkVGV4dCgpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZU1hc3Rlck1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FudmFzPy50b2dnbGVNYXN0ZXJNb2RlKCk7XG4gIH1cblxuICAvLyBSZXBvcnQgc2V0dGluZ3Mg4oCUIG5hbWUsIHBhZ2Ugc2l6ZSwgZGVsZXRlLiBUaGVcbiAgLy8gZGlhbG9nIHBlcmZvcm1zIHRoZSBkZWxldGUgaXRzZWxmOyB3ZSByZWFjdCB0byB3aGF0IGl0IHJlcG9ydHMgYmFjay5cbiAgcHVibGljIHJlcG9ydFNldHRpbmdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydC5pZDtcblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuPFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCB1bmtub3duLCBSZXBvcnRTZXR0aW5nc1Jlc3VsdD4oUmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgcmVwb3J0IH0sXG4gICAgICB3aWR0aDogJzQ2MHB4JyxcbiAgICB9KTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnZGVsZXRlZCcpIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZWQuZW1pdChyZXBvcnRJZCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBIHNhdmUgdGhhdCBmYWlsZWQgcGFydCB3YXkgKGEgcmVmdXNlZCBuYW1lKSBtYXkgc3RpbGwgaGF2ZSBzdG9yZWRcbiAgICAgICAgLy8gdGhlIGZpbHRlcnMgYmVmb3JlIGl0LCBzbyBhIGRpc21pc3NlZCBkaWFsb2cgdGhhdCB3cm90ZSByZWxvYWRzIHRvby5cbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnc2F2ZWQnIHx8IHNldHRpbmdzLndyb3RlKCkpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBDb21wb25lbnQgc2V0dGluZ3Mg4oCUIHRpdGxlLCBleGFjdCBnZW9tZXRyeSwgYW5kIHRoZSBkaWFnbm9zdGljIHZpZXdzXG4gIC8vIChTUUwsIGNvbmZpZywgZmlsdGVyIHdpcmluZykuXG4gIHB1YmxpYyBjb21wb25lbnRTZXR0aW5ncyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudE1vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCB8fCAhdGhpcy5fY2FudmFzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQuaWQ7XG5cbiAgICAvLyBUaGUgZGlhbG9nIGdldHMgd2hhdCB0aGUgY29tcG9uZW50J3MgdGl0bGUgdG9rZW5zIGZpbGwgd2l0aCB3aGVyZSBpdCBpc1xuICAgIC8vIGRyYXduLCBmb3IgdGhlIHRpdGxlJ3MgSW5zZXJ0IGZpZWxkIG1lbnUgYW5kIHRoZSBsaW5lIHNheWluZyBob3cgaXQgcmVhZHMuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW48Q29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsIENvbXBvbmVudFNldHRpbmdzRGlhbG9nRGF0YSwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQ+KFxuICAgICAgQ29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGRhdGE6IHsgcmVwb3J0LCBjb21wb25lbnQsIHRva2VuczogdGhpcy5fY2FudmFzLmNvbXBvbmVudFRva2Vucyhjb21wb25lbnQpIH0sXG4gICAgICAgIHdpZHRoOiAnNjQwcHgnLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gRmlsdGVyIGFkZC9yZW1vdmUvbGV2ZWwgY2hhbmdlcyBwZXJzaXN0IGltbWVkaWF0ZWx5IGluc2lkZSB0aGUgZGlhbG9nIChub1xuICAgIC8vIFwic2F2ZVwiKSBhbmQgY2FuIGxlYXZlIGl0IGJ5IGFuIGV4aXQgdGhhdCBjYXJyaWVzIG5vIHJlc3VsdCwgc28gdGhleSBhcmVcbiAgICAvLyBhbm5vdW5jZWQgYXMgdGhleSBsYW5kLiBUaGUgcmVsb2FkIHdhaXRzIGZvciB0aGUgY2xvc2Ugc28gdGhlIGNhbnZhcyBpc24ndFxuICAgIC8vIHJlLXJlbmRlcmluZyB1bmRlcm5lYXRoIGFuIG9wZW4gZGlhbG9nLlxuICAgIGxldCBmaWx0ZXJzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5maWx0ZXJzQ2hhbmdlZFxuICAgICAgLnBpcGUodGFrZVVudGlsKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gZmlsdGVyc0NoYW5nZWQgPSB0cnVlKTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgLy8gVGhlIGRpYWxvZyBjb25maXJtcyArIHBlcmZvcm1zIHRoZSBkZWxldGUgaXRzZWxmLiBUaGUgY29tcG9uZW50IGlzXG4gICAgICAgIC8vIGdvbmUgZnJvbSB0aGUgcmVwb3J0LCBzbyByZWxvYWQgcmF0aGVyIHRoYW4gcGF0Y2hpbmcgaXQgb3V0IGxvY2FsbHkg4oCUXG4gICAgICAgIC8vIGl0cyBmaWx0ZXJzIHdlbnQgd2l0aCBpdCwgd2hpY2ggdGhlIHJlcG9ydCBiYXIgaGFzIHRvIGJlIHJlYnVpbHQgZm9yLlxuICAgICAgICBpZiAocmVzdWx0Py5kZWxldGVkKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVwb3J0J3MgZmlsdGVyIGdyb3VwcyBjaGFuZ2VkLCBzbyB0aGUgcmVwb3J0IGJhciBhbmQgdGhlXG4gICAgICAgIC8vIG9uLWNvbXBvbmVudCBzdHJpcHMgaGF2ZSB0byBiZSByZWJ1aWx0IGZyb20gYSBmcmVzaCByZXBvcnQuXG4gICAgICAgIGlmIChmaWx0ZXJzQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90aGluZyBlbHNlIGluIHRoZSBkaWFsb2cgdG91Y2hlcyB0aGUgcXVlcnkg4oCUIHRpdGxlIGFuZCBwYWRkaW5nIGFyZVxuICAgICAgICAvLyBwcmVzZW50YXRpb24uIFJlcGFpbnQgdGhlIG9uZSBjb21wb25lbnQgaXQgd2FzIG9wZW5lZCBmb3IgYW5kIGxlYXZlXG4gICAgICAgIC8vIGV2ZXJ5IG90aGVyIGNvbXBvbmVudCdzIGRhdGEsIGFuZCBpdHMgcXVlcnksIGFsb25lLlxuICAgICAgICBpZiAocmVzdWx0Py5zZXR0aW5ncykge1xuICAgICAgICAgIHRoaXMuX2NhbnZhcz8uYXBwbHlDb21wb25lbnRTZXR0aW5ncyhjb21wb25lbnQuaWQsIHJlc3VsdC5zZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGNhbnZhcyBtb3ZlZCB0byBhbm90aGVyIHBhZ2UuIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVycyBzdGF5IGFzIHRoZXlcbiAgLy8gYXJlICh0aGV5IGxpdmUgaW4gdGhlIHN0YXRlIHNlcnZpY2UpOyB0aGUgcGFnZSBnb2VzIGludG8gdGhlIFVSTC5cbiAgcHVibGljIG9uQ2FudmFzUGFnZUNoYW5nZWQocGFnZUlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gVGhlIGFza2VkLWZvciBwYWdlIGhhcyBiZWVuIGNvbnN1bWVkOyBmcm9tIGhlcmUgdGhlIGNhbnZhcyBvd25zIHRoZSBwYWdlLlxuICAgIHRoaXMucGFnZUlkLnNldChudWxsKTtcbiAgICB0aGlzLmNoYXRQYWdlSWQuc2V0KHBhZ2VJZCk7XG4gICAgLy8gVGhlIG9wZW4gcGFnZSBpcyBwYXJ0IG9mIHRoZSBzdGF0ZSB0aGUgdGlsZXMgYW5kIGV4cG9ydHMgcmVhZC5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRQYWdlKHBhZ2VJZCk7XG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2VJZCk7XG4gICAgdGhpcy5fd3JpdGVQYWdlVG9VcmwocGFnZUlkKTtcblxuICAgIC8vIFRoZSBiYXIgc2hvd3MgdGhlIHBhZ2UgZ3JvdXBzIG9mIHRoZSBwYWdlIG9uIHNjcmVlbi5cbiAgICBpZiAoaGFzUGFnZUdyb3VwKHRoaXMucmVwb3J0KCkpKSB7XG4gICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBjYW52YXMgY2hhbmdlZCB0aGUgcmVwb3J0J3Mgc3RydWN0dXJlIChhZGRlZCBhIHBhZ2UpIOKAlCByZS1mZXRjaCBzbyB0aGVcbiAgLy8gbmV3IHBhZ2UgcmVuZGVyczsgdGhlIGNhbnZhcyBsYW5kcyB0aGUgdmlldyBvbiBpdC5cbiAgcHVibGljIG9uQ2FudmFzUmVwb3J0Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmIChyZXBvcnQpIHtcbiAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0LmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBFeHBvcnQgdGhlIHJlcG9ydCB0byBQb3dlclBvaW50LCBlbnRpcmVseSBjbGllbnQtc2lkZSAobmF0aXZlIGVkaXRhYmxlXG4gIC8vIGNoYXJ0czsgcGFnZSA9IHNsaWRlKS4gVGhlIGRvY2sgc2hvd3MgcHJvZ3Jlc3MgdW50aWwgdGhlIGZpbGUgc2F2ZXMuXG4gIHB1YmxpYyBleHBvcnRQb3dlcnBvaW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm9jZXNzLnJ1bihcbiAgICAgICdFeHBvcnRpbmcgUG93ZXJQb2ludCcsXG4gICAgICB0aGlzLl9leHBvcnRTZXJ2aWNlLnBvd2VycG9pbnQocmVwb3J0KSxcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwb3J0IHRvIFBERiwgZW50aXJlbHkgY2xpZW50LXNpZGUgKG9mZnNjcmVlbiBFQ2hhcnRzIGF0IDPDlzsgcGFnZSA9IFBERiBwYWdlKS5cbiAgcHVibGljIGV4cG9ydFBkZigpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzcy5ydW4oXG4gICAgICAnRXhwb3J0aW5nIFBERicsXG4gICAgICB0aGlzLl9leHBvcnRTZXJ2aWNlLnBkZihyZXBvcnQpLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgd2hvbGUgcmVwb3J0IGFzIGZpbGVzIGluIG9uZSBhY3Rpb246IHRoZSBzZXJ2ZXIgd3JpdGVzIG9uZSBDU1YgcGVyXG4gIC8vIGNvbXBvbmVudCwgZWFjaCB3aGF0IHRoZSBzY3JlZW4gc2hvd3MgKGEgY2hhcnQgb3IgS1BJIGFzIGRyYXduLCBhdCB0aGVcbiAgLy8gdmlld2VyJ3MgZ3JvdXAtYnkgZ3JhaW47IGEgbGlzdCBpbiBmdWxsKSwgYW5kIHppcHMgdGhlbSBmb2xkZXJlZCBieSBwYWdlXG4gIC8vIHdpdGggYW4gRXhwb3J0IE5vdGVzLnR4dCB0aGF0IHJlY29yZHMgdGhlIGZpbHRlcnMgYXMgdGhlIGJhciByZWFkcyB0aGVtLlxuICAvLyBFYWNoIGZpbGUgY2FycmllcyBpdHMgdGlsZSdzIG93biBzdGF0ZSAoemlwRXhwb3J0U3RhdGVzKTogYSBsaXN0J3Mgc29ydCxcbiAgLy8gc2VhcmNoIGFuZCBoaWRkZW4gY29sdW1ucywgYSBjaGFydCdzIGRyaWxsIHBhdGggYW5kIHRoZSBncm91cHMgdGhhdCBtYXRjaFxuICAvLyAnYW55JzsgYSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCByZWFkIGl0IHVzZXMgZWFjaCBsaXN0J3Mgc2F2ZWQgc29ydC4gVGhlXG4gIC8vIG5vdGVzIGdldCB0aGUgZmlsdGVyIGxpbmVzIGFzIHRoZSBjb3ZlciB3b3JkcyB0aGVtIChleHBvcnRMaW5lczsgYSBUaGlzXG4gIC8vIFBhZ2UgemlwIG5hbWVzIG9ubHkgdGhlIGdyb3VwcyB0aGF0IHJlYWNoIHRoZSBwYWdlKSwgYW5kIGVhY2ggZmlsZSBpc1xuICAvLyBuYW1lZCBhZnRlciBpdHMgdGlsZSdzIHRpdGxlIGFzIHRoZSBjYW52YXMgaGVhZGVyIHJlYWRzIGl0ICh0aXRsZXMpLiBBbGxcbiAgLy8gb2YgaXQgaXMgcmVhZCBvbmNlLCB3aGVuIHRoZSBleHBvcnQgc3RhcnRzIChleHBvcnRXb3JkaW5nKS4gYHRoaXNQYWdlYFxuICAvLyBuYXJyb3dzIGl0IHRvIHRoZSBwYWdlIHRoZSBjYW52YXMgaXMgc2hvd2luZy4gVW5saWtlIHRoZSBQREYvUG93ZXJQb2ludFxuICAvLyBleHBvcnRzIHRoZSBmaWxlcyBhcmUgd3JpdHRlbiBzZXJ2ZXItc2lkZSwgc28gdGhleSBhcmUgbm90IGNhcHBlZCBieVxuICAvLyB3aGF0IGEgc2xpZGUgY2FuIGhvbGQuXG4gIHB1YmxpYyBleHBvcnREYXRhKHRoaXNQYWdlID0gZmFsc2UsIGZvcm1hdDogUmVwb3J0RXhwb3J0Rm9ybWF0ID0gJ2NzdicpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUlkID0gdGhpc1BhZ2UgPyB0aGlzLl9jYW52YXM/LmFjdGl2ZVBhZ2U/LmlkID8/IG51bGwgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yUmVwb3J0KHJlcG9ydCwgcGFnZUlkKTtcbiAgICBjb25zdCBmcmVxdWVuY3kgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuX2NvbGxlY3Rvci5zbmFwc2hvdChyZXBvcnQpO1xuICAgIGNvbnN0IHN0YXRlcyA9IHppcEV4cG9ydFN0YXRlcyhyZXBvcnQsIHNuYXBzaG90LnN0YXRlLCBwYWdlSWQsIChjb21wb25lbnQpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRTZXNzaW9uTGF5b3V0KGNvbXBvbmVudCkpO1xuXG4gICAgdGhpcy5fcHJvY2Vzcy5kb3dubG9hZChcbiAgICAgIGZvcm1hdCA9PT0gJ3hsc3gnID8gJ0V4cG9ydGluZyBFeGNlbCcgOiAnRXhwb3J0aW5nIGRhdGEnLFxuICAgICAgdGhpcy5fY29sbGVjdG9yLmV4cG9ydFdvcmRpbmcocmVwb3J0LCBzbmFwc2hvdCwgcGFnZUlkKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKHsgbGluZXMsIHRpdGxlcyB9KSA9PiB0aGlzLl9yZXBvcnREYXRhLmV4cG9ydFJlcG9ydChcbiAgICAgICAgICAgIHJlcG9ydC5pZCxcbiAgICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHN0YXRlcyxcbiAgICAgICAgICAgIHRpdGxlcyxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgICkpLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgZGVmaW5pdGlvbiBhcyBhIHBhY2thZ2UgKC5yZXBvcnQuemlwKSB0aGF0IGFub3RoZXIgc2VydmVyXG4gIC8vIGltcG9ydHMgYXMgYSBuZXcgcmVwb3J0OiB3cml0dGVuIHNlcnZlci1zaWRlLCBkb3dubG9hZGVkIHRocm91Z2ggdGhlIGRvY2suXG4gIHB1YmxpYyBleHBvcnRQYWNrYWdlKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm9jZXNzLmRvd25sb2FkKFxuICAgICAgJ0V4cG9ydGluZyByZXBvcnQgcGFja2FnZScsXG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmV4cG9ydFBhY2thZ2UocmVwb3J0LmlkKSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVhY3QgdG8gZWFjaCBjaGF0IHR1cm4gKGZzLWNoYXQgaGFuZGxlcyB0aGUgcmVxdWVzdCArIHBlcnNpc3RlbmNlKTsgd2VcbiAgLy8gb25seSBjYXJlIGFib3V0IHRoZSByZXBvcnQgc2lkZSBlZmZlY3RzIHRoaXMgY29udGV4dCdzIGJhY2tlbmQgZmxhZ3MuXG4gIHB1YmxpYyBvbkNoYXRSZXNwb25zZShyZXNwb25zZTogRnNBaUNoYXRSZXNwb25zZSk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnRJZCgpO1xuICAgIGlmIChyZXBvcnRJZCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0UmVzcG9uc2UgPSByZXNwb25zZSBhcyBGc0FpQ2hhdFJlc3BvbnNlICYgUmVwb3J0Q2hhdFJlc3BvbnNlO1xuXG4gICAgLy8gQSBzdHJ1Y3R1cmFsIGNoYW5nZSBvciBhIHJlbmFtZSBib3RoIHJlLWZldGNoIHRoZSByZXBvcnQgKHNlc3Npb24gZmlsdGVyXG4gICAgLy8gdmFsdWVzIHN1cnZpdmUpOyBhIHJlbmFtZSBhZGRpdGlvbmFsbHkgbm90aWZpZXMgdGhlIGhvc3Qgc28gaXQgY2FuXG4gICAgLy8gcmVmcmVzaCBhIGJyZWFkY3J1bWIgLyB0aXRsZS5cbiAgICBpZiAocmVwb3J0UmVzcG9uc2UucmVwb3J0Q2hhbmdlZCB8fCByZXBvcnRSZXNwb25zZS5yZXBvcnRSZW5hbWVkKSB7XG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkLCAhIXJlcG9ydFJlc3BvbnNlLnJlcG9ydFJlbmFtZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERyYWcgdGhlIGRpdmlkZXIgYmV0d2VlbiB0aGUgY2hhdCBhbmQgY2FudmFzIHBhbmVzIChwb2ludGVyLWNhcHR1cmUgbG9vcFxuICAvLyBvdXRzaWRlIEFuZ3VsYXIpLlxuICBwdWJsaWMgb25SZXNpemVTdGFydChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IGhhbmRsZSA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBoYW5kbGUuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jlc2l6aW5nJyk7XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IG1vdmUgPSAoZTogUG9pbnRlckV2ZW50KSA9PiB0aGlzLl9yZXNpemVUbyhlLmNsaWVudFgpO1xuICAgICAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgICAgICBoYW5kbGUucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xuICAgICAgICB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Jlc2l6aW5nJyk7XG4gICAgICB9O1xuXG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpO1xuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gV2hhdCB0aGUgdmlld2VyIGhhcyBvbiBzY3JlZW4gYXMgYSBjaGF0IHR1cm4gc2VuZHMgaXQuIFRoZSBjYW52YXNcbiAgLy8gc2VsZWN0aW9uIGNvdW50cyBvbmx5IGluIGVkaXQgbW9kZTogaXQgaXMgZHJhd24gb25seSB0aGVuLCBhbmQgaXQgaXMga2VwdFxuICAvLyAobm90IGNsZWFyZWQpIHdoZW4gZWRpdCBtb2RlIGlzIGxlZnQuIFRoZSBtYXRjaCBpcyBzZW50IG9ubHkgd2hpbGUgaXQgaXNcbiAgLy8gJ2FueScsIHRoZSBkcmlsbGVkIGNoYXJ0cyBvbmx5IHdoZW4gb25lIGlzIGRyaWxsZWQsIGFuZCB0aGUgdGFibGVzIG9ubHlcbiAgLy8gd2hlbiB0aGUgYm91bmQgcGFnZSBzaG93cyBvbmUsIGVhY2ggd2l0aCB0aGUgbGF5b3V0IHRoZSB2aWV3ZXIgaGFzIGl0IGluXG4gIC8vIHdoaWxlIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBzdG9yZWQgb25lLlxuICBwcml2YXRlIF9jaGF0Vmlld2VyU3RhdGUoKTogUmVwb3J0Q2hhdFZpZXdlclN0YXRlIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuX2ZpbHRlclN0YXRlLnNuYXBzaG90KCk7XG4gICAgY29uc3QgZHJpbGxzID0gY2hhdFZpZXdlckRyaWxscyhzbmFwc2hvdCwgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSk7XG4gICAgY29uc3QgdGlsZXMgPSBjaGF0Vmlld2VyVGlsZXMoXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5yZXBvcnQoKSxcbiAgICAgIHRoaXMuY2hhdFBhZ2VJZCgpLFxuICAgICAgKGNvbXBvbmVudCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdyYW51bGFyaXR5OiB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKSxcbiAgICAgIHNlbGVjdGVkQ29tcG9uZW50SWQ6IHRoaXMuZWRpdE1vZGUoKSA/IHRoaXMuX2NhbnZhcz8uc2VsZWN0ZWRDb21wb25lbnRJZCgpID8/IG51bGwgOiBudWxsLFxuICAgICAgZmlsdGVyczogdGhpcy5fZmlsdGVyU3RhdGUudmlld2VyRmlsdGVycygpLFxuICAgICAgLi4uY2hhdFZpZXdlck1hdGNoKHNuYXBzaG90KSxcbiAgICAgIC4uLihkcmlsbHMubGVuZ3RoID8geyBkcmlsbHMgfSA6IHt9KSxcbiAgICAgIC4uLih0aWxlcy5sZW5ndGggPyB7IHRpbGVzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2l6ZVRvKGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwIHx8ICF0aGlzLl9jaGF0UGFuZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYXRpbyA9IChjbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGg7XG4gICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWluKDAuOCwgTWF0aC5tYXgoMC4yLCByYXRpbykpO1xuICAgIHRoaXMuX2NoYXRQYW5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmZsZXhCYXNpcyA9IGAke2NsYW1wZWQgKiAxMDB9JWA7XG4gIH1cblxuICAvLyBUaGUgcGFnZSBvbiBzY3JlZW4gaW50byB0aGUgVVJMICg/cGFnZT0pLCByZXBsYWNpbmcgdGhlIGN1cnJlbnQgaGlzdG9yeVxuICAvLyBlbnRyeSByYXRoZXIgdGhhbiBhZGRpbmcgb25lLCBzbyBCYWNrIGxlYXZlcyB0aGUgcmVwb3J0IGluc3RlYWQgb2ZcbiAgLy8gc3RlcHBpbmcgdGhyb3VnaCBpdHMgcGFnZXMuIE9ubHkgdGhlIHBhZ2UgcGFyYW0gaXMgdG91Y2hlZDsgdGhlIGhvc3Qnc1xuICAvLyBvd24gcXVlcnkgcGFyYW1zIHN0YXkuIE5vdGhpbmcgaXMgd3JpdHRlbiB3aGVuIHRoZSBwYXJhbSBpcyBvZmYsIG9yIHdoZW5cbiAgLy8gdGhlIFVSTCBhbHJlYWR5IG5hbWVzIHRoZSBwYWdlLlxuICBwcml2YXRlIF93cml0ZVBhZ2VUb1VybChwYWdlSWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMucGFnZVF1ZXJ5UGFyYW0oKTtcbiAgICBpZiAoIXBhcmFtIHx8ICFwYWdlSWQgfHwgdGhpcy5fcGFnZUlkRnJvbVVybCgpID09PSBwYWdlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMuX3JvdXRlLFxuICAgICAgcXVlcnlQYXJhbXM6IHsgW3BhcmFtXTogcGFnZUlkIH0sXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBwYWdlIGlkIHRoZSBVUkwgaG9sZHMgcmlnaHQgbm93ICg/cGFnZT0pLCBvciBudWxsIHdoZW4gdGhlIHBhZ2UgcGFyYW1cbiAgLy8gaXMgb2ZmIG9yIHRoZSB2YWx1ZSBpcyBub3QgYSB1c2FibGUgaWQuXG4gIHByaXZhdGUgX3BhZ2VJZEZyb21VcmwoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgcGFyYW0gPSB0aGlzLnBhZ2VRdWVyeVBhcmFtKCk7XG4gICAgaWYgKCFwYXJhbSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUlkID0gTnVtYmVyKHRoaXMuX3JvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KHBhcmFtKSk7XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhZ2VJZCkgJiYgcGFnZUlkID4gMCA/IHBhZ2VJZCA6IG51bGw7XG4gIH1cblxuICAvLyBFdmVyeSBsb2FkIHNldHMgdGhlIHZpZXdlciBzdGF0ZSB1cCBmb3IgdGhlIHJlcG9ydCAoaW5pdCk6IGl0cyBmaXJzdFxuICAvLyBsb2FkIG9wZW5zIGl0IG9uIGl0cyBhdXRob3JlZCBkZWZhdWx0cywgYW5kIGEgbGF0ZXIgb25lIChhIGNoYXQgZWRpdCwgYVxuICAvLyBzZXR0aW5ncyBzYXZlKSBrZWVwcyB0aGUgc3RhdGUgaW4gbWVtb3J5LlxuICBwcml2YXRlIF9sb2FkUmVwb3J0KHJlcG9ydElkOiBudW1iZXIsIGVtaXRSZW5hbWVkID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXBvcnREYXRhLmdldChyZXBvcnRJZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlcG9ydDogUmVwb3J0KSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5pbml0KHJlcG9ydCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnQ6IFJlcG9ydCkgPT4ge1xuICAgICAgICB0aGlzLnJlcG9ydC5zZXQocmVwb3J0KTtcbiAgICAgICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcblxuICAgICAgICBpZiAoZW1pdFJlbmFtZWQpIHtcbiAgICAgICAgICB0aGlzLnJlbmFtZWQuZW1pdChyZXBvcnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJlcG9ydC1sZXZlbCBmaWx0ZXIgZ3JvdXBzIGluIHRoZWlyIHNhdmVkIG9yZGVyIOKAlCB0aGUgb25lcyB0aGF0IHJlbmRlciBpblxuICAvLyB0aGUgdG9vbGJhciAoY29tcG9uZW50LWxldmVsIGdyb3VwcyByZW5kZXIgb24gdGhlaXIgY29tcG9uZW50cyksIHdpdGhcbiAgLy8gdGhlIHBhZ2UgZ3JvdXBzIG9mIHRoZSBwYWdlIG9uIHNjcmVlbi5cbiAgcHJpdmF0ZSBfcmVwb3J0R3JvdXBzKCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICAgIHJldHVybiByZXBvcnRCYXJHcm91cHModGhpcy5yZXBvcnQoKSwgdGhpcy5jaGF0UGFnZUlkKCkpO1xuICB9XG5cbiAgLy8gKFJlKWJ1aWxkIHRoZSB0b29sYmFyIGZzLWZpbHRlciBjb25maWcg4oCUIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIGl0ZW1zIGFuZFxuICAvLyB0aGVuIHRoZSBncm91cC1ieSBjb250cm9sLlxuICBwcml2YXRlIF9idWlsZFJlcG9ydENvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGNvbnN0IHJlcG9ydElkID0gcmVwb3J0Py5pZCA/PyBudWxsO1xuXG4gICAgLy8gRHJvcCBhIGdyYWluIHRoZSBjb250cm9sIG5vIGxvbmdlciBvZmZlcnMg4oCUIHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0XG4gICAgLy8gbWlkLXNlc3Npb24sIGFuZCBhbiBvdmVycmlkZSB0aGUgdmlld2VyIGNhbid0IHNlZSBpcyB3b3JzZSB0aGFuIG5vbmUuXG4gICAgaWYgKHJlcG9ydCAmJiAhaXNHcmFudWxhcml0eU9mZmVyZWQocmVwb3J0LCB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKSkpIHtcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEZyZXF1ZW5jeShudWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcG9ydD8udmlld2VyRmVhdHVyZXMgPz8gW107XG4gICAgY29uc3QgaXRlbXMgPSByZXBvcnRJZFxuICAgICAgPyB0aGlzLl9yZXBvcnRHcm91cHMoKS5tYXAoKGdyb3VwKSA9PlxuICAgICAgICBmaWx0ZXJJdGVtRm9yR3JvdXAoZ3JvdXAsIHRoaXMuX2ZpbHRlck9wdGlvbnMsIHJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpLCBmZWF0dXJlcykpXG4gICAgICA6IFtdO1xuXG4gICAgLy8gVGhlIGdyb3VwLWJ5IGNvbnRyb2wgbGVhZHMgdGhlIGJhciwgYWhlYWQgb2YgZXZlcnkgZmlsdGVyOiBpdCBzZXRzIHRoZVxuICAgIC8vIGdyYWluIHRoZSB3aG9sZSByZXBvcnQgaXMgcmVhZCBhdCwgc28gaXQgaXMgdGhlIGZpcnN0IHRoaW5nIGEgdmlld2VyXG4gICAgLy8gZGVjaWRlcy4gSXQgaXMgbm90IGEgZmlsdGVyIGdyb3VwIOKAlCBpdCByZS1idWNrZXRzIHJvd3MgcmF0aGVyIHRoYW5cbiAgICAvLyBuYXJyb3dpbmcgdGhlbSDigJQgc28gaXQgaXMgcGxhY2VkIGhlcmUgcmF0aGVyIHRoYW4gb3JkZXJlZCBhbW9uZyB0aGVtLlxuICAgIGNvbnN0IGdyb3VwQnlJdGVtID0gdGhpcy5fZ3JvdXBCeUl0ZW0oKTtcbiAgICBpZiAoZ3JvdXBCeUl0ZW0pIHtcbiAgICAgIGl0ZW1zLnVuc2hpZnQoZ3JvdXBCeUl0ZW0pO1xuICAgIH1cblxuICAgIC8vIEhvdyB0aGUgZ3JvdXBzIGNvbWJpbmUgY2xvc2VzIHRoZSBiYXIuXG4gICAgY29uc3QgbWF0Y2hJdGVtID0gdGhpcy5fbWF0Y2hJdGVtKCk7XG4gICAgaWYgKG1hdGNoSXRlbSkge1xuICAgICAgaXRlbXMucHVzaChtYXRjaEl0ZW0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNhdmVkRmlsdGVycyA9IHRoaXMuX3NhdmVkRmlsdGVyc0NvbmZpZygpO1xuXG4gICAgdGhpcy5fYmFyVmVyc2lvbi5zZXQodGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCkpO1xuICAgIHRoaXMucmVwb3J0RmlsdGVyQ29uZmlnLnNldCh7XG4gICAgICAvLyBmcy1maWx0ZXIgbmV2ZXIgdG91Y2hlcyB0aGUgVVJMIG9yIHBlcnNpc3RzIGZpbHRlciBzdGF0ZTogYSByZXBvcnRcbiAgICAgIC8vIGtlZXBzIG5vIHN0YXRlIGluIHRoZSBVUkwuIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSBvd25zIHRoZSB2YWx1ZXMuXG4gICAgICBxdWVyeVBhcmFtOiBmYWxzZSxcbiAgICAgIHBlcnNpc3Q6IGZhbHNlLFxuICAgICAgaXRlbXM6IHNhdmVkRmlsdGVycyA/IHRoaXMuX2tlZXBPblBpY2soaXRlbXMpIDogaXRlbXMsXG4gICAgICBjaGFuZ2U6IChxdWVyeSkgPT4gdGhpcy5fYmFyQ2hhbmdlZChxdWVyeSA/PyB7fSwgISFtYXRjaEl0ZW0pLFxuICAgICAgLy8gJ0NsZWFyIGZpbHRlcnMnIHB1dHMgdGhlIHNjcmVlbiBiYWNrIG9uIHRoZSByZXBvcnQncyBhdXRob3JlZFxuICAgICAgLy8gZGVmYXVsdHMgYW5kIGRyb3BzIHRoZSB0ZW1wb3JhcnkgbGF5ZXIuIGZzLWZpbHRlciByZXBvcnRzIGl0cyBvd25cbiAgICAgIC8vIGNsZWFyZWQgaXRlbXMgKGNoYW5nZSkganVzdCBiZWZvcmUgdGhpcywgc28gdGhlIHJlc2V0IHdpbnMuXG4gICAgICBjbGVhcjogKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUucmVzZXRUb0RlZmF1bHRzKCksXG4gICAgICAvLyBUaGUgY2hpcCBzaG93cyBleGFjdGx5IHdoaWxlIHRoZSBzY3JlZW4gZGlmZmVycyBmcm9tIHdoYXQgYSBjbGVhclxuICAgICAgLy8gcmV0dXJucyB0byAoQzUpLlxuICAgICAgY2xlYXJWaXNpYmxlOiAoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5kaWZmZXJzRnJvbURlZmF1bHRzKCksXG4gICAgICBzYXZlZEZpbHRlcnMsXG4gICAgICAvLyBmcy1maWx0ZXIgY2FsbHMgaW5pdCBvbmNlIGl0cyBzYXZlZCBmaWx0ZXJzIGFyZSBsb2FkZWQuXG4gICAgICAuLi4oc2F2ZWRGaWx0ZXJzICYmIHJlcG9ydElkID8geyBpbml0OiAoKSA9PiB0aGlzLl9vcGVuT25GaXJzdFNhdmVkRmlsdGVyKHJlcG9ydElkKSB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQSByZXBvcnQgb3BlbnMgb24gaXRzIGZpcnN0IHNhdmVkIGZpbHRlcjogb25jZSBpdHMgc2F2ZWQgZmlsdGVycyBhcmVcbiAgLy8gZmlyc3QgbG9hZGVkLCB0aGUgZmlyc3Qgb25lIGlzIHBpY2tlZCBhcyBhIHZpZXdlciB3b3VsZCBwaWNrIGl0LCBzbyBpdFxuICAvLyBhcHBsaWVzIG9uIGV2ZXJ5IHBhZ2UgdGhyb3VnaCB0aGUgc2FtZSBjaGFuZ2UgKF9iYXJDaGFuZ2VkKS4gT25jZSBwZXJcbiAgLy8gcmVwb3J0IG9wZW5lZDogdGhlIGJhciBpcyByZWNyZWF0ZWQgYXMgdGhlIHNjcmVlbiBjaGFuZ2VzLCBhbmQgYSBsYXRlclxuICAvLyBidWlsZCBtdXN0IG5vdCBwaWNrIGl0IGFnYWluIG92ZXIgdGhlIHZpZXdlcidzIG93biBlZGl0cy4gUmVvcmRlcmluZyB0aGVcbiAgLy8gc2F2ZWQgZmlsdGVycyBjaGFuZ2VzIHdoaWNoIG9uZSBhIHJlcG9ydCBvcGVucyBvbiwgZm9yIGV2ZXJ5b25lLlxuICBwcml2YXRlIF9vcGVuT25GaXJzdFNhdmVkRmlsdGVyKHJlcG9ydElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzYXZlZEZpbHRlckNvbnRyb2xsZXIgPSB0aGlzLl9yZXBvcnRCYXI/LnNhdmVkRmlsdGVyQ29udHJvbGxlcjtcblxuICAgIGlmICh0aGlzLl9vcGVuZWRPblNhdmVkRmlsdGVyUmVwb3J0SWQgPT09IHJlcG9ydElkIHx8ICFzYXZlZEZpbHRlckNvbnRyb2xsZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9vcGVuZWRPblNhdmVkRmlsdGVyUmVwb3J0SWQgPSByZXBvcnRJZDtcblxuICAgIGNvbnN0IFtmaXJzdF0gPSBzYXZlZEZpbHRlckNvbnRyb2xsZXIuc2F2ZWRGaWx0ZXJzO1xuICAgIGlmIChmaXJzdCkge1xuICAgICAgc2F2ZWRGaWx0ZXJDb250cm9sbGVyLnNldEFjdGl2ZUZpbHRlcihmaXJzdCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGJhcidzIHNhdmVkIGZpbHRlcnMsIHNoYXJlZCBieSBldmVyeW9uZSB3aG8gbWF5IG9wZW4gdGhlIHJlcG9ydCwgb3JcbiAgLy8gdW5kZWZpbmVkIHdoZW4gdGhlIGJhciBoYXMgbm9uZSB0byBvZmZlcjogYSByZXBvcnQgbm90IHlldCBzYXZlZCBoYXMgbm9cbiAgLy8gaWQgdG8ga2VlcCB0aGVtIHVuZGVyLCBhbmQgYSBiYXIgd2l0aCBubyByZXBvcnQtd2lkZSBmaWx0ZXIgaGFzIG5vdGhpbmdcbiAgLy8gYSBzYXZlZCBmaWx0ZXIgaG9sZHMuIGZzLWZpbHRlcidzIG93biBTYXZlZCBmaWx0ZXJzIG1lbnUgbGlzdHMgdGhlbSxcbiAgLy8gc2F2ZXMgdGhlIGJhcidzIHZhbHVlcyBhcyBhIG5ldyBvbmUgb3Igb3ZlciB0aGUgcGlja2VkIG9uZSwgb3JkZXJzIGFuZFxuICAvLyBkZWxldGVzIHRoZW0uIFdoYXQgaXQgc2F2ZXMgaXMga2VwdCB0byB0aGUgcmVwb3J0LXdpZGUgZmlsdGVyc1xuICAvLyAoc2F2ZWRGaWx0ZXJWYWx1ZXMpOiBhIHBhZ2UncyBvd24gZmlsdGVycywgdGhlIGdyYWluIGFuZCB0aGUgbWF0Y2ggYXJlXG4gIC8vIGxlZnQgb3V0LiBUaGUgbGlzdCBpcyByZWFkIGV2ZXJ5IHRpbWUgdGhlIGJhciBpcyBidWlsdDsgb25lIHRoYXQgY2Fubm90XG4gIC8vIGJlIHJlYWQgc2hvd3MgYXMgZW1wdHkgcmF0aGVyIHRoYW4ga2VlcGluZyB0aGUgYmFyIGZyb20gZHJhd2luZy5cbiAgcHJpdmF0ZSBfc2F2ZWRGaWx0ZXJzQ29uZmlnKCk6IElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnQoKT8uaWQgPz8gbnVsbDtcblxuICAgIGlmICghcmVwb3J0SWQgfHwgIXNhdmVkRmlsdGVyR3JvdXBzKHRoaXMuX3JlcG9ydEdyb3VwcygpKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvYWQ6ICgpID0+IHRoaXMuX3JlcG9ydERhdGFcbiAgICAgICAgLnNhdmVkRmlsdGVycyhyZXBvcnRJZCwgeyBjb250ZXh0OiBuZXcgSHR0cENvbnRleHQoKS5zZXQoRGlzcGxheUFwaUVycm9yLCBmYWxzZSkgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihbXSBhcyBSZXBvcnRTYXZlZEZpbHRlcltdKSksXG4gICAgICAgICAgbWFwKChzYXZlZEZpbHRlcnMpID0+IChzYXZlZEZpbHRlcnMgPz8gW10pLm1hcCgoc2F2ZWRGaWx0ZXIpID0+IHRoaXMuX2JhclNhdmVkRmlsdGVyKHNhdmVkRmlsdGVyKSkpLFxuICAgICAgICApLFxuICAgICAgc2F2ZTogKHNhdmVkRmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBzYXZlZEZpbHRlclZhbHVlcyhzYXZlZEZpbHRlci5maWx0ZXJzLCB0aGlzLl9zYXZlZEZpbHRlckdyb3VwcygpKTtcbiAgICAgICAgY29uc3Qgc2F2ZSQgPSBzYXZlZEZpbHRlci5pZFxuICAgICAgICAgID8gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVTYXZlZEZpbHRlcihyZXBvcnRJZCwgTnVtYmVyKHNhdmVkRmlsdGVyLmlkKSwge1xuICAgICAgICAgICAgLi4uKHNhdmVkRmlsdGVyLm5hbWUgPyB7IG5hbWU6IHNhdmVkRmlsdGVyLm5hbWUgfSA6IHt9KSxcbiAgICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IHRoaXMuX3JlcG9ydERhdGEuY3JlYXRlU2F2ZWRGaWx0ZXIocmVwb3J0SWQsIHsgbmFtZTogc2F2ZWRGaWx0ZXIubmFtZSA/PyAnJywgZmlsdGVycyB9KTtcblxuICAgICAgICByZXR1cm4gc2F2ZSQucGlwZShtYXAoKHNhdmVkKSA9PiB0aGlzLl9iYXJTYXZlZEZpbHRlcihzYXZlZCkpKTtcbiAgICAgIH0sXG4gICAgICBvcmRlcjogKHNhdmVkRmlsdGVycykgPT4gdGhpcy5fcmVwb3J0RGF0YVxuICAgICAgICAuc2F2ZVNhdmVkRmlsdGVyUG9zaXRpb25zKHJlcG9ydElkLCBzYXZlZEZpbHRlcnMubWFwKChzYXZlZEZpbHRlcikgPT4gTnVtYmVyKHNhdmVkRmlsdGVyLmlkKSkpXG4gICAgICAgIC5waXBlKG1hcCgob3JkZXJlZCkgPT4gKG9yZGVyZWQgPz8gW10pLm1hcCgoc2F2ZWRGaWx0ZXIpID0+IHRoaXMuX2JhclNhdmVkRmlsdGVyKHNhdmVkRmlsdGVyKSkpKSxcbiAgICAgIGRlbGV0ZTogKHNhdmVkRmlsdGVyKSA9PiB0aGlzLl9yZXBvcnREYXRhXG4gICAgICAgIC5kZWxldGVTYXZlZEZpbHRlcihyZXBvcnRJZCwgTnVtYmVyKHNhdmVkRmlsdGVyLmlkKSlcbiAgICAgICAgLnBpcGUobWFwKCgpID0+IHNhdmVkRmlsdGVyKSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQncyByZXBvcnQtd2lkZSBmaWx0ZXIgZ3JvdXBzOiB0aGUgb25lcyBhIHNhdmVkIGZpbHRlciBob2xkcy5cbiAgcHJpdmF0ZSBfc2F2ZWRGaWx0ZXJHcm91cHMoKTogUmVwb3J0RmlsdGVyR3JvdXBbXSB7XG4gICAgcmV0dXJuIHNhdmVkRmlsdGVyR3JvdXBzKHRoaXMucmVwb3J0KCk/LmZpbHRlckdyb3Vwcyk7XG4gIH1cblxuICAvLyBBIHNhdmVkIGZpbHRlciBhcyB0aGUgYmFyJ3MgbWVudSBob2xkcyBpdC4gSXRzIHZhbHVlcyBhcmUga2VwdCB0byB0aGVcbiAgLy8gcmVwb3J0LXdpZGUgZmlsdGVycyB0aGUgcmVwb3J0IGhhcyBub3cgKGEga2V5IGl0IG5vIGxvbmdlciBoYXMsIG9yIGFcbiAgLy8gdmFsdWUgaXRzIGZpbHRlciBjYW4gbm8gbG9uZ2VyIHRha2UsIGlzIGRyb3BwZWQgcmF0aGVyIHRoYW4gYXBwbGllZCksIGFuZFxuICAvLyBlYWNoIHJlYWQgb2YgdGhlbSBoYW5kcyBvdXQgYSBjb3B5LCBzbyBub3RoaW5nIHRoZSBiYXIgZG9lcyB0byB0aGUgdmFsdWVzXG4gIC8vIGl0IHNldCBjaGFuZ2VzIHRoZSBzYXZlZCBmaWx0ZXIuIEEgcmVhZCBhbHNvIG5vdGVzIHRoZSBiYXIncyB2YWx1ZXNcbiAgLy8gKF9rZWVwQmFyT25QaWNrKTogcGlja2luZyBhIHNhdmVkIGZpbHRlciByZWFkcyBpdHMgdmFsdWVzIGFuZCBzZXRzIHRoZVxuICAvLyBiYXIgZnJvbSB0aGVtIGluIG9uZSBnbywgYW5kIHRoZSBpdGVtcyBpdCBkb2VzIG5vdCBob2xkIGFyZSBwdXQgYmFjay5cbiAgcHJpdmF0ZSBfYmFyU2F2ZWRGaWx0ZXIoc2F2ZWRGaWx0ZXI6IFJlcG9ydFNhdmVkRmlsdGVyKTogSUZpbHRlclNhdmVkRmlsdGVyIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gc2F2ZWRGaWx0ZXJWYWx1ZXMoc2F2ZWRGaWx0ZXIuZmlsdGVycywgdGhpcy5fc2F2ZWRGaWx0ZXJHcm91cHMoKSk7XG4gICAgY29uc3Qga2VlcEJhciA9ICgpID0+IHRoaXMuX2tlZXBCYXJPblBpY2soKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogc2F2ZWRGaWx0ZXIuaWQsXG4gICAgICBuYW1lOiBzYXZlZEZpbHRlci5uYW1lLFxuICAgICAgZ2V0IGZpbHRlcnMoKSB7XG4gICAgICAgIGtlZXBCYXIoKTtcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBOb3RlcyB0aGUgYmFyJ3MgdmFsdWVzIGZvciBhIHBpY2sgb2YgYSBzYXZlZCBmaWx0ZXIgKF9iYXJWYWx1ZXNBdFBpY2spLlxuICAvLyBmcy1maWx0ZXIgc2V0cyB0aGUgYmFyIGZyb20gdGhlIHNhdmVkIGZpbHRlcidzIHZhbHVlcyBpbiB0aGUgc2FtZSB0YXNrXG4gIC8vIGFzIGl0IHJlYWRzIHRoZW0sIHNvIHRoZSBub3RlIGlzIGRyb3BwZWQgb25jZSB0aGlzIHRhc2sgaXMgZG9uZTogYW55XG4gIC8vIG90aGVyIHJlYWQgb2YgYSBzYXZlZCBmaWx0ZXIncyB2YWx1ZXMgKGl0cyByb3cgaW4gVmlldyBhbGwsIGEgc2F2ZSkgc2V0c1xuICAvLyBub3RoaW5nLlxuICBwcml2YXRlIF9rZWVwQmFyT25QaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVwb3J0QmFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fYmFyVmFsdWVzQXRQaWNrID0geyAuLi50aGlzLl9yZXBvcnRCYXIudmFsdWVzIH07XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5fYmFyVmFsdWVzQXRQaWNrID0gbnVsbCk7XG4gIH1cblxuICAvLyBUaGUgYmFyJ3MgaXRlbXMsIGVhY2ggb25lIGEgc2F2ZWQgZmlsdGVyIGRvZXMgbm90IGhvbGQgKHRoZSBncm91cC1ieVxuICAvLyBncmFpbiwgdGhlIG1hdGNoLCBhIHBhZ2UncyBvd24gZmlsdGVycykgc2V0IGJhY2sgdG8gaXRzIHZhbHVlIHdoZW4gYSBwaWNrXG4gIC8vIG9mIGEgc2F2ZWQgZmlsdGVyIHNldHMgaXQuIGZzLWZpbHRlciBzZXRzIGV2ZXJ5IGl0ZW0gZnJvbSBhIHNhdmVkIGZpbHRlclxuICAvLyBhbmQgY2FsbHMgZWFjaCBvbmUncyBjaGFuZ2UgYmVmb3JlIGl0IHJlcG9ydHMgdGhlIGJhcidzIGNoYW5nZSwgc28gdGhlXG4gIC8vIGNoYW5nZSB0aGUgYmFyIHJlcG9ydHMgY2FycmllcyB0aGVzZSBpdGVtcyBhcyB0aGV5IHdlcmU6IHRoZSBwaWNrIG1vdmVzXG4gIC8vIHRoZSByZXBvcnQtd2lkZSBmaWx0ZXJzIG9ubHksIG9uIGV2ZXJ5IHBhZ2UsIHRocm91Z2ggdGhlIHNhbWUgY2hhbmdlIGFzXG4gIC8vIGEgdmlld2VyJ3Mgb3duIGVkaXQgKF9iYXJDaGFuZ2VkKS4gT24gYW55IG90aGVyIGNoYW5nZSBhbiBpdGVtJ3MgY2hhbmdlXG4gIC8vIGNvbWVzIGFmdGVyIHRoZSBiYXIncywgd2l0aCBubyBwaWNrIG5vdGVkLCBhbmQgZG9lcyBub3RoaW5nLlxuICBwcml2YXRlIF9rZWVwT25QaWNrKGl0ZW1zOiBJRmlsdGVyQ29uZmlnSXRlbVtdKTogSUZpbHRlckNvbmZpZ0l0ZW1bXSB7XG4gICAgY29uc3QgaGVsZCA9IG5ldyBTZXQodGhpcy5fc2F2ZWRGaWx0ZXJHcm91cHMoKS5tYXAoKGdyb3VwKSA9PiBncm91cEl0ZW1OYW1lKGdyb3VwKSkpO1xuXG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gKGhlbGQuaGFzKGl0ZW0ubmFtZSlcbiAgICAgID8gaXRlbVxuICAgICAgOiB7IC4uLml0ZW0sIGNoYW5nZTogKGJhckl0ZW06IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPikgPT4gdGhpcy5fa2VlcEl0ZW1PblBpY2soYmFySXRlbSkgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfa2VlcEl0ZW1PblBpY2soaXRlbTogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2JhclZhbHVlc0F0UGljaykge1xuICAgICAgaXRlbS5zZXRWYWx1ZSh0aGlzLl9iYXJWYWx1ZXNBdFBpY2tbaXRlbS5uYW1lXSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBiYXIncyB2YWx1ZXMgaW50byB0aGUgc3RhdGU6IGV2ZXJ5IGdyb3VwIGl0IHNob3dzLCB0aGUgZ3JhaW4gYW5kLFxuICAvLyB3aGVuIHRoZSBiYXIgaGFzIHRoZSBjb250cm9sLCB0aGUgbWF0Y2guXG4gIHByaXZhdGUgX2JhckNoYW5nZWQocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBoYXNNYXRjaDogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyBncm91cElkLCB2YWx1ZSB9IG9mIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KHF1ZXJ5LCB0aGlzLl9yZXBvcnRHcm91cHMoKSkpIHtcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFZhbHVlKGdyb3VwSWQsIHZhbHVlKTtcbiAgICB9XG4gICAgLy8gTm90IGEgZmlsdGVyIGdyb3VwIOKAlCB0aGUgZ3JhaW4gaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIHF1ZXJ5LlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEZyZXF1ZW5jeSgocXVlcnlbR1JPVVBfQllfSVRFTV0gYXMgQ2hhcnRHcmFudWxhcml0eSkgfHwgbnVsbCk7XG4gICAgLy8gTm9yIGlzIHRoZSBtYXRjaDsgYSBiYXIgd2l0aG91dCB0aGUgY29udHJvbCBsZWF2ZXMgaXQgYXMgaXQgaXMuXG4gICAgaWYgKGhhc01hdGNoKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRNYXRjaChtYXRjaEZyb21RdWVyeShxdWVyeSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIGFzIGFuIGZzLWZpbHRlciBpdGVtLCBvciBudWxsIHdoZW4gdGhlIHJlcG9ydFxuICAvLyBoYXMgbm9uZSB0byBzaG93LiBTZWVkZWQgZnJvbSB0aGUgc2Vzc2lvbiBzdGF0ZSBzbyB0aGUgZ3JhaW4gdGhlIHZpZXdlclxuICAvLyBwaWNrZWQgc3Vydml2ZXMgdGhlIHJlcG9ydCBiZWluZyByZS1mZXRjaGVkIGFmdGVyIGEgY2hhdCBlZGl0LlxuICBwcml2YXRlIF9ncm91cEJ5SXRlbSgpOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG5cbiAgICByZXR1cm4gcmVwb3J0XG4gICAgICA/IGdyb3VwQnlGaWx0ZXJJdGVtKHJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyBUaGUgYmFyJ3MgTWF0Y2ggY29udHJvbCwgc2VlZGVkIHdpdGggdGhlIG1hdGNoIG9uIHNjcmVlbiwgb3IgbnVsbCB3aGVuXG4gIC8vIHRoZSBiYXIgaG9sZHMgZmV3ZXIgdGhhbiB0d28gZ3JvdXBzIHRoYXQgY29tYmluZS5cbiAgcHJpdmF0ZSBfbWF0Y2hJdGVtKCk6IElGaWx0ZXJDb25maWdJdGVtIHwgbnVsbCB7XG4gICAgcmV0dXJuIG1hdGNoRmlsdGVySXRlbSh0aGlzLnJlcG9ydCgpLCB0aGlzLl9yZXBvcnRHcm91cHMoKSwgdGhpcy5jaGF0UGFnZUlkKCksIHRoaXMuX2ZpbHRlclN0YXRlLm1hdGNoKCkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0IGZzLWNvbHVtblwiPlxuXG4gIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2hlYWRlciBmcy1yb3cuYWxpZ24tY2VudGVyXCI+XG4gICAgPGgyIGNsYXNzPVwiZnMtYWktcmVwb3J0X190aXRsZSBmcy1mbGV4XCI+e3sgcmVwb3J0KCk/Lm5hbWUgfX08L2gyPlxuXG4gICAgQGlmIChyZXBvcnQoKSkge1xuICAgICAgPCEtLSBSZXBvcnQtbGV2ZWwgZmlsdGVycywgaW5saW5lIHdpdGggdGhlIHRvb2xiYXIgYWN0aW9ucywgd2l0aCB0aGVcbiAgICAgICAgICAgcmVwb3J0J3Mgc2F2ZWQgZmlsdGVycyBpbiBmcy1maWx0ZXIncyBvd24gU2F2ZWQgZmlsdGVycyBtZW51LlxuICAgICAgICAgICBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQsIHNvIGl0J3Mga2V5ZWQgb24gdGhlXG4gICAgICAgICAgIGZpbHRlciBzaWduYXR1cmU6IHdoZW4gdGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgc2V0IGNoYW5nZXMgdGhlXG4gICAgICAgICAgIGJsb2NrIGlzIHJlY3JlYXRlZCBhbmQgcmUtcmVhZHMgdGhlIHJlYnVpbHQgY29uZmlnLiAtLT5cbiAgICAgIEBpZiAocmVwb3J0SGFzRmlsdGVycygpKSB7XG4gICAgICAgIEBmb3IgKGtleSBvZiBbcmVwb3J0RmlsdGVyS2V5KCldOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICA8ZnMtZmlsdGVyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X19maWx0ZXJzXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJyZXBvcnRGaWx0ZXJDb25maWcoKVwiPlxuICAgICAgICAgIDwvZnMtZmlsdGVyPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIDwhLS0gV2hhdCBsYXlvdXQgZWRpdGluZyBjYW4gYWRkIG9yIHN3aXRjaCB0bywgYW5kIHRoZSB3YXkgb3V0IG9mIGl0LlxuICAgICAgICAgICBPbmUgc3R5bGUgZm9yIGFsbCB0aHJlZSDigJQgb3V0bGluZWQsIGljb24gYW5kIHRleHQuIFwiSGVhZGVyICYgZm9vdGVyXCJcbiAgICAgICAgICAgaXMgYSB0b2dnbGU6IGl0IGtlZXBzIGl0cyBsYWJlbCBhbmQgdHVybnMgZ3JheSB3aGlsZSBpdCBpcyBvbi4gLS0+XG4gICAgICBAaWYgKGVkaXRNb2RlKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWFpLXJlcG9ydF9fZWRpdC10b29scyBmcy1yb3cuYWxpZ24tY2VudGVyLmdhcC14c1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQWRkIGEgYmxvY2sgb2YgdGV4dFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRUZXh0KClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj50aXRsZTwvbWF0LWljb24+XG4gICAgICAgICAgICBBZGQgdGV4dFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fbWFzdGVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc01hc3Rlck1vZGVcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJpc01hc3Rlck1vZGUgPyAnQmFjayB0byBlZGl0aW5nIHRoaXMgcGFnZScgOiAnRWRpdCB0aGUgaGVhZGVyIGFuZCBmb290ZXIgc2hvd24gb24gZXZlcnkgcGFnZSdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWFzdGVyTW9kZSgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+d2ViX2Fzc2V0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIEhlYWRlciAmIGZvb3RlclxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRWRpdE1vZGUoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNoZWNrPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIERvbmUgZWRpdGluZ1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBPbmUgaWNvbiBmb3IgYm90aCBzdGF0ZXM6IGl0IHJlYWRzIGFzIHByZXNzZWQgd2hpbGUgZWRpdGluZyByYXRoZXJcbiAgICAgICAgICAgdGhhbiBzd2FwcGluZyB0byBzb21ldGhpbmcgZWxzZS4gLS0+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX3RvZ2dsZVwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJlZGl0TW9kZSgpXCJcbiAgICAgICAgICBbbWF0VG9vbHRpcF09XCJlZGl0TW9kZSgpID8gJ0RvbmUgZWRpdGluZycgOiAnRWRpdCBsYXlvdXQnXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRWRpdE1vZGUoKVwiPlxuICAgICAgICA8bWF0LWljb24+ZGFzaGJvYXJkX2N1c3RvbWl6ZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJFeHBvcnRcIlxuICAgICAgICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cImV4cG9ydE1lbnVcIj5cbiAgICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGZzLW1lbnUgI2V4cG9ydE1lbnU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0UG93ZXJwb2ludCgpXCI+XG4gICAgICAgICAgRXhwb3J0IFBvd2VyUG9pbnRcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQZGYoKVwiPlxuICAgICAgICAgIEV4cG9ydCBQREZcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnREYXRhKClcIj5cbiAgICAgICAgICBFeHBvcnQgUmF3IERhdGFcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgQGlmICgocmVwb3J0KCk/LnBhZ2VzPy5sZW5ndGggPz8gMCkgPiAxKSB7XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSh0cnVlKVwiPlxuICAgICAgICAgICAgRXhwb3J0IFJhdyBEYXRhIChUaGlzIFBhZ2UpXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEoZmFsc2UsICd4bHN4JylcIj5cbiAgICAgICAgICBFeHBvcnQgRXhjZWxcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgQGlmICgocmVwb3J0KCk/LnBhZ2VzPy5sZW5ndGggPz8gMCkgPiAxKSB7XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSh0cnVlLCAneGxzeCcpXCI+XG4gICAgICAgICAgICBFeHBvcnQgRXhjZWwgKFRoaXMgUGFnZSlcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0UGFja2FnZSgpXCI+XG4gICAgICAgICAgRXhwb3J0IFJlcG9ydCBQYWNrYWdlXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLW1lbnU+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiUmVwb3J0IHNldHRpbmdzXCJcbiAgICAgICAgICAoY2xpY2spPVwicmVwb3J0U2V0dGluZ3MoKVwiPlxuICAgICAgICA8bWF0LWljb24+c2V0dGluZ3M8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgICAjc3BsaXRcbiAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X19zcGxpdCBmcy1yb3cuYWxpZ24tc3RhcnRcIj5cbiAgICBAaWYgKGNoYXRFbmFibGVkKCkpIHtcbiAgICAgIDxmcy1haS1jaGF0XG4gICAgICAgICAgI2NoYXRQYW5lbFxuICAgICAgICAgIGNsYXNzPVwiY2hhdFwiXG4gICAgICAgICAgW2Jhc2VQYXRoXT1cImNoYXRCYXNlUGF0aCgpXCJcbiAgICAgICAgICBbcmVhZHldPVwiY2hhdFBhZ2VJZCgpICE9PSBudWxsXCJcbiAgICAgICAgICAocmVzcG9uc2UpPVwib25DaGF0UmVzcG9uc2UoJGV2ZW50KVwiPlxuICAgICAgPC9mcy1haS1jaGF0PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJyZXNpemVyXCJcbiAgICAgICAgICAocG9pbnRlcmRvd24pPVwib25SZXNpemVTdGFydCgkZXZlbnQpXCI+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8ZGl2IGNsYXNzPVwidmlld2VyIGZzLWZsZXggZnMtY29sdW1uXCI+XG4gICAgICBAaWYgKHJlcG9ydCgpKSB7XG4gICAgICAgIDxhcHAtcmVwb3J0LWNhbnZhc1xuICAgICAgICAgICAgW3JlcG9ydF09XCJyZXBvcnQoKVwiXG4gICAgICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGUoKVwiXG4gICAgICAgICAgICBbcGFnZUlkXT1cInBhZ2VJZCgpXCJcbiAgICAgICAgICAgIChjb21wb25lbnRTZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncygkZXZlbnQpXCJcbiAgICAgICAgICAgIChyZXBvcnRDaGFuZ2VkKT1cIm9uQ2FudmFzUmVwb3J0Q2hhbmdlZCgpXCJcbiAgICAgICAgICAgIChwYWdlQ2hhbmdlZCk9XCJvbkNhbnZhc1BhZ2VDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgPC9hcHAtcmVwb3J0LWNhbnZhcz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -4,7 +4,7 @@ import * as echarts from 'echarts/core';
4
4
  export { echarts as default };
5
5
  import { LabelLayout } from 'echarts/features';
6
6
  import { CanvasRenderer } from 'echarts/renderers';
7
- import { R as REPORT_CHART_COLORS_CSS, a as REPORT_CHART_FONT_FAMILY, b as REPORT_AXIS_LABEL_FONT_SIZE } from './firestitch-report-firestitch-report-D-WG_G5d.mjs';
7
+ import { R as REPORT_CHART_COLORS_CSS, a as REPORT_CHART_FONT_FAMILY, b as REPORT_AXIS_LABEL_FONT_SIZE } from './firestitch-report-firestitch-report-CkTkXk5B.mjs';
8
8
 
9
9
  // Tree-shaken ECharts build for the reports renderer: only the chart types and
10
10
  // components the option-builder emits are registered, keeping the lazy chunk
@@ -63,4 +63,4 @@ echarts.registerTheme('report', {
63
63
  axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },
64
64
  },
65
65
  });
66
- //# sourceMappingURL=firestitch-report-echarts-qh_mqik9.mjs.map
66
+ //# sourceMappingURL=firestitch-report-echarts-DKuqS_De.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"firestitch-report-echarts-qh_mqik9.mjs","sources":["../../src/app/reports/theme/echarts.ts"],"sourcesContent":["// Tree-shaken ECharts build for the reports renderer: only the chart types and\n// components the option-builder emits are registered, keeping the lazy chunk\n// lean. Loaded on demand by ngx-echarts via provideEchartsCore — see\n// REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.\n//\n// The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for\n// the high-res images the PPT/PDF exports will use.\n\nimport { BarChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n DatasetComponent,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport * as echarts from 'echarts/core';\nimport { LabelLayout } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { REPORT_CHART_COLORS_CSS } from './palette';\nimport { REPORT_AXIS_LABEL_FONT_SIZE, REPORT_CHART_FONT_FAMILY } from './typography';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n DatasetComponent,\n // Reference lines and statistic lines (markLine), reference bands\n // (markArea), and the overlap hiding of 'auto' data labels (LabelLayout).\n MarkLineComponent,\n MarkAreaComponent,\n LabelLayout,\n CanvasRenderer,\n]);\n\n// The house theme — the single place report chart \"standards\" live (palette,\n// typography, tooltip styling). Polished defaults now; refined in the polish\n// phase.\necharts.registerTheme('report', {\n color: REPORT_CHART_COLORS_CSS,\n textStyle: {\n fontFamily: REPORT_CHART_FONT_FAMILY,\n },\n title: {\n textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },\n },\n legend: {\n textStyle: { color: '#52606d', fontSize: 11 },\n },\n tooltip: {\n backgroundColor: 'rgba(31, 41, 51, 0.92)',\n borderWidth: 0,\n textStyle: { color: '#fff', fontSize: 12 },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisTick: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { lineStyle: { color: '#e4e7eb' } },\n },\n timeAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n },\n});\n\nexport default echarts;\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA,OAAO,CAAC,GAAG,CAAC;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;;;IAGhB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,cAAc;AACf,CAAA,CAAC,CAAC;AAEH;AACA;AACA;AACA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC9B,IAAA,KAAK,EAAE,uBAAuB;AAC9B,IAAA,SAAS,EAAE;AACT,QAAA,UAAU,EAAE,wBAAwB;AACrC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;AAC/D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC3C,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC7C,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACtE,QAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;QACtE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC/C,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACvE,KAAA;AACF,CAAA,CAAC"}
1
+ {"version":3,"file":"firestitch-report-echarts-DKuqS_De.mjs","sources":["../../src/app/reports/theme/echarts.ts"],"sourcesContent":["// Tree-shaken ECharts build for the reports renderer: only the chart types and\n// components the option-builder emits are registered, keeping the lazy chunk\n// lean. Loaded on demand by ngx-echarts via provideEchartsCore — see\n// REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.\n//\n// The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for\n// the high-res images the PPT/PDF exports will use.\n\nimport { BarChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n DatasetComponent,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport * as echarts from 'echarts/core';\nimport { LabelLayout } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { REPORT_CHART_COLORS_CSS } from './palette';\nimport { REPORT_AXIS_LABEL_FONT_SIZE, REPORT_CHART_FONT_FAMILY } from './typography';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n DatasetComponent,\n // Reference lines and statistic lines (markLine), reference bands\n // (markArea), and the overlap hiding of 'auto' data labels (LabelLayout).\n MarkLineComponent,\n MarkAreaComponent,\n LabelLayout,\n CanvasRenderer,\n]);\n\n// The house theme — the single place report chart \"standards\" live (palette,\n// typography, tooltip styling). Polished defaults now; refined in the polish\n// phase.\necharts.registerTheme('report', {\n color: REPORT_CHART_COLORS_CSS,\n textStyle: {\n fontFamily: REPORT_CHART_FONT_FAMILY,\n },\n title: {\n textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },\n },\n legend: {\n textStyle: { color: '#52606d', fontSize: 11 },\n },\n tooltip: {\n backgroundColor: 'rgba(31, 41, 51, 0.92)',\n borderWidth: 0,\n textStyle: { color: '#fff', fontSize: 12 },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisTick: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { lineStyle: { color: '#e4e7eb' } },\n },\n timeAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n },\n});\n\nexport default echarts;\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA,OAAO,CAAC,GAAG,CAAC;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;;;IAGhB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,cAAc;AACf,CAAA,CAAC,CAAC;AAEH;AACA;AACA;AACA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC9B,IAAA,KAAK,EAAE,uBAAuB;AAC9B,IAAA,SAAS,EAAE;AACT,QAAA,UAAU,EAAE,wBAAwB;AACrC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;AAC/D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC3C,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC7C,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACtE,QAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;QACtE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC/C,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACvE,KAAA;AACF,CAAA,CAAC"}