@firestitch/report 18.0.28 → 18.0.29

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 (27) hide show
  1. package/app/reports/components/report-canvas/report-canvas.component.d.ts +3 -1
  2. package/app/reports/components/report-component/report-component.component.d.ts +2 -1
  3. package/app/reports/data/report.data.d.ts +1 -1
  4. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +6 -4
  5. package/app/reports/export/report-export-collector.service.d.ts +2 -0
  6. package/app/reports/export/report-export.service.d.ts +15 -0
  7. package/app/reports/interfaces/report.interface.d.ts +4 -0
  8. package/app/reports/views/report/fs-ai-report.component.d.ts +1 -3
  9. package/app/reports/views/report/report.component.d.ts +1 -3
  10. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +17 -3
  11. package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -5
  12. package/esm2022/app/reports/data/report.data.mjs +8 -3
  13. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +10 -11
  14. package/esm2022/app/reports/export/report-export-collector.service.mjs +59 -11
  15. package/esm2022/app/reports/export/report-export.service.mjs +77 -0
  16. package/esm2022/app/reports/export/report-pdf.service.mjs +3 -2
  17. package/esm2022/app/reports/export/report-pptx.service.mjs +3 -2
  18. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  19. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +32 -20
  20. package/esm2022/app/reports/views/report/report.component.mjs +33 -21
  21. package/fesm2022/{firestitch-report-echarts-CTReuXLz.mjs → firestitch-report-echarts-DeE74U3a.mjs} +2 -2
  22. package/fesm2022/{firestitch-report-echarts-CTReuXLz.mjs.map → firestitch-report-echarts-DeE74U3a.mjs.map} +1 -1
  23. package/fesm2022/{firestitch-report-firestitch-report-DdFptz2k.mjs → firestitch-report-firestitch-report-Nxl-C1w0.mjs} +245 -70
  24. package/fesm2022/firestitch-report-firestitch-report-Nxl-C1w0.mjs.map +1 -0
  25. package/fesm2022/firestitch-report.mjs +1 -1
  26. package/package.json +1 -1
  27. package/fesm2022/firestitch-report-firestitch-report-DdFptz2k.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { AfterViewInit, EventEmitter, OnChanges } from '@angular/core';
2
2
  import { FsZoomPanComponent } from '@firestitch/zoom-pan';
3
- import { Report, ReportComponent, ReportFilterGroup, ReportPage } from '../../interfaces/report.interface';
3
+ import { ComponentSettings, Report, ReportComponent, ReportFilterGroup, ReportPage } from '../../interfaces/report.interface';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare const PX_PER_INCH = 96;
6
6
  export interface GuideLine {
@@ -32,6 +32,7 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
32
32
  reportChanged: EventEmitter<void>;
33
33
  editDone: EventEmitter<void>;
34
34
  zoomPan: FsZoomPanComponent;
35
+ private _renderedComponents;
35
36
  private _viewport;
36
37
  private _guides;
37
38
  readonly PX = 96;
@@ -55,6 +56,7 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
55
56
  selectPage(index: number): void;
56
57
  addPage(): void;
57
58
  pageLabel(page: ReportPage, index: number): string;
59
+ applyComponentSettings(componentId: number, settings: ComponentSettings): void;
58
60
  selectComponent(componentId: number | null): void;
59
61
  onCanvasPointerDown(): void;
60
62
  onZoomed(scale: number): void;
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
2
  import { FilterConfig } from '@firestitch/filter';
3
- import { ComponentData, ReportComponent as ReportComponentModel, ReportFilterGroup, ReportLayout } from '../../interfaces/report.interface';
3
+ import { ComponentData, ComponentSettings, ReportComponent as ReportComponentModel, ReportFilterGroup, ReportLayout } from '../../interfaces/report.interface';
4
4
  import { ComponentChartComponent } from '../component-chart/component-chart.component';
5
5
  import { CanvasSnapper } from '../report-canvas/report-canvas.component';
6
6
  import * as i0 from "@angular/core";
@@ -46,6 +46,7 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
46
46
  get bodyPadding(): string;
47
47
  get componentFilterGroups(): ReportFilterGroup[];
48
48
  settings(): void;
49
+ applySettings(settings: ComponentSettings): void;
49
50
  exportCsv(): void;
50
51
  stopCanvasPan(event: Event): void;
51
52
  onComponentPointerDown(event: PointerEvent): void;
@@ -30,7 +30,7 @@ export declare class ReportData<T = any> {
30
30
  flowWidth: number;
31
31
  order: number;
32
32
  }>)[], config?: RequestConfig): Observable<T>;
33
- componentData(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, config?: RequestConfig): Observable<T>;
33
+ componentData(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, isExport?: boolean, config?: RequestConfig): Observable<T>;
34
34
  exportComponent(reportId: number, componentId: number, filters?: ResolvedFilterValue[], state?: ComponentDataState, config?: RequestConfig): Observable<T>;
35
35
  exportReport(reportId: number, filters?: ResolvedFilterValue[], pageId?: number | null, config?: RequestConfig): Observable<T>;
36
36
  filterOptions(reportId: number, filterId: number, config?: RequestConfig): Observable<T>;
@@ -1,7 +1,10 @@
1
- import { OnInit } from '@angular/core';
1
+ import { EventEmitter, OnInit } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
- import { Report, ReportComponent, ReportFilterType } from '../../interfaces/report.interface';
3
+ import { ComponentSettings, Report, ReportComponent, ReportFilterType } from '../../interfaces/report.interface';
4
4
  import * as i0 from "@angular/core";
5
+ export interface ComponentSettingsResult {
6
+ settings: ComponentSettings;
7
+ }
5
8
  interface FilterRow {
6
9
  column: string;
7
10
  type: ReportFilterType;
@@ -10,6 +13,7 @@ interface FilterRow {
10
13
  component: boolean;
11
14
  }
12
15
  export declare class ComponentSettingsComponent implements OnInit {
16
+ readonly filtersChanged: EventEmitter<void>;
13
17
  component: ReportComponent;
14
18
  report: Report;
15
19
  selectedTab: string;
@@ -25,14 +29,12 @@ export declare class ComponentSettingsComponent implements OnInit {
25
29
  private _filters;
26
30
  private _groupsById;
27
31
  private readonly _typeLabels;
28
- private _changed;
29
32
  private readonly _data;
30
33
  private readonly _dialogRef;
31
34
  private readonly _reportData;
32
35
  private readonly _message;
33
36
  private readonly _cdRef;
34
37
  ngOnInit(): void;
35
- get hasChanges(): boolean;
36
38
  typeLabel(type: ReportFilterType): string;
37
39
  save: () => Observable<any>;
38
40
  setExposure(row: FilterRow, target: 'report' | 'component', on: boolean): void;
@@ -14,6 +14,8 @@ export interface CollectedReport {
14
14
  pages: CollectedPage[];
15
15
  filterSummary: string[];
16
16
  }
17
+ export declare function emptyLabel(item: CollectedComponent): string;
18
+ export declare function failedPageNames(collected: CollectedReport): string[];
17
19
  export declare class ReportExportCollectorService {
18
20
  private _reportData;
19
21
  private _filterState;
@@ -0,0 +1,15 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Report } from '../interfaces/report.interface';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ReportExportService {
5
+ private _collector;
6
+ private _pdfService;
7
+ private _pptxService;
8
+ private _prompt;
9
+ pdf(report: Report): Observable<unknown>;
10
+ powerpoint(report: Report): Observable<unknown>;
11
+ private _run;
12
+ private _gate;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportExportService, never>;
14
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReportExportService>;
15
+ }
@@ -55,6 +55,10 @@ export interface ReportComponent {
55
55
  export interface ComponentLayoutConfig {
56
56
  padding?: ComponentPadding;
57
57
  }
58
+ export interface ComponentSettings {
59
+ title: string;
60
+ padding: ComponentPadding;
61
+ }
58
62
  export type LegendPosition = 'top' | 'bottom' | 'left' | 'right' | 'hidden';
59
63
  export type ChartGranularity = 'day' | 'week' | 'month' | 'quarter' | 'year';
60
64
  export declare const GRANULARITY_OPTIONS: {
@@ -15,9 +15,7 @@ export declare class FsAiReportComponent {
15
15
  private _canvas?;
16
16
  private _reportData;
17
17
  private _filterState;
18
- private _exportCollector;
19
- private _pptxService;
20
- private _pdfService;
18
+ private _exportService;
21
19
  private _process;
22
20
  private _dialog;
23
21
  private _destroyRef;
@@ -17,9 +17,7 @@ export declare class ReportComponent {
17
17
  private _reportData;
18
18
  private _reportService;
19
19
  private _filterState;
20
- private _exportCollector;
21
- private _pptxService;
22
- private _pdfService;
20
+ private _exportService;
23
21
  private _process;
24
22
  private _prompt;
25
23
  private _dialog;
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, ElementRef, EventEmitter, Input, Output, ViewChild, inject, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, ElementRef, EventEmitter, Input, Output, QueryList, ViewChild, ViewChildren, inject, } from '@angular/core';
2
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
3
  import { MatButton } from '@angular/material/button';
4
4
  import { MatIcon } from '@angular/material/icon';
@@ -34,6 +34,9 @@ export class ReportCanvasComponent {
34
34
  // editMode flag, so it flips it off (mirrors the menu's "Done editing layout").
35
35
  editDone = new EventEmitter();
36
36
  zoomPan;
37
+ // The rendered components of the active page — only the canvas can reach the
38
+ // one instance a settings save applies to.
39
+ _renderedComponents;
37
40
  _viewport;
38
41
  _guides;
39
42
  PX = PX_PER_INCH;
@@ -104,6 +107,14 @@ export class ReportCanvasComponent {
104
107
  pageLabel(page, index) {
105
108
  return page.name || `Page ${index + 1}`;
106
109
  }
110
+ // Hand presentation settings (title, padding) saved in the settings dialog to
111
+ // the one component they belong to. Nothing here feeds the query, so that
112
+ // component repaints and every other one on the page is left alone.
113
+ applyComponentSettings(componentId, settings) {
114
+ this._renderedComponents
115
+ .find((rendered) => rendered.component.id === componentId)
116
+ ?.applySettings(settings);
117
+ }
107
118
  selectComponent(componentId) {
108
119
  this.selectedComponentId = componentId;
109
120
  this._cdRef.markForCheck();
@@ -313,7 +324,7 @@ export class ReportCanvasComponent {
313
324
  this._guides?.nativeElement?.replaceChildren();
314
325
  }
315
326
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
316
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportCanvasComponent, isStandalone: true, selector: "app-report-canvas", inputs: { report: "report", editMode: "editMode" }, outputs: { componentSettings: "componentSettings", reportChanged: "reportChanged", editDone: "editDone" }, viewQueries: [{ propertyName: "zoomPan", first: true, predicate: FsZoomPanComponent, descendants: true }, { propertyName: "_viewport", first: true, predicate: ["viewport"], descendants: true, static: true }, { propertyName: "_guides", first: true, predicate: ["guides"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage; as page) {\n <div\n class=\"page\"\n [class.flow]=\"isFlow\"\n [class.editing]=\"editMode\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.padding.px]=\"isFlow ? flowPadding * PX : 0\"\n [style.--canvas-zoom]=\"zoom\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n @if (isFlow) {\n @for (component of flowComponents; track component.id) {\n <app-report-component\n class=\"flow-item\"\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'flow'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.width.%]=\"component.flowWidth\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (flowReorder)=\"onFlowReorder($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n } @else {\n @for (component of page.components; track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'freeform'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!page.components.length) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n\n @if (editMode) {\n <button\n mat-flat-button\n type=\"button\"\n color=\"primary\"\n class=\"edit-done\"\n matTooltip=\"Exit layout editing\"\n (click)=\"editDone.emit()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n </div>\n\n <div class=\"canvas-toolbar\">\n <div class=\"page-tabs\">\n @if ((report?.pages?.length ?? 0) > 1) {\n @for (page of report.pages; track page.id; let index = $index) {\n <button\n type=\"button\"\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex\"\n (click)=\"selectPage(index)\">\n {{ pageLabel(page, index) }}\n </button>\n }\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <div class=\"zoom-controls\">\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom out\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom in\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs .page-tab{border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 14px;font-size:12px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab.add-page{display:inline-flex;align-items:center;gap:2px;padding-left:8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .zoom-controls{display:flex;align-items:center;gap:2px;margin-left:auto;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .zoom-controls .zoom-button{display:flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-button:hover{background:#f0f4f8}.canvas-toolbar .zoom-controls .zoom-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .zoom-controls .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-label:hover{color:#1f2933}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.edit-done{position:absolute;top:12px;right:12px;z-index:40;border-radius:999px;box-shadow:0 2px 10px #0f172a2e}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.flow{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:flex-start}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FsZoomPanModule }, { kind: "component", type: i1.FsZoomPanComponent, selector: "fs-zoom-pan", inputs: ["zoomMax", "zoomMin", "zoomScale", "zoomDefault", "zoomFactor", "top", "left"], outputs: ["moved", "zoomed"] }, { kind: "component", type: ReportComponentComponent, selector: "app-report-component", inputs: ["reportId", "component", "groups", "editMode", "layout", "zoom", "snapper", "selected"], outputs: ["selectComponent", "positionChanged", "flowReorder", "openSettings"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
327
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportCanvasComponent, isStandalone: true, selector: "app-report-canvas", inputs: { report: "report", editMode: "editMode" }, outputs: { componentSettings: "componentSettings", reportChanged: "reportChanged", editDone: "editDone" }, viewQueries: [{ propertyName: "zoomPan", first: true, predicate: FsZoomPanComponent, descendants: true }, { propertyName: "_viewport", first: true, predicate: ["viewport"], descendants: true, static: true }, { propertyName: "_guides", first: true, predicate: ["guides"], descendants: true }, { propertyName: "_renderedComponents", predicate: ReportComponentComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage; as page) {\n <div\n class=\"page\"\n [class.flow]=\"isFlow\"\n [class.editing]=\"editMode\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.padding.px]=\"isFlow ? flowPadding * PX : 0\"\n [style.--canvas-zoom]=\"zoom\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n @if (isFlow) {\n @for (component of flowComponents; track component.id) {\n <app-report-component\n class=\"flow-item\"\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'flow'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.width.%]=\"component.flowWidth\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (flowReorder)=\"onFlowReorder($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n } @else {\n @for (component of page.components; track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'freeform'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!page.components.length) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n\n @if (editMode) {\n <button\n mat-flat-button\n type=\"button\"\n color=\"primary\"\n class=\"edit-done\"\n matTooltip=\"Exit layout editing\"\n (click)=\"editDone.emit()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n </div>\n\n <div class=\"canvas-toolbar\">\n <div class=\"page-tabs\">\n @if ((report?.pages?.length ?? 0) > 1) {\n @for (page of report.pages; track page.id; let index = $index) {\n <button\n type=\"button\"\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex\"\n (click)=\"selectPage(index)\">\n {{ pageLabel(page, index) }}\n </button>\n }\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <div class=\"zoom-controls\">\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom out\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom in\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs .page-tab{border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 14px;font-size:12px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab.add-page{display:inline-flex;align-items:center;gap:2px;padding-left:8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .zoom-controls{display:flex;align-items:center;gap:2px;margin-left:auto;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .zoom-controls .zoom-button{display:flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-button:hover{background:#f0f4f8}.canvas-toolbar .zoom-controls .zoom-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .zoom-controls .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-label:hover{color:#1f2933}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.edit-done{position:absolute;top:12px;right:12px;z-index:40;border-radius:999px;box-shadow:0 2px 10px #0f172a2e}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.flow{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:flex-start}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FsZoomPanModule }, { kind: "component", type: i1.FsZoomPanComponent, selector: "fs-zoom-pan", inputs: ["zoomMax", "zoomMin", "zoomScale", "zoomDefault", "zoomFactor", "top", "left"], outputs: ["moved", "zoomed"] }, { kind: "component", type: ReportComponentComponent, selector: "app-report-component", inputs: ["reportId", "component", "groups", "editMode", "layout", "zoom", "snapper", "selected"], outputs: ["selectComponent", "positionChanged", "flowReorder", "openSettings"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
317
328
  }
318
329
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportCanvasComponent, decorators: [{
319
330
  type: Component,
@@ -337,6 +348,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
337
348
  }], zoomPan: [{
338
349
  type: ViewChild,
339
350
  args: [FsZoomPanComponent]
351
+ }], _renderedComponents: [{
352
+ type: ViewChildren,
353
+ args: [ReportComponentComponent]
340
354
  }], _viewport: [{
341
355
  type: ViewChild,
342
356
  args: ['viewport', { static: true }]
@@ -344,4 +358,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
344
358
  type: ViewChild,
345
359
  args: ['guides', { static: false }]
346
360
  }] } });
347
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNhbnZhcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDVSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUNoRixVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sR0FDdEUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7QUFHMUYsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBaUI5Qiw4RUFBOEU7QUFDOUUsbUVBQW1FO0FBQ25FLDJFQUEyRTtBQUMzRSxzREFBc0Q7QUFDdEQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0UsNkVBQTZFO0FBQzdFLDBEQUEwRDtBQWUxRCxNQUFNLE9BQU8scUJBQXFCO0lBRWhCLE1BQU0sQ0FBUztJQUNmLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakMsMkVBQTJFO0lBQzNFLDhDQUE4QztJQUM3QixpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztJQUV6RSwrRUFBK0U7SUFDL0Usb0RBQW9EO0lBQ25DLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRTFELDhFQUE4RTtJQUM5RSxnRkFBZ0Y7SUFDL0QsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFHOUMsT0FBTyxDQUFxQjtJQUczQixTQUFTLENBQTZCO0lBR3RDLE9BQU8sQ0FBNkI7SUFFNUIsRUFBRSxHQUFHLFdBQVcsQ0FBQztJQUNqQixXQUFXLEdBQUcsWUFBWSxDQUFDO0lBRXBDLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNULE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztJQUM5QyxtQkFBbUIsR0FBa0IsSUFBSSxDQUFDO0lBRWpELHNFQUFzRTtJQUN0RCxPQUFPLEdBQWtCO1FBQ3ZDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlELFVBQVUsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO1FBQzFGLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO0tBQ2pDLENBQUM7SUFFTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNuQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBRXhCLFdBQVc7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRWxELHVFQUF1RTtRQUN2RSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksU0FBUyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxxRUFBcUU7SUFDckUsNEVBQTRFO0lBQzVFLElBQVcsYUFBYTtRQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxvQkFBb0IsQ0FBQztRQUVsRixPQUFPLE1BQU0sR0FBRyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU0sZUFBZTtRQUNwQixvRUFBb0U7UUFDcEUsdURBQXVEO1FBQ3ZELFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM1RCxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLDZDQUE2QztJQUM3QyxJQUFXLGNBQWM7UUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBQ2xDLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsbUNBQW1DO0lBQzVCLE9BQU87UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7YUFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMxQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTSxTQUFTLENBQUMsSUFBZ0IsRUFBRSxLQUFhO1FBQzlDLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU0sZUFBZSxDQUFDLFdBQTBCO1FBQy9DLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsK0VBQStFO0lBRXhFLFFBQVEsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxPQUFPO1FBQ1osSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU0sT0FBTztRQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2xCLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxFQUNuRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FDdEUsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsK0VBQStFO0lBRS9FLDhFQUE4RTtJQUN2RSxpQkFBaUIsQ0FBQyxRQUEwRDtRQUNqRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFlLENBQUMsQ0FBQzthQUM5RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzFDLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsc0NBQXNDO0lBQy9CLGFBQWEsQ0FBQyxLQUFnRTtRQUNuRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVoQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2pELFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBRXhCLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDO2FBQ3RELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDMUMsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx1REFBdUQ7SUFDL0MsY0FBYyxDQUFDLE9BQTBCLEVBQUUsT0FBZSxFQUFFLE9BQWU7UUFDakYsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQWMsc0JBQXNCLENBQUMsQ0FDbkYsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUU5RCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzVFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2xELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO21CQUNuQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBRUQsK0VBQStFO0lBRS9FLG1FQUFtRTtJQUNuRSxJQUFZLGNBQWM7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLFNBQVMsQ0FBQyxTQUEwQixFQUFFLENBQVMsRUFBRSxDQUFTO1FBQ2hFLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RCxNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFDO1FBRS9CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQzdCO1lBQ0UsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDdkIsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN2RCxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsRUFBRTtTQUNoRCxFQUNELFFBQVEsQ0FDVCxDQUFDO1FBQ0YsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUM3QjtZQUNFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZCLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkQsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEVBQUU7U0FDaEQsRUFDRCxVQUFVLENBQ1gsQ0FBQztRQUNGLElBQUksUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3RCLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUzQixPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxXQUFXLENBQ2pCLFNBQTBCLEVBQzFCLFFBQXdELEVBQ3hELE1BQWM7UUFFZCxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsTUFBTSxNQUFNLEdBQWdCLEVBQUUsQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFFL0IsMkRBQTJEO1FBQzNELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2pFLElBQUksT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQixNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRCxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dCQUM3QyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNuRSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdEQsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFDN0MsTUFBTSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUzQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLG1CQUFtQjtJQUNYLFdBQVcsQ0FBQyxNQUF1QjtRQUN6QyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RSxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUzRSxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzFELElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQy9CLFNBQVM7WUFDWCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckYsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUVELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxzRUFBc0U7SUFDdEUscUNBQXFDO0lBQzdCLFNBQVMsQ0FDZixLQUEwQyxFQUMxQyxVQUFvQjtRQUVwQixJQUFJLElBQUksR0FBNkQsSUFBSSxDQUFDO1FBRTFFLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUMzRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDdkUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlELENBQUM7SUFFTyxRQUFRLENBQUMsS0FBYSxFQUFFLFVBQW9CO1FBQ2xELElBQUksSUFBSSxHQUFrQixJQUFJLENBQUM7UUFDL0IsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUV2QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQzdDLElBQUksUUFBUSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUM3QixJQUFJLEdBQUcsU0FBUyxDQUFDO2dCQUNqQixZQUFZLEdBQUcsUUFBUSxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDZDQUE2QztJQUNyQyxhQUFhLENBQUMsTUFBbUI7UUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzNDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxlQUFlLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxXQUFXLElBQUksQ0FBQztZQUN4RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLFdBQVcsSUFBSSxDQUFDO1lBQ3ZELENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsQ0FBQztJQUNqRCxDQUFDO3dHQTdYVSxxQkFBcUI7NEZBQXJCLHFCQUFxQixxUkFpQnJCLGtCQUFrQiwrUEM3RS9CLG9wSkFnSkEseW9GRDNGSSxTQUFTLGlMQUNULE9BQU8sMklBQ1AsVUFBVSxnUkFDVixlQUFlLG1PQUNmLHdCQUF3Qjs7NEZBR2YscUJBQXFCO2tCQWRqQyxTQUFTOytCQUNFLG1CQUFtQixtQkFHWix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxTQUFTO3dCQUNULE9BQU87d0JBQ1AsVUFBVTt3QkFDVixlQUFlO3dCQUNmLHdCQUF3QjtxQkFDekI7OEJBSWUsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUlXLGlCQUFpQjtzQkFBakMsTUFBTTtnQkFJVSxhQUFhO3NCQUE3QixNQUFNO2dCQUlVLFFBQVE7c0JBQXhCLE1BQU07Z0JBR0EsT0FBTztzQkFEYixTQUFTO3VCQUFDLGtCQUFrQjtnQkFJckIsU0FBUztzQkFEaEIsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkvQixPQUFPO3NCQURkLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBEZXN0cm95UmVmLFxuICBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgVmlld0NoaWxkLCBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBGc1pvb21QYW5Db21wb25lbnQsIEZzWm9vbVBhbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3pvb20tcGFuJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgUmVwb3J0LCBSZXBvcnRDb21wb25lbnQsIFJlcG9ydEZpbHRlckdyb3VwLCBSZXBvcnRQYWdlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERFRkFVTFRfSEVBRElOR19TSVpFLCBGTE9XX1BBRERJTkcgfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vcmVwb3J0LWNvbXBvbmVudC9yZXBvcnQtY29tcG9uZW50LmNvbXBvbmVudCc7XG5cblxuLy8gU2NyZWVuIGRlbnNpdHkgb2YgdGhlIGNhbnZhczogOTYgQ1NTIHB4IHBlciBpbmNoICh0aGUgQ1NTIHJlZmVyZW5jZSBwaXhlbCksXG4vLyBiZWZvcmUgem9vbS4gQWxsIGdlb21ldHJ5IHN0YXlzIGluIGluY2hlczsgb25seSByZW5kZXJpbmcgbXVsdGlwbGllcyBieSBpdC5cbmV4cG9ydCBjb25zdCBQWF9QRVJfSU5DSCA9IDk2O1xuXG4vLyBPbmUgc21hcnQgZ3VpZGUgbGluZSwgaW4gcGFnZSBpbmNoZXMuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWRlTGluZSB7XG4gIG9yaWVudGF0aW9uOiAndicgfCAnaCc7XG4gIHBvc2l0aW9uOiBudW1iZXI7XG59XG5cbi8vIFRoZSBzbmFwcGluZyBjb250cmFjdCBoYW5kZWQgdG8gZWFjaCBjb21wb25lbnQncyBkcmFnIGxvb3AuIEltcGxlbWVudGVkIGJ5XG4vLyB0aGUgY2FudmFzIGJlY2F1c2Ugb25seSBpdCBzZWVzIGV2ZXJ5IGNvbXBvbmVudCAoYWxpZ25tZW50IGNhbmRpZGF0ZXMpIGFuZFxuLy8gb3ducyB0aGUgZ3VpZGVzIG92ZXJsYXkuXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc1NuYXBwZXIge1xuICBzbmFwTW92ZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIHNuYXBSZXNpemUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGdlb21ldHJ5OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LCBoYW5kbGU6IHN0cmluZyk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH07XG4gIGNsZWFyKCk6IHZvaWQ7XG59XG5cbi8vIFRoZSBmaXhlZC1zaXplIHBhZ2UgY2FudmFzIOKAlCB0aGUgUG93ZXJQb2ludCBtb2RlbC4gUGFnZXMgYXJlIHRhYnMgKG9ubHkgdGhlXG4vLyBBQ1RJVkUgcGFnZSdzIGNvbXBvbmVudHMgZXhpc3Qg4oaSIG9ubHkgdGhleSBmZXRjaCk7IHRoZSBwYWdlIGlzIGFcbi8vIHBhZ2VXaWR0aMOXcGFnZUhlaWdodCBJTkNIRVMgc2hlZXQgcmVuZGVyZWQgYXQgOTZweC9pbiBpbnNpZGUgZnMtem9vbS1wYW5cbi8vICh3aGVlbCB6b29tLCBiYWNrZ3JvdW5kIGRyYWcgcGFuLCB0b29sYmFyIGJ1dHRvbnMpLlxuLy9cbi8vIEZyZWVmb3JtIGxheW91dDogY29tcG9uZW50cyBhcmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkOyBkcmFnZ2luZyBnZXRzIHNtYXJ0XG4vLyBhbGlnbm1lbnQgZ3VpZGVzIChlZGdlcyArIGNlbnRlcnMgb2Ygc2libGluZ3MgYW5kIHRoZSBwYWdlKSB3aXRoIHNuYXBwaW5nLlxuLy8gRmxvdyBsYXlvdXQ6IGNvbXBvbmVudHMgZmxvdyBpbnRvIHJvd3MgKGZsb3dXaWR0aCAlIG9mIHRoZSBjb250ZW50IHdpZHRoKSxcbi8vIGRyYWcgcmVvcmRlcnMsIGVhc3Qvc291dGggaGFuZGxlcyByZXNpemUgd2lkdGglL2hlaWdodC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY2FudmFzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC1jYW52YXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXBvcnQtY2FudmFzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0QnV0dG9uLFxuICAgIE1hdEljb24sXG4gICAgTWF0VG9vbHRpcCxcbiAgICBGc1pvb21QYW5Nb2R1bGUsXG4gICAgUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRDYW52YXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIHB1YmxpYyByZXBvcnQ6IFJlcG9ydDtcbiAgQElucHV0KCkgcHVibGljIGVkaXRNb2RlID0gZmFsc2U7XG5cbiAgLy8gQSBjb21wb25lbnQgYXNrZWQgZm9yIGl0cyBzZXR0aW5ncyBkaWFsb2cg4oCUIHRoZSBwYWdlLWxldmVsIGhvc3Qgb3BlbnMgaXRcbiAgLy8gKGl0IG93bnMgTWF0RGlhbG9nICsgdGhlIHBvc3Qtc2F2ZSByZWxvYWQpLlxuICBAT3V0cHV0KCkgcHVibGljIGNvbXBvbmVudFNldHRpbmdzID0gbmV3IEV2ZW50RW1pdHRlcjxSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIHN0cnVjdHVyZSBjaGFuZ2VkIGhlcmUgKGEgcGFnZSB3YXMgYWRkZWQpIOKAlCB0aGUgaG9zdCByZS1mZXRjaGVzXG4gIC8vIGl0IChpdCBvd25zIHRoZSBhc3NlbWJsZWQgcmVwb3J0ICsgZmlsdGVyIHN0YXRlKS5cbiAgQE91dHB1dCgpIHB1YmxpYyByZXBvcnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIFRoZSB2aWV3ZXIgZGlzbWlzc2VkIGVkaXQgbW9kZSBmcm9tIHRoZSBvbi1jYW52YXMgYmFkZ2Ug4oCUIHRoZSBob3N0IG93bnMgdGhlXG4gIC8vIGVkaXRNb2RlIGZsYWcsIHNvIGl0IGZsaXBzIGl0IG9mZiAobWlycm9ycyB0aGUgbWVudSdzIFwiRG9uZSBlZGl0aW5nIGxheW91dFwiKS5cbiAgQE91dHB1dCgpIHB1YmxpYyBlZGl0RG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKEZzWm9vbVBhbkNvbXBvbmVudClcbiAgcHVibGljIHpvb21QYW46IEZzWm9vbVBhbkNvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKCd2aWV3cG9ydCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgX3ZpZXdwb3J0OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdndWlkZXMnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHJpdmF0ZSBfZ3VpZGVzOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBwdWJsaWMgcmVhZG9ubHkgUFggPSBQWF9QRVJfSU5DSDtcbiAgcHVibGljIHJlYWRvbmx5IGZsb3dQYWRkaW5nID0gRkxPV19QQURESU5HO1xuXG4gIHB1YmxpYyBhY3RpdmVQYWdlSW5kZXggPSAwO1xuICBwdWJsaWMgem9vbSA9IDE7XG4gIHB1YmxpYyBncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG4gIHB1YmxpYyBzZWxlY3RlZENvbXBvbmVudElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBUaGUgc25hcHBlciBoYW5kZWQgdG8gZXZlcnkgY29tcG9uZW50IChzdGFibGUgaWRlbnRpdHkgZm9yIE9uUHVzaCkuXG4gIHB1YmxpYyByZWFkb25seSBzbmFwcGVyOiBDYW52YXNTbmFwcGVyID0ge1xuICAgIHNuYXBNb3ZlOiAoY29tcG9uZW50LCB4LCB5KSA9PiB0aGlzLl9zbmFwTW92ZShjb21wb25lbnQsIHgsIHkpLFxuICAgIHNuYXBSZXNpemU6IChjb21wb25lbnQsIGdlb21ldHJ5LCBoYW5kbGUpID0+IHRoaXMuX3NuYXBSZXNpemUoY29tcG9uZW50LCBnZW9tZXRyeSwgaGFuZGxlKSxcbiAgICBjbGVhcjogKCkgPT4gdGhpcy5fY2xlYXJHdWlkZXMoKSxcbiAgfTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9jZFJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgX2ZpdHRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9wcmV2aW91c1BhZ2VDb3VudCA9IDA7XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZ3JvdXBzID0gbmV3IE1hcCgodGhpcy5yZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSkubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCBncm91cF0pKTtcblxuICAgIGNvbnN0IHBhZ2VDb3VudCA9IHRoaXMucmVwb3J0Py5wYWdlcz8ubGVuZ3RoID8/IDA7XG5cbiAgICAvLyBBIHBhZ2Ugd2FzIGp1c3QgYWRkZWQgKHRoZSBob3N0IHJlLWZldGNoZWQgdGhlIHJlcG9ydCkg4oCUIGxhbmQgb24gaXQuXG4gICAgaWYgKHBhZ2VDb3VudCA+IHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ICYmIHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5hY3RpdmVQYWdlSW5kZXggPSBwYWdlQ291bnQgLSAxO1xuICAgIH1cbiAgICB0aGlzLl9wcmV2aW91c1BhZ2VDb3VudCA9IHBhZ2VDb3VudDtcblxuICAgIGlmICh0aGlzLmFjdGl2ZVBhZ2VJbmRleCA+PSBwYWdlQ291bnQpIHtcbiAgICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4ID0gMDtcbiAgICB9XG4gIH1cblxuICAvLyBSZXBvcnQgaGVhZGluZyBzaXplIGluIHB4IChjb25maWcgaXMgcG9pbnRzOyB0aGUgY2FudmFzIHJlbmRlcnMgYXRcbiAgLy8gOTZweC9pbiwgc28gcG9pbnRzIMOXIDk2LzcyKS4gSW5oZXJpdGVkIGJ5IGNvbXBvbmVudCB0aXRsZXMgdmlhIGEgQ1NTIHZhci5cbiAgcHVibGljIGdldCBoZWFkaW5nU2l6ZVB4KCk6IG51bWJlciB7XG4gICAgY29uc3QgcG9pbnRzID0gdGhpcy5yZXBvcnQ/LmNvbmZpZz8uc3R5bGVzPy5oZWFkaW5nPy5zaXplID8/IERFRkFVTFRfSEVBRElOR19TSVpFO1xuXG4gICAgcmV0dXJuIHBvaW50cyAqIChQWF9QRVJfSU5DSCAvIDcyKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gRml0IHRoZSBwYWdlIHRvIHRoZSB2aWV3cG9ydCBvbmNlIG9uIGZpcnN0IHJlbmRlcjsgYWZ0ZXIgdGhhdCB0aGVcbiAgICAvLyB2aWV3ZXIncyB6b29tIGNob2ljZSBpcyByZXNwZWN0ZWQgYWNyb3NzIHJlLXJlbmRlcnMuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnpvb21GaXQoKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQ/LmxheW91dCA9PT0gJ2Zsb3cnO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVQYWdlKCk6IFJlcG9ydFBhZ2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQ/LnBhZ2VzPy5bdGhpcy5hY3RpdmVQYWdlSW5kZXhdID8/IG51bGw7XG4gIH1cblxuICAvLyBGbG93IHJlbmRlciBvcmRlciAodGhlIGFzc2VtYmxlciBhbHJlYWR5IHNvcnRzLCBidXQgYSBsb2NhbCByZW9yZGVyXG4gIC8vIG1pZC1zZXNzaW9uIG11c3QgaG9sZCB3aXRob3V0IGEgcmUtZmV0Y2gpLlxuICBwdWJsaWMgZ2V0IGZsb3dDb21wb25lbnRzKCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLmFjdGl2ZVBhZ2U/LmNvbXBvbmVudHMgPz8gW10pXS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0UGFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQYWdlSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQgPSBudWxsO1xuICB9XG5cbiAgLy8gQXBwZW5kIGEgYmxhbmsgcGFnZTsgdGhlIGhvc3QgcmUtZmV0Y2hlcyB0aGUgcmVwb3J0IGFuZCBuZ09uQ2hhbmdlcyBsYW5kc1xuICAvLyB0aGUgdmlldyBvbiB0aGUgbmV3IChsYXN0KSBwYWdlLlxuICBwdWJsaWMgYWRkUGFnZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5hZGRQYWdlKHRoaXMucmVwb3J0LmlkKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlcG9ydENoYW5nZWQuZW1pdCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlTGFiZWwocGFnZTogUmVwb3J0UGFnZSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhZ2UubmFtZSB8fCBgUGFnZSAke2luZGV4ICsgMX1gO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdENvbXBvbmVudChjb21wb25lbnRJZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCA9IGNvbXBvbmVudElkO1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG9uQ2FudmFzUG9pbnRlckRvd24oKTogdm9pZCB7XG4gICAgLy8gQmFja2dyb3VuZCBjbGljayAocGFuIHN0YXJ0KSBkZXNlbGVjdHMuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0gem9vbSB0b29sYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHB1YmxpYyBvblpvb21lZChzY2FsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy56b29tID0gc2NhbGU7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgem9vbUluKCk6IHZvaWQge1xuICAgIHRoaXMuem9vbVBhbj8uem9vbUluKCk7XG4gIH1cblxuICBwdWJsaWMgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnpvb21QYW4/Lnpvb21PdXQoKTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tRml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fdmlld3BvcnQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWV3cG9ydCB8fCAhdGhpcy5yZXBvcnQ/LnBhZ2VXaWR0aCB8fCAhdGhpcy56b29tUGFuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZml0ID0gTWF0aC5taW4oXG4gICAgICAodmlld3BvcnQuY2xpZW50V2lkdGggLSAzMikgLyAodGhpcy5yZXBvcnQucGFnZVdpZHRoICogUFhfUEVSX0lOQ0gpLFxuICAgICAgKHZpZXdwb3J0LmNsaWVudEhlaWdodCAtIDMyKSAvICh0aGlzLnJlcG9ydC5wYWdlSGVpZ2h0ICogUFhfUEVSX0lOQ0gpLFxuICAgICk7XG5cbiAgICB0aGlzLnpvb21QYW4uem9vbShNYXRoLm1pbigxLjUsIE1hdGgubWF4KDAuMSwgZml0KSkpO1xuICAgIHRoaXMuem9vbVBhbi5tb3ZlKDE2LCAxNik7XG4gICAgdGhpcy5fZml0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tQWN0dWFsKCk6IHZvaWQge1xuICAgIHRoaXMuem9vbVBhbj8uem9vbSgxKTtcbiAgfVxuXG4gIC8vIC0tLS0tIHBlcnNpc3RlbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBBIGZyZWVmb3JtIGRyYWcvcmVzaXplIG9yIGEgZmxvdyB3aWR0aCByZXNpemUgbGFuZGVkIOKAlCBvbmUgUFVUIHBlciBnZXN0dXJlLlxuICBwdWJsaWMgb25Qb3NpdGlvbkNoYW5nZWQocG9zaXRpb246IHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyR3VpZGVzKCk7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5zYXZlUG9zaXRpb25zKHRoaXMucmVwb3J0LmlkLCBbcG9zaXRpb24gYXMgYW55XSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIEEgZmxvdyBkcmFnIGRyb3BwZWQ6IHJlb3JkZXIgdGhlIHBhZ2UncyBjb21wb25lbnRzIGFyb3VuZCB0aGUgbW92ZWQgb25lXG4gIC8vIGFuZCBwZXJzaXN0IGV2ZXJ5IG9yZGVyIGluIG9uZSBQVVQuXG4gIHB1YmxpYyBvbkZsb3dSZW9yZGVyKGV2ZW50OiB7IGNvbXBvbmVudElkOiBudW1iZXI7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBjb25zdCBwYWdlID0gdGhpcy5hY3RpdmVQYWdlO1xuICAgIGlmICghcGFnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyZWQgPSB0aGlzLmZsb3dDb21wb25lbnRzLmZpbHRlcigoY29tcG9uZW50KSA9PiBjb21wb25lbnQuaWQgIT09IGV2ZW50LmNvbXBvbmVudElkKTtcbiAgICBjb25zdCBtb3ZlZCA9IHBhZ2UuY29tcG9uZW50cy5maW5kKChjb21wb25lbnQpID0+IGNvbXBvbmVudC5pZCA9PT0gZXZlbnQuY29tcG9uZW50SWQpO1xuICAgIGlmICghbW92ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2Zsb3dEcm9wSW5kZXgob3JkZXJlZCwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgb3JkZXJlZC5zcGxpY2UoaW5kZXgsIDAsIG1vdmVkKTtcblxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG9yZGVyZWQubWFwKChjb21wb25lbnQsIG9yZGVyKSA9PiB7XG4gICAgICBjb21wb25lbnQub3JkZXIgPSBvcmRlcjtcblxuICAgICAgcmV0dXJuIHsgY29tcG9uZW50SWQ6IGNvbXBvbmVudC5pZCwgb3JkZXIgfTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuX3JlcG9ydERhdGEuc2F2ZVBvc2l0aW9ucyh0aGlzLnJlcG9ydC5pZCwgcG9zaXRpb25zKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gV2hlcmUgdGhlIHBvaW50ZXIgbGFuZGVkIGFtb25nIHRoZSBmbG93ZWQgY29tcG9uZW50czogYmVmb3JlIHRoZSBmaXJzdFxuICAvLyBjb21wb25lbnQgd2hvc2UgY2VudGVyIHRoZSBwb2ludGVyIGlzIGFib3ZlL2xlZnQgb2YuXG4gIHByaXZhdGUgX2Zsb3dEcm9wSW5kZXgob3JkZXJlZDogUmVwb3J0Q29tcG9uZW50W10sIGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBob3N0cyA9IEFycmF5LmZyb20oXG4gICAgICB0aGlzLl92aWV3cG9ydC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdhcHAtcmVwb3J0LWNvbXBvbmVudCcpLFxuICAgICkuZmlsdGVyKChob3N0KSA9PiAhaG9zdC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zsb3ctZHJhZ2dpbmcnKSk7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaG9zdHMubGVuZ3RoICYmIGluZGV4IDwgb3JkZXJlZC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHJlY3QgPSBob3N0c1tpbmRleF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoY2xpZW50WSA8IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyXG4gICAgICAgIHx8IChjbGllbnRZIDwgcmVjdC5ib3R0b20gJiYgY2xpZW50WCA8IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyKSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyZWQubGVuZ3RoO1xuICB9XG5cbiAgLy8gLS0tLS0gc21hcnQgZ3VpZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFBpeGVsIGZlZWwgb2YgdGhlIHNuYXAsIGNvbnZlcnRlZCB0byBpbmNoZXMgYXQgdGhlIGN1cnJlbnQgem9vbS5cbiAgcHJpdmF0ZSBnZXQgX3NuYXBUaHJlc2hvbGQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gOCAvIChQWF9QRVJfSU5DSCAqIE1hdGgubWF4KDAuMSwgdGhpcy56b29tKSk7XG4gIH1cblxuICBwcml2YXRlIF9zbmFwTW92ZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHsgdmVydGljYWwsIGhvcml6b250YWwgfSA9IHRoaXMuX2NhbmRpZGF0ZXMoY29tcG9uZW50KTtcbiAgICBjb25zdCBndWlkZXM6IEd1aWRlTGluZVtdID0gW107XG5cbiAgICBjb25zdCBzbmFwcGVkWCA9IHRoaXMuX3NuYXBBeGlzKFxuICAgICAgW1xuICAgICAgICB7IG9mZnNldDogMCwgdmFsdWU6IHggfSxcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC53IC8gMiwgdmFsdWU6IHggKyBjb21wb25lbnQudyAvIDIgfSxcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC53LCB2YWx1ZTogeCArIGNvbXBvbmVudC53IH0sXG4gICAgICBdLFxuICAgICAgdmVydGljYWwsXG4gICAgKTtcbiAgICBpZiAoc25hcHBlZFggIT09IG51bGwpIHtcbiAgICAgIHggPSBzbmFwcGVkWC5iYXNlO1xuICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ3YnLCBwb3NpdGlvbjogc25hcHBlZFguZ3VpZGUgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc25hcHBlZFkgPSB0aGlzLl9zbmFwQXhpcyhcbiAgICAgIFtcbiAgICAgICAgeyBvZmZzZXQ6IDAsIHZhbHVlOiB5IH0sXG4gICAgICAgIHsgb2Zmc2V0OiBjb21wb25lbnQuaCAvIDIsIHZhbHVlOiB5ICsgY29tcG9uZW50LmggLyAyIH0sXG4gICAgICAgIHsgb2Zmc2V0OiBjb21wb25lbnQuaCwgdmFsdWU6IHkgKyBjb21wb25lbnQuaCB9LFxuICAgICAgXSxcbiAgICAgIGhvcml6b250YWwsXG4gICAgKTtcbiAgICBpZiAoc25hcHBlZFkgIT09IG51bGwpIHtcbiAgICAgIHkgPSBzbmFwcGVkWS5iYXNlO1xuICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ2gnLCBwb3NpdGlvbjogc25hcHBlZFkuZ3VpZGUgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVuZGVyR3VpZGVzKGd1aWRlcyk7XG5cbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cblxuICBwcml2YXRlIF9zbmFwUmVzaXplKFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGdlb21ldHJ5OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LFxuICAgIGhhbmRsZTogc3RyaW5nLFxuICApOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9IHtcbiAgICBjb25zdCB7IHZlcnRpY2FsLCBob3Jpem9udGFsIH0gPSB0aGlzLl9jYW5kaWRhdGVzKGNvbXBvbmVudCk7XG4gICAgY29uc3QgZ3VpZGVzOiBHdWlkZUxpbmVbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4uZ2VvbWV0cnkgfTtcblxuICAgIC8vIE9ubHkgdGhlIGVkZ2VzIHRoZSBoYW5kbGUgbW92ZXMgcGFydGljaXBhdGUgaW4gc25hcHBpbmcuXG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygnZScpKSB7XG4gICAgICBjb25zdCBzbmFwcGVkID0gdGhpcy5fbmVhcmVzdChnZW9tZXRyeS54ICsgZ2VvbWV0cnkudywgdmVydGljYWwpO1xuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LncgPSBzbmFwcGVkIC0gZ2VvbWV0cnkueDtcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ3YnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygndycpKSB7XG4gICAgICBjb25zdCBzbmFwcGVkID0gdGhpcy5fbmVhcmVzdChnZW9tZXRyeS54LCB2ZXJ0aWNhbCk7XG4gICAgICBpZiAoc25hcHBlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQudyA9IGdlb21ldHJ5LnggKyBnZW9tZXRyeS53IC0gc25hcHBlZDtcbiAgICAgICAgcmVzdWx0LnggPSBzbmFwcGVkO1xuICAgICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAndicsIHBvc2l0aW9uOiBzbmFwcGVkIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCdzJykpIHtcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LnkgKyBnZW9tZXRyeS5oLCBob3Jpem9udGFsKTtcbiAgICAgIGlmIChzbmFwcGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5oID0gc25hcHBlZCAtIGdlb21ldHJ5Lnk7XG4gICAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICdoJywgcG9zaXRpb246IHNuYXBwZWQgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ24nKSkge1xuICAgICAgY29uc3Qgc25hcHBlZCA9IHRoaXMuX25lYXJlc3QoZ2VvbWV0cnkueSwgaG9yaXpvbnRhbCk7XG4gICAgICBpZiAoc25hcHBlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQuaCA9IGdlb21ldHJ5LnkgKyBnZW9tZXRyeS5oIC0gc25hcHBlZDtcbiAgICAgICAgcmVzdWx0LnkgPSBzbmFwcGVkO1xuICAgICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAnaCcsIHBvc2l0aW9uOiBzbmFwcGVkIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlckd1aWRlcyhndWlkZXMpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIEFsaWdubWVudCBjYW5kaWRhdGVzOiB0aGUgcGFnZSdzIGVkZ2VzICsgY2VudGVyLCBhbmQgZXZlcnkgc2libGluZydzXG4gIC8vIGVkZ2VzICsgY2VudGVycy5cbiAgcHJpdmF0ZSBfY2FuZGlkYXRlcyhtb3Zpbmc6IFJlcG9ydENvbXBvbmVudCk6IHsgdmVydGljYWw6IG51bWJlcltdOyBob3Jpem9udGFsOiBudW1iZXJbXSB9IHtcbiAgICBjb25zdCB2ZXJ0aWNhbCA9IFswLCB0aGlzLnJlcG9ydC5wYWdlV2lkdGggLyAyLCB0aGlzLnJlcG9ydC5wYWdlV2lkdGhdO1xuICAgIGNvbnN0IGhvcml6b250YWwgPSBbMCwgdGhpcy5yZXBvcnQucGFnZUhlaWdodCAvIDIsIHRoaXMucmVwb3J0LnBhZ2VIZWlnaHRdO1xuXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5hY3RpdmVQYWdlPy5jb21wb25lbnRzID8/IFtdKSB7XG4gICAgICBpZiAoY29tcG9uZW50LmlkID09PSBtb3ZpbmcuaWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZlcnRpY2FsLnB1c2goY29tcG9uZW50LngsIGNvbXBvbmVudC54ICsgY29tcG9uZW50LncgLyAyLCBjb21wb25lbnQueCArIGNvbXBvbmVudC53KTtcbiAgICAgIGhvcml6b250YWwucHVzaChjb21wb25lbnQueSwgY29tcG9uZW50LnkgKyBjb21wb25lbnQuaCAvIDIsIGNvbXBvbmVudC55ICsgY29tcG9uZW50LmgpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHZlcnRpY2FsLCBob3Jpem9udGFsIH07XG4gIH1cblxuICAvLyBTbmFwIG9uZSBheGlzOiBvZiB0aGUgbW92aW5nIGJveCdzIHRocmVlIGxpbmVzIChlZGdlL2NlbnRlci9lZGdlKSwgZmluZFxuICAvLyB0aGUgY2xvc2VzdCBjYW5kaWRhdGUgd2l0aGluIHRocmVzaG9sZCBhbmQgcmV0dXJuIHRoZSBhZGp1c3RlZCBiYXNlXG4gIC8vIGNvb3JkaW5hdGUgcGx1cyB0aGUgZ3VpZGUgdG8gZHJhdy5cbiAgcHJpdmF0ZSBfc25hcEF4aXMoXG4gICAgbGluZXM6IHsgb2Zmc2V0OiBudW1iZXI7IHZhbHVlOiBudW1iZXIgfVtdLFxuICAgIGNhbmRpZGF0ZXM6IG51bWJlcltdLFxuICApOiB7IGJhc2U6IG51bWJlcjsgZ3VpZGU6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgbGV0IGJlc3Q6IHsgYmFzZTogbnVtYmVyOyBndWlkZTogbnVtYmVyOyBkaXN0YW5jZTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGNhbmRpZGF0ZSAtIGxpbmUudmFsdWUpO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPD0gdGhpcy5fc25hcFRocmVzaG9sZCAmJiAoIWJlc3QgfHwgZGlzdGFuY2UgPCBiZXN0LmRpc3RhbmNlKSkge1xuICAgICAgICAgIGJlc3QgPSB7IGJhc2U6IGNhbmRpZGF0ZSAtIGxpbmUub2Zmc2V0LCBndWlkZTogY2FuZGlkYXRlLCBkaXN0YW5jZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3QgPyB7IGJhc2U6IGJlc3QuYmFzZSwgZ3VpZGU6IGJlc3QuZ3VpZGUgfSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9uZWFyZXN0KHZhbHVlOiBudW1iZXIsIGNhbmRpZGF0ZXM6IG51bWJlcltdKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgbGV0IGJlc3Q6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBiZXN0RGlzdGFuY2UgPSB0aGlzLl9zbmFwVGhyZXNob2xkO1xuXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyhjYW5kaWRhdGUgLSB2YWx1ZSk7XG4gICAgICBpZiAoZGlzdGFuY2UgPD0gYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7XG4gICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiZXN0O1xuICB9XG5cbiAgLy8gVGhlIGd1aWRlcyBvdmVybGF5IGlzIGRyYXduIGltcGVyYXRpdmVseSDigJQgdGhlIGRyYWcgbG9vcCBydW5zIG91dHNpZGVcbiAgLy8gQW5ndWxhciBhbmQgcmVwYWludHMgb24gZXZlcnkgcG9pbnRlcm1vdmUuXG4gIHByaXZhdGUgX3JlbmRlckd1aWRlcyhndWlkZXM6IEd1aWRlTGluZVtdKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuX2d1aWRlcz8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBob3N0LnJlcGxhY2VDaGlsZHJlbiguLi5ndWlkZXMubWFwKChndWlkZSkgPT4ge1xuICAgICAgY29uc3QgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbGluZS5jbGFzc05hbWUgPSBgZ3VpZGUgZ3VpZGUtJHtndWlkZS5vcmllbnRhdGlvbn1gO1xuICAgICAgaWYgKGd1aWRlLm9yaWVudGF0aW9uID09PSAndicpIHtcbiAgICAgICAgbGluZS5zdHlsZS5sZWZ0ID0gYCR7Z3VpZGUucG9zaXRpb24gKiBQWF9QRVJfSU5DSH1weGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lLnN0eWxlLnRvcCA9IGAke2d1aWRlLnBvc2l0aW9uICogUFhfUEVSX0lOQ0h9cHhgO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhckd1aWRlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9ndWlkZXM/Lm5hdGl2ZUVsZW1lbnQ/LnJlcGxhY2VDaGlsZHJlbigpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzXCI+XG4gIDxkaXZcbiAgICAjdmlld3BvcnRcbiAgICBjbGFzcz1cInBhZ2Utdmlld3BvcnRcIlxuICAgIChwb2ludGVyZG93bik9XCJvbkNhbnZhc1BvaW50ZXJEb3duKClcIj5cbiAgICA8ZnMtem9vbS1wYW5cbiAgICAgIFt6b29tTWluXT1cIjAuMVwiXG4gICAgICBbem9vbU1heF09XCIzXCJcbiAgICAgICh6b29tZWQpPVwib25ab29tZWQoJGV2ZW50KVwiPlxuICAgICAgQGlmIChhY3RpdmVQYWdlOyBhcyBwYWdlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInBhZ2VcIlxuICAgICAgICAgIFtjbGFzcy5mbG93XT1cImlzRmxvd1wiXG4gICAgICAgICAgW2NsYXNzLmVkaXRpbmddPVwiZWRpdE1vZGVcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJyZXBvcnQucGFnZVdpZHRoICogUFhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicmVwb3J0LnBhZ2VIZWlnaHQgKiBQWFwiXG4gICAgICAgICAgW3N0eWxlLnBhZGRpbmcucHhdPVwiaXNGbG93ID8gZmxvd1BhZGRpbmcgKiBQWCA6IDBcIlxuICAgICAgICAgIFtzdHlsZS4tLWNhbnZhcy16b29tXT1cInpvb21cIlxuICAgICAgICAgIFtzdHlsZS4tLXJlcG9ydC1oZWFkaW5nLXNpemUucHhdPVwiaGVhZGluZ1NpemVQeFwiPlxuICAgICAgICAgIEBpZiAoaXNGbG93KSB7XG4gICAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2YgZmxvd0NvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xuICAgICAgICAgICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsb3ctaXRlbVwiXG4gICAgICAgICAgICAgICAgW3JlcG9ydElkXT1cInJlcG9ydC5pZFwiXG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxuICAgICAgICAgICAgICAgIFtncm91cHNdPVwiZ3JvdXBzXCJcbiAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGVcIlxuICAgICAgICAgICAgICAgIFtsYXlvdXRdPVwiJ2Zsb3cnXCJcbiAgICAgICAgICAgICAgICBbem9vbV09XCJ6b29tXCJcbiAgICAgICAgICAgICAgICBbc25hcHBlcl09XCJzbmFwcGVyXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcG9uZW50LmlkID09PSBzZWxlY3RlZENvbXBvbmVudElkXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJjb21wb25lbnQuZmxvd1dpZHRoXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5hdXRvSGVpZ2h0ID8gbnVsbCA6IGNvbXBvbmVudC5oICogUFhcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RDb21wb25lbnQpPVwic2VsZWN0Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZsb3dSZW9yZGVyKT1cIm9uRmxvd1Jlb3JkZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9wZW5TZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncy5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBwYWdlLmNvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xuICAgICAgICAgICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnRcbiAgICAgICAgICAgICAgICBbcmVwb3J0SWRdPVwicmVwb3J0LmlkXCJcbiAgICAgICAgICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cHNcIlxuICAgICAgICAgICAgICAgIFtlZGl0TW9kZV09XCJlZGl0TW9kZVwiXG4gICAgICAgICAgICAgICAgW2xheW91dF09XCInZnJlZWZvcm0nXCJcbiAgICAgICAgICAgICAgICBbem9vbV09XCJ6b29tXCJcbiAgICAgICAgICAgICAgICBbc25hcHBlcl09XCJzbmFwcGVyXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcG9uZW50LmlkID09PSBzZWxlY3RlZENvbXBvbmVudElkXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJjb21wb25lbnQueCAqIFBYXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cImNvbXBvbmVudC55ICogUFhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb21wb25lbnQudyAqIFBYXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5hdXRvSGVpZ2h0ID8gbnVsbCA6IGNvbXBvbmVudC5oICogUFhcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RDb21wb25lbnQpPVwic2VsZWN0Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9wZW5TZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncy5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZ3VpZGVzXG4gICAgICAgICAgICBjbGFzcz1cImd1aWRlc1wiPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgQGlmICghcGFnZS5jb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZ2UtZW1wdHlcIj5cbiAgICAgICAgICAgICAgQXNrIHRoZSBhc3Npc3RhbnQgdG8gYWRkIGEgY2hhcnQsIGxpc3Qgb3IgS1BJIHRvIHRoaXMgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9mcy16b29tLXBhbj5cblxuICAgIEBpZiAoZWRpdE1vZGUpIHtcbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBjbGFzcz1cImVkaXQtZG9uZVwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJFeGl0IGxheW91dCBlZGl0aW5nXCJcbiAgICAgICAgKGNsaWNrKT1cImVkaXREb25lLmVtaXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICBEb25lIGVkaXRpbmdcbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNhbnZhcy10b29sYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cInBhZ2UtdGFic1wiPlxuICAgICAgQGlmICgocmVwb3J0Py5wYWdlcz8ubGVuZ3RoID8/IDApID4gMSkge1xuICAgICAgICBAZm9yIChwYWdlIG9mIHJlcG9ydC5wYWdlczsgdHJhY2sgcGFnZS5pZDsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2UtdGFiXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaW5kZXggPT09IGFjdGl2ZVBhZ2VJbmRleFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGFnZShpbmRleClcIj5cbiAgICAgICAgICAgIHt7IHBhZ2VMYWJlbChwYWdlLCBpbmRleCkgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJwYWdlLXRhYiBhZGQtcGFnZVwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgcGFnZVwiXG4gICAgICAgIChjbGljayk9XCJhZGRQYWdlKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgIFBhZ2VcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInpvb20tY29udHJvbHNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiem9vbS1idXR0b25cIlxuICAgICAgICBtYXRUb29sdGlwPVwiWm9vbSBvdXRcIlxuICAgICAgICAoY2xpY2spPVwiem9vbU91dCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5yZW1vdmU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInpvb20tbGFiZWxcIlxuICAgICAgICBtYXRUb29sdGlwPVwiWm9vbSB0byAxMDAlXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21BY3R1YWwoKVwiPlxuICAgICAgICB7eyAoem9vbSAqIDEwMCkudG9GaXhlZCgwKSB9fSVcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJ6b29tLWJ1dHRvblwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJab29tIGluXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21JbigpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkZpdCBwYWdlXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21GaXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+Zml0X3NjcmVlbjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNhbnZhcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDVSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUNoRixVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUMvRixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSXBELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7OztBQUcxRiw4RUFBOEU7QUFDOUUsOEVBQThFO0FBQzlFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFpQjlCLDhFQUE4RTtBQUM5RSxtRUFBbUU7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OzRGQUFyQixxQkFBcUIscVJBaUJyQixrQkFBa0IsbVFBS2Ysd0JBQXdCLHFFQ3BGeEMsb3BKQWdKQSx5b0ZEekZJLFNBQVMsaUxBQ1QsT0FBTywySUFDUCxVQUFVLGdSQUNWLGVBQWUsbU9BQ2Ysd0JBQXdCOzs0RkFHZixxQkFBcUI7a0JBZGpDLFNBQVM7K0JBQ0UsbUJBQW1CLG1CQUdaLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLGVBQWU7d0JBQ2Ysd0JBQXdCO3FCQUN6Qjs4QkFJZSxNQUFNO3NCQUFyQixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBSVcsaUJBQWlCO3NCQUFqQyxNQUFNO2dCQUlVLGFBQWE7c0JBQTdCLE1BQU07Z0JBSVUsUUFBUTtzQkFBeEIsTUFBTTtnQkFHQSxPQUFPO3NCQURiLFNBQVM7dUJBQUMsa0JBQWtCO2dCQU1yQixtQkFBbUI7c0JBRDFCLFlBQVk7dUJBQUMsd0JBQXdCO2dCQUk5QixTQUFTO3NCQURoQixTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSS9CLE9BQU87c0JBRGQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIERlc3Ryb3lSZWYsXG4gIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBGc1pvb21QYW5Db21wb25lbnQsIEZzWm9vbVBhbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3pvb20tcGFuJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50U2V0dGluZ3MsIFJlcG9ydCwgUmVwb3J0Q29tcG9uZW50LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0UGFnZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERFRkFVTFRfSEVBRElOR19TSVpFLCBGTE9XX1BBRERJTkcgfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vcmVwb3J0LWNvbXBvbmVudC9yZXBvcnQtY29tcG9uZW50LmNvbXBvbmVudCc7XG5cblxuLy8gU2NyZWVuIGRlbnNpdHkgb2YgdGhlIGNhbnZhczogOTYgQ1NTIHB4IHBlciBpbmNoICh0aGUgQ1NTIHJlZmVyZW5jZSBwaXhlbCksXG4vLyBiZWZvcmUgem9vbS4gQWxsIGdlb21ldHJ5IHN0YXlzIGluIGluY2hlczsgb25seSByZW5kZXJpbmcgbXVsdGlwbGllcyBieSBpdC5cbmV4cG9ydCBjb25zdCBQWF9QRVJfSU5DSCA9IDk2O1xuXG4vLyBPbmUgc21hcnQgZ3VpZGUgbGluZSwgaW4gcGFnZSBpbmNoZXMuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWRlTGluZSB7XG4gIG9yaWVudGF0aW9uOiAndicgfCAnaCc7XG4gIHBvc2l0aW9uOiBudW1iZXI7XG59XG5cbi8vIFRoZSBzbmFwcGluZyBjb250cmFjdCBoYW5kZWQgdG8gZWFjaCBjb21wb25lbnQncyBkcmFnIGxvb3AuIEltcGxlbWVudGVkIGJ5XG4vLyB0aGUgY2FudmFzIGJlY2F1c2Ugb25seSBpdCBzZWVzIGV2ZXJ5IGNvbXBvbmVudCAoYWxpZ25tZW50IGNhbmRpZGF0ZXMpIGFuZFxuLy8gb3ducyB0aGUgZ3VpZGVzIG92ZXJsYXkuXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc1NuYXBwZXIge1xuICBzbmFwTW92ZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIHNuYXBSZXNpemUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGdlb21ldHJ5OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LCBoYW5kbGU6IHN0cmluZyk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH07XG4gIGNsZWFyKCk6IHZvaWQ7XG59XG5cbi8vIFRoZSBmaXhlZC1zaXplIHBhZ2UgY2FudmFzIOKAlCB0aGUgUG93ZXJQb2ludCBtb2RlbC4gUGFnZXMgYXJlIHRhYnMgKG9ubHkgdGhlXG4vLyBBQ1RJVkUgcGFnZSdzIGNvbXBvbmVudHMgZXhpc3Qg4oaSIG9ubHkgdGhleSBmZXRjaCk7IHRoZSBwYWdlIGlzIGFcbi8vIHBhZ2VXaWR0aMOXcGFnZUhlaWdodCBJTkNIRVMgc2hlZXQgcmVuZGVyZWQgYXQgOTZweC9pbiBpbnNpZGUgZnMtem9vbS1wYW5cbi8vICh3aGVlbCB6b29tLCBiYWNrZ3JvdW5kIGRyYWcgcGFuLCB0b29sYmFyIGJ1dHRvbnMpLlxuLy9cbi8vIEZyZWVmb3JtIGxheW91dDogY29tcG9uZW50cyBhcmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkOyBkcmFnZ2luZyBnZXRzIHNtYXJ0XG4vLyBhbGlnbm1lbnQgZ3VpZGVzIChlZGdlcyArIGNlbnRlcnMgb2Ygc2libGluZ3MgYW5kIHRoZSBwYWdlKSB3aXRoIHNuYXBwaW5nLlxuLy8gRmxvdyBsYXlvdXQ6IGNvbXBvbmVudHMgZmxvdyBpbnRvIHJvd3MgKGZsb3dXaWR0aCAlIG9mIHRoZSBjb250ZW50IHdpZHRoKSxcbi8vIGRyYWcgcmVvcmRlcnMsIGVhc3Qvc291dGggaGFuZGxlcyByZXNpemUgd2lkdGglL2hlaWdodC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY2FudmFzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC1jYW52YXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXBvcnQtY2FudmFzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0QnV0dG9uLFxuICAgIE1hdEljb24sXG4gICAgTWF0VG9vbHRpcCxcbiAgICBGc1pvb21QYW5Nb2R1bGUsXG4gICAgUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRDYW52YXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIHB1YmxpYyByZXBvcnQ6IFJlcG9ydDtcbiAgQElucHV0KCkgcHVibGljIGVkaXRNb2RlID0gZmFsc2U7XG5cbiAgLy8gQSBjb21wb25lbnQgYXNrZWQgZm9yIGl0cyBzZXR0aW5ncyBkaWFsb2cg4oCUIHRoZSBwYWdlLWxldmVsIGhvc3Qgb3BlbnMgaXRcbiAgLy8gKGl0IG93bnMgTWF0RGlhbG9nICsgdGhlIHBvc3Qtc2F2ZSByZWxvYWQpLlxuICBAT3V0cHV0KCkgcHVibGljIGNvbXBvbmVudFNldHRpbmdzID0gbmV3IEV2ZW50RW1pdHRlcjxSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIHN0cnVjdHVyZSBjaGFuZ2VkIGhlcmUgKGEgcGFnZSB3YXMgYWRkZWQpIOKAlCB0aGUgaG9zdCByZS1mZXRjaGVzXG4gIC8vIGl0IChpdCBvd25zIHRoZSBhc3NlbWJsZWQgcmVwb3J0ICsgZmlsdGVyIHN0YXRlKS5cbiAgQE91dHB1dCgpIHB1YmxpYyByZXBvcnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIFRoZSB2aWV3ZXIgZGlzbWlzc2VkIGVkaXQgbW9kZSBmcm9tIHRoZSBvbi1jYW52YXMgYmFkZ2Ug4oCUIHRoZSBob3N0IG93bnMgdGhlXG4gIC8vIGVkaXRNb2RlIGZsYWcsIHNvIGl0IGZsaXBzIGl0IG9mZiAobWlycm9ycyB0aGUgbWVudSdzIFwiRG9uZSBlZGl0aW5nIGxheW91dFwiKS5cbiAgQE91dHB1dCgpIHB1YmxpYyBlZGl0RG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKEZzWm9vbVBhbkNvbXBvbmVudClcbiAgcHVibGljIHpvb21QYW46IEZzWm9vbVBhbkNvbXBvbmVudDtcblxuICAvLyBUaGUgcmVuZGVyZWQgY29tcG9uZW50cyBvZiB0aGUgYWN0aXZlIHBhZ2Ug4oCUIG9ubHkgdGhlIGNhbnZhcyBjYW4gcmVhY2ggdGhlXG4gIC8vIG9uZSBpbnN0YW5jZSBhIHNldHRpbmdzIHNhdmUgYXBwbGllcyB0by5cbiAgQFZpZXdDaGlsZHJlbihSZXBvcnRDb21wb25lbnRDb21wb25lbnQpXG4gIHByaXZhdGUgX3JlbmRlcmVkQ29tcG9uZW50czogUXVlcnlMaXN0PFJlcG9ydENvbXBvbmVudENvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZCgndmlld3BvcnQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIF92aWV3cG9ydDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnZ3VpZGVzJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgX2d1aWRlczogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgcHVibGljIHJlYWRvbmx5IFBYID0gUFhfUEVSX0lOQ0g7XG4gIHB1YmxpYyByZWFkb25seSBmbG93UGFkZGluZyA9IEZMT1dfUEFERElORztcblxuICBwdWJsaWMgYWN0aXZlUGFnZUluZGV4ID0gMDtcbiAgcHVibGljIHpvb20gPSAxO1xuICBwdWJsaWMgZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuICBwdWJsaWMgc2VsZWN0ZWRDb21wb25lbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVGhlIHNuYXBwZXIgaGFuZGVkIHRvIGV2ZXJ5IGNvbXBvbmVudCAoc3RhYmxlIGlkZW50aXR5IGZvciBPblB1c2gpLlxuICBwdWJsaWMgcmVhZG9ubHkgc25hcHBlcjogQ2FudmFzU25hcHBlciA9IHtcbiAgICBzbmFwTW92ZTogKGNvbXBvbmVudCwgeCwgeSkgPT4gdGhpcy5fc25hcE1vdmUoY29tcG9uZW50LCB4LCB5KSxcbiAgICBzbmFwUmVzaXplOiAoY29tcG9uZW50LCBnZW9tZXRyeSwgaGFuZGxlKSA9PiB0aGlzLl9zbmFwUmVzaXplKGNvbXBvbmVudCwgZ2VvbWV0cnksIGhhbmRsZSksXG4gICAgY2xlYXI6ICgpID0+IHRoaXMuX2NsZWFyR3VpZGVzKCksXG4gIH07XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9maXR0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcHJldmlvdXNQYWdlQ291bnQgPSAwO1xuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmdyb3VwcyA9IG5ldyBNYXAoKHRoaXMucmVwb3J0Py5maWx0ZXJHcm91cHMgPz8gW10pLm1hcCgoZ3JvdXApID0+IFtncm91cC5pZCwgZ3JvdXBdKSk7XG5cbiAgICBjb25zdCBwYWdlQ291bnQgPSB0aGlzLnJlcG9ydD8ucGFnZXM/Lmxlbmd0aCA/PyAwO1xuXG4gICAgLy8gQSBwYWdlIHdhcyBqdXN0IGFkZGVkICh0aGUgaG9zdCByZS1mZXRjaGVkIHRoZSByZXBvcnQpIOKAlCBsYW5kIG9uIGl0LlxuICAgIGlmIChwYWdlQ291bnQgPiB0aGlzLl9wcmV2aW91c1BhZ2VDb3VudCAmJiB0aGlzLl9wcmV2aW91c1BhZ2VDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4ID0gcGFnZUNvdW50IC0gMTtcbiAgICB9XG4gICAgdGhpcy5fcHJldmlvdXNQYWdlQ291bnQgPSBwYWdlQ291bnQ7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVQYWdlSW5kZXggPj0gcGFnZUNvdW50KSB7XG4gICAgICB0aGlzLmFjdGl2ZVBhZ2VJbmRleCA9IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVwb3J0IGhlYWRpbmcgc2l6ZSBpbiBweCAoY29uZmlnIGlzIHBvaW50czsgdGhlIGNhbnZhcyByZW5kZXJzIGF0XG4gIC8vIDk2cHgvaW4sIHNvIHBvaW50cyDDlyA5Ni83MikuIEluaGVyaXRlZCBieSBjb21wb25lbnQgdGl0bGVzIHZpYSBhIENTUyB2YXIuXG4gIHB1YmxpYyBnZXQgaGVhZGluZ1NpemVQeCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucmVwb3J0Py5jb25maWc/LnN0eWxlcz8uaGVhZGluZz8uc2l6ZSA/PyBERUZBVUxUX0hFQURJTkdfU0laRTtcblxuICAgIHJldHVybiBwb2ludHMgKiAoUFhfUEVSX0lOQ0ggLyA3Mik7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIEZpdCB0aGUgcGFnZSB0byB0aGUgdmlld3BvcnQgb25jZSBvbiBmaXJzdCByZW5kZXI7IGFmdGVyIHRoYXQgdGhlXG4gICAgLy8gdmlld2VyJ3Mgem9vbSBjaG9pY2UgaXMgcmVzcGVjdGVkIGFjcm9zcyByZS1yZW5kZXJzLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy56b29tRml0KCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0Zsb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0Py5sYXlvdXQgPT09ICdmbG93JztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlUGFnZSgpOiBSZXBvcnRQYWdlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0Py5wYWdlcz8uW3RoaXMuYWN0aXZlUGFnZUluZGV4XSA/PyBudWxsO1xuICB9XG5cbiAgLy8gRmxvdyByZW5kZXIgb3JkZXIgKHRoZSBhc3NlbWJsZXIgYWxyZWFkeSBzb3J0cywgYnV0IGEgbG9jYWwgcmVvcmRlclxuICAvLyBtaWQtc2Vzc2lvbiBtdXN0IGhvbGQgd2l0aG91dCBhIHJlLWZldGNoKS5cbiAgcHVibGljIGdldCBmbG93Q29tcG9uZW50cygpOiBSZXBvcnRDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIFsuLi4odGhpcy5hY3RpdmVQYWdlPy5jb21wb25lbnRzID8/IFtdKV0uc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFBhZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkID0gbnVsbDtcbiAgfVxuXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2U7IHRoZSBob3N0IHJlLWZldGNoZXMgdGhlIHJlcG9ydCBhbmQgbmdPbkNoYW5nZXMgbGFuZHNcbiAgLy8gdGhlIHZpZXcgb24gdGhlIG5ldyAobGFzdCkgcGFnZS5cbiAgcHVibGljIGFkZFBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcG9ydERhdGEuYWRkUGFnZSh0aGlzLnJlcG9ydC5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXBvcnRDaGFuZ2VkLmVtaXQoKSk7XG4gIH1cblxuICBwdWJsaWMgcGFnZUxhYmVsKHBhZ2U6IFJlcG9ydFBhZ2UsIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYWdlLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YDtcbiAgfVxuXG4gIC8vIEhhbmQgcHJlc2VudGF0aW9uIHNldHRpbmdzICh0aXRsZSwgcGFkZGluZykgc2F2ZWQgaW4gdGhlIHNldHRpbmdzIGRpYWxvZyB0b1xuICAvLyB0aGUgb25lIGNvbXBvbmVudCB0aGV5IGJlbG9uZyB0by4gTm90aGluZyBoZXJlIGZlZWRzIHRoZSBxdWVyeSwgc28gdGhhdFxuICAvLyBjb21wb25lbnQgcmVwYWludHMgYW5kIGV2ZXJ5IG90aGVyIG9uZSBvbiB0aGUgcGFnZSBpcyBsZWZ0IGFsb25lLlxuICBwdWJsaWMgYXBwbHlDb21wb25lbnRTZXR0aW5ncyhjb21wb25lbnRJZDogbnVtYmVyLCBzZXR0aW5nczogQ29tcG9uZW50U2V0dGluZ3MpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudHNcbiAgICAgIC5maW5kKChyZW5kZXJlZCkgPT4gcmVuZGVyZWQuY29tcG9uZW50LmlkID09PSBjb21wb25lbnRJZClcbiAgICAgID8uYXBwbHlTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Q29tcG9uZW50KGNvbXBvbmVudElkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkID0gY29tcG9uZW50SWQ7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgb25DYW52YXNQb2ludGVyRG93bigpOiB2b2lkIHtcbiAgICAvLyBCYWNrZ3JvdW5kIGNsaWNrIChwYW4gc3RhcnQpIGRlc2VsZWN0cy5cbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvbmVudElkICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLSB6b29tIHRvb2xiYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHVibGljIG9uWm9vbWVkKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnpvb20gPSBzY2FsZTtcbiAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy56b29tUGFuPy56b29tSW4oKTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tT3V0KCk6IHZvaWQge1xuICAgIHRoaXMuem9vbVBhbj8uem9vbU91dCgpO1xuICB9XG5cbiAgcHVibGljIHpvb21GaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydD8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZXdwb3J0IHx8ICF0aGlzLnJlcG9ydD8ucGFnZVdpZHRoIHx8ICF0aGlzLnpvb21QYW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXQgPSBNYXRoLm1pbihcbiAgICAgICh2aWV3cG9ydC5jbGllbnRXaWR0aCAtIDMyKSAvICh0aGlzLnJlcG9ydC5wYWdlV2lkdGggKiBQWF9QRVJfSU5DSCksXG4gICAgICAodmlld3BvcnQuY2xpZW50SGVpZ2h0IC0gMzIpIC8gKHRoaXMucmVwb3J0LnBhZ2VIZWlnaHQgKiBQWF9QRVJfSU5DSCksXG4gICAgKTtcblxuICAgIHRoaXMuem9vbVBhbi56b29tKE1hdGgubWluKDEuNSwgTWF0aC5tYXgoMC4xLCBmaXQpKSk7XG4gICAgdGhpcy56b29tUGFuLm1vdmUoMTYsIDE2KTtcbiAgICB0aGlzLl9maXR0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIHpvb21BY3R1YWwoKTogdm9pZCB7XG4gICAgdGhpcy56b29tUGFuPy56b29tKDEpO1xuICB9XG5cbiAgLy8gLS0tLS0gcGVyc2lzdGVuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEEgZnJlZWZvcm0gZHJhZy9yZXNpemUgb3IgYSBmbG93IHdpZHRoIHJlc2l6ZSBsYW5kZWQg4oCUIG9uZSBQVVQgcGVyIGdlc3R1cmUuXG4gIHB1YmxpYyBvblBvc2l0aW9uQ2hhbmdlZChwb3NpdGlvbjogeyBjb21wb25lbnRJZDogbnVtYmVyIH0gJiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJHdWlkZXMoKTtcbiAgICB0aGlzLl9yZXBvcnREYXRhLnNhdmVQb3NpdGlvbnModGhpcy5yZXBvcnQuaWQsIFtwb3NpdGlvbiBhcyBhbnldKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gQSBmbG93IGRyYWcgZHJvcHBlZDogcmVvcmRlciB0aGUgcGFnZSdzIGNvbXBvbmVudHMgYXJvdW5kIHRoZSBtb3ZlZCBvbmVcbiAgLy8gYW5kIHBlcnNpc3QgZXZlcnkgb3JkZXIgaW4gb25lIFBVVC5cbiAgcHVibGljIG9uRmxvd1Jlb3JkZXIoZXZlbnQ6IHsgY29tcG9uZW50SWQ6IG51bWJlcjsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmFjdGl2ZVBhZ2U7XG4gICAgaWYgKCFwYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3JkZXJlZCA9IHRoaXMuZmxvd0NvbXBvbmVudHMuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC5pZCAhPT0gZXZlbnQuY29tcG9uZW50SWQpO1xuICAgIGNvbnN0IG1vdmVkID0gcGFnZS5jb21wb25lbnRzLmZpbmQoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmlkID09PSBldmVudC5jb21wb25lbnRJZCk7XG4gICAgaWYgKCFtb3ZlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZmxvd0Ryb3BJbmRleChvcmRlcmVkLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICBvcmRlcmVkLnNwbGljZShpbmRleCwgMCwgbW92ZWQpO1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gb3JkZXJlZC5tYXAoKGNvbXBvbmVudCwgb3JkZXIpID0+IHtcbiAgICAgIGNvbXBvbmVudC5vcmRlciA9IG9yZGVyO1xuXG4gICAgICByZXR1cm4geyBjb21wb25lbnRJZDogY29tcG9uZW50LmlkLCBvcmRlciB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5zYXZlUG9zaXRpb25zKHRoaXMucmVwb3J0LmlkLCBwb3NpdGlvbnMpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBXaGVyZSB0aGUgcG9pbnRlciBsYW5kZWQgYW1vbmcgdGhlIGZsb3dlZCBjb21wb25lbnRzOiBiZWZvcmUgdGhlIGZpcnN0XG4gIC8vIGNvbXBvbmVudCB3aG9zZSBjZW50ZXIgdGhlIHBvaW50ZXIgaXMgYWJvdmUvbGVmdCBvZi5cbiAgcHJpdmF0ZSBfZmxvd0Ryb3BJbmRleChvcmRlcmVkOiBSZXBvcnRDb21wb25lbnRbXSwgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGhvc3RzID0gQXJyYXkuZnJvbShcbiAgICAgIHRoaXMuX3ZpZXdwb3J0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ2FwcC1yZXBvcnQtY29tcG9uZW50JyksXG4gICAgKS5maWx0ZXIoKGhvc3QpID0+ICFob3N0LmNsYXNzTGlzdC5jb250YWlucygnZmxvdy1kcmFnZ2luZycpKTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBob3N0cy5sZW5ndGggJiYgaW5kZXggPCBvcmRlcmVkLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgcmVjdCA9IGhvc3RzW2luZGV4XS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChjbGllbnRZIDwgcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDJcbiAgICAgICAgfHwgKGNsaWVudFkgPCByZWN0LmJvdHRvbSAmJiBjbGllbnRYIDwgcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDIpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXJlZC5sZW5ndGg7XG4gIH1cblxuICAvLyAtLS0tLSBzbWFydCBndWlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gUGl4ZWwgZmVlbCBvZiB0aGUgc25hcCwgY29udmVydGVkIHRvIGluY2hlcyBhdCB0aGUgY3VycmVudCB6b29tLlxuICBwcml2YXRlIGdldCBfc25hcFRocmVzaG9sZCgpOiBudW1iZXIge1xuICAgIHJldHVybiA4IC8gKFBYX1BFUl9JTkNIICogTWF0aC5tYXgoMC4xLCB0aGlzLnpvb20pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NuYXBNb3ZlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgeyB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCB9ID0gdGhpcy5fY2FuZGlkYXRlcyhjb21wb25lbnQpO1xuICAgIGNvbnN0IGd1aWRlczogR3VpZGVMaW5lW10gPSBbXTtcblxuICAgIGNvbnN0IHNuYXBwZWRYID0gdGhpcy5fc25hcEF4aXMoXG4gICAgICBbXG4gICAgICAgIHsgb2Zmc2V0OiAwLCB2YWx1ZTogeCB9LFxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LncgLyAyLCB2YWx1ZTogeCArIGNvbXBvbmVudC53IC8gMiB9LFxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LncsIHZhbHVlOiB4ICsgY29tcG9uZW50LncgfSxcbiAgICAgIF0sXG4gICAgICB2ZXJ0aWNhbCxcbiAgICApO1xuICAgIGlmIChzbmFwcGVkWCAhPT0gbnVsbCkge1xuICAgICAgeCA9IHNuYXBwZWRYLmJhc2U7XG4gICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAndicsIHBvc2l0aW9uOiBzbmFwcGVkWC5ndWlkZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzbmFwcGVkWSA9IHRoaXMuX3NuYXBBeGlzKFxuICAgICAgW1xuICAgICAgICB7IG9mZnNldDogMCwgdmFsdWU6IHkgfSxcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC5oIC8gMiwgdmFsdWU6IHkgKyBjb21wb25lbnQuaCAvIDIgfSxcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC5oLCB2YWx1ZTogeSArIGNvbXBvbmVudC5oIH0sXG4gICAgICBdLFxuICAgICAgaG9yaXpvbnRhbCxcbiAgICApO1xuICAgIGlmIChzbmFwcGVkWSAhPT0gbnVsbCkge1xuICAgICAgeSA9IHNuYXBwZWRZLmJhc2U7XG4gICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAnaCcsIHBvc2l0aW9uOiBzbmFwcGVkWS5ndWlkZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW5kZXJHdWlkZXMoZ3VpZGVzKTtcblxuICAgIHJldHVybiB7IHgsIHkgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3NuYXBSZXNpemUoXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZ2VvbWV0cnk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sXG4gICAgaGFuZGxlOiBzdHJpbmcsXG4gICk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHsgdmVydGljYWwsIGhvcml6b250YWwgfSA9IHRoaXMuX2NhbmRpZGF0ZXMoY29tcG9uZW50KTtcbiAgICBjb25zdCBndWlkZXM6IEd1aWRlTGluZVtdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5nZW9tZXRyeSB9O1xuXG4gICAgLy8gT25seSB0aGUgZWRnZXMgdGhlIGhhbmRsZSBtb3ZlcyBwYXJ0aWNpcGF0ZSBpbiBzbmFwcGluZy5cbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCdlJykpIHtcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LnggKyBnZW9tZXRyeS53LCB2ZXJ0aWNhbCk7XG4gICAgICBpZiAoc25hcHBlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQudyA9IHNuYXBwZWQgLSBnZW9tZXRyeS54O1xuICAgICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAndicsIHBvc2l0aW9uOiBzbmFwcGVkIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCd3JykpIHtcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LngsIHZlcnRpY2FsKTtcbiAgICAgIGlmIChzbmFwcGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC53ID0gZ2VvbWV0cnkueCArIGdlb21ldHJ5LncgLSBzbmFwcGVkO1xuICAgICAgICByZXN1bHQueCA9IHNuYXBwZWQ7XG4gICAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICd2JywgcG9zaXRpb246IHNuYXBwZWQgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ3MnKSkge1xuICAgICAgY29uc3Qgc25hcHBlZCA9IHRoaXMuX25lYXJlc3QoZ2VvbWV0cnkueSArIGdlb21ldHJ5LmgsIGhvcml6b250YWwpO1xuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LmggPSBzbmFwcGVkIC0gZ2VvbWV0cnkueTtcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ2gnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygnbicpKSB7XG4gICAgICBjb25zdCBzbmFwcGVkID0gdGhpcy5fbmVhcmVzdChnZW9tZXRyeS55LCBob3Jpem9udGFsKTtcbiAgICAgIGlmIChzbmFwcGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5oID0gZ2VvbWV0cnkueSArIGdlb21ldHJ5LmggLSBzbmFwcGVkO1xuICAgICAgICByZXN1bHQueSA9IHNuYXBwZWQ7XG4gICAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICdoJywgcG9zaXRpb246IHNuYXBwZWQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fcmVuZGVyR3VpZGVzKGd1aWRlcyk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQWxpZ25tZW50IGNhbmRpZGF0ZXM6IHRoZSBwYWdlJ3MgZWRnZXMgKyBjZW50ZXIsIGFuZCBldmVyeSBzaWJsaW5nJ3NcbiAgLy8gZWRnZXMgKyBjZW50ZXJzLlxuICBwcml2YXRlIF9jYW5kaWRhdGVzKG1vdmluZzogUmVwb3J0Q29tcG9uZW50KTogeyB2ZXJ0aWNhbDogbnVtYmVyW107IGhvcml6b250YWw6IG51bWJlcltdIH0ge1xuICAgIGNvbnN0IHZlcnRpY2FsID0gWzAsIHRoaXMucmVwb3J0LnBhZ2VXaWR0aCAvIDIsIHRoaXMucmVwb3J0LnBhZ2VXaWR0aF07XG4gICAgY29uc3QgaG9yaXpvbnRhbCA9IFswLCB0aGlzLnJlcG9ydC5wYWdlSGVpZ2h0IC8gMiwgdGhpcy5yZXBvcnQucGFnZUhlaWdodF07XG5cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmFjdGl2ZVBhZ2U/LmNvbXBvbmVudHMgPz8gW10pIHtcbiAgICAgIGlmIChjb21wb25lbnQuaWQgPT09IG1vdmluZy5pZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmVydGljYWwucHVzaChjb21wb25lbnQueCwgY29tcG9uZW50LnggKyBjb21wb25lbnQudyAvIDIsIGNvbXBvbmVudC54ICsgY29tcG9uZW50LncpO1xuICAgICAgaG9yaXpvbnRhbC5wdXNoKGNvbXBvbmVudC55LCBjb21wb25lbnQueSArIGNvbXBvbmVudC5oIC8gMiwgY29tcG9uZW50LnkgKyBjb21wb25lbnQuaCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdmVydGljYWwsIGhvcml6b250YWwgfTtcbiAgfVxuXG4gIC8vIFNuYXAgb25lIGF4aXM6IG9mIHRoZSBtb3ZpbmcgYm94J3MgdGhyZWUgbGluZXMgKGVkZ2UvY2VudGVyL2VkZ2UpLCBmaW5kXG4gIC8vIHRoZSBjbG9zZXN0IGNhbmRpZGF0ZSB3aXRoaW4gdGhyZXNob2xkIGFuZCByZXR1cm4gdGhlIGFkanVzdGVkIGJhc2VcbiAgLy8gY29vcmRpbmF0ZSBwbHVzIHRoZSBndWlkZSB0byBkcmF3LlxuICBwcml2YXRlIF9zbmFwQXhpcyhcbiAgICBsaW5lczogeyBvZmZzZXQ6IG51bWJlcjsgdmFsdWU6IG51bWJlciB9W10sXG4gICAgY2FuZGlkYXRlczogbnVtYmVyW10sXG4gICk6IHsgYmFzZTogbnVtYmVyOyBndWlkZTogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBsZXQgYmVzdDogeyBiYXNlOiBudW1iZXI7IGd1aWRlOiBudW1iZXI7IGRpc3RhbmNlOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoY2FuZGlkYXRlIC0gbGluZS52YWx1ZSk7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8PSB0aGlzLl9zbmFwVGhyZXNob2xkICYmICghYmVzdCB8fCBkaXN0YW5jZSA8IGJlc3QuZGlzdGFuY2UpKSB7XG4gICAgICAgICAgYmVzdCA9IHsgYmFzZTogY2FuZGlkYXRlIC0gbGluZS5vZmZzZXQsIGd1aWRlOiBjYW5kaWRhdGUsIGRpc3RhbmNlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmVzdCA/IHsgYmFzZTogYmVzdC5iYXNlLCBndWlkZTogYmVzdC5ndWlkZSB9IDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX25lYXJlc3QodmFsdWU6IG51bWJlciwgY2FuZGlkYXRlczogbnVtYmVyW10pOiBudW1iZXIgfCBudWxsIHtcbiAgICBsZXQgYmVzdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGJlc3REaXN0YW5jZSA9IHRoaXMuX3NuYXBUaHJlc2hvbGQ7XG5cbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGNhbmRpZGF0ZSAtIHZhbHVlKTtcbiAgICAgIGlmIChkaXN0YW5jZSA8PSBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTtcbiAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3Q7XG4gIH1cblxuICAvLyBUaGUgZ3VpZGVzIG92ZXJsYXkgaXMgZHJhd24gaW1wZXJhdGl2ZWx5IOKAlCB0aGUgZHJhZyBsb29wIHJ1bnMgb3V0c2lkZVxuICAvLyBBbmd1bGFyIGFuZCByZXBhaW50cyBvbiBldmVyeSBwb2ludGVybW92ZS5cbiAgcHJpdmF0ZSBfcmVuZGVyR3VpZGVzKGd1aWRlczogR3VpZGVMaW5lW10pOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5fZ3VpZGVzPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghaG9zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhvc3QucmVwbGFjZUNoaWxkcmVuKC4uLmd1aWRlcy5tYXAoKGd1aWRlKSA9PiB7XG4gICAgICBjb25zdCBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBsaW5lLmNsYXNzTmFtZSA9IGBndWlkZSBndWlkZS0ke2d1aWRlLm9yaWVudGF0aW9ufWA7XG4gICAgICBpZiAoZ3VpZGUub3JpZW50YXRpb24gPT09ICd2Jykge1xuICAgICAgICBsaW5lLnN0eWxlLmxlZnQgPSBgJHtndWlkZS5wb3NpdGlvbiAqIFBYX1BFUl9JTkNIfXB4YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmUuc3R5bGUudG9wID0gYCR7Z3VpZGUucG9zaXRpb24gKiBQWF9QRVJfSU5DSH1weGA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyR3VpZGVzKCk6IHZvaWQge1xuICAgIHRoaXMuX2d1aWRlcz8ubmF0aXZlRWxlbWVudD8ucmVwbGFjZUNoaWxkcmVuKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjYW52YXNcIj5cbiAgPGRpdlxuICAgICN2aWV3cG9ydFxuICAgIGNsYXNzPVwicGFnZS12aWV3cG9ydFwiXG4gICAgKHBvaW50ZXJkb3duKT1cIm9uQ2FudmFzUG9pbnRlckRvd24oKVwiPlxuICAgIDxmcy16b29tLXBhblxuICAgICAgW3pvb21NaW5dPVwiMC4xXCJcbiAgICAgIFt6b29tTWF4XT1cIjNcIlxuICAgICAgKHpvb21lZCk9XCJvblpvb21lZCgkZXZlbnQpXCI+XG4gICAgICBAaWYgKGFjdGl2ZVBhZ2U7IGFzIHBhZ2UpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwicGFnZVwiXG4gICAgICAgICAgW2NsYXNzLmZsb3ddPVwiaXNGbG93XCJcbiAgICAgICAgICBbY2xhc3MuZWRpdGluZ109XCJlZGl0TW9kZVwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInJlcG9ydC5wYWdlV2lkdGggKiBQWFwiXG4gICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJyZXBvcnQucGFnZUhlaWdodCAqIFBYXCJcbiAgICAgICAgICBbc3R5bGUucGFkZGluZy5weF09XCJpc0Zsb3cgPyBmbG93UGFkZGluZyAqIFBYIDogMFwiXG4gICAgICAgICAgW3N0eWxlLi0tY2FudmFzLXpvb21dPVwiem9vbVwiXG4gICAgICAgICAgW3N0eWxlLi0tcmVwb3J0LWhlYWRpbmctc2l6ZS5weF09XCJoZWFkaW5nU2l6ZVB4XCI+XG4gICAgICAgICAgQGlmIChpc0Zsb3cpIHtcbiAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBmbG93Q29tcG9uZW50czsgdHJhY2sgY29tcG9uZW50LmlkKSB7XG4gICAgICAgICAgICAgIDxhcHAtcmVwb3J0LWNvbXBvbmVudFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvdy1pdGVtXCJcbiAgICAgICAgICAgICAgICBbcmVwb3J0SWRdPVwicmVwb3J0LmlkXCJcbiAgICAgICAgICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cHNcIlxuICAgICAgICAgICAgICAgIFtlZGl0TW9kZV09XCJlZGl0TW9kZVwiXG4gICAgICAgICAgICAgICAgW2xheW91dF09XCInZmxvdydcIlxuICAgICAgICAgICAgICAgIFt6b29tXT1cInpvb21cIlxuICAgICAgICAgICAgICAgIFtzbmFwcGVyXT1cInNuYXBwZXJcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJjb21wb25lbnQuaWQgPT09IHNlbGVjdGVkQ29tcG9uZW50SWRcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNvbXBvbmVudC5mbG93V2lkdGhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiY29tcG9uZW50LmF1dG9IZWlnaHQgPyBudWxsIDogY29tcG9uZW50LmggKiBQWFwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdENvbXBvbmVudCk9XCJzZWxlY3RDb21wb25lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHBvc2l0aW9uQ2hhbmdlZCk9XCJvblBvc2l0aW9uQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZmxvd1Jlb3JkZXIpPVwib25GbG93UmVvcmRlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob3BlblNldHRpbmdzKT1cImNvbXBvbmVudFNldHRpbmdzLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAoY29tcG9uZW50IG9mIHBhZ2UuY29tcG9uZW50czsgdHJhY2sgY29tcG9uZW50LmlkKSB7XG4gICAgICAgICAgICAgIDxhcHAtcmVwb3J0LWNvbXBvbmVudFxuICAgICAgICAgICAgICAgIFtyZXBvcnRJZF09XCJyZXBvcnQuaWRcIlxuICAgICAgICAgICAgICAgIFtjb21wb25lbnRdPVwiY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICBbZ3JvdXBzXT1cImdyb3Vwc1wiXG4gICAgICAgICAgICAgICAgW2VkaXRNb2RlXT1cImVkaXRNb2RlXCJcbiAgICAgICAgICAgICAgICBbbGF5b3V0XT1cIidmcmVlZm9ybSdcIlxuICAgICAgICAgICAgICAgIFt6b29tXT1cInpvb21cIlxuICAgICAgICAgICAgICAgIFtzbmFwcGVyXT1cInNuYXBwZXJcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJjb21wb25lbnQuaWQgPT09IHNlbGVjdGVkQ29tcG9uZW50SWRcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImNvbXBvbmVudC54ICogUFhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiY29tcG9uZW50LnkgKiBQWFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbXBvbmVudC53ICogUFhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiY29tcG9uZW50LmF1dG9IZWlnaHQgPyBudWxsIDogY29tcG9uZW50LmggKiBQWFwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdENvbXBvbmVudCk9XCJzZWxlY3RDb21wb25lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHBvc2l0aW9uQ2hhbmdlZCk9XCJvblBvc2l0aW9uQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob3BlblNldHRpbmdzKT1cImNvbXBvbmVudFNldHRpbmdzLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNndWlkZXNcbiAgICAgICAgICAgIGNsYXNzPVwiZ3VpZGVzXCI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKCFwYWdlLmNvbXBvbmVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFnZS1lbXB0eVwiPlxuICAgICAgICAgICAgICBBc2sgdGhlIGFzc2lzdGFudCB0byBhZGQgYSBjaGFydCwgbGlzdCBvciBLUEkgdG8gdGhpcyBwYWdlLlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2ZzLXpvb20tcGFuPlxuXG4gICAgQGlmIChlZGl0TW9kZSkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtZmxhdC1idXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIGNsYXNzPVwiZWRpdC1kb25lXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkV4aXQgbGF5b3V0IGVkaXRpbmdcIlxuICAgICAgICAoY2xpY2spPVwiZWRpdERvbmUuZW1pdCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgIERvbmUgZWRpdGluZ1xuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY2FudmFzLXRvb2xiYXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicGFnZS10YWJzXCI+XG4gICAgICBAaWYgKChyZXBvcnQ/LnBhZ2VzPy5sZW5ndGggPz8gMCkgPiAxKSB7XG4gICAgICAgIEBmb3IgKHBhZ2Ugb2YgcmVwb3J0LnBhZ2VzOyB0cmFjayBwYWdlLmlkOyBsZXQgaW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicGFnZS10YWJcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpbmRleCA9PT0gYWN0aXZlUGFnZUluZGV4XCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKGluZGV4KVwiPlxuICAgICAgICAgICAge3sgcGFnZUxhYmVsKHBhZ2UsIGluZGV4KSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInBhZ2UtdGFiIGFkZC1wYWdlXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBwYWdlXCJcbiAgICAgICAgKGNsaWNrKT1cImFkZFBhZ2UoKVwiPlxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgUGFnZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiem9vbS1jb250cm9sc1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJ6b29tLWJ1dHRvblwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJab29tIG91dFwiXG4gICAgICAgIChjbGljayk9XCJ6b29tT3V0KClcIj5cbiAgICAgICAgPG1hdC1pY29uPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiem9vbS1sYWJlbFwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJab29tIHRvIDEwMCVcIlxuICAgICAgICAoY2xpY2spPVwiem9vbUFjdHVhbCgpXCI+XG4gICAgICAgIHt7ICh6b29tICogMTAwKS50b0ZpeGVkKDApIH19JVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIlpvb20gaW5cIlxuICAgICAgICAoY2xpY2spPVwiem9vbUluKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiem9vbS1idXR0b25cIlxuICAgICAgICBtYXRUb29sdGlwPVwiRml0IHBhZ2VcIlxuICAgICAgICAoY2xpY2spPVwiem9vbUZpdCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5maXRfc2NyZWVuPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19