fantasy-ngzorro 2.2.21 → 2.2.22

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.
@@ -7,8 +7,8 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, El
7
7
  import * as localforage from "localforage";
8
8
  import { InputBoolean, } from "ng-zorro-antd/core";
9
9
  import { NzTableComponent } from "ng-zorro-antd/table";
10
- import { of } from "rxjs";
11
- import { delay } from "rxjs/operators";
10
+ import { of, Subject } from "rxjs";
11
+ import { debounceTime, delay } from "rxjs/operators";
12
12
  import { ColWidth } from "../model/colWidth";
13
13
  import { Page } from "../model/common-type";
14
14
  import { CommonSessionService } from "../service/common-session.service";
@@ -125,6 +125,11 @@ export class HdTableComponent {
125
125
  this.viewportResizeTimer = null;
126
126
  this.boundOnViewportResize = null;
127
127
  this.hostResizeObserver = null;
128
+ /**
129
+ * select 展开 / 搜索防抖(对齐 form-lines)
130
+ */
131
+ this.selectOpenChangeSubject = new Subject();
132
+ this.selectSearchSubject = new Subject();
128
133
  /**
129
134
  * 序号列固定宽(含 padding,可容纳 6 位如 199995)。
130
135
  * 不锁死时表体会随位数变宽(1→~64px,199995→~67px),合计行对不齐。
@@ -215,6 +220,22 @@ export class HdTableComponent {
215
220
  ngOnDestroy() {
216
221
  this.unbindTotalFooterScrollSync();
217
222
  this.unbindViewportResizeSync();
223
+ if (this.selectOpenChangeSubscription) {
224
+ this.selectOpenChangeSubscription.unsubscribe();
225
+ }
226
+ if (this.selectSearchSubscription) {
227
+ this.selectSearchSubscription.unsubscribe();
228
+ }
229
+ if (this.selectLoaderSubscription) {
230
+ this.selectLoaderSubscription.unsubscribe();
231
+ }
232
+ }
233
+ /**
234
+ * 供业务在自行写回 options 后触发 OnPush 刷新(优先 return Observable/Promise 由组件处理)
235
+ * @return {?}
236
+ */
237
+ markForCheck() {
238
+ this.cdr.markForCheck();
218
239
  }
219
240
  /**
220
241
  * @return {?}
@@ -2325,6 +2346,173 @@ export class HdTableComponent {
2325
2346
  });
2326
2347
  this.cdr.markForCheck();
2327
2348
  }
2349
+ /**
2350
+ * Select 展开:有 onOpenChangeEvent 时展开先清空选项再回调 (open, line);关闭不回调业务。
2351
+ * 回调若 return 数组 / Promise / Observable,由组件写回 options 并 markForCheck。
2352
+ * @param {?} col
2353
+ * @param {?} data
2354
+ * @param {?} open
2355
+ * @return {?}
2356
+ */
2357
+ onSelectOpenChange(col, data, open) {
2358
+ if (!col || !col.onOpenChangeEvent) {
2359
+ return;
2360
+ }
2361
+ if (open) {
2362
+ this.clearSelectOptionsOnOpen(col, data);
2363
+ this.cdr.markForCheck();
2364
+ }
2365
+ /** @type {?} */
2366
+ const fn = col.onOpenChangeEvent;
2367
+ /** @type {?} */
2368
+ const debounceMs = col.onOpenChangeEventDebounceTime != null
2369
+ ? col.onOpenChangeEventDebounceTime
2370
+ : 0;
2371
+ if (!debounceMs) {
2372
+ if (open) {
2373
+ this.handleSelectLoaderResult(col, data, fn(open, data));
2374
+ }
2375
+ return;
2376
+ }
2377
+ if (this.selectOpenChangeSubscription) {
2378
+ this.selectOpenChangeSubscription.unsubscribe();
2379
+ }
2380
+ this.selectOpenChangeSubscription = this.selectOpenChangeSubject
2381
+ .pipe(debounceTime(debounceMs))
2382
+ .subscribe((/**
2383
+ * @param {?} __0
2384
+ * @return {?}
2385
+ */
2386
+ ({ fn: cb, open: o, line, col: c }) => {
2387
+ if (o) {
2388
+ this.handleSelectLoaderResult(c, line, cb(o, line));
2389
+ }
2390
+ }));
2391
+ this.selectOpenChangeSubject.next({ fn, open, line: data, col });
2392
+ }
2393
+ /**
2394
+ * Select 搜索:有 onSearchEvent 时回调 (keyword, line),不清空 options。
2395
+ * 回调若 return 数组 / Promise / Observable,由组件写回 options 并 markForCheck。
2396
+ * @param {?} col
2397
+ * @param {?} data
2398
+ * @param {?} keyword
2399
+ * @return {?}
2400
+ */
2401
+ onSelectSearch(col, data, keyword) {
2402
+ if (!col || !col.onSearchEvent) {
2403
+ return;
2404
+ }
2405
+ /** @type {?} */
2406
+ const fn = col.onSearchEvent;
2407
+ /** @type {?} */
2408
+ const debounceMs = col.onSearchEventEventDebounceTime != null
2409
+ ? col.onSearchEventEventDebounceTime
2410
+ : 0;
2411
+ if (!debounceMs) {
2412
+ this.handleSelectLoaderResult(col, data, fn(keyword, data));
2413
+ return;
2414
+ }
2415
+ if (this.selectSearchSubscription) {
2416
+ this.selectSearchSubscription.unsubscribe();
2417
+ }
2418
+ this.selectSearchSubscription = this.selectSearchSubject
2419
+ .pipe(debounceTime(debounceMs))
2420
+ .subscribe((/**
2421
+ * @param {?} __0
2422
+ * @return {?}
2423
+ */
2424
+ ({ fn: cb, keyword: kw, line, col: c }) => {
2425
+ this.handleSelectLoaderResult(c, line, cb(kw, line));
2426
+ }));
2427
+ this.selectSearchSubject.next({ fn, keyword, line: data, col });
2428
+ }
2429
+ /**
2430
+ * 展开时清空列 selectList 或行上 selectListName,由业务回调再写入
2431
+ * @private
2432
+ * @param {?} col
2433
+ * @param {?} data
2434
+ * @return {?}
2435
+ */
2436
+ clearSelectOptionsOnOpen(col, data) {
2437
+ if (!col || !col.selectOption) {
2438
+ return;
2439
+ }
2440
+ /** @type {?} */
2441
+ const opt = col.selectOption;
2442
+ if (opt.selectList != null) {
2443
+ opt.selectList = [];
2444
+ }
2445
+ if (opt.selectListName && data) {
2446
+ data[opt.selectListName] = [];
2447
+ }
2448
+ }
2449
+ /**
2450
+ * 处理加载回调返回值:数组直接写回;Promise/Observable 完成后写回;void 仅 markForCheck。
2451
+ * 优先写 selectListName,否则写列上 selectList。
2452
+ * @private
2453
+ * @param {?} col
2454
+ * @param {?} data
2455
+ * @param {?} result
2456
+ * @return {?}
2457
+ */
2458
+ handleSelectLoaderResult(col, data, result) {
2459
+ if (result == null) {
2460
+ this.cdr.markForCheck();
2461
+ return;
2462
+ }
2463
+ if (Array.isArray(result)) {
2464
+ this.applySelectOptions(col, data, result);
2465
+ return;
2466
+ }
2467
+ if (typeof result.then === "function") {
2468
+ result.then((/**
2469
+ * @param {?} list
2470
+ * @return {?}
2471
+ */
2472
+ (list) => this.applySelectOptions(col, data, list)), (/**
2473
+ * @return {?}
2474
+ */
2475
+ () => this.cdr.markForCheck()));
2476
+ return;
2477
+ }
2478
+ if (typeof result.subscribe === "function") {
2479
+ if (this.selectLoaderSubscription) {
2480
+ this.selectLoaderSubscription.unsubscribe();
2481
+ }
2482
+ this.selectLoaderSubscription = result.subscribe((/**
2483
+ * @param {?} list
2484
+ * @return {?}
2485
+ */
2486
+ (list) => this.applySelectOptions(col, data, list)), (/**
2487
+ * @return {?}
2488
+ */
2489
+ () => this.cdr.markForCheck()));
2490
+ return;
2491
+ }
2492
+ this.cdr.markForCheck();
2493
+ }
2494
+ /**
2495
+ * @private
2496
+ * @param {?} col
2497
+ * @param {?} data
2498
+ * @param {?} list
2499
+ * @return {?}
2500
+ */
2501
+ applySelectOptions(col, data, list) {
2502
+ if (!col || !col.selectOption || !Array.isArray(list)) {
2503
+ this.cdr.markForCheck();
2504
+ return;
2505
+ }
2506
+ /** @type {?} */
2507
+ const opt = col.selectOption;
2508
+ if (opt.selectListName && data) {
2509
+ data[opt.selectListName] = list;
2510
+ }
2511
+ else {
2512
+ opt.selectList = list;
2513
+ }
2514
+ this.cdr.markForCheck();
2515
+ }
2328
2516
  /**
2329
2517
  * Select 变更:双写 value + label,并带 previous* / option
2330
2518
  * @param {?} col
@@ -2389,7 +2577,7 @@ export class HdTableComponent {
2389
2577
  HdTableComponent.decorators = [
2390
2578
  { type: Component, args: [{
2391
2579
  selector: "hd-table",
2392
- template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"toggleShowDetail()\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template> \n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <ng-container *ngIf=\"showColSettings\">\n <span class=\"hd-table-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-table-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"hd-table-col-settings-dropdown\">\n <div class=\"hd-table-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-table-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [class.hd-table--virtual]=\"useVirtualScroll\"\n [class.hd-table--scroll-y]=\"!!(scroll && scroll.y)\" [class.hd-table--scroll-x]=\"!!(scroll && scroll.x)\"\n [class.hd-table--has-total]=\"showTableTotal\"\n [nzScroll]=\"scroll\"\n [nzShowPagination]=\"pagination\" [nzShowSizeChanger]=\"pagination\" [nzShowQuickJumper]=\"pagination\"\n [nzFrontPagination]=\"useFrontPagination\" nzSize=\"middle\" [nzData]=\"tableData.content\"\n [nzTotal]=\"getTableTotalCount()\" [(nzPageIndex)]=\"tablePageIndex\" [nzLoading]=\"tableLoading\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\"\n (nzPageSizeChange)=\"pagination ? search(true) : null\"\n (nzPageIndexChange)=\"pagination ? search(false) : null\"\n (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\"\n [nzShowTotal]=\"tableTotalTemplate\" [nzFooter]=\"showTableTotal ? tableTotalFooter : null\"\n [nzVirtualScroll]=\"useVirtualScroll\" [nzVirtualItemSize]=\"useVirtualScroll ? effectiveVirtualItemSize : 0\"\n [nzVirtualForTrackBy]=\"virtualTrackByRow\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [(nzChecked)]=\"isAllDisplayDataChecked\"\n [nzIndeterminate]=\"isIndeterminate\" (nzCheckedChange)=\"checkAll($event)\"></th>\n <th class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"col.width + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\"\n [nzRight]=\"getRightSticky(col)\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\"\n [nzSort]=\"getColSort(col)\">\n <ng-container *ngIf=\"getTitleParts(col) as titleParts; else plainTitle\">\n <span class=\"hd-table-title-with-bar\">{{ titleParts[0] }}<i class=\"hd-table-row-no-bar\"></i>{{ titleParts[1] }}</span>\n </ng-container>\n <ng-template #plainTitle>{{ col.title }}</ng-template>\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-template *ngIf=\"useVirtualScroll\" nz-virtual-scroll let-data let-index=\"index\">\n <tr class=\"hd-table-virtual-row\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: index }\"></ng-container>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!useVirtualScroll\">\n <tr *ngFor=\"let data of hdTable.data; trackBy: trackByRow; index as i\"\n [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: i }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n <ng-template #tableTotalTemplate>\n \u5171 {{ getTableTotalCount() }} \u6761\u6570\u636E\n </ng-template>\n <ng-template #tableTotalFooter>\n <!--\n \u5217\u603B\u5BBD < \u5BB9\u5668\uFF1Afluid\uFF0C\u8868\u5BBD 100%\uFF0C\u4E0E\u8868\u4F53\u540C\u6BD4\u4F8B\u88AB\u6491\u5F00\uFF0C\u4E0D\u518D\u6309\u58F0\u660E px \u9501\u6B7B\uFF1B\n \u5217\u603B\u5BBD > \u5BB9\u5668\uFF1Afixed\uFF0C\u8868\u5BBD = scroll.x\uFF0C\u6A2A\u6EDA\u4E0E\u8868\u4F53\u540C\u6B65\u3002\n -->\n <div class=\"hd-table-total-footer\"\n [class.hd-table-total-footer--fluid]=\"isTotalFooterFluid\"\n [class.hd-table-total-footer--y-gutter]=\"totalFooterNeedYGutter\">\n <table class=\"hd-table-total-footer-table\" [style.width]=\"totalFooterTableWidth\">\n <colgroup>\n <!-- \u52FE\u9009/\u5E8F\u53F7\u9501\u5BBD\uFF0C\u4E0D\u53C2\u4E0E\u5747\u644A -->\n <col *ngIf=\"showSelected\" style=\"width: 40px; min-width: 40px; max-width: 40px;\" />\n <col *ngIf=\"showTableTotal\"\n [style.width.px]=\"lineNumberColWidth\"\n [style.min-width.px]=\"lineNumberColWidth\"\n [style.max-width.px]=\"lineNumberColWidth\" />\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <col *ngIf=\"col.isShow\" [style.width.px]=\"col.width\" />\n </ng-container>\n </colgroup>\n <tr class=\"hd-table-total\">\n <td *ngIf=\"showSelected\" class=\"hd-table-total-footer-cell hd-table-total-footer-select\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n style=\"left: 0;\">&nbsp;</td>\n <td class=\"hd-table-total-footer-cell hd-table-total-footer-line-no\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n [style.left]=\"!isTotalFooterFluid ? lineNumberLeft : null\">\u5408\u8BA1</td>\n <ng-container *ngFor=\"let col of tableCols; let colIndex = index; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" class=\"hd-table-total-footer-cell\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid && col.fixed === 'left'\"\n [class.hd-table-total-footer-sticky-right]=\"!isTotalFooterFluid && col.fixed === 'right'\"\n [class.hd-table-total-align-left]=\"getTableTotalCellAlign(col, colIndex) === 'left'\"\n [class.hd-table-total-align-center]=\"getTableTotalCellAlign(col, colIndex) === 'center'\"\n [class.hd-table-total-align-right]=\"getTableTotalCellAlign(col, colIndex) === 'right'\"\n [style.left]=\"!isTotalFooterFluid && col.fixed === 'left' ? (col.fixedWidth || 0) + 'px' : null\"\n [style.right]=\"!isTotalFooterFluid && col.fixed === 'right' ? (col.fixedRightWidth || 0) + 'px' : null\"\n [ngStyle]=\"{'text-align': getTableTotalCellAlign(col, colIndex)}\">\n {{ getTableTotalCellValue(col, colIndex) }}\n </td>\n </ng-container>\n </tr>\n </table>\n </div>\n </ng-template>\n </nz-table>\n</ng-container>\n\n<ng-template #tableCells let-data let-index=\"index\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [nzChecked]=\"mapOfCheckedId[data[selectField]]\"\n [nzDisabled]=\"isSelectDisabled(data)\" (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <td class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">{{ getLineNumber(index) }}</td>\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" [ngStyle]=\"{'max-width': col.width + 'px'}\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\"\n [nzRight]=\"getRightSticky(col)\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"hasInlineEdit(col); else displayCellTpl\">\n <div class=\"hd-table-cell-edit\">\n <ng-container [ngSwitch]=\"col.editType\">\n <input *ngSwitchCase=\"'input'\" nz-input class=\"hd-table-cell-edit-control\"\n [placeholder]=\"col.placeholder || ''\"\n [disabled]=\"isEditDisabled(col, data)\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\" />\n <nz-input-number *ngSwitchCase=\"'inputNumber'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || ''\"\n [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzMin]=\"getInputNumberProp(col, 'min', 0)\"\n [nzMax]=\"getInputNumberProp(col, 'max', 99999999)\"\n [nzStep]=\"getInputNumberProp(col, 'step', 1)\"\n [nzPrecision]=\"getInputNumberProp(col, 'precision', 4)\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-input-number>\n <nz-select *ngSwitchCase=\"'select'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9'\"\n [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzAllowClear]=\"col.selectOption && col.selectOption.hdAllowClear !== false\"\n [nzShowSearch]=\"!col.selectOption || col.selectOption.hdShowSearch !== false\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onSelectChange(col, data, $event)\">\n <nz-option *ngFor=\"let selectItem of getSelectList(col, data)\"\n [nzValue]=\"selectItem[col.selectOption.value]\"\n [nzLabel]=\"getSelectOptionLabel(col, selectItem)\">\n </nz-option>\n </nz-select>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #displayCellTpl>\n <div [class.hd-table-cell-with-actions]=\"col.btnList && col.btnList.length\">\n <div class=\"hd-table-cell-value\"\n [class.hd-table-cell-value--rowno]=\"hasRowNo(col)\"\n [class.hd-table-cell-value--edit]=\"isEditable(col, data)\">\n <ng-container *ngIf=\"col.name === 'state' || col.isState;else otherTemplate\">\n <hd-status [status]=\"data[getStateField(col)]\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\">{{ cell.display }}</span>\n </ng-container>\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click && (!col.canClick || col.canClick(data));else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n <a *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n </ng-container>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n <span class=\"hd-table-row-no\" *ngIf=\"hasRowNo(col) && getRowNoText(col, data, index)\">\n <i class=\"hd-table-row-no-bar\"></i>{{ getRowNoText(col, data, index) }}\n </span>\n <a *ngIf=\"isEditable(col, data)\" class=\"hd-table-edit-icon\" href=\"javascript:;\" title=\"\u7F16\u8F91\"\n (click)=\"onEditClick($event, col, data)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M8.10797 1.42626C8.44968 1.08456 9.0037 1.08456 9.34541 1.42626L10.9746 3.05542C11.3163 3.39713 11.3163 3.95115 10.9746 4.29286L5.01002 10.2574C4.87077 10.3967 4.68863 10.4849 4.49305 10.5078L2.72936 10.7142C2.18281 10.7782 1.71357 10.3278 1.7551 9.77914L1.89441 7.93871C1.9102 7.73007 2.00024 7.53399 2.14819 7.38604L8.10797 1.42626ZM7.67304 3.51111L8.88972 4.72779L9.94337 3.67414L8.72669 2.45746L7.67304 3.51111ZM8.06477 5.55274L6.84808 4.33606L3.04959 8.13456L2.94515 9.51434L4.25672 9.36079L8.06477 5.55274ZM12.25 12.8333L1.75 12.8333V11.6666L12.25 11.6666V12.8333Z\"\n fill=\"currentColor\" />\n </svg>\n </a>\n </div>\n <div class=\"common-btn-group hd-table-cell-actions\" *ngIf=\"col.btnList && col.btnList.length\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else cellActionConfirmTpl\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #cellActionConfirmTpl>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>\n",
2580
+ template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"toggleShowDetail()\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template> \n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <ng-container *ngIf=\"showColSettings\">\n <span class=\"hd-table-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-table-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"hd-table-col-settings-dropdown\">\n <div class=\"hd-table-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-table-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [class.hd-table--virtual]=\"useVirtualScroll\"\n [class.hd-table--scroll-y]=\"!!(scroll && scroll.y)\" [class.hd-table--scroll-x]=\"!!(scroll && scroll.x)\"\n [class.hd-table--has-total]=\"showTableTotal\"\n [nzScroll]=\"scroll\"\n [nzShowPagination]=\"pagination\" [nzShowSizeChanger]=\"pagination\" [nzShowQuickJumper]=\"pagination\"\n [nzFrontPagination]=\"useFrontPagination\" nzSize=\"middle\" [nzData]=\"tableData.content\"\n [nzTotal]=\"getTableTotalCount()\" [(nzPageIndex)]=\"tablePageIndex\" [nzLoading]=\"tableLoading\"\n [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\"\n (nzPageSizeChange)=\"pagination ? search(true) : null\"\n (nzPageIndexChange)=\"pagination ? search(false) : null\"\n (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\"\n [nzShowTotal]=\"tableTotalTemplate\" [nzFooter]=\"showTableTotal ? tableTotalFooter : null\"\n [nzVirtualScroll]=\"useVirtualScroll\" [nzVirtualItemSize]=\"useVirtualScroll ? effectiveVirtualItemSize : 0\"\n [nzVirtualForTrackBy]=\"virtualTrackByRow\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [(nzChecked)]=\"isAllDisplayDataChecked\"\n [nzIndeterminate]=\"isIndeterminate\" (nzCheckedChange)=\"checkAll($event)\"></th>\n <th class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"col.width + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\"\n [nzRight]=\"getRightSticky(col)\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\"\n [nzSort]=\"getColSort(col)\">\n <ng-container *ngIf=\"getTitleParts(col) as titleParts; else plainTitle\">\n <span class=\"hd-table-title-with-bar\">{{ titleParts[0] }}<i class=\"hd-table-row-no-bar\"></i>{{ titleParts[1] }}</span>\n </ng-container>\n <ng-template #plainTitle>{{ col.title }}</ng-template>\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-template *ngIf=\"useVirtualScroll\" nz-virtual-scroll let-data let-index=\"index\">\n <tr class=\"hd-table-virtual-row\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: index }\"></ng-container>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!useVirtualScroll\">\n <tr *ngFor=\"let data of hdTable.data; trackBy: trackByRow; index as i\"\n [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: i }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n <ng-template #tableTotalTemplate>\n \u5171 {{ getTableTotalCount() }} \u6761\u6570\u636E\n </ng-template>\n <ng-template #tableTotalFooter>\n <!--\n \u5217\u603B\u5BBD < \u5BB9\u5668\uFF1Afluid\uFF0C\u8868\u5BBD 100%\uFF0C\u4E0E\u8868\u4F53\u540C\u6BD4\u4F8B\u88AB\u6491\u5F00\uFF0C\u4E0D\u518D\u6309\u58F0\u660E px \u9501\u6B7B\uFF1B\n \u5217\u603B\u5BBD > \u5BB9\u5668\uFF1Afixed\uFF0C\u8868\u5BBD = scroll.x\uFF0C\u6A2A\u6EDA\u4E0E\u8868\u4F53\u540C\u6B65\u3002\n -->\n <div class=\"hd-table-total-footer\"\n [class.hd-table-total-footer--fluid]=\"isTotalFooterFluid\"\n [class.hd-table-total-footer--y-gutter]=\"totalFooterNeedYGutter\">\n <table class=\"hd-table-total-footer-table\" [style.width]=\"totalFooterTableWidth\">\n <colgroup>\n <!-- \u52FE\u9009/\u5E8F\u53F7\u9501\u5BBD\uFF0C\u4E0D\u53C2\u4E0E\u5747\u644A -->\n <col *ngIf=\"showSelected\" style=\"width: 40px; min-width: 40px; max-width: 40px;\" />\n <col *ngIf=\"showTableTotal\"\n [style.width.px]=\"lineNumberColWidth\"\n [style.min-width.px]=\"lineNumberColWidth\"\n [style.max-width.px]=\"lineNumberColWidth\" />\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <col *ngIf=\"col.isShow\" [style.width.px]=\"col.width\" />\n </ng-container>\n </colgroup>\n <tr class=\"hd-table-total\">\n <td *ngIf=\"showSelected\" class=\"hd-table-total-footer-cell hd-table-total-footer-select\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n style=\"left: 0;\">&nbsp;</td>\n <td class=\"hd-table-total-footer-cell hd-table-total-footer-line-no\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n [style.left]=\"!isTotalFooterFluid ? lineNumberLeft : null\">\u5408\u8BA1</td>\n <ng-container *ngFor=\"let col of tableCols; let colIndex = index; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" class=\"hd-table-total-footer-cell\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid && col.fixed === 'left'\"\n [class.hd-table-total-footer-sticky-right]=\"!isTotalFooterFluid && col.fixed === 'right'\"\n [class.hd-table-total-align-left]=\"getTableTotalCellAlign(col, colIndex) === 'left'\"\n [class.hd-table-total-align-center]=\"getTableTotalCellAlign(col, colIndex) === 'center'\"\n [class.hd-table-total-align-right]=\"getTableTotalCellAlign(col, colIndex) === 'right'\"\n [style.left]=\"!isTotalFooterFluid && col.fixed === 'left' ? (col.fixedWidth || 0) + 'px' : null\"\n [style.right]=\"!isTotalFooterFluid && col.fixed === 'right' ? (col.fixedRightWidth || 0) + 'px' : null\"\n [ngStyle]=\"{'text-align': getTableTotalCellAlign(col, colIndex)}\">\n {{ getTableTotalCellValue(col, colIndex) }}\n </td>\n </ng-container>\n </tr>\n </table>\n </div>\n </ng-template>\n </nz-table>\n</ng-container>\n\n<ng-template #tableCells let-data let-index=\"index\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected\" nzShowCheckbox [nzChecked]=\"mapOfCheckedId[data[selectField]]\"\n [nzDisabled]=\"isSelectDisabled(data)\" (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <td class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">{{ getLineNumber(index) }}</td>\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" [ngStyle]=\"{'max-width': col.width + 'px'}\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\"\n [nzRight]=\"getRightSticky(col)\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"hasInlineEdit(col); else displayCellTpl\">\n <div class=\"hd-table-cell-edit\">\n <ng-container [ngSwitch]=\"col.editType\">\n <input *ngSwitchCase=\"'input'\" nz-input class=\"hd-table-cell-edit-control\"\n [placeholder]=\"col.placeholder || ''\"\n [disabled]=\"isEditDisabled(col, data)\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\" />\n <nz-input-number *ngSwitchCase=\"'inputNumber'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || ''\"\n [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzMin]=\"getInputNumberProp(col, 'min', 0)\"\n [nzMax]=\"getInputNumberProp(col, 'max', 99999999)\"\n [nzStep]=\"getInputNumberProp(col, 'step', 1)\"\n [nzPrecision]=\"getInputNumberProp(col, 'precision', 4)\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-input-number>\n <nz-select *ngSwitchCase=\"'select'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9'\"\n [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzAllowClear]=\"col.selectOption && col.selectOption.hdAllowClear !== false\"\n [nzShowSearch]=\"!col.selectOption || col.selectOption.hdShowSearch !== false\"\n [nzServerSearch]=\"!!(col.selectOption && col.selectOption.hdServerSearch)\"\n [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onSelectChange(col, data, $event)\"\n (nzOpenChange)=\"onSelectOpenChange(col, data, $event)\"\n (nzOnSearch)=\"onSelectSearch(col, data, $event)\">\n <nz-option *ngFor=\"let selectItem of getSelectList(col, data)\"\n [nzValue]=\"selectItem[col.selectOption.value]\"\n [nzLabel]=\"getSelectOptionLabel(col, selectItem)\">\n </nz-option>\n </nz-select>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #displayCellTpl>\n <div [class.hd-table-cell-with-actions]=\"col.btnList && col.btnList.length\">\n <div class=\"hd-table-cell-value\"\n [class.hd-table-cell-value--rowno]=\"hasRowNo(col)\"\n [class.hd-table-cell-value--edit]=\"isEditable(col, data)\">\n <ng-container *ngIf=\"col.name === 'state' || col.isState;else otherTemplate\">\n <hd-status [status]=\"data[getStateField(col)]\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\">{{ cell.display }}</span>\n </ng-container>\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click && (!col.canClick || col.canClick(data));else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n <a *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n </ng-container>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n <span class=\"hd-table-row-no\" *ngIf=\"hasRowNo(col) && getRowNoText(col, data, index)\">\n <i class=\"hd-table-row-no-bar\"></i>{{ getRowNoText(col, data, index) }}\n </span>\n <a *ngIf=\"isEditable(col, data)\" class=\"hd-table-edit-icon\" href=\"javascript:;\" title=\"\u7F16\u8F91\"\n (click)=\"onEditClick($event, col, data)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M8.10797 1.42626C8.44968 1.08456 9.0037 1.08456 9.34541 1.42626L10.9746 3.05542C11.3163 3.39713 11.3163 3.95115 10.9746 4.29286L5.01002 10.2574C4.87077 10.3967 4.68863 10.4849 4.49305 10.5078L2.72936 10.7142C2.18281 10.7782 1.71357 10.3278 1.7551 9.77914L1.89441 7.93871C1.9102 7.73007 2.00024 7.53399 2.14819 7.38604L8.10797 1.42626ZM7.67304 3.51111L8.88972 4.72779L9.94337 3.67414L8.72669 2.45746L7.67304 3.51111ZM8.06477 5.55274L6.84808 4.33606L3.04959 8.13456L2.94515 9.51434L4.25672 9.36079L8.06477 5.55274ZM12.25 12.8333L1.75 12.8333V11.6666L12.25 11.6666V12.8333Z\"\n fill=\"currentColor\" />\n </svg>\n </a>\n </div>\n <div class=\"common-btn-group hd-table-cell-actions\" *ngIf=\"col.btnList && col.btnList.length\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else cellActionConfirmTpl\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #cellActionConfirmTpl>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>\n",
2393
2581
  changeDetection: ChangeDetectionStrategy.OnPush,
2394
2582
  styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset;padding:0 6px!important}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection--multiple .ant-select-selection__rendered>ul>li.ant-select-search--inline:only-child{margin-left:4px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.nz-resizable-preview{position:absolute;top:0;left:0;z-index:8;border:1px dashed #d1d1d1}.nz-resizable-handle{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:9}.nz-resizable-handle-top{width:100%;height:10px;top:-5px;left:0}.nz-resizable-handle-right{height:100%}.nz-resizable-handle-bottom{width:100%;height:10px;bottom:-5px;left:0}.nz-resizable-handle-left{width:10px;height:100%;top:0;left:-5px}.nz-resizable-handle-topRight{width:20px;height:20px;top:-5px;right:-5px;z-index:10}.nz-resizable-handle-bottomRight{width:20px;height:20px;right:-5px;bottom:-5px;z-index:10}.nz-resizable-handle-bottomLeft{width:20px;height:20px;bottom:-5px;left:-5px;z-index:10}.nz-resizable-handle-topLeft{width:20px;height:20px;top:-5px;left:-5px;z-index:10}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottom,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-top{cursor:row-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-left,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-right{cursor:col-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomRight,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topLeft{cursor:nwse-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomLeft,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topRight{cursor:nesw-resize}.hd-table-col-settings{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;padding:0;margin-left:12px;cursor:pointer;color:#2a3634;background:0 0;border:1px solid #e5e6eb;border-radius:4px;vertical-align:middle;flex-shrink:0}.hd-table-col-settings:hover{color:#20b95d;background:#f5f8f6;border-color:#20b95d}.hd-table-col-settings .hd-table-col-settings-icon{display:block;width:14px;height:14px;flex-shrink:0}.hd-table-cell-with-actions{display:inline-flex;flex-wrap:wrap;align-items:center;-moz-column-gap:12px;column-gap:12px;row-gap:6px;max-width:100%}.hd-table-cell-with-actions .hd-table-cell-value{min-width:0}.hd-table-cell-with-actions .hd-table-cell-actions{flex-shrink:0}.hd-table-col-settings-dropdown{background:#fff;border:1px solid #e5e6eb;border-radius:4px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);overflow:hidden}.hd-table-col-settings-list{max-height:400px;overflow-y:auto}.hd-table-col-settings-footer{text-align:right;background:#fff;padding:4px;border-top:1px solid #f0f0f0}.hd-table-container ::ng-deep .ant-pagination-options-quick-jumper input{border-radius:2px;border:1px solid #d9d9d9}.hd-table-container ::ng-deep .ant-pagination-options .ant-select-selection{border-radius:2px}.hd-table-container ::ng-deep .ant-table-thead>tr>th{border-bottom:1px solid #ecf1ed;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td{border-bottom:1px solid #ecf1ed;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td.hd-table-line-no-col,.hd-table-container ::ng-deep .ant-table-thead>tr>th.hd-table-line-no-col{width:72px!important;min-width:72px!important;max-width:72px!important;box-sizing:border-box}.hd-table-container .hd-table-cell-value--edit,.hd-table-container .hd-table-cell-value--rowno{display:inline-flex;align-items:center;min-width:0}.hd-table-container .hd-table-cell-value--edit>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--edit>hd-status,.hd-table-container .hd-table-cell-value--edit>span:not(.hd-table-row-no),.hd-table-container .hd-table-cell-value--rowno>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--rowno>hd-status,.hd-table-container .hd-table-cell-value--rowno>span:not(.hd-table-row-no){min-width:0}.hd-table-container .hd-table-row-no{display:inline-flex;flex-shrink:0;align-items:center;margin-left:4px;color:#1d1f29;font-size:14px;line-height:22px}.hd-table-container .hd-table-row-no-bar{display:inline-block;flex:0 0 auto;align-self:center;width:1px;height:14px;margin-right:4px;background:#1d1f29;vertical-align:middle}.hd-table-container .hd-table-edit-icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;margin-left:2px;width:14px;height:14px;color:#20b95d;line-height:1;cursor:pointer}.hd-table-container .hd-table-edit-icon:hover{color:#20bd62}.hd-table-container .hd-table-edit-icon svg{display:block;width:14px;height:14px}.hd-table-container .hd-table-title-with-bar{display:inline-flex;align-items:center}.hd-table-container .hd-table-title-with-bar .hd-table-row-no-bar{width:1px;height:14px;margin:0 4px;align-self:center}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-right-sticky{background:#f7f8fa!important;color:#868a9c!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a{color:#20b95d!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a:hover{color:#20bd62!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group .common-danger-btn:hover{color:#f05b24!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-table-cell-value>a{color:#20b95d}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-billNumber>a{color:#3b77e3}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-status-text{color:#868a9c!important}.hd-table-container ::ng-deep cdk-virtual-scroll-viewport.ant-table-body .hd-table-virtual-row>td{box-sizing:border-box}.hd-table-container.hd-table--scroll-x ::ng-deep .ant-table-body>table,.hd-table-container.hd-table--scroll-x ::ng-deep .ant-table-header>table,.hd-table-container.hd-table--scroll-x ::ng-deep .cdk-virtual-scroll-content-wrapper>table{table-layout:fixed}.hd-table-container:not(.hd-table--scroll-y):not(.hd-table--scroll-x) ::ng-deep .ant-table-body{max-height:none!important;overflow-y:visible!important}.hd-table-container.hd-table--has-total ::ng-deep .ant-table-footer{padding:0;overflow:hidden;background:#fafafa;border-top:1px solid #e8e8e8}.hd-table-total-footer{width:100%;box-sizing:border-box;overflow-x:auto;overflow-y:hidden;background:#fafafa;scrollbar-width:thin;scrollbar-color:transparent transparent}.hd-table-total-footer::-webkit-scrollbar{width:12px;height:0}.hd-table-total-footer::-webkit-scrollbar-track{background:0 0}.hd-table-total-footer::-webkit-scrollbar-thumb{background:padding-box;border:4px solid transparent}.hd-table-total-footer::-webkit-scrollbar-corner{background:0 0}.hd-table-total-footer.hd-table-total-footer--y-gutter{overflow-y:scroll}.hd-table-total-footer.hd-table-total-footer--fluid{overflow-x:hidden}.hd-table-total-footer-table{table-layout:fixed;border-collapse:separate;border-spacing:0}.hd-table-total-footer-cell{padding:12px 8px;font-weight:500;background:#fafafa;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-bottom:0}.hd-table-total-footer-cell.hd-table-total-align-left{text-align:left!important}.hd-table-total-footer-cell.hd-table-total-align-center{text-align:center!important}.hd-table-total-footer-cell.hd-table-total-align-right{text-align:right!important}.hd-table-total-footer-select{width:40px;min-width:40px;max-width:40px;padding-left:8px;padding-right:8px;text-align:center}.hd-table-total-footer-line-no{width:72px;min-width:72px;max-width:72px}.hd-table-total-footer-sticky-left,.hd-table-total-footer-sticky-right{position:-webkit-sticky;position:sticky;z-index:2;background:#fafafa}::ng-deep .ant-dropdown-menu{border-radius:0}::ng-deep .ant-dropdown{margin-top:8px!important}.common-td-wrap{white-space:normal!important;word-break:break-all}.hd-table-cell-ellipsis{display:block;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.nz-resizable-preview{border-width:0 1px 0 0}.resize-trigger{width:10px;height:15px;position:relative;top:calc((100% - 15px)/ 2)}.resize-trigger::after{position:absolute;top:calc((100% - 15px)/ 2);left:0;background:#d5d5d5;content:'';width:1px;height:15px;z-index:1}.nz-resizable-handle-right{position:absolute;width:10px;top:0;right:-5px;z-index:inherit}::ng-deep .ant-table-th-right-sticky .nz-resizable-handle-right{right:0}.hd-table-tree-node{display:inline-flex;align-items:center;padding-right:10px}.hd-table-tree-node .hd-table-tree-node-img{display:flex;flex-direction:column;position:absolute;right:0;margin-top:-2.5px}.hd-table-tree-node .hd-table-tree-node-img i{opacity:.3}.hd-table-tree-node .hd-table-tree-node-img i:last-child{margin-top:-5px}img{width:20px;height:20px}.ant-table-th-left-sticky{z-index:2}::ng-deep .ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:unset}.hd-table-cell-edit{width:100%;min-width:0}.hd-table-cell-edit-control{width:100%!important}::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select{width:100%}::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select-selection{height:32px}::ng-deep .hd-table-cell-edit .ant-input-number-input{height:30px}::ng-deep .hd-table-cell-edit .ant-select-selection__rendered{line-height:30px}"]
2395
2583
  }] }
@@ -2678,6 +2866,33 @@ if (false) {
2678
2866
  * @private
2679
2867
  */
2680
2868
  HdTableComponent.prototype.hostResizeObserver;
2869
+ /**
2870
+ * select 展开 / 搜索防抖(对齐 form-lines)
2871
+ * @type {?}
2872
+ * @private
2873
+ */
2874
+ HdTableComponent.prototype.selectOpenChangeSubject;
2875
+ /**
2876
+ * @type {?}
2877
+ * @private
2878
+ */
2879
+ HdTableComponent.prototype.selectOpenChangeSubscription;
2880
+ /**
2881
+ * @type {?}
2882
+ * @private
2883
+ */
2884
+ HdTableComponent.prototype.selectSearchSubject;
2885
+ /**
2886
+ * @type {?}
2887
+ * @private
2888
+ */
2889
+ HdTableComponent.prototype.selectSearchSubscription;
2890
+ /**
2891
+ * 异步回写 options 的订阅,避免连点搜索泄漏
2892
+ * @type {?}
2893
+ * @private
2894
+ */
2895
+ HdTableComponent.prototype.selectLoaderSubscription;
2681
2896
  /**
2682
2897
  * 序号列固定宽(含 padding,可容纳 6 位如 199995)。
2683
2898
  * 不锁死时表体会随位数变宽(1→~64px,199995→~67px),合计行对不齐。
@@ -2711,4 +2926,4 @@ if (false) {
2711
2926
  */
2712
2927
  HdTableComponent.prototype.commonSessionService;
2713
2928
  }
2714
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsWUFBWSxHQUdiLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV2RSxPQUFPLEVBSUwsZ0JBQWdCLEVBQ2hCLFFBQVEsR0FDVCxNQUFNLG9CQUFvQixDQUFDO0FBTzVCLE1BQU0sT0FBTyxnQkFBZ0I7Ozs7OztJQThIM0IsWUFDVSxNQUFrQixFQUNsQixHQUFzQixFQUN0QixvQkFBMEM7UUFGMUMsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBL0gzQyxjQUFTLEdBQXlCLEVBQUUsQ0FBQztRQUVyQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5Qiw2QkFBd0IsR0FBWSxLQUFLLENBQUM7Ozs7UUFFMUMsb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFDaEMsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFHOUMsZ0JBQVcsR0FBVyxZQUFZLENBQUM7O1FBWW5CLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBTy9DLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FBRXRDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUNwRCxpQkFBWSxHQUFZLEtBQUssQ0FBQzs7OztRQUVkLGVBQVUsR0FBWSxJQUFJLENBQUM7Ozs7Ozs7UUFPM0Isb0JBQWUsR0FBWSxLQUFLLENBQUM7O1FBRWpELG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLGtCQUFhLEdBQVcsR0FBRyxDQUFDO1FBRzNCLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDL0Msd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUM5Qyw2QkFBd0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBTTdELFdBQU0sR0FBRyxJQUFJLENBQUM7O1FBR2QsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUN2QixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUVuQixtQkFBYyxHQUErQixFQUFFLENBQUM7UUFDaEQsbUJBQWMsR0FBMkIsRUFBRSxDQUFDOztRQUU1Qyx5QkFBb0IsR0FBRyxFQUFFLENBQUM7O1FBRTFCLHFCQUFnQixHQUFxQixJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFHNUQsbUJBQWMsR0FBeUIsRUFBRSxDQUFDO1FBQzFDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsdUJBQWtCLEdBQW9CLEVBQUUsQ0FBQztRQUN6Qyw0QkFBdUIsR0FBb0IsRUFBRSxDQUFDO1FBQzlDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRS9CLHNCQUFpQixHQUFZLEtBQUssQ0FBQzs7UUFFbkMsaUJBQVksR0FBb0IsRUFBRSxDQUFDOztRQUVuQyxrQkFBYSxHQUFvQixFQUFFLENBQUM7O1FBR3BDLHVCQUFrQixHQUFvQixFQUFFLENBQUM7UUFDekMsd0JBQW1CLEdBQW9CLEVBQUUsQ0FBQztRQUMxQyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGdCQUFXLEdBQVEsSUFBSSxDQUFDO1FBQ3hCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLDRCQUF1QixHQUFZLElBQUksQ0FBQztRQUN4QywyQkFBc0IsR0FBWSxLQUFLLENBQUM7Ozs7UUFHeEMsNEJBQXVCLEdBQUcsRUFBRSxDQUFDOzs7O1FBR3JCLHdCQUFtQixHQUFtQixJQUFJLENBQUM7Ozs7O1FBSW5ELHVCQUFrQixHQUFHLENBQUMsQ0FBQzs7OztRQUdmLDBCQUFxQixHQUFHLEtBQUssQ0FBQzs7OztRQUc5QixtQkFBYyxHQUFXLElBQUksQ0FBQztRQUM5QixxQkFBZ0IsR0FBVyxJQUFJLENBQUM7UUFJaEMsK0JBQTBCLEdBQWdCLElBQUksQ0FBQztRQUMvQyw2QkFBd0IsR0FBZSxJQUFJLENBQUM7UUFDNUMseUJBQW9CLEdBQUcsQ0FBQyxDQUFDOzs7O1FBR2pDLDJCQUFzQixHQUFHLEtBQUssQ0FBQzs7OztRQUd2Qix3QkFBbUIsR0FBUSxJQUFJLENBQUM7UUFDaEMsMEJBQXFCLEdBQWUsSUFBSSxDQUFDO1FBQ3pDLHVCQUFrQixHQUFRLElBQUksQ0FBQzs7Ozs7UUF1UDlCLHVCQUFrQixHQUFHLEVBQUUsQ0FBQztRQXVDakMsZUFBVTs7Ozs7UUFBRyxDQUFDLEtBQWEsRUFBRSxJQUFTLEVBQVUsRUFBRTs7a0JBQzFDLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDMUMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDcEQsQ0FBQyxFQUFDOzs7O1FBR0Ysc0JBQWlCOzs7O1FBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUFDLEtBQUssRUFBQztRQUVyRCxlQUFVOzs7OztRQUFHLENBQUMsTUFBYyxFQUFFLEdBQWtCLEVBQVUsRUFBRTtZQUMxRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDbkIsQ0FBQyxFQUFDOztRQW9ZRixlQUFVOzs7O1FBQUcsQ0FBQyxHQUE0QixFQUF1QixFQUFFO1lBQ2pFLElBQ0UsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtnQkFDeEIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUM1QixHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsRUFDYjtnQkFDQSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsQjtpQkFBTTs7b0JBQ0QsSUFBSSxHQUFhLElBQUksUUFBUSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDekMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzs7O29CQUVuQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTOzs7O2dCQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3ZELE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ2pELENBQUMsRUFBQzs7O29CQUVFLFNBQVMsR0FDWCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVM7Ozs7Z0JBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDbkMsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDN0MsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN0QixTQUFTLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQzlELENBQUMsQ0FDRixDQUFDO2dCQUNGLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsRUFBQztRQXJzQkEsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDO1lBQzVDLE1BQU0sRUFBRSxXQUFXLENBQUMsU0FBUztZQUM3QixJQUFJLEVBQUUsU0FBUzs7WUFDZixPQUFPLEVBQUUsR0FBRzs7WUFDWixTQUFTLEVBQUUsZUFBZTtTQUMzQixDQUFDLENBQUM7SUFDTCxDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssS0FBSyxFQUFFO1lBQ3JDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7U0FDeEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLEVBQUU7WUFDbkMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUN0RDtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDM0Q7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQ3JELDhCQUE4QixDQUMvQixDQUFDO1FBQ0YsV0FBVztRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUc7Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFdBQVc7YUFDYixLQUFLLEVBQUU7YUFDUCxJQUFJOzs7UUFBQyxHQUFHLEVBQUU7WUFDVCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDLEVBQUM7YUFDRCxLQUFLOzs7O1FBQUMsVUFBVSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsTUFBTSxpQkFBaUIsQ0FBQztRQUMxQixDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLE9BQXFCO1FBQy9CLElBQ0UsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNwQixPQUFPLENBQUMsa0JBQWtCLENBQUM7WUFDM0IsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxlQUFlLENBQUM7WUFDeEIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUNwQjtZQUNBLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO1FBRUQsSUFDRSxPQUFPO1lBQ1AsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNwQixPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsY0FBYyxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxlQUFlLENBQUMsRUFDckM7WUFDQSxJQUNFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxVQUFVLENBQUM7Z0JBQzlDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUM7Z0JBQ25ELE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUM7b0JBQ2hELE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFDckQ7Z0JBQ0EsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztnQkFDbEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUN0QixrQ0FBa0M7b0JBQ2xDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbEM7Z0JBQ0QscUNBQXFDO2dCQUNyQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztnQkFDdkMsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BCO1NBQ0Y7UUFFRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIsOEJBQThCO2dCQUM5QixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEM7WUFDRCx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7U0FDeEM7UUFFRCxJQUNFLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDcEQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQ2hEO1lBQ0EsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDbEQsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLFdBQVc7aUJBQ2IsS0FBSyxFQUFFO2lCQUNQLElBQUk7OztZQUFDLEdBQUcsRUFBRTtnQkFDVCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixDQUFDLEVBQUM7aUJBQ0QsS0FBSzs7OztZQUFDLFVBQVUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxpQkFBaUIsQ0FBQztZQUMxQixDQUFDLEVBQUMsQ0FBQztTQUNOO1FBRUQsSUFDRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDN0QsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUN2RTtZQUNBLDRDQUE0QztZQUM1QyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7Ozs7O0lBR0QsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNyRCxDQUFDOzs7O0lBRUQsY0FBYztRQUNaLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTs7OztRQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDOUMsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNsQyxPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsZ0NBQWdDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUM7UUFDOUIsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7OztJQUVELElBQUksQ0FBQyxJQUFvQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDOzs7OztJQUVELFVBQVUsQ0FBQyxHQUFrQjtRQUMzQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDaEQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6RSxDQUFDOzs7O0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7OztJQUVELElBQUksd0JBQXdCO1FBQzFCLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLEVBQUU7WUFDNUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQzs7Ozs7OztJQU1PLG1CQUFtQjtRQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDN0MsQ0FBQzs7Ozs7OztJQU1PLGtCQUFrQjs7Y0FDbEIsT0FBTyxHQUNYLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFOztjQUNsRSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU07UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUM1QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2QsT0FBTyxDQUFDLENBQUM7U0FDVjs7Y0FDSyxRQUFRLEdBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7O2NBQzVELFNBQVMsR0FDYixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Y0FDN0QsS0FBSyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVE7UUFDeEMsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDOzs7OztJQUdELElBQUksbUJBQW1COztjQUNmLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7UUFDMUMsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7O2NBQ0ssU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRTs7Y0FDdEMsZUFBZSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsd0JBQXdCO1FBQ2hFLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO1lBQ2pDLE9BQU8sZUFBZSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1NBQ3pEO1FBQ0QsT0FBTyxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3hCLENBQUM7Ozs7O0lBR0QsSUFBSSxnQkFBZ0I7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7Ozs7O0lBRUQsY0FBYyxDQUFDLEdBQWtCO1FBQy9CLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hFLENBQUM7Ozs7O0lBRUQsYUFBYSxDQUFDLEdBQWtCO1FBQzlCLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2xFLENBQUM7Ozs7O0lBU0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDNUMsQ0FBQzs7OztJQUVELElBQUksb0JBQW9CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUN4QyxDQUFDOzs7Ozs7SUFNRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQzs7Ozs7SUFHRCxJQUFJLHFCQUFxQjtRQUN2QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJO2dCQUNoQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2YsQ0FBQzs7Ozs7O0lBR0QsYUFBYSxDQUFDLEtBQWE7O2NBQ25CLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Y0FDeEUsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztjQUN0RSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7OztJQWNELGtCQUFrQjtRQUNoQixzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFdBQVc7YUFDYixPQUFPLENBQ04sV0FBVztZQUNULElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtZQUN6QixHQUFHO1lBQ0gsSUFBSSxDQUFDLFlBQVk7WUFDakIsR0FBRztZQUNILElBQUksQ0FBQyxJQUFJLENBQ1o7YUFDQSxJQUFJOzs7O1FBQUMsQ0FBQyxLQUF1QixFQUFFLEVBQUU7WUFDaEMsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQ2pDLElBQ0UsSUFBSSxDQUFDLFVBQVU7b0JBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVE7b0JBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsRUFBRSxFQUNuQztvQkFDQSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7b0JBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUNuRDthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQzthQUNyRDtZQUNELGdEQUFnRDtZQUNoRCxJQUNFLElBQUksQ0FBQyxVQUFVO2dCQUNmLENBQUMsSUFBSSxDQUFDLGVBQWU7Z0JBQ3JCLElBQUksQ0FBQyx1QkFBdUIsRUFDNUI7Z0JBQ0EsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDeEQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQzthQUNyQztZQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDLEVBQUM7YUFDRCxLQUFLOzs7O1FBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNiLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3BELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxNQUFNLCtDQUErQyxDQUFDO1NBQ3ZEO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7Ozs7OztJQUdELG9CQUFvQixDQUFDLFlBQVksR0FBRyxLQUFLOztjQUNqQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjs7Y0FDbEMsV0FBVyxHQUNmLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pDLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxVQUFVO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUM7UUFFdEMsSUFBSSxZQUFZLElBQUksV0FBVyxFQUFFO1lBQy9CLCtCQUErQjtZQUMvQix5REFBeUQ7WUFDekQseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLFVBQVU7OztZQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDeEIsVUFBVTs7O2dCQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxFQUFDLENBQUM7WUFDTCxDQUFDLEVBQUMsQ0FBQztZQUNILE9BQU87U0FDUjs7Y0FFSyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7O2NBQ1osUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakQsd0NBQXdDO1FBQ3hDLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLFVBQVU7OztZQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDeEIsVUFBVTs7O2dCQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3BDLENBQUMsRUFBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFDLENBQUM7WUFDSCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQyxDQUFDOzs7Ozs7O0lBR08seUJBQXlCLENBQUMsVUFBbUI7O2NBQzdDLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7O2NBQ3RDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUM1QyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLENBQUM7WUFDRCxDQUFDLEVBQUUsZ0JBQWdCLFNBQVMsS0FBSztTQUNsQyxDQUFDO0lBQ0osQ0FBQzs7Ozs7O0lBRU8sZ0JBQWdCLENBQUMsVUFBbUI7UUFDMUMsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyw4QkFBOEI7WUFDOUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakMsT0FBTzthQUNSO1NBQ0Y7UUFDRCxVQUFVOzs7UUFBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUN0QyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQsNEJBQTRCLENBQUMsWUFBWSxHQUFHLEtBQUs7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixJQUFJLFlBQVksRUFBRTtnQkFDaEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDekI7WUFDRCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUNwQyxPQUFPO1NBQ1I7UUFDRCxVQUFVOzs7UUFBQyxHQUFHLEVBQUU7O2tCQUNSLFFBQVEsR0FDWixJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QjtZQUN6RSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNiLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztnQkFDcEMsT0FBTzthQUNSOztrQkFDSyxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQztZQUMxRCxJQUFJLFFBQVEsRUFBRTtnQkFDWixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3hCLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUM3QixVQUFVOzs7Z0JBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7b0JBQzVCLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztnQkFDdEMsQ0FBQyxFQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2FBQ3JDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7Ozs7SUFHTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixPQUFPO1NBQ1I7O2NBQ0ssT0FBTyxHQUFHLG1CQUFBLElBQUksQ0FBQyxnQkFBZ0IsRUFBTzs7Y0FDdEMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0I7UUFDL0QsSUFBSSxRQUFRLEVBQUU7WUFDWixJQUFJLE9BQU8sQ0FBQyxtQkFBQSxRQUFRLEVBQU8sQ0FBQyxDQUFDLGNBQWMsS0FBSyxVQUFVLEVBQUU7Z0JBQzFELENBQUMsbUJBQUEsUUFBUSxFQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxtQkFBQSxRQUFRLEVBQU8sQ0FBQyxDQUFDLGFBQWEsS0FBSyxVQUFVLEVBQUU7Z0JBQ3pELENBQUMsbUJBQUEsUUFBUSxFQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEM7O2tCQUNLLFVBQVUsR0FDZCxRQUFRLENBQUMsVUFBVTtnQkFDbkIsQ0FBQyxtQkFBQSxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBZSxDQUFDO1lBQ3BELElBQUksVUFBVSxFQUFFO2dCQUNkLFVBQVUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQzFCO1NBQ0Y7O2NBQ0ssY0FBYyxHQUFHO1lBQ3JCLE9BQU8sQ0FBQyx5QkFBeUI7WUFDakMsT0FBTyxDQUFDLHNCQUFzQjtZQUM5QixPQUFPLENBQUMsZ0JBQWdCLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWE7U0FDbkU7UUFDRCxjQUFjLENBQUMsT0FBTzs7OztRQUFDLENBQUMsRUFBZSxFQUFFLEVBQUU7WUFDekMsSUFBSSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7YUFDbEI7UUFDSCxDQUFDLEVBQUMsQ0FBQzs7Y0FDRyxTQUFTLEdBQ2IsT0FBTyxDQUFDLGdCQUFnQjtZQUN4QixDQUFDLG1CQUFBLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQWUsQ0FBQztRQUN6RCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsT0FBTztTQUNSOztjQUNLLEtBQUssR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQ3RDLDhDQUE4QyxDQUMvQztRQUNELEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLOzs7O1FBQUUsQ0FBQyxFQUFlLEVBQUUsRUFBRTtZQUN0RCxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNuQixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7Ozs7SUFNTywrQkFBK0I7OztjQUUvQixNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQztRQUMzQixNQUFNLENBQUMsT0FBTzs7Ozs7UUFBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMzQixVQUFVOzs7WUFBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQy9CLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO2lCQUNwQztZQUNILENBQUMsR0FBRSxFQUFFLENBQUMsQ0FBQztRQUNULENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFTyw0QkFBNEI7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDOzs7Ozs7SUFHRCxzQkFBc0IsQ0FBQyxLQUFLLEdBQUcsS0FBSztRQUNsQyxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3RFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7O2NBQ0ssUUFBUSxHQUNaLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCOztjQUNuRSxTQUFTLEdBQ2IsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixDQUFDLG1CQUFBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBZSxDQUFDOztjQUN6RCxHQUFHLEdBQ1AsQ0FBQyxRQUFRO1lBQ1AsQ0FBQyxtQkFBQSxDQUFDLG1CQUFBLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFlLENBQUMsQ0FBQyxhQUFhLENBQy9ELHlCQUF5QixDQUMxQixFQUFlLENBQUMsQ0FBQztZQUNwQixDQUFDLFNBQVMsSUFBSSxDQUFDLG1CQUFBLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQWUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQUU7WUFDakMsT0FBTyxLQUFLLENBQUM7U0FDZDs7Y0FDSyxNQUFNLEdBQUcsR0FBRyxDQUFDLFlBQVk7UUFDL0IsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzNDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7SUFHRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUdELGVBQWU7UUFDYixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTzs7OztRQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUMsRUFBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUdELE9BQU87UUFDTCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDbkIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNOzs7OztZQUNwRCxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDWixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDbkQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNMLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMxQjtnQkFDRCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUMsR0FDRCxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUM5QjtZQUNELE1BQU0sQ0FBQyxJQUFJOzs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNuQixPQUFPLENBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUM1QyxDQUFDO1lBQ0osQ0FBQyxFQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7O1FBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDakUsQ0FBQyxDQUFDLElBQUk7b0JBQ04sQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDVixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO3dCQUNyQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7d0JBQ3BCLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSzt3QkFDbEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSzs7d0JBRXRDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDOzRCQUN6RCxDQUFDLENBQUMsSUFBSTs0QkFDTixDQUFDLENBQUMsS0FBSztxQkFDVixDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7d0JBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSzt3QkFDcEIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxLQUFLO3dCQUNsQixRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLOzt3QkFFdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7NEJBQ3pELENBQUMsQ0FBQyxJQUFJOzRCQUNOLENBQUMsQ0FBQyxLQUFLO3FCQUNWLENBQUMsQ0FBQztpQkFDSjthQUNGO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDckIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO29CQUNwQixHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUs7b0JBQ2xCLE9BQU8sRUFBRSxJQUFJOztvQkFFYixRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO2lCQUN2QyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsRUFBQyxDQUFDO1FBRUgsWUFBWTtRQUNaLElBQ0UsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQzFDO1lBQ0EsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPOzs7O1lBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDN0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ2xELEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM1RDtZQUNILENBQUMsRUFBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsVUFBVTs7O1FBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDNUIsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7Ozs7SUFxQ0QsaUJBQWlCLENBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLEdBQUc7O2NBQzFELFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7O2NBQzFDLFdBQVcsR0FBRyxRQUFRLENBQUMsU0FBUzs7OztRQUNwQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxrQkFBa0IsRUFDNUM7O2NBQ0ssWUFBWSxHQUFHLFFBQVEsQ0FBQyxTQUFTOzs7O1FBQ3JDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLGtCQUFrQixFQUM1Qzs7Y0FDSyxRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVzs7O2NBRXBELGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdkQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOzs7Ozs7SUFHRCxXQUFXLENBQUMsS0FBd0I7UUFDbEMseUNBQXlDO1FBQ3pDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFOztnQkFDekIsSUFBSSxHQUFhLElBQUksUUFBUSxFQUFFO1lBQ25DLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUk7Ozs7WUFBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2hELENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7OztnQkFFaEIsS0FBSyxHQUFHLElBQUk7WUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7b0JBQzVDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDckMsTUFBTTtpQkFDUDthQUNGOztnQkFDRyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDVixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDOUI7aUJBQU07O3NCQUNDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVM7Ozs7Z0JBQ3ZDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssRUFDL0I7Z0JBQ0QsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDMUM7WUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLGlCQUFpQixDQUFDO1lBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNOzs7O1lBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDdEQsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNoRCxDQUFDLEVBQUMsQ0FBQztTQUNKO2FBQU07Ozs7O2dCQUlELGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87Ozs7WUFBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFOzswQkFDcEMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbEQsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQzFCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDbkM7WUFDSCxDQUFDLEVBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLENBQUM7WUFFdkMsMENBQTBDO1lBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNOzs7O1lBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDcEQsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNoRCxDQUFDLEVBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUdELGdCQUFnQjs7WUFDVixpQkFBaUIsR0FBb0IsRUFBRTtRQUMzQyxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFOztvQkFDaEQsUUFBUSxHQUFhLElBQUksUUFBUSxFQUFFO2dCQUN2QyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQzVCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDMUIsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDOUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsRUFBQyxDQUFDO1FBQ0gsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDOzs7O0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7WUFBQyxDQUFDLElBQUksRUFBRSxFQUFFOztzQkFDeEIsSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLHNCQUFzQjtnQkFDM0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUM1QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUM1QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxDQUFDLEVBQUMsQ0FBQztTQUNKOzs7Y0FFSyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNOzs7O1FBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFDOztjQUNwRSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNOzs7O1FBQzFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFDL0I7O2NBQ0ssVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTs7OztRQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUM7O2NBQ3ZELFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDMUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzVELFlBQVk7WUFDWixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0M7SUFDSCxDQUFDOzs7O0lBRUQseUJBQXlCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7U0FDN0Q7YUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxZQUFZLEdBQUcsQ0FBQyxFQUFFOztrQkFDdEQsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFrQjtZQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPOzs7O1lBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDM0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBQSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7U0FDN0M7SUFDSCxDQUFDOzs7OztJQUVPLFlBQVk7UUFDbEIsT0FBTyxDQUFDLENBQUMsQ0FDUCxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJO1lBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDdEMsQ0FBQztJQUNKLENBQUM7Ozs7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQ3RCLFdBQVc7WUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVE7WUFDekIsR0FBRztZQUNILElBQUksQ0FBQyxZQUFZO1lBQ2pCLEdBQUc7WUFDSCxJQUFJLENBQUMsSUFBSSxFQUNYLElBQUksQ0FBQyxnQkFBZ0IsQ0FDdEIsQ0FBQztJQUNKLENBQUM7Ozs7SUFFRCxlQUFlO1FBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7b0JBQ3ZELE1BQU0saUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7aUJBQ3JEO2FBQ0Y7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7O0lBRUQsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFpQixFQUFFLEdBQWtCO1FBQ25ELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDOztZQUM3QixTQUFTLEdBQUcsQ0FBQztRQUNqQixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQ3hCLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDbkI7YUFBTTtZQUNMLFNBQVMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRzs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDeEMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsbUJBQU0sQ0FBQyxJQUFFLEtBQUssRUFBRSxTQUFTLElBQUcsQ0FBQyxDQUFDLENBQUMsRUFDdkQsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLFVBQVU7OztRQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFDLENBQUM7SUFDbkQsQ0FBQzs7OztJQUVELGNBQWM7O1lBQ1IsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSTs7OztRQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksRUFBQyxJQUFJLElBQUk7UUFDekUsSUFBSSxVQUFVLEVBQUU7O2dCQUNWLE9BQU8sR0FBRyxFQUFFO1lBQ2hCLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTzs7OztZQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO29CQUNqQixPQUFPLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2lCQUM3RDtZQUNILENBQUMsRUFBQyxDQUFDOztrQkFFRyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLHNCQUFzQjtZQUMzRCxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxVQUFVLENBQUMsS0FBSztnQkFDZCxJQUFJLENBQUMsV0FBVztvQkFDaEIsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU07Ozs7b0JBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUNwRSxFQUFFLENBQUM7WUFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDNUIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDOzs7Ozs7SUFFRCxZQUFZLENBQUMsRUFBTyxFQUFFLEtBQVU7UUFDOUIsSUFBSSxFQUFFLEVBQUU7WUFDTixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDWDtJQUNILENBQUM7Ozs7OztJQUVELGVBQWUsQ0FBQyxHQUFlLEVBQUUsSUFBUztRQUN4QyxJQUFJLE9BQU8sR0FBRyxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUU7WUFDekMsT0FBTyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztJQUMzQixDQUFDOzs7Ozs7SUFFRCxVQUFVLENBQUMsR0FBZSxFQUFFLElBQVM7UUFDbkMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQ2xDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDN0I7UUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQzs7Ozs7O0lBRUQsV0FBVyxDQUFDLEdBQWUsRUFBRSxJQUFTO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDO0lBQzdDLENBQUM7Ozs7Ozs7SUFHTyxpQkFBaUIsQ0FBQyxTQUFpQjtRQUN6QyxPQUFPLGdCQUFnQixTQUFTLEtBQUssQ0FBQztJQUN4QyxDQUFDOzs7OztJQUVPLFlBQVk7UUFDbEIsT0FBTyxDQUFDLENBQUMsQ0FDUCxJQUFJLENBQUMsU0FBUztZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQzlCLENBQUM7SUFDSixDQUFDOzs7Ozs7OztJQU1PLGNBQWMsQ0FBQyxRQUFnQjs7Y0FDL0IsVUFBVSxHQUFHLHNCQUFzQixDQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFDbkIsUUFBUSxDQUNUO1FBQ0QsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMxQyxDQUFDOzs7Ozs7SUFHTyxvQkFBb0I7O2NBQ3BCLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzs7Y0FDdEQsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ25ELElBQ0UsSUFBSSxDQUFDLE1BQU07WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPO1lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFDMUI7WUFDQSxVQUFVOzs7WUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBQyxDQUFDO1lBQ2pELE9BQU87U0FDUjtRQUNELG1DQUFtQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixVQUFVOzs7UUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBQyxDQUFDO0lBQ3BELENBQUM7Ozs7OztJQUdPLHdCQUF3QjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLE9BQU87U0FDUjs7Y0FDSyxNQUFNLEdBQUcsbUJBQUEsQ0FBQyxtQkFBQSxJQUFJLENBQUMsZ0JBQWdCLEVBQU8sQ0FBQyxDQUFDLHdCQUF3QixFQUU5RDs7Y0FDRixJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1FBQ3hDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ2xELElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUN6QyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7YUFDckM7U0FDRjtRQUNELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Ozs7OztJQUdPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7O2NBQ0ssR0FBRyxHQUFHLG1CQUFBLENBQUMsbUJBQUEsSUFBSSxDQUFDLGdCQUFnQixFQUFPLENBQUMsQ0FBQyx5QkFBeUIsRUFFNUQ7UUFDUixJQUFJLEdBQUcsRUFBRTtZQUNQLE9BQU8sR0FBRyxDQUFDO1NBQ1o7O2NBQ0ssSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxtQkFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBZSxDQUFDO1FBQ3RFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxDQUNMLENBQUMsbUJBQUEsSUFBSSxDQUFDLGFBQWEsQ0FDakIsNENBQTRDLENBQzdDLEVBQWUsQ0FBQztZQUNqQixDQUFDLG1CQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsRUFBZSxDQUFDO1lBQ3RELElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQzs7Ozs7SUFFTyxzQkFBc0I7O2NBQ3RCLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsbUJBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQWUsQ0FBQztRQUN0RSxPQUFPLElBQUk7WUFDVCxDQUFDLENBQUMsQ0FBQyxtQkFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLEVBQWUsQ0FBQztZQUMvRCxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQzs7Ozs7OztJQUdPLHdCQUF3QixDQUFDLElBQWlCO1FBQ2hELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxDQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQ3hDLENBQUM7SUFDSixDQUFDOzs7Ozs7Ozs7SUFRTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDbkMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDekI7WUFDRCxPQUFPO1NBQ1I7O2NBQ0ssTUFBTSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRTs7Y0FDdEMsSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtRQUN4QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsVUFBVTs7O2dCQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxHQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ3REO1lBQ0QsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQzs7Y0FDeEIsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssV0FBVyxFQUFFO1lBQy9DLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxXQUFXLENBQUM7WUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDOzs7Ozs7SUFFTyx5QkFBeUIsQ0FBQyxVQUFrQjs7Y0FDNUMsTUFBTSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtRQUM1QyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsRUFBRTtZQUM5QyxNQUFNLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztTQUNoQztJQUNILENBQUM7Ozs7OztJQUVPLHlCQUF5QixDQUFDLElBQWlCO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUM1RCxPQUFPO1NBQ1I7UUFDRCxJQUNFLElBQUksQ0FBQywwQkFBMEIsS0FBSyxJQUFJO1lBQ3hDLElBQUksQ0FBQyx3QkFBd0IsRUFDN0I7WUFDQSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyx3QkFBd0I7OztRQUFHLEdBQUcsRUFBRTtZQUNuQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQSxDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsbUJBQUE7WUFDN0QsT0FBTyxFQUFFLElBQUk7U0FDZCxFQUFPLENBQUMsQ0FBQztJQUNaLENBQUM7Ozs7O0lBRU8sMkJBQTJCO1FBQ2pDLElBQUksSUFBSSxDQUFDLDBCQUEwQixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNwRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsbUJBQW1CLENBQ2pELFFBQVEsRUFDUixJQUFJLENBQUMsd0JBQXdCLENBQzlCLENBQUM7U0FDSDtRQUNELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDdkMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDOzs7Ozs7O0lBTU8sc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxxQkFBcUI7OztRQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFBLENBQUM7UUFDckUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7WUFDakMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUMvRDs7Y0FDSyxFQUFFLEdBQ04sT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFBLE1BQU0sRUFBTyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ3ZFLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDbEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksRUFBRTs7O1lBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDOzs7OztJQUVPLHdCQUF3QjtRQUM5QixJQUFJLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7WUFDL0QsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUNsRTtRQUNELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7U0FDaEM7UUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLEVBQUU7WUFDcEMsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7U0FDakM7SUFDSCxDQUFDOzs7OztJQUVPLDBCQUEwQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLEVBQUU7WUFDcEMsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVU7OztRQUFDLEdBQUcsRUFBRTtZQUN6QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQzdDLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLHlCQUF5QjtZQUN6QixVQUFVOzs7WUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsR0FBRSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDLEdBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDOzs7O0lBRUQsVUFBVTs7WUFDSixRQUFRLEdBQUcsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsUUFBUSxJQUFJLEVBQUUsQ0FBQztTQUNoQjtRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixRQUFRLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsa0JBQWtCO1NBQ3hEO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7YUFDbkM7WUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7Z0JBQzNCLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ3hCO1FBQ0gsQ0FBQyxFQUFDLENBQUM7OztZQUdDLFdBQVcsR0FBRyxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2tCQUM3QyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hCLFNBQVM7YUFDVjtZQUNELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO2dCQUNuQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQzthQUMzQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQzthQUMxQjtTQUNGO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQzs7Y0FDN0IsU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRTs7Y0FDdEMsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0I7O2NBQ2xDLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRztnQkFDWixDQUFDLEVBQUUsT0FBTztnQkFDVixDQUFDLEVBQUUsSUFBSTthQUNSLENBQUM7WUFDRixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHO2dCQUNaLENBQUMsRUFBRSxPQUFPO2dCQUNWLENBQUMsRUFBRSxnQkFBZ0IsU0FBUyxLQUFLO2FBQ2xDLENBQUM7WUFDRixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osQ0FBQyxFQUFFLE9BQU87WUFDVixDQUFDLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztTQUNyQyxDQUFDO0lBQ0osQ0FBQzs7Ozs7O0lBR0QscUJBQXFCLENBQUMsTUFBVztRQUMvQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUFFRCxNQUFNLENBQUMsS0FBYztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixPQUFPO1NBQ1I7UUFDRCx5QkFBeUI7UUFDekIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNuRDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUNyRDtZQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNwRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QiwyQ0FBMkM7WUFDM0MsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztZQUNsQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDcEQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUN4RDthQUFNO1lBQ0wsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEQsWUFBWTtZQUNaLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDOzs7Ozs7O0lBT0QsbUJBQW1CO1FBQ2pCLElBQ0UsQ0FBQyxJQUFJLENBQUMsY0FBYztZQUNwQixDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDdEIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUM3QjtZQUNBLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7WUFDL0IsT0FBTztTQUNSOztjQUNLLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTTs7OztRQUMvQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUMvQjs7O2NBRUssVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDOztjQUN2QyxZQUFZLEdBQ2hCLFVBQVUsR0FBRyxDQUFDO1lBQ1osQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQztnQkFDaEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNO1FBQzFCLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1lBQy9CLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7O2NBQ3ZELE9BQU8sR0FDWCxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTzs7OztRQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRTtnQkFDN0QsT0FBTzthQUNSOztnQkFDRyxLQUFLLEdBQVEsSUFBSSxDQUFDLFdBQVc7WUFDakMsaURBQWlEO1lBQ2pELElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFOztzQkFDM0IsR0FBRyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQzs7c0JBQ3ZDLEtBQUssR0FBRyxHQUFHLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSTtnQkFDbkUsSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDVixPQUFPO2lCQUNSOztvQkFDRyxHQUFHLEdBQUcsQ0FBQzs7b0JBQ1AsUUFBUSxHQUFHLEtBQUs7Z0JBQ3BCLE9BQU8sQ0FBQyxPQUFPOzs7O2dCQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7OzBCQUNoQixHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ25DLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFO3dCQUM3QixPQUFPO3FCQUNSOzswQkFDSyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDZixHQUFHLElBQUksR0FBRyxDQUFDO3dCQUNYLFFBQVEsR0FBRyxJQUFJLENBQUM7cUJBQ2pCO2dCQUNILENBQUMsRUFBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2IsT0FBTztpQkFDUjtnQkFDRCxLQUFLLEdBQUcsR0FBRyxDQUFDO2FBQ2I7O2tCQUNLLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUc7Z0JBQ2hELEtBQUs7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU07Z0JBQy9ELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLEtBQUs7Z0JBQ3RDLGNBQWMsRUFDWixJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSzthQUM3QixDQUFDO1FBQ0osQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7Ozs7O0lBRU8scUJBQXFCLENBQUMsR0FBa0IsRUFBRSxRQUFnQjtRQUNoRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtZQUMzRSxPQUFPLElBQUksQ0FBQztTQUNiOztZQUNHLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTs7a0JBQzVCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtnQkFDM0IsWUFBWSxFQUFFLENBQUM7YUFDaEI7U0FDRjtRQUNELElBQUksWUFBWSxHQUFHLENBQUMsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtZQUN4RSxPQUFPLElBQUksQ0FBQztTQUNiOztjQUNLLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDO1FBQ3BELE9BQU8sSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEQsQ0FBQzs7Ozs7OztJQUdELHNCQUFzQixDQUFDLEdBQWtCLEVBQUUsUUFBZ0I7O2NBQ25ELElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztRQUN0RCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDeEIsT0FBTyxFQUFFLENBQUM7U0FDWDs7Y0FDSyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUs7UUFDeEIsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUMzQixPQUFPLEVBQUUsQ0FBQztTQUNYOztjQUNLLFFBQVEsR0FDWixJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN4QyxPQUFPLEtBQUssQ0FBQztTQUNkOztjQUNLLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUM7UUFDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6RSxDQUFDOzs7Ozs7SUFFRCxzQkFBc0IsQ0FBQyxHQUFrQixFQUFFLFFBQWdCOztjQUNuRCxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7O2NBQ2hELEtBQUssR0FDVCxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU07UUFDdEQsSUFBSSxLQUFLLEtBQUssT0FBTyxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRTtZQUMvRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7Ozs7SUFHRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkU7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxJQUFJLElBQUk7WUFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYTtZQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7OztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLGlFQUFpRTtRQUNqRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNuQyxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTs7a0JBQ2hDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNsQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDbEM7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7Ozs7O0lBRUQsYUFBYSxDQUFDLFFBQWlCLEtBQUssRUFBRSxPQUFZLElBQUk7UUFDcEQsSUFBSSxJQUFJLEVBQUU7WUFDUiwrQkFBK0I7WUFDL0IsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN4QixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDcEQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDeEQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN6QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2FBQ3REO1NBQ0Y7O2NBQ0ssY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNOzs7O1FBQ2xELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFDdkM7UUFDRCxJQUFJLENBQUMsdUJBQXVCO1lBQzFCLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDekIsY0FBYyxDQUFDLEtBQUs7Ozs7Z0JBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLGVBQWU7WUFDbEIsY0FBYyxDQUFDLElBQUk7Ozs7WUFDakIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQ3JDLGFBQWE7UUFDYixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7O2tCQUNkLFlBQVksR0FBZSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDbkUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDckM7UUFDRCxpQkFBaUI7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7U0FDdEM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7Ozs7O0lBRUQsUUFBUSxDQUFDLEtBQWM7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3RDLDRCQUE0QjtZQUM1QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDL0IsT0FBTzthQUNSO1lBQ0QsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDeEQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN6QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2FBQ3REO1lBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RELENBQUMsRUFBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7Ozs7O0lBR0QsZ0JBQWdCLENBQUMsSUFBUztRQUN4QixPQUFPLENBQUMsQ0FBQyxDQUNQLElBQUksQ0FBQyxtQkFBbUI7WUFDeEIsSUFBSTtZQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxJQUFJLENBQ3hDLENBQUM7SUFDSixDQUFDOzs7Ozs7SUFHRCxZQUFZLENBQUMsSUFBUztRQUNwQixPQUFPLENBQUMsQ0FBQyxDQUNQLElBQUksQ0FBQyxlQUFlO1lBQ3BCLElBQUk7WUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLElBQUksQ0FDcEMsQ0FBQztJQUNKLENBQUM7Ozs7Ozs7SUFLRCxnQkFBZ0IsQ0FBQyxHQUFrQixFQUFFLElBQVM7UUFDNUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRTtZQUNqRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFOztrQkFDN0IsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQzdCLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQztTQUN0QjtRQUNELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQztJQUNuQixDQUFDOzs7Ozs7OztJQUdELGdCQUFnQixDQUFDLEdBQWtCLEVBQUUsSUFBUyxFQUFFLE9BQWdCO1FBQzlELElBQUksT0FBTyxFQUFFO1lBQ1gsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7Ozs7OztJQUdELGlCQUFpQixDQUFDLEdBQWtCLEVBQUUsSUFBUztRQUM3QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDM0IsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7Ozs7SUFFRCxhQUFhLENBQUMsR0FBUTtRQUNwQixJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sR0FBRyxDQUFDO1NBQ1o7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDOzs7OztJQUVELGFBQWEsQ0FBQyxHQUFrQjtRQUM5QixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7WUFDZixPQUFPLG1CQUFBLEdBQUcsQ0FBQyxJQUFJLEVBQVUsQ0FBQztTQUMzQjtRQUNELE9BQU8sR0FBRyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUM7SUFDbkMsQ0FBQzs7Ozs7O0lBR0QsUUFBUSxDQUFDLEdBQWtCO1FBQ3pCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQzs7Ozs7Ozs7SUFLRCxZQUFZLENBQUMsR0FBa0IsRUFBRSxJQUFTLEVBQUUsS0FBYTtRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN2QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFOztrQkFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUMzQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRTtnQkFDakMsT0FBTyxFQUFFLENBQUM7YUFDWDtZQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCOztjQUNLLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Y0FDeEUsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztjQUN0RSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sTUFBTSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQzs7Ozs7O0lBR0QsYUFBYSxDQUFDLEdBQWtCO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkYsT0FBTyxJQUFJLENBQUM7U0FDYjs7Y0FDSyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3hDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDOzs7Ozs7O0lBR0QsVUFBVSxDQUFDLEdBQWtCLEVBQUUsSUFBUztRQUN0QyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7WUFDbEQsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksT0FBTyxHQUFHLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUN0QyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUN4QixDQUFDOzs7Ozs7OztJQUdELFdBQVcsQ0FBQyxLQUFZLEVBQUUsR0FBa0IsRUFBRSxJQUFTO1FBQ3JELElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7Ozs7O0lBR0QsYUFBYSxDQUFDLEdBQWtCO1FBQzlCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQ1YseUNBQXlDO2dCQUN2QyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNqQixRQUFRLENBQ1gsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7OztJQUVELGNBQWMsQ0FBQyxHQUFrQixFQUFFLElBQVM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRTtZQUNsRSxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxZQUFZLEtBQUssVUFBVSxFQUFFO1lBQzFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7UUFDRCxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO0lBQzVCLENBQUM7Ozs7OztJQUVELGFBQWEsQ0FBQyxHQUFrQixFQUFFLElBQVM7UUFDekMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUU7WUFDN0IsT0FBTyxFQUFFLENBQUM7U0FDWDs7Y0FDSyxHQUFHLEdBQUcsR0FBRyxDQUFDLFlBQVk7UUFDNUIsSUFBSSxHQUFHLENBQUMsY0FBYyxJQUFJLElBQUksRUFBRTs7a0JBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztZQUNyQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzdELENBQUM7Ozs7OztJQUVELG9CQUFvQixDQUFDLEdBQWtCLEVBQUUsSUFBUztRQUNoRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksRUFBRTtZQUN0QyxPQUFPLEVBQUUsQ0FBQztTQUNYOztjQUNLLEdBQUcsR0FBRyxHQUFHLENBQUMsWUFBWTs7Y0FDdEIsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDOztjQUN2QixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDN0IsSUFBSSxHQUFHLENBQUMsaUJBQWlCLElBQUksR0FBRyxDQUFDLGNBQWMsRUFBRTtZQUMvQyxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN2RTtRQUNELE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7Ozs7OztJQUVELGtCQUFrQixDQUNoQixHQUFrQixFQUNsQixHQUF5QyxFQUN6QyxRQUFnQjtRQUVoQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRTtZQUM1QixPQUFPLFFBQVEsQ0FBQztTQUNqQjs7Y0FDSyxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFDaEMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUM5QyxDQUFDOzs7Ozs7OztJQUdELFlBQVksQ0FBQyxHQUFrQixFQUFFLElBQVMsRUFBRSxLQUFVO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3JDLE9BQU87U0FDUjs7Y0FDSyxJQUFJLEdBQUcsbUJBQUEsR0FBRyxDQUFDLElBQUksRUFBVTs7Y0FDekIsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNuQixJQUFJLEVBQUUsSUFBSTtZQUNWLEdBQUc7WUFDSCxJQUFJO1lBQ0osS0FBSztZQUNMLGFBQWE7U0FDZCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7Ozs7Ozs7O0lBR0QsY0FBYyxDQUFDLEdBQWtCLEVBQUUsSUFBUyxFQUFFLEtBQVU7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDckMsT0FBTztTQUNSOztjQUNLLElBQUksR0FBRyxtQkFBQSxHQUFHLENBQUMsSUFBSSxFQUFVOztjQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLFlBQVk7O2NBQ3RCLFVBQVUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSTs7Y0FDaEQsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7O2NBQzFCLGFBQWEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUzs7Y0FDekQsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQzs7Y0FDcEMsY0FBYyxHQUNsQixhQUFhLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRztZQUMzQixDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSTs7OztZQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxhQUFhLEVBQUM7Z0JBQzlELElBQUk7O2NBQ0osTUFBTSxHQUNWLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHO1lBQ25CLENBQUMsQ0FBQyxJQUFJO1lBQ04sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJOzs7O1lBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBQyxJQUFJLElBQUk7UUFFcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQzs7WUFDZixLQUFLLEdBQVEsU0FBUztRQUMxQixJQUFJLFVBQVUsRUFBRTtZQUNkLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQzFCO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDbkIsSUFBSSxFQUFFLElBQUk7WUFDVixHQUFHO1lBQ0gsSUFBSTtZQUNKLEtBQUs7WUFDTCxhQUFhO1lBQ2IsS0FBSztZQUNMLGFBQWE7WUFDYixNQUFNO1lBQ04sY0FBYztTQUNmLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7O1lBcjBERixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLHVncEJBQXdDO2dCQUV4QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7Ozs7WUFyQ0MsVUFBVTtZQUhWLGlCQUFpQjtZQXlCVixvQkFBb0I7OzttQkFpQjFCLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLOzJCQUNMLEtBQUs7dUNBQ0wsS0FBSzs4QkFFTCxLQUFLOzRCQUNMLEtBQUs7OEJBRUwsS0FBSzswQkFDTCxLQUFLO2tDQUtMLEtBQUs7OEJBS0wsS0FBSzs2QkFFTCxLQUFLOytCQUNMLEtBQUs7NEJBS0wsS0FBSzt3QkFDTCxNQUFNOzBCQUNOLE1BQU07K0JBQ04sTUFBTTt5QkFFTixNQUFNOzJCQUNOLEtBQUs7eUJBRUwsS0FBSzs4QkFPTCxLQUFLOzZCQUVMLEtBQUs7NEJBQ0wsS0FBSztpQ0FDTCxLQUFLO2dDQUNMLEtBQUs7bUNBQ0wsTUFBTTtrQ0FDTixNQUFNO3VDQUNOLE1BQU07eUJBQ04sWUFBWSxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7OEJBQzVDLFlBQVksU0FBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7K0JBRWpELFlBQVksU0FBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7K0JBd0RsRCxTQUFTLFNBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7QUE1R2Q7SUFBZixZQUFZLEVBQUU7O3NEQUErQjtBQUM5QjtJQUFmLFlBQVksRUFBRTs7a0VBQTJDO0FBRTFDO0lBQWYsWUFBWSxFQUFFOzt5REFBaUM7QUFDaEM7SUFBZixZQUFZLEVBQUU7O3VEQUErQjtBQWU5QjtJQUFmLFlBQVksRUFBRTs7d0RBQWlDO0FBY2hDO0lBQWYsWUFBWSxFQUFFOztvREFBNEI7QUFPM0I7SUFBZixZQUFZLEVBQUU7O3lEQUFrQzs7O0lBM0MxRCxnQ0FBc0I7O0lBQ3RCLHFDQUE4Qzs7SUFDOUMscUNBQThCOztJQUM5Qix3Q0FBdUQ7O0lBQ3ZELG9EQUFtRTs7Ozs7SUFFbkUsMkNBQXlEOztJQUN6RCx5Q0FBdUQ7Ozs7O0lBRXZELDJDQUFpQzs7SUFDakMsdUNBQTRDOzs7Ozs7SUFLNUMsK0NBQXFDOzs7Ozs7SUFLckMsMkNBQWlDOztJQUVqQywwQ0FBeUQ7O0lBQ3pELDRDQUE4Qzs7Ozs7O0lBSzlDLHlDQUF3Qzs7SUFDeEMscUNBQXlDOztJQUN6Qyx1Q0FBMkM7O0lBQzNDLDRDQUFnRDs7Ozs7SUFFaEQsc0NBQTZEOztJQUM3RCx3Q0FBdUM7Ozs7O0lBRXZDLHNDQUFvRDs7Ozs7Ozs7SUFPcEQsMkNBQTBEOztJQUUxRCwwQ0FBb0M7O0lBQ3BDLHlDQUFxQzs7SUFDckMsOENBQXFDOztJQUNyQyw2Q0FBb0M7O0lBQ3BDLGdEQUF5RDs7SUFDekQsK0NBQXdEOztJQUN4RCxvREFBNkQ7O0lBQzdELHNDQUE0RTs7SUFDNUUsMkNBQ2tDOztJQUNsQyw0Q0FDbUM7O0lBQ25DLGtDQUFjOztJQUdkLG1EQUFnQzs7SUFDaEMsMkNBQXdCOztJQUN4Qiw2Q0FBdUI7O0lBQ3ZCLHlDQUFtQjs7SUFDbkIsMkNBQWdEOztJQUNoRCwwQ0FBZ0Q7O0lBQ2hELDBDQUE0Qzs7SUFFNUMsZ0RBQTBCOztJQUUxQiw0Q0FBNEQ7O0lBQzVELHVDQUFpQjs7SUFFakIsMENBQTBDOztJQUMxQyxxQ0FBMkI7O0lBQzNCLDhDQUF5Qzs7SUFDekMsbURBQThDOztJQUM5Qyx5Q0FBK0I7O0lBRS9CLDZDQUFtQzs7SUFFbkMsd0NBQW1DOztJQUVuQyx5Q0FBb0M7O0lBR3BDLDhDQUF5Qzs7SUFDekMsK0NBQTBDOztJQUMxQyxzQ0FBNEI7O0lBQzVCLHVDQUF3Qjs7SUFDeEIsd0NBQTBCOztJQUMxQixtREFBd0M7O0lBQ3hDLGtEQUF3Qzs7Ozs7SUFHeEMsbURBQTZCOzs7Ozs7SUFHN0IsK0NBQW1EOzs7OztJQUluRCw4Q0FBdUI7Ozs7OztJQUd2QixpREFBc0M7Ozs7OztJQUd0QywwQ0FBc0M7Ozs7O0lBQ3RDLDRDQUF3Qzs7SUFFeEMsNENBQTRFOzs7OztJQUU1RSxzREFBdUQ7Ozs7O0lBQ3ZELG9EQUFvRDs7Ozs7SUFDcEQsZ0RBQWlDOzs7OztJQUdqQyxrREFBK0I7Ozs7OztJQUcvQiwrQ0FBd0M7Ozs7O0lBQ3hDLGlEQUFpRDs7Ozs7SUFDakQsOENBQXVDOzs7Ozs7SUF1UHZDLDhDQUFpQzs7SUF1Q2pDLHNDQUdFOzs7OztJQUdGLDZDQUFxRDs7SUFFckQsc0NBRUU7O0lBb1lGLHNDQWdDRTs7Ozs7SUF6c0JBLGtDQUEwQjs7Ozs7SUFDMUIsK0JBQThCOzs7OztJQUM5QixnREFBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgKiBhcyBsb2NhbGZvcmFnZSBmcm9tIFwibG9jYWxmb3JhZ2VcIjtcbmltcG9ydCB7XG4gIElucHV0Qm9vbGVhbixcbiAgTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQsXG4gIE56Rm9ybWF0RW1pdEV2ZW50LFxufSBmcm9tIFwibmctem9ycm8tYW50ZC9jb3JlXCI7XG5pbXBvcnQgeyBOelJlc2l6ZUV2ZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvcmVzaXphYmxlXCI7XG5pbXBvcnQgeyBOelRhYmxlQ29tcG9uZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvdGFibGVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBDb2xXaWR0aCB9IGZyb20gXCIuLi9tb2RlbC9jb2xXaWR0aFwiO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gXCIuLi9tb2RlbC9jb21tb24tdHlwZVwiO1xuaW1wb3J0IHsgQ29tbW9uU2Vzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9jb21tb24tc2Vzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyByZXNvbHZlQXV0b1RhYmxlU2Nyb2xsIH0gZnJvbSBcIi4uL3V0aWxzL2hkLXRhYmxlLXNjcm9sbC51dGlsXCI7XG5pbXBvcnQgeyBUb3RhbE9wdGlvbiB9IGZyb20gXCIuLi9oZC1kZXRhaWwtbGluZXMvaGQtZGV0YWlsLWxpbmVzLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gIEhkVGFibGVDZWxsQ2hhbmdlLFxuICBIZFRhYmxlQ29sdW1uLFxuICBPcGVyYXRlQnRuLFxuICBUYWJsZUNhY2hlT3B0aW9uLFxuICBUcmVlR3JpZCxcbn0gZnJvbSBcIi4vaGQtdGFibGUuc2VydmljZVwiO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLXRhYmxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaGQtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2hkLXRhYmxlLmNvbXBvbmVudC5sZXNzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSGRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nO1xuICBASW5wdXQoKSB0YWJsZUNvbHM6IEFycmF5PEhkVGFibGVDb2x1bW4+ID0gW107XG4gIEBJbnB1dCgpIHRhYmxlRGF0YTogUGFnZTxhbnk+O1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd1NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93T3BlcmF0ZUNvbFdhcnBCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuWxleekuuWIl+iuvue9ru+8iOm9v+i9ru+8ie+8jOm7mOiupOW8gOWQr++8m+W8ueeql+etieWcuuaZr+WPr+S8oCBmYWxzZSDlhbPpl60gKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dDb2xTZXR0aW5nczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIOaJi+WKqOaMh+WumuihjOmrmO+8m+S4jeS8oOWImeWcqOmmluWxj+a4suafk+WQjuiHquWKqOa1i+mHjyAqL1xuICBASW5wdXQoKSB2aXJ0dWFsSXRlbVNpemU6IG51bWJlcjtcbiAgQElucHV0KCkgc2VsZWN0RmllbGQ6IHN0cmluZyA9IFwiYmlsbE51bWJlclwiO1xuICAvKipcbiAgICog6KGM5Yu+6YCJ56aB55So5a2X5q615ZCN44CC5a6a5LmJ5ZCO5Y+W5b2T5YmN6KGM6K+l5a2X5q6177yaXG4gICAqIOS4uiB0cnVlIOaXtuemgeeUqOivpeihjOWLvumAie+8iOWFqOmAieS5n+S8mui3s+i/h++8ieOAglxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0RGlzYWJsZWRGaWVsZDogc3RyaW5nO1xuICAvKipcbiAgICog6KGM5aSx5pWI5a2X5q615ZCN44CC5a6a5LmJ5ZCO5Y+W5b2T5YmN6KGM6K+l5a2X5q6177yaXG4gICAqIOS4uiB0cnVlIOaXtuaVtOihjOiDjOaZr+iJsuS4uiAjRjdGOEZB44CCXG4gICAqL1xuICBASW5wdXQoKSByb3dJbnZhbGlkRmllbGQ6IHN0cmluZztcbiAgLy8g5ZCI6K6h5Yy65Z+f77yI57G75Z6L5LiOIGhkLWRldGFpbC1saW5lcyDnmoQgVG90YWxPcHRpb24g5LiA6Ie077yJXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93VGFibGVUb3RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0YWJsZVRvdGFsT3B0aW9uOiBBcnJheTxUb3RhbE9wdGlvbj47XG4gIC8qKlxuICAgKiDlkIjorqHliJfmgLvmlbDvvIjlkKvluo/lj7fliJfvvIzkuI4gaGQtZGV0YWlsLWxpbmVzIOS4gOiHtO+8ie+8m1xuICAgKiDkuI3kvKDliJnmjInlvZPliY3lj6/op4HmlbDmja7liJfmlbAgKyAx77yI5bqP5Y+377yJ5o6o566X44CCXG4gICAqL1xuICBASW5wdXQoKSBjb2x1bW5zTnVtYmVyOiBudW1iZXIgfCBzdHJpbmc7XG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRhYmxlU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiDooYzlhoXnvJbovpHlj5jmm7TvvIjlt7Llhpnlm57ooYzlr7nosaHvvJtwcmV2aW91cyog5L6b5o6l5Y+j5aSx6LSl5Zue5rua77yJICovXG4gIEBPdXRwdXQoKSBjZWxsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxIZFRhYmxlQ2VsbENoYW5nZT4oKTtcbiAgQElucHV0KCkgdGFibGVMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDmmK/lkKbmmL7npLrliIbpobXvvJtmYWxzZSDml7bkuIDmrKHlsZXnpLogdGFibGVEYXRhLmNvbnRlbnQg5YWo6YOo6KGMICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBwYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIOaYr+WQpuWJjeerr+WIhumhte+8iOWvuSBjb250ZW50IOWFqOmHj+WIh+eJh++8ieOAglxuICAgKiB0cnVl77ya57+76aG15LiN6Kem5Y+RIHRhYmxlU2VhcmNoRXZlbnTvvIzpgILlkIjor6bmg4Xlhajph4/mlbDmja7vvJtcbiAgICogZmFsc2XvvIjpu5jorqTvvInvvJrmnI3liqHnq6/liIbpobXvvIznv7vpobXop6blj5Hmn6Xor6LvvIjnjrDmnInliJfooajooYzkuLrvvInjgIJcbiAgICog5LiOIHBhZ2luYXRpb249ZmFsc2Ug5ZCM5pe255So5pe25Lul5LiN5YiG6aG15Li65YeG44CCXG4gICAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgZnJvbnRQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIOihqOagvOWIhumhteWPguaVsFxuICBASW5wdXQoKSB0YWJsZVBhZ2VJbmRleDogbnVtYmVyID0gMTtcbiAgQElucHV0KCkgdGFibGVQYWdlU2l6ZTogbnVtYmVyID0gMTAwO1xuICBASW5wdXQoKSBpc0ZpcnN0RW50cnlTZWFyY2g6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzQ3Jvc3NQYWdlU2VsZWN0OiBib29sZWFuO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZVNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAQ29udGVudENoaWxkKFwidGFibGVUb3RhbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgdGFibGVUb3RhbDogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcInRhYmxlTGVmdEJ1dHRvblwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVMZWZ0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGFibGVSaWdodEJ1dHRvblwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVSaWdodEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcbiAgc2Nyb2xsID0gbnVsbDtcblxuICAvLyDooajmoLzli77pgInlj4LmlbBcbiAgaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gIGxpc3RPZkRpc3BsYXlEYXRhID0gW107XG4gIGxpc3RPZkFsbERhdGEgPSBbXTtcbiAgbGlzdE9mU2VsZWN0aW9uOiBBcnJheTxhbnk+IHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIG1hcE9mQ2hlY2tlZElkOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBtYXBPZkNoZWNrTGlzdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAvLyDlkIjorqHlj4LmlbBcbiAgdGFibGVUb3RhbE9wdGlvbkxpc3QgPSBbXTtcbiAgLy8g57yT5a2Y5L+h5oGvXG4gIHRhYmxlQ2FjaGVPcHRpb246IFRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICB1c2VyU2Vzc2lvbjogYW55O1xuXG4gIHRhYmxlQ29sc0NhY2hlOiBBcnJheTxIZFRhYmxlQ29sdW1uPiA9IFtdO1xuICBzaG93VGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0Q29sTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2VsZWN0Q29sTGlzdE5vZGVzQ2FjaGU6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzaG93TGlzdE5vZGVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgaXNEcm9wZG93blZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8g6K6+572u5YiX55qE5Y+v6KeB5pON5L2c5pWw57uEXG4gIG5vd0xpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIC8vIOiuvue9ruWIl+eahOS4jeWPr+ingeaTjeS9nOaVsOe7hFxuICBoaWRlTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcblxuICAvLyDngrnlh7vml7bpnIDopoHmnInkuLTml7bmlbDnu4TlrZjmlL7kuKTkuKp0cmVlLOeUqOS6juWPlua2iOaXtuWAmeaBouWkjeiwg+aVtOWJjeeahOeKtuaAgVxuICBjYW5jZWxOb3dMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBjYW5jZWxIaWRlTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2hvd0RldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xuICBsb2NhbGZvcmFnZTogYW55ID0gbnVsbDtcbiAgbG9jYWx0aW9uVG1wOiBzdHJpbmcgPSBcIlwiO1xuICBpc0ZpcnN0RW50cnlTZWFyY2hMb2NhbDogYm9vbGVhbiA9IHRydWU7XG4gIGlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiog6Ieq5Yqo5rWL6YeP5YmN55qE5YWc5bqV6KGM6auY77yM5rWL6YeP5a6M5oiQ5ZCO5Lya5pu05pawICovXG4gIG1lYXN1cmVkVmlydHVhbEl0ZW1TaXplID0gNDc7XG5cbiAgLyoqIOiusOW9leW9k+WJjeaYr+WQpuWkhOS6juiZmuaLn+a7muWKqOaooeW8j++8jOeUqOS6juWIh+aNoiBwYWdlU2l6ZSDml7bph43lu7rooajmoLwgKi9cbiAgcHJpdmF0ZSB2aXJ0dWFsU2Nyb2xsQWN0aXZlOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIOWPr+ingeWIl+aAu+Wuve+8jOeUqOS6juWIpOaWreaYr+WQpumcgOimgeaoquWQkea7muWKqCAqL1xuICAvKiog5YiX5a695ZCI6K6h77yI5ZCr5Yu+6YCJL+W6j+WPt++8ie+8jGZvb3RlciDooajlrr3kuI7mqKrlkJEgc2Nyb2xsIOWFseeUqCAqL1xuICB0YWJsZUNvbFdpZHRoVG90YWwgPSAwO1xuXG4gIC8qKiDmlbDmja7mm7TmlrDlkI7lvoXlpI3kvY3nurXlkJHmu5rliqjkvY3nva4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSBmYWxzZTtcblxuICAvKiog5b2T5YmN5o6S5bqP77yM6KGo5qC86YeN5bu65ZCO55So5LqO5oGi5aSN6KGo5aS05o6S5bqP5oCBICovXG4gIHByaXZhdGUgY3VycmVudFNvcnRLZXk6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFNvcnRWYWx1ZTogc3RyaW5nID0gbnVsbDtcblxuICBAVmlld0NoaWxkKFwiaGRUYWJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgbnpUYWJsZUNvbXBvbmVudDogTnpUYWJsZUNvbXBvbmVudDtcblxuICBwcml2YXRlIHRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5OiBIVE1MRWxlbWVudCA9IG51bGw7XG4gIHByaXZhdGUgdG90YWxGb290ZXJTY3JvbGxIYW5kbGVyOiAoKSA9PiB2b2lkID0gbnVsbDtcbiAgcHJpdmF0ZSB0b3RhbEZvb3RlclN5bmNSZXRyeSA9IDA7XG5cbiAgLyoqIOihqOS9k+acieerlua7muadoeaXtuWQiOiuoSBmb290ZXIg5omN6aKE55WZ5Y+z5L6n5rua5Yqo5p2h5qe9ICovXG4gIHRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgPSBmYWxzZTtcblxuICAvKiog6KeG5Y+jL+WuueWZqOWwuuWvuOWPmOWMluaXtumHjeeulyBzY3JvbGwueCDkuI7lkIjorqHlr7npvZAgKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydFJlc2l6ZVRpbWVyOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIGJvdW5kT25WaWV3cG9ydFJlc2l6ZTogKCkgPT4gdm9pZCA9IG51bGw7XG4gIHByaXZhdGUgaG9zdFJlc2l6ZU9ic2VydmVyOiBhbnkgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaG9zdEVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGNvbW1vblNlc3Npb25TZXJ2aWNlOiBDb21tb25TZXNzaW9uU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5sb2NhbGZvcmFnZSA9IGxvY2FsZm9yYWdlLmNyZWF0ZUluc3RhbmNlKHtcbiAgICAgIGRyaXZlcjogbG9jYWxmb3JhZ2UuSU5ERVhFRERCLFxuICAgICAgbmFtZTogXCJoZC1mc2NtXCIsIC8vIOiuvue9ruWtmOWCqOW6k+eahOWQjeensFxuICAgICAgdmVyc2lvbjogMS4wLCAvLyDorr7nva7lrZjlgqjlupPnmoTniYjmnKxcbiAgICAgIHN0b3JlTmFtZTogXCJoZC1mc2NtLXN0b3JlXCIsIC8vIOiuvue9ruWtmOWCqOW6k+eahOWtmOWCqOepuumXtOWQjeensFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTtcbiAgICB0aGlzLnVuYmluZFZpZXdwb3J0UmVzaXplU3luYygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbCA9IHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0Nyb3NzUGFnZVNlbGVjdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdExvY2FsID0gdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdDtcbiAgICB9XG4gICAgdGhpcy5sb2NhbHRpb25UbXAgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAodGhpcy5sb2NhbHRpb25UbXApIHtcbiAgICAgIHRoaXMubG9jYWx0aW9uVG1wID0gdGhpcy5sb2NhbHRpb25UbXAucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcbiAgICB9XG4gICAgdGhpcy51c2VyU2Vzc2lvbiA9IHRoaXMuY29tbW9uU2Vzc2lvblNlcnZpY2UuZ2V0U2Vzc2lvbihcbiAgICAgIFwiX19qeV9hdXRob3JpemF0aW9uX3Nlc3Npb25fX1wiLFxuICAgICk7XG4gICAgLy8g55So5LqO5byA5Y+R546v5aKD6LCD6K+VXG4gICAgaWYgKCF0aGlzLnVzZXJTZXNzaW9uKSB7XG4gICAgICB0aGlzLnVzZXJTZXNzaW9uID0ge1xuICAgICAgICB1c2VyQ29kZTogXCJkZXZcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kVmlld3BvcnRSZXNpemVTeW5jKCk7XG4gICAgdGhpcy5kZWxldGVIaWRlSXRlbSgpO1xuICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgdGhpcy50YWJsZUNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgLnJlYWR5KClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRJbml0TG9jYWxmb3JhZ2UoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uHN0ZXAxXCIsIGUpO1xuICAgICAgICB0aHJvdyBcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCI7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZSkge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZVRvdGFsT3B0aW9uXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wic2hvd1RhYmxlVG90YWxcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJjb2x1bW5zTnVtYmVyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1widGFibGVDb2xzXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRhYmxlVG90YWwoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZVNpemVcIl0gIT09XG4gICAgICAgICAgY2hhbmdlc1tcInRhYmxlRGF0YVwiXVtcInByZXZpb3VzVmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSB8fFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZU51bWJlclwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VOdW1iZXJcIl1cbiAgICAgICkge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgICAvLyDku4XomZrmi58v5pmu6YCa5qih5byP55yf5q2j5YiH5o2i5pe26YeN5bu677yM6YG/5YWN5o6S5bqP5ZCO5pWw5o2u5Yi35paw5oqK5o6S5bqP5oCB5riF5o6JXG4gICAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g57+76aG1L+aUuSBwYWdlU2l6Ze+8muS4u+WKqOWkmuasoeWkjeS9je+8jOimhuebliBDREsg5byC5q2l5riy5p+T5pe25bqPXG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCkge1xuICAgICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0pIHtcbiAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgLy8g5pWw5o2u5Yi35paw5LiN5by65Yi26YeN5bu677yM5Y+q5Zyo5rua5Yqo5qih5byP5Y+Y5YyW5pe2IHJlbW91bnRcbiAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyDmlbDmja7mm7TmlrDlkI7lpI3kvY3nurXlkJHmu5rliqjvvIjlkKvomZrmi5/mu5rliqjlnLrmma/vvIlcbiAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0gJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlKSAmJlxuICAgICAgY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuZGVsZXRlSGlkZUl0ZW0oKTtcbiAgICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgdGhpcy50YWJsZUNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgICAgLnJlYWR5KClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhzdGVwMlwiLCBlKTtcbiAgICAgICAgICB0aHJvdyBcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCI7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChjaGFuZ2VzW1wicGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcInBhZ2luYXRpb25cIl0uZmlyc3RDaGFuZ2UpIHx8XG4gICAgICAoY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXS5maXJzdENoYW5nZSlcbiAgICApIHtcbiAgICAgIC8vIOWIhumhteaooeW8j+WIh+aNoumcgOmHjeW7uiBuei10YWJsZe+8iGZyb250IC8gc2VydmVyIC8gbm9uZe+8iVxuICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleCA9IDE7XG4gICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKHRydWUpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOaYr+WQpui1sOWJjeerr+WIhumhte+8iOWvuSBjb250ZW50IOWIh+eJh++8jOS4jeivt+axguWQjuerr++8iSAqL1xuICBnZXQgdXNlRnJvbnRQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucGFnaW5hdGlvbiAmJiAhIXRoaXMuZnJvbnRQYWdpbmF0aW9uO1xuICB9XG5cbiAgZGVsZXRlSGlkZUl0ZW0oKSB7XG4gICAgLy8g6aaW5YWI5oqKaXNTaG935Li6ZmFsc2XmlbDmja7liZTpmaTmjolcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgLy8g5aaC5p6c5a+56LGh5rKh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnpu5jorqTkuLogdHJ1Ze+8jOS/neeVmeivpeWvueixoVxuICAgICAgaWYgKCFpdGVtLmhhc093blByb3BlcnR5KFwiaXNTaG93XCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8g5aaC5p6c5a+56LGh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnmo4Dmn6XlhbblgLzmmK/lkKbkuLogdHJ1ZVxuICAgICAgcmV0dXJuIGl0ZW0uaXNTaG93ID09PSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgc29ydChzb3J0OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmN1cnJlbnRTb3J0S2V5ID0gc29ydCAmJiBzb3J0LmtleTtcbiAgICB0aGlzLmN1cnJlbnRTb3J0VmFsdWUgPSBzb3J0ICYmIHNvcnQudmFsdWU7XG4gICAgdGhpcy5zb3J0RXZlbnQuZW1pdChzb3J0KTtcbiAgfVxuXG4gIGdldENvbFNvcnQoY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5jYW5Tb3J0IHx8ICF0aGlzLmN1cnJlbnRTb3J0S2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5uYW1lID09PSB0aGlzLmN1cnJlbnRTb3J0S2V5ID8gdGhpcy5jdXJyZW50U29ydFZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIHRvZ2dsZVNob3dEZXRhaWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGV0YWlsID0gIXRoaXMuc2hvd0RldGFpbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gIH1cblxuICBnZXQgZWZmZWN0aXZlVmlydHVhbEl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudmlydHVhbEl0ZW1TaXplICE9IG51bGwgJiYgdGhpcy52aXJ0dWFsSXRlbVNpemUgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXJ0dWFsSXRlbVNpemU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIOe6teWQkeWPr+eUqOmrmOW6puaJo+WHj++8muaMiemSruWMui/lkIjorqEv5YiG6aG1562J5Zu65a6a5Y2g5L2N44CCXG4gICAqIOW/hemhu+S4jiBkZWFsU2Nyb2xsIC8gcHJlc2V0U2Nyb2xsQmVmb3JlUmVtb3VudCDkvb/nlKjlkIzkuIDlpZfvvIzlkKbliJnkvJror6/liKTjgIzog73mlL7kuIvjgI3ogIzkuI3orr4gc2Nyb2xsLnnjgIJcbiAgICovXG4gIHByaXZhdGUgZ2V0U2Nyb2xsWU1heE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy50YWJsZVRvdGFsID8gMTgwIDogMTQwKSArIDIxNjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvZPliY3op4blj6Plrp7pmYXlsZXnpLrnmoTooYzmlbDjgIJcbiAgICog5YmN56uv5YiG6aG15oyJIHBhZ2VJbmRleC9wYWdlU2l6ZSDliIfniYfkvLDnrpfvvIzpgb/lhY3nlKjlhajph48gbGVuZ3RoIOivr+WIpOmcgOimgee6teWQkea7muWKqOOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWaXNpYmxlUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50IDogW107XG4gICAgY29uc3QgdG90YWwgPSBjb250ZW50Lmxlbmd0aDtcbiAgICBpZiAoIXRoaXMudXNlRnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdG90YWw7XG4gICAgfVxuICAgIGlmICh0b3RhbCA8PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgcGFnZVNpemUgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAxMDtcbiAgICBjb25zdCBwYWdlSW5kZXggPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA6IDE7XG4gICAgY29uc3Qgc3RhcnQgPSAocGFnZUluZGV4IC0gMSkgKiBwYWdlU2l6ZTtcbiAgICBpZiAoc3RhcnQgPj0gdG90YWwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocGFnZVNpemUsIHRvdGFsIC0gc3RhcnQpO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteWGheWuuemrmOW6puaYr+WQpui2heWHuuinhuWPo++8iOmcgOimgeihqOWGhee6teWQkea7muWKqO+8iSAqL1xuICBnZXQgbmVlZHNWZXJ0aWNhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3dDb3VudCA9IHRoaXMuZ2V0VmlzaWJsZVJvd0NvdW50KCk7XG4gICAgaWYgKHJvd0NvdW50IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgZXN0aW1hdGVkSGVpZ2h0ID0gcm93Q291bnQgKiB0aGlzLmVmZmVjdGl2ZVZpcnR1YWxJdGVtU2l6ZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIGVzdGltYXRlZEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIG1heE9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHJvd0NvdW50ID4gMTAwO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteaVsOaNruiDveWujOaVtOWxleekuuaXtuS4jeWQr+eUqOiZmuaLn+a7muWKqO+8jOmBv+WFjeWwkemHj+aVsOaNruS5n+WHuueOsOa7muWKqOadoSAqL1xuICBnZXQgdXNlVmlydHVhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZWVkc1ZlcnRpY2FsU2Nyb2xsO1xuICB9XG5cbiAgZ2V0UmlnaHRTdGlja3koY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvbC5maXhlZCA9PT0gXCJyaWdodFwiID8gYCR7Y29sLmZpeGVkUmlnaHRXaWR0aCB8fCAwfXB4YCA6IG51bGw7XG4gIH1cblxuICBnZXRMZWZ0U3RpY2t5KGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBjb2wuZml4ZWQgPT09IFwibGVmdFwiID8gYCR7Y29sLmZpeGVkV2lkdGggfHwgMH1weGAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOW6j+WPt+WIl+WbuuWumuWuve+8iOWQqyBwYWRkaW5n77yM5Y+v5a6557qzIDYg5L2N5aaCIDE5OTk5Ne+8ieOAglxuICAgKiDkuI3plIHmrbvml7booajkvZPkvJrpmo/kvY3mlbDlj5jlrr3vvIgx4oaSfjY0cHjvvIwxOTk5OTXihpJ+NjdweO+8ie+8jOWQiOiuoeihjOWvueS4jem9kOOAglxuICAgKi9cbiAgcmVhZG9ubHkgbGluZU51bWJlckNvbFdpZHRoID0gNzI7XG5cbiAgLyoqIOW8gOWQr+WQiOiuoeaXtuW6j+WPt+WIl+eahCBsZWZ077yI5Yu+6YCJ5YiX5Y2gIDQwcHjvvIkgKi9cbiAgZ2V0IGxpbmVOdW1iZXJMZWZ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1NlbGVjdGVkID8gXCI0MHB4XCIgOiBcIjBweFwiO1xuICB9XG5cbiAgZ2V0IGxpbmVOdW1iZXJDb2xXaWR0aFB4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGluZU51bWJlckNvbFdpZHRoICsgXCJweFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIl+aAu+Wuveacqui2heWHuuWuueWZqO+8muaXoOaoquWQkSBzY3JvbGzvvIzooajkvZPliJfkvJrooqvmkpHmu6HvvIzlkIjorqHotbAgZmx1aWTvvIh3aWR0aDoxMDAl77yJ44CCXG4gICAqIOWIl+aAu+Wuvei2heWHuu+8muaciSBzY3JvbGwueO+8jOWQiOiuoei1sOWbuuWumuihqOWuvSArIOaoqua7muWQjOatpeOAglxuICAgKi9cbiAgZ2V0IGlzVG90YWxGb290ZXJGbHVpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54KTtcbiAgfVxuXG4gIC8qKiBmbHVpZCDihpIgMTAwJe+8m+WbuuWumiDihpIgc2Nyb2xsLnjvvIjkuI7ooajkvZPlkIzkuIDlpZfmqKrlkJHlrr3luqbvvIkgKi9cbiAgZ2V0IHRvdGFsRm9vdGVyVGFibGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzVG90YWxGb290ZXJGbHVpZCkge1xuICAgICAgcmV0dXJuIFwiMTAwJVwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueFxuICAgICAgPyBTdHJpbmcodGhpcy5zY3JvbGwueClcbiAgICAgIDogdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgPiAwXG4gICAgICAgID8gdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgKyBcInB4XCJcbiAgICAgICAgOiBcIjEwMCVcIjtcbiAgfVxuXG4gIC8qKiDlvZPliY3pobXooYzlj7fvvIjot6jpobXov57nu63vvIzku44gMSDlvIDlp4vvvIkgKi9cbiAgZ2V0TGluZU51bWJlcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYWdlID0gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpIDogMDtcbiAgICBjb25zdCByb3dJbmRleCA9IE51bWJlcihpbmRleCkgPj0gMCA/IE51bWJlcihpbmRleCkgOiAwO1xuICAgIHJldHVybiAocGFnZSAtIDEpICogc2l6ZSArIHJvd0luZGV4ICsgMTtcbiAgfVxuXG4gIHRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlciwgZGF0YTogYW55KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXkgPSBkYXRhICYmIGRhdGFbdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgcmV0dXJuIGtleSAhPSBudWxsID8gU3RyaW5nKGtleSkgOiBgcm93LSR7aW5kZXh9YDtcbiAgfTtcblxuICAvKiog6Jma5ouf5rua5Yqo5oyJ5pWw57uE5LiL5qCH6L+96Liq77yM6YG/5YWN5Lia5Yqh5Li76ZSuIHRyYWNrQnkg5a+86Ie0IENESyDooYzlpI3nlKjplJnkvY0gKi9cbiAgdmlydHVhbFRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICB0cmFja0J5Q29sID0gKF9pbmRleDogbnVtYmVyLCBjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBjb2wudGl0bGU7XG4gIH07XG5cbiAgZ2V0SW5pdExvY2FsZm9yYWdlKCkge1xuICAgIC8vIOmmluWFiOiOt+WPluW9k+WJjWhkLXRhYmxl5a2Y5YKo55qE5pWw5o2uIOWmguaenOayoeacie+8jOWImeWIneWni+WMluS4i+W9k+WJjeeahOaVsOaNrlxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5nZXRJdGVtKFxuICAgICAgICBcImhkLXRhYmxlX1wiICtcbiAgICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgICBcIl9cIiArXG4gICAgICAgICAgdGhpcy5sb2NhbHRpb25UbXAgK1xuICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICB0aGlzLnV1aWQsXG4gICAgICApXG4gICAgICAudGhlbigodmFsdWU6IFRhYmxlQ2FjaGVPcHRpb24pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5ub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uICYmXG4gICAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgJiZcbiAgICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemUgPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemU7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA9IHRoaXMudGFibGVQYWdlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmnI3liqHnq6/liIbpobXmiY3lnKjliJ3lp4vljJbml7bmipsgcGFnZVNpemVDaGFuZ2VFdmVudCDop6blj5HniLbmn6Xor6LvvJvliY3nq6/liIbpobXkuI3miptcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvbiAmJlxuICAgICAgICAgICF0aGlzLmZyb250UGFnaW5hdGlvbiAmJlxuICAgICAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgICAgICB0aGlzLmluaXRUYWJsZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBpbml0VGFibGUoKSB7XG4gICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMudXVpZCkge1xuICAgICAgdGhyb3cgXCJoZC10YWJsZee8uuWksXV1aWTlj4LmlbDvvIzor7fkvb/nlKjnvJbovpHlmajmj5Lku7bnlJ/miJDlubbnu5loZC10YWJsZei1i+S6iHV1aWTlsZ7mgKdcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuanVkZ2VSZXBlYXRDb2xzKCkpIHtcbiAgICAgIHRoaXMuZGVhbENvbHMoKTtcbiAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgdGhpcy5kZWFsT3BlcmF0ZUJ0bigpO1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlID0gbnVsbDtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOiZmuaLny/mma7pgJrmqKHlvI/liIfmjaLml7bph43lu7rooajmoLzvvIzpgb/lhY3mrovnlZnmu5rliqjlrrnlmaggKi9cbiAgYXBwbHlUYWJsZVNjcm9sbE1vZGUoZm9yY2VSZW1vdW50ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCB1c2VWaXJ0dWFsID0gdGhpcy51c2VWaXJ0dWFsU2Nyb2xsO1xuICAgIGNvbnN0IG1vZGVDaGFuZ2VkID1cbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlICE9PSB1c2VWaXJ0dWFsO1xuICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSA9IHVzZVZpcnR1YWw7XG5cbiAgICBpZiAoZm9yY2VSZW1vdW50IHx8IG1vZGVDaGFuZ2VkKSB7XG4gICAgICAvLyDlv4XpobvlhYjlhpnlpb0gc2Nyb2xsLnnvvIzlho3liJvlu7ogbnotdGFibGXjgIJcbiAgICAgIC8vIG5nLXpvcnJvIOWPquWcqCBBZnRlclZpZXdJbml0IOe7keS4gOasoSBoZWFkZXIvYm9keSDnmoQgc2Nyb2xsIOWQjOatpe+8m1xuICAgICAgLy8g6Iul5YWI5LulIHk9bnVsbCDliJvlu7rlho3mlLnmiJDmnIkgee+8jOihqOWktOebkeWQrOS8muS4ou+8jOihqOeOsOS4uuWIl+WktOS4jei3n+edgOaoqua7muOAglxuICAgICAgdGhpcy5wcmVzZXRTY3JvbGxCZWZvcmVSZW1vdW50KHVzZVZpcnR1YWwpO1xuICAgICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd1RhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHRoaXMuYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2SGFzWSA9ICEhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnkpO1xuICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgIGNvbnN0IG5leHRIYXNZID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueSk7XG4gICAgLy8g6L+Q6KGM5LitIHkg5LuO5pyJ5Y+Y5pegL+S7juaXoOWPmOacieaXtu+8jOS5n+W/hemhu+mHjeW7uu+8jOWQpuWImeWQjOatpeebkeWQrOS7jeaMh+WQkeaXpyBET01cbiAgICBpZiAocHJldkhhc1kgIT09IG5leHRIYXNZKSB7XG4gICAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VGFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsKTtcbiAgfVxuXG4gIC8qKiDph43lu7rliY3pooTorr4gc2Nyb2xs77yM5L+d6K+BIEFmdGVyVmlld0luaXQg5pe2IGhlYWRlci9ib2R5IOe7k+aehOW3suato+ehriAqL1xuICBwcml2YXRlIHByZXNldFNjcm9sbEJlZm9yZVJlbW91bnQodXNlVmlydHVhbDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG1heE9mZnNldCA9IHRoaXMuZ2V0U2Nyb2xsWU1heE9mZnNldCgpO1xuICAgIGNvbnN0IHggPSB0aGlzLnNjcm9sbCA/IHRoaXMuc2Nyb2xsLnggOiBudWxsO1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwgJiYgIXVzZVZpcnR1YWwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0geyB4LCB5OiBudWxsIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgeCxcbiAgICAgIHk6IGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodXNlVmlydHVhbCkge1xuICAgICAgdGhpcy5yZWZyZXNoVmlydHVhbFNjcm9sbFZpZXdwb3J0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUodHJ1ZSk7XG4gICAgICAvLyDlrp7mtYvooYzpq5jlkI7lj6/og73ku47jgIzog73mlL7kuIvjgI3lj5jkuLrjgIzotoXlh7rjgI3vvIzpnIDliIfmjaLmu5rliqjmqKHlvI9cbiAgICAgIGlmICh0aGlzLnVzZVZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQoZm9yY2VNZWFzdXJlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXNlVmlydHVhbFNjcm9sbCkge1xuICAgICAgaWYgKGZvcmNlTWVhc3VyZSkge1xuICAgICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnQgPVxuICAgICAgICB0aGlzLm56VGFibGVDb21wb25lbnQgJiYgdGhpcy5uelRhYmxlQ29tcG9uZW50LmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICAgIGlmICghdmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVhc3VyZWQgPSB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgIGlmIChtZWFzdXJlZCkge1xuICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgICAgICB2aWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiog5pWw5o2u5Yi35paw5ZCO5bCG6KGo5L2T57q15ZCR5rua5Yqo5aSN5L2N5Yiw6aG26YOoICovXG4gIHByaXZhdGUgcmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56VGFibGVDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbnpUYWJsZSA9IHRoaXMubnpUYWJsZUNvbXBvbmVudCBhcyBhbnk7XG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLm56VGFibGVDb21wb25lbnQuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgaWYgKHR5cGVvZiAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb09mZnNldCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvT2Zmc2V0KDApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb0luZGV4ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9JbmRleCgwKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpZXdwb3J0RWwgPVxuICAgICAgICB2aWV3cG9ydC5lbGVtZW50UmVmICYmXG4gICAgICAgICh2aWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgaWYgKHZpZXdwb3J0RWwpIHtcbiAgICAgICAgdmlld3BvcnRFbC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBib2R5Q2FuZGlkYXRlcyA9IFtcbiAgICAgIG56VGFibGUubWl4VGFibGVCb2R5TmF0aXZlRWxlbWVudCxcbiAgICAgIG56VGFibGUudGFibGVCb2R5TmF0aXZlRWxlbWVudCxcbiAgICAgIG56VGFibGUudGFibGVCb2R5RWxlbWVudCAmJiBuelRhYmxlLnRhYmxlQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICBdO1xuICAgIGJvZHlDYW5kaWRhdGVzLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgdGFibGVNYWluID1cbiAgICAgIG56VGFibGUudGFibGVNYWluRWxlbWVudCAmJlxuICAgICAgKG56VGFibGUudGFibGVNYWluRWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBpZiAoIXRhYmxlTWFpbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub2RlcyA9IHRhYmxlTWFpbi5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCIuYW50LXRhYmxlLWJvZHksIGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFwiLFxuICAgICk7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChub2RlcywgKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgZWwuc2Nyb2xsVG9wID0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlbDmja7mm7TmlrDlkI7lpJrmrKHlsJ3or5XlpI3kvY3jgIJcbiAgICogbmctem9ycm8gOCArIENESyDomZrmi5/mu5rliqjkvJrlnKjmlbDmja7liLfmlrDlkI7lvILmraXmlLnlhpkgc2Nyb2xsVG9w77yM5Y2V5qyh5aSN5L2N57uP5bi46KKr6KaG55uW44CCXG4gICAqL1xuICBwcml2YXRlIHNjaGVkdWxlUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTogdm9pZCB7XG4gICAgLy8g5aSa5qyh5bCd6K+V77ya6KaG55uWIG56LXRhYmxlIC8gQ0RLIOiZmuaLn+a7muWKqOW8guatpeaUueWGmSBzY3JvbGxUb3BcbiAgICBjb25zdCBkZWxheXMgPSBbMCwgNTAsIDEwMF07XG4gICAgZGVsYXlzLmZvckVhY2goKG1zLCBpbmRleCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSBkZWxheXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sIG1zKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgfVxuXG4gIC8qKiDmnKrmiYvliqjkvKAgdmlydHVhbEl0ZW1TaXplIOaXtu+8jOS7juW3sua4suafk+ihjOa1i+mHj+ecn+WunumrmOW6piAqL1xuICBtZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsSXRlbVNpemUgIT0gbnVsbCAmJiB0aGlzLnZpcnR1YWxJdGVtU2l6ZSA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdwb3J0ID1cbiAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJiB0aGlzLm56VGFibGVDb21wb25lbnQuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICAgIGNvbnN0IHRhYmxlQm9keSA9XG4gICAgICB0aGlzLm56VGFibGVDb21wb25lbnQgJiZcbiAgICAgICh0aGlzLm56VGFibGVDb21wb25lbnQudGFibGVCb2R5TmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgY29uc3Qgcm93ID1cbiAgICAgICh2aWV3cG9ydCAmJlxuICAgICAgICAoKHZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcInRyLmhkLXRhYmxlLXZpcnR1YWwtcm93XCIsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQpKSB8fFxuICAgICAgKHRhYmxlQm9keSAmJiAodGFibGVCb2R5LnF1ZXJ5U2VsZWN0b3IoXCJ0Ym9keSB0clwiKSBhcyBIVE1MRWxlbWVudCkpO1xuICAgIGlmICghcm93IHx8IHJvdy5vZmZzZXRIZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBoZWlnaHQgPSByb3cub2Zmc2V0SGVpZ2h0O1xuICAgIGlmIChoZWlnaHQgPT09IHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5tZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSA9IGhlaWdodDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIOiuvue9ruWIl+eCueWHu+WPlua2iFxuICBjYW5jZWxEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxOb3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIOeCueWHu+inpuWPkeiuvue9ruWIl1xuICBjb25maXJtRHJvcGRvd24oKTogdm9pZCB7XG4gICAgLy8g5Li05pe25a2Y5pS+5LiL77yM5Y+W5raI55qE5pe25YCZ5oGi5aSN5Y6f5p2l55qE54q25oCBICAg5rex5ou36LSd5LiL5a+56LGh5pWw57uEXG4gICAgdGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNhbmNlbE5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ub3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHN1Ym1pdEdyaWRzKCkge1xuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzID0gW107XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMucHVzaChpdGVtLnRpdGxlKTtcbiAgICB9KTtcbiAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDku47nvJPlrZjorr7nva7liJdcbiAgc2V0Q29scygpIHtcbiAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSBmYWxzZTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IFtdO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IFtdO1xuICAgIGlmICh0aGlzLmhhc0NvbHNDYWNoZSgpKSB7XG4gICAgICBsZXQgeyBub3RJbmNvbHMsIGluY29scyB9ID0gdGhpcy50YWJsZUNvbHNDYWNoZS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoaXRlbS50aXRsZSkpIHtcbiAgICAgICAgICAgIGFjYy5pbmNvbHMucHVzaChpdGVtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLm5vdEluY29scy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7IG5vdEluY29sczogW10sIGluY29sczogW10gfSxcbiAgICAgICk7XG4gICAgICBpbmNvbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluZGV4T2YoYS50aXRsZSkgLVxuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluZGV4T2YoYi50aXRsZSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50YWJsZUNvbHMgPSBpbmNvbHMuY29uY2F0KG5vdEluY29scyk7XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc0NvbHNDYWNoZSgpKSB7XG4gICAgICAgIGVsZW1lbnQuaXNTaG93ID0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC50aXRsZSlcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5pc1Nob3cpIHtcbiAgICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAga2V5OiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGVsZW1lbnQuZml4ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpXG4gICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaGlkZUxpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAga2V5OiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGVsZW1lbnQuZml4ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpXG4gICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmlzU2hvdyA9IHRydWU7XG4gICAgICAgIHRoaXMubm93TGlzdE5vZGVzLnB1c2goe1xuICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgIGtleTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICBjaGVja2VkOiB0cnVlLFxuICAgICAgICAgIC8vIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LmZpeGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOiwg+aVtOWIl+WuveS4uue8k+WtmOWuveW6plxuICAgIGlmIChcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5zaXplICE9PSAwXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuaGFzKGNvbC50aXRsZSkpIHtcbiAgICAgICAgICBjb2wud2lkdGggPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLmdldChjb2wudGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmRlYWxDb2xzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSB0cnVlO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8g5ouW5ou95pON5L2cXG4gIGJlZm9yZURyb3AgPSAoYXJnOiBOekZvcm1hdEJlZm9yZURyb3BFdmVudCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gPT4ge1xuICAgIGlmIChcbiAgICAgIGFyZy5ub2RlLm9yaWdpbi5kaXNhYmxlZCB8fFxuICAgICAgIWFyZy5kcmFnTm9kZS5vcmlnaW4uY2hlY2tlZCB8fFxuICAgICAgYXJnLnBvcyA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5vZGU6IFRyZWVHcmlkID0gbmV3IFRyZWVHcmlkKCk7XG4gICAgICBub2RlLmNoZWNrZWQgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmNoZWNrZWQ7XG4gICAgICBub2RlLmRpc2FibGVkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5kaXNhYmxlZDtcbiAgICAgIG5vZGUuZXhwYW5kZWQgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmV4cGFuZGVkO1xuICAgICAgbm9kZS5pc0xlYWYgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmlzTGVhZjtcbiAgICAgIG5vZGUua2V5ID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5rZXk7XG4gICAgICBub2RlLnNlbGVjdGFibGUgPSBhcmcuZHJhZ05vZGUub3JpZ2luLnNlbGVjdGFibGU7XG4gICAgICBub2RlLnRpdGxlID0gYXJnLmRyYWdOb2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIC8vIOaLluaLveWFg+e0oOS4i+agh1xuICAgICAgbGV0IGRyYWdOb2RlSW5kZXggPSB0aGlzLm5vd0xpc3ROb2Rlcy5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgPT0gYXJnLmRyYWdOb2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgICAgLy8g55uu5qCH5L2N572u55qE5LiL5qCHXG4gICAgICBsZXQgbm9kZUluZGV4ID1cbiAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgPT0gYXJnLm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgICB9KSArIChhcmcucG9zID09PSAtMSA/IDAgOiBhcmcucG9zKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLnNwbGljZShub2RlSW5kZXgsIDAsIG5vZGUpO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuc3BsaWNlKFxuICAgICAgICBub2RlSW5kZXggPj0gZHJhZ05vZGVJbmRleCA/IGRyYWdOb2RlSW5kZXggOiBkcmFnTm9kZUluZGV4ICsgMSxcbiAgICAgICAgMSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShkZWxheSgxMDApKTtcbiAgICB9XG4gIH07XG5cbiAgbW92ZUVsZW1lbnROZWFyYnkoYXJyLCBlbGVtZW50VG9Nb3ZlVGl0bGUsIHRhcmdldEVsZW1lbnRUaXRsZSwgcG9zKSB7XG4gICAgY29uc3QgdG1wQXJyYXkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFycikpO1xuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdG1wQXJyYXkuZmluZEluZGV4KFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udGl0bGUgPT09IHRhcmdldEVsZW1lbnRUaXRsZSxcbiAgICApO1xuICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IHRtcEFycmF5LmZpbmRJbmRleChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnRpdGxlID09PSBlbGVtZW50VG9Nb3ZlVGl0bGUsXG4gICAgKTtcbiAgICBjb25zdCBuZXdJbmRleCA9IHBvcyA8IDAgPyB0YXJnZXRJbmRleCArIHBvcyA6IHRhcmdldEluZGV4O1xuICAgIC8vIOenu+mZpOebruagh+WFg+e0oO+8jOW5tuaPkuWFpeWIsOaWsOeahOS9jee9rlxuICAgIGNvbnN0IHJlbW92ZWRFbGVtZW50ID0gdG1wQXJyYXkuc3BsaWNlKGVsZW1lbnRJbmRleCwgMSk7XG4gICAgdG1wQXJyYXkuc3BsaWNlKG5ld0luZGV4ICsgMSwgMCwgcmVtb3ZlZEVsZW1lbnRbMF0pO1xuICAgIHJldHVybiB0bXBBcnJheTtcbiAgfVxuXG4gIC8vIOWLvumAieaTjeS9nFxuICBjaGVja0FjdGlvbihldmVudDogTnpGb3JtYXRFbWl0RXZlbnQpOiB2b2lkIHtcbiAgICAvLyDli77pgInlj6rmnInlnKhoaWRlTGlzdE5vZGVzLOWPlua2iOWLvumAieWPquacieWcqG5vd0xpc3ROb2Rlc1xuICAgIGlmIChldmVudC5ub2RlLm9yaWdpbi5jaGVja2VkKSB7XG4gICAgICBsZXQgbm9kZTogVHJlZUdyaWQgPSBuZXcgVHJlZUdyaWQoKTtcbiAgICAgIG5vZGUgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmluZCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSA9PT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICAgIG5vZGUuY2hlY2tlZCA9IHRydWU7XG4gICAgICAvLyDmib7liLDnrKzkuIDkuKpmaXhlZOWxnuaAp+S4unJpZ2h055qEdGl0bGXvvIzmib7liLDmj5LlhaXlhYPntKDnmoTkvY3nva5cbiAgICAgIGxldCB0aXRsZSA9IG51bGw7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy50YWJsZUNvbHNDYWNoZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNvbHNDYWNoZVtpXS5maXhlZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGl0bGUgPSB0aGlzLnRhYmxlQ29sc0NhY2hlW2ldLnRpdGxlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3QgPSB0aGlzLm5vd0xpc3ROb2Rlcy5zbGljZSgwKTtcbiAgICAgIGlmICghdGl0bGUpIHtcbiAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KFxuICAgICAgICAgIChub2RlKSA9PiBub2RlLnRpdGxlID09PSB0aXRsZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3Quc3BsaWNlKGluZGV4LCAwLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm93TGlzdE5vZGVzID0gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlICE9PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiAodGhpcy5oaWRlTGlzdE5vZGVzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMpIHtcbiAgICAgIC8vICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGhpcy5nZXRIaWRlTGlzdE5vZGVzKCk7XG4gICAgICAvLyB9XG4gICAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3QgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuc2xpY2UoMCk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZSkge1xuICAgICAgICAgIGNvbnN0IGlubmVySXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xuICAgICAgICAgIGlubmVySXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChpbm5lckl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRlbXBvcmFyeU5vZGVMaXN0O1xuXG4gICAgICAvLyDkuLrkuobpmLLmraLmnKrpgInmi6nnmoTmlbDnu4Tpobrluo/lm6DkuLpwdXNo5pa55rOV6ICM5pS55Y+Y77yM6YCa6L+H5Yid5aeL5pWw5o2u6I635Y+W5pi+56S655qE5a2X5q615YiX6KGoXG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRoaXMubm93TGlzdE5vZGVzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSAhPT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDpmLLmraLmnKrpgInmi6nnmoTmlbDnu4Tpobrluo/lm6DkuLpwdXNo5pa55rOV6ICM5pS55Y+Y77yM5LuO5Yid5aeL5pWw5o2u6I635Y+W6ZqQ6JeP5pyq5pi+56S655qE5a2X5q615YiX6KGoXG4gIGdldEhpZGVMaXN0Tm9kZXMoKTogQXJyYXk8VHJlZUdyaWQ+IHtcbiAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3Q6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICAgIC8vIOS7jnRhYmxlQ29sc0NhY2hl6YeM6Z2i5om+5rKh5pyJ5Zyoc3RvcmFnZemHjOmdouWHuueOsOeahOWtl+autSznu4TmiJBoaWRlTGlzdFxuICAgIHRoaXMudGFibGVDb2xzQ2FjaGUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhpdGVtLnRpdGxlKSkge1xuICAgICAgICBsZXQgbm9kZUl0ZW06IFRyZWVHcmlkID0gbmV3IFRyZWVHcmlkKCk7XG4gICAgICAgIG5vZGVJdGVtLnRpdGxlID0gaXRlbS50aXRsZTtcbiAgICAgICAgbm9kZUl0ZW0ua2V5ID0gaXRlbS50aXRsZTtcbiAgICAgICAgbm9kZUl0ZW0uZGlzYWJsZWQgPSBpdGVtLmZpeGVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBub2RlSXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2gobm9kZUl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0ZW1wb3JhcnlOb2RlTGlzdDtcbiAgfVxuXG4gIGRlYWxDb2xzKCkge1xuICAgIGlmICghdGhpcy50YWJsZUNvbHNbMF0ubWluV2lkdGgpIHtcbiAgICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBzcGFuLnN0eWxlLndoaXRlU3BhY2UgPSBcIm5vd3JhcFwiO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICAgICAgc3Bhbi5pbm5lclRleHQgPSBpdGVtLnRpdGxlO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgICBpdGVtLm1pbldpZHRoID0gc3Bhbi5vZmZzZXRXaWR0aCArIDE2O1xuICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyDlpITnkIblt6blj7PlkLjpmYTnmoTmlbDmja7lnKjmlbDnu4TkuK3nmoTkvY3nva5cbiAgICBjb25zdCBsZWZ0Rml4ZWRDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKChjb2wpID0+IGNvbC5maXhlZCA9PT0gXCJsZWZ0XCIpO1xuICAgIGNvbnN0IHJpZ2h0Rml4ZWRDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKFxuICAgICAgKGNvbCkgPT4gY29sLmZpeGVkID09PSBcInJpZ2h0XCIsXG4gICAgKTtcbiAgICBjb25zdCBub3JtYWxDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKChjb2wpID0+ICFjb2wuZml4ZWQpO1xuICAgIGNvbnN0IHJlc3VsdENvbHMgPSBsZWZ0Rml4ZWRDb2xzLmNvbmNhdChub3JtYWxDb2xzKS5jb25jYXQocmlnaHRGaXhlZENvbHMpO1xuICAgIHRoaXMudGFibGVDb2xzID0gcmVzdWx0Q29scztcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzQ2FjaGUgfHwgdGhpcy50YWJsZUNvbHNDYWNoZS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIOe8k+WtmOS4gOS4i+ihqOagvOeahOaVsOaNrlxuICAgICAgdGhpcy50YWJsZUNvbHNDYWNoZSA9IFsuLi50aGlzLnRhYmxlQ29sc107XG4gICAgfVxuICB9XG5cbiAgbm9ybWFsaXplVGFibGVDYWNoZU9wdGlvbigpIHtcbiAgICBpZiAoIXRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMpIHtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIH0gZWxzZSBpZiAoISh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgY29uc3QgY29sV2lkdGhzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb2xXaWR0aHMuc2V0KGtleSwgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgYXMgYW55KVtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyA9IGNvbFdpZHRocztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0NvbHNDYWNoZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzICYmXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIHNhdmVUYWJsZUNhY2hlT3B0aW9uKCkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2Uuc2V0SXRlbShcbiAgICAgIFwiaGQtdGFibGVfXCIgK1xuICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgXCJfXCIgK1xuICAgICAgICB0aGlzLmxvY2FsdGlvblRtcCArXG4gICAgICAgIFwiX1wiICtcbiAgICAgICAgdGhpcy51dWlkLFxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLFxuICAgICk7XG4gIH1cblxuICBqdWRnZVJlcGVhdENvbHMoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRhYmxlQ29scy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy50YWJsZUNvbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb2xzW2ldLnRpdGxlID09PSB0aGlzLnRhYmxlQ29sc1tqXS50aXRsZSkge1xuICAgICAgICAgIHRocm93IGBoZC10YWJsZee7hOS7tuS4reWIl+WQjSAke3RoaXMudGFibGVDb2xzW2ldLnRpdGxlfSDph43lpI1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25SZXNpemUoeyB3aWR0aCB9OiBOelJlc2l6ZUV2ZW50LCBjb2w6IEhkVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICB0aGlzLm5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBsZXQgdGVtcFdpZHRoID0gMDtcbiAgICBpZiAod2lkdGggPiBjb2wubWluV2lkdGgpIHtcbiAgICAgIHRlbXBXaWR0aCA9IHdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wV2lkdGggPSBjb2wubWluV2lkdGg7XG4gICAgfVxuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuc2V0KGNvbC50aXRsZSwgdGVtcFdpZHRoKTtcbiAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy50YWJsZUNvbHMgPSB0aGlzLnRhYmxlQ29scy5tYXAoKGUpID0+XG4gICAgICBlLnRpdGxlID09PSBjb2wudGl0bGUgPyB7IC4uLmUsIHdpZHRoOiB0ZW1wV2lkdGggfSA6IGUsXG4gICAgKTtcbiAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSk7XG4gIH1cblxuICBkZWFsT3BlcmF0ZUJ0bigpIHtcbiAgICBsZXQgb3BlcmF0ZUNvbCA9IHRoaXMudGFibGVDb2xzLmZpbmQoKGNvbCkgPT4gY29sLnRpdGxlID09PSBcIuaTjeS9nFwiKSB8fCBudWxsO1xuICAgIGlmIChvcGVyYXRlQ29sKSB7XG4gICAgICBsZXQgdGV4dFN0ciA9IFwiXCI7XG4gICAgICBvcGVyYXRlQ29sLmJ0bkxpc3QuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICAgIGlmICghYnRuLmlzUmVwZWF0KSB7XG4gICAgICAgICAgdGV4dFN0ciArPSB0eXBlb2YgYnRuLm5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IFwi5pON5L2cXCIgOiBidG4ubmFtZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcbiAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBcIjE0cHhcIjtcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICAgIHNwYW4uaW5uZXJUZXh0ID0gdGV4dFN0cjtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICBvcGVyYXRlQ29sLndpZHRoID1cbiAgICAgICAgc3Bhbi5vZmZzZXRXaWR0aCArXG4gICAgICAgIChvcGVyYXRlQ29sLmJ0bkxpc3QuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc1JlcGVhdCkubGVuZ3RoIC0gMSkgKiA0ICtcbiAgICAgICAgMTY7XG4gICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBuZWVkU2hvd0NvbmZpcm0oYnRuOiBPcGVyYXRlQnRuLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGJ0bi5zaG93Q29uZmlybSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYnRuLnNob3dDb25maXJtKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFidG4uc2hvd0NvbmZpcm07XG4gIH1cblxuICBnZXRCdG5OYW1lKGJ0bjogT3BlcmF0ZUJ0biwgZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIGJ0bi5uYW1lID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBidG4ubmFtZShkYXRhKSB8fCBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gYnRuLm5hbWUgIT0gbnVsbCA/IFN0cmluZyhidG4ubmFtZSkgOiBcIlwiO1xuICB9XG5cbiAgaXNEYW5nZXJCdG4oYnRuOiBPcGVyYXRlQnRuLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCdG5OYW1lKGJ0biwgZGF0YSkgPT09IFwi5Yig6ZmkXCI7XG4gIH1cblxuICAvKiog6Jma5ouf5rua5Yqo5byA5ZCv5pe25L2/55So6KeG5Y+j5pyA5aSn6auY5bqmICovXG4gIHByaXZhdGUgZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWA7XG4gIH1cblxuICBwcml2YXRlIGhhc1RhYmxlRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnRhYmxlRGF0YSAmJlxuICAgICAgdGhpcy50YWJsZURhdGEuY29udGVudCAmJlxuICAgICAgdGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIl+aAu+Wuvei2heWHuuWkluWxguWuueWZqOaJjeWQr+eUqOaoquWQkSBzY3JvbGzjgIJcbiAgICog5LulIGRlYWxTY3JvbGwg57Sv6K6h55qE5aOw5piO5YiX5a695Li65YeG77yM5LiN55SoIERPTSDoh6rnhLbmtYvlrr3vvIjlhoXlrrnkuI3miKrmlq3kvJrlgY/lpKfvvIzlr7zoh7TliJfog73mlL7kuIvkuZ/lvIDmqKrmu5rvvInjgIJcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVNjcm9sbFgoY29sV2lkdGg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGF1dG9TY3JvbGwgPSByZXNvbHZlQXV0b1RhYmxlU2Nyb2xsKFxuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50LFxuICAgICAgdGhpcy5oYXNUYWJsZURhdGEoKSxcbiAgICAgIGNvbFdpZHRoLFxuICAgICk7XG4gICAgcmV0dXJuIGF1dG9TY3JvbGwgPyBhdXRvU2Nyb2xsLnggOiBudWxsO1xuICB9XG5cbiAgLyoqIOihqOagvOa4suafk+WQjuaMieWunumZheWuueWZqOWuveW6puagoeato+aoquWQkSBzY3JvbGzvvIjlj6rmlLkgeO+8jOmBv+WFjeinpuWPkeihqOWktOe7k+aehOWPmOWMlu+8iSAqL1xuICBwcml2YXRlIHN5bmNIb3Jpem9udGFsU2Nyb2xsKCk6IHZvaWQge1xuICAgIGNvbnN0IHNjcm9sbFggPSB0aGlzLnJlc29sdmVTY3JvbGxYKHRoaXMudGFibGVDb2xXaWR0aFRvdGFsKTtcbiAgICBjb25zdCBjdXJyZW50WSA9IHRoaXMuc2Nyb2xsID8gdGhpcy5zY3JvbGwueSA6IG51bGw7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zY3JvbGwgJiZcbiAgICAgIHRoaXMuc2Nyb2xsLnggPT09IHNjcm9sbFggJiZcbiAgICAgIHRoaXMuc2Nyb2xsLnkgPT09IGN1cnJlbnRZXG4gICAgKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOS/neaMgSB5IOS4jeWPmO+8jOmYsuatoui/kOihjOS4reaLhi/lkIggaGVhZGVyIOWvvOiHtOaoquWQkeWQjOatpeWkseaViFxuICAgIHRoaXMuc2Nyb2xsID0geyB4OiBzY3JvbGxYLCB5OiBjdXJyZW50WSB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jSGVhZGVyQm9keVNjcm9sbExlZnQoKSk7XG4gIH1cblxuICAvKiog5omL5Yqo5oqK6KGo5L2T5qiq5ZCR5rua5Yqo5ZCM5q2l5Yiw6KGo5aS0IC8g5ZCI6K6hIGZvb3Rlcu+8iOWFnOW6lSBuZy16b3JybyDnm5HlkKzkuKLlpLHnmoTmg4XlhrXvvIkgKi9cbiAgcHJpdmF0ZSBzeW5jSGVhZGVyQm9keVNjcm9sbExlZnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56VGFibGVDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyID0gKHRoaXMubnpUYWJsZUNvbXBvbmVudCBhcyBhbnkpLnRhYmxlSGVhZGVyTmF0aXZlRWxlbWVudCBhc1xuICAgICAgfCBIVE1MRWxlbWVudFxuICAgICAgfCBudWxsO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmdldFRhYmxlQm9keVNjcm9sbEVsKCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnggJiYgaGVhZGVyICYmIGJvZHkpIHtcbiAgICAgIGlmIChoZWFkZXIuc2Nyb2xsTGVmdCAhPT0gYm9keS5zY3JvbGxMZWZ0KSB7XG4gICAgICAgIGhlYWRlci5zY3JvbGxMZWZ0ID0gYm9keS5zY3JvbGxMZWZ0O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCk7XG4gIH1cblxuICAvKiog5Y+W6KGo5L2T5qiq5ZCR5rua5Yqo5a655Zmo77yI6Jma5ouf5rua5Yqo5LyY5YWIIHZpZXdwb3J077yJICovXG4gIHByaXZhdGUgZ2V0VGFibGVCb2R5U2Nyb2xsRWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1peCA9ICh0aGlzLm56VGFibGVDb21wb25lbnQgYXMgYW55KS5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50IGFzXG4gICAgICB8IEhUTUxFbGVtZW50XG4gICAgICB8IG51bGw7XG4gICAgaWYgKG1peCkge1xuICAgICAgcmV0dXJuIG1peDtcbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuaG9zdEVsICYmICh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgKGhvc3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQuYW50LXRhYmxlLWJvZHlcIixcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQpIHx8XG4gICAgICAoaG9zdC5xdWVyeVNlbGVjdG9yKFwiLmFudC10YWJsZS1ib2R5XCIpIGFzIEhUTUxFbGVtZW50KSB8fFxuICAgICAgbnVsbFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFRvdGFsRm9vdGVyU2Nyb2xsRWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0RWwgJiYgKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIHJldHVybiBob3N0XG4gICAgICA/IChob3N0LnF1ZXJ5U2VsZWN0b3IoXCIuaGQtdGFibGUtdG90YWwtZm9vdGVyXCIpIGFzIEhUTUxFbGVtZW50KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqIOihqOS9k+aYr+WQpuWHuueOsOe6teWQkea7muWKqOadoe+8iOWQq+a7muWKqOadoeanveWuve+8iSAqL1xuICBwcml2YXRlIGJvZHlIYXNWZXJ0aWNhbFNjcm9sbGJhcihib2R5OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghYm9keSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgYm9keS5zY3JvbGxIZWlnaHQgPiBib2R5LmNsaWVudEhlaWdodCArIDEgfHxcbiAgICAgIGJvZHkub2Zmc2V0V2lkdGggLSBib2R5LmNsaWVudFdpZHRoID4gMVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5ZCI6K6hIGZvb3RlciDkuI7ooajkvZPogZTliqjvvJpcbiAgICogLSBmbHVpZO+8iOWIl+acquaSkea7oe+8ie+8muS4jeaoqua7muOAgeS4jea1i+Wuve+8jOihqOWuvSAxMDAlIOS4juihqOS9k+WQjOavlOS+i+aLieS8uO+8m1xuICAgKiAtIGZpeGVk77yI5pyJIHNjcm9sbC5477yJ77ya5ZCM5q2lIHNjcm9sbExlZnTvvJtcbiAgICogLSDku4XlvZPooajkvZPmnInnq5bmu5rmnaHml7bpooTnlZnlj7Pkvqfmp73vvIzooYzlsJHml6Dnq5bmu5rml7bkuI3ljaDkvY3jgIJcbiAgICovXG4gIHByaXZhdGUgc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dUYWJsZVRvdGFsKSB7XG4gICAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgICAgaWYgKHRoaXMudG90YWxGb290ZXJOZWVkWUd1dHRlcikge1xuICAgICAgICB0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZvb3RlciA9IHRoaXMuZ2V0VG90YWxGb290ZXJTY3JvbGxFbCgpO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmdldFRhYmxlQm9keVNjcm9sbEVsKCk7XG4gICAgaWYgKCFmb290ZXIpIHtcbiAgICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyU3luY1JldHJ5IDwgMTApIHtcbiAgICAgICAgdGhpcy50b3RhbEZvb3RlclN5bmNSZXRyeSsrO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSwgNTApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRvdGFsRm9vdGVyU3luY1JldHJ5ID0gMDtcbiAgICBjb25zdCBuZWVkWUd1dHRlciA9ICEhKGJvZHkgJiYgdGhpcy5ib2R5SGFzVmVydGljYWxTY3JvbGxiYXIoYm9keSkpO1xuICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgIT09IG5lZWRZR3V0dGVyKSB7XG4gICAgICB0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgPSBuZWVkWUd1dHRlcjtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1RvdGFsRm9vdGVyRmx1aWQpIHtcbiAgICAgIHRoaXMudW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk7XG4gICAgICBmb290ZXIuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChib2R5KSB7XG4gICAgICB0aGlzLnN5bmNUb3RhbEZvb3RlclNjcm9sbExlZnQoYm9keS5zY3JvbGxMZWZ0KTtcbiAgICAgIHRoaXMuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYyhib2R5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN5bmNUb3RhbEZvb3RlclNjcm9sbExlZnQoc2Nyb2xsTGVmdDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9vdGVyID0gdGhpcy5nZXRUb3RhbEZvb3RlclNjcm9sbEVsKCk7XG4gICAgaWYgKGZvb3RlciAmJiBmb290ZXIuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsTGVmdCkge1xuICAgICAgZm9vdGVyLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYyhib2R5OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VGFibGVUb3RhbCB8fCAhYm9keSB8fCB0aGlzLmlzVG90YWxGb290ZXJGbHVpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ID09PSBib2R5ICYmXG4gICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlclxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgPSBib2R5O1xuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zeW5jVG90YWxGb290ZXJTY3JvbGxMZWZ0KGJvZHkuc2Nyb2xsTGVmdCk7XG4gICAgfTtcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIsIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgfSBhcyBhbnkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgJiYgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJzY3JvbGxcIixcbiAgICAgICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ID0gbnVsbDtcbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlciA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog55uR5ZCs56qX5Y+jIC8g5a655Zmo5a695bqm5Y+Y5YyW77ya6YeN5paw5Yik5a6aIHNjcm9sbC5477yIZmx1aWTihpRmaXhlZO+8ieS4juWQiOiuoeWPs+S+p+erlua7muanve+8jFxuICAgKiDpgb/lhY3mi4nlrr0v57yp56qE5bGP5bmV5ZCO5ZCI6K6h6KGM5a695LiO6KGo5L2T6ZSZ5L2N44CCXG4gICAqL1xuICBwcml2YXRlIGJpbmRWaWV3cG9ydFJlc2l6ZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5ib3VuZE9uVmlld3BvcnRSZXNpemUgPSAoKSA9PiB0aGlzLnNjaGVkdWxlVmlld3BvcnRTY3JvbGxTeW5jKCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplKTtcbiAgICB9XG4gICAgY29uc3QgUk8gPVxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/ICh3aW5kb3cgYXMgYW55KS5SZXNpemVPYnNlcnZlciA6IG51bGw7XG4gICAgaWYgKFJPICYmIHRoaXMuaG9zdEVsICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyID0gbmV3IFJPKCgpID0+IHRoaXMuc2NoZWR1bGVWaWV3cG9ydFNjcm9sbFN5bmMoKSk7XG4gICAgICB0aGlzLmhvc3RSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5iaW5kVmlld3BvcnRSZXNpemVTeW5jKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSk7XG4gICAgfVxuICAgIHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplID0gbnVsbDtcbiAgICBpZiAodGhpcy5ob3N0UmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld3BvcnRSZXNpemVUaW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyKTtcbiAgICAgIHRoaXMudmlld3BvcnRSZXNpemVUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVZpZXdwb3J0U2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudmlld3BvcnRSZXNpemVUaW1lciA9IG51bGw7XG4gICAgICBpZiAoIXRoaXMudGFibGVDb2xzIHx8ICF0aGlzLnRhYmxlQ29scy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgLy8g562J6KGo5L2T5biD5bGA56iz5a6a5ZCO5YaN5qCh5ZCI6K6h56uW5rua5qe9IC8g5qiq5rua5ZCM5q2lXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSwgNTApO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBkZWFsU2Nyb2xsKCkge1xuICAgIGxldCBjb2xXaWR0aCA9IDA7XG4gICAgaWYgKHRoaXMuc2hvd1NlbGVjdGVkKSB7XG4gICAgICBjb2xXaWR0aCArPSA0MDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1RhYmxlVG90YWwpIHtcbiAgICAgIGNvbFdpZHRoICs9IHRoaXMubGluZU51bWJlckNvbFdpZHRoOyAvLyDluo/lj7fliJfvvIjlm7rlrprlrr3vvIzkuI3pmo/kvY3mlbDlj5jljJbvvIlcbiAgICB9XG4gICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtLndpZHRoKSB7XG4gICAgICAgIGl0ZW0ud2lkdGggPSBDb2xXaWR0aC5maXhDb2xXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmlzU2hvdykge1xuICAgICAgICBpdGVtLmZpeGVkV2lkdGggPSBjb2xXaWR0aDtcbiAgICAgICAgY29sV2lkdGggKz0gaXRlbS53aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOWPs+S+p+WbuuWumuWIl++8muS7juWPs+W+gOW3pue0r+iuoeWBj+enu++8jOmBv+WFjeWkmuWIl+mDvSByaWdodDowIOS6kuebuOmBruaMoVxuICAgIGxldCByaWdodE9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMudGFibGVDb2xzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy50YWJsZUNvbHNbaV07XG4gICAgICBpZiAoIWl0ZW0uaXNTaG93KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uZml4ZWQgPT09IFwicmlnaHRcIikge1xuICAgICAgICBpdGVtLmZpeGVkUmlnaHRXaWR0aCA9IHJpZ2h0T2Zmc2V0O1xuICAgICAgICByaWdodE9mZnNldCArPSBpdGVtLndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5maXhlZFJpZ2h0V2lkdGggPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGFibGVDb2xXaWR0aFRvdGFsID0gY29sV2lkdGg7XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgdXNlVmlydHVhbCA9IHRoaXMudXNlVmlydHVhbFNjcm9sbDtcbiAgICBjb25zdCBzY3JvbGxYID0gdGhpcy5yZXNvbHZlU2Nyb2xsWChjb2xXaWR0aCk7XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmICF1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgICAgeDogc2Nyb2xsWCxcbiAgICAgICAgeTogbnVsbCxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgICB4OiBzY3JvbGxYLFxuICAgICAgICB5OiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgeDogc2Nyb2xsWCxcbiAgICAgIHk6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g6KGo5qC85Yu+6YCJ6YC76L6RXG4gIGN1cnJlbnRQYWdlRGF0YUNoYW5nZSgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEgPSAkZXZlbnQ7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgaWYgKCF0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwpIHtcbiAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZWFyY2gocmVzZXQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDliY3nq6/liIbpobXvvJrlj6rlkIzmraXpobXnoIEv5p2h5pWw77yM5LiN6Kem5Y+R54i257uE5Lu25p+l6K+iXG4gICAgaWYgKHRoaXMuZnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleCA9IDE7XG4gICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhYmxlUGFnZUluZGV4Q2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VJbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAvLyDmjInlvZPliY3pobXooYzmlbDph43nrpfmmK/lkKbpnIDopoEgc2Nyb2xsLnnvvIjmnKvpobXmlbDmja7lsJHml7bljrvmjonlm7rlrprpq5jluqbvvIzpgb/lhY3nlZnnmb3vvIlcbiAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUoZmFsc2UpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFibGVQYWdlSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZUluZGV4KTtcbiAgICAgIC8vIOinpuWPkeeItue7hOS7tuafpeivouS6i+S7tlxuICAgICAgdGhpcy50YWJsZVNlYXJjaEV2ZW50LmVtaXQocmVzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlupXpg6jlkIjorqHvvJrkuI4gaGQtZGV0YWlsLWxpbmVzIOebuOWQjO+8jOS9v+eUqCBUb3RhbE9wdGlvbu+8iGluc2VydEluZGV4IC8gaW5zZXJ0VmFsdWXvvInjgIJcbiAgICog5byA5ZCv5ZCO5by65Yi25bGV56S65bqP5Y+35YiX77yM44CM5ZCI6K6h44CN6JC95Zyo5bqP5Y+35YiX5LiL77ybXG4gICAqIGluc2VydEluZGV4IOS7jiAxIOi1t+WvueW6lOWPr+ingeaVsOaNruWIl++8m+acquS8oCBpbnNlcnRWYWx1ZSDml7bmjInor6XliJcgbmFtZSDlr7kgY29udGVudCDmsYLlkozjgIJcbiAgICovXG4gIGNhbGN1bGF0ZVRhYmxlVG90YWwoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2hvd1RhYmxlVG90YWwgfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb24gfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb24ubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpc2libGVDb2xzID0gKHRoaXMudGFibGVDb2xzIHx8IFtdKS5maWx0ZXIoXG4gICAgICAoYykgPT4gYyAmJiBjLmlzU2hvdyAhPT0gZmFsc2UsXG4gICAgKTtcbiAgICAvLyBjb2x1bW5zTnVtYmVyIOWQq+W6j+WPt+WIl++8iOS4jiBkZXRhaWwtbGluZXMg5LiA6Ie077yJ77yM5pWw5o2u5qe95L2N5pWwID0gY29sdW1uc051bWJlciAtIDFcbiAgICBjb25zdCBjb25maWd1cmVkID0gTnVtYmVyKHRoaXMuY29sdW1uc051bWJlcik7XG4gICAgY29uc3QgY29sdW1uTnVtYmVyID1cbiAgICAgIGNvbmZpZ3VyZWQgPiAxXG4gICAgICAgID8gY29uZmlndXJlZCAtIDFcbiAgICAgICAgOiBjb25maWd1cmVkID09PSAxXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiB2aXNpYmxlQ29scy5sZW5ndGg7XG4gICAgaWYgKCFjb2x1bW5OdW1iZXIgfHwgY29sdW1uTnVtYmVyIDwgMSkge1xuICAgICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gbmV3IEFycmF5KGNvbHVtbk51bWJlcikuZmlsbChcIlwiKTtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50IDogW107XG4gICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtID09IG51bGwgfHwgIWl0ZW0uaW5zZXJ0SW5kZXggfHwgaXRlbS5pbnNlcnRJbmRleCA8IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHZhbHVlOiBhbnkgPSBpdGVtLmluc2VydFZhbHVlO1xuICAgICAgLy8g5pyq5LygIGluc2VydFZhbHVlIOaXtu+8muaMiSBpbnNlcnRJbmRleCDlr7nlupTlj6/op4HliJcgbmFtZSDoh6rliqjmsYLlkoxcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHZpc2libGVDb2xzW2l0ZW0uaW5zZXJ0SW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2wgJiYgdHlwZW9mIGNvbC5uYW1lID09PSBcInN0cmluZ1wiID8gY29sLm5hbWUgOiBudWxsO1xuICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgY29udGVudC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICBjb25zdCByYXcgPSByb3cgPyByb3dbZmllbGRdIDogbnVsbDtcbiAgICAgICAgICBpZiAocmF3ID09IG51bGwgfHwgcmF3ID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihyYXcpO1xuICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgc3VtICs9IG51bTtcbiAgICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc3VtO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sQXRJbmRleCA9IHZpc2libGVDb2xzW2l0ZW0uaW5zZXJ0SW5kZXggLSAxXTtcbiAgICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3RbaXRlbS5pbnNlcnRJbmRleCAtIDFdID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ24gfHwgKGNvbEF0SW5kZXggJiYgY29sQXRJbmRleC5hbGlnbikgfHwgXCJsZWZ0XCIsXG4gICAgICAgIHNob3dEZWNpbWFsOiBpdGVtLnNob3dEZWNpbWFsIHx8IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZU51bWJlcjpcbiAgICAgICAgICBpdGVtLnByZXNlcnZlTnVtYmVyICE9IG51bGwgPyBpdGVtLnByZXNlcnZlTnVtYmVyIDogMixcbiAgICAgICAgaXNIaWRlOiBpdGVtLmlzSGlkZSB8fCBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRhYmxlVG90YWxDZWxsTWV0YShjb2w6IEhkVGFibGVDb2x1bW4sIGNvbEluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmICghY29sIHx8ICF0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0IHx8ICF0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCB2aXNpYmxlSW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBjb2xJbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy50YWJsZUNvbHNbaV07XG4gICAgICBpZiAoYyAmJiBjLmlzU2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgdmlzaWJsZUluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2aXNpYmxlSW5kZXggPCAwIHx8IHZpc2libGVJbmRleCA+PSB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0W3Zpc2libGVJbmRleF07XG4gICAgcmV0dXJuIG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgPyBtZXRhIDogbnVsbDtcbiAgfVxuXG4gIC8qKiDlkIjorqHljZXlhYPmoLzlsZXnpLrmlofmoYjvvIjlr7npvZAgZGV0YWlsLWxpbmVzIOWwj+aVsOinhOWIme+8iSAqL1xuICBnZXRUYWJsZVRvdGFsQ2VsbFZhbHVlKGNvbDogSGRUYWJsZUNvbHVtbiwgY29sSW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0VGFibGVUb3RhbENlbGxNZXRhKGNvbCwgY29sSW5kZXgpO1xuICAgIGlmICghbWV0YSB8fCBtZXRhLmlzSGlkZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gbWV0YS52YWx1ZTtcbiAgICBpZiAoISh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBwcmVzZXJ2ZSA9XG4gICAgICBtZXRhLnByZXNlcnZlTnVtYmVyICE9IG51bGwgPyBOdW1iZXIobWV0YS5wcmVzZXJ2ZU51bWJlcikgOiAyO1xuICAgIGlmICh2YWx1ZSAlIDEgPT09IDAgJiYgIW1ldGEuc2hvd0RlY2ltYWwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgZmFjdG9yID0gTWF0aC5wb3coMTAsIHByZXNlcnZlKTtcbiAgICByZXR1cm4gKE1hdGgucm91bmQoTnVtYmVyKHZhbHVlKSAqIGZhY3RvcikgLyBmYWN0b3IpLnRvRml4ZWQocHJlc2VydmUpO1xuICB9XG5cbiAgZ2V0VGFibGVUb3RhbENlbGxBbGlnbihjb2w6IEhkVGFibGVDb2x1bW4sIGNvbEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFRhYmxlVG90YWxDZWxsTWV0YShjb2wsIGNvbEluZGV4KTtcbiAgICBjb25zdCBhbGlnbiA9XG4gICAgICAobWV0YSAmJiBtZXRhLmFsaWduKSB8fCAoY29sICYmIGNvbC5hbGlnbikgfHwgXCJsZWZ0XCI7XG4gICAgaWYgKGFsaWduID09PSBcInJpZ2h0XCIgfHwgYWxpZ24gPT09IFwiY2VudGVyXCIgfHwgYWxpZ24gPT09IFwibGVmdFwiKSB7XG4gICAgICByZXR1cm4gYWxpZ247XG4gICAgfVxuICAgIHJldHVybiBcImxlZnRcIjtcbiAgfVxuXG4gIC8qKiDlupXpg6jjgIzlhbEgbiDmnaHjgI3vvJrpnZ7liIbpobUv5YmN56uv5YiG6aG155SoIGNvbnRlbnQubGVuZ3Ro77yM5pyN5Yqh56uv5YiG6aG155SoIHRvdGFsRWxlbWVudHMgKi9cbiAgZ2V0VGFibGVUb3RhbENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLnRhYmxlRGF0YSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uIHx8IHRoaXMuZnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWJsZURhdGEuY29udGVudCA/IHRoaXMudGFibGVEYXRhLmNvbnRlbnQubGVuZ3RoIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGFibGVEYXRhLnRvdGFsRWxlbWVudHMgIT0gbnVsbFxuICAgICAgPyB0aGlzLnRhYmxlRGF0YS50b3RhbEVsZW1lbnRzXG4gICAgICA6IDA7XG4gIH1cblxuICByZXNldFN0YXR1cygpIHtcbiAgICB0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAvLyDlhYjmmL7lvI/nva4gZmFsc2XvvIzpgb/lhY0gbnotY2hlY2tib3gg5YaF6YOo54q25oCB5LiOIG1hcE9mQ2hlY2tlZElkIOS4jeWQjOatpe+8iOiZmuaLn+a7muWKqOWkjeeUqOihjOaXtuW4uOinge+8iVxuICAgIE9iamVjdC5rZXlzKHRoaXMubWFwT2ZDaGVja0xpc3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtrZXldID0gZmFsc2U7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtW3RoaXMuc2VsZWN0RmllbGRdO1xuICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRba2V5XSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubWFwT2ZDaGVja2VkSWQgPSB7fTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0ID0ge307XG4gICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KFtdKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZnJlc2hTdGF0dXMoZXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSwgZGF0YTogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICAvLyDnpoHnlKjooYzkuI3lhYHorrjli77pgInvvJvlj5bmtojli77pgInku43lhYHorrjvvIjkvovlpoLmlbDmja7lj5jmm7TliY3lt7Lli77pgInvvIlcbiAgICAgIGlmIChldmVudCAmJiB0aGlzLmlzU2VsZWN0RGlzYWJsZWQoZGF0YSkpIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBldmVudDtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICAhdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgICh0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dID0gZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGFibGVMaXN0ID0gdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gIXRoaXMuaXNTZWxlY3REaXNhYmxlZChpdGVtKSxcbiAgICApO1xuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPVxuICAgICAgc2VsZWN0YWJsZUxpc3QubGVuZ3RoID4gMCAmJlxuICAgICAgc2VsZWN0YWJsZUxpc3QuZXZlcnkoKGl0ZW0pID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0pO1xuICAgIHRoaXMuaXNJbmRldGVybWluYXRlID1cbiAgICAgIHNlbGVjdGFibGVMaXN0LnNvbWUoXG4gICAgICAgIChpdGVtKSA9PiB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dLFxuICAgICAgKSAmJiAhdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZDtcbiAgICAvLyDop6blj5FzZWxlY3Tkuovku7ZcbiAgICBpZiAodGhpcy5zZWxlY3RFdmVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRMaXN0OiBBcnJheTxhbnk+ID0gT2JqZWN0LnZhbHVlcyh0aGlzLm1hcE9mQ2hlY2tMaXN0KTtcbiAgICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdChzZWxlY3RlZExpc3QpO1xuICAgIH1cbiAgICAvLyDlpoLmnpzmlbDmja7kuLrnqbrvvIzliJnmuIXnqbrli77pgInmoIfor4ZcbiAgICBpZiAodGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjaGVja0FsbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgLy8g5YWo6YCJL+WPlua2iOWFqOmAieWdh+i3s+i/h+emgeeUqOihjO+8iOemgeeUqOihjOS/neaMgeWOn+WLvumAieeKtuaAge+8iVxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3REaXNhYmxlZChpdGVtKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgIXRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICAodGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSA9IGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiog5b2T5YmN6KGM5piv5ZCm56aB55So5Yu+6YCJICovXG4gIGlzU2VsZWN0RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5zZWxlY3REaXNhYmxlZEZpZWxkICYmXG4gICAgICBkYXRhICYmXG4gICAgICBkYXRhW3RoaXMuc2VsZWN0RGlzYWJsZWRGaWVsZF0gPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqIOW9k+WJjeihjOaYr+WQpuWkseaViCAqL1xuICBpc0ludmFsaWRSb3coZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5yb3dJbnZhbGlkRmllbGQgJiZcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGFbdGhpcy5yb3dJbnZhbGlkRmllbGRdID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJfmloflrZfpopzoibLvvJpjb2xvciDkuLrlh73mlbDml7bmjInooYzorqHnrpfvvIjnlKjkuo7mn5DkuIDooYzmn5DkuIDliJfmoIfnuqLvvInvvIzlkKbliJnmlbTliJflkIzoibLjgIJcbiAgICovXG4gIHJlc29sdmVDZWxsQ29sb3IoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghY29sIHx8IGNvbC5jb2xvciA9PSBudWxsIHx8IGNvbC5jb2xvciA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmNvbG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sLmNvbG9yKGRhdGEpO1xuICAgICAgcmV0dXJuIHZhbHVlIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb2wuY29sb3I7XG4gIH1cblxuICAvKiog5Y+v54K55Ye75Y2V5YWD5qC86aKc6Imy77ya56m65YC85Zu65a6a54Gw77yM5ZCm5YiZ5oyJ5YiXIGNvbG9yICovXG4gIGdldExpbmtDZWxsQ29sb3IoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIGlzRW1wdHk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICByZXR1cm4gXCIjMkEzNjM0XCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc29sdmVDZWxsQ29sb3IoY29sLCBkYXRhKTtcbiAgfVxuXG4gIC8qKiDmma7pgJrmlofmnKzljZXlhYPmoLzpopzoibLvvJrlpLHmlYjooYznu5/kuIDngbDvvIzlkKbliJnnlKjliJfphY3nva4gY29sb3IgKi9cbiAgZ2V0UGxhaW5DZWxsQ29sb3IoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzSW52YWxpZFJvdyhkYXRhKSkge1xuICAgICAgcmV0dXJuIFwiIzg2OEE5Q1wiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ2VsbENvbG9yKGNvbCwgZGF0YSk7XG4gIH1cblxuICBqdWRnZUNvbEVtcHR5KHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciB8fCBzdHIgPT09IDApIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIjznqbo+XCI7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdGVGaWVsZChjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIGlmIChjb2wuaXNTdGF0ZSkge1xuICAgICAgcmV0dXJuIGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5zdGF0ZUZpZWxkIHx8IFwic3RhdGVcIjtcbiAgfVxuXG4gIC8qKiDlrZfmrrXlgLzlkI7mmK/lkKblsZXnpLrnq5bnur/ooYzlj7cgKi9cbiAgaGFzUm93Tm8oY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGNvbCAmJiAoY29sLnJvd05vID09PSB0cnVlIHx8ICh0eXBlb2YgY29sLnJvd05vID09PSBcInN0cmluZ1wiICYmIGNvbC5yb3dObykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDooYzlj7fmlofmoYjjgIJyb3dObyDkuLrlrZfmrrXlkI3ml7blj5booYzmlbDmja7vvJvkuLogdHJ1ZSDml7bmjInlvZPliY3pobXluo/lj7fvvIjot6jpobXov57nu63vvIzku44gMSDlvIDlp4vvvInjgIJcbiAgICovXG4gIGdldFJvd05vVGV4dChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmhhc1Jvd05vKGNvbCkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5yb3dObyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgdmFsdWUgPSBkYXRhID8gZGF0YVtjb2wucm93Tm9dIDogbnVsbDtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2UgPSBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpIDogMTtcbiAgICBjb25zdCBzaXplID0gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAwO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gTnVtYmVyKGluZGV4KSA+PSAwID8gTnVtYmVyKGluZGV4KSA6IDA7XG4gICAgcmV0dXJuIFN0cmluZygocGFnZSAtIDEpICogc2l6ZSArIHJvd0luZGV4ICsgMSk7XG4gIH1cblxuICAvKiog6KGo5aS044CM6YWN6YCB5Y2V5Y+3IHwg6KGM44CN5ouG5oiQ55+t56uW57q/77yM6YG/5YWN5a2X56ymIHwg5ouJ5ruh6KGM6auYICovXG4gIGdldFRpdGxlUGFydHMoY29sOiBIZFRhYmxlQ29sdW1uKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLmhhc1Jvd05vKGNvbCkgfHwgIWNvbCB8fCAhY29sLnRpdGxlIHx8IFN0cmluZyhjb2wudGl0bGUpLmluZGV4T2YoXCJ8XCIpIDwgMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IFN0cmluZyhjb2wudGl0bGUpLnNwbGl0KFwifFwiKTtcbiAgICBpZiAocmF3Lmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gW3Jhd1swXS50cmltKCksIHJhdy5zbGljZSgxKS5qb2luKFwifFwiKS50cmltKCldO1xuICB9XG5cbiAgLyoqIOaYr+WQpuaYvuekuue8lui+keeslOWbvuagh++8iOaciSBlZGl0VHlwZSDml7botbDooYzlhoXmjqfku7bvvIzkuI3lho3mmL7npLrnrJTvvIkgKi9cbiAgaXNFZGl0YWJsZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghY29sIHx8IHRoaXMuaGFzSW5saW5lRWRpdChjb2wpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb2wuZWRpdGFibGUgPT0gbnVsbCB8fCBjb2wuZWRpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmVkaXRhYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAhIWNvbC5lZGl0YWJsZShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY29sLmVkaXRhYmxlO1xuICB9XG5cbiAgLyoqIOeCueWHu+e8lui+keeslO+8jOWbnuiwg+eItue7hOS7tuS8oOWFpeeahCBlZGl0ICovXG4gIG9uRWRpdENsaWNrKGV2ZW50OiBFdmVudCwgY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoY29sLmVkaXQgfHwgbnVsbCwgZGF0YSk7XG4gIH1cblxuICAvKiog5YiX5piv5ZCm6YWN572u5LqG5Y+v55So55qE6KGM5YaF57yW6L6R77yIbmFtZSDlv4XpobvmmK8gc3RyaW5n77yJICovXG4gIGhhc0lubGluZUVkaXQoY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5lZGl0VHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5uYW1lICE9PSBcInN0cmluZ1wiIHx8ICFjb2wubmFtZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltoZC10YWJsZV0gZWRpdFR5cGUg6KaB5rGCIG5hbWUg5Li6IHN0cmluZ++8jOWIl+OAjFwiICtcbiAgICAgICAgICAoY29sLnRpdGxlIHx8IFwiXCIpICtcbiAgICAgICAgICBcIuOAjeW3suWbnumAgOWPquivu1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpc0VkaXREaXNhYmxlZChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghY29sIHx8IGNvbC5lZGl0RGlzYWJsZWQgPT0gbnVsbCB8fCBjb2wuZWRpdERpc2FibGVkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5lZGl0RGlzYWJsZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuICEhY29sLmVkaXREaXNhYmxlZChkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY29sLmVkaXREaXNhYmxlZDtcbiAgfVxuXG4gIGdldFNlbGVjdExpc3QoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBBcnJheTxhbnk+IHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLnNlbGVjdE9wdGlvbikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGlmIChvcHQuc2VsZWN0TGlzdE5hbWUgJiYgZGF0YSkge1xuICAgICAgY29uc3QgbGlzdCA9IGRhdGFbb3B0LnNlbGVjdExpc3ROYW1lXTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtdO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHQuc2VsZWN0TGlzdCkgPyBvcHQuc2VsZWN0TGlzdCA6IFtdO1xuICB9XG5cbiAgZ2V0U2VsZWN0T3B0aW9uTGFiZWwoY29sOiBIZFRhYmxlQ29sdW1uLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uIHx8ICFpdGVtKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gY29sLnNlbGVjdE9wdGlvbjtcbiAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bb3B0LnZhbHVlXTtcbiAgICBjb25zdCBsYWJlbCA9IGl0ZW1bb3B0LmxhYmVsXTtcbiAgICBpZiAob3B0LnNob3dMYWJlbEFuZFZhbHVlIHx8IG9wdC5oZFNob3dJdGVtQ29kZSkge1xuICAgICAgcmV0dXJuIGBbJHt2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlfV0ke2xhYmVsID09IG51bGwgPyBcIlwiIDogbGFiZWx9YDtcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVsID09IG51bGwgPyBcIlwiIDogU3RyaW5nKGxhYmVsKTtcbiAgfVxuXG4gIGdldElucHV0TnVtYmVyUHJvcChcbiAgICBjb2w6IEhkVGFibGVDb2x1bW4sXG4gICAga2V5OiBcIm1pblwiIHwgXCJtYXhcIiB8IFwic3RlcFwiIHwgXCJwcmVjaXNpb25cIixcbiAgICBmYWxsYmFjazogbnVtYmVyLFxuICApOiBudW1iZXIge1xuICAgIGlmICghY29sIHx8ICFjb2wuaW5wdXROdW1iZXIpIHtcbiAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICB9XG4gICAgY29uc3QgdmFsID0gY29sLmlucHV0TnVtYmVyW2tleV07XG4gICAgcmV0dXJuIHZhbCAhPSBudWxsID8gTnVtYmVyKHZhbCkgOiBmYWxsYmFjaztcbiAgfVxuXG4gIC8qKiBJbnB1dCAvIElucHV0TnVtYmVyIOWPmOabtO+8muWFiOiusOaXp+WAvOWGjeWGmeWbnuW5tumAmuefpeeItue7hOS7tiAqL1xuICBvbkNlbGxDaGFuZ2UoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSW5saW5lRWRpdChjb2wpIHx8ICFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBjb2wubmFtZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGRhdGFbbmFtZV07XG4gICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIHRoaXMuY2VsbENoYW5nZS5lbWl0KHtcbiAgICAgIGxpbmU6IGRhdGEsXG4gICAgICBjb2wsXG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBwcmV2aW91c1ZhbHVlLFxuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFNlbGVjdCDlj5jmm7TvvJrlj4zlhpkgdmFsdWUgKyBsYWJlbO+8jOW5tuW4piBwcmV2aW91cyogLyBvcHRpb24gKi9cbiAgb25TZWxlY3RDaGFuZ2UoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSW5saW5lRWRpdChjb2wpIHx8ICFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBjb2wubmFtZSBhcyBzdHJpbmc7XG4gICAgY29uc3Qgb3B0ID0gY29sLnNlbGVjdE9wdGlvbjtcbiAgICBjb25zdCBsYWJlbEZpZWxkID0gb3B0ICYmIG9wdC5sYWJlbCA/IG9wdC5sYWJlbCA6IG51bGw7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGRhdGFbbmFtZV07XG4gICAgY29uc3QgcHJldmlvdXNMYWJlbCA9IGxhYmVsRmllbGQgPyBkYXRhW2xhYmVsRmllbGRdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLmdldFNlbGVjdExpc3QoY29sLCBkYXRhKTtcbiAgICBjb25zdCBwcmV2aW91c09wdGlvbiA9XG4gICAgICBwcmV2aW91c1ZhbHVlID09IG51bGwgfHwgIW9wdFxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiBsaXN0LmZpbmQoKGl0ZW0pID0+IGl0ZW0gJiYgaXRlbVtvcHQudmFsdWVdID09PSBwcmV2aW91c1ZhbHVlKSB8fFxuICAgICAgICAgIG51bGw7XG4gICAgY29uc3Qgb3B0aW9uID1cbiAgICAgIHZhbHVlID09IG51bGwgfHwgIW9wdFxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiBsaXN0LmZpbmQoKGl0ZW0pID0+IGl0ZW0gJiYgaXRlbVtvcHQudmFsdWVdID09PSB2YWx1ZSkgfHwgbnVsbDtcblxuICAgIGRhdGFbbmFtZV0gPSB2YWx1ZTtcbiAgICBsZXQgbGFiZWw6IGFueSA9IHVuZGVmaW5lZDtcbiAgICBpZiAobGFiZWxGaWVsZCkge1xuICAgICAgbGFiZWwgPSBvcHRpb24gPyBvcHRpb25bb3B0LmxhYmVsXSA6IG51bGw7XG4gICAgICBkYXRhW2xhYmVsRmllbGRdID0gbGFiZWw7XG4gICAgfVxuXG4gICAgdGhpcy5jZWxsQ2hhbmdlLmVtaXQoe1xuICAgICAgbGluZTogZGF0YSxcbiAgICAgIGNvbCxcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgICBsYWJlbCxcbiAgICAgIHByZXZpb3VzTGFiZWwsXG4gICAgICBvcHRpb24sXG4gICAgICBwcmV2aW91c09wdGlvbixcbiAgICB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIl19
2929
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsWUFBWSxHQUdiLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV2RSxPQUFPLEVBSUwsZ0JBQWdCLEVBQ2hCLFFBQVEsR0FDVCxNQUFNLG9CQUFvQixDQUFDO0FBTzVCLE1BQU0sT0FBTyxnQkFBZ0I7Ozs7OztJQWdKM0IsWUFDVSxNQUFrQixFQUNsQixHQUFzQixFQUN0QixvQkFBMEM7UUFGMUMsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0Qix5QkFBb0IsR0FBcEIsb0JBQW9C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QUc3QiwrQ0FBbUQ7Ozs7O0lBSW5ELDhDQUF1Qjs7Ozs7O0lBR3ZCLGlEQUFzQzs7Ozs7O0lBR3RDLDBDQUFzQzs7Ozs7SUFDdEMsNENBQXdDOztJQUV4Qyw0Q0FBNEU7Ozs7O0lBRTVFLHNEQUF1RDs7Ozs7SUFDdkQsb0RBQW9EOzs7OztJQUNwRCxnREFBaUM7Ozs7O0lBR2pDLGtEQUErQjs7Ozs7O0lBRy9CLCtDQUF3Qzs7Ozs7SUFDeEMsaURBQWlEOzs7OztJQUNqRCw4Q0FBdUM7Ozs7OztJQUd2QyxtREFLSzs7Ozs7SUFDTCx3REFBK0Q7Ozs7O0lBQy9ELCtDQUtLOzs7OztJQUNMLG9EQUEyRDs7Ozs7O0lBRTNELG9EQUEyRDs7Ozs7O0lBcVEzRCw4Q0FBaUM7O0lBdUNqQyxzQ0FHRTs7Ozs7SUFHRiw2Q0FBcUQ7O0lBRXJELHNDQUVFOztJQW9ZRixzQ0FnQ0U7Ozs7O0lBdnRCQSxrQ0FBMEI7Ozs7O0lBQzFCLCtCQUE4Qjs7Ozs7SUFDOUIsZ0RBQWtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0ICogYXMgbG9jYWxmb3JhZ2UgZnJvbSBcImxvY2FsZm9yYWdlXCI7XG5pbXBvcnQge1xuICBJbnB1dEJvb2xlYW4sXG4gIE56Rm9ybWF0QmVmb3JlRHJvcEV2ZW50LFxuICBOekZvcm1hdEVtaXRFdmVudCxcbn0gZnJvbSBcIm5nLXpvcnJvLWFudGQvY29yZVwiO1xuaW1wb3J0IHsgTnpSZXNpemVFdmVudCB9IGZyb20gXCJuZy16b3Jyby1hbnRkL3Jlc2l6YWJsZVwiO1xuaW1wb3J0IHsgTnpUYWJsZUNvbXBvbmVudCB9IGZyb20gXCJuZy16b3Jyby1hbnRkL3RhYmxlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGVsYXkgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IENvbFdpZHRoIH0gZnJvbSBcIi4uL21vZGVsL2NvbFdpZHRoXCI7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSBcIi4uL21vZGVsL2NvbW1vbi10eXBlXCI7XG5pbXBvcnQgeyBDb21tb25TZXNzaW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlL2NvbW1vbi1zZXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IHJlc29sdmVBdXRvVGFibGVTY3JvbGwgfSBmcm9tIFwiLi4vdXRpbHMvaGQtdGFibGUtc2Nyb2xsLnV0aWxcIjtcbmltcG9ydCB7IFRvdGFsT3B0aW9uIH0gZnJvbSBcIi4uL2hkLWRldGFpbC1saW5lcy9oZC1kZXRhaWwtbGluZXMuc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgSGRUYWJsZUNlbGxDaGFuZ2UsXG4gIEhkVGFibGVDb2x1bW4sXG4gIE9wZXJhdGVCdG4sXG4gIFRhYmxlQ2FjaGVPcHRpb24sXG4gIFRyZWVHcmlkLFxufSBmcm9tIFwiLi9oZC10YWJsZS5zZXJ2aWNlXCI7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiaGQtdGFibGVcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9oZC10YWJsZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vaGQtdGFibGUuY29tcG9uZW50Lmxlc3NcIl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBIZFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB1dWlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRhYmxlQ29sczogQXJyYXk8SGRUYWJsZUNvbHVtbj4gPSBbXTtcbiAgQElucHV0KCkgdGFibGVEYXRhOiBQYWdlPGFueT47XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93U2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dPcGVyYXRlQ29sV2FycEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiog5piv5ZCm5bGV56S65YiX6K6+572u77yI6b2/6L2u77yJ77yM6buY6K6k5byA5ZCv77yb5by556qX562J5Zy65pmv5Y+v5LygIGZhbHNlIOWFs+mXrSAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0NvbFNldHRpbmdzOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHZpcnR1YWxTY3JvbGw6IGJvb2xlYW4gPSB0cnVlO1xuICAvKiog5omL5Yqo5oyH5a6a6KGM6auY77yb5LiN5Lyg5YiZ5Zyo6aaW5bGP5riy5p+T5ZCO6Ieq5Yqo5rWL6YePICovXG4gIEBJbnB1dCgpIHZpcnR1YWxJdGVtU2l6ZTogbnVtYmVyO1xuICBASW5wdXQoKSBzZWxlY3RGaWVsZDogc3RyaW5nID0gXCJiaWxsTnVtYmVyXCI7XG4gIC8qKlxuICAgKiDooYzli77pgInnpoHnlKjlrZfmrrXlkI3jgILlrprkuYnlkI7lj5blvZPliY3ooYzor6XlrZfmrrXvvJpcbiAgICog5Li6IHRydWUg5pe256aB55So6K+l6KGM5Yu+6YCJ77yI5YWo6YCJ5Lmf5Lya6Lez6L+H77yJ44CCXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3REaXNhYmxlZEZpZWxkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDooYzlpLHmlYjlrZfmrrXlkI3jgILlrprkuYnlkI7lj5blvZPliY3ooYzor6XlrZfmrrXvvJpcbiAgICog5Li6IHRydWUg5pe25pW06KGM6IOM5pmv6Imy5Li6ICNGN0Y4RkHjgIJcbiAgICovXG4gIEBJbnB1dCgpIHJvd0ludmFsaWRGaWVsZDogc3RyaW5nO1xuICAvLyDlkIjorqHljLrln5/vvIjnsbvlnovkuI4gaGQtZGV0YWlsLWxpbmVzIOeahCBUb3RhbE9wdGlvbiDkuIDoh7TvvIlcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUYWJsZVRvdGFsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhYmxlVG90YWxPcHRpb246IEFycmF5PFRvdGFsT3B0aW9uPjtcbiAgLyoqXG4gICAqIOWQiOiuoeWIl+aAu+aVsO+8iOWQq+W6j+WPt+WIl++8jOS4jiBoZC1kZXRhaWwtbGluZXMg5LiA6Ie077yJ77ybXG4gICAqIOS4jeS8oOWImeaMieW9k+WJjeWPr+ingeaVsOaNruWIl+aVsCArIDHvvIjluo/lj7fvvInmjqjnrpfjgIJcbiAgICovXG4gIEBJbnB1dCgpIGNvbHVtbnNOdW1iZXI6IG51bWJlciB8IHN0cmluZztcbiAgQE91dHB1dCgpIHNvcnRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgdGFibGVTZWFyY2hFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIOihjOWGhee8lui+keWPmOabtO+8iOW3suWGmeWbnuihjOWvueixoe+8m3ByZXZpb3VzKiDkvpvmjqXlj6PlpLHotKXlm57mu5rvvIkgKi9cbiAgQE91dHB1dCgpIGNlbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEhkVGFibGVDZWxsQ2hhbmdlPigpO1xuICBASW5wdXQoKSB0YWJsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuaYvuekuuWIhumhte+8m2ZhbHNlIOaXtuS4gOasoeWxleekuiB0YWJsZURhdGEuY29udGVudCDlhajpg6jooYwgKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHBhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICAvKipcbiAgICog5piv5ZCm5YmN56uv5YiG6aG177yI5a+5IGNvbnRlbnQg5YWo6YeP5YiH54mH77yJ44CCXG4gICAqIHRydWXvvJrnv7vpobXkuI3op6blj5EgdGFibGVTZWFyY2hFdmVudO+8jOmAguWQiOivpuaDheWFqOmHj+aVsOaNru+8m1xuICAgKiBmYWxzZe+8iOm7mOiupO+8ie+8muacjeWKoeerr+WIhumhte+8jOe/u+mhteinpuWPkeafpeivou+8iOeOsOacieWIl+ihqOihjOS4uu+8ieOAglxuICAgKiDkuI4gcGFnaW5hdGlvbj1mYWxzZSDlkIzml7bnlKjml7bku6XkuI3liIbpobXkuLrlh4bjgIJcbiAgICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBmcm9udFBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8g6KGo5qC85YiG6aG15Y+C5pWwXG4gIEBJbnB1dCgpIHRhYmxlUGFnZUluZGV4OiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSB0YWJsZVBhZ2VTaXplOiBudW1iZXIgPSAxMDA7XG4gIEBJbnB1dCgpIGlzRmlyc3RFbnRyeVNlYXJjaDogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNDcm9zc1BhZ2VTZWxlY3Q6IGJvb2xlYW47XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VJbmRleENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlU2l6ZUNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVRvdGFsXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0YWJsZVRvdGFsOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGFibGVMZWZ0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZUxlZnRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVJpZ2h0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZVJpZ2h0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBzY3JvbGwgPSBudWxsO1xuXG4gIC8vIOihqOagvOWLvumAieWPguaVsFxuICBpc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICBpc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgbGlzdE9mRGlzcGxheURhdGEgPSBbXTtcbiAgbGlzdE9mQWxsRGF0YSA9IFtdO1xuICBsaXN0T2ZTZWxlY3Rpb246IEFycmF5PGFueT4gfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgbWFwT2ZDaGVja2VkSWQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIG1hcE9mQ2hlY2tMaXN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIC8vIOWQiOiuoeWPguaVsFxuICB0YWJsZVRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuICAvLyDnvJPlrZjkv6Hmga9cbiAgdGFibGVDYWNoZU9wdGlvbjogVGFibGVDYWNoZU9wdGlvbiA9IG5ldyBUYWJsZUNhY2hlT3B0aW9uKCk7XG4gIHVzZXJTZXNzaW9uOiBhbnk7XG5cbiAgdGFibGVDb2xzQ2FjaGU6IEFycmF5PEhkVGFibGVDb2x1bW4+ID0gW107XG4gIHNob3dUYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RDb2xMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzZWxlY3RDb2xMaXN0Tm9kZXNDYWNoZTogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNob3dMaXN0Tm9kZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBpc0Ryb3Bkb3duVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyDorr7nva7liJfnmoTlj6/op4Hmk43kvZzmlbDnu4RcbiAgbm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgLy8g6K6+572u5YiX55qE5LiN5Y+v6KeB5pON5L2c5pWw57uEXG4gIGhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuXG4gIC8vIOeCueWHu+aXtumcgOimgeacieS4tOaXtuaVsOe7hOWtmOaUvuS4pOS4qnRyZWUs55So5LqO5Y+W5raI5pe25YCZ5oGi5aSN6LCD5pW05YmN55qE54q25oCBXG4gIGNhbmNlbE5vd0xpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGNhbmNlbEhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzaG93RGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIGxvY2FsZm9yYWdlOiBhbnkgPSBudWxsO1xuICBsb2NhbHRpb25UbXA6IHN0cmluZyA9IFwiXCI7XG4gIGlzRmlyc3RFbnRyeVNlYXJjaExvY2FsOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiDoh6rliqjmtYvph4/liY3nmoTlhZzlupXooYzpq5jvvIzmtYvph4/lrozmiJDlkI7kvJrmm7TmlrAgKi9cbiAgbWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUgPSA0NztcblxuICAvKiog6K6w5b2V5b2T5YmN5piv5ZCm5aSE5LqO6Jma5ouf5rua5Yqo5qih5byP77yM55So5LqO5YiH5o2iIHBhZ2VTaXplIOaXtumHjeW7uuihqOagvCAqL1xuICBwcml2YXRlIHZpcnR1YWxTY3JvbGxBY3RpdmU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICAvKiog5Y+v6KeB5YiX5oC75a6977yM55So5LqO5Yik5pat5piv5ZCm6ZyA6KaB5qiq5ZCR5rua5YqoICovXG4gIC8qKiDliJflrr3lkIjorqHvvIjlkKvli77pgIkv5bqP5Y+377yJ77yMZm9vdGVyIOihqOWuveS4juaoquWQkSBzY3JvbGwg5YWx55SoICovXG4gIHRhYmxlQ29sV2lkdGhUb3RhbCA9IDA7XG5cbiAgLyoqIOaVsOaNruabtOaWsOWQjuW+heWkjeS9jee6teWQkea7muWKqOS9jee9riAqL1xuICBwcml2YXRlIHBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IGZhbHNlO1xuXG4gIC8qKiDlvZPliY3mjpLluo/vvIzooajmoLzph43lu7rlkI7nlKjkuo7mgaLlpI3ooajlpLTmjpLluo/mgIEgKi9cbiAgcHJpdmF0ZSBjdXJyZW50U29ydEtleTogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50U29ydFZhbHVlOiBzdHJpbmcgPSBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoXCJoZFRhYmxlXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBuelRhYmxlQ29tcG9uZW50OiBOelRhYmxlQ29tcG9uZW50O1xuXG4gIHByaXZhdGUgdG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHk6IEhUTUxFbGVtZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSB0b3RhbEZvb3RlclNjcm9sbEhhbmRsZXI6ICgpID0+IHZvaWQgPSBudWxsO1xuICBwcml2YXRlIHRvdGFsRm9vdGVyU3luY1JldHJ5ID0gMDtcblxuICAvKiog6KGo5L2T5pyJ56uW5rua5p2h5pe25ZCI6K6hIGZvb3RlciDmiY3pooTnlZnlj7Pkvqfmu5rliqjmnaHmp70gKi9cbiAgdG90YWxGb290ZXJOZWVkWUd1dHRlciA9IGZhbHNlO1xuXG4gIC8qKiDop4blj6Mv5a655Zmo5bC65a+45Y+Y5YyW5pe26YeN566XIHNjcm9sbC54IOS4juWQiOiuoeWvuem9kCAqL1xuICBwcml2YXRlIHZpZXdwb3J0UmVzaXplVGltZXI6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgYm91bmRPblZpZXdwb3J0UmVzaXplOiAoKSA9PiB2b2lkID0gbnVsbDtcbiAgcHJpdmF0ZSBob3N0UmVzaXplT2JzZXJ2ZXI6IGFueSA9IG51bGw7XG5cbiAgLyoqIHNlbGVjdCDlsZXlvIAgLyDmkJzntKLpmLLmipbvvIjlr7npvZAgZm9ybS1saW5lc++8iSAqL1xuICBwcml2YXRlIHNlbGVjdE9wZW5DaGFuZ2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8e1xuICAgIGZuOiAob3BlbjogYm9vbGVhbiwgbGluZTogYW55KSA9PiBhbnk7XG4gICAgb3BlbjogYm9vbGVhbjtcbiAgICBsaW5lOiBhbnk7XG4gICAgY29sOiBIZFRhYmxlQ29sdW1uO1xuICB9PigpO1xuICBwcml2YXRlIHNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzZWxlY3RTZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8e1xuICAgIGZuOiAoa2V5d29yZDogc3RyaW5nLCBsaW5lOiBhbnkpID0+IGFueTtcbiAgICBrZXl3b3JkOiBzdHJpbmc7XG4gICAgbGluZTogYW55O1xuICAgIGNvbDogSGRUYWJsZUNvbHVtbjtcbiAgfT4oKTtcbiAgcHJpdmF0ZSBzZWxlY3RTZWFyY2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgLyoqIOW8guatpeWbnuWGmSBvcHRpb25zIOeahOiuoumYhe+8jOmBv+WFjei/nueCueaQnOe0ouazhOa8jyAqL1xuICBwcml2YXRlIHNlbGVjdExvYWRlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaG9zdEVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGNvbW1vblNlc3Npb25TZXJ2aWNlOiBDb21tb25TZXNzaW9uU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5sb2NhbGZvcmFnZSA9IGxvY2FsZm9yYWdlLmNyZWF0ZUluc3RhbmNlKHtcbiAgICAgIGRyaXZlcjogbG9jYWxmb3JhZ2UuSU5ERVhFRERCLFxuICAgICAgbmFtZTogXCJoZC1mc2NtXCIsIC8vIOiuvue9ruWtmOWCqOW6k+eahOWQjeensFxuICAgICAgdmVyc2lvbjogMS4wLCAvLyDorr7nva7lrZjlgqjlupPnmoTniYjmnKxcbiAgICAgIHN0b3JlTmFtZTogXCJoZC1mc2NtLXN0b3JlXCIsIC8vIOiuvue9ruWtmOWCqOW6k+eahOWtmOWCqOepuumXtOWQjeensFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTtcbiAgICB0aGlzLnVuYmluZFZpZXdwb3J0UmVzaXplU3luYygpO1xuICAgIGlmICh0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RTZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0U2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdExvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RMb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKiog5L6b5Lia5Yqh5Zyo6Ieq6KGM5YaZ5ZueIG9wdGlvbnMg5ZCO6Kem5Y+RIE9uUHVzaCDliLfmlrDvvIjkvJjlhYggcmV0dXJuIE9ic2VydmFibGUvUHJvbWlzZSDnlLHnu4Tku7blpITnkIbvvIkgKi9cbiAgbWFya0ZvckNoZWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbCA9IHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0Nyb3NzUGFnZVNlbGVjdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdExvY2FsID0gdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdDtcbiAgICB9XG4gICAgdGhpcy5sb2NhbHRpb25UbXAgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAodGhpcy5sb2NhbHRpb25UbXApIHtcbiAgICAgIHRoaXMubG9jYWx0aW9uVG1wID0gdGhpcy5sb2NhbHRpb25UbXAucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcbiAgICB9XG4gICAgdGhpcy51c2VyU2Vzc2lvbiA9IHRoaXMuY29tbW9uU2Vzc2lvblNlcnZpY2UuZ2V0U2Vzc2lvbihcbiAgICAgIFwiX19qeV9hdXRob3JpemF0aW9uX3Nlc3Npb25fX1wiLFxuICAgICk7XG4gICAgLy8g55So5LqO5byA5Y+R546v5aKD6LCD6K+VXG4gICAgaWYgKCF0aGlzLnVzZXJTZXNzaW9uKSB7XG4gICAgICB0aGlzLnVzZXJTZXNzaW9uID0ge1xuICAgICAgICB1c2VyQ29kZTogXCJkZXZcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kVmlld3BvcnRSZXNpemVTeW5jKCk7XG4gICAgdGhpcy5kZWxldGVIaWRlSXRlbSgpO1xuICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgdGhpcy50YWJsZUNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgLnJlYWR5KClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRJbml0TG9jYWxmb3JhZ2UoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uHN0ZXAxXCIsIGUpO1xuICAgICAgICB0aHJvdyBcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCI7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZSkge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZVRvdGFsT3B0aW9uXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wic2hvd1RhYmxlVG90YWxcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJjb2x1bW5zTnVtYmVyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1widGFibGVDb2xzXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRhYmxlVG90YWwoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZVNpemVcIl0gIT09XG4gICAgICAgICAgY2hhbmdlc1tcInRhYmxlRGF0YVwiXVtcInByZXZpb3VzVmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSB8fFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZU51bWJlclwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VOdW1iZXJcIl1cbiAgICAgICkge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgICAvLyDku4XomZrmi58v5pmu6YCa5qih5byP55yf5q2j5YiH5o2i5pe26YeN5bu677yM6YG/5YWN5o6S5bqP5ZCO5pWw5o2u5Yi35paw5oqK5o6S5bqP5oCB5riF5o6JXG4gICAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g57+76aG1L+aUuSBwYWdlU2l6Ze+8muS4u+WKqOWkmuasoeWkjeS9je+8jOimhuebliBDREsg5byC5q2l5riy5p+T5pe25bqPXG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCkge1xuICAgICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0pIHtcbiAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgLy8g5pWw5o2u5Yi35paw5LiN5by65Yi26YeN5bu677yM5Y+q5Zyo5rua5Yqo5qih5byP5Y+Y5YyW5pe2IHJlbW91bnRcbiAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyDmlbDmja7mm7TmlrDlkI7lpI3kvY3nurXlkJHmu5rliqjvvIjlkKvomZrmi5/mu5rliqjlnLrmma/vvIlcbiAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0gJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlKSAmJlxuICAgICAgY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuZGVsZXRlSGlkZUl0ZW0oKTtcbiAgICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgdGhpcy50YWJsZUNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgICAgLnJlYWR5KClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhzdGVwMlwiLCBlKTtcbiAgICAgICAgICB0aHJvdyBcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCI7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChjaGFuZ2VzW1wicGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcInBhZ2luYXRpb25cIl0uZmlyc3RDaGFuZ2UpIHx8XG4gICAgICAoY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXS5maXJzdENoYW5nZSlcbiAgICApIHtcbiAgICAgIC8vIOWIhumhteaooeW8j+WIh+aNoumcgOmHjeW7uiBuei10YWJsZe+8iGZyb250IC8gc2VydmVyIC8gbm9uZe+8iVxuICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleCA9IDE7XG4gICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKHRydWUpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOaYr+WQpui1sOWJjeerr+WIhumhte+8iOWvuSBjb250ZW50IOWIh+eJh++8jOS4jeivt+axguWQjuerr++8iSAqL1xuICBnZXQgdXNlRnJvbnRQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucGFnaW5hdGlvbiAmJiAhIXRoaXMuZnJvbnRQYWdpbmF0aW9uO1xuICB9XG5cbiAgZGVsZXRlSGlkZUl0ZW0oKSB7XG4gICAgLy8g6aaW5YWI5oqKaXNTaG935Li6ZmFsc2XmlbDmja7liZTpmaTmjolcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgLy8g5aaC5p6c5a+56LGh5rKh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnpu5jorqTkuLogdHJ1Ze+8jOS/neeVmeivpeWvueixoVxuICAgICAgaWYgKCFpdGVtLmhhc093blByb3BlcnR5KFwiaXNTaG93XCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8g5aaC5p6c5a+56LGh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnmo4Dmn6XlhbblgLzmmK/lkKbkuLogdHJ1ZVxuICAgICAgcmV0dXJuIGl0ZW0uaXNTaG93ID09PSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgc29ydChzb3J0OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmN1cnJlbnRTb3J0S2V5ID0gc29ydCAmJiBzb3J0LmtleTtcbiAgICB0aGlzLmN1cnJlbnRTb3J0VmFsdWUgPSBzb3J0ICYmIHNvcnQudmFsdWU7XG4gICAgdGhpcy5zb3J0RXZlbnQuZW1pdChzb3J0KTtcbiAgfVxuXG4gIGdldENvbFNvcnQoY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5jYW5Tb3J0IHx8ICF0aGlzLmN1cnJlbnRTb3J0S2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5uYW1lID09PSB0aGlzLmN1cnJlbnRTb3J0S2V5ID8gdGhpcy5jdXJyZW50U29ydFZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIHRvZ2dsZVNob3dEZXRhaWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGV0YWlsID0gIXRoaXMuc2hvd0RldGFpbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gIH1cblxuICBnZXQgZWZmZWN0aXZlVmlydHVhbEl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudmlydHVhbEl0ZW1TaXplICE9IG51bGwgJiYgdGhpcy52aXJ0dWFsSXRlbVNpemUgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXJ0dWFsSXRlbVNpemU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIOe6teWQkeWPr+eUqOmrmOW6puaJo+WHj++8muaMiemSruWMui/lkIjorqEv5YiG6aG1562J5Zu65a6a5Y2g5L2N44CCXG4gICAqIOW/hemhu+S4jiBkZWFsU2Nyb2xsIC8gcHJlc2V0U2Nyb2xsQmVmb3JlUmVtb3VudCDkvb/nlKjlkIzkuIDlpZfvvIzlkKbliJnkvJror6/liKTjgIzog73mlL7kuIvjgI3ogIzkuI3orr4gc2Nyb2xsLnnjgIJcbiAgICovXG4gIHByaXZhdGUgZ2V0U2Nyb2xsWU1heE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy50YWJsZVRvdGFsID8gMTgwIDogMTQwKSArIDIxNjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvZPliY3op4blj6Plrp7pmYXlsZXnpLrnmoTooYzmlbDjgIJcbiAgICog5YmN56uv5YiG6aG15oyJIHBhZ2VJbmRleC9wYWdlU2l6ZSDliIfniYfkvLDnrpfvvIzpgb/lhY3nlKjlhajph48gbGVuZ3RoIOivr+WIpOmcgOimgee6teWQkea7muWKqOOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWaXNpYmxlUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50IDogW107XG4gICAgY29uc3QgdG90YWwgPSBjb250ZW50Lmxlbmd0aDtcbiAgICBpZiAoIXRoaXMudXNlRnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdG90YWw7XG4gICAgfVxuICAgIGlmICh0b3RhbCA8PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgcGFnZVNpemUgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAxMDtcbiAgICBjb25zdCBwYWdlSW5kZXggPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA6IDE7XG4gICAgY29uc3Qgc3RhcnQgPSAocGFnZUluZGV4IC0gMSkgKiBwYWdlU2l6ZTtcbiAgICBpZiAoc3RhcnQgPj0gdG90YWwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocGFnZVNpemUsIHRvdGFsIC0gc3RhcnQpO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteWGheWuuemrmOW6puaYr+WQpui2heWHuuinhuWPo++8iOmcgOimgeihqOWGhee6teWQkea7muWKqO+8iSAqL1xuICBnZXQgbmVlZHNWZXJ0aWNhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3dDb3VudCA9IHRoaXMuZ2V0VmlzaWJsZVJvd0NvdW50KCk7XG4gICAgaWYgKHJvd0NvdW50IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgZXN0aW1hdGVkSGVpZ2h0ID0gcm93Q291bnQgKiB0aGlzLmVmZmVjdGl2ZVZpcnR1YWxJdGVtU2l6ZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIGVzdGltYXRlZEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIG1heE9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHJvd0NvdW50ID4gMTAwO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteaVsOaNruiDveWujOaVtOWxleekuuaXtuS4jeWQr+eUqOiZmuaLn+a7muWKqO+8jOmBv+WFjeWwkemHj+aVsOaNruS5n+WHuueOsOa7muWKqOadoSAqL1xuICBnZXQgdXNlVmlydHVhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZWVkc1ZlcnRpY2FsU2Nyb2xsO1xuICB9XG5cbiAgZ2V0UmlnaHRTdGlja3koY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvbC5maXhlZCA9PT0gXCJyaWdodFwiID8gYCR7Y29sLmZpeGVkUmlnaHRXaWR0aCB8fCAwfXB4YCA6IG51bGw7XG4gIH1cblxuICBnZXRMZWZ0U3RpY2t5KGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBjb2wuZml4ZWQgPT09IFwibGVmdFwiID8gYCR7Y29sLmZpeGVkV2lkdGggfHwgMH1weGAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOW6j+WPt+WIl+WbuuWumuWuve+8iOWQqyBwYWRkaW5n77yM5Y+v5a6557qzIDYg5L2N5aaCIDE5OTk5Ne+8ieOAglxuICAgKiDkuI3plIHmrbvml7booajkvZPkvJrpmo/kvY3mlbDlj5jlrr3vvIgx4oaSfjY0cHjvvIwxOTk5OTXihpJ+NjdweO+8ie+8jOWQiOiuoeihjOWvueS4jem9kOOAglxuICAgKi9cbiAgcmVhZG9ubHkgbGluZU51bWJlckNvbFdpZHRoID0gNzI7XG5cbiAgLyoqIOW8gOWQr+WQiOiuoeaXtuW6j+WPt+WIl+eahCBsZWZ077yI5Yu+6YCJ5YiX5Y2gIDQwcHjvvIkgKi9cbiAgZ2V0IGxpbmVOdW1iZXJMZWZ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1NlbGVjdGVkID8gXCI0MHB4XCIgOiBcIjBweFwiO1xuICB9XG5cbiAgZ2V0IGxpbmVOdW1iZXJDb2xXaWR0aFB4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGluZU51bWJlckNvbFdpZHRoICsgXCJweFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIl+aAu+Wuveacqui2heWHuuWuueWZqO+8muaXoOaoquWQkSBzY3JvbGzvvIzooajkvZPliJfkvJrooqvmkpHmu6HvvIzlkIjorqHotbAgZmx1aWTvvIh3aWR0aDoxMDAl77yJ44CCXG4gICAqIOWIl+aAu+Wuvei2heWHuu+8muaciSBzY3JvbGwueO+8jOWQiOiuoei1sOWbuuWumuihqOWuvSArIOaoqua7muWQjOatpeOAglxuICAgKi9cbiAgZ2V0IGlzVG90YWxGb290ZXJGbHVpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54KTtcbiAgfVxuXG4gIC8qKiBmbHVpZCDihpIgMTAwJe+8m+WbuuWumiDihpIgc2Nyb2xsLnjvvIjkuI7ooajkvZPlkIzkuIDlpZfmqKrlkJHlrr3luqbvvIkgKi9cbiAgZ2V0IHRvdGFsRm9vdGVyVGFibGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzVG90YWxGb290ZXJGbHVpZCkge1xuICAgICAgcmV0dXJuIFwiMTAwJVwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueFxuICAgICAgPyBTdHJpbmcodGhpcy5zY3JvbGwueClcbiAgICAgIDogdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgPiAwXG4gICAgICAgID8gdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgKyBcInB4XCJcbiAgICAgICAgOiBcIjEwMCVcIjtcbiAgfVxuXG4gIC8qKiDlvZPliY3pobXooYzlj7fvvIjot6jpobXov57nu63vvIzku44gMSDlvIDlp4vvvIkgKi9cbiAgZ2V0TGluZU51bWJlcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYWdlID0gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpIDogMDtcbiAgICBjb25zdCByb3dJbmRleCA9IE51bWJlcihpbmRleCkgPj0gMCA/IE51bWJlcihpbmRleCkgOiAwO1xuICAgIHJldHVybiAocGFnZSAtIDEpICogc2l6ZSArIHJvd0luZGV4ICsgMTtcbiAgfVxuXG4gIHRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlciwgZGF0YTogYW55KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXkgPSBkYXRhICYmIGRhdGFbdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgcmV0dXJuIGtleSAhPSBudWxsID8gU3RyaW5nKGtleSkgOiBgcm93LSR7aW5kZXh9YDtcbiAgfTtcblxuICAvKiog6Jma5ouf5rua5Yqo5oyJ5pWw57uE5LiL5qCH6L+96Liq77yM6YG/5YWN5Lia5Yqh5Li76ZSuIHRyYWNrQnkg5a+86Ie0IENESyDooYzlpI3nlKjplJnkvY0gKi9cbiAgdmlydHVhbFRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICB0cmFja0J5Q29sID0gKF9pbmRleDogbnVtYmVyLCBjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBjb2wudGl0bGU7XG4gIH07XG5cbiAgZ2V0SW5pdExvY2FsZm9yYWdlKCkge1xuICAgIC8vIOmmluWFiOiOt+WPluW9k+WJjWhkLXRhYmxl5a2Y5YKo55qE5pWw5o2uIOWmguaenOayoeacie+8jOWImeWIneWni+WMluS4i+W9k+WJjeeahOaVsOaNrlxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5nZXRJdGVtKFxuICAgICAgICBcImhkLXRhYmxlX1wiICtcbiAgICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgICBcIl9cIiArXG4gICAgICAgICAgdGhpcy5sb2NhbHRpb25UbXAgK1xuICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICB0aGlzLnV1aWQsXG4gICAgICApXG4gICAgICAudGhlbigodmFsdWU6IFRhYmxlQ2FjaGVPcHRpb24pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5ub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uICYmXG4gICAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgJiZcbiAgICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemUgPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemU7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA9IHRoaXMudGFibGVQYWdlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmnI3liqHnq6/liIbpobXmiY3lnKjliJ3lp4vljJbml7bmipsgcGFnZVNpemVDaGFuZ2VFdmVudCDop6blj5HniLbmn6Xor6LvvJvliY3nq6/liIbpobXkuI3miptcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvbiAmJlxuICAgICAgICAgICF0aGlzLmZyb250UGFnaW5hdGlvbiAmJlxuICAgICAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgICAgICB0aGlzLmluaXRUYWJsZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBpbml0VGFibGUoKSB7XG4gICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMudXVpZCkge1xuICAgICAgdGhyb3cgXCJoZC10YWJsZee8uuWksXV1aWTlj4LmlbDvvIzor7fkvb/nlKjnvJbovpHlmajmj5Lku7bnlJ/miJDlubbnu5loZC10YWJsZei1i+S6iHV1aWTlsZ7mgKdcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuanVkZ2VSZXBlYXRDb2xzKCkpIHtcbiAgICAgIHRoaXMuZGVhbENvbHMoKTtcbiAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgdGhpcy5kZWFsT3BlcmF0ZUJ0bigpO1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlID0gbnVsbDtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOiZmuaLny/mma7pgJrmqKHlvI/liIfmjaLml7bph43lu7rooajmoLzvvIzpgb/lhY3mrovnlZnmu5rliqjlrrnlmaggKi9cbiAgYXBwbHlUYWJsZVNjcm9sbE1vZGUoZm9yY2VSZW1vdW50ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCB1c2VWaXJ0dWFsID0gdGhpcy51c2VWaXJ0dWFsU2Nyb2xsO1xuICAgIGNvbnN0IG1vZGVDaGFuZ2VkID1cbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlICE9PSB1c2VWaXJ0dWFsO1xuICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSA9IHVzZVZpcnR1YWw7XG5cbiAgICBpZiAoZm9yY2VSZW1vdW50IHx8IG1vZGVDaGFuZ2VkKSB7XG4gICAgICAvLyDlv4XpobvlhYjlhpnlpb0gc2Nyb2xsLnnvvIzlho3liJvlu7ogbnotdGFibGXjgIJcbiAgICAgIC8vIG5nLXpvcnJvIOWPquWcqCBBZnRlclZpZXdJbml0IOe7keS4gOasoSBoZWFkZXIvYm9keSDnmoQgc2Nyb2xsIOWQjOatpe+8m1xuICAgICAgLy8g6Iul5YWI5LulIHk9bnVsbCDliJvlu7rlho3mlLnmiJDmnIkgee+8jOihqOWktOebkeWQrOS8muS4ou+8jOihqOeOsOS4uuWIl+WktOS4jei3n+edgOaoqua7muOAglxuICAgICAgdGhpcy5wcmVzZXRTY3JvbGxCZWZvcmVSZW1vdW50KHVzZVZpcnR1YWwpO1xuICAgICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd1RhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHRoaXMuYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2SGFzWSA9ICEhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnkpO1xuICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgIGNvbnN0IG5leHRIYXNZID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueSk7XG4gICAgLy8g6L+Q6KGM5LitIHkg5LuO5pyJ5Y+Y5pegL+S7juaXoOWPmOacieaXtu+8jOS5n+W/hemhu+mHjeW7uu+8jOWQpuWImeWQjOatpeebkeWQrOS7jeaMh+WQkeaXpyBET01cbiAgICBpZiAocHJldkhhc1kgIT09IG5leHRIYXNZKSB7XG4gICAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VGFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsKTtcbiAgfVxuXG4gIC8qKiDph43lu7rliY3pooTorr4gc2Nyb2xs77yM5L+d6K+BIEFmdGVyVmlld0luaXQg5pe2IGhlYWRlci9ib2R5IOe7k+aehOW3suato+ehriAqL1xuICBwcml2YXRlIHByZXNldFNjcm9sbEJlZm9yZVJlbW91bnQodXNlVmlydHVhbDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG1heE9mZnNldCA9IHRoaXMuZ2V0U2Nyb2xsWU1heE9mZnNldCgpO1xuICAgIGNvbnN0IHggPSB0aGlzLnNjcm9sbCA/IHRoaXMuc2Nyb2xsLnggOiBudWxsO1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwgJiYgIXVzZVZpcnR1YWwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0geyB4LCB5OiBudWxsIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgeCxcbiAgICAgIHk6IGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodXNlVmlydHVhbCkge1xuICAgICAgdGhpcy5yZWZyZXNoVmlydHVhbFNjcm9sbFZpZXdwb3J0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUodHJ1ZSk7XG4gICAgICAvLyDlrp7mtYvooYzpq5jlkI7lj6/og73ku47jgIzog73mlL7kuIvjgI3lj5jkuLrjgIzotoXlh7rjgI3vvIzpnIDliIfmjaLmu5rliqjmqKHlvI9cbiAgICAgIGlmICh0aGlzLnVzZVZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQoZm9yY2VNZWFzdXJlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXNlVmlydHVhbFNjcm9sbCkge1xuICAgICAgaWYgKGZvcmNlTWVhc3VyZSkge1xuICAgICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnQgPVxuICAgICAgICB0aGlzLm56VGFibGVDb21wb25lbnQgJiYgdGhpcy5uelRhYmxlQ29tcG9uZW50LmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICAgIGlmICghdmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVhc3VyZWQgPSB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgIGlmIChtZWFzdXJlZCkge1xuICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgICAgICB2aWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiog5pWw5o2u5Yi35paw5ZCO5bCG6KGo5L2T57q15ZCR5rua5Yqo5aSN5L2N5Yiw6aG26YOoICovXG4gIHByaXZhdGUgcmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56VGFibGVDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbnpUYWJsZSA9IHRoaXMubnpUYWJsZUNvbXBvbmVudCBhcyBhbnk7XG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLm56VGFibGVDb21wb25lbnQuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgaWYgKHR5cGVvZiAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb09mZnNldCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvT2Zmc2V0KDApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb0luZGV4ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9JbmRleCgwKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpZXdwb3J0RWwgPVxuICAgICAgICB2aWV3cG9ydC5lbGVtZW50UmVmICYmXG4gICAgICAgICh2aWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgaWYgKHZpZXdwb3J0RWwpIHtcbiAgICAgICAgdmlld3BvcnRFbC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBib2R5Q2FuZGlkYXRlcyA9IFtcbiAgICAgIG56VGFibGUubWl4VGFibGVCb2R5TmF0aXZlRWxlbWVudCxcbiAgICAgIG56VGFibGUudGFibGVCb2R5TmF0aXZlRWxlbWVudCxcbiAgICAgIG56VGFibGUudGFibGVCb2R5RWxlbWVudCAmJiBuelRhYmxlLnRhYmxlQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICBdO1xuICAgIGJvZHlDYW5kaWRhdGVzLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgdGFibGVNYWluID1cbiAgICAgIG56VGFibGUudGFibGVNYWluRWxlbWVudCAmJlxuICAgICAgKG56VGFibGUudGFibGVNYWluRWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBpZiAoIXRhYmxlTWFpbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub2RlcyA9IHRhYmxlTWFpbi5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCIuYW50LXRhYmxlLWJvZHksIGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFwiLFxuICAgICk7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChub2RlcywgKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgZWwuc2Nyb2xsVG9wID0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlbDmja7mm7TmlrDlkI7lpJrmrKHlsJ3or5XlpI3kvY3jgIJcbiAgICogbmctem9ycm8gOCArIENESyDomZrmi5/mu5rliqjkvJrlnKjmlbDmja7liLfmlrDlkI7lvILmraXmlLnlhpkgc2Nyb2xsVG9w77yM5Y2V5qyh5aSN5L2N57uP5bi46KKr6KaG55uW44CCXG4gICAqL1xuICBwcml2YXRlIHNjaGVkdWxlUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTogdm9pZCB7XG4gICAgLy8g5aSa5qyh5bCd6K+V77ya6KaG55uWIG56LXRhYmxlIC8gQ0RLIOiZmuaLn+a7muWKqOW8guatpeaUueWGmSBzY3JvbGxUb3BcbiAgICBjb25zdCBkZWxheXMgPSBbMCwgNTAsIDEwMF07XG4gICAgZGVsYXlzLmZvckVhY2goKG1zLCBpbmRleCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSBkZWxheXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sIG1zKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgfVxuXG4gIC8qKiDmnKrmiYvliqjkvKAgdmlydHVhbEl0ZW1TaXplIOaXtu+8jOS7juW3sua4suafk+ihjOa1i+mHj+ecn+WunumrmOW6piAqL1xuICBtZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsSXRlbVNpemUgIT0gbnVsbCAmJiB0aGlzLnZpcnR1YWxJdGVtU2l6ZSA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdwb3J0ID1cbiAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJiB0aGlzLm56VGFibGVDb21wb25lbnQuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICAgIGNvbnN0IHRhYmxlQm9keSA9XG4gICAgICB0aGlzLm56VGFibGVDb21wb25lbnQgJiZcbiAgICAgICh0aGlzLm56VGFibGVDb21wb25lbnQudGFibGVCb2R5TmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgY29uc3Qgcm93ID1cbiAgICAgICh2aWV3cG9ydCAmJlxuICAgICAgICAoKHZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcInRyLmhkLXRhYmxlLXZpcnR1YWwtcm93XCIsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQpKSB8fFxuICAgICAgKHRhYmxlQm9keSAmJiAodGFibGVCb2R5LnF1ZXJ5U2VsZWN0b3IoXCJ0Ym9keSB0clwiKSBhcyBIVE1MRWxlbWVudCkpO1xuICAgIGlmICghcm93IHx8IHJvdy5vZmZzZXRIZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBoZWlnaHQgPSByb3cub2Zmc2V0SGVpZ2h0O1xuICAgIGlmIChoZWlnaHQgPT09IHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5tZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSA9IGhlaWdodDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIOiuvue9ruWIl+eCueWHu+WPlua2iFxuICBjYW5jZWxEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxOb3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIOeCueWHu+inpuWPkeiuvue9ruWIl1xuICBjb25maXJtRHJvcGRvd24oKTogdm9pZCB7XG4gICAgLy8g5Li05pe25a2Y5pS+5LiL77yM5Y+W5raI55qE5pe25YCZ5oGi5aSN5Y6f5p2l55qE54q25oCBICAg5rex5ou36LSd5LiL5a+56LGh5pWw57uEXG4gICAgdGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNhbmNlbE5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ub3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHN1Ym1pdEdyaWRzKCkge1xuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzID0gW107XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMucHVzaChpdGVtLnRpdGxlKTtcbiAgICB9KTtcbiAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDku47nvJPlrZjorr7nva7liJdcbiAgc2V0Q29scygpIHtcbiAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSBmYWxzZTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IFtdO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IFtdO1xuICAgIGlmICh0aGlzLmhhc0NvbHNDYWNoZSgpKSB7XG4gICAgICBsZXQgeyBub3RJbmNvbHMsIGluY29scyB9ID0gdGhpcy50YWJsZUNvbHNDYWNoZS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoaXRlbS50aXRsZSkpIHtcbiAgICAgICAgICAgIGFjYy5pbmNvbHMucHVzaChpdGVtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLm5vdEluY29scy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7IG5vdEluY29sczogW10sIGluY29sczogW10gfSxcbiAgICAgICk7XG4gICAgICBpbmNvbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluZGV4T2YoYS50aXRsZSkgLVxuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluZGV4T2YoYi50aXRsZSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50YWJsZUNvbHMgPSBpbmNvbHMuY29uY2F0KG5vdEluY29scyk7XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc0NvbHNDYWNoZSgpKSB7XG4gICAgICAgIGVsZW1lbnQuaXNTaG93ID0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC50aXRsZSlcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5pc1Nob3cpIHtcbiAgICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAga2V5OiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGVsZW1lbnQuZml4ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpXG4gICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaGlkZUxpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAga2V5OiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGVsZW1lbnQuZml4ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpXG4gICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmlzU2hvdyA9IHRydWU7XG4gICAgICAgIHRoaXMubm93TGlzdE5vZGVzLnB1c2goe1xuICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgIGtleTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICBjaGVja2VkOiB0cnVlLFxuICAgICAgICAgIC8vIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LmZpeGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOiwg+aVtOWIl+WuveS4uue8k+WtmOWuveW6plxuICAgIGlmIChcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5zaXplICE9PSAwXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuaGFzKGNvbC50aXRsZSkpIHtcbiAgICAgICAgICBjb2wud2lkdGggPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLmdldChjb2wudGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmRlYWxDb2xzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSB0cnVlO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8g5ouW5ou95pON5L2cXG4gIGJlZm9yZURyb3AgPSAoYXJnOiBOekZvcm1hdEJlZm9yZURyb3BFdmVudCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gPT4ge1xuICAgIGlmIChcbiAgICAgIGFyZy5ub2RlLm9yaWdpbi5kaXNhYmxlZCB8fFxuICAgICAgIWFyZy5kcmFnTm9kZS5vcmlnaW4uY2hlY2tlZCB8fFxuICAgICAgYXJnLnBvcyA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5vZGU6IFRyZWVHcmlkID0gbmV3IFRyZWVHcmlkKCk7XG4gICAgICBub2RlLmNoZWNrZWQgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmNoZWNrZWQ7XG4gICAgICBub2RlLmRpc2FibGVkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5kaXNhYmxlZDtcbiAgICAgIG5vZGUuZXhwYW5kZWQgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmV4cGFuZGVkO1xuICAgICAgbm9kZS5pc0xlYWYgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmlzTGVhZjtcbiAgICAgIG5vZGUua2V5ID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5rZXk7XG4gICAgICBub2RlLnNlbGVjdGFibGUgPSBhcmcuZHJhZ05vZGUub3JpZ2luLnNlbGVjdGFibGU7XG4gICAgICBub2RlLnRpdGxlID0gYXJnLmRyYWdOb2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIC8vIOaLluaLveWFg+e0oOS4i+agh1xuICAgICAgbGV0IGRyYWdOb2RlSW5kZXggPSB0aGlzLm5vd0xpc3ROb2Rlcy5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgPT0gYXJnLmRyYWdOb2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgICAgLy8g55uu5qCH5L2N572u55qE5LiL5qCHXG4gICAgICBsZXQgbm9kZUluZGV4ID1cbiAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgPT0gYXJnLm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgICB9KSArIChhcmcucG9zID09PSAtMSA/IDAgOiBhcmcucG9zKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLnNwbGljZShub2RlSW5kZXgsIDAsIG5vZGUpO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuc3BsaWNlKFxuICAgICAgICBub2RlSW5kZXggPj0gZHJhZ05vZGVJbmRleCA/IGRyYWdOb2RlSW5kZXggOiBkcmFnTm9kZUluZGV4ICsgMSxcbiAgICAgICAgMSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShkZWxheSgxMDApKTtcbiAgICB9XG4gIH07XG5cbiAgbW92ZUVsZW1lbnROZWFyYnkoYXJyLCBlbGVtZW50VG9Nb3ZlVGl0bGUsIHRhcmdldEVsZW1lbnRUaXRsZSwgcG9zKSB7XG4gICAgY29uc3QgdG1wQXJyYXkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFycikpO1xuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdG1wQXJyYXkuZmluZEluZGV4KFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udGl0bGUgPT09IHRhcmdldEVsZW1lbnRUaXRsZSxcbiAgICApO1xuICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IHRtcEFycmF5LmZpbmRJbmRleChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnRpdGxlID09PSBlbGVtZW50VG9Nb3ZlVGl0bGUsXG4gICAgKTtcbiAgICBjb25zdCBuZXdJbmRleCA9IHBvcyA8IDAgPyB0YXJnZXRJbmRleCArIHBvcyA6IHRhcmdldEluZGV4O1xuICAgIC8vIOenu+mZpOebruagh+WFg+e0oO+8jOW5tuaPkuWFpeWIsOaWsOeahOS9jee9rlxuICAgIGNvbnN0IHJlbW92ZWRFbGVtZW50ID0gdG1wQXJyYXkuc3BsaWNlKGVsZW1lbnRJbmRleCwgMSk7XG4gICAgdG1wQXJyYXkuc3BsaWNlKG5ld0luZGV4ICsgMSwgMCwgcmVtb3ZlZEVsZW1lbnRbMF0pO1xuICAgIHJldHVybiB0bXBBcnJheTtcbiAgfVxuXG4gIC8vIOWLvumAieaTjeS9nFxuICBjaGVja0FjdGlvbihldmVudDogTnpGb3JtYXRFbWl0RXZlbnQpOiB2b2lkIHtcbiAgICAvLyDli77pgInlj6rmnInlnKhoaWRlTGlzdE5vZGVzLOWPlua2iOWLvumAieWPquacieWcqG5vd0xpc3ROb2Rlc1xuICAgIGlmIChldmVudC5ub2RlLm9yaWdpbi5jaGVja2VkKSB7XG4gICAgICBsZXQgbm9kZTogVHJlZUdyaWQgPSBuZXcgVHJlZUdyaWQoKTtcbiAgICAgIG5vZGUgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmluZCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSA9PT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICAgIG5vZGUuY2hlY2tlZCA9IHRydWU7XG4gICAgICAvLyDmib7liLDnrKzkuIDkuKpmaXhlZOWxnuaAp+S4unJpZ2h055qEdGl0bGXvvIzmib7liLDmj5LlhaXlhYPntKDnmoTkvY3nva5cbiAgICAgIGxldCB0aXRsZSA9IG51bGw7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy50YWJsZUNvbHNDYWNoZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNvbHNDYWNoZVtpXS5maXhlZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGl0bGUgPSB0aGlzLnRhYmxlQ29sc0NhY2hlW2ldLnRpdGxlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3QgPSB0aGlzLm5vd0xpc3ROb2Rlcy5zbGljZSgwKTtcbiAgICAgIGlmICghdGl0bGUpIHtcbiAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KFxuICAgICAgICAgIChub2RlKSA9PiBub2RlLnRpdGxlID09PSB0aXRsZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3Quc3BsaWNlKGluZGV4LCAwLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm93TGlzdE5vZGVzID0gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlICE9PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiAodGhpcy5oaWRlTGlzdE5vZGVzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMpIHtcbiAgICAgIC8vICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGhpcy5nZXRIaWRlTGlzdE5vZGVzKCk7XG4gICAgICAvLyB9XG4gICAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3QgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuc2xpY2UoMCk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZSkge1xuICAgICAgICAgIGNvbnN0IGlubmVySXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xuICAgICAgICAgIGlubmVySXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChpbm5lckl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRlbXBvcmFyeU5vZGVMaXN0O1xuXG4gICAgICAvLyDkuLrkuobpmLLmraLmnKrpgInmi6nnmoTmlbDnu4Tpobrluo/lm6DkuLpwdXNo5pa55rOV6ICM5pS55Y+Y77yM6YCa6L+H5Yid5aeL5pWw5o2u6I635Y+W5pi+56S655qE5a2X5q615YiX6KGoXG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRoaXMubm93TGlzdE5vZGVzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSAhPT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDpmLLmraLmnKrpgInmi6nnmoTmlbDnu4Tpobrluo/lm6DkuLpwdXNo5pa55rOV6ICM5pS55Y+Y77yM5LuO5Yid5aeL5pWw5o2u6I635Y+W6ZqQ6JeP5pyq5pi+56S655qE5a2X5q615YiX6KGoXG4gIGdldEhpZGVMaXN0Tm9kZXMoKTogQXJyYXk8VHJlZUdyaWQ+IHtcbiAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3Q6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICAgIC8vIOS7jnRhYmxlQ29sc0NhY2hl6YeM6Z2i5om+5rKh5pyJ5Zyoc3RvcmFnZemHjOmdouWHuueOsOeahOWtl+autSznu4TmiJBoaWRlTGlzdFxuICAgIHRoaXMudGFibGVDb2xzQ2FjaGUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhpdGVtLnRpdGxlKSkge1xuICAgICAgICBsZXQgbm9kZUl0ZW06IFRyZWVHcmlkID0gbmV3IFRyZWVHcmlkKCk7XG4gICAgICAgIG5vZGVJdGVtLnRpdGxlID0gaXRlbS50aXRsZTtcbiAgICAgICAgbm9kZUl0ZW0ua2V5ID0gaXRlbS50aXRsZTtcbiAgICAgICAgbm9kZUl0ZW0uZGlzYWJsZWQgPSBpdGVtLmZpeGVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBub2RlSXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2gobm9kZUl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0ZW1wb3JhcnlOb2RlTGlzdDtcbiAgfVxuXG4gIGRlYWxDb2xzKCkge1xuICAgIGlmICghdGhpcy50YWJsZUNvbHNbMF0ubWluV2lkdGgpIHtcbiAgICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBzcGFuLnN0eWxlLndoaXRlU3BhY2UgPSBcIm5vd3JhcFwiO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICAgICAgc3Bhbi5pbm5lclRleHQgPSBpdGVtLnRpdGxlO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgICBpdGVtLm1pbldpZHRoID0gc3Bhbi5vZmZzZXRXaWR0aCArIDE2O1xuICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyDlpITnkIblt6blj7PlkLjpmYTnmoTmlbDmja7lnKjmlbDnu4TkuK3nmoTkvY3nva5cbiAgICBjb25zdCBsZWZ0Rml4ZWRDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKChjb2wpID0+IGNvbC5maXhlZCA9PT0gXCJsZWZ0XCIpO1xuICAgIGNvbnN0IHJpZ2h0Rml4ZWRDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKFxuICAgICAgKGNvbCkgPT4gY29sLmZpeGVkID09PSBcInJpZ2h0XCIsXG4gICAgKTtcbiAgICBjb25zdCBub3JtYWxDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKChjb2wpID0+ICFjb2wuZml4ZWQpO1xuICAgIGNvbnN0IHJlc3VsdENvbHMgPSBsZWZ0Rml4ZWRDb2xzLmNvbmNhdChub3JtYWxDb2xzKS5jb25jYXQocmlnaHRGaXhlZENvbHMpO1xuICAgIHRoaXMudGFibGVDb2xzID0gcmVzdWx0Q29scztcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzQ2FjaGUgfHwgdGhpcy50YWJsZUNvbHNDYWNoZS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIOe8k+WtmOS4gOS4i+ihqOagvOeahOaVsOaNrlxuICAgICAgdGhpcy50YWJsZUNvbHNDYWNoZSA9IFsuLi50aGlzLnRhYmxlQ29sc107XG4gICAgfVxuICB9XG5cbiAgbm9ybWFsaXplVGFibGVDYWNoZU9wdGlvbigpIHtcbiAgICBpZiAoIXRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMpIHtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIH0gZWxzZSBpZiAoISh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgY29uc3QgY29sV2lkdGhzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb2xXaWR0aHMuc2V0KGtleSwgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgYXMgYW55KVtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyA9IGNvbFdpZHRocztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0NvbHNDYWNoZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzICYmXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIHNhdmVUYWJsZUNhY2hlT3B0aW9uKCkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2Uuc2V0SXRlbShcbiAgICAgIFwiaGQtdGFibGVfXCIgK1xuICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgXCJfXCIgK1xuICAgICAgICB0aGlzLmxvY2FsdGlvblRtcCArXG4gICAgICAgIFwiX1wiICtcbiAgICAgICAgdGhpcy51dWlkLFxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLFxuICAgICk7XG4gIH1cblxuICBqdWRnZVJlcGVhdENvbHMoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRhYmxlQ29scy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy50YWJsZUNvbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb2xzW2ldLnRpdGxlID09PSB0aGlzLnRhYmxlQ29sc1tqXS50aXRsZSkge1xuICAgICAgICAgIHRocm93IGBoZC10YWJsZee7hOS7tuS4reWIl+WQjSAke3RoaXMudGFibGVDb2xzW2ldLnRpdGxlfSDph43lpI1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25SZXNpemUoeyB3aWR0aCB9OiBOelJlc2l6ZUV2ZW50LCBjb2w6IEhkVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICB0aGlzLm5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBsZXQgdGVtcFdpZHRoID0gMDtcbiAgICBpZiAod2lkdGggPiBjb2wubWluV2lkdGgpIHtcbiAgICAgIHRlbXBXaWR0aCA9IHdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wV2lkdGggPSBjb2wubWluV2lkdGg7XG4gICAgfVxuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuc2V0KGNvbC50aXRsZSwgdGVtcFdpZHRoKTtcbiAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy50YWJsZUNvbHMgPSB0aGlzLnRhYmxlQ29scy5tYXAoKGUpID0+XG4gICAgICBlLnRpdGxlID09PSBjb2wudGl0bGUgPyB7IC4uLmUsIHdpZHRoOiB0ZW1wV2lkdGggfSA6IGUsXG4gICAgKTtcbiAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSk7XG4gIH1cblxuICBkZWFsT3BlcmF0ZUJ0bigpIHtcbiAgICBsZXQgb3BlcmF0ZUNvbCA9IHRoaXMudGFibGVDb2xzLmZpbmQoKGNvbCkgPT4gY29sLnRpdGxlID09PSBcIuaTjeS9nFwiKSB8fCBudWxsO1xuICAgIGlmIChvcGVyYXRlQ29sKSB7XG4gICAgICBsZXQgdGV4dFN0ciA9IFwiXCI7XG4gICAgICBvcGVyYXRlQ29sLmJ0bkxpc3QuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICAgIGlmICghYnRuLmlzUmVwZWF0KSB7XG4gICAgICAgICAgdGV4dFN0ciArPSB0eXBlb2YgYnRuLm5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IFwi5pON5L2cXCIgOiBidG4ubmFtZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcbiAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBcIjE0cHhcIjtcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICAgIHNwYW4uaW5uZXJUZXh0ID0gdGV4dFN0cjtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICBvcGVyYXRlQ29sLndpZHRoID1cbiAgICAgICAgc3Bhbi5vZmZzZXRXaWR0aCArXG4gICAgICAgIChvcGVyYXRlQ29sLmJ0bkxpc3QuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc1JlcGVhdCkubGVuZ3RoIC0gMSkgKiA0ICtcbiAgICAgICAgMTY7XG4gICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBuZWVkU2hvd0NvbmZpcm0oYnRuOiBPcGVyYXRlQnRuLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGJ0bi5zaG93Q29uZmlybSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYnRuLnNob3dDb25maXJtKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFidG4uc2hvd0NvbmZpcm07XG4gIH1cblxuICBnZXRCdG5OYW1lKGJ0bjogT3BlcmF0ZUJ0biwgZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIGJ0bi5uYW1lID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBidG4ubmFtZShkYXRhKSB8fCBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gYnRuLm5hbWUgIT0gbnVsbCA/IFN0cmluZyhidG4ubmFtZSkgOiBcIlwiO1xuICB9XG5cbiAgaXNEYW5nZXJCdG4oYnRuOiBPcGVyYXRlQnRuLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCdG5OYW1lKGJ0biwgZGF0YSkgPT09IFwi5Yig6ZmkXCI7XG4gIH1cblxuICAvKiog6Jma5ouf5rua5Yqo5byA5ZCv5pe25L2/55So6KeG5Y+j5pyA5aSn6auY5bqmICovXG4gIHByaXZhdGUgZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWA7XG4gIH1cblxuICBwcml2YXRlIGhhc1RhYmxlRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnRhYmxlRGF0YSAmJlxuICAgICAgdGhpcy50YWJsZURhdGEuY29udGVudCAmJlxuICAgICAgdGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIl+aAu+Wuvei2heWHuuWkluWxguWuueWZqOaJjeWQr+eUqOaoquWQkSBzY3JvbGzjgIJcbiAgICog5LulIGRlYWxTY3JvbGwg57Sv6K6h55qE5aOw5piO5YiX5a695Li65YeG77yM5LiN55SoIERPTSDoh6rnhLbmtYvlrr3vvIjlhoXlrrnkuI3miKrmlq3kvJrlgY/lpKfvvIzlr7zoh7TliJfog73mlL7kuIvkuZ/lvIDmqKrmu5rvvInjgIJcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVNjcm9sbFgoY29sV2lkdGg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGF1dG9TY3JvbGwgPSByZXNvbHZlQXV0b1RhYmxlU2Nyb2xsKFxuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50LFxuICAgICAgdGhpcy5oYXNUYWJsZURhdGEoKSxcbiAgICAgIGNvbFdpZHRoLFxuICAgICk7XG4gICAgcmV0dXJuIGF1dG9TY3JvbGwgPyBhdXRvU2Nyb2xsLnggOiBudWxsO1xuICB9XG5cbiAgLyoqIOihqOagvOa4suafk+WQjuaMieWunumZheWuueWZqOWuveW6puagoeato+aoquWQkSBzY3JvbGzvvIjlj6rmlLkgeO+8jOmBv+WFjeinpuWPkeihqOWktOe7k+aehOWPmOWMlu+8iSAqL1xuICBwcml2YXRlIHN5bmNIb3Jpem9udGFsU2Nyb2xsKCk6IHZvaWQge1xuICAgIGNvbnN0IHNjcm9sbFggPSB0aGlzLnJlc29sdmVTY3JvbGxYKHRoaXMudGFibGVDb2xXaWR0aFRvdGFsKTtcbiAgICBjb25zdCBjdXJyZW50WSA9IHRoaXMuc2Nyb2xsID8gdGhpcy5zY3JvbGwueSA6IG51bGw7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zY3JvbGwgJiZcbiAgICAgIHRoaXMuc2Nyb2xsLnggPT09IHNjcm9sbFggJiZcbiAgICAgIHRoaXMuc2Nyb2xsLnkgPT09IGN1cnJlbnRZXG4gICAgKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOS/neaMgSB5IOS4jeWPmO+8jOmYsuatoui/kOihjOS4reaLhi/lkIggaGVhZGVyIOWvvOiHtOaoquWQkeWQjOatpeWkseaViFxuICAgIHRoaXMuc2Nyb2xsID0geyB4OiBzY3JvbGxYLCB5OiBjdXJyZW50WSB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jSGVhZGVyQm9keVNjcm9sbExlZnQoKSk7XG4gIH1cblxuICAvKiog5omL5Yqo5oqK6KGo5L2T5qiq5ZCR5rua5Yqo5ZCM5q2l5Yiw6KGo5aS0IC8g5ZCI6K6hIGZvb3Rlcu+8iOWFnOW6lSBuZy16b3JybyDnm5HlkKzkuKLlpLHnmoTmg4XlhrXvvIkgKi9cbiAgcHJpdmF0ZSBzeW5jSGVhZGVyQm9keVNjcm9sbExlZnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56VGFibGVDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyID0gKHRoaXMubnpUYWJsZUNvbXBvbmVudCBhcyBhbnkpLnRhYmxlSGVhZGVyTmF0aXZlRWxlbWVudCBhc1xuICAgICAgfCBIVE1MRWxlbWVudFxuICAgICAgfCBudWxsO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmdldFRhYmxlQm9keVNjcm9sbEVsKCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnggJiYgaGVhZGVyICYmIGJvZHkpIHtcbiAgICAgIGlmIChoZWFkZXIuc2Nyb2xsTGVmdCAhPT0gYm9keS5zY3JvbGxMZWZ0KSB7XG4gICAgICAgIGhlYWRlci5zY3JvbGxMZWZ0ID0gYm9keS5zY3JvbGxMZWZ0O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCk7XG4gIH1cblxuICAvKiog5Y+W6KGo5L2T5qiq5ZCR5rua5Yqo5a655Zmo77yI6Jma5ouf5rua5Yqo5LyY5YWIIHZpZXdwb3J077yJICovXG4gIHByaXZhdGUgZ2V0VGFibGVCb2R5U2Nyb2xsRWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1peCA9ICh0aGlzLm56VGFibGVDb21wb25lbnQgYXMgYW55KS5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50IGFzXG4gICAgICB8IEhUTUxFbGVtZW50XG4gICAgICB8IG51bGw7XG4gICAgaWYgKG1peCkge1xuICAgICAgcmV0dXJuIG1peDtcbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuaG9zdEVsICYmICh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgKGhvc3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQuYW50LXRhYmxlLWJvZHlcIixcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQpIHx8XG4gICAgICAoaG9zdC5xdWVyeVNlbGVjdG9yKFwiLmFudC10YWJsZS1ib2R5XCIpIGFzIEhUTUxFbGVtZW50KSB8fFxuICAgICAgbnVsbFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFRvdGFsRm9vdGVyU2Nyb2xsRWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0RWwgJiYgKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIHJldHVybiBob3N0XG4gICAgICA/IChob3N0LnF1ZXJ5U2VsZWN0b3IoXCIuaGQtdGFibGUtdG90YWwtZm9vdGVyXCIpIGFzIEhUTUxFbGVtZW50KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqIOihqOS9k+aYr+WQpuWHuueOsOe6teWQkea7muWKqOadoe+8iOWQq+a7muWKqOadoeanveWuve+8iSAqL1xuICBwcml2YXRlIGJvZHlIYXNWZXJ0aWNhbFNjcm9sbGJhcihib2R5OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghYm9keSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgYm9keS5zY3JvbGxIZWlnaHQgPiBib2R5LmNsaWVudEhlaWdodCArIDEgfHxcbiAgICAgIGJvZHkub2Zmc2V0V2lkdGggLSBib2R5LmNsaWVudFdpZHRoID4gMVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5ZCI6K6hIGZvb3RlciDkuI7ooajkvZPogZTliqjvvJpcbiAgICogLSBmbHVpZO+8iOWIl+acquaSkea7oe+8ie+8muS4jeaoqua7muOAgeS4jea1i+Wuve+8jOihqOWuvSAxMDAlIOS4juihqOS9k+WQjOavlOS+i+aLieS8uO+8m1xuICAgKiAtIGZpeGVk77yI5pyJIHNjcm9sbC5477yJ77ya5ZCM5q2lIHNjcm9sbExlZnTvvJtcbiAgICogLSDku4XlvZPooajkvZPmnInnq5bmu5rmnaHml7bpooTnlZnlj7Pkvqfmp73vvIzooYzlsJHml6Dnq5bmu5rml7bkuI3ljaDkvY3jgIJcbiAgICovXG4gIHByaXZhdGUgc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dUYWJsZVRvdGFsKSB7XG4gICAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgICAgaWYgKHRoaXMudG90YWxGb290ZXJOZWVkWUd1dHRlcikge1xuICAgICAgICB0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZvb3RlciA9IHRoaXMuZ2V0VG90YWxGb290ZXJTY3JvbGxFbCgpO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmdldFRhYmxlQm9keVNjcm9sbEVsKCk7XG4gICAgaWYgKCFmb290ZXIpIHtcbiAgICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyU3luY1JldHJ5IDwgMTApIHtcbiAgICAgICAgdGhpcy50b3RhbEZvb3RlclN5bmNSZXRyeSsrO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSwgNTApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRvdGFsRm9vdGVyU3luY1JldHJ5ID0gMDtcbiAgICBjb25zdCBuZWVkWUd1dHRlciA9ICEhKGJvZHkgJiYgdGhpcy5ib2R5SGFzVmVydGljYWxTY3JvbGxiYXIoYm9keSkpO1xuICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgIT09IG5lZWRZR3V0dGVyKSB7XG4gICAgICB0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgPSBuZWVkWUd1dHRlcjtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1RvdGFsRm9vdGVyRmx1aWQpIHtcbiAgICAgIHRoaXMudW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk7XG4gICAgICBmb290ZXIuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChib2R5KSB7XG4gICAgICB0aGlzLnN5bmNUb3RhbEZvb3RlclNjcm9sbExlZnQoYm9keS5zY3JvbGxMZWZ0KTtcbiAgICAgIHRoaXMuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYyhib2R5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN5bmNUb3RhbEZvb3RlclNjcm9sbExlZnQoc2Nyb2xsTGVmdDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9vdGVyID0gdGhpcy5nZXRUb3RhbEZvb3RlclNjcm9sbEVsKCk7XG4gICAgaWYgKGZvb3RlciAmJiBmb290ZXIuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsTGVmdCkge1xuICAgICAgZm9vdGVyLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYyhib2R5OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VGFibGVUb3RhbCB8fCAhYm9keSB8fCB0aGlzLmlzVG90YWxGb290ZXJGbHVpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ID09PSBib2R5ICYmXG4gICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlclxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgPSBib2R5O1xuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zeW5jVG90YWxGb290ZXJTY3JvbGxMZWZ0KGJvZHkuc2Nyb2xsTGVmdCk7XG4gICAgfTtcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIsIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgfSBhcyBhbnkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgJiYgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJzY3JvbGxcIixcbiAgICAgICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ID0gbnVsbDtcbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlciA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog55uR5ZCs56qX5Y+jIC8g5a655Zmo5a695bqm5Y+Y5YyW77ya6YeN5paw5Yik5a6aIHNjcm9sbC5477yIZmx1aWTihpRmaXhlZO+8ieS4juWQiOiuoeWPs+S+p+erlua7muanve+8jFxuICAgKiDpgb/lhY3mi4nlrr0v57yp56qE5bGP5bmV5ZCO5ZCI6K6h6KGM5a695LiO6KGo5L2T6ZSZ5L2N44CCXG4gICAqL1xuICBwcml2YXRlIGJpbmRWaWV3cG9ydFJlc2l6ZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5ib3VuZE9uVmlld3BvcnRSZXNpemUgPSAoKSA9PiB0aGlzLnNjaGVkdWxlVmlld3BvcnRTY3JvbGxTeW5jKCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplKTtcbiAgICB9XG4gICAgY29uc3QgUk8gPVxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/ICh3aW5kb3cgYXMgYW55KS5SZXNpemVPYnNlcnZlciA6IG51bGw7XG4gICAgaWYgKFJPICYmIHRoaXMuaG9zdEVsICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyID0gbmV3IFJPKCgpID0+IHRoaXMuc2NoZWR1bGVWaWV3cG9ydFNjcm9sbFN5bmMoKSk7XG4gICAgICB0aGlzLmhvc3RSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5iaW5kVmlld3BvcnRSZXNpemVTeW5jKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSk7XG4gICAgfVxuICAgIHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplID0gbnVsbDtcbiAgICBpZiAodGhpcy5ob3N0UmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld3BvcnRSZXNpemVUaW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyKTtcbiAgICAgIHRoaXMudmlld3BvcnRSZXNpemVUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVZpZXdwb3J0U2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudmlld3BvcnRSZXNpemVUaW1lciA9IG51bGw7XG4gICAgICBpZiAoIXRoaXMudGFibGVDb2xzIHx8ICF0aGlzLnRhYmxlQ29scy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgLy8g562J6KGo5L2T5biD5bGA56iz5a6a5ZCO5YaN5qCh5ZCI6K6h56uW5rua5qe9IC8g5qiq5rua5ZCM5q2lXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSwgNTApO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBkZWFsU2Nyb2xsKCkge1xuICAgIGxldCBjb2xXaWR0aCA9IDA7XG4gICAgaWYgKHRoaXMuc2hvd1NlbGVjdGVkKSB7XG4gICAgICBjb2xXaWR0aCArPSA0MDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1RhYmxlVG90YWwpIHtcbiAgICAgIGNvbFdpZHRoICs9IHRoaXMubGluZU51bWJlckNvbFdpZHRoOyAvLyDluo/lj7fliJfvvIjlm7rlrprlrr3vvIzkuI3pmo/kvY3mlbDlj5jljJbvvIlcbiAgICB9XG4gICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtLndpZHRoKSB7XG4gICAgICAgIGl0ZW0ud2lkdGggPSBDb2xXaWR0aC5maXhDb2xXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmlzU2hvdykge1xuICAgICAgICBpdGVtLmZpeGVkV2lkdGggPSBjb2xXaWR0aDtcbiAgICAgICAgY29sV2lkdGggKz0gaXRlbS53aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOWPs+S+p+WbuuWumuWIl++8muS7juWPs+W+gOW3pue0r+iuoeWBj+enu++8jOmBv+WFjeWkmuWIl+mDvSByaWdodDowIOS6kuebuOmBruaMoVxuICAgIGxldCByaWdodE9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMudGFibGVDb2xzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy50YWJsZUNvbHNbaV07XG4gICAgICBpZiAoIWl0ZW0uaXNTaG93KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uZml4ZWQgPT09IFwicmlnaHRcIikge1xuICAgICAgICBpdGVtLmZpeGVkUmlnaHRXaWR0aCA9IHJpZ2h0T2Zmc2V0O1xuICAgICAgICByaWdodE9mZnNldCArPSBpdGVtLndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5maXhlZFJpZ2h0V2lkdGggPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGFibGVDb2xXaWR0aFRvdGFsID0gY29sV2lkdGg7XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgdXNlVmlydHVhbCA9IHRoaXMudXNlVmlydHVhbFNjcm9sbDtcbiAgICBjb25zdCBzY3JvbGxYID0gdGhpcy5yZXNvbHZlU2Nyb2xsWChjb2xXaWR0aCk7XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmICF1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgICAgeDogc2Nyb2xsWCxcbiAgICAgICAgeTogbnVsbCxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgICB4OiBzY3JvbGxYLFxuICAgICAgICB5OiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgeDogc2Nyb2xsWCxcbiAgICAgIHk6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g6KGo5qC85Yu+6YCJ6YC76L6RXG4gIGN1cnJlbnRQYWdlRGF0YUNoYW5nZSgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEgPSAkZXZlbnQ7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgaWYgKCF0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwpIHtcbiAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZWFyY2gocmVzZXQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDliY3nq6/liIbpobXvvJrlj6rlkIzmraXpobXnoIEv5p2h5pWw77yM5LiN6Kem5Y+R54i257uE5Lu25p+l6K+iXG4gICAgaWYgKHRoaXMuZnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleCA9IDE7XG4gICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhYmxlUGFnZUluZGV4Q2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VJbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAvLyDmjInlvZPliY3pobXooYzmlbDph43nrpfmmK/lkKbpnIDopoEgc2Nyb2xsLnnvvIjmnKvpobXmlbDmja7lsJHml7bljrvmjonlm7rlrprpq5jluqbvvIzpgb/lhY3nlZnnmb3vvIlcbiAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUoZmFsc2UpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFibGVQYWdlSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZUluZGV4KTtcbiAgICAgIC8vIOinpuWPkeeItue7hOS7tuafpeivouS6i+S7tlxuICAgICAgdGhpcy50YWJsZVNlYXJjaEV2ZW50LmVtaXQocmVzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlupXpg6jlkIjorqHvvJrkuI4gaGQtZGV0YWlsLWxpbmVzIOebuOWQjO+8jOS9v+eUqCBUb3RhbE9wdGlvbu+8iGluc2VydEluZGV4IC8gaW5zZXJ0VmFsdWXvvInjgIJcbiAgICog5byA5ZCv5ZCO5by65Yi25bGV56S65bqP5Y+35YiX77yM44CM5ZCI6K6h44CN6JC95Zyo5bqP5Y+35YiX5LiL77ybXG4gICAqIGluc2VydEluZGV4IOS7jiAxIOi1t+WvueW6lOWPr+ingeaVsOaNruWIl++8m+acquS8oCBpbnNlcnRWYWx1ZSDml7bmjInor6XliJcgbmFtZSDlr7kgY29udGVudCDmsYLlkozjgIJcbiAgICovXG4gIGNhbGN1bGF0ZVRhYmxlVG90YWwoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2hvd1RhYmxlVG90YWwgfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb24gfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb24ubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpc2libGVDb2xzID0gKHRoaXMudGFibGVDb2xzIHx8IFtdKS5maWx0ZXIoXG4gICAgICAoYykgPT4gYyAmJiBjLmlzU2hvdyAhPT0gZmFsc2UsXG4gICAgKTtcbiAgICAvLyBjb2x1bW5zTnVtYmVyIOWQq+W6j+WPt+WIl++8iOS4jiBkZXRhaWwtbGluZXMg5LiA6Ie077yJ77yM5pWw5o2u5qe95L2N5pWwID0gY29sdW1uc051bWJlciAtIDFcbiAgICBjb25zdCBjb25maWd1cmVkID0gTnVtYmVyKHRoaXMuY29sdW1uc051bWJlcik7XG4gICAgY29uc3QgY29sdW1uTnVtYmVyID1cbiAgICAgIGNvbmZpZ3VyZWQgPiAxXG4gICAgICAgID8gY29uZmlndXJlZCAtIDFcbiAgICAgICAgOiBjb25maWd1cmVkID09PSAxXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiB2aXNpYmxlQ29scy5sZW5ndGg7XG4gICAgaWYgKCFjb2x1bW5OdW1iZXIgfHwgY29sdW1uTnVtYmVyIDwgMSkge1xuICAgICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gbmV3IEFycmF5KGNvbHVtbk51bWJlcikuZmlsbChcIlwiKTtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50IDogW107XG4gICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtID09IG51bGwgfHwgIWl0ZW0uaW5zZXJ0SW5kZXggfHwgaXRlbS5pbnNlcnRJbmRleCA8IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHZhbHVlOiBhbnkgPSBpdGVtLmluc2VydFZhbHVlO1xuICAgICAgLy8g5pyq5LygIGluc2VydFZhbHVlIOaXtu+8muaMiSBpbnNlcnRJbmRleCDlr7nlupTlj6/op4HliJcgbmFtZSDoh6rliqjmsYLlkoxcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHZpc2libGVDb2xzW2l0ZW0uaW5zZXJ0SW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2wgJiYgdHlwZW9mIGNvbC5uYW1lID09PSBcInN0cmluZ1wiID8gY29sLm5hbWUgOiBudWxsO1xuICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgY29udGVudC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICBjb25zdCByYXcgPSByb3cgPyByb3dbZmllbGRdIDogbnVsbDtcbiAgICAgICAgICBpZiAocmF3ID09IG51bGwgfHwgcmF3ID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihyYXcpO1xuICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgc3VtICs9IG51bTtcbiAgICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc3VtO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sQXRJbmRleCA9IHZpc2libGVDb2xzW2l0ZW0uaW5zZXJ0SW5kZXggLSAxXTtcbiAgICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3RbaXRlbS5pbnNlcnRJbmRleCAtIDFdID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ24gfHwgKGNvbEF0SW5kZXggJiYgY29sQXRJbmRleC5hbGlnbikgfHwgXCJsZWZ0XCIsXG4gICAgICAgIHNob3dEZWNpbWFsOiBpdGVtLnNob3dEZWNpbWFsIHx8IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZU51bWJlcjpcbiAgICAgICAgICBpdGVtLnByZXNlcnZlTnVtYmVyICE9IG51bGwgPyBpdGVtLnByZXNlcnZlTnVtYmVyIDogMixcbiAgICAgICAgaXNIaWRlOiBpdGVtLmlzSGlkZSB8fCBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRhYmxlVG90YWxDZWxsTWV0YShjb2w6IEhkVGFibGVDb2x1bW4sIGNvbEluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmICghY29sIHx8ICF0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0IHx8ICF0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCB2aXNpYmxlSW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBjb2xJbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy50YWJsZUNvbHNbaV07XG4gICAgICBpZiAoYyAmJiBjLmlzU2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgdmlzaWJsZUluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2aXNpYmxlSW5kZXggPCAwIHx8IHZpc2libGVJbmRleCA+PSB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0W3Zpc2libGVJbmRleF07XG4gICAgcmV0dXJuIG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgPyBtZXRhIDogbnVsbDtcbiAgfVxuXG4gIC8qKiDlkIjorqHljZXlhYPmoLzlsZXnpLrmlofmoYjvvIjlr7npvZAgZGV0YWlsLWxpbmVzIOWwj+aVsOinhOWIme+8iSAqL1xuICBnZXRUYWJsZVRvdGFsQ2VsbFZhbHVlKGNvbDogSGRUYWJsZUNvbHVtbiwgY29sSW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0VGFibGVUb3RhbENlbGxNZXRhKGNvbCwgY29sSW5kZXgpO1xuICAgIGlmICghbWV0YSB8fCBtZXRhLmlzSGlkZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gbWV0YS52YWx1ZTtcbiAgICBpZiAoISh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBwcmVzZXJ2ZSA9XG4gICAgICBtZXRhLnByZXNlcnZlTnVtYmVyICE9IG51bGwgPyBOdW1iZXIobWV0YS5wcmVzZXJ2ZU51bWJlcikgOiAyO1xuICAgIGlmICh2YWx1ZSAlIDEgPT09IDAgJiYgIW1ldGEuc2hvd0RlY2ltYWwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgZmFjdG9yID0gTWF0aC5wb3coMTAsIHByZXNlcnZlKTtcbiAgICByZXR1cm4gKE1hdGgucm91bmQoTnVtYmVyKHZhbHVlKSAqIGZhY3RvcikgLyBmYWN0b3IpLnRvRml4ZWQocHJlc2VydmUpO1xuICB9XG5cbiAgZ2V0VGFibGVUb3RhbENlbGxBbGlnbihjb2w6IEhkVGFibGVDb2x1bW4sIGNvbEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFRhYmxlVG90YWxDZWxsTWV0YShjb2wsIGNvbEluZGV4KTtcbiAgICBjb25zdCBhbGlnbiA9XG4gICAgICAobWV0YSAmJiBtZXRhLmFsaWduKSB8fCAoY29sICYmIGNvbC5hbGlnbikgfHwgXCJsZWZ0XCI7XG4gICAgaWYgKGFsaWduID09PSBcInJpZ2h0XCIgfHwgYWxpZ24gPT09IFwiY2VudGVyXCIgfHwgYWxpZ24gPT09IFwibGVmdFwiKSB7XG4gICAgICByZXR1cm4gYWxpZ247XG4gICAgfVxuICAgIHJldHVybiBcImxlZnRcIjtcbiAgfVxuXG4gIC8qKiDlupXpg6jjgIzlhbEgbiDmnaHjgI3vvJrpnZ7liIbpobUv5YmN56uv5YiG6aG155SoIGNvbnRlbnQubGVuZ3Ro77yM5pyN5Yqh56uv5YiG6aG155SoIHRvdGFsRWxlbWVudHMgKi9cbiAgZ2V0VGFibGVUb3RhbENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLnRhYmxlRGF0YSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uIHx8IHRoaXMuZnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWJsZURhdGEuY29udGVudCA/IHRoaXMudGFibGVEYXRhLmNvbnRlbnQubGVuZ3RoIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGFibGVEYXRhLnRvdGFsRWxlbWVudHMgIT0gbnVsbFxuICAgICAgPyB0aGlzLnRhYmxlRGF0YS50b3RhbEVsZW1lbnRzXG4gICAgICA6IDA7XG4gIH1cblxuICByZXNldFN0YXR1cygpIHtcbiAgICB0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAvLyDlhYjmmL7lvI/nva4gZmFsc2XvvIzpgb/lhY0gbnotY2hlY2tib3gg5YaF6YOo54q25oCB5LiOIG1hcE9mQ2hlY2tlZElkIOS4jeWQjOatpe+8iOiZmuaLn+a7muWKqOWkjeeUqOihjOaXtuW4uOinge+8iVxuICAgIE9iamVjdC5rZXlzKHRoaXMubWFwT2ZDaGVja0xpc3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtrZXldID0gZmFsc2U7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtW3RoaXMuc2VsZWN0RmllbGRdO1xuICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRba2V5XSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubWFwT2ZDaGVja2VkSWQgPSB7fTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0ID0ge307XG4gICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KFtdKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZnJlc2hTdGF0dXMoZXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSwgZGF0YTogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICAvLyDnpoHnlKjooYzkuI3lhYHorrjli77pgInvvJvlj5bmtojli77pgInku43lhYHorrjvvIjkvovlpoLmlbDmja7lj5jmm7TliY3lt7Lli77pgInvvIlcbiAgICAgIGlmIChldmVudCAmJiB0aGlzLmlzU2VsZWN0RGlzYWJsZWQoZGF0YSkpIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBldmVudDtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICAhdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgICh0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dID0gZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGFibGVMaXN0ID0gdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gIXRoaXMuaXNTZWxlY3REaXNhYmxlZChpdGVtKSxcbiAgICApO1xuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPVxuICAgICAgc2VsZWN0YWJsZUxpc3QubGVuZ3RoID4gMCAmJlxuICAgICAgc2VsZWN0YWJsZUxpc3QuZXZlcnkoKGl0ZW0pID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0pO1xuICAgIHRoaXMuaXNJbmRldGVybWluYXRlID1cbiAgICAgIHNlbGVjdGFibGVMaXN0LnNvbWUoXG4gICAgICAgIChpdGVtKSA9PiB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dLFxuICAgICAgKSAmJiAhdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZDtcbiAgICAvLyDop6blj5FzZWxlY3Tkuovku7ZcbiAgICBpZiAodGhpcy5zZWxlY3RFdmVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRMaXN0OiBBcnJheTxhbnk+ID0gT2JqZWN0LnZhbHVlcyh0aGlzLm1hcE9mQ2hlY2tMaXN0KTtcbiAgICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdChzZWxlY3RlZExpc3QpO1xuICAgIH1cbiAgICAvLyDlpoLmnpzmlbDmja7kuLrnqbrvvIzliJnmuIXnqbrli77pgInmoIfor4ZcbiAgICBpZiAodGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjaGVja0FsbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgLy8g5YWo6YCJL+WPlua2iOWFqOmAieWdh+i3s+i/h+emgeeUqOihjO+8iOemgeeUqOihjOS/neaMgeWOn+WLvumAieeKtuaAge+8iVxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3REaXNhYmxlZChpdGVtKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgIXRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICAodGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSA9IGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiog5b2T5YmN6KGM5piv5ZCm56aB55So5Yu+6YCJICovXG4gIGlzU2VsZWN0RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5zZWxlY3REaXNhYmxlZEZpZWxkICYmXG4gICAgICBkYXRhICYmXG4gICAgICBkYXRhW3RoaXMuc2VsZWN0RGlzYWJsZWRGaWVsZF0gPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqIOW9k+WJjeihjOaYr+WQpuWkseaViCAqL1xuICBpc0ludmFsaWRSb3coZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5yb3dJbnZhbGlkRmllbGQgJiZcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGFbdGhpcy5yb3dJbnZhbGlkRmllbGRdID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJfmloflrZfpopzoibLvvJpjb2xvciDkuLrlh73mlbDml7bmjInooYzorqHnrpfvvIjnlKjkuo7mn5DkuIDooYzmn5DkuIDliJfmoIfnuqLvvInvvIzlkKbliJnmlbTliJflkIzoibLjgIJcbiAgICovXG4gIHJlc29sdmVDZWxsQ29sb3IoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghY29sIHx8IGNvbC5jb2xvciA9PSBudWxsIHx8IGNvbC5jb2xvciA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmNvbG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sLmNvbG9yKGRhdGEpO1xuICAgICAgcmV0dXJuIHZhbHVlIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb2wuY29sb3I7XG4gIH1cblxuICAvKiog5Y+v54K55Ye75Y2V5YWD5qC86aKc6Imy77ya56m65YC85Zu65a6a54Gw77yM5ZCm5YiZ5oyJ5YiXIGNvbG9yICovXG4gIGdldExpbmtDZWxsQ29sb3IoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIGlzRW1wdHk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICByZXR1cm4gXCIjMkEzNjM0XCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc29sdmVDZWxsQ29sb3IoY29sLCBkYXRhKTtcbiAgfVxuXG4gIC8qKiDmma7pgJrmlofmnKzljZXlhYPmoLzpopzoibLvvJrlpLHmlYjooYznu5/kuIDngbDvvIzlkKbliJnnlKjliJfphY3nva4gY29sb3IgKi9cbiAgZ2V0UGxhaW5DZWxsQ29sb3IoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzSW52YWxpZFJvdyhkYXRhKSkge1xuICAgICAgcmV0dXJuIFwiIzg2OEE5Q1wiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ2VsbENvbG9yKGNvbCwgZGF0YSk7XG4gIH1cblxuICBqdWRnZUNvbEVtcHR5KHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciB8fCBzdHIgPT09IDApIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIjznqbo+XCI7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdGVGaWVsZChjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIGlmIChjb2wuaXNTdGF0ZSkge1xuICAgICAgcmV0dXJuIGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5zdGF0ZUZpZWxkIHx8IFwic3RhdGVcIjtcbiAgfVxuXG4gIC8qKiDlrZfmrrXlgLzlkI7mmK/lkKblsZXnpLrnq5bnur/ooYzlj7cgKi9cbiAgaGFzUm93Tm8oY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGNvbCAmJiAoY29sLnJvd05vID09PSB0cnVlIHx8ICh0eXBlb2YgY29sLnJvd05vID09PSBcInN0cmluZ1wiICYmIGNvbC5yb3dObykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDooYzlj7fmlofmoYjjgIJyb3dObyDkuLrlrZfmrrXlkI3ml7blj5booYzmlbDmja7vvJvkuLogdHJ1ZSDml7bmjInlvZPliY3pobXluo/lj7fvvIjot6jpobXov57nu63vvIzku44gMSDlvIDlp4vvvInjgIJcbiAgICovXG4gIGdldFJvd05vVGV4dChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmhhc1Jvd05vKGNvbCkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5yb3dObyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgdmFsdWUgPSBkYXRhID8gZGF0YVtjb2wucm93Tm9dIDogbnVsbDtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2UgPSBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpIDogMTtcbiAgICBjb25zdCBzaXplID0gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAwO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gTnVtYmVyKGluZGV4KSA+PSAwID8gTnVtYmVyKGluZGV4KSA6IDA7XG4gICAgcmV0dXJuIFN0cmluZygocGFnZSAtIDEpICogc2l6ZSArIHJvd0luZGV4ICsgMSk7XG4gIH1cblxuICAvKiog6KGo5aS044CM6YWN6YCB5Y2V5Y+3IHwg6KGM44CN5ouG5oiQ55+t56uW57q/77yM6YG/5YWN5a2X56ymIHwg5ouJ5ruh6KGM6auYICovXG4gIGdldFRpdGxlUGFydHMoY29sOiBIZFRhYmxlQ29sdW1uKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLmhhc1Jvd05vKGNvbCkgfHwgIWNvbCB8fCAhY29sLnRpdGxlIHx8IFN0cmluZyhjb2wudGl0bGUpLmluZGV4T2YoXCJ8XCIpIDwgMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IFN0cmluZyhjb2wudGl0bGUpLnNwbGl0KFwifFwiKTtcbiAgICBpZiAocmF3Lmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gW3Jhd1swXS50cmltKCksIHJhdy5zbGljZSgxKS5qb2luKFwifFwiKS50cmltKCldO1xuICB9XG5cbiAgLyoqIOaYr+WQpuaYvuekuue8lui+keeslOWbvuagh++8iOaciSBlZGl0VHlwZSDml7botbDooYzlhoXmjqfku7bvvIzkuI3lho3mmL7npLrnrJTvvIkgKi9cbiAgaXNFZGl0YWJsZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghY29sIHx8IHRoaXMuaGFzSW5saW5lRWRpdChjb2wpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb2wuZWRpdGFibGUgPT0gbnVsbCB8fCBjb2wuZWRpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmVkaXRhYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAhIWNvbC5lZGl0YWJsZShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY29sLmVkaXRhYmxlO1xuICB9XG5cbiAgLyoqIOeCueWHu+e8lui+keeslO+8jOWbnuiwg+eItue7hOS7tuS8oOWFpeeahCBlZGl0ICovXG4gIG9uRWRpdENsaWNrKGV2ZW50OiBFdmVudCwgY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoY29sLmVkaXQgfHwgbnVsbCwgZGF0YSk7XG4gIH1cblxuICAvKiog5YiX5piv5ZCm6YWN572u5LqG5Y+v55So55qE6KGM5YaF57yW6L6R77yIbmFtZSDlv4XpobvmmK8gc3RyaW5n77yJICovXG4gIGhhc0lubGluZUVkaXQoY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5lZGl0VHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5uYW1lICE9PSBcInN0cmluZ1wiIHx8ICFjb2wubmFtZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltoZC10YWJsZV0gZWRpdFR5cGUg6KaB5rGCIG5hbWUg5Li6IHN0cmluZ++8jOWIl+OAjFwiICtcbiAgICAgICAgICAoY29sLnRpdGxlIHx8IFwiXCIpICtcbiAgICAgICAgICBcIuOAjeW3suWbnumAgOWPquivu1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpc0VkaXREaXNhYmxlZChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghY29sIHx8IGNvbC5lZGl0RGlzYWJsZWQgPT0gbnVsbCB8fCBjb2wuZWRpdERpc2FibGVkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5lZGl0RGlzYWJsZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuICEhY29sLmVkaXREaXNhYmxlZChkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY29sLmVkaXREaXNhYmxlZDtcbiAgfVxuXG4gIGdldFNlbGVjdExpc3QoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBBcnJheTxhbnk+IHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLnNlbGVjdE9wdGlvbikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGlmIChvcHQuc2VsZWN0TGlzdE5hbWUgJiYgZGF0YSkge1xuICAgICAgY29uc3QgbGlzdCA9IGRhdGFbb3B0LnNlbGVjdExpc3ROYW1lXTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtdO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHQuc2VsZWN0TGlzdCkgPyBvcHQuc2VsZWN0TGlzdCA6IFtdO1xuICB9XG5cbiAgZ2V0U2VsZWN0T3B0aW9uTGFiZWwoY29sOiBIZFRhYmxlQ29sdW1uLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uIHx8ICFpdGVtKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gY29sLnNlbGVjdE9wdGlvbjtcbiAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bb3B0LnZhbHVlXTtcbiAgICBjb25zdCBsYWJlbCA9IGl0ZW1bb3B0LmxhYmVsXTtcbiAgICBpZiAob3B0LnNob3dMYWJlbEFuZFZhbHVlIHx8IG9wdC5oZFNob3dJdGVtQ29kZSkge1xuICAgICAgcmV0dXJuIGBbJHt2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlfV0ke2xhYmVsID09IG51bGwgPyBcIlwiIDogbGFiZWx9YDtcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVsID09IG51bGwgPyBcIlwiIDogU3RyaW5nKGxhYmVsKTtcbiAgfVxuXG4gIGdldElucHV0TnVtYmVyUHJvcChcbiAgICBjb2w6IEhkVGFibGVDb2x1bW4sXG4gICAga2V5OiBcIm1pblwiIHwgXCJtYXhcIiB8IFwic3RlcFwiIHwgXCJwcmVjaXNpb25cIixcbiAgICBmYWxsYmFjazogbnVtYmVyLFxuICApOiBudW1iZXIge1xuICAgIGlmICghY29sIHx8ICFjb2wuaW5wdXROdW1iZXIpIHtcbiAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICB9XG4gICAgY29uc3QgdmFsID0gY29sLmlucHV0TnVtYmVyW2tleV07XG4gICAgcmV0dXJuIHZhbCAhPSBudWxsID8gTnVtYmVyKHZhbCkgOiBmYWxsYmFjaztcbiAgfVxuXG4gIC8qKiBJbnB1dCAvIElucHV0TnVtYmVyIOWPmOabtO+8muWFiOiusOaXp+WAvOWGjeWGmeWbnuW5tumAmuefpeeItue7hOS7tiAqL1xuICBvbkNlbGxDaGFuZ2UoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSW5saW5lRWRpdChjb2wpIHx8ICFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBjb2wubmFtZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGRhdGFbbmFtZV07XG4gICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIHRoaXMuY2VsbENoYW5nZS5lbWl0KHtcbiAgICAgIGxpbmU6IGRhdGEsXG4gICAgICBjb2wsXG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBwcmV2aW91c1ZhbHVlLFxuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCDlsZXlvIDvvJrmnIkgb25PcGVuQ2hhbmdlRXZlbnQg5pe25bGV5byA5YWI5riF56m66YCJ6aG55YaN5Zue6LCDIChvcGVuLCBsaW5lKe+8m+WFs+mXreS4jeWbnuiwg+S4muWKoeOAglxuICAgKiDlm57osIPoi6UgcmV0dXJuIOaVsOe7hCAvIFByb21pc2UgLyBPYnNlcnZhYmxl77yM55Sx57uE5Lu25YaZ5ZueIG9wdGlvbnMg5bm2IG1hcmtGb3JDaGVja+OAglxuICAgKi9cbiAgb25TZWxlY3RPcGVuQ2hhbmdlKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5vbk9wZW5DaGFuZ2VFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdE9wdGlvbnNPbk9wZW4oY29sLCBkYXRhKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBjb25zdCBmbiA9IGNvbC5vbk9wZW5DaGFuZ2VFdmVudDtcbiAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgIGNvbC5vbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgID8gY29sLm9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lXG4gICAgICAgIDogMDtcbiAgICBpZiAoIWRlYm91bmNlTXMpIHtcbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0TG9hZGVyUmVzdWx0KGNvbCwgZGF0YSwgZm4ob3BlbiwgZGF0YSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKGRlYm91bmNlTXMpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbjogY2IsIG9wZW46IG8sIGxpbmUsIGNvbDogYyB9KSA9PiB7XG4gICAgICAgIGlmIChvKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RMb2FkZXJSZXN1bHQoYywgbGluZSwgY2IobywgbGluZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJqZWN0Lm5leHQoeyBmbiwgb3BlbiwgbGluZTogZGF0YSwgY29sIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCDmkJzntKLvvJrmnIkgb25TZWFyY2hFdmVudCDml7blm57osIMgKGtleXdvcmQsIGxpbmUp77yM5LiN5riF56m6IG9wdGlvbnPjgIJcbiAgICog5Zue6LCD6IulIHJldHVybiDmlbDnu4QgLyBQcm9taXNlIC8gT2JzZXJ2YWJsZe+8jOeUsee7hOS7tuWGmeWbniBvcHRpb25zIOW5tiBtYXJrRm9yQ2hlY2vjgIJcbiAgICovXG4gIG9uU2VsZWN0U2VhcmNoKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBrZXl3b3JkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLm9uU2VhcmNoRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZm4gPSBjb2wub25TZWFyY2hFdmVudDtcbiAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgIGNvbC5vblNlYXJjaEV2ZW50RXZlbnREZWJvdW5jZVRpbWUgIT0gbnVsbFxuICAgICAgICA/IGNvbC5vblNlYXJjaEV2ZW50RXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgOiAwO1xuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgdGhpcy5oYW5kbGVTZWxlY3RMb2FkZXJSZXN1bHQoY29sLCBkYXRhLCBmbihrZXl3b3JkLCBkYXRhKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RTZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RTZWFyY2hTdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdFNlYXJjaFN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZShkZWJvdW5jZU1zKSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm46IGNiLCBrZXl3b3JkOiBrdywgbGluZSwgY29sOiBjIH0pID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RMb2FkZXJSZXN1bHQoYywgbGluZSwgY2Ioa3csIGxpbmUpKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0U2VhcmNoU3ViamVjdC5uZXh0KHsgZm4sIGtleXdvcmQsIGxpbmU6IGRhdGEsIGNvbCB9KTtcbiAgfVxuXG4gIC8qKiDlsZXlvIDml7bmuIXnqbrliJcgc2VsZWN0TGlzdCDmiJbooYzkuIogc2VsZWN0TGlzdE5hbWXvvIznlLHkuJrliqHlm57osIPlho3lhpnlhaUgKi9cbiAgcHJpdmF0ZSBjbGVhclNlbGVjdE9wdGlvbnNPbk9wZW4oY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLnNlbGVjdE9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGlmIChvcHQuc2VsZWN0TGlzdCAhPSBudWxsKSB7XG4gICAgICBvcHQuc2VsZWN0TGlzdCA9IFtdO1xuICAgIH1cbiAgICBpZiAob3B0LnNlbGVjdExpc3ROYW1lICYmIGRhdGEpIHtcbiAgICAgIGRhdGFbb3B0LnNlbGVjdExpc3ROYW1lXSA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIbliqDovb3lm57osIPov5Tlm57lgLzvvJrmlbDnu4Tnm7TmjqXlhpnlm57vvJtQcm9taXNlL09ic2VydmFibGUg5a6M5oiQ5ZCO5YaZ5Zue77ybdm9pZCDku4UgbWFya0ZvckNoZWNr44CCXG4gICAqIOS8mOWFiOWGmSBzZWxlY3RMaXN0TmFtZe+8jOWQpuWImeWGmeWIl+S4iiBzZWxlY3RMaXN044CCXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNlbGVjdExvYWRlclJlc3VsdChcbiAgICBjb2w6IEhkVGFibGVDb2x1bW4sXG4gICAgZGF0YTogYW55LFxuICAgIHJlc3VsdDogYW55LFxuICApOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0T3B0aW9ucyhjb2wsIGRhdGEsIHJlc3VsdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmVzdWx0LnRoZW4oXG4gICAgICAgIChsaXN0OiBhbnkpID0+IHRoaXMuYXBwbHlTZWxlY3RPcHRpb25zKGNvbCwgZGF0YSwgbGlzdCksXG4gICAgICAgICgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQuc3Vic2NyaWJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdExvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnNlbGVjdExvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RMb2FkZXJTdWJzY3JpcHRpb24gPSByZXN1bHQuc3Vic2NyaWJlKFxuICAgICAgICAobGlzdDogYW55KSA9PiB0aGlzLmFwcGx5U2VsZWN0T3B0aW9ucyhjb2wsIGRhdGEsIGxpc3QpLFxuICAgICAgICAoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNlbGVjdE9wdGlvbnMoXG4gICAgY29sOiBIZFRhYmxlQ29sdW1uLFxuICAgIGRhdGE6IGFueSxcbiAgICBsaXN0OiBhbnksXG4gICk6IHZvaWQge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uIHx8ICFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gY29sLnNlbGVjdE9wdGlvbjtcbiAgICBpZiAob3B0LnNlbGVjdExpc3ROYW1lICYmIGRhdGEpIHtcbiAgICAgIGRhdGFbb3B0LnNlbGVjdExpc3ROYW1lXSA9IGxpc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdC5zZWxlY3RMaXN0ID0gbGlzdDtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU2VsZWN0IOWPmOabtO+8muWPjOWGmSB2YWx1ZSArIGxhYmVs77yM5bm25bimIHByZXZpb3VzKiAvIG9wdGlvbiAqL1xuICBvblNlbGVjdENoYW5nZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkgfHwgIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IGxhYmVsRmllbGQgPSBvcHQgJiYgb3B0LmxhYmVsID8gb3B0LmxhYmVsIDogbnVsbDtcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZGF0YVtuYW1lXTtcbiAgICBjb25zdCBwcmV2aW91c0xhYmVsID0gbGFiZWxGaWVsZCA/IGRhdGFbbGFiZWxGaWVsZF0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuZ2V0U2VsZWN0TGlzdChjb2wsIGRhdGEpO1xuICAgIGNvbnN0IHByZXZpb3VzT3B0aW9uID1cbiAgICAgIHByZXZpb3VzVmFsdWUgPT0gbnVsbCB8fCAhb3B0XG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGxpc3QuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtW29wdC52YWx1ZV0gPT09IHByZXZpb3VzVmFsdWUpIHx8XG4gICAgICAgICAgbnVsbDtcbiAgICBjb25zdCBvcHRpb24gPVxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCAhb3B0XG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGxpc3QuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtW29wdC52YWx1ZV0gPT09IHZhbHVlKSB8fCBudWxsO1xuXG4gICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIGxldCBsYWJlbDogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmIChsYWJlbEZpZWxkKSB7XG4gICAgICBsYWJlbCA9IG9wdGlvbiA/IG9wdGlvbltvcHQubGFiZWxdIDogbnVsbDtcbiAgICAgIGRhdGFbbGFiZWxGaWVsZF0gPSBsYWJlbDtcbiAgICB9XG5cbiAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdCh7XG4gICAgICBsaW5lOiBkYXRhLFxuICAgICAgY29sLFxuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICAgIGxhYmVsLFxuICAgICAgcHJldmlvdXNMYWJlbCxcbiAgICAgIG9wdGlvbixcbiAgICAgIHByZXZpb3VzT3B0aW9uLFxuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=