@worktile/theia 14.3.12 → 14.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/plugins/table/components/table.component.mjs +51 -54
- package/esm2020/plugins/table/table.store.mjs +5 -1
- package/esm2020/plugins/table/utils/set-menu-cell-invisibility.mjs +3 -3
- package/esm2020/services/context.service.mjs +3 -2
- package/fesm2015/worktile-theia.mjs +52 -84
- package/fesm2015/worktile-theia.mjs.map +1 -1
- package/fesm2020/worktile-theia.mjs +52 -83
- package/fesm2020/worktile-theia.mjs.map +1 -1
- package/package.json +1 -1
- package/plugins/table/components/table.component.d.ts +7 -4
- package/plugins/table/components/table.component.scss +2 -2
- package/plugins/table/table.store.d.ts +1 -0
- package/esm2020/utils/os-name.mjs +0 -33
- package/utils/os-name.d.ts +0 -2
|
@@ -4,6 +4,7 @@ import { take, takeUntil, debounceTime, filter, distinctUntilChanged, map } from
|
|
|
4
4
|
import { Transforms } from 'slate';
|
|
5
5
|
import { AngularEditor } from 'slate-angular';
|
|
6
6
|
import { TheEditor, TheBaseElementComponent, PluginKeys } from '../../../interfaces';
|
|
7
|
+
import { isHotkey } from 'is-hotkey';
|
|
7
8
|
import { SLA_TABLE_CELL_SELECTOR } from '../../../constants/selector';
|
|
8
9
|
import { ColumnResizeNotifierSource, TableCellEventDispatcher } from '../../../components';
|
|
9
10
|
import { TheTableContextMenuService } from '../../../services/table-contextmenu.service';
|
|
@@ -15,21 +16,20 @@ import { HEADER_CELL_CLASS, TableOptions, THE_TABLE_COMPONENT_TOKEN } from '../t
|
|
|
15
16
|
import { isVirtualKey } from '../utils/is-virtual-key';
|
|
16
17
|
import { getPluginOptions } from '../../../core';
|
|
17
18
|
import { TableFreezeColumnPipe, TableFreezeRowPipe } from '../table.pipe';
|
|
18
|
-
import { DEFAULT_SCROLL_CONTAINER } from '../../../constants';
|
|
19
19
|
import * as TheTransforms from '../../../transforms';
|
|
20
|
-
import { isMac } from '../../../utils/os-name';
|
|
21
20
|
import * as i0 from "@angular/core";
|
|
22
21
|
import * as i1 from "../../../components";
|
|
23
22
|
import * as i2 from "../table.store";
|
|
24
23
|
import * as i3 from "../table.service";
|
|
25
24
|
import * as i4 from "../../../services/table-contextmenu.service";
|
|
26
25
|
import * as i5 from "../table.pipe";
|
|
27
|
-
import * as i6 from "
|
|
28
|
-
import * as i7 from "
|
|
29
|
-
import * as i8 from "
|
|
30
|
-
import * as i9 from "
|
|
26
|
+
import * as i6 from "../../../services/context.service";
|
|
27
|
+
import * as i7 from "@angular/common";
|
|
28
|
+
import * as i8 from "slate-angular";
|
|
29
|
+
import * as i9 from "../../../components/column-resize/column-resize.directive";
|
|
30
|
+
import * as i10 from "./insert-mark/insert-mark.component";
|
|
31
31
|
export class TheTableComponent extends TheBaseElementComponent {
|
|
32
|
-
constructor(elementRef, eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theTableContextMenuService, freezeColumnPipe, freezeRowPipe, renderer) {
|
|
32
|
+
constructor(elementRef, eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theTableContextMenuService, freezeColumnPipe, freezeRowPipe, renderer, contextService) {
|
|
33
33
|
super(elementRef, cdr);
|
|
34
34
|
this.eventDispatcher = eventDispatcher;
|
|
35
35
|
this.resizeNotifier = resizeNotifier;
|
|
@@ -41,10 +41,13 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
41
41
|
this.freezeColumnPipe = freezeColumnPipe;
|
|
42
42
|
this.freezeRowPipe = freezeRowPipe;
|
|
43
43
|
this.renderer = renderer;
|
|
44
|
+
this.contextService = contextService;
|
|
44
45
|
this.headerRow = false;
|
|
46
|
+
this.isSelectedAllCell = false;
|
|
45
47
|
this.destroy$ = new Subject();
|
|
46
48
|
this.rowControls = [];
|
|
47
49
|
this.colControls = [];
|
|
50
|
+
this.tableWrapperMarginTop = 0;
|
|
48
51
|
}
|
|
49
52
|
get columns() {
|
|
50
53
|
return this.element && this.element.columns;
|
|
@@ -55,10 +58,6 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
55
58
|
get tbodyNativeElement() {
|
|
56
59
|
return this.tbodyElement?.nativeElement;
|
|
57
60
|
}
|
|
58
|
-
get isSelectedAllCell() {
|
|
59
|
-
return (this.tableStore.selectedRowsIndex.length === this.rowControls.length &&
|
|
60
|
-
this.tableStore.selectedColumnsIndex.length === this.colControls.length);
|
|
61
|
-
}
|
|
62
61
|
handleMousedown(event) {
|
|
63
62
|
if (event.target instanceof Element && this.tbodyNativeElement.contains(event.target)) {
|
|
64
63
|
return;
|
|
@@ -95,8 +94,24 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
95
94
|
.pipe(takeUntil(this.destroy$))
|
|
96
95
|
.subscribe(value => {
|
|
97
96
|
this.tableStore.isFullscreen = value;
|
|
97
|
+
if (this.tableStore.isFullscreen) {
|
|
98
|
+
this.previousScrollContainer = this.editor.options.scrollContainer;
|
|
99
|
+
this.editor.options.scrollContainer = '.the-editable-container';
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.editor.options.scrollContainer = this.previousScrollContainer;
|
|
103
|
+
}
|
|
104
|
+
this.isStickyTop = false;
|
|
105
|
+
this.setHeaderRowStyle();
|
|
106
|
+
this.contextService.rebindContainerScroll();
|
|
98
107
|
});
|
|
99
108
|
}
|
|
109
|
+
this.tableStore
|
|
110
|
+
.selectedCellsChange()
|
|
111
|
+
.pipe(takeUntil(this.destroy$))
|
|
112
|
+
.subscribe(() => {
|
|
113
|
+
this.isSelectedAllCell = this.tableStore.isSelectedAllCell();
|
|
114
|
+
});
|
|
100
115
|
}
|
|
101
116
|
getWrapperWidth() {
|
|
102
117
|
const tableContainer = this.nativeElement.firstChild;
|
|
@@ -153,40 +168,25 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
153
168
|
});
|
|
154
169
|
}
|
|
155
170
|
subscribeScrollContainerScroll() {
|
|
156
|
-
if (this.scrollContainerRef) {
|
|
157
|
-
this.scrollContainerRef.unsubscribe();
|
|
158
|
-
this.scrollContainerRef = null;
|
|
159
|
-
}
|
|
160
171
|
this.ngZone.runOutsideAngular(() => {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
.pipe(takeUntil(this.destroy$), map(() => {
|
|
167
|
-
const distance = elementTop - this.scrollContainerTop;
|
|
168
|
-
const scrollTop = scrollContainerElement.scrollTop;
|
|
169
|
-
const buffer = this.isInTable ? 0 : 30;
|
|
170
|
-
const scrollHeight = scrollTop - (distance + buffer);
|
|
171
|
-
this.isStickyTop = scrollHeight > 0;
|
|
172
|
+
this.contextService.containerScrolled$
|
|
173
|
+
.pipe(takeUntil(this.destroy$), map(event => {
|
|
174
|
+
this.scrollContainerTop = event.target.getBoundingClientRect().top;
|
|
175
|
+
const clientRect = this.theTableElement.nativeElement.getBoundingClientRect();
|
|
176
|
+
const headerTopHeight = this.isInTable ? -19 : 11;
|
|
172
177
|
const headerRowHeight = this.calculateRowControls()[0]?.height;
|
|
178
|
+
const top = clientRect.top + headerTopHeight - this.tableWrapperMarginTop;
|
|
179
|
+
this.isStickyTop =
|
|
180
|
+
top <= this.scrollContainerTop + 8 && clientRect.bottom - this.scrollContainerTop >= headerRowHeight;
|
|
173
181
|
// 标题行内容超过固定高度时移除冻结
|
|
174
182
|
if (this.isStickyTop && this.freezeRowPipe.transform(this.element, this.headerRow)) {
|
|
175
183
|
const maxHeaderRowHeight = (24 + 8) * 11; // 超出 11 行,取消冻结
|
|
176
184
|
this.isStickyTop = headerRowHeight <= maxHeaderRowHeight;
|
|
177
185
|
}
|
|
178
|
-
// 滚动超出表格总高度后移除冻结
|
|
179
|
-
if (this.isStickyTop && this.freezeRowPipe.transform(this.element, this.headerRow)) {
|
|
180
|
-
const tableHeight = this.calculateRowControls().reduce((previous, current) => {
|
|
181
|
-
return previous + current.height;
|
|
182
|
-
}, 0);
|
|
183
|
-
const buffer = this.isInTable ? 11 : 0;
|
|
184
|
-
this.isStickyTop = scrollHeight <= tableHeight - headerRowHeight + buffer;
|
|
185
|
-
}
|
|
186
186
|
return this.isStickyTop;
|
|
187
187
|
}), distinctUntilChanged())
|
|
188
188
|
.subscribe(() => {
|
|
189
|
-
this.
|
|
189
|
+
this.setHeaderRowStyle();
|
|
190
190
|
});
|
|
191
191
|
});
|
|
192
192
|
}
|
|
@@ -274,14 +274,16 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
274
274
|
if (this.isStickyTop && this.freezeRowPipe.transform(this.element, this.headerRow)) {
|
|
275
275
|
this.renderer.addClass(this.nativeElement, stickyTableClass);
|
|
276
276
|
const numberedColumn = this.element.options?.numberedColumn;
|
|
277
|
-
this.
|
|
277
|
+
const top = this.isInTable ? this.scrollContainerTop + 36 : this.scrollContainerTop;
|
|
278
|
+
this.renderer.setStyle(headerRow, 'top', top + 'px');
|
|
278
279
|
const buffer = this.element.options?.numberedColumn ? 0 : 8; // margin-bottom
|
|
279
280
|
if (this.isInTable || numberedColumn) {
|
|
280
281
|
[colControl, tableCornerBtn, rowControlButton].map(item => {
|
|
281
282
|
item && this.renderer.setStyle(item, 'top', this.scrollContainerTop + 'px');
|
|
282
283
|
});
|
|
283
284
|
}
|
|
284
|
-
this.
|
|
285
|
+
this.tableWrapperMarginTop = headerRowHeight + buffer;
|
|
286
|
+
this.renderer.setStyle(this.tableWrapper.nativeElement, 'margin-top', this.tableWrapperMarginTop + 'px');
|
|
285
287
|
}
|
|
286
288
|
else {
|
|
287
289
|
this.renderer.removeClass(this.nativeElement, stickyTableClass);
|
|
@@ -289,6 +291,7 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
289
291
|
item && this.renderer.setStyle(item, 'top', null);
|
|
290
292
|
});
|
|
291
293
|
this.renderer.setStyle(this.tableWrapper.nativeElement, 'margin-top', null);
|
|
294
|
+
this.tableWrapperMarginTop = 0;
|
|
292
295
|
}
|
|
293
296
|
}
|
|
294
297
|
bindTableScrollingShadow() {
|
|
@@ -498,10 +501,11 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
498
501
|
}
|
|
499
502
|
}
|
|
500
503
|
initializeRows() {
|
|
501
|
-
this.element.children.map(row => {
|
|
504
|
+
this.element.children.map((row, index) => {
|
|
502
505
|
if (!row.height) {
|
|
503
506
|
const element = TheEditor.toDOMNode(this.editor, row);
|
|
504
|
-
|
|
507
|
+
let height = getElementHeight(element);
|
|
508
|
+
TheTransforms.setNode(this.editor, { height }, row);
|
|
505
509
|
}
|
|
506
510
|
});
|
|
507
511
|
}
|
|
@@ -509,7 +513,7 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
509
513
|
const rowElements = this.nativeElement.querySelector('tbody').children;
|
|
510
514
|
if (rowElements) {
|
|
511
515
|
[...rowElements].map((row, index) => {
|
|
512
|
-
|
|
516
|
+
let height = getElementHeight(row);
|
|
513
517
|
TheTransforms.setNode(this.editor, { height }, this.element.children[index]);
|
|
514
518
|
});
|
|
515
519
|
}
|
|
@@ -618,21 +622,18 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
618
622
|
}
|
|
619
623
|
// keydown
|
|
620
624
|
listenKeydownSelectEvents() {
|
|
621
|
-
const ctrlKey = isMac() ? ['Meta'] : ['Control'];
|
|
622
625
|
this.ngZone.runOutsideAngular(() => {
|
|
623
626
|
fromEvent(document, 'keydown')
|
|
624
627
|
.pipe(takeUntil(this.destroy$), filter((e) => !!e))
|
|
625
628
|
.subscribe((event) => {
|
|
626
|
-
if (
|
|
629
|
+
if (isHotkey('mod', event) && !this.readonly) {
|
|
627
630
|
this.tableStore.isModSelecting = true;
|
|
628
631
|
}
|
|
629
632
|
});
|
|
630
633
|
fromEvent(document, 'keyup')
|
|
631
634
|
.pipe(takeUntil(this.destroy$), filter((e) => !!e))
|
|
632
|
-
.subscribe((
|
|
633
|
-
|
|
634
|
-
this.tableStore.isModSelecting = false;
|
|
635
|
-
}
|
|
635
|
+
.subscribe(() => {
|
|
636
|
+
this.tableStore.isModSelecting = false;
|
|
636
637
|
});
|
|
637
638
|
});
|
|
638
639
|
}
|
|
@@ -646,13 +647,9 @@ export class TheTableComponent extends TheBaseElementComponent {
|
|
|
646
647
|
super.ngOnDestroy();
|
|
647
648
|
this.destroy$.next();
|
|
648
649
|
this.destroy$.complete();
|
|
649
|
-
if (this.scrollContainerRef) {
|
|
650
|
-
this.scrollContainerRef.unsubscribe();
|
|
651
|
-
this.scrollContainerRef = null;
|
|
652
|
-
}
|
|
653
650
|
}
|
|
654
651
|
}
|
|
655
|
-
TheTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TheTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableCellEventDispatcher }, { token: i1.ColumnResizeNotifierSource }, { token: i2.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.TableService }, { token: i4.TheTableContextMenuService }, { token: i5.TableFreezeColumnPipe }, { token: i5.TableFreezeRowPipe }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
652
|
+
TheTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TheTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableCellEventDispatcher }, { token: i1.ColumnResizeNotifierSource }, { token: i2.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.TableService }, { token: i4.TheTableContextMenuService }, { token: i5.TableFreezeColumnPipe }, { token: i5.TableFreezeRowPipe }, { token: i0.Renderer2 }, { token: i6.TheContextService }], target: i0.ɵɵFactoryTarget.Component });
|
|
656
653
|
TheTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TheTableComponent, selector: "the-table, [theTable]", host: { listeners: { "mousedown": "handleMousedown($event)" }, properties: { "class.the-table-with-controls": "isInTable || tableStore.isCellSelecting", "class.the-numberd-table": "element?.options?.numberedColumn", "class.the-table-selection-hide": "tableStore.isCellSelecting || tableStore.isRightClicking" } }, providers: [
|
|
657
654
|
TableStore,
|
|
658
655
|
TableService,
|
|
@@ -665,7 +662,7 @@ TheTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
|
|
|
665
662
|
provide: THE_TABLE_COMPONENT_TOKEN,
|
|
666
663
|
useExisting: TheTableComponent
|
|
667
664
|
}
|
|
668
|
-
], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }, { propertyName: "columnControlsWrapper", first: true, predicate: ["columnControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "cornerControl", first: true, predicate: ["cornerControl"], descendants: true, read: ElementRef }, { propertyName: "rowControlsButtonWrapper", predicate: ["rowControlsButtonWrapper"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isCellSelecting),\n active: isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!element.options?.headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\">\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n active: tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isCellSelecting) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n [ngClass]=\"{\n 'the-sticky-cell': i === 0 && element | freezeColumn : tablePluginOptions,\n active: tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isCellSelecting\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type:
|
|
665
|
+
], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }, { propertyName: "columnControlsWrapper", first: true, predicate: ["columnControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "cornerControl", first: true, predicate: ["cornerControl"], descendants: true, read: ElementRef }, { propertyName: "rowControlsButtonWrapper", predicate: ["rowControlsButtonWrapper"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isCellSelecting),\n active: isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!element.options?.headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\">\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n active: tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isCellSelecting) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n [ngClass]=\"{\n 'the-sticky-cell': i === 0 && element | freezeColumn : tablePluginOptions,\n active: tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isCellSelecting\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { kind: "directive", type: i9.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { kind: "component", type: i10.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore", "parentElement"] }, { kind: "pipe", type: i5.TableFreezeColumnPipe, name: "freezeColumn" }] });
|
|
669
666
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TheTableComponent, decorators: [{
|
|
670
667
|
type: Component,
|
|
671
668
|
args: [{ selector: 'the-table, [theTable]', providers: [
|
|
@@ -685,7 +682,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
685
682
|
'[class.the-numberd-table]': 'element?.options?.numberedColumn',
|
|
686
683
|
'[class.the-table-selection-hide]': 'tableStore.isCellSelecting || tableStore.isRightClicking'
|
|
687
684
|
}, template: "<div class=\"the-table-container\" theColumnResize>\n <div class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isCellSelecting),\n active: isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!element.options?.headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\">\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n active: tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && (isInTable || tableStore.isCellSelecting) && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th\n #colControl\n class=\"the-table-col-controls\"\n [ngClass]=\"{\n 'the-sticky-cell': i === 0 && element | freezeColumn : tablePluginOptions,\n active: tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isCellSelecting\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n </table>\n </div>\n</div>\n" }]
|
|
688
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i1.ColumnResizeNotifierSource }, { type: i2.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.TableService }, { type: i4.TheTableContextMenuService }, { type: i5.TableFreezeColumnPipe }, { type: i5.TableFreezeRowPipe }, { type: i0.Renderer2 }]; }, propDecorators: { tableWrapper: [{
|
|
685
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i1.ColumnResizeNotifierSource }, { type: i2.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.TableService }, { type: i4.TheTableContextMenuService }, { type: i5.TableFreezeColumnPipe }, { type: i5.TableFreezeRowPipe }, { type: i0.Renderer2 }, { type: i6.TheContextService }]; }, propDecorators: { tableWrapper: [{
|
|
689
686
|
type: ViewChild,
|
|
690
687
|
args: ['tableWrapper', { read: ElementRef, static: true }]
|
|
691
688
|
}], theTableElement: [{
|
|
@@ -707,4 +704,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
707
704
|
type: HostListener,
|
|
708
705
|
args: ['mousedown', ['$event']]
|
|
709
706
|
}] } });
|
|
710
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsVUFBVSxFQUtWLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUVmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQVUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDdEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDekYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUF3Qyx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sS0FBSyxhQUFhLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7OztBQXdCL0MsTUFBTSxPQUFPLGlCQUFrQixTQUFRLHVCQUE2QztJQW1GaEYsWUFDSSxVQUFtQyxFQUM1QixlQUF5QyxFQUN6QyxjQUEwQyxFQUMxQyxVQUFzQixFQUN0QixHQUFzQixFQUN0QixNQUFjLEVBQ2QsWUFBMEIsRUFDekIsMEJBQXNELEVBQ3RELGdCQUF1QyxFQUN4QyxhQUFpQyxFQUNoQyxRQUFtQjtRQUUzQixLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBWGhCLG9CQUFlLEdBQWYsZUFBZSxDQUEwQjtRQUN6QyxtQkFBYyxHQUFkLGNBQWMsQ0FBNEI7UUFDMUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDekIsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0QjtRQUN0RCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXVCO1FBQ3hDLGtCQUFhLEdBQWIsYUFBYSxDQUFvQjtRQUNoQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBN0YvQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLGFBQVEsR0FBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUV2QyxnQkFBVyxHQUEyQyxFQUFFLENBQUM7UUFFekQsZ0JBQVcsR0FBRyxFQUFFLENBQUM7SUEwRmpCLENBQUM7SUE5RUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNqQixPQUFPLENBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO1lBQ3BFLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUMxRSxDQUFDO0lBQ04sQ0FBQztJQW9CRCxlQUFlLENBQUMsS0FBaUI7UUFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxZQUFZLE9BQU8sSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuRixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbkMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEM7UUFDRCxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsZUFBZTtRQUNYLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFrQkQsUUFBUTtRQUNKLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBdUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRTtZQUNwRixJQUFJLENBQUMsa0JBQWtCO2lCQUNsQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2lCQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDOUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztTQUNWO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDWCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQXlCLENBQUM7UUFDcEUsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDckcsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDdkQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVk7UUFDUixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0Qsa0JBQWtCO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDcEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3hFLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ2xCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUMzRTtZQUNELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNqQyxjQUFjO1lBQ2QsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQztpQkFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzlCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDcEMsQ0FBQyxDQUFDLENBQUM7WUFFUCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRTtnQkFDdEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2hELDJCQUEyQjtnQkFDM0IsSUFBSSxhQUFhLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUM1QjthQUNKO2lCQUFNO2dCQUNILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUMzQjtZQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDhCQUE4QjtRQUMxQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN6QixJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGVBQWUsSUFBSSx3QkFBd0IsQ0FBQztZQUN6RixNQUFNLHNCQUFzQixHQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbkcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxDQUFDO1lBQzdFLE1BQU0sVUFBVSxHQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBNkIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUM5RixJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFhLHNCQUFzQixFQUFFLFFBQVEsQ0FBQztpQkFDNUUsSUFBSSxDQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQ3hCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ0wsTUFBTSxRQUFRLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDdEQsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsU0FBUyxDQUFDO2dCQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxZQUFZLEdBQUcsU0FBUyxHQUFHLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7Z0JBRXBDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztnQkFDL0QsbUJBQW1CO2dCQUNuQixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ2hGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsZUFBZTtvQkFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLElBQUksa0JBQWtCLENBQUM7aUJBQzVEO2dCQUNELGlCQUFpQjtnQkFDakIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNoRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUU7d0JBQ3pFLE9BQU8sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQ3JDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDTixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLElBQUksV0FBVyxHQUFHLGVBQWUsR0FBRyxNQUFNLENBQUM7aUJBQzdFO2dCQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM1QixDQUFDLENBQUMsRUFDRixvQkFBb0IsRUFBRSxDQUN6QjtpQkFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3ZELElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMzQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtZQUNyQyxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM5QyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEYsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtZQUN0RCxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDdkI7UUFDRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkIsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUMzRCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQXlCO1FBQzNDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDYixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBeUI7UUFDMUMsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwQixpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDeEc7YUFBTTtZQUNILGlCQUFpQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxRDtRQUNELGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN6QixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQzFEO2lCQUFNO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2FBQzdEO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0Isa0VBQWtFO1FBQ2xFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxtQkFBbUI7UUFDZixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDO1FBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDNUQsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDM0QsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzNGLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMxQixXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7WUFDSCxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsTUFBTSxnQkFBZ0IsR0FBRywyQkFBMkIsQ0FBQztRQUNyRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDO1FBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7UUFDNUUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7UUFDeEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQy9ELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNoRixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDN0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7WUFDN0UsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLGNBQWMsRUFBRTtnQkFDbEMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN0RCxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ2hGLENBQUMsQ0FBQyxDQUFDO2FBQ047WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsZUFBZSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztTQUMxRzthQUFNO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2hFLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pFLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQy9FO0lBQ0wsQ0FBQztJQUVELHdCQUF3QjtRQUNwQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztRQUN0RCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQzVDLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUM7UUFDOUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUM5QyxNQUFNLFlBQVksR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLFVBQVUsR0FBRyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQzdELE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM5RixNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUUsSUFBSSxZQUFZLEVBQUU7WUFDZCxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksYUFBYSxFQUFFO1lBQ2YsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDdkU7YUFBTTtZQUNILGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQzFFO0lBQ0wsQ0FBQztJQUVELDJCQUEyQjtRQUN2QixJQUFJLENBQUMsVUFBVTthQUNWLG1CQUFtQixFQUFFO2FBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNqRCxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELG9CQUFvQjtRQUNoQixJQUFJLENBQUMsVUFBVTthQUNWLDhCQUE4QixFQUFFO2FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUU7WUFDL0csSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUNsRDtJQUNMLENBQUM7SUFFRCxhQUFhO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsOEJBQThCO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDNUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDN0IsSUFBSSxFQUNKLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxDQUNMLENBQUM7Z0JBRUYsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDO2dCQUMzRixPQUFPO29CQUNILElBQUk7b0JBQ0osUUFBUSxFQUFFLEtBQUs7aUJBQ2xCLENBQUM7YUFDTDtpQkFBTTtnQkFDSCxPQUFPO29CQUNILFFBQVEsRUFBRSxLQUFLO2lCQUNsQixDQUFDO2FBQ0w7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxvQkFBb0I7UUFDaEIsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUVwRSxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7UUFDaEMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO2dCQUNoQixXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNiLE1BQU0sRUFBRSxDQUFDO29CQUNULFFBQVEsRUFBRSxLQUFLO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO2dCQUNoQyxJQUFJLEtBQUssS0FBSyxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM1QyxJQUFJLENBQUMsNkJBQTZCLENBQUMsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7aUJBQzlGO2dCQUNELE9BQU87YUFDVjtZQUVELCtCQUErQjtZQUMvQixJQUFJLHVCQUF1QixHQUFHLGdCQUFnQixFQUFFO2dCQUM1QyxJQUFJLENBQUMsNkJBQTZCLENBQUMsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzNGLHVCQUF1QixHQUFHLENBQUMsQ0FBQzthQUMvQjtZQUVELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEUsSUFBSSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsMkRBQTJEO1lBQzNELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNILFdBQVcsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsTUFBTSxFQUFFLFVBQVU7b0JBQ2xCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtpQkFDOUIsQ0FBQyxDQUFDO2FBQ047aUJBQU07Z0JBQ0gsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDYixNQUFNO29CQUNOLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtpQkFDOUIsQ0FBQyxDQUFDO2FBQ047WUFDRCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQsNkJBQTZCLENBQ3pCLHVCQUErQixFQUMvQixnQkFBd0IsRUFDeEIsV0FBbUQ7UUFFbkQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQzFELFVBQVUsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLFdBQVc7YUFDTixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLElBQUksTUFBTSxJQUFJLHVCQUF1QixDQUFDO2FBQ3hGLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNsQixVQUFVLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxpQkFBaUIsQ0FDYixLQUdHLEVBQ0gsS0FBYSxFQUNiLFFBQWdCLEVBQ2hCLE9BQWU7UUFFZixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDeEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1osT0FBTzthQUNWO1lBQ0QsSUFBSSxRQUFRLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3BDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFO29CQUN2QiwyQkFBMkI7b0JBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDakMsS0FBSyxFQUNMLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEQsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FDcEIsQ0FBQztvQkFDRixlQUFlLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDO2lCQUN6RDtxQkFBTTtvQkFDSCxlQUFlLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2hEO2FBQ0o7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sZUFBZSxDQUFDO0lBQzNCLENBQUM7SUFFRCxZQUFZO1FBQ1IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUU7WUFDdEIsTUFBTSxhQUFhLEdBQW1CLEVBQUUsQ0FBQztZQUN6QyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDcEMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7d0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbEIsQ0FBQyxDQUFDO29CQUNGLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO3dCQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2xCLENBQUMsQ0FBQztvQkFDRixLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDO2dCQUNILGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUVELFlBQVk7UUFDUixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7WUFDaEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDeEMsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JGLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDekU7YUFBTTtZQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQzFCO0lBQ0wsQ0FBQztJQUVELGlCQUFpQjtRQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDdEIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRTtnQkFDakYsdUZBQXVGO2dCQUN2RixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxXQUFXLElBQUksd0JBQXdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUYsQ0FBQyxDQUFDLENBQUM7WUFDSCx1RkFBdUY7WUFDdkYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0YsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2pFO1NBQ0o7YUFBTTtZQUNILE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBb0IsQ0FBQztZQUN2RCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ3hFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEcsQ0FBQyxDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakU7SUFDTCxDQUFDO0lBRUQsY0FBYztRQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDYixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3RELGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ2xGO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3ZFLElBQUksV0FBVyxFQUFFO1lBQ1osQ0FBQyxHQUFHLFdBQVcsQ0FBMkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzNELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQscUJBQXFCO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQTBCLENBQUM7UUFDakcsTUFBTSxPQUFPLEdBQXFCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNILGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWlCLEVBQUUsS0FBYTtRQUMzQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFxQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuRjtJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBaUIsRUFBRSxLQUFhO1FBQzNDLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzFCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDakIsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzRCxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDeEM7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE1BQXFCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBaUI7UUFDM0IsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsTUFBcUIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVELDJCQUEyQjtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixTQUFTLENBQWEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDO2lCQUNuRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDOUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNmLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDZixPQUFPO2lCQUNWO2dCQUNELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dCQUN2QyxNQUFNLElBQUksR0FBSSxLQUFLLENBQUMsTUFBc0IsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQXlCLENBQUM7Z0JBQ3BHLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1AsT0FBTztpQkFDVjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7d0JBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ2pEO2lCQUNKO2dCQUNELElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRTtvQkFDMUMsSUFBSSxDQUFDLDBCQUEwQjt5QkFDMUIsZ0JBQWdCLEVBQUU7eUJBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ2IsU0FBUyxDQUFDLEdBQUcsRUFBRTt3QkFDWixJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN4RCxDQUFDLENBQUMsQ0FBQztpQkFDVjtxQkFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO29CQUNuQyxJQUFJLENBQUMsWUFBWTt5QkFDWixZQUFZLEVBQUU7eUJBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDYixTQUFTLENBQUMsR0FBRyxFQUFFO3dCQUNaLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hELENBQUMsQ0FBQyxDQUFDO2lCQUNWO3FCQUFNO29CQUNILElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3hCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3ZEO2dCQUVELHlDQUF5QztnQkFDekMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDWixVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0RSxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLEtBQUssQ0FDRCxTQUFTLENBQWEsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDNUYsU0FBUyxDQUFnQixRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUM5QyxNQUFNLENBQUMsQ0FBQyxDQUFnQixFQUFFLEVBQUU7WUFDeEIsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQ0wsQ0FDSjthQUNJLElBQUksQ0FDRCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3JGLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQzNCO2FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBYSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO2FBQy9DO1lBQ0QsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBcUIsQ0FBQyxDQUFDO1lBQ25GLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFO2dCQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDeEM7WUFDRCxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUN4QztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsVUFBVTtJQUNWLHlCQUF5QjtRQUNyQixNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixTQUFTLENBQWdCLFFBQVEsRUFBRSxTQUFTLENBQUM7aUJBQ3hDLElBQUksQ0FDRCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3BDO2lCQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztpQkFDekM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNQLFNBQVMsQ0FBZ0IsUUFBUSxFQUFFLE9BQU8sQ0FBQztpQkFDdEMsSUFBSSxDQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQ3hCLE1BQU0sQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDcEM7aUJBQ0EsU0FBUyxDQUFDLENBQUMsS0FBb0IsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO2lCQUMxQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBYTtRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBYTtRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsV0FBVztRQUNQLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDekIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7U0FDbEM7SUFDTCxDQUFDOzsrR0EzdEJRLGlCQUFpQjttR0FBakIsaUJBQWlCLDBXQW5CZjtRQUNQLFVBQVU7UUFDVixZQUFZO1FBQ1osMEJBQTBCO1FBQzFCLHdCQUF3QjtRQUN4QiwwQkFBMEI7UUFDMUIscUJBQXFCO1FBQ3JCLGtCQUFrQjtRQUNsQjtZQUNJLE9BQU8sRUFBRSx5QkFBeUI7WUFDbEMsV0FBVyxFQUFFLGlCQUFpQjtTQUNqQztLQUNKLG1IQTZDa0MsVUFBVSxvSEFHZCxVQUFVLDhHQUdiLFVBQVUsdUlBR00sVUFBVSx5R0FHbEIsVUFBVSxrSEFHSSxVQUFVLG9EQzlHaEUsbStKQXlGQTs0RkRoQ2EsaUJBQWlCO2tCQXRCN0IsU0FBUzsrQkFDSSx1QkFBdUIsYUFFdEI7d0JBQ1AsVUFBVTt3QkFDVixZQUFZO3dCQUNaLDBCQUEwQjt3QkFDMUIsd0JBQXdCO3dCQUN4QiwwQkFBMEI7d0JBQzFCLHFCQUFxQjt3QkFDckIsa0JBQWtCO3dCQUNsQjs0QkFDSSxPQUFPLEVBQUUseUJBQXlCOzRCQUNsQyxXQUFXLG1CQUFtQjt5QkFDakM7cUJBQ0osUUFDSzt3QkFDRixpQ0FBaUMsRUFBRSx5Q0FBeUM7d0JBQzVFLDJCQUEyQixFQUFFLGtDQUFrQzt3QkFDL0Qsa0NBQWtDLEVBQUUsMERBQTBEO3FCQUNqRztnYUF5Q0QsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJN0QsZUFBZTtzQkFEZCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJekQsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJdEQscUJBQXFCO3NCQURwQixTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUl2RSxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUdDLHdCQUF3QjtzQkFBdkYsWUFBWTt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBRzlELGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBPbkluaXQsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgTmdab25lLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgVmlld0NoaWxkLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSwgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVkaXRvciwgVHJhbnNmb3JtcyB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IEFuZ3VsYXJFZGl0b3IgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IFRoZUVkaXRvciwgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQsIFBsdWdpbktleXMsIFRoZVBsdWdpbk9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvc2VsZWN0b3InO1xuaW1wb3J0IHsgVGFibGVDZWxsRWxlbWVudCwgVGFibGVFbGVtZW50LCBUYWJsZVJvd0VsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jdXN0b20tdHlwZXMnO1xuaW1wb3J0IHsgQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90YWJsZS1jb250ZXh0bWVudS5zZXJ2aWNlJztcbmltcG9ydCB7IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSwgZ2V0RWxlbWVudEhlaWdodCwgZ2V0RWxlbWVudFdpZHRoIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgVGFibGVQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi90YWJsZS5zdG9yZSc7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi90YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IEhFQURFUl9DRUxMX0NMQVNTLCBUYWJsZU9wdGlvbnMsIFRoZVBsdWdpblRhYmxlT3B0aW9uLCBUaGVUYWJsZUNvbHVtbiwgVEhFX1RBQkxFX0NPTVBPTkVOVF9UT0tFTiB9IGZyb20gJy4uL3RhYmxlLnR5cGVzJztcbmltcG9ydCB7IGlzVmlydHVhbEtleSB9IGZyb20gJy4uL3V0aWxzL2lzLXZpcnR1YWwta2V5JztcbmltcG9ydCB7IGdldFBsdWdpbk9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IFRhYmxlRnJlZXplQ29sdW1uUGlwZSwgVGFibGVGcmVlemVSb3dQaXBlIH0gZnJvbSAnLi4vdGFibGUucGlwZSc7XG5pbXBvcnQgeyBERUZBVUxUX1NDUk9MTF9DT05UQUlORVIgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0ICogYXMgVGhlVHJhbnNmb3JtcyBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1zJztcbmltcG9ydCB7IGlzTWFjIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvb3MtbmFtZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndGhlLXRhYmxlLCBbdGhlVGFibGVdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBUYWJsZVN0b3JlLFxuICAgICAgICBUYWJsZVNlcnZpY2UsXG4gICAgICAgIFRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLFxuICAgICAgICBUYWJsZUNlbGxFdmVudERpc3BhdGNoZXIsXG4gICAgICAgIENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLFxuICAgICAgICBUYWJsZUZyZWV6ZUNvbHVtblBpcGUsXG4gICAgICAgIFRhYmxlRnJlZXplUm93UGlwZSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVEhFX1RBQkxFX0NPTVBPTkVOVF9UT0tFTixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBUaGVUYWJsZUNvbXBvbmVudFxuICAgICAgICB9XG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3MudGhlLXRhYmxlLXdpdGgtY29udHJvbHNdJzogJ2lzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzQ2VsbFNlbGVjdGluZycsXG4gICAgICAgICdbY2xhc3MudGhlLW51bWJlcmQtdGFibGVdJzogJ2VsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uJyxcbiAgICAgICAgJ1tjbGFzcy50aGUtdGFibGUtc2VsZWN0aW9uLWhpZGVdJzogJ3RhYmxlU3RvcmUuaXNDZWxsU2VsZWN0aW5nIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgVGhlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBUaGVCYXNlRWxlbWVudENvbXBvbmVudDxUYWJsZUVsZW1lbnQsIEVkaXRvcj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgaGVhZGVyUm93ID0gZmFsc2U7XG5cbiAgICBkZXN0cm95JDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcblxuICAgIHJvd0NvbnRyb2xzOiB7IGhlaWdodDogbnVtYmVyOyByb3dJbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgY29sQ29udHJvbHMgPSBbXTtcblxuICAgIGlzSW5UYWJsZTogYm9vbGVhbjtcblxuICAgIHRhYmxlUGx1Z2luT3B0aW9uczogVGhlUGx1Z2luT3B0aW9uPFRoZVBsdWdpblRhYmxlT3B0aW9uPjtcblxuICAgIGlzU3RpY2t5VG9wOiBib29sZWFuO1xuXG4gICAgc2Nyb2xsQ29udGFpbmVyVG9wOiBudW1iZXI7XG5cbiAgICBzY3JvbGxDb250YWluZXJSZWY6IFN1YnNjcmlwdGlvbjtcblxuICAgIGdldCBjb2x1bW5zKCk6IFRoZVRhYmxlQ29sdW1uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50ICYmIHRoaXMuZWxlbWVudC5jb2x1bW5zO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCB0Ym9keU5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50Ym9keUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2VsZWN0ZWRBbGxDZWxsKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4Lmxlbmd0aCA9PT0gdGhpcy5yb3dDb250cm9scy5sZW5ndGggJiZcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RlZENvbHVtbnNJbmRleC5sZW5ndGggPT09IHRoaXMuY29sQ29udHJvbHMubGVuZ3RoXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgndGFibGVXcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0YWJsZVdyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgndGhlVGFibGUnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRoZVRhYmxlRWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Rib2R5JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0Ym9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdjb2x1bW5Db250cm9sc1dyYXBwZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBjb2x1bW5Db250cm9sc1dyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29ybmVyQ29udHJvbCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvcm5lckNvbnRyb2w6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93Q29udHJvbHNCdXR0b25XcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcjogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVRoZUVkaXRvci5pc0ZvY3VzZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICBUaGVFZGl0b3IuZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50LCB7IGRpcmVjdGlvbjogJ2xlZnQnIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuZW1pdFRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5nZXRJc0luVGFibGUoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29sQ29udHJvbHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhlYWRlclJvdyA9IHRoaXMuZ2V0SGVhZGVyUm93KCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwdWJsaWMgZXZlbnREaXNwYXRjaGVyOiBUYWJsZUNlbGxFdmVudERpc3BhdGNoZXIsXG4gICAgICAgIHB1YmxpYyByZXNpemVOb3RpZmllcjogQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsXG4gICAgICAgIHB1YmxpYyB0YWJsZVN0b3JlOiBUYWJsZVN0b3JlLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHVibGljIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwdWJsaWMgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2U6IFRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGZyZWV6ZUNvbHVtblBpcGU6IFRhYmxlRnJlZXplQ29sdW1uUGlwZSxcbiAgICAgICAgcHVibGljIGZyZWV6ZVJvd1BpcGU6IFRhYmxlRnJlZXplUm93UGlwZSxcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNkcik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuZ2V0Q29sQ29udHJvbHMoKTtcbiAgICAgICAgdGhpcy5nZXRJc0luVGFibGUoKTtcbiAgICAgICAgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMgPSBnZXRQbHVnaW5PcHRpb25zPFRoZVBsdWdpblRhYmxlT3B0aW9uPih0aGlzLmVkaXRvciwgUGx1Z2luS2V5cy50YWJsZSk7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5zaG93RnVsbHNjcmVlbiAmJiB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucy5mdWxsc2NyZWVuQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGx1Z2luT3B0aW9uc1xuICAgICAgICAgICAgICAgIC5mdWxsc2NyZWVuQWN0aW9uKHRoaXMuZWRpdG9yKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmlzRnVsbHNjcmVlbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0V3JhcHBlcldpZHRoKCkge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMubmF0aXZlRWxlbWVudC5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YWJsZUNvbnRhaW5lcilbJ3BhZGRpbmdMZWZ0J10pO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRhYmxlQ29udGFpbmVyLm9mZnNldFdpZHRoIC0gcGFkZGluZ0xlZnQ7XG4gICAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb21wYXRpYmxlIHdpdGggb2xkIGRhdGFcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGdldEhlYWRlclJvdygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8ub3B0aW9ucz8uaGVhZGVyUm93KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21wYXQgb2xkIGRhdGFcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8uY2hpbGRyZW5bMF0uaGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tDYXJkRWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZXN0KCdzbGF0ZS1ibG9jay1jYXJkJyk7XG4gICAgICAgICAgICBpZiAoYmxvY2tDYXJkRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGJsb2NrQ2FyZEVsZW1lbnQuY2xhc3NMaXN0LmFkZChgc2xhdGUtYmxvY2stY2FyZC0ke3RoaXMuZWxlbWVudC50eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmluaXRFZGl0b3IodGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlQ2VsbHNDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlQ2VsbFBvc2l0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblRhYmxlQ29udGV4dE1lbnVFdmVudCgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lck9uU2VsZWN0ZWRDZWxscygpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5LZXlkb3duU2VsZWN0RXZlbnRzKCk7XG4gICAgICAgICAgICAvLyDmsLTlubPmu5rliqjml7blpITnkIbmu5rliqjpmLTlvbFcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFRhYmxlU2Nyb2xsaW5nU2hhZG93KCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkSW1hZ2VEb25lID0gYXdhaXQgdGhpcy5yZXNvbHZlSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAvLyDnrYnlvoXluo/lj7fliJfooajmoLzlhoXlm77niYfliqDovb3lrozmiJDlkI7lho3ljrvmuLLmn5PooajmoLzooYzpq5jluqZcbiAgICAgICAgICAgICAgICBpZiAobG9hZEltYWdlRG9uZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlUm93Q29udHJvbHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyQ2VsbFN0eWxlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVNjcm9sbENvbnRhaW5lclNjcm9sbCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVTY3JvbGxDb250YWluZXJTY3JvbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lclJlZikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJSZWYudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyUmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXIgPSB0aGlzLmVkaXRvci5vcHRpb25zPy5zY3JvbGxDb250YWluZXIgfHwgREVGQVVMVF9TQ1JPTExfQ09OVEFJTkVSO1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbG9zZXN0KHNjcm9sbENvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudFRvcCA9ICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJSZWYgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oc2Nyb2xsQ29udGFpbmVyRWxlbWVudCwgJ3Njcm9sbCcpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZWxlbWVudFRvcCAtIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmlzSW5UYWJsZSA/IDAgOiAzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbEhlaWdodCA9IHNjcm9sbFRvcCAtIChkaXN0YW5jZSArIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5VG9wID0gc2Nyb2xsSGVpZ2h0ID4gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gdGhpcy5jYWxjdWxhdGVSb3dDb250cm9scygpWzBdPy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDmoIfpopjooYzlhoXlrrnotoXov4flm7rlrprpq5jluqbml7bnp7vpmaTlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wICYmIHRoaXMuZnJlZXplUm93UGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLmhlYWRlclJvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhIZWFkZXJSb3dIZWlnaHQgPSAoMjQgKyA4KSAqIDExOyAvLyDotoXlh7ogMTEg6KGM77yM5Y+W5raI5Ya757uTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreVRvcCA9IGhlYWRlclJvd0hlaWdodCA8PSBtYXhIZWFkZXJSb3dIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDmu5rliqjotoXlh7rooajmoLzmgLvpq5jluqblkI7np7vpmaTlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU3RpY2t5VG9wICYmIHRoaXMuZnJlZXplUm93UGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLmhlYWRlclJvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZUhlaWdodCA9IHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHMoKS5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91cyArIGN1cnJlbnQuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuaXNJblRhYmxlID8gMTEgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBzY3JvbGxIZWlnaHQgPD0gdGFibGVIZWlnaHQgLSBoZWFkZXJSb3dIZWlnaHQgKyBidWZmZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RpY2t5VG9wO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGlja3lSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJDZWxsU3R5bGUoKSB7XG4gICAgICAgIGxldCBoZWFkZXJSb3dDZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgbGV0IGhlYWRlckNvbHVtbkNlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0uY2hpbGRyZW5bMF0pO1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVyUm93KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhlYWRlckNlbGxTdHlsZShoZWFkZXJSb3dDZWxscyk7XG4gICAgICAgICAgICBoZWFkZXJSb3dDZWxscyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVIZWFkZXJDZWxsU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGVhZGVyQ2VsbHMgPSBoZWFkZXJSb3dDZWxscy5jb25jYXQoaGVhZGVyQ29sdW1uQ2VsbHMpLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIGlmICh0aGlzLmhlYWRlclJvdyAmJiB0aGlzLmVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uKSB7XG4gICAgICAgICAgICBoZWFkZXJDZWxscy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXJDZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhlYWRlckNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyQ29sdW1uU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICB0aGlzLnNldEhlYWRlclJvd1N0eWxlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSGVhZGVyQ2VsbFN0eWxlKGNlbGxzOiBUYWJsZUNlbGxFbGVtZW50W10pIHtcbiAgICAgICAgY2VsbHMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbEVsZW1lbnQgPSBUaGVFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyQ29sdW1uU3R5bGUoY2VsbHM6IFRhYmxlQ2VsbEVsZW1lbnRbXSkge1xuICAgICAgICBsZXQgaGVhZGVyQ29sdW1uQ2VsbHMgPSBbXTtcbiAgICAgICAgaWYgKGNlbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKGl0ZW0gPT4gaXRlbS5jaGlsZHJlblswXSkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRlckNvbHVtbkNlbGxzID0gY2VsbHMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKTtcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJDb2x1bW5DZWxscy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNlbGxFbGVtZW50LCAndGhlLXN0aWNreS1jZWxsJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY2VsbEVsZW1lbnQsICd0aGUtc3RpY2t5LWNlbGwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyUm93U3R5bGUoKSB7XG4gICAgICAgIHRoaXMuc2V0R3JpZENvbHVtbnNTdHlsZSgpO1xuICAgICAgICAvLyBzZXRUaW1lb3V077yaIOmcgOimgeetieW+hSByb3dDb250cm9scyDlnKggZG9tIOS4rea4suafk+WujOavleWQjuaJjeiDveiOt+WPluWIsCByb3dDb250cm9sQnV0dG9uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGlja3lSb3dTdHlsZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRHcmlkQ29sdW1uc1N0eWxlKCkge1xuICAgICAgICBjb25zdCBjb2xDb250cm9sID0gdGhpcy5jb2x1bW5Db250cm9sc1dyYXBwZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5IHRyJyk7XG4gICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmlzSW5UYWJsZSA/IFtjb2xDb250cm9sLCBoZWFkZXJSb3ddIDogW2hlYWRlclJvd107XG4gICAgICAgIGlmICh0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3cpKSB7XG4gICAgICAgICAgICBsZXQgZ3JpZENvbHVtbnMgPSAnJztcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUGFkZGluZyA9IDQ0O1xuICAgICAgICAgICAgbGV0IHRhYmxlV2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIHRhYmxlV2lkdGggPSB0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gPyB0YWJsZVdpZHRoIC0gdGFibGVQYWRkaW5nIDogdGFibGVXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvd0NlbGxzID0gaGVhZGVyUm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyk7XG4gICAgICAgICAgICBoZWFkZXJSb3dDZWxscy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGdyaWRDb2x1bW5zICs9IGl0ZW0ub2Zmc2V0V2lkdGggKyAncHggJztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RpY2t5Um93cy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJywgZ3JpZENvbHVtbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3dpZHRoJywgdGFibGVXaWR0aCArICdweCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGlja3lSb3dTdHlsZSgpIHtcbiAgICAgICAgY29uc3Qgc3RpY2t5VGFibGVDbGFzcyA9ICd0aGUtdGFibGUtd2l0aC1zdGlja3ktcm93JztcbiAgICAgICAgY29uc3QgY29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keSB0cicpO1xuICAgICAgICBjb25zdCByb3dDb250cm9sQnV0dG9uID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29ybmVyQnRuID0gdGhpcy5jb3JuZXJDb250cm9sLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvd0hlaWdodCA9IHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHMoKVswXT8uaGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCAmJiB0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3cpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgc3RpY2t5VGFibGVDbGFzcyk7XG4gICAgICAgICAgICBjb25zdCBudW1iZXJlZENvbHVtbiA9IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbjtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93LCAndG9wJywgdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyAncHgnKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbiA/IDAgOiA4OyAvLyBtYXJnaW4tYm90dG9tXG4gICAgICAgICAgICBpZiAodGhpcy5pc0luVGFibGUgfHwgbnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBbY29sQ29udHJvbCwgdGFibGVDb3JuZXJCdG4sIHJvd0NvbnRyb2xCdXR0b25dLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbSAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0sICd0b3AnLCB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArICdweCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnbWFyZ2luLXRvcCcsIGhlYWRlclJvd0hlaWdodCArIGJ1ZmZlciArICdweCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsIHN0aWNreVRhYmxlQ2xhc3MpO1xuICAgICAgICAgICAgW2hlYWRlclJvdywgY29sQ29udHJvbCwgdGFibGVDb3JuZXJCdG4sIHJvd0NvbnRyb2xCdXR0b25dLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3RvcCcsIG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdtYXJnaW4tdG9wJywgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKSB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gbmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICBjb25zdCBzY3JvbGxXaWR0aCA9IG5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgIGNvbnN0IGNsaWVudFdpZHRoID0gbmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgY29uc3QgaXNMZWZ0U2hhZG93ID0gc2Nyb2xsTGVmdCA+IDA7XG4gICAgICAgIGNvbnN0IGlzUmlnaHRTaGFkb3cgPSBzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGggPCBzY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3Qgcm93cyA9IG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgdHJgKTtcbiAgICAgICAgY29uc3Qgc3RpY2t5Q2VsbHMgPSBBcnJheS5mcm9tKHJvd3MpLm1hcChpdGVtID0+IGl0ZW0ucXVlcnlTZWxlY3RvcigndGgnKSB8fCBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3RkJykpO1xuICAgICAgICBjb25zdCBpc0NvbHVtbkhlYWRlciA9IHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gaXNDb2x1bW5IZWFkZXIgPyBzdGlja3lDZWxscyA6IFtuYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRdO1xuICAgICAgICBpZiAoaXNMZWZ0U2hhZG93KSB7XG4gICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGhlLXRhYmxlLWxlZnQtc2hhZG93Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCd0aGUtdGFibGUtbGVmdC1zaGFkb3cnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JpZ2h0U2hhZG93KSB7XG4gICAgICAgICAgICBuYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGhlLXRhYmxlLXJpZ2h0LXNoYWRvdycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3RoZS10YWJsZS1yaWdodC1zaGFkb3cnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNjcmliZUNlbGxQb3NpdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuY2VsbHNQb3NpdGlvbkNoYW5nZSgpXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVDZWxsc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuZGFuZ2Vyb3VzT3JTZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVzZVJvd0NvbnRyb2xzKCkge1xuICAgICAgICBpZiAoKHRoaXMuc2VsZWN0aW9uICYmICF0aGlzLnJlYWRvbmx5KSB8fCB0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gfHwgdGhpcy50YWJsZVN0b3JlLmlzQ2VsbFNlbGVjdGluZykge1xuICAgICAgICAgICAgdGhpcy5yb3dDb250cm9scyA9IHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRldGVjdENoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVNaW5Sb3dTcGFuQ2VsbEZvclJvd3MoKTogeyBjZWxsPzogVGFibGVDZWxsRWxlbWVudDsgcm93SW5kZXg6IG51bWJlciB9W10ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgY29uc3QgY2VsbHMgPSB0YWJsZS5jaGlsZHJlbi5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vSGlkZGVuQ2VsbHMgPSByb3cuY2hpbGRyZW4uZmlsdGVyKGNlbGwgPT4gIWNlbGwuaGlkZGVuKTtcbiAgICAgICAgICAgIGlmIChub0hpZGRlbkNlbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW5Sb3dzcGFuID0gTWF0aC5taW4uYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgIE1hdGgsXG4gICAgICAgICAgICAgICAgICAgIG5vSGlkZGVuQ2VsbHMubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwucm93c3BhbiB8fCAxO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gcm93LmNoaWxkcmVuLmZpbmQoaXRlbSA9PiAhaXRlbS5oaWRkZW4gJiYgKGl0ZW0ucm93c3BhbiB8fCAxKSA9PT0gbWluUm93c3Bhbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbCxcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVSb3dDb250cm9scygpIHtcbiAgICAgICAgY29uc3QgbWluUm93U3BhbkNlbGxGb3JSb3dzID0gdGhpcy5jYWxjdWxhdGVNaW5Sb3dTcGFuQ2VsbEZvclJvd3MoKTtcblxuICAgICAgICBjb25zdCByb3dDb250cm9scyA9IFtdO1xuICAgICAgICBsZXQgcHJldmlvdXNSb3dJbmRleCA9IDA7XG4gICAgICAgIGxldCBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA9IDA7XG4gICAgICAgIG1pblJvd1NwYW5DZWxsRm9yUm93cy5mb3JFYWNoKChjZWxsSW5mbywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghY2VsbEluZm8uY2VsbCkge1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2xzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tYmluZVJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBtaW5Sb3dTcGFuQ2VsbEZvclJvd3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzQXZnSGVpZ2h0KHByZXZpb3VzQ29tYmluZVJvd0luZGV4LCBwcmV2aW91c1Jvd0luZGV4LCByb3dDb250cm9scyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGNvbWJpbmUgcm93IGhlaWdodFxuICAgICAgICAgICAgaWYgKHByZXZpb3VzQ29tYmluZVJvd0luZGV4ID4gcHJldmlvdXNSb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHNBdmdIZWlnaHQocHJldmlvdXNDb21iaW5lUm93SW5kZXgsIHByZXZpb3VzUm93SW5kZXgsIHJvd0NvbnRyb2xzKTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNlbGxEb20gPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgY2VsbEluZm8uY2VsbCk7XG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChjZWxsRG9tKTtcbiAgICAgICAgICAgIC8vIOW9k2NlbGzkuLrlkIjlubbnmoTljZXlhYPmoLwocm93c3BhbiA+IDEp77yM6K6h566X5YW25a6e6ZmF6auY5bqm77yI5b2T5YmN5Y2V5YWD5qC855qE6auY5bqmIC0g5LiL5pa55ZCI5bm25Y2V5YWD5qC855qE6auY5bqm77yJXG4gICAgICAgICAgICBpZiAoY2VsbEluZm8uY2VsbC5yb3dzcGFuID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGNIZWlnaHQgPSBoZWlnaHQgLSB0aGlzLmdldEJlbG93Um93SGVpZ2h0KG1pblJvd1NwYW5DZWxsRm9yUm93cywgaW5kZXgsIGNlbGxJbmZvLnJvd0luZGV4LCBjZWxsSW5mby5jZWxsLnJvd3NwYW4pO1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2xzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNhbGNIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBjZWxsSW5mby5yb3dJbmRleFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByb3dDb250cm9scy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogY2VsbEluZm8ucm93SW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzUm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByb3dDb250cm9scztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVSb3dDb250cm9sc0F2Z0hlaWdodChcbiAgICAgICAgcHJldmlvdXNDb21iaW5lUm93SW5kZXg6IG51bWJlcixcbiAgICAgICAgcHJldmlvdXNSb3dJbmRleDogbnVtYmVyLFxuICAgICAgICByb3dDb250cm9sczogeyBoZWlnaHQ6IG51bWJlcjsgcm93SW5kZXg6IG51bWJlciB9W11cbiAgICApIHtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbCA9IHJvd0NvbnRyb2xzW3ByZXZpb3VzUm93SW5kZXhdO1xuICAgICAgICBjb25zdCBjb3VudCA9IHByZXZpb3VzQ29tYmluZVJvd0luZGV4IC0gcHJldmlvdXNSb3dJbmRleDtcbiAgICAgICAgY29uc3QgYXZnSGVpZ2h0ID0gTWF0aC5mbG9vcihyb3dDb250cm9sLmhlaWdodCAvIChjb3VudCArIDEpKTtcbiAgICAgICAgY29uc3QgZmlyc3RIZWlnaHQgPSByb3dDb250cm9sLmhlaWdodCAtIGF2Z0hlaWdodCAqIGNvdW50O1xuICAgICAgICByb3dDb250cm9sLmhlaWdodCA9IGZpcnN0SGVpZ2h0O1xuICAgICAgICByb3dDb250cm9sc1xuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSwgX2luZGV4KSA9PiBfaW5kZXggPiBwcmV2aW91c1Jvd0luZGV4ICYmIF9pbmRleCA8PSBwcmV2aW91c0NvbWJpbmVSb3dJbmRleClcbiAgICAgICAgICAgIC5mb3JFYWNoKHJvd0NvbnRyb2wgPT4ge1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2wuaGVpZ2h0ID0gYXZnSGVpZ2h0O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QmVsb3dSb3dIZWlnaHQoXG4gICAgICAgIGNlbGxzOiB7XG4gICAgICAgICAgICBjZWxsPzogVGFibGVDZWxsRWxlbWVudDtcbiAgICAgICAgICAgIHJvd0luZGV4OiBudW1iZXI7XG4gICAgICAgIH1bXSxcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgcm93SW5kZXg6IG51bWJlcixcbiAgICAgICAgcm93c3BhbjogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIGxldCBiZWxvd1Jvd2xIZWlnaHQgPSAwO1xuICAgICAgICBjZWxscy5zbGljZShpbmRleCArIDEsIGNlbGxzLmxlbmd0aCkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKCFpdGVtLmNlbGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm93SW5kZXggKyByb3dzcGFuID4gaXRlbS5yb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxEb20gPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbS5jZWxsKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jZWxsLnJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOS4i+aWueWNleWFg+agvOeahHJvd3NwYW4gPiAx77yM6YCS5b2S6K6h566XXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZ2V0QmVsb3dSb3dIZWlnaHQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxscyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzLmZpbmRJbmRleChjZWxsID0+IGNlbGwucm93SW5kZXggPT09IGl0ZW0ucm93SW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5yb3dJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2VsbC5yb3dzcGFuXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93Um93bEhlaWdodCArPSBnZXRFbGVtZW50SGVpZ2h0KGNlbGxEb20pIC0gaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93Um93bEhlaWdodCArPSBnZXRFbGVtZW50SGVpZ2h0KGNlbGxEb20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiZWxvd1Jvd2xIZWlnaHQ7XG4gICAgfVxuXG4gICAgcmVzb2x2ZUltYWdlKCkge1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnRzID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xuICAgICAgICBpZiAoaW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUmVzb2x2ZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgICAgICBpbWFnZUVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUxvYWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbWFnZVJlc29sdmVzLnB1c2goaW1hZ2VMb2FkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGltYWdlUmVzb2x2ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29sQ29udHJvbHMoKSB7XG4gICAgICAgIHRoaXMuY29sQ29udHJvbHMgPSB0aGlzLmVsZW1lbnQ/LmNoaWxkcmVuWzBdPy5jaGlsZHJlbiB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXRJc0luVGFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yLnNlbGVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCB0aGlzLmVkaXRvciwgc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgdGhpcy5lZGl0b3IsIHNlbGVjdGlvbi5mb2N1cy5wYXRoKTtcbiAgICAgICAgICAgIHRoaXMuaXNJblRhYmxlID0gc3RhcnRQb3NpdGlvbi5pc0luVGFibGUoKSAmJiBlbmRQb3NpdGlvbi5pc0luVGFibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNJblRhYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0aWFsaXplQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5jb2x1bW5zKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gW107XG4gICAgICAgICAgICB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2NvbCcpLmZvckVhY2goKGVsZTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb21wYXRpYmxlIHdpdGggdGhlIHByb2JsZW0gdGhhdCB0aGUgd2lkdGggY2Fubm90IGJlIG9idGFpbmVkIHVuZGVyIHNhZmFyaSAjV0lLLTk2NDNcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goeyB3aWR0aDogZWxlLmNsaWVudFdpZHRoIHx8IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShlbGUuc3R5bGUud2lkdGgpIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBFZGl0b3IgY29udGFpbmVyIHdpZHRoIGNoYW5nZXMsIHJlc3VsdGluZyBpbiBjb2x1bW4gd2lkdGhzIG5vIGxvbmdlciB2YWxpZCAjV0lLLTY3NjZcbiAgICAgICAgICAgIGNvbnN0IHdhcm5pbmcgPSB0aGlzLmVsZW1lbnQuY29sdW1ucy5zb21lKChjb2wsIGluZGV4KSA9PiBjb2wud2lkdGggIT09IGNvbHVtbnNbaW5kZXhdPy53aWR0aCk7XG4gICAgICAgICAgICBpZiAod2FybmluZykge1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ciA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXSBhcyBUYWJsZVJvd0VsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVdpZHRoID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRyKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0ci5jaGlsZHJlbi5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IE51bWJlcigodGFibGVXaWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aCAtIHRyLmNoaWxkcmVuLmxlbmd0aCkudG9GaXhlZCgyKSkgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxpemVSb3dzKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKHJvdyA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvdy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgcm93KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0OiBnZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQpIH0sIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybVJvd0hlaWdodCgpIHtcbiAgICAgICAgY29uc3Qgcm93RWxlbWVudHMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGJvZHknKS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKHJvd0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAoWy4uLnJvd0VsZW1lbnRzXSBhcyBIVE1MVGFibGVSb3dFbGVtZW50W10pLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGdldEVsZW1lbnRIZWlnaHQocm93KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0IH0sIHRoaXMuZWxlbWVudC5jaGlsZHJlbltpbmRleF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1Db2x1bW5zV2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSBbLi4udGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NvbGdyb3VwJykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZUNvbEVsZW1lbnRbXTtcbiAgICAgICAgY29uc3QgY29sdW1uczogVGhlVGFibGVDb2x1bW5bXSA9IGNvbHMubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogZ2V0RWxlbWVudFdpZHRoKGNvbCkgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgb25Db2xNb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghIXRoaXMuc2VsZWN0aW9uICYmIHRoaXMuaXNJblRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJEYW5nZXJvdXNDZWxscygpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENvbHVtbih0aGlzLmVkaXRvciwgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuYWZ0ZXJTZWxlY3RlZENlbGxzKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUm93TW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoIXRoaXMuaXNJblRhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gVGhlRWRpdG9yLmZpbmRQYXRoKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QodGhpcy5lZGl0b3IsIHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RSb3codGhpcy5lZGl0b3IsIGluZGV4KTtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuYWZ0ZXJTZWxlY3RlZENlbGxzKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBvblNlbGVjdFRhYmxlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0VGFibGUodGhpcy5lZGl0b3IpO1xuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5hZnRlclNlbGVjdGVkQ2VsbHMoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIGxpc3RlblRhYmxlQ29udGV4dE1lbnVFdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdjb250ZXh0bWVudScpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQtY2VsbCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENlbGwoY2VsbCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmlzT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3NlQ29udGV4dE1lbnUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRhYmxlU2VydmljZS5pc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VUb29sYmFyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhdGNoIGZvciByaWdodCBjbGljayBzZWxlY3QgbmV4dCBjZWxsXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yLnNlbGVjdGlvbi5hbmNob3IucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lck9uU2VsZWN0ZWRDZWxscygpIHtcbiAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZWRvd24nKS5waXBlKGZpbHRlcigoZTogTW91c2VFdmVudCkgPT4gZS5idXR0b24gIT09IDIpKSxcbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKS5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzVmlydHVhbEtleShlKSAmJiAhdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5pc09wZW5lZDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50YWJsZVN0b3JlLnNlbGVjdGVkQ2VsbHMgJiYgdGhpcy50YWJsZVN0b3JlLnNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAna2V5ZG93bicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyU2VsZWN0ZWRDZWxsc0NvbnRlbnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50VGFibGVFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudFRhYmxlRWxlbWVudCB8fCAhdGhpcy50YWJsZVN0b3JlLmlzTW9kU2VsZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhclNlbGVjdGVkQ2VsbHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRUYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyTGFzdEZvY3VzUGF0aCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5jbG9zZVRvb2xiYXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGtleWRvd25cbiAgICBsaXN0ZW5LZXlkb3duU2VsZWN0RXZlbnRzKCkge1xuICAgICAgICBjb25zdCBjdHJsS2V5ID0gaXNNYWMoKSA/IFsnTWV0YSddIDogWydDb250cm9sJ107XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gISFlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3RybEtleS5pbmNsdWRlcyhldmVudC5rZXkpICYmICF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNNb2RTZWxlY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXl1cCcpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiAhIWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdHJsS2V5LmluY2x1ZGVzKGV2ZW50LmtleSkgJiYgIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc01vZFNlbGVjdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyYWNrQnlGblJvd0NvbnRyb2xzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIHRyYWNrQnlGbkNvbENvbnRyb2xzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyUmVmLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lclJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvbnRhaW5lclwiIHRoZUNvbHVtblJlc2l6ZT5cbiAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9scy13cmFwcGVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scyB0aGUtc3RpY2t5LWNvcm5lci1jb250cm9sc1wiXG4gICAgICAgICAgICAjY29ybmVyQ29udHJvbFxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgIHZpc2libGU6ICFyZWFkb25seSAmJiAoaXNJblRhYmxlIHx8IHRhYmxlU3RvcmUuaXNDZWxsU2VsZWN0aW5nKSxcbiAgICAgICAgICAgICAgICBhY3RpdmU6IGlzU2VsZWN0ZWRBbGxDZWxsLFxuICAgICAgICAgICAgICAgIGRhbmdlcm91czogdGFibGVTdG9yZS5pc1NlbGVjdGVkVGFibGUgJiYgdGFibGVTdG9yZS5kYW5nZXJvdXNDZWxscy5sZW5ndGggPiAwXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItYnV0dG9uXCIgKG1vdXNlZG93bik9XCJvblNlbGVjdFRhYmxlKCRldmVudClcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtY29ybmVyLWNvbnRyb2xzLWluc2VydC1yb3ctbWFya2VyXCIgKm5nSWY9XCIhZWxlbWVudC5vcHRpb25zPy5oZWFkZXJSb3dcIj5cbiAgICAgICAgICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJyb3dcIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMtaW5zZXJ0LWNvbHVtbi1tYXJrZXJcIiAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cImNvbHVtblwiIFthdF09XCIwXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPjwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9sc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1yb3ctY29udHJvbHMtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9scy1idXR0b24td3JhcFwiXG4gICAgICAgICAgICAgICAgICAgICNyb3dDb250cm9sc0J1dHRvbldyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2Ygcm93Q29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblJvd0NvbnRyb2xzXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiB0YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c1Jvd3NJbmRleC5pbmNsdWRlcyhjb250cm9sLnJvd0luZGV4KSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc0NlbGxTZWxlY3RpbmcpICYmICFlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Sb3dNb3VzZWRvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbiB0aGUtdGFibGUtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50RWRpdGFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uUm93TW91c2Vkb3duKCRldmVudCwgY29udHJvbC5yb3dJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLW51bWJlcmVkLWNvbnRyb2xzLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJyb3ctbnVtYmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj57eyBoZWFkZXJSb3cgJiYgaSA9PT0gMCA/ICcnIDogaGVhZGVyUm93ID8gaSA6IGkgKyAxIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJyb3dcIiBbYXRdPVwiY29udHJvbC5yb3dJbmRleCArIDFcIiBbdGFibGVTdG9yZV09XCJ0YWJsZVN0b3JlXCI+IDwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtd3JhcHBlclwiICN0YWJsZVdyYXBwZXIgW25nQ2xhc3NdPVwieyAndGhlLXRhYmxlLW51bWJlcmVkJzogZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gfVwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0aGUtdGFibGVcIiAjdGhlVGFibGU+XG4gICAgICAgICAgICA8Y29sZ3JvdXAgKm5nSWY9XCJjb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgPGNvbCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIiBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2wud2lkdGggKyAncHgnIH1cIiAvPlxuICAgICAgICAgICAgPC9jb2xncm91cD5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0aGUtdGFibGUtY29sLWNvbnRyb2xzLXdyYXBwZXIgdGhlLXN0aWNreS1yb3dcIiAjY29sdW1uQ29udHJvbHNXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgICNjb2xDb250cm9sXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRoZS10YWJsZS1jb2wtY29udHJvbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGUtc3RpY2t5LWNlbGwnOiBpID09PSAwICYmIGVsZW1lbnQgfCBmcmVlemVDb2x1bW4gOiB0YWJsZVBsdWdpbk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiB0YWJsZVN0b3JlLnNlbGVjdGVkQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcm91czogdGFibGVTdG9yZS5kYW5nZXJvdXNDb2x1bW5zSW5kZXguaW5jbHVkZXMoaSkgJiYgdGFibGVTdG9yZS5kYW5nZXJvdXNDZWxscy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Db2xNb3VzZWRvd24oJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udHJvbCBvZiBjb2xDb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuQ29sQ29udHJvbHNcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc0NlbGxTZWxlY3RpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdF09XCJpICsgMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudEVsZW1lbnRdPVwiY29sQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keSAjdGJvZHk+XG4gICAgICAgICAgICAgICAgPHNsYXRlLWNoaWxkcmVuIFtjaGlsZHJlbl09XCJjaGlsZHJlblwiIFtjb250ZXh0XT1cImNoaWxkcmVuQ29udGV4dFwiIFt2aWV3Q29udGV4dF09XCJ2aWV3Q29udGV4dFwiPiA8L3NsYXRlLWNoaWxkcmVuPlxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
707
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsVUFBVSxFQUtWLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUVmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQVUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0YsT0FBTyxF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Q2xCOzRCQUNJLE9BQU8sRUFBRSx5QkFBeUI7NEJBQ2xDLFdBQVcsbUJBQW1CO3lCQUNqQztxQkFDSixRQUNLO3dCQUNGLGlDQUFpQyxFQUFFLHlDQUF5Qzt3QkFDNUUsMkJBQTJCLEVBQUUsa0NBQWtDO3dCQUMvRCxrQ0FBa0MsRUFBRSwwREFBMEQ7cUJBQ2pHO2djQXNDRCxZQUFZO3NCQURYLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk3RCxlQUFlO3NCQURkLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUl6RCxZQUFZO3NCQURYLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUl0RCxxQkFBcUI7c0JBRHBCLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSXZFLGFBQWE7c0JBRFosU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR0Msd0JBQXdCO3NCQUF2RixZQUFZO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHOUQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIE9uRGVzdHJveSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBOZ1pvbmUsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRWRpdG9yLCBUcmFuc2Zvcm1zIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgVGhlRWRpdG9yLCBUaGVCYXNlRWxlbWVudENvbXBvbmVudCwgUGx1Z2luS2V5cywgVGhlUGx1Z2luT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc0hvdGtleSB9IGZyb20gJ2lzLWhvdGtleSc7XG5pbXBvcnQgeyBTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9zZWxlY3Rvcic7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSwgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RhYmxlLWNvbnRleHRtZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgY29lcmNlUGl4ZWxzRnJvbUNzc1ZhbHVlLCBnZXRFbGVtZW50SGVpZ2h0LCBnZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBUYWJsZVBvc2l0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVGFibGVTdG9yZSB9IGZyb20gJy4uL3RhYmxlLnN0b3JlJztcbmltcG9ydCB7IFRhYmxlU2VydmljZSB9IGZyb20gJy4uL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSEVBREVSX0NFTExfQ0xBU1MsIFRhYmxlT3B0aW9ucywgVGhlUGx1Z2luVGFibGVPcHRpb24sIFRoZVRhYmxlQ29sdW1uLCBUSEVfVEFCTEVfQ09NUE9ORU5UX1RPS0VOIH0gZnJvbSAnLi4vdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgaXNWaXJ0dWFsS2V5IH0gZnJvbSAnLi4vdXRpbHMvaXMtdmlydHVhbC1rZXknO1xuaW1wb3J0IHsgZ2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgVGFibGVGcmVlemVDb2x1bW5QaXBlLCBUYWJsZUZyZWV6ZVJvd1BpcGUgfSBmcm9tICcuLi90YWJsZS5waXBlJztcbmltcG9ydCAqIGFzIFRoZVRyYW5zZm9ybXMgZnJvbSAnLi4vLi4vLi4vdHJhbnNmb3Jtcyc7XG5pbXBvcnQgeyBUaGVDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbnRleHQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndGhlLXRhYmxlLCBbdGhlVGFibGVdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBUYWJsZVN0b3JlLFxuICAgICAgICBUYWJsZVNlcnZpY2UsXG4gICAgICAgIFRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLFxuICAgICAgICBUYWJsZUNlbGxFdmVudERpc3BhdGNoZXIsXG4gICAgICAgIENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLFxuICAgICAgICBUYWJsZUZyZWV6ZUNvbHVtblBpcGUsXG4gICAgICAgIFRhYmxlRnJlZXplUm93UGlwZSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVEhFX1RBQkxFX0NPTVBPTkVOVF9UT0tFTixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBUaGVUYWJsZUNvbXBvbmVudFxuICAgICAgICB9XG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3MudGhlLXRhYmxlLXdpdGgtY29udHJvbHNdJzogJ2lzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzQ2VsbFNlbGVjdGluZycsXG4gICAgICAgICdbY2xhc3MudGhlLW51bWJlcmQtdGFibGVdJzogJ2VsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uJyxcbiAgICAgICAgJ1tjbGFzcy50aGUtdGFibGUtc2VsZWN0aW9uLWhpZGVdJzogJ3RhYmxlU3RvcmUuaXNDZWxsU2VsZWN0aW5nIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgVGhlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBUaGVCYXNlRWxlbWVudENvbXBvbmVudDxUYWJsZUVsZW1lbnQsIEVkaXRvcj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgaGVhZGVyUm93ID0gZmFsc2U7XG5cbiAgICBpc1NlbGVjdGVkQWxsQ2VsbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZGVzdHJveSQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICByb3dDb250cm9sczogeyBoZWlnaHQ6IG51bWJlcjsgcm93SW5kZXg6IG51bWJlciB9W10gPSBbXTtcblxuICAgIGNvbENvbnRyb2xzID0gW107XG5cbiAgICBpc0luVGFibGU6IGJvb2xlYW47XG5cbiAgICB0YWJsZVBsdWdpbk9wdGlvbnM6IFRoZVBsdWdpbk9wdGlvbjxUaGVQbHVnaW5UYWJsZU9wdGlvbj47XG5cbiAgICBpc1N0aWNreVRvcDogYm9vbGVhbjtcblxuICAgIHNjcm9sbENvbnRhaW5lclRvcDogbnVtYmVyO1xuXG4gICAgdGFibGVXcmFwcGVyTWFyZ2luVG9wOiBudW1iZXIgPSAwO1xuXG4gICAgcHJldmlvdXNTY3JvbGxDb250YWluZXI6IHN0cmluZztcblxuICAgIGdldCBjb2x1bW5zKCk6IFRoZVRhYmxlQ29sdW1uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50ICYmIHRoaXMuZWxlbWVudC5jb2x1bW5zO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCB0Ym9keU5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50Ym9keUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgndGFibGVXcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0YWJsZVdyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgndGhlVGFibGUnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRoZVRhYmxlRWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Rib2R5JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0Ym9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdjb2x1bW5Db250cm9sc1dyYXBwZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBjb2x1bW5Db250cm9sc1dyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29ybmVyQ29udHJvbCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvcm5lckNvbnRyb2w6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93Q29udHJvbHNCdXR0b25XcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcjogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVRoZUVkaXRvci5pc0ZvY3VzZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICBUaGVFZGl0b3IuZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50LCB7IGRpcmVjdGlvbjogJ2xlZnQnIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuZW1pdFRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5nZXRJc0luVGFibGUoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29sQ29udHJvbHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhlYWRlclJvdyA9IHRoaXMuZ2V0SGVhZGVyUm93KCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwdWJsaWMgZXZlbnREaXNwYXRjaGVyOiBUYWJsZUNlbGxFdmVudERpc3BhdGNoZXIsXG4gICAgICAgIHB1YmxpYyByZXNpemVOb3RpZmllcjogQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsXG4gICAgICAgIHB1YmxpYyB0YWJsZVN0b3JlOiBUYWJsZVN0b3JlLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHVibGljIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwdWJsaWMgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2U6IFRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGZyZWV6ZUNvbHVtblBpcGU6IFRhYmxlRnJlZXplQ29sdW1uUGlwZSxcbiAgICAgICAgcHVibGljIGZyZWV6ZVJvd1BpcGU6IFRhYmxlRnJlZXplUm93UGlwZSxcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIGNvbnRleHRTZXJ2aWNlOiBUaGVDb250ZXh0U2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBjZHIpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgICAgIHRoaXMudGFibGVQbHVnaW5PcHRpb25zID0gZ2V0UGx1Z2luT3B0aW9uczxUaGVQbHVnaW5UYWJsZU9wdGlvbj4odGhpcy5lZGl0b3IsIFBsdWdpbktleXMudGFibGUpO1xuICAgICAgICBpZiAodGhpcy50YWJsZVBsdWdpbk9wdGlvbnMuc2hvd0Z1bGxzY3JlZW4gJiYgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMuZnVsbHNjcmVlbkFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnNcbiAgICAgICAgICAgICAgICAuZnVsbHNjcmVlbkFjdGlvbih0aGlzLmVkaXRvcilcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVTdG9yZS5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNTY3JvbGxDb250YWluZXIgPSB0aGlzLmVkaXRvci5vcHRpb25zLnNjcm9sbENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyID0gJy50aGUtZWRpdGFibGUtY29udGFpbmVyJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5wcmV2aW91c1Njcm9sbENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5VG9wID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5yZWJpbmRDb250YWluZXJTY3JvbGwoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5zZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNTZWxlY3RlZEFsbENlbGwgPSB0aGlzLnRhYmxlU3RvcmUuaXNTZWxlY3RlZEFsbENlbGwoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFdyYXBwZXJXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgdGFibGVDb250YWluZXIgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0xlZnQgPSBjb2VyY2VQaXhlbHNGcm9tQ3NzVmFsdWUod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFibGVDb250YWluZXIpWydwYWRkaW5nTGVmdCddKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0YWJsZUNvbnRhaW5lci5vZmZzZXRXaWR0aCAtIHBhZGRpbmdMZWZ0O1xuICAgICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29tcGF0aWJsZSB3aXRoIG9sZCBkYXRhXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBnZXRIZWFkZXJSb3coKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQ/Lm9wdGlvbnM/LmhlYWRlclJvdykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29tcGF0IG9sZCBkYXRhXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQ/LmNoaWxkcmVuWzBdLmhlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrQ2FyZEVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnc2xhdGUtYmxvY2stY2FyZCcpO1xuICAgICAgICAgICAgaWYgKGJsb2NrQ2FyZEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBibG9ja0NhcmRFbGVtZW50LmNsYXNzTGlzdC5hZGQoYHNsYXRlLWJsb2NrLWNhcmQtJHt0aGlzLmVsZW1lbnQudHlwZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pbml0RWRpdG9yKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgIHRoaXMuYmluZFRhYmxlU2Nyb2xsaW5nU2hhZG93KCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxQb3NpdGlvbkNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5UYWJsZUNvbnRleHRNZW51RXZlbnQoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJPblNlbGVjdGVkQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuS2V5ZG93blNlbGVjdEV2ZW50cygpO1xuICAgICAgICAgICAgLy8g5rC05bmz5rua5Yqo5pe25aSE55CG5rua5Yqo6Zi05b2xXG4gICAgICAgICAgICBmcm9tRXZlbnQodGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZEltYWdlRG9uZSA9IGF3YWl0IHRoaXMucmVzb2x2ZUltYWdlKCk7XG4gICAgICAgICAgICAgICAgLy8g562J5b6F5bqP5Y+35YiX6KGo5qC85YaF5Zu+54mH5Yqg6L295a6M5oiQ5ZCO5YaN5Y675riy5p+T6KGo5qC86KGM6auY5bqmXG4gICAgICAgICAgICAgICAgaWYgKGxvYWRJbWFnZURvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlckNlbGxTdHlsZSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVTY3JvbGxDb250YWluZXJTY3JvbGwoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlU2Nyb2xsQ29udGFpbmVyU2Nyb2xsKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNvbnRhaW5lclNjcm9sbGVkJFxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIG1hcChldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAodGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJUb3BIZWlnaHQgPSB0aGlzLmlzSW5UYWJsZSA/IC0xOSA6IDExO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gdGhpcy5jYWxjdWxhdGVSb3dDb250cm9scygpWzBdPy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSBjbGllbnRSZWN0LnRvcCArIGhlYWRlclRvcEhlaWdodCAtIHRoaXMudGFibGVXcmFwcGVyTWFyZ2luVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreVRvcCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIDw9IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgOCAmJiBjbGllbnRSZWN0LmJvdHRvbSAtIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wID49IGhlYWRlclJvd0hlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOagh+mimOihjOWGheWuuei2hei/h+WbuuWumumrmOW6puaXtuenu+mZpOWGu+e7k1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3AgJiYgdGhpcy5mcmVlemVSb3dQaXBlLnRyYW5zZm9ybSh0aGlzLmVsZW1lbnQsIHRoaXMuaGVhZGVyUm93KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heEhlYWRlclJvd0hlaWdodCA9ICgyNCArIDgpICogMTE7IC8vIOi2heWHuiAxMSDooYzvvIzlj5bmtojlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5VG9wID0gaGVhZGVyUm93SGVpZ2h0IDw9IG1heEhlYWRlclJvd0hlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RpY2t5VG9wO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJDZWxsU3R5bGUoKSB7XG4gICAgICAgIGxldCBoZWFkZXJSb3dDZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgbGV0IGhlYWRlckNvbHVtbkNlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0uY2hpbGRyZW5bMF0pO1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVyUm93KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhlYWRlckNlbGxTdHlsZShoZWFkZXJSb3dDZWxscyk7XG4gICAgICAgICAgICBoZWFkZXJSb3dDZWxscyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVIZWFkZXJDZWxsU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGVhZGVyQ2VsbHMgPSBoZWFkZXJSb3dDZWxscy5jb25jYXQoaGVhZGVyQ29sdW1uQ2VsbHMpLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIGlmICh0aGlzLmhlYWRlclJvdyAmJiB0aGlzLmVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uKSB7XG4gICAgICAgICAgICBoZWFkZXJDZWxscy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXJDZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhlYWRlckNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyQ29sdW1uU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICB0aGlzLnNldEhlYWRlclJvd1N0eWxlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSGVhZGVyQ2VsbFN0eWxlKGNlbGxzOiBUYWJsZUNlbGxFbGVtZW50W10pIHtcbiAgICAgICAgY2VsbHMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbEVsZW1lbnQgPSBUaGVFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyQ29sdW1uU3R5bGUoY2VsbHM6IFRhYmxlQ2VsbEVsZW1lbnRbXSkge1xuICAgICAgICBsZXQgaGVhZGVyQ29sdW1uQ2VsbHMgPSBbXTtcbiAgICAgICAgaWYgKGNlbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKGl0ZW0gPT4gaXRlbS5jaGlsZHJlblswXSkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRlckNvbHVtbkNlbGxzID0gY2VsbHMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKTtcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJDb2x1bW5DZWxscy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNlbGxFbGVtZW50LCAndGhlLXN0aWNreS1jZWxsJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoY2VsbEVsZW1lbnQsICd0aGUtc3RpY2t5LWNlbGwnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SGVhZGVyUm93U3R5bGUoKSB7XG4gICAgICAgIHRoaXMuc2V0R3JpZENvbHVtbnNTdHlsZSgpO1xuICAgICAgICAvLyBzZXRUaW1lb3V077yaIOmcgOimgeetieW+hSByb3dDb250cm9scyDlnKggZG9tIOS4rea4suafk+WujOavleWQjuaJjeiDveiOt+WPluWIsCByb3dDb250cm9sQnV0dG9uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGlja3lSb3dTdHlsZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRHcmlkQ29sdW1uc1N0eWxlKCkge1xuICAgICAgICBjb25zdCBjb2xDb250cm9sID0gdGhpcy5jb2x1bW5Db250cm9sc1dyYXBwZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5IHRyJyk7XG4gICAgICAgIGNvbnN0IHN0aWNreVJvd3MgPSB0aGlzLmlzSW5UYWJsZSA/IFtjb2xDb250cm9sLCBoZWFkZXJSb3ddIDogW2hlYWRlclJvd107XG4gICAgICAgIGlmICh0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3cpKSB7XG4gICAgICAgICAgICBsZXQgZ3JpZENvbHVtbnMgPSAnJztcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlUGFkZGluZyA9IDQ0O1xuICAgICAgICAgICAgbGV0IHRhYmxlV2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIHRhYmxlV2lkdGggPSB0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gPyB0YWJsZVdpZHRoIC0gdGFibGVQYWRkaW5nIDogdGFibGVXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvd0NlbGxzID0gaGVhZGVyUm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyk7XG4gICAgICAgICAgICBoZWFkZXJSb3dDZWxscy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGdyaWRDb2x1bW5zICs9IGl0ZW0ub2Zmc2V0V2lkdGggKyAncHggJztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RpY2t5Um93cy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJywgZ3JpZENvbHVtbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3dpZHRoJywgdGFibGVXaWR0aCArICdweCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGlja3lSb3dTdHlsZSgpIHtcbiAgICAgICAgY29uc3Qgc3RpY2t5VGFibGVDbGFzcyA9ICd0aGUtdGFibGUtd2l0aC1zdGlja3ktcm93JztcbiAgICAgICAgY29uc3QgY29sQ29udHJvbCA9IHRoaXMuY29sdW1uQ29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keSB0cicpO1xuICAgICAgICBjb25zdCByb3dDb250cm9sQnV0dG9uID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29ybmVyQnRuID0gdGhpcy5jb3JuZXJDb250cm9sLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvd0hlaWdodCA9IHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHMoKVswXT8uaGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCAmJiB0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3cpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgc3RpY2t5VGFibGVDbGFzcyk7XG4gICAgICAgICAgICBjb25zdCBudW1iZXJlZENvbHVtbiA9IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbjtcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuaXNJblRhYmxlID8gdGhpcy5zY3JvbGxDb250YWluZXJUb3AgKyAzNiA6IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3csICd0b3AnLCB0b3AgKyAncHgnKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbiA/IDAgOiA4OyAvLyBtYXJnaW4tYm90dG9tXG4gICAgICAgICAgICBpZiAodGhpcy5pc0luVGFibGUgfHwgbnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBbY29sQ29udHJvbCwgdGFibGVDb3JuZXJCdG4sIHJvd0NvbnRyb2xCdXR0b25dLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbSAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0sICd0b3AnLCB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArICdweCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50YWJsZVdyYXBwZXJNYXJnaW5Ub3AgPSBoZWFkZXJSb3dIZWlnaHQgKyBidWZmZXI7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdtYXJnaW4tdG9wJywgdGhpcy50YWJsZVdyYXBwZXJNYXJnaW5Ub3AgKyAncHgnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCBzdGlja3lUYWJsZUNsYXNzKTtcbiAgICAgICAgICAgIFtoZWFkZXJSb3csIGNvbENvbnRyb2wsIHRhYmxlQ29ybmVyQnRuLCByb3dDb250cm9sQnV0dG9uXS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbSAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0sICd0b3AnLCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnbWFyZ2luLXRvcCcsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVdyYXBwZXJNYXJnaW5Ub3AgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFRhYmxlU2Nyb2xsaW5nU2hhZG93KCkge1xuICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IG5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSBuYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgICBjb25zdCBjbGllbnRXaWR0aCA9IG5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IGlzTGVmdFNoYWRvdyA9IHNjcm9sbExlZnQgPiAwO1xuICAgICAgICBjb25zdCBpc1JpZ2h0U2hhZG93ID0gc2Nyb2xsTGVmdCArIGNsaWVudFdpZHRoIDwgc2Nyb2xsV2lkdGg7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBuYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYHRyYCk7XG4gICAgICAgIGNvbnN0IHN0aWNreUNlbGxzID0gQXJyYXkuZnJvbShyb3dzKS5tYXAoaXRlbSA9PiBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3RoJykgfHwgaXRlbS5xdWVyeVNlbGVjdG9yKCd0ZCcpKTtcbiAgICAgICAgY29uc3QgaXNDb2x1bW5IZWFkZXIgPSB0aGlzLmZyZWV6ZUNvbHVtblBpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGlzQ29sdW1uSGVhZGVyID8gc3RpY2t5Q2VsbHMgOiBbbmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50XTtcbiAgICAgICAgaWYgKGlzTGVmdFNoYWRvdykge1xuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RoZS10YWJsZS1sZWZ0LXNoYWRvdycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgndGhlLXRhYmxlLWxlZnQtc2hhZG93Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgbmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RoZS10YWJsZS1yaWdodC1zaGFkb3cnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0aGUtdGFibGUtcmlnaHQtc2hhZG93Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdWJzY3JpYmVDZWxsUG9zaXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLmNlbGxzUG9zaXRpb25DaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDEwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlQ2VsbHNDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLmRhbmdlcm91c09yU2VsZWN0ZWRDZWxsc0NoYW5nZSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1c2VSb3dDb250cm9scygpIHtcbiAgICAgICAgaWYgKCh0aGlzLnNlbGVjdGlvbiAmJiAhdGhpcy5yZWFkb25seSkgfHwgdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIHx8IHRoaXMudGFibGVTdG9yZS5pc0NlbGxTZWxlY3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucm93Q29udHJvbHMgPSB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXRlY3RDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlTWluUm93U3BhbkNlbGxGb3JSb3dzKCk6IHsgY2VsbD86IFRhYmxlQ2VsbEVsZW1lbnQ7IHJvd0luZGV4OiBudW1iZXIgfVtdIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNlbGxzID0gdGFibGUuY2hpbGRyZW4ubWFwKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub0hpZGRlbkNlbGxzID0gcm93LmNoaWxkcmVuLmZpbHRlcihjZWxsID0+ICFjZWxsLmhpZGRlbik7XG4gICAgICAgICAgICBpZiAobm9IaWRkZW5DZWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWluUm93c3BhbiA9IE1hdGgubWluLmFwcGx5KFxuICAgICAgICAgICAgICAgICAgICBNYXRoLFxuICAgICAgICAgICAgICAgICAgICBub0hpZGRlbkNlbGxzLm1hcChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsLnJvd3NwYW4gfHwgMTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jaGlsZHJlbi5maW5kKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuICYmIChpdGVtLnJvd3NwYW4gfHwgMSkgPT09IG1pblJvd3NwYW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlUm93Q29udHJvbHMoKSB7XG4gICAgICAgIGNvbnN0IG1pblJvd1NwYW5DZWxsRm9yUm93cyA9IHRoaXMuY2FsY3VsYXRlTWluUm93U3BhbkNlbGxGb3JSb3dzKCk7XG5cbiAgICAgICAgY29uc3Qgcm93Q29udHJvbHMgPSBbXTtcbiAgICAgICAgbGV0IHByZXZpb3VzUm93SW5kZXggPSAwO1xuICAgICAgICBsZXQgcHJldmlvdXNDb21iaW5lUm93SW5kZXggPSAwO1xuICAgICAgICBtaW5Sb3dTcGFuQ2VsbEZvclJvd3MuZm9yRWFjaCgoY2VsbEluZm8sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNlbGxJbmZvLmNlbGwpIHtcbiAgICAgICAgICAgICAgICByb3dDb250cm9scy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbWluUm93U3BhbkNlbGxGb3JSb3dzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSb3dDb250cm9sc0F2Z0hlaWdodChwcmV2aW91c0NvbWJpbmVSb3dJbmRleCwgcHJldmlvdXNSb3dJbmRleCwgcm93Q29udHJvbHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBjb21iaW5lIHJvdyBoZWlnaHRcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA+IHByZXZpb3VzUm93SW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzQXZnSGVpZ2h0KHByZXZpb3VzQ29tYmluZVJvd0luZGV4LCBwcmV2aW91c1Jvd0luZGV4LCByb3dDb250cm9scyk7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNDb21iaW5lUm93SW5kZXggPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjZWxsRG9tID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGNlbGxJbmZvLmNlbGwpO1xuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGdldEVsZW1lbnRIZWlnaHQoY2VsbERvbSk7XG4gICAgICAgICAgICAvLyDlvZNjZWxs5Li65ZCI5bm255qE5Y2V5YWD5qC8KHJvd3NwYW4gPiAxKe+8jOiuoeeul+WFtuWunumZhemrmOW6pu+8iOW9k+WJjeWNleWFg+agvOeahOmrmOW6piAtIOS4i+aWueWQiOW5tuWNleWFg+agvOeahOmrmOW6pu+8iVxuICAgICAgICAgICAgaWYgKGNlbGxJbmZvLmNlbGwucm93c3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxjSGVpZ2h0ID0gaGVpZ2h0IC0gdGhpcy5nZXRCZWxvd1Jvd0hlaWdodChtaW5Sb3dTcGFuQ2VsbEZvclJvd3MsIGluZGV4LCBjZWxsSW5mby5yb3dJbmRleCwgY2VsbEluZm8uY2VsbC5yb3dzcGFuKTtcbiAgICAgICAgICAgICAgICByb3dDb250cm9scy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjYWxjSGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogY2VsbEluZm8ucm93SW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcm93Q29udHJvbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGNlbGxJbmZvLnJvd0luZGV4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91c1Jvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcm93Q29udHJvbHM7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlUm93Q29udHJvbHNBdmdIZWlnaHQoXG4gICAgICAgIHByZXZpb3VzQ29tYmluZVJvd0luZGV4OiBudW1iZXIsXG4gICAgICAgIHByZXZpb3VzUm93SW5kZXg6IG51bWJlcixcbiAgICAgICAgcm93Q29udHJvbHM6IHsgaGVpZ2h0OiBudW1iZXI7IHJvd0luZGV4OiBudW1iZXIgfVtdXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHJvd0NvbnRyb2wgPSByb3dDb250cm9sc1twcmV2aW91c1Jvd0luZGV4XTtcbiAgICAgICAgY29uc3QgY291bnQgPSBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCAtIHByZXZpb3VzUm93SW5kZXg7XG4gICAgICAgIGNvbnN0IGF2Z0hlaWdodCA9IE1hdGguZmxvb3Iocm93Q29udHJvbC5oZWlnaHQgLyAoY291bnQgKyAxKSk7XG4gICAgICAgIGNvbnN0IGZpcnN0SGVpZ2h0ID0gcm93Q29udHJvbC5oZWlnaHQgLSBhdmdIZWlnaHQgKiBjb3VudDtcbiAgICAgICAgcm93Q29udHJvbC5oZWlnaHQgPSBmaXJzdEhlaWdodDtcbiAgICAgICAgcm93Q29udHJvbHNcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0sIF9pbmRleCkgPT4gX2luZGV4ID4gcHJldmlvdXNSb3dJbmRleCAmJiBfaW5kZXggPD0gcHJldmlvdXNDb21iaW5lUm93SW5kZXgpXG4gICAgICAgICAgICAuZm9yRWFjaChyb3dDb250cm9sID0+IHtcbiAgICAgICAgICAgICAgICByb3dDb250cm9sLmhlaWdodCA9IGF2Z0hlaWdodDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEJlbG93Um93SGVpZ2h0KFxuICAgICAgICBjZWxsczoge1xuICAgICAgICAgICAgY2VsbD86IFRhYmxlQ2VsbEVsZW1lbnQ7XG4gICAgICAgICAgICByb3dJbmRleDogbnVtYmVyO1xuICAgICAgICB9W10sXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgICAgIHJvd3NwYW46IG51bWJlclxuICAgICkge1xuICAgICAgICBsZXQgYmVsb3dSb3dsSGVpZ2h0ID0gMDtcbiAgICAgICAgY2VsbHMuc2xpY2UoaW5kZXggKyAxLCBjZWxscy5sZW5ndGgpLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5jZWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvd0luZGV4ICsgcm93c3BhbiA+IGl0ZW0ucm93SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRG9tID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0uY2VsbCk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY2VsbC5yb3dzcGFuID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzkuIvmlrnljZXlhYPmoLznmoRyb3dzcGFuID4gMe+8jOmAkuW9kuiuoeeul1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmdldEJlbG93Um93SGVpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxscy5maW5kSW5kZXgoY2VsbCA9PiBjZWxsLnJvd0luZGV4ID09PSBpdGVtLnJvd0luZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNlbGwucm93c3BhblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBiZWxvd1Jvd2xIZWlnaHQgKz0gZ2V0RWxlbWVudEhlaWdodChjZWxsRG9tKSAtIGhlaWdodDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBiZWxvd1Jvd2xIZWlnaHQgKz0gZ2V0RWxlbWVudEhlaWdodChjZWxsRG9tKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYmVsb3dSb3dsSGVpZ2h0O1xuICAgIH1cblxuICAgIHJlc29sdmVJbWFnZSgpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50cyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKTtcbiAgICAgICAgaWYgKGltYWdlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVJlc29sdmVzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICAgICAgaW1hZ2VFbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VMb2FkID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5zcmMgPSBpdGVtLmdldEF0dHJpYnV0ZSgnc3JjJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW1hZ2VSZXNvbHZlcy5wdXNoKGltYWdlTG9hZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChpbWFnZVJlc29sdmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIH1cblxuICAgIGdldENvbENvbnRyb2xzKCkge1xuICAgICAgICB0aGlzLmNvbENvbnRyb2xzID0gdGhpcy5lbGVtZW50Py5jaGlsZHJlblswXT8uY2hpbGRyZW4gfHwgW107XG4gICAgfVxuXG4gICAgZ2V0SXNJblRhYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24gJiYgIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVkaXRvci5zZWxlY3Rpb247XG4gICAgICAgICAgICBjb25zdCBzdGFydFBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgdGhpcy5lZGl0b3IsIHNlbGVjdGlvbi5hbmNob3IucGF0aCk7XG4gICAgICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IFRhYmxlUG9zaXRpb24uY3JlYXRlKG9wdHMsIHRoaXMuZWRpdG9yLCBzZWxlY3Rpb24uZm9jdXMucGF0aCk7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IHN0YXJ0UG9zaXRpb24uaXNJblRhYmxlKCkgJiYgZW5kUG9zaXRpb24uaXNJblRhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZUNvbHVtbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY29sdW1ucykge1xuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IFtdO1xuICAgICAgICAgICAgdGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdjb2wnKS5mb3JFYWNoKChlbGU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ29tcGF0aWJsZSB3aXRoIHRoZSBwcm9ibGVtIHRoYXQgdGhlIHdpZHRoIGNhbm5vdCBiZSBvYnRhaW5lZCB1bmRlciBzYWZhcmkgI1dJSy05NjQzXG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKHsgd2lkdGg6IGVsZS5jbGllbnRXaWR0aCB8fCBjb2VyY2VQaXhlbHNGcm9tQ3NzVmFsdWUoZWxlLnN0eWxlLndpZHRoKSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRWRpdG9yIGNvbnRhaW5lciB3aWR0aCBjaGFuZ2VzLCByZXN1bHRpbmcgaW4gY29sdW1uIHdpZHRocyBubyBsb25nZXIgdmFsaWQgI1dJSy02NzY2XG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nID0gdGhpcy5lbGVtZW50LmNvbHVtbnMuc29tZSgoY29sLCBpbmRleCkgPT4gY29sLndpZHRoICE9PSBjb2x1bW5zW2luZGV4XT8ud2lkdGgpO1xuICAgICAgICAgICAgaWYgKHdhcm5pbmcpIHtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdHIgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW5bMF0gYXMgVGFibGVSb3dFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgdGFibGVXaWR0aCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCB0cikub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdHIuY2hpbGRyZW4ubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiBOdW1iZXIoKHRhYmxlV2lkdGggLyB0ci5jaGlsZHJlbi5sZW5ndGggLSB0ci5jaGlsZHJlbi5sZW5ndGgpLnRvRml4ZWQoMikpIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0aWFsaXplUm93cygpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyb3cuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHJvdyk7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IGdldEVsZW1lbnRIZWlnaHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGhlaWdodCB9LCByb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1Sb3dIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IHJvd0VsZW1lbnRzID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuY2hpbGRyZW47XG4gICAgICAgIGlmIChyb3dFbGVtZW50cykge1xuICAgICAgICAgICAgKFsuLi5yb3dFbGVtZW50c10gYXMgSFRNTFRhYmxlUm93RWxlbWVudFtdKS5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3cpO1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBoZWlnaHQgfSwgdGhpcy5lbGVtZW50LmNoaWxkcmVuW2luZGV4XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYW5zZm9ybUNvbHVtbnNXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgY29scyA9IFsuLi50aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignY29sZ3JvdXAnKS5jaGlsZHJlbl0gYXMgSFRNTFRhYmxlQ29sRWxlbWVudFtdO1xuICAgICAgICBjb25zdCBjb2x1bW5zOiBUaGVUYWJsZUNvbHVtbltdID0gY29scy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiBnZXRFbGVtZW50V2lkdGgoY29sKSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBvbkNvbE1vdXNlZG93bihldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCEhdGhpcy5zZWxlY3Rpb24gJiYgdGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhckRhbmdlcm91c0NlbGxzKCk7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q29sdW1uKHRoaXMuZWRpdG9yLCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5hZnRlclNlbGVjdGVkQ2VsbHMoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Sb3dNb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghdGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBUaGVFZGl0b3IuZmluZFBhdGgodGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdFJvdyh0aGlzLmVkaXRvciwgaW5kZXgpO1xuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5hZnRlclNlbGVjdGVkQ2VsbHMoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0VGFibGUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RUYWJsZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgbGlzdGVuVGFibGVDb250ZXh0TWVudUV2ZW50KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2NvbnRleHRtZW51JylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFNMQV9UQUJMRV9DRUxMX1NFTEVDVE9SKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZC1jZWxsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q2VsbChjZWxsLCB0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuaXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VDb250ZXh0TWVudSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFibGVTZXJ2aWNlLmlzT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZVRvb2xiYXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcGF0Y2ggZm9yIHJpZ2h0IGNsaWNrIHNlbGVjdCBuZXh0IGNlbGxcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbmVyT25TZWxlY3RlZENlbGxzKCkge1xuICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ21vdXNlZG93bicpLnBpcGUoZmlsdGVyKChlOiBNb3VzZUV2ZW50KSA9PiBlLmJ1dHRvbiAhPT0gMikpLFxuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNWaXJ0dWFsS2V5KGUpICYmICF0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmlzT3BlbmVkO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0ZWRDZWxscyAmJiB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0ZWRDZWxscy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJTZWxlY3RlZENlbGxzQ29udGVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRUYWJsZUVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50VGFibGVFbGVtZW50IHx8ICF0aGlzLnRhYmxlU3RvcmUuaXNNb2RTZWxlY3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyU2VsZWN0ZWRDZWxscygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudFRhYmxlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuY2xlYXJMYXN0Rm9jdXNQYXRoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmNsb3NlVG9vbGJhcigpO1xuICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuY2xvc2VDb250ZXh0TWVudSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8ga2V5ZG93blxuICAgIGxpc3RlbktleWRvd25TZWxlY3RFdmVudHMoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gISFlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNIb3RrZXkoJ21vZCcsIGV2ZW50KSAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmlzTW9kU2VsZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5dXAnKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gISFlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmlzTW9kU2VsZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyYWNrQnlGblJvd0NvbnRyb2xzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIHRyYWNrQnlGbkNvbENvbnRyb2xzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtY29udGFpbmVyXCIgdGhlQ29sdW1uUmVzaXplPlxuICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtY29ybmVyLWNvbnRyb2xzIHRoZS1zdGlja3ktY29ybmVyLWNvbnRyb2xzXCJcbiAgICAgICAgICAgICNjb3JuZXJDb250cm9sXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc0NlbGxTZWxlY3RpbmcpLFxuICAgICAgICAgICAgICAgIGFjdGl2ZTogaXNTZWxlY3RlZEFsbENlbGwsXG4gICAgICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmlzU2VsZWN0ZWRUYWJsZSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1idXR0b25cIiAobW91c2Vkb3duKT1cIm9uU2VsZWN0VGFibGUoJGV2ZW50KVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMtaW5zZXJ0LXJvdy1tYXJrZXJcIiAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnM/LmhlYWRlclJvd1wiPlxuICAgICAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCIwXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPjwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtY29sdW1uLW1hcmtlclwiICpuZ0lmPVwiIWVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPHRoZS10YWJsZS1pbnNlcnQtbWFyayB0eXBlPVwiY29sdW1uXCIgW2F0XT1cIjBcIiBbdGFibGVTdG9yZV09XCJ0YWJsZVN0b3JlXCI+PC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9scy1pbm5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbi13cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgI3Jvd0NvbnRyb2xzQnV0dG9uV3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udHJvbCBvZiByb3dDb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuUm93Q29udHJvbHNcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IHRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXguaW5jbHVkZXMoY29udHJvbC5yb3dJbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuZGFuZ2Vyb3VzUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHkgJiYgKGlzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzQ2VsbFNlbGVjdGluZykgJiYgIWVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJvd01vdXNlZG93bigkZXZlbnQsIGNvbnRyb2wucm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRoZS10YWJsZS1yb3ctY29udHJvbHMtYnV0dG9uIHRoZS10YWJsZS1jb250cm9scy1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRFZGl0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Sb3dNb3VzZWRvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtbnVtYmVyZWQtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInJvdy1udW1iZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPnt7IGhlYWRlclJvdyAmJiBpID09PSAwID8gJycgOiBoZWFkZXJSb3cgPyBpIDogaSArIDEgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCJjb250cm9sLnJvd0luZGV4ICsgMVwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj4gPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS13cmFwcGVyXCIgI3RhYmxlV3JhcHBlciBbbmdDbGFzc109XCJ7ICd0aGUtdGFibGUtbnVtYmVyZWQnOiBlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbiB9XCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRoZS10YWJsZVwiICN0aGVUYWJsZT5cbiAgICAgICAgICAgIDxjb2xncm91cCAqbmdJZj1cImNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICA8Y29sICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIFtuZ1N0eWxlXT1cInsgd2lkdGg6IGNvbC53aWR0aCArICdweCcgfVwiIC8+XG4gICAgICAgICAgICA8L2NvbGdyb3VwPlxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInRoZS10YWJsZS1jb2wtY29udHJvbHMtd3JhcHBlciB0aGUtc3RpY2t5LXJvd1wiICNjb2x1bW5Db250cm9sc1dyYXBwZXI+XG4gICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgI2NvbENvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9sc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZS1zdGlja3ktY2VsbCc6IGkgPT09IDAgJiYgZWxlbWVudCB8IGZyZWV6ZUNvbHVtbiA6IHRhYmxlUGx1Z2luT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IHRhYmxlU3RvcmUuc2VsZWN0ZWRDb2x1bW5zSW5kZXguaW5jbHVkZXMoaSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c0NvbHVtbnNJbmRleC5pbmNsdWRlcyhpKSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkNvbE1vdXNlZG93bigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb250cm9sIG9mIGNvbENvbnRyb2xzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5Db2xDb250cm9sc1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzSW5UYWJsZSB8fCB0YWJsZVN0b3JlLmlzQ2VsbFNlbGVjdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0XT1cImkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVTdG9yZV09XCJ0YWJsZVN0b3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50RWxlbWVudF09XCJjb2xDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5ICN0Ym9keT5cbiAgICAgICAgICAgICAgICA8c2xhdGUtY2hpbGRyZW4gW2NoaWxkcmVuXT1cImNoaWxkcmVuXCIgW2NvbnRleHRdPVwiY2hpbGRyZW5Db250ZXh0XCIgW3ZpZXdDb250ZXh0XT1cInZpZXdDb250ZXh0XCI+IDwvc2xhdGUtY2hpbGRyZW4+XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|