@worktile/theia 2.3.3 → 2.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/worktile-theia.umd.js +1087 -997
- package/bundles/worktile-theia.umd.js.map +1 -1
- package/components/column-resize/column-resize.directive.d.ts +2 -2
- package/components/column-resize/column-resize.scss +6 -0
- package/components/column-resize/event-dispatcher.d.ts +7 -1
- package/components/column-resize/resize-ref.d.ts +3 -0
- package/constants/auto-format-rules.d.ts +1 -1
- package/constants/default.d.ts +0 -1
- package/custom-types.d.ts +2 -1
- package/editor.module.d.ts +45 -43
- package/esm2015/components/column-resize/column-resize.directive.js +26 -33
- package/esm2015/components/column-resize/event-dispatcher.js +8 -1
- package/esm2015/components/column-resize/overlay-handle.component.js +3 -3
- package/esm2015/components/column-resize/resize-ref.js +4 -1
- package/esm2015/constants/auto-format-rules.js +3 -2
- package/esm2015/constants/default.js +1 -1
- package/esm2015/custom-types.js +1 -1
- package/esm2015/editor.component.js +3 -2
- package/esm2015/editor.module.js +7 -6
- package/esm2015/interfaces/auto-format.js +1 -1
- package/esm2015/interfaces/editor.js +1 -1
- package/esm2015/plugins/autoformat/autoformat.plugin.js +23 -6
- package/esm2015/plugins/index.js +2 -3
- package/esm2015/plugins/inline-code/inline-code.component.js +7 -7
- package/esm2015/plugins/link/link.component.js +11 -24
- package/esm2015/plugins/link/link.plugin.js +3 -4
- package/esm2015/plugins/table/components/insert-mark/insert-mark.component.js +7 -2
- package/esm2015/plugins/table/components/table.component.js +10 -4
- package/esm2015/plugins/table/components/td/td.component.js +59 -37
- package/esm2015/plugins/table/components/toolbar/table-options.component.js +90 -0
- package/esm2015/plugins/table/components/toolbar/table-toolbar.component.js +26 -7
- package/esm2015/plugins/table/table.service.js +2 -2
- package/esm2015/plugins/table/table.store.js +13 -3
- package/esm2015/plugins/table/table.types.js +1 -1
- package/esm2015/plugins/todo-item/todo-item.component.js +3 -3
- package/esm2015/services/table-contextmenu.service.js +1 -1
- package/esm2015/utils/dom.js +2 -42
- package/fesm2015/worktile-theia.js +1039 -927
- package/fesm2015/worktile-theia.js.map +1 -1
- package/interfaces/auto-format.d.ts +1 -0
- package/interfaces/editor.d.ts +3 -0
- package/package.json +1 -1
- package/plugins/autoformat/autoformat.plugin.d.ts +1 -2
- package/plugins/link/link.component.d.ts +2 -8
- package/plugins/link/link.component.scss +0 -2
- package/plugins/table/components/table.component.scss +142 -105
- package/plugins/table/components/td/td.component.d.ts +3 -2
- package/plugins/table/components/toolbar/table-options.component.d.ts +20 -0
- package/plugins/table/components/toolbar/table-toolbar.component.d.ts +4 -2
- package/plugins/table/table.store.d.ts +3 -1
- package/plugins/table/table.types.d.ts +10 -0
- package/styles/editor.scss +6 -1
- package/utils/dom.d.ts +1 -5
|
@@ -5,7 +5,7 @@ import { SLA_TABLE_CELL_SELECTOR } from '../../../../constants/selector';
|
|
|
5
5
|
import { TablePosition } from '../../utils/table-position';
|
|
6
6
|
import { fromEvent, merge, Subject } from 'rxjs';
|
|
7
7
|
import { ColumnResizingStore } from '../../../../components/column-resize/resizing.store';
|
|
8
|
-
import { TableCellEventDispatcher } from '../../../../components/column-resize/event-dispatcher';
|
|
8
|
+
import { Position, TableCellEventDispatcher } from '../../../../components/column-resize/event-dispatcher';
|
|
9
9
|
import { ColumnResizeNotifierSource } from '../../../../components/column-resize/column-resize-notifier';
|
|
10
10
|
import { ComponentPortal, PortalInjector } from '@angular/cdk/portal';
|
|
11
11
|
import { TheColumnResizeOverlayHandleComponent } from '../../../../components/column-resize/overlay-handle.component';
|
|
@@ -25,13 +25,13 @@ const OVERLAY_INIT_SIZE = 16;
|
|
|
25
25
|
export const POSITION_MAP = {
|
|
26
26
|
top: {
|
|
27
27
|
originX: 'start',
|
|
28
|
-
originY: '
|
|
28
|
+
originY: 'top',
|
|
29
29
|
overlayX: 'start',
|
|
30
30
|
overlayY: 'center'
|
|
31
31
|
},
|
|
32
32
|
bottom: {
|
|
33
33
|
originX: 'start',
|
|
34
|
-
originY: '
|
|
34
|
+
originY: 'bottom',
|
|
35
35
|
overlayX: 'start',
|
|
36
36
|
overlayY: 'center'
|
|
37
37
|
},
|
|
@@ -77,7 +77,9 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
77
77
|
return this.tableComponent.resizeNotifier;
|
|
78
78
|
}
|
|
79
79
|
get theTableWrapperWidth() {
|
|
80
|
-
|
|
80
|
+
const tableContainer = this.tableComponent.nativeElement.firstChild;
|
|
81
|
+
const paddingLeft = coercePixelsFromCssValue(window.getComputedStyle(tableContainer)['paddingLeft']);
|
|
82
|
+
return this.tableComponent.theTableWrapperWidth - paddingLeft;
|
|
81
83
|
}
|
|
82
84
|
get tableElement() {
|
|
83
85
|
return this.tableComponent.theTableElement.nativeElement;
|
|
@@ -93,7 +95,14 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
93
95
|
return this.tableComponent.tableWrapper.nativeElement.scrollLeft;
|
|
94
96
|
}
|
|
95
97
|
get isXAxisHover() {
|
|
96
|
-
return [
|
|
98
|
+
return [Position.left, Position.right].includes(this.hoverdDirection);
|
|
99
|
+
}
|
|
100
|
+
get rowResizeClass() {
|
|
101
|
+
var _a;
|
|
102
|
+
return [
|
|
103
|
+
'the-row-resize-handle-panel',
|
|
104
|
+
this.tablePosition.table && ((_a = this.tablePosition.table.options) === null || _a === void 0 ? void 0 : _a.numberedColumn) ? 'the-numbered-resize-handle-panel' : ''
|
|
105
|
+
];
|
|
97
106
|
}
|
|
98
107
|
get cellInnerNativeElement() {
|
|
99
108
|
return this.cellInner.nativeElement;
|
|
@@ -303,20 +312,27 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
303
312
|
const element = this.elementRef.nativeElement;
|
|
304
313
|
this.eventDispatcher
|
|
305
314
|
.resizeOverlayVisibleForTableCell(element)
|
|
306
|
-
.pipe(takeUntil(this.destroy$)
|
|
315
|
+
.pipe(takeUntil(this.destroy$), map(value => {
|
|
316
|
+
// 禁止第一列左侧
|
|
317
|
+
if (value && value.position === Position.left && this.tablePosition.getColumnIndex() === 0) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
// 禁止第一行顶部
|
|
321
|
+
if (value && value.position === Position.top && this.tablePosition.getRowIndex() === 0) {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
return value;
|
|
325
|
+
}))
|
|
307
326
|
.subscribe(hoveredCellInfo => {
|
|
308
327
|
if (hoveredCellInfo && hoveredCellInfo.position) {
|
|
309
328
|
this.hoverdDirection = hoveredCellInfo.position;
|
|
310
329
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
if (!this.isXAxisHover && this.hoverdDirection === 'bottom' && this.tablePosition.getRowIndex() === 0) {
|
|
316
|
-
return;
|
|
330
|
+
else {
|
|
331
|
+
this.hoverdDirection = null;
|
|
317
332
|
}
|
|
318
333
|
if (hoveredCellInfo) {
|
|
319
|
-
|
|
334
|
+
this.hoverdDirection = hoveredCellInfo.position;
|
|
335
|
+
if (!this.overlayRef || !this.overlayRef.hasAttached()) {
|
|
320
336
|
this.overlayRef = this._createOverlayForHandle();
|
|
321
337
|
this._showHandleOverlay();
|
|
322
338
|
}
|
|
@@ -327,7 +343,6 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
327
343
|
}
|
|
328
344
|
else if (this.overlayRef) {
|
|
329
345
|
this.overlayRef.detach();
|
|
330
|
-
this.overlayRef = null;
|
|
331
346
|
}
|
|
332
347
|
});
|
|
333
348
|
}
|
|
@@ -338,21 +353,23 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
338
353
|
.subscribe(({ deltaSize, previousSize, completeImmediately }) => {
|
|
339
354
|
const { top, left, height, width } = this.elementRef.nativeElement.getBoundingClientRect();
|
|
340
355
|
const { clientY, clientX } = event;
|
|
341
|
-
let
|
|
356
|
+
let isPreventApplySize = false;
|
|
357
|
+
// 向下,或者向右移动(deltaSize > 0),鼠标位置不在当前单元格拖拽线上,阻止应用拖拽尺寸
|
|
342
358
|
if (this.isXAxisHover) {
|
|
343
|
-
const cellWidth = this.hoverdDirection ===
|
|
344
|
-
|
|
359
|
+
const cellWidth = this.hoverdDirection === Position.left ? 0 : width;
|
|
360
|
+
isPreventApplySize = deltaSize > 0 && left + cellWidth - clientX > 0;
|
|
345
361
|
}
|
|
346
362
|
else {
|
|
347
|
-
const cellHeight = this.hoverdDirection ===
|
|
348
|
-
|
|
363
|
+
const cellHeight = this.hoverdDirection === Position.top ? 0 : height;
|
|
364
|
+
isPreventApplySize = deltaSize > 0 && top + cellHeight - clientY > 0;
|
|
349
365
|
}
|
|
350
|
-
if (
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
366
|
+
if (isPreventApplySize) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
this.elementRef.nativeElement.classList.add(OVERLAY_ACTIVE_CLASS);
|
|
370
|
+
this.applySize(deltaSize, previousSize);
|
|
371
|
+
if (completeImmediately) {
|
|
372
|
+
this._completeResizeOperation();
|
|
356
373
|
}
|
|
357
374
|
});
|
|
358
375
|
merge(this.resizeNotifier.resizeCanceled, this.resizeNotifier.resizeCompleted)
|
|
@@ -377,7 +394,6 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
377
394
|
this.resizeRef = new ResizeRef(this.elementRef, this.overlayRef, this.tableOptions.minWidthPx, this.tableOptions.maxWidthPx, this.tableOptions.minHeightPx, this.tableOptions.maxHeightPx, () => {
|
|
378
395
|
this.updateOverlayHandleSizeAndOffset();
|
|
379
396
|
});
|
|
380
|
-
this.resizeRef.setDirection(this.isXAxisHover ? 'X' : 'Y');
|
|
381
397
|
customTokens.set(ResizeRef, this.resizeRef);
|
|
382
398
|
customTokens.set(TableCellEventDispatcher, this.eventDispatcher);
|
|
383
399
|
customTokens.set(ColumnResizeNotifierSource, this.resizeNotifier);
|
|
@@ -390,9 +406,11 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
390
406
|
}
|
|
391
407
|
updateOverlayHandleSizeAndOffset() {
|
|
392
408
|
var _a, _b;
|
|
393
|
-
(_a = this.overlayRef) === null || _a === void 0 ? void 0 : _a.removePanelClass(['the-column-resize-handle-panel',
|
|
409
|
+
(_a = this.overlayRef) === null || _a === void 0 ? void 0 : _a.removePanelClass(['the-column-resize-handle-panel', ...this.rowResizeClass]);
|
|
394
410
|
this.isXAxisHover ? this.updateOverlayHandleColumnSize() : this.updateOverlayHandleRowSize();
|
|
395
411
|
(_b = this.overlayRef) === null || _b === void 0 ? void 0 : _b.updatePositionStrategy(this.createPositionStrategy());
|
|
412
|
+
this.resizeRef.setDirection(this.isXAxisHover ? 'X' : 'Y');
|
|
413
|
+
this.resizeRef.setPosition(this.hoverdDirection);
|
|
396
414
|
}
|
|
397
415
|
updateOverlayHandleColumnSize() {
|
|
398
416
|
let height = 0;
|
|
@@ -407,8 +425,14 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
407
425
|
this.overlayRef.updateSize({ height, width: OVERLAY_INIT_SIZE });
|
|
408
426
|
}
|
|
409
427
|
updateOverlayHandleRowSize() {
|
|
410
|
-
const
|
|
411
|
-
|
|
428
|
+
const tableElement = this.tableComponent.nativeElement;
|
|
429
|
+
const rowControl = tableElement.querySelector('.the-table-row-controls');
|
|
430
|
+
let rowControlWidth = 11;
|
|
431
|
+
if (rowControl) {
|
|
432
|
+
rowControlWidth = rowControl.getBoundingClientRect().width;
|
|
433
|
+
}
|
|
434
|
+
const width = this.tableComponent.tableWrapper.nativeElement.offsetWidth + rowControlWidth;
|
|
435
|
+
this.overlayRef.addPanelClass(this.rowResizeClass);
|
|
412
436
|
this.overlayRef.updateSize({ width, height: OVERLAY_INIT_SIZE });
|
|
413
437
|
}
|
|
414
438
|
applySize(deltaSize, previousSize) {
|
|
@@ -434,7 +458,7 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
434
458
|
}
|
|
435
459
|
: {
|
|
436
460
|
height: OVERLAY_INIT_SIZE + 'px',
|
|
437
|
-
panelClass:
|
|
461
|
+
panelClass: this.rowResizeClass
|
|
438
462
|
};
|
|
439
463
|
return this.overlay.create(Object.assign({
|
|
440
464
|
// Always position the overlay based on left-indexed coordinates.
|
|
@@ -566,15 +590,13 @@ export class TheTdComponent extends TheBaseElementComponent {
|
|
|
566
590
|
this.resizingStore.storeTableHeight(rows);
|
|
567
591
|
this.resizingStore.initDirection(deltaY, this.isXAxisHover);
|
|
568
592
|
let rowIndex = this.elementRef.nativeElement.parentElement.rowIndex - 1; // subtract thead's tr
|
|
569
|
-
if (this.hoverdDirection ===
|
|
593
|
+
if (this.hoverdDirection === Position.top) {
|
|
570
594
|
rowIndex = rowIndex - 1;
|
|
571
595
|
}
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
rowIndex = rowIndex + cellRowpsan - 1;
|
|
575
|
-
}
|
|
596
|
+
const rowSpan = this.elementRef.nativeElement.rowSpan;
|
|
597
|
+
const bottomRowIndex = rowIndex + (rowSpan - 1) + 1;
|
|
576
598
|
if (deltaY > 0) {
|
|
577
|
-
this.applyBottomRows(rows, deltaY,
|
|
599
|
+
this.applyBottomRows(rows, deltaY, bottomRowIndex);
|
|
578
600
|
if (this.resizingStore.isRestoring(deltaY, this.isXAxisHover)) {
|
|
579
601
|
deltaY = this.resizingStore.restoreTopRows(deltaY);
|
|
580
602
|
}
|
|
@@ -675,4 +697,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImpo
|
|
|
675
697
|
type: ViewChild,
|
|
676
698
|
args: ['cellInner', { static: true }]
|
|
677
699
|
}] } });
|
|
678
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90ZC90ZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RkL3RkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBTVQsV0FBVyxFQUtYLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDMUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDakcsT0FBTyxFQUFFLDBCQUEwQixFQUFvQixNQUFNLDZEQUE2RCxDQUFDO0FBRTNILE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDdEgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FB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cUI7b0JBQ2xDLFNBQVMsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2lCQUNuQzsyVEFzRHlDLGVBQWU7c0JBQXBELFdBQVc7dUJBQUMsdUJBQXVCO2dCQUVQLE9BQU87c0JBQW5DLFdBQVc7dUJBQUMsY0FBYztnQkFFRSxPQUFPO3NCQUFuQyxXQUFXO3VCQUFDLGNBQWM7Z0JBRUcsT0FBTztzQkFBcEMsV0FBVzt1QkFBQyxlQUFlO2dCQUc1QixTQUFTO3NCQURSLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIE9uRGVzdHJveSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBOZ1pvbmUsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBJbmplY3RvcixcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgRUxFTUVOVF9UT19DT01QT05FTlQgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IFNMQV9UQUJMRV9DRUxMX1NFTEVDVE9SIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29uc3RhbnRzL3NlbGVjdG9yJztcbmltcG9ydCB7IFRoZVRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlUG9zaXRpb24gfSBmcm9tICcuLi8uLi91dGlscy90YWJsZS1wb3NpdGlvbic7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemluZ1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL3Jlc2l6aW5nLnN0b3JlJztcbmltcG9ydCB7IFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY29sdW1uLXJlc2l6ZS9ldmVudC1kaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLCBDb2x1bW5TaXplQWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL2NvbHVtbi1yZXNpemUtbm90aWZpZXInO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlSZWYsIFNjcm9sbERpc3BhdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwsIFBvcnRhbEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBUaGVDb2x1bW5SZXNpemVPdmVybGF5SGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL292ZXJsYXktaGFuZGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXNpemVSZWYgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL2NvbHVtbi1yZXNpemUvcmVzaXplLXJlZic7XG5pbXBvcnQgeyBjb2VyY2VDc3NQaXhlbFZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSwgZ2V0RWxlbWVudEhlaWdodCwgZ2V0RWxlbWVudFdpZHRoLCB1c2VFbGVtZW50U3R5bGUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9kb20nO1xuaW1wb3J0IHsgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3ZpZXctYmFzZSc7XG5pbXBvcnQgeyBCQVNFX0ZJTExfSEVJR0hULCBUYWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBUaGVFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL2VkaXRvcic7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY3VzdG9tLXR5cGVzJztcbmltcG9ydCB7IGdldEJhc2VIZWlnaHRGb3JSb3dzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LWJhc2UtaGVpZ2h0JztcblxuY29uc3QgT1ZFUkxBWV9BQ1RJVkVfQ0xBU1MgPSAndGhlLXJlc2l6YWJsZS1vdmVybGF5LXRodW1iLWFjdGl2ZSc7XG5jb25zdCBPVkVSTEFZX0lOSVRfU0laRSA9IDE2O1xuZXhwb3J0IGNvbnN0IFBPU0lUSU9OX01BUDogeyBba2V5OiBzdHJpbmddOiBDb25uZWN0ZWRQb3NpdGlvbiB9ID0ge1xuICAgIHRvcDoge1xuICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJ1xuICAgIH0sXG4gICAgYm90dG9tOiB7XG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICBvdmVybGF5WDogJ2NlbnRlcicsXG4gICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgIH1cbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndGRbdGhlVGRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW0NvbHVtblJlc2l6aW5nU3RvcmVdXG59KVxuZXhwb3J0IGNsYXNzIFRoZVRkQ29tcG9uZW50IGV4dGVuZHMgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQ8VGFibGVDZWxsRWxlbWVudCwgRWRpdG9yPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBkZXN0cm95JDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBwdWJsaWMgdGFibGVQb3NpdGlvbjogVGFibGVQb3NpdGlvbjtcbiAgICBwdWJsaWMgdGFibGVDb21wb25lbnQ6IFRoZVRhYmxlQ29tcG9uZW50O1xuICAgIHByb3RlY3RlZCBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcbiAgICBwdWJsaWMgaG92ZXJkRGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJztcbiAgICBwdWJsaWMgdGFibGVPcHRpb25zOiBUYWJsZU9wdGlvbnMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgcHVibGljIGNlbGxJbm5lck1pbkhlaWdodDogbnVtYmVyID0gbnVsbDtcblxuICAgIGdldCB0YWJsZVN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50YWJsZVN0b3JlO1xuICAgIH1cblxuICAgIGdldCB0YWJsZVNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlQ29tcG9uZW50LnRhYmxlU2VydmljZTtcbiAgICB9XG5cbiAgICBnZXQgZXZlbnREaXNwYXRjaGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC5ldmVudERpc3BhdGNoZXI7XG4gICAgfVxuXG4gICAgZ2V0IHJlc2l6ZU5vdGlmaWVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC5yZXNpemVOb3RpZmllcjtcbiAgICB9XG5cbiAgICBnZXQgdGhlVGFibGVXcmFwcGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlQ29tcG9uZW50LnRoZVRhYmxlV3JhcHBlcldpZHRoO1xuICAgIH1cblxuICAgIGdldCB0YWJsZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgc2Nyb2xsYWJsZUVsZW1lbnRUb3AoKSB7XG4gICAgICAgIGNvbnN0IGNka3Njcm9sbGFibGU6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnW2Nka3Njcm9sbGFibGVdJyk7XG4gICAgICAgIGlmIChjZGtzY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2Rrc2Nyb2xsYWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC13aW5kb3cuc2Nyb2xsWTtcbiAgICB9XG5cbiAgICBnZXQgc2Nyb2xsYWJsZUVsZW1lbnRMZWZ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIH1cblxuICAgIGdldCBpc1hBeGlzSG92ZXIoKSB7XG4gICAgICAgIHJldHVybiBbJ2xlZnQnLCAncmlnaHQnXS5pbmNsdWRlcyh0aGlzLmhvdmVyZERpcmVjdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGRvdFdyYXBwZXJIb3ZlcmVkOiBib29sZWFuO1xuXG4gICAgcHVibGljIHJlc2l6ZVJlZjogUmVzaXplUmVmO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5iYWNrZ3JvdW5kQ29sb3InKSBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5jb2xzcGFuJykgY29sc3BhbjogbnVtYmVyO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvd3NwYW4nKSByb3dzcGFuOiBudW1iZXI7XG5cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBkaXNwbGF5OiBzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkKCdjZWxsSW5uZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIGNlbGxJbm5lcjogRWxlbWVudFJlZjtcblxuICAgIGdldCBjZWxsSW5uZXJOYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbElubmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgb25Db250ZXh0Q2hhbmdlKCkge1xuICAgICAgICBzdXBlci5vbkNvbnRleHRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXNlU3RhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwdWJsaWMgb3ZlcmxheTogT3ZlcmxheSxcbiAgICAgICAgcHVibGljIHJlc2l6aW5nU3RvcmU6IENvbHVtblJlc2l6aW5nU3RvcmUsXG4gICAgICAgIHB1YmxpYyBzY3JvbGxEaXNwYXRjaGVyOiBTY3JvbGxEaXNwYXRjaGVyXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNkcik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMudXNlQmFja2dyb3VuZCgpO1xuICAgICAgICB0aGlzLnVzZVNwYW4oKTtcbiAgICAgICAgdGhpcy51c2VEaXNwbGF5KCk7XG4gICAgICAgIHRoaXMudXNlRm9jdXMoKTtcbiAgICAgICAgdXNlRWxlbWVudFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51c2VUYWJsZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmdldEluamVjdGlvblNlcnZpY2UoKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlU2VsZWN0ZWRDZWxsc0NoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVEYW5nZXJvdXNDZWxsc0NoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVUYWJsZUNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5DZWxsU2VsZWN0RXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkZvckNlbGxIb3ZlckV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5Gb3JSZXNpemVFdmVudHMoKTtcbiAgICAgICAgICAgIC8vIGNvbnN0IGhlaWdodCA9IHRoaXMuY2FsY3VsYXRlQ2VsbElubmVyTWluSGVpZ2h0KCk7XG4gICAgICAgICAgICAvLyB0aGlzLnVzZU1pbkhlaWdodChoZWlnaHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRJbmplY3Rpb25TZXJ2aWNlKCkge1xuICAgICAgICB0aGlzLnRhYmxlQ29tcG9uZW50ID0gRUxFTUVOVF9UT19DT01QT05FTlQuZ2V0KHRoaXMudGFibGVQb3NpdGlvbi50YWJsZSkgYXMgVGhlVGFibGVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlU2VsZWN0ZWRDZWxsc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuc2VsZWN0ZWRDZWxsc0NoYW5nZSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHggPT4ge1xuICAgICAgICAgICAgICAgIGlmICh4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0ZWQtY2VsbCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDZWxsID0geC5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHsgcm93LCBjb2wgfSkgPT4gcm93ID09PSB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKSAmJiBjb2wgPT09IHRoaXMudGFibGVQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkQ2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGVkLWNlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzZWxlY3RlZC1jZWxsJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlRGFuZ2Vyb3VzQ2VsbHNDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLmRhbmdlcm91c0NlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkYW5nZXJvdXMtY2VsbCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDZWxsID0geC5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHsgcm93LCBjb2wgfSkgPT4gcm93ID09PSB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKSAmJiBjb2wgPT09IHRoaXMudGFibGVQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkQ2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rhbmdlcm91cy1jZWxsJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGFuZ2Vyb3VzLWNlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVUYWJsZUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAudGFibGVDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VUYWJsZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgaGVpZ2h0ID0gdGhpcy5jYWxjdWxhdGVDZWxsSW5uZXJNaW5IZWlnaHQoKTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnVzZU1pbkhlaWdodChoZWlnaHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXNlU3RhdGUoKSB7XG4gICAgICAgIHRoaXMudXNlQmFja2dyb3VuZCgpO1xuICAgICAgICB0aGlzLnVzZVNwYW4oKTtcbiAgICAgICAgdGhpcy51c2VEaXNwbGF5KCk7XG4gICAgICAgIHRoaXMudXNlRm9jdXMoKTtcbiAgICAgICAgdXNlRWxlbWVudFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIHVzZVRhYmxlUG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBUaGVFZGl0b3IuZmluZFBhdGgodGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIC8vIG11c3QgYmUgcGF0aCBvZiBjZWxsJ3MgY2hpbGRyZW5cbiAgICAgICAgdGhpcy50YWJsZVBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgdGhpcy5lZGl0b3IsIHBhdGguY29uY2F0KDApKTtcbiAgICB9XG5cbiAgICB1c2VCYWNrZ3JvdW5kKCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmJhY2tncm91bmRDb2xvciAhPT0gdGhpcy5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gdGhpcy5lbGVtZW50LmJhY2tncm91bmRDb2xvciBhcyBzdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1c2VTcGFuKCkge1xuICAgICAgICB0aGlzLmNvbHNwYW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucm93c3BhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5jb2xzcGFuKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHNwYW4gPSB0aGlzLmVsZW1lbnQuY29sc3BhbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnJvd3NwYW4pIHtcbiAgICAgICAgICAgIHRoaXMucm93c3BhbiA9IHRoaXMuZWxlbWVudC5yb3dzcGFuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlQ2VsbElubmVyTWluSGVpZ2h0KCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmNvbHNwYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy50YWJsZVBvc2l0aW9uLmdldFJvd0luZGV4KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWxjdWxhdGVDb21iaW5lZFJvd3MoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0cyA9IGdldEJhc2VIZWlnaHRGb3JSb3dzKHRoaXMuZWRpdG9yLCB0aGlzLnRhYmxlQ29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gcm93SW5kZXg7IGluZGV4IDwgdGhpcy5lbGVtZW50LnJvd3NwYW4gKyByb3dJbmRleDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgKz0gaGVpZ2h0c1tpbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodCAtIEJBU0VfRklMTF9IRUlHSFQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZUNvbWJpbmVkUm93cygpIHtcbiAgICAgICAgY29uc3Qgcm93SW5kZXggPSB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKTtcbiAgICAgICAgY29uc3QgY29tYmluZWRSb3dzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVQb3NpdGlvbi50YWJsZTtcbiAgICAgICAgdGFibGUuY2hpbGRyZW4uZm9yRWFjaCgocm93LCBfcm93SW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChfcm93SW5kZXggPiByb3dJbmRleCAmJiBfcm93SW5kZXggPD0gcm93SW5kZXggKyB0aGlzLmVsZW1lbnQucm93c3Bhbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29tYmluZWQgPSByb3cuY2hpbGRyZW4uZXZlcnkoY2VsbCA9PiBjZWxsLmhpZGRlbiB8fCBjZWxsLnJvd3NwYW4gPiAxKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNDb21iaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb21iaW5lZFJvd3MucHVzaChfcm93SW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21iaW5lZFJvd3M7XG4gICAgfVxuXG4gICAgdXNlRGlzcGxheSgpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ID0gdGhpcy5lbGVtZW50LmhpZGRlbiA/ICdub25lJyA6ICcnO1xuICAgIH1cblxuICAgIHVzZUZvY3VzKCkge1xuICAgICAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2ZvY3VzZWQtY2VsbCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2ZvY3VzZWQtY2VsbCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXNlTWluSGVpZ2h0KG1pbkhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxJbm5lck1pbkhlaWdodCA9PT0gbWluSGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZWxsSW5uZXJNaW5IZWlnaHQgPSBtaW5IZWlnaHQ7XG4gICAgICAgIC8vIGlmICh0aGlzLmNlbGxJbm5lck1pbkhlaWdodCkge1xuICAgICAgICAvLyAgICAgdGhpcy5jZWxsSW5uZXJOYXRpdmVFbGVtZW50LnN0eWxlLm1pbkhlaWdodCA9IGAke3RoaXMuY2VsbElubmVyTWluSGVpZ2h0fXB4YDtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIHRoaXMuY2VsbElubmVyTmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbWluLWhlaWdodCcpO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgLy8jcmVnaW9uIGNlbGwtc2VsZWN0XG4gICAgbGlzdGVuQ2VsbFNlbGVjdEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ITtcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihlbGVtZW50LCAnbW91c2Vkb3duJylcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKGU6IE1vdXNlRXZlbnQpID0+IGUuYnV0dG9uICE9PSAyKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFNMQV9UQUJMRV9DRUxMX1NFTEVDVE9SKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNlbGwgPT4gISFjZWxsKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q2VsbFN0YXJ0KGNlbGwsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuQ2VsbE1vdXNlRXZlbnRzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbkNlbGxNb3VzZUV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgbW91c2VvdmVyT2JzZXJ2YWJsZSA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ21vdXNlb3ZlcicpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2VsbDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSA9PiAhIWNlbGwpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsT25nb2luZyhjZWxsLCB0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2V1cCcpXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENlbGxFbmQodGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlU3RvcmUuaXNDZWxsU2VsZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlQ29tcG9uZW50LnRhYmxlU2VydmljZS5vcGVuVG9vbGJhcih0aGlzLnRhYmxlU3RvcmUuZm9jdXNDZWxsRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtb3VzZW92ZXJPYnNlcnZhYmxlLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyNyZWdpb24gcmVzaXphYmxlXG4gICAgcHJpdmF0ZSBsaXN0ZW5Gb3JDZWxsSG92ZXJFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCE7XG4gICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyXG4gICAgICAgICAgICAucmVzaXplT3ZlcmxheVZpc2libGVGb3JUYWJsZUNlbGwoZWxlbWVudClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaG92ZXJlZENlbGxJbmZvID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaG92ZXJlZENlbGxJbmZvICYmIGhvdmVyZWRDZWxsSW5mby5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhvdmVyZERpcmVjdGlvbiA9IGhvdmVyZWRDZWxsSW5mby5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZmlyc3QgY29sdW1uIHNob3VsZCBub3QgaGF2ZSBsZWZ0IHJlc2l6ZSBoYW5kbGVcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1hBeGlzSG92ZXIgJiYgdGhpcy5ob3ZlcmREaXJlY3Rpb24gPT09ICdsZWZ0JyAmJiB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1hBeGlzSG92ZXIgJiYgdGhpcy5ob3ZlcmREaXJlY3Rpb24gPT09ICdib3R0b20nICYmIHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhvdmVyZWRDZWxsSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5fY3JlYXRlT3ZlcmxheUZvckhhbmRsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd0hhbmRsZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzaXplUmVmLnNldERpcmVjdGlvbih0aGlzLmlzWEF4aXNIb3ZlciA/ICdYJyA6ICdZJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU92ZXJsYXlIYW5kbGVTaXplQW5kT2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsaXN0ZW5Gb3JSZXNpemVFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IHRha2VVbnRpbERlc3Ryb3llZCA9IHRha2VVbnRpbDxDb2x1bW5TaXplQWN0aW9uPih0aGlzLmRlc3Ryb3kkKTtcblxuICAgICAgICBtZXJnZSh0aGlzLnJlc2l6ZU5vdGlmaWVyLnJlc2l6ZUNhbmNlbGVkLCB0aGlzLnJlc2l6ZU5vdGlmaWVyLnRyaWdnZXJSZXNpemUpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQsXG4gICAgICAgICAgICAgICAgZmlsdGVyKGNvbHVtblNpemUgPT4gY29sdW1uU2l6ZS50YWJsZUNlbGwgPT09IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBkZWx0YVNpemUsIHByZXZpb3VzU2l6ZSwgY29tcGxldGVJbW1lZGlhdGVseSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB0b3AsIGxlZnQsIGhlaWdodCwgd2lkdGggfSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY2xpZW50WSwgY2xpZW50WCB9ID0gZXZlbnQgYXMgTW91c2VFdmVudDtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcHBseVNpemUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1hBeGlzSG92ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbFdpZHRoID0gdGhpcy5ob3ZlcmREaXJlY3Rpb24gPT09ICdsZWZ0JyA/IDAgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaXNBcHBseVNpemUgPSBkZWx0YVNpemUgPiAwICYmIGxlZnQgKyBjZWxsV2lkdGggLSBjbGllbnRYIDw9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbEhlaWdodCA9IHRoaXMuaG92ZXJkRGlyZWN0aW9uID09PSAnYm90dG9tJyA/IDAgOiBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGlzQXBwbHlTaXplID0gZGVsdGFTaXplID4gMCAmJiB0b3AgKyBjZWxsSGVpZ2h0IC0gY2xpZW50WSA8PSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNBcHBseVNpemUgfHwgZGVsdGFTaXplIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCEuY2xhc3NMaXN0LmFkZChPVkVSTEFZX0FDVElWRV9DTEFTUyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTaXplKGRlbHRhU2l6ZSwgcHJldmlvdXNTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlSW1tZWRpYXRlbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBsZXRlUmVzaXplT3BlcmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBtZXJnZSh0aGlzLnJlc2l6ZU5vdGlmaWVyLnJlc2l6ZUNhbmNlbGVkLCB0aGlzLnJlc2l6ZU5vdGlmaWVyLnJlc2l6ZUNvbXBsZXRlZClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoY29sdW1uU2l6ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYW5VcEFmdGVyUmVzaXplKGNvbHVtblNpemUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5jbGVhblJlc2l6aW5nKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb21wbGV0ZVJlc2l6ZU9wZXJhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplTm90aWZpZXIucmVzaXplQ29tcGxldGVkLm5leHQoe1xuICAgICAgICAgICAgICAgIHRhYmxlQ2VsbDogdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jbGVhblVwQWZ0ZXJSZXNpemUoY29sdW1uU2l6ZTogQ29sdW1uU2l6ZUFjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCEuY2xhc3NMaXN0LnJlbW92ZShPVkVSTEFZX0FDVElWRV9DTEFTUyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlSGFuZGxlUG9ydGFsKCk6IENvbXBvbmVudFBvcnRhbDxUaGVDb2x1bW5SZXNpemVPdmVybGF5SGFuZGxlQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbVRva2VucyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmID0gbmV3IFJlc2l6ZVJlZihcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZixcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiEsXG4gICAgICAgICAgICB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4LFxuICAgICAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMubWF4V2lkdGhQeCxcbiAgICAgICAgICAgIHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4LFxuICAgICAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMubWF4SGVpZ2h0UHgsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlc2l6ZVJlZi5zZXREaXJlY3Rpb24odGhpcy5pc1hBeGlzSG92ZXIgPyAnWCcgOiAnWScpO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KFJlc2l6ZVJlZiwgdGhpcy5yZXNpemVSZWYpO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciwgdGhpcy5ldmVudERpc3BhdGNoZXIpO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLCB0aGlzLnJlc2l6ZU5vdGlmaWVyKTtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBuZXcgUG9ydGFsSW5qZWN0b3IodGhpcy5pbmplY3RvciwgY3VzdG9tVG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRQb3J0YWwoVGhlQ29sdW1uUmVzaXplT3ZlcmxheUhhbmRsZUNvbXBvbmVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmLCBpbmplY3Rvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvd0hhbmRsZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEuYXR0YWNoKHRoaXMuX2NyZWF0ZUhhbmRsZVBvcnRhbCgpKS5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3ZlcmxheUhhbmRsZVNpemVBbmRPZmZzZXQoKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZj8ucmVtb3ZlUGFuZWxDbGFzcyhbJ3RoZS1jb2x1bW4tcmVzaXplLWhhbmRsZS1wYW5lbCcsICd0aGUtcm93LXJlc2l6ZS1oYW5kbGUtcGFuZWwnXSk7XG4gICAgICAgIHRoaXMuaXNYQXhpc0hvdmVyID8gdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlQ29sdW1uU2l6ZSgpIDogdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlUm93U2l6ZSgpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWY/LnVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5jcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3ZlcmxheUhhbmRsZUNvbHVtblNpemUoKSB7XG4gICAgICAgIGxldCBoZWlnaHQgPSAwO1xuICAgICAgICBjb25zdCB0YWJsZUVsZW1lbnRUb3AgPSB0aGlzLnRhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgIGlmICh0YWJsZUVsZW1lbnRUb3AgPCB0aGlzLnNjcm9sbGFibGVFbGVtZW50VG9wKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLnRhYmxlRWxlbWVudC5vZmZzZXRIZWlnaHQgLSAodGhpcy5zY3JvbGxhYmxlRWxlbWVudFRvcCAtIHRhYmxlRWxlbWVudFRvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLnRhYmxlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmIS5hZGRQYW5lbENsYXNzKCd0aGUtY29sdW1uLXJlc2l6ZS1oYW5kbGUtcGFuZWwnKTtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmIS51cGRhdGVTaXplKHsgaGVpZ2h0LCB3aWR0aDogT1ZFUkxBWV9JTklUX1NJWkUgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVPdmVybGF5SGFuZGxlUm93U2l6ZSgpIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnRhYmxlQ29tcG9uZW50LnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgMTE7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEuYWRkUGFuZWxDbGFzcygndGhlLXJvdy1yZXNpemUtaGFuZGxlLXBhbmVsJyk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEudXBkYXRlU2l6ZSh7IHdpZHRoLCBoZWlnaHQ6IE9WRVJMQVlfSU5JVF9TSVpFIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlTaXplKGRlbHRhU2l6ZTogbnVtYmVyLCBwcmV2aW91c1NpemU/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgLy8gdXBkYXRlIGNvbCB3aWR0aCBhbmQgdGFibGUgd2lkdGhcbiAgICAgICAgaWYgKHRoaXMuaXNYQXhpc0hvdmVyKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q29sdW1uU2l6ZShkZWx0YVNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBseVJvd1NpemUoZGVsdGFTaXplKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlQ29tcG9uZW50LnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgIHRoaXMudGFibGVDb21wb25lbnQuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZU92ZXJsYXlIYW5kbGVTaXplQW5kT2Zmc2V0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlT3ZlcmxheUZvckhhbmRsZSgpOiBPdmVybGF5UmVmIHtcbiAgICAgICAgLy8gVXNlIG9mIG92ZXJsYXlzIGFsbG93cyB1cyB0byBwcm9wZXJseSBjYXB0dXJlIGNsaWNrIGV2ZW50cyBzcGFubmluZyBwYXJ0c1xuICAgICAgICAvLyBvZiB0d28gdGFibGUgY2VsbHMgYW5kIGlzIGFsc28gdXNlZnVsIGZvciBkaXNwbGF5aW5nIGEgcmVzaXplIHRodW1iXG4gICAgICAgIC8vIG92ZXIgYm90aCBjZWxscyBhbmQgZXh0ZW5kaW5nIGl0IGRvd24gdGhlIHRhYmxlIGFzIG5lZWRlZC5cbiAgICAgICAgY29uc3Qgb3ZlcmxheU9wdGlvbiA9IHRoaXMuaXNYQXhpc0hvdmVyXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBPVkVSTEFZX0lOSVRfU0laRSArICdweCcsXG4gICAgICAgICAgICAgICAgICBwYW5lbENsYXNzOiAndGhlLWNvbHVtbi1yZXNpemUtaGFuZGxlLXBhbmVsJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogT1ZFUkxBWV9JTklUX1NJWkUgKyAncHgnLFxuICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogJ3RoZS1yb3ctcmVzaXplLWhhbmRsZS1wYW5lbCdcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheS5jcmVhdGUoe1xuICAgICAgICAgICAgLy8gQWx3YXlzIHBvc2l0aW9uIHRoZSBvdmVybGF5IGJhc2VkIG9uIGxlZnQtaW5kZXhlZCBjb29yZGluYXRlcy5cbiAgICAgICAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgICAgICAgIC4uLm92ZXJsYXlPcHRpb25cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCkge1xuICAgICAgICBsZXQgb2Zmc2V0WSA9IHRoaXMuY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFkoKTtcbiAgICAgICAgbGV0IG9mZnNldFggPSB0aGlzLmNhbGN1bGF0ZU92ZXJsYXlIYW5kbGVPZmZzZXRYKCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHRoaXMuaXNYQXhpc0hvdmVyXG4gICAgICAgICAgICA/IHsgLi4uUE9TSVRJT05fTUFQW3RoaXMuaG92ZXJkRGlyZWN0aW9uXSwgb2Zmc2V0WSB9XG4gICAgICAgICAgICA6IHsgLi4uUE9TSVRJT05fTUFQW3RoaXMuaG92ZXJkRGlyZWN0aW9uXSwgb2Zmc2V0WCB9O1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgICAgICAgIC53aXRoR3Jvd0FmdGVyT3BlbihmYWxzZSlcbiAgICAgICAgICAgIC53aXRoUHVzaChmYWxzZSlcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtwb3NpdGlvbl0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFkoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudFRvcCA9IHRoaXMudGFibGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgaWYgKHRhYmxlRWxlbWVudFRvcCA8IHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRUb3ApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGFibGVFbGVtZW50VG9wIC0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRWxlbWVudFRvcCAtIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFgoKSB7XG4gICAgICAgIGNvbnN0IGNlbGxFbGVtZW50TGVmdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudExlZnQgPSB0aGlzLnRhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgICAgICByZXR1cm4gdGFibGVFbGVtZW50TGVmdCAtIGNlbGxFbGVtZW50TGVmdCArIHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRMZWZ0O1xuICAgIH1cblxuICAgIGFwcGx5Q29sdW1uU2l6ZShkZWx0YVg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb2xzID0gWy4uLnRoaXMudGFibGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NvbGdyb3VwJykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZUNvbEVsZW1lbnRbXTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlVGFibGVXaWR0aChjb2xzKTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLmluaXREaXJlY3Rpb24oZGVsdGFYKTtcbiAgICAgICAgbGV0IGNlbGxJbmRleCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNlbGxJbmRleDtcbiAgICAgICAgaWYgKHRoaXMuaG92ZXJkRGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGNlbGxJbmRleCA9IGNlbGxJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sc3BhbiA9ICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJykgfHwgMTtcbiAgICAgICAgY2VsbEluZGV4ID0gY2VsbEluZGV4ICsgKGNvbHNwYW4gYXMgbnVtYmVyKSAvIDEgLSAxO1xuICAgICAgICBpZiAoZGVsdGFYID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHBseVJpZ2h0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCArIDEpO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXppbmdTdG9yZS5pc1Jlc3RvcmluZyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVMZWZ0Q29scyhkZWx0YVgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbHRhWCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb2xzW2NlbGxJbmRleF0uc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShjb2xzW2NlbGxJbmRleF0uc3R5bGUud2lkdGgpICsgZGVsdGFYKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRDb2wgPSBjb2xzW2NlbGxJbmRleCArIDFdO1xuICAgICAgICAgICAgaWYgKG5leHRDb2wpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdERlbHRhWCA9IHRoaXMucmVzaXppbmdTdG9yZS5nZXRTY3JvbGxXaWR0aChkZWx0YVgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kZWx0YSA9IHRoaXMuYXBwbHlMZWZ0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKF9kZWx0YSA9PT0gZGVsdGFYKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBub3QgcmVzaXplXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gZGVsdGFYIC0gX2RlbHRhO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6aW5nU3RvcmUuaXNSZXN0b3JpbmcoZGVsdGFYKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdERlbHRhWCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnREZWx0YVggPSB0aGlzLnJlc2l6aW5nU3RvcmUucmVzdG9yZVJpZ2h0Q29scyhsZWZ0RGVsdGFYKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdERlbHRhWCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDb2wuc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGdldEVsZW1lbnRXaWR0aChuZXh0Q29sKSArIE1hdGguYWJzKGxlZnREZWx0YVgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRDb2wuc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGdldEVsZW1lbnRXaWR0aChuZXh0Q29sKSArIE1hdGguYWJzKGRlbHRhWCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSBnZXRFbGVtZW50V2lkdGgodGhpcy50YWJsZUVsZW1lbnQpIC0gdGhpcy50aGVUYWJsZVdyYXBwZXJXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsV2lkdGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY3JvbGxXaWR0aCA+IE1hdGguYWJzKGRlbHRhWCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlMZWZ0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5TGVmdENvbHMoY29scywgLXNjcm9sbFdpZHRoLCBjZWxsSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlMZWZ0Q29scyhjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10sIGRlbHRhWDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgd2hpbGUgKGRlbHRhWCA8IDAgJiYgY29sc1tjb2xJbmRleF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IGdldEVsZW1lbnRXaWR0aChjb2xzW2NvbEluZGV4XSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoID4gdGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6aW5nU3RvcmUuaXNSZXNpemluZyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5zdG9yZVJlc2l6aW5nQ29sKGNvbHNbY29sSW5kZXhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHggKyBNYXRoLmFicyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHNbY29sSW5kZXhdLnN0eWxlLndpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjdXJyZW50V2lkdGggLSBNYXRoLmFicyhkZWx0YVgpKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVggKz0gY3VycmVudFdpZHRoIC0gdGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeDtcbiAgICAgICAgICAgICAgICAgICAgY29sc1tjb2xJbmRleF0uc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbHRhWDtcbiAgICB9XG5cbiAgICBhcHBseVJpZ2h0Q29scyhjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10sIGRlbHRhWDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHdoaWxlIChkZWx0YVggPiAwICYmIGNvbHNbY29sSW5kZXhdKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50V2lkdGggPSBnZXRFbGVtZW50V2lkdGgoY29sc1tjb2xJbmRleF0pO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFYKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6aW5nU3RvcmUuc3RvcmVSZXNpemluZ0NvbChjb2xzW2NvbEluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50V2lkdGggPiBkZWx0YVggKyB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHNbY29sSW5kZXhdLnN0eWxlLndpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjdXJyZW50V2lkdGggLSBkZWx0YVgpO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWCAtPSBjdXJyZW50V2lkdGggLSB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4O1xuICAgICAgICAgICAgICAgICAgICBjb2xzW2NvbEluZGV4XS5zdHlsZS53aWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUodGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsdGFYO1xuICAgIH1cblxuICAgIGFwcGx5Um93U2l6ZShkZWx0YVk6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCByb3dzID0gWy4uLnRoaXMudGFibGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRbXTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlVGFibGVIZWlnaHQocm93cyk7XG4gICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5pbml0RGlyZWN0aW9uKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpO1xuICAgICAgICBsZXQgcm93SW5kZXggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnJvd0luZGV4IC0gMTsgLy8gc3VidHJhY3QgdGhlYWQncyB0clxuXG4gICAgICAgIGlmICh0aGlzLmhvdmVyZERpcmVjdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2VsbFJvd3BzYW4gPSAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQpLnJvd1NwYW47XG4gICAgICAgICAgICByb3dJbmRleCA9IHJvd0luZGV4ICsgY2VsbFJvd3BzYW4gLSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Qm90dG9tUm93cyhyb3dzLCBkZWx0YVksIHJvd0luZGV4ICsgMSk7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzdG9yaW5nKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFZID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVUb3BSb3dzKGRlbHRhWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBpbml0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShpbml0SGVpZ2h0ICsgZGVsdGFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhZGREZWx0YVkgPSB0aGlzLnJlc2l6aW5nU3RvcmUuZ2V0QWRkVGFibGVIZWlnaHQoZGVsdGFZKTtcbiAgICAgICAgICAgIGNvbnN0IF9kZWx0YSA9IHRoaXMuYXBwbHlUb3BSb3dzKHJvd3MsIGRlbHRhWSwgcm93SW5kZXgpO1xuICAgICAgICAgICAgaWYgKF9kZWx0YSA9PT0gZGVsdGFZKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FuIG5vdCByZXNpemVcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWx0YVkgPSBkZWx0YVkgLSBfZGVsdGE7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzdG9yaW5nKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFkZERlbHRhWSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVCb3R0b21Sb3dzKGRlbHRhWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlUb3BSb3dzKHJvd3M6IEhUTUxUYWJsZVJvd0VsZW1lbnRbXSwgZGVsdGFZOiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB3aGlsZSAoZGVsdGFZIDwgMCAmJiByb3dzW3Jvd0luZGV4XSkge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICBjb25zdCByb3dTdHlsZUhlaWdodCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShyb3dzW3Jvd0luZGV4XS5zdHlsZS5oZWlnaHQpO1xuICAgICAgICAgICAgaWYgKHJvd09mZnNldEhlaWdodCA+IHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4ICYmIHJvd09mZnNldEhlaWdodCA9PT0gcm93U3R5bGVIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFZLCB0aGlzLmlzWEF4aXNIb3ZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlUmVzaXppbmdSb3cocm93c1tyb3dJbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHggKyBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd3Nbcm93SW5kZXhdLnN0eWxlLmhlaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUocm93T2Zmc2V0SGVpZ2h0IC0gTWF0aC5hYnMoZGVsdGFZKSk7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFZICs9IHJvd09mZnNldEhlaWdodCAtIHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4O1xuICAgICAgICAgICAgICAgICAgICByb3dzW3Jvd0luZGV4XS5zdHlsZS5oZWlnaHQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dJbmRleC0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWx0YVk7XG4gICAgfVxuXG4gICAgYXBwbHlCb3R0b21Sb3dzKHJvd3M6IEhUTUxUYWJsZVJvd0VsZW1lbnRbXSwgZGVsdGFZOiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB3aGlsZSAocm93c1tyb3dJbmRleF0gJiYgZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICBjb25zdCByb3dTdHlsZUhlaWdodCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShyb3dzW3Jvd0luZGV4XS5zdHlsZS5oZWlnaHQpO1xuICAgICAgICAgICAgaWYgKHJvd09mZnNldEhlaWdodCA+IHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4ICYmIHJvd09mZnNldEhlaWdodCA9PT0gcm93U3R5bGVIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFZLCB0aGlzLmlzWEF4aXNIb3ZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlUmVzaXppbmdSb3cocm93c1tyb3dJbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gZGVsdGFZICsgdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHgpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShyb3dPZmZzZXRIZWlnaHQgLSBkZWx0YVkpO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWSAtPSByb3dPZmZzZXRIZWlnaHQgLSB0aGlzLnRhYmxlT3B0aW9ucy5taW5IZWlnaHRQeDtcbiAgICAgICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh0aGlzLnRhYmxlT3B0aW9ucy5taW5IZWlnaHRQeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsdGFZO1xuICAgIH1cblxuICAgIC8vI3JlZ2lvblxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgI2NlbGxJbm5lcj5cbiAgICA8c2xhdGUtY2hpbGRyZW4gW2NoaWxkcmVuXT1cImNoaWxkcmVuXCIgW2NvbnRleHRdPVwiY2hpbGRyZW5Db250ZXh0XCIgW3ZpZXdDb250ZXh0XT1cInZpZXdDb250ZXh0XCI+PC9zbGF0ZS1jaGlsZHJlbj5cbjwvZGl2PlxuIl19
|
|
700
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90ZC90ZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RkL3RkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBTVQsV0FBVyxFQUtYLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSwwQkFBMEIsRUFBb0IsTUFBTSw2REFBNkQsQ0FBQztBQUUzSCxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ3RILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFB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VztvQkFDckIsV0FBVyxFQUFFLHFCQUFxQjtvQkFDbEMsU0FBUyxFQUFFLENBQUMsbUJBQW1CLENBQUM7aUJBQ25DOzJUQStEeUMsZUFBZTtzQkFBcEQsV0FBVzt1QkFBQyx1QkFBdUI7Z0JBRVAsT0FBTztzQkFBbkMsV0FBVzt1QkFBQyxjQUFjO2dCQUVFLE9BQU87c0JBQW5DLFdBQVc7dUJBQUMsY0FBYztnQkFFRyxPQUFPO3NCQUFwQyxXQUFXO3VCQUFDLGVBQWU7Z0JBRzVCLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgT25EZXN0cm95LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIE5nWm9uZSxcbiAgICBIb3N0QmluZGluZyxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEluamVjdG9yLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBFTEVNRU5UX1RPX0NPTVBPTkVOVCB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IgfSBmcm9tICcuLi8uLi8uLi8uLi9jb25zdGFudHMvc2VsZWN0b3InO1xuaW1wb3J0IHsgVGhlVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi90YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVQb3NpdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL3RhYmxlLXBvc2l0aW9uJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbHVtblJlc2l6aW5nU3RvcmUgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL2NvbHVtbi1yZXNpemUvcmVzaXppbmcuc3RvcmUnO1xuaW1wb3J0IHsgUG9zaXRpb24sIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY29sdW1uLXJlc2l6ZS9ldmVudC1kaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLCBDb2x1bW5TaXplQWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL2NvbHVtbi1yZXNpemUtbm90aWZpZXInO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlSZWYsIFNjcm9sbERpc3BhdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwsIFBvcnRhbEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBUaGVDb2x1bW5SZXNpemVPdmVybGF5SGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL292ZXJsYXktaGFuZGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXNpemVSZWYgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL2NvbHVtbi1yZXNpemUvcmVzaXplLXJlZic7XG5pbXBvcnQgeyBjb2VyY2VDc3NQaXhlbFZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSwgZ2V0RWxlbWVudEhlaWdodCwgZ2V0RWxlbWVudFdpZHRoLCB1c2VFbGVtZW50U3R5bGUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9kb20nO1xuaW1wb3J0IHsgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3ZpZXctYmFzZSc7XG5pbXBvcnQgeyBCQVNFX0ZJTExfSEVJR0hULCBUYWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBUaGVFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL2VkaXRvcic7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY3VzdG9tLXR5cGVzJztcbmltcG9ydCB7IGdldEJhc2VIZWlnaHRGb3JSb3dzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LWJhc2UtaGVpZ2h0JztcblxuY29uc3QgT1ZFUkxBWV9BQ1RJVkVfQ0xBU1MgPSAndGhlLXJlc2l6YWJsZS1vdmVybGF5LXRodW1iLWFjdGl2ZSc7XG5jb25zdCBPVkVSTEFZX0lOSVRfU0laRSA9IDE2O1xuZXhwb3J0IGNvbnN0IFBPU0lUSU9OX01BUDogeyBba2V5OiBzdHJpbmddOiBDb25uZWN0ZWRQb3NpdGlvbiB9ID0ge1xuICAgIHRvcDoge1xuICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJ1xuICAgIH0sXG4gICAgYm90dG9tOiB7XG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICBvdmVybGF5WDogJ2NlbnRlcicsXG4gICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgIH1cbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndGRbdGhlVGRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW0NvbHVtblJlc2l6aW5nU3RvcmVdXG59KVxuZXhwb3J0IGNsYXNzIFRoZVRkQ29tcG9uZW50IGV4dGVuZHMgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQ8VGFibGVDZWxsRWxlbWVudCwgRWRpdG9yPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBkZXN0cm95JDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBwdWJsaWMgdGFibGVQb3NpdGlvbjogVGFibGVQb3NpdGlvbjtcbiAgICBwdWJsaWMgdGFibGVDb21wb25lbnQ6IFRoZVRhYmxlQ29tcG9uZW50O1xuICAgIHByb3RlY3RlZCBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcbiAgICBwdWJsaWMgaG92ZXJkRGlyZWN0aW9uOiBQb3NpdGlvbiB8IG51bGw7XG4gICAgcHVibGljIHRhYmxlT3B0aW9uczogVGFibGVPcHRpb25zID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgIHB1YmxpYyBjZWxsSW5uZXJNaW5IZWlnaHQ6IG51bWJlciA9IG51bGw7XG5cbiAgICBnZXQgdGFibGVTdG9yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVDb21wb25lbnQudGFibGVTdG9yZTtcbiAgICB9XG5cbiAgICBnZXQgdGFibGVTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50YWJsZVNlcnZpY2U7XG4gICAgfVxuXG4gICAgZ2V0IGV2ZW50RGlzcGF0Y2hlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVDb21wb25lbnQuZXZlbnREaXNwYXRjaGVyO1xuICAgIH1cblxuICAgIGdldCByZXNpemVOb3RpZmllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVDb21wb25lbnQucmVzaXplTm90aWZpZXI7XG4gICAgfVxuXG4gICAgZ2V0IHRoZVRhYmxlV3JhcHBlcldpZHRoKCkge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMudGFibGVDb21wb25lbnQubmF0aXZlRWxlbWVudC5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YWJsZUNvbnRhaW5lcilbJ3BhZGRpbmdMZWZ0J10pO1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50aGVUYWJsZVdyYXBwZXJXaWR0aCAtIHBhZGRpbmdMZWZ0O1xuICAgIH1cblxuICAgIGdldCB0YWJsZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgc2Nyb2xsYWJsZUVsZW1lbnRUb3AoKSB7XG4gICAgICAgIGNvbnN0IGNka3Njcm9sbGFibGU6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnW2Nka3Njcm9sbGFibGVdJyk7XG4gICAgICAgIGlmIChjZGtzY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2Rrc2Nyb2xsYWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC13aW5kb3cuc2Nyb2xsWTtcbiAgICB9XG5cbiAgICBnZXQgc2Nyb2xsYWJsZUVsZW1lbnRMZWZ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIH1cblxuICAgIGdldCBpc1hBeGlzSG92ZXIoKSB7XG4gICAgICAgIHJldHVybiBbUG9zaXRpb24ubGVmdCwgUG9zaXRpb24ucmlnaHRdLmluY2x1ZGVzKHRoaXMuaG92ZXJkRGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICBnZXQgcm93UmVzaXplQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAndGhlLXJvdy1yZXNpemUtaGFuZGxlLXBhbmVsJyxcbiAgICAgICAgICAgIHRoaXMudGFibGVQb3NpdGlvbi50YWJsZSAmJiB0aGlzLnRhYmxlUG9zaXRpb24udGFibGUub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gPyAndGhlLW51bWJlcmVkLXJlc2l6ZS1oYW5kbGUtcGFuZWwnIDogJydcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZG90V3JhcHBlckhvdmVyZWQ6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgcmVzaXplUmVmOiBSZXNpemVSZWY7XG5cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmJhY2tncm91bmRDb2xvcicpIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmNvbHNwYW4nKSBjb2xzcGFuOiBudW1iZXI7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm93c3BhbicpIHJvd3NwYW46IG51bWJlcjtcblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpIGRpc3BsYXk6IHN0cmluZztcblxuICAgIEBWaWV3Q2hpbGQoJ2NlbGxJbm5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgY2VsbElubmVyOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGNlbGxJbm5lck5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsSW5uZXIubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBvbkNvbnRleHRDaGFuZ2UoKSB7XG4gICAgICAgIHN1cGVyLm9uQ29udGV4dENoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy51c2VTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHB1YmxpYyBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHB1YmxpYyBvdmVybGF5OiBPdmVybGF5LFxuICAgICAgICBwdWJsaWMgcmVzaXppbmdTdG9yZTogQ29sdW1uUmVzaXppbmdTdG9yZSxcbiAgICAgICAgcHVibGljIHNjcm9sbERpc3BhdGNoZXI6IFNjcm9sbERpc3BhdGNoZXJcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2RyKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy51c2VCYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMudXNlU3BhbigpO1xuICAgICAgICB0aGlzLnVzZURpc3BsYXkoKTtcbiAgICAgICAgdGhpcy51c2VGb2N1cygpO1xuICAgICAgICB1c2VFbGVtZW50U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVzZVRhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5qZWN0aW9uU2VydmljZSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVTZWxlY3RlZENlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZURhbmdlcm91c0NlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkNlbGxTZWxlY3RFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuRm9yQ2VsbEhvdmVyRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkZvclJlc2l6ZUV2ZW50cygpO1xuICAgICAgICAgICAgLy8gY29uc3QgaGVpZ2h0ID0gdGhpcy5jYWxjdWxhdGVDZWxsSW5uZXJNaW5IZWlnaHQoKTtcbiAgICAgICAgICAgIC8vIHRoaXMudXNlTWluSGVpZ2h0KGhlaWdodCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEluamVjdGlvblNlcnZpY2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVDb21wb25lbnQgPSBFTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQodGhpcy50YWJsZVBvc2l0aW9uLnRhYmxlKSBhcyBUaGVUYWJsZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVTZWxlY3RlZENlbGxzQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5zZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzZWxlY3RlZC1jZWxsJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZENlbGwgPSB4LnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAoeyByb3csIGNvbCB9KSA9PiByb3cgPT09IHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpICYmIGNvbCA9PT0gdGhpcy50YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0ZWQtY2VsbCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGVkLWNlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVEYW5nZXJvdXNDZWxsc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuZGFuZ2Vyb3VzQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoeC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rhbmdlcm91cy1jZWxsJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZENlbGwgPSB4LnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAoeyByb3csIGNvbCB9KSA9PiByb3cgPT09IHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpICYmIGNvbCA9PT0gdGhpcy50YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGFuZ2Vyb3VzLWNlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkYW5nZXJvdXMtY2VsbCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1YnNjcmliZVRhYmxlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC50YWJsZUNoYW5nZSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVRhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBoZWlnaHQgPSB0aGlzLmNhbGN1bGF0ZUNlbGxJbm5lck1pbkhlaWdodCgpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMudXNlTWluSGVpZ2h0KGhlaWdodCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1c2VTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy51c2VCYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMudXNlU3BhbigpO1xuICAgICAgICB0aGlzLnVzZURpc3BsYXkoKTtcbiAgICAgICAgdGhpcy51c2VGb2N1cygpO1xuICAgICAgICB1c2VFbGVtZW50U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgdXNlVGFibGVQb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IFRoZUVkaXRvci5maW5kUGF0aCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgLy8gbXVzdCBiZSBwYXRoIG9mIGNlbGwncyBjaGlsZHJlblxuICAgICAgICB0aGlzLnRhYmxlUG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCB0aGlzLmVkaXRvciwgcGF0aC5jb25jYXQoMCkpO1xuICAgIH1cblxuICAgIHVzZUJhY2tncm91bmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yICE9PSB0aGlzLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVzZVNwYW4oKSB7XG4gICAgICAgIHRoaXMuY29sc3BhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yb3dzcGFuID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmNvbHNwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuY29sc3BhbiA9IHRoaXMuZWxlbWVudC5jb2xzcGFuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQucm93c3Bhbikge1xuICAgICAgICAgICAgdGhpcy5yb3dzcGFuID0gdGhpcy5lbGVtZW50LnJvd3NwYW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxjdWxhdGVDZWxsSW5uZXJNaW5IZWlnaHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY29sc3Bhbikge1xuICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGN1bGF0ZUNvbWJpbmVkUm93cygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHRzID0gZ2V0QmFzZUhlaWdodEZvclJvd3ModGhpcy5lZGl0b3IsIHRoaXMudGFibGVDb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSByb3dJbmRleDsgaW5kZXggPCB0aGlzLmVsZW1lbnQucm93c3BhbiArIHJvd0luZGV4OyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCArPSBoZWlnaHRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IC0gQkFTRV9GSUxMX0hFSUdIVDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlQ29tYmluZWRSb3dzKCkge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpO1xuICAgICAgICBjb25zdCBjb21iaW5lZFJvd3M6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZVBvc2l0aW9uLnRhYmxlO1xuICAgICAgICB0YWJsZS5jaGlsZHJlbi5mb3JFYWNoKChyb3csIF9yb3dJbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKF9yb3dJbmRleCA+IHJvd0luZGV4ICYmIF9yb3dJbmRleCA8PSByb3dJbmRleCArIHRoaXMuZWxlbWVudC5yb3dzcGFuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb21iaW5lZCA9IHJvdy5jaGlsZHJlbi5ldmVyeShjZWxsID0+IGNlbGwuaGlkZGVuIHx8IGNlbGwucm93c3BhbiA+IDEpO1xuICAgICAgICAgICAgICAgIGlmIChpc0NvbWJpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkUm93cy5wdXNoKF9yb3dJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkUm93cztcbiAgICB9XG5cbiAgICB1c2VEaXNwbGF5KCkge1xuICAgICAgICB0aGlzLmRpc3BsYXkgPSB0aGlzLmVsZW1lbnQuaGlkZGVuID8gJ25vbmUnIDogJyc7XG4gICAgfVxuXG4gICAgdXNlRm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZm9jdXNlZC1jZWxsJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZm9jdXNlZC1jZWxsJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1c2VNaW5IZWlnaHQobWluSGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VsbElubmVyTWluSGVpZ2h0ID09PSBtaW5IZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNlbGxJbm5lck1pbkhlaWdodCA9IG1pbkhlaWdodDtcbiAgICAgICAgLy8gaWYgKHRoaXMuY2VsbElubmVyTWluSGVpZ2h0KSB7XG4gICAgICAgIC8vICAgICB0aGlzLmNlbGxJbm5lck5hdGl2ZUVsZW1lbnQuc3R5bGUubWluSGVpZ2h0ID0gYCR7dGhpcy5jZWxsSW5uZXJNaW5IZWlnaHR9cHhgO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgdGhpcy5jZWxsSW5uZXJOYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtaW4taGVpZ2h0Jyk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICAvLyNyZWdpb24gY2VsbC1zZWxlY3RcbiAgICBsaXN0ZW5DZWxsU2VsZWN0RXZlbnRzKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQhO1xuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGVsZW1lbnQsICdtb3VzZWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogTW91c2VFdmVudCkgPT4gZS5idXR0b24gIT09IDIpLFxuICAgICAgICAgICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGw7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY2VsbCA9PiAhIWNlbGwpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsU3RhcnQoY2VsbCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5DZWxsTW91c2VFdmVudHMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuQ2VsbE1vdXNlRXZlbnRzKCkge1xuICAgICAgICBjb25zdCBtb3VzZW92ZXJPYnNlcnZhYmxlID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2VvdmVyJylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpID0+ICEhY2VsbClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENlbGxPbmdvaW5nKGNlbGwsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZXVwJylcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q2VsbEVuZCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVTdG9yZS5pc0NlbGxTZWxlY3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVDb21wb25lbnQudGFibGVTZXJ2aWNlLm9wZW5Ub29sYmFyKHRoaXMudGFibGVTdG9yZS5mb2N1c0NlbGxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vdXNlb3Zlck9ic2VydmFibGUudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vI3JlZ2lvbiByZXNpemFibGVcbiAgICBwcml2YXRlIGxpc3RlbkZvckNlbGxIb3ZlckV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ITtcbiAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXJcbiAgICAgICAgICAgIC5yZXNpemVPdmVybGF5VmlzaWJsZUZvclRhYmxlQ2VsbChlbGVtZW50KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIG1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOemgeatouesrOS4gOWIl+W3puS+p1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUucG9zaXRpb24gPT09IFBvc2l0aW9uLmxlZnQgJiYgdGhpcy50YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIOemgeatouesrOS4gOihjOmhtumDqFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUucG9zaXRpb24gPT09IFBvc2l0aW9uLnRvcCAmJiB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGhvdmVyZWRDZWxsSW5mbyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhvdmVyZWRDZWxsSW5mbyAmJiBob3ZlcmVkQ2VsbEluZm8ucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3ZlcmREaXJlY3Rpb24gPSBob3ZlcmVkQ2VsbEluZm8ucG9zaXRpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3ZlcmREaXJlY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaG92ZXJlZENlbGxJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJkRGlyZWN0aW9uID0gaG92ZXJlZENlbGxJbmZvLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVJlZiB8fCAhdGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXlGb3JIYW5kbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dIYW5kbGVPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVJlZi5zZXREaXJlY3Rpb24odGhpcy5pc1hBeGlzSG92ZXIgPyAnWCcgOiAnWScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGlzdGVuRm9yUmVzaXplRXZlbnRzKCkge1xuICAgICAgICBjb25zdCB0YWtlVW50aWxEZXN0cm95ZWQgPSB0YWtlVW50aWw8Q29sdW1uU2l6ZUFjdGlvbj4odGhpcy5kZXN0cm95JCk7XG5cbiAgICAgICAgbWVyZ2UodGhpcy5yZXNpemVOb3RpZmllci5yZXNpemVDYW5jZWxlZCwgdGhpcy5yZXNpemVOb3RpZmllci50cmlnZ2VyUmVzaXplKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkLFxuICAgICAgICAgICAgICAgIGZpbHRlcihjb2x1bW5TaXplID0+IGNvbHVtblNpemUudGFibGVDZWxsID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgZGVsdGFTaXplLCBwcmV2aW91c1NpemUsIGNvbXBsZXRlSW1tZWRpYXRlbHkgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdG9wLCBsZWZ0LCBoZWlnaHQsIHdpZHRoIH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNsaWVudFksIGNsaWVudFggfSA9IGV2ZW50IGFzIE1vdXNlRXZlbnQ7XG4gICAgICAgICAgICAgICAgbGV0IGlzUHJldmVudEFwcGx5U2l6ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIOWQkeS4i++8jOaIluiAheWQkeWPs+enu+WKqChkZWx0YVNpemUgPiAwKe+8jOm8oOagh+S9jee9ruS4jeWcqOW9k+WJjeWNleWFg+agvOaLluaLvee6v+S4iu+8jOmYu+atouW6lOeUqOaLluaLveWwuuWvuFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzWEF4aXNIb3Zlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsV2lkdGggPSB0aGlzLmhvdmVyZERpcmVjdGlvbiA9PT0gUG9zaXRpb24ubGVmdCA/IDAgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaXNQcmV2ZW50QXBwbHlTaXplID0gZGVsdGFTaXplID4gMCAmJiBsZWZ0ICsgY2VsbFdpZHRoIC0gY2xpZW50WCA+IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbEhlaWdodCA9IHRoaXMuaG92ZXJkRGlyZWN0aW9uID09PSBQb3NpdGlvbi50b3AgPyAwIDogaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBpc1ByZXZlbnRBcHBseVNpemUgPSBkZWx0YVNpemUgPiAwICYmIHRvcCArIGNlbGxIZWlnaHQgLSBjbGllbnRZID4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJldmVudEFwcGx5U2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IS5jbGFzc0xpc3QuYWRkKE9WRVJMQVlfQUNUSVZFX0NMQVNTKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2l6ZShkZWx0YVNpemUsIHByZXZpb3VzU2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlSW1tZWRpYXRlbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29tcGxldGVSZXNpemVPcGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBtZXJnZSh0aGlzLnJlc2l6ZU5vdGlmaWVyLnJlc2l6ZUNhbmNlbGVkLCB0aGlzLnJlc2l6ZU5vdGlmaWVyLnJlc2l6ZUNvbXBsZXRlZClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoY29sdW1uU2l6ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYW5VcEFmdGVyUmVzaXplKGNvbHVtblNpemUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5jbGVhblJlc2l6aW5nKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb21wbGV0ZVJlc2l6ZU9wZXJhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplTm90aWZpZXIucmVzaXplQ29tcGxldGVkLm5leHQoe1xuICAgICAgICAgICAgICAgIHRhYmxlQ2VsbDogdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jbGVhblVwQWZ0ZXJSZXNpemUoY29sdW1uU2l6ZTogQ29sdW1uU2l6ZUFjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCEuY2xhc3NMaXN0LnJlbW92ZShPVkVSTEFZX0FDVElWRV9DTEFTUyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlSGFuZGxlUG9ydGFsKCk6IENvbXBvbmVudFBvcnRhbDxUaGVDb2x1bW5SZXNpemVPdmVybGF5SGFuZGxlQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbVRva2VucyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmID0gbmV3IFJlc2l6ZVJlZihcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZixcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiEsXG4gICAgICAgICAgICB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4LFxuICAgICAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMubWF4V2lkdGhQeCxcbiAgICAgICAgICAgIHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4LFxuICAgICAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMubWF4SGVpZ2h0UHgsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KFJlc2l6ZVJlZiwgdGhpcy5yZXNpemVSZWYpO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciwgdGhpcy5ldmVudERpc3BhdGNoZXIpO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLCB0aGlzLnJlc2l6ZU5vdGlmaWVyKTtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBuZXcgUG9ydGFsSW5qZWN0b3IodGhpcy5pbmplY3RvciwgY3VzdG9tVG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRQb3J0YWwoVGhlQ29sdW1uUmVzaXplT3ZlcmxheUhhbmRsZUNvbXBvbmVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmLCBpbmplY3Rvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvd0hhbmRsZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEuYXR0YWNoKHRoaXMuX2NyZWF0ZUhhbmRsZVBvcnRhbCgpKS5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3ZlcmxheUhhbmRsZVNpemVBbmRPZmZzZXQoKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZj8ucmVtb3ZlUGFuZWxDbGFzcyhbJ3RoZS1jb2x1bW4tcmVzaXplLWhhbmRsZS1wYW5lbCcsIC4uLnRoaXMucm93UmVzaXplQ2xhc3NdKTtcbiAgICAgICAgdGhpcy5pc1hBeGlzSG92ZXIgPyB0aGlzLnVwZGF0ZU92ZXJsYXlIYW5kbGVDb2x1bW5TaXplKCkgOiB0aGlzLnVwZGF0ZU92ZXJsYXlIYW5kbGVSb3dTaXplKCk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmLnNldERpcmVjdGlvbih0aGlzLmlzWEF4aXNIb3ZlciA/ICdYJyA6ICdZJyk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmLnNldFBvc2l0aW9uKHRoaXMuaG92ZXJkRGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU92ZXJsYXlIYW5kbGVDb2x1bW5TaXplKCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICAgICAgY29uc3QgdGFibGVFbGVtZW50VG9wID0gdGhpcy50YWJsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICBpZiAodGFibGVFbGVtZW50VG9wIDwgdGhpcy5zY3JvbGxhYmxlRWxlbWVudFRvcCkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy50YWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gKHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRUb3AgLSB0YWJsZUVsZW1lbnRUb3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy50YWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEuYWRkUGFuZWxDbGFzcygndGhlLWNvbHVtbi1yZXNpemUtaGFuZGxlLXBhbmVsJyk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEudXBkYXRlU2l6ZSh7IGhlaWdodCwgd2lkdGg6IE9WRVJMQVlfSU5JVF9TSVpFIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3ZlcmxheUhhbmRsZVJvd1NpemUoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IHRoaXMudGFibGVDb21wb25lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbCA9IHRhYmxlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGhlLXRhYmxlLXJvdy1jb250cm9scycpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgcm93Q29udHJvbFdpZHRoID0gMTE7XG4gICAgICAgIGlmIChyb3dDb250cm9sKSB7XG4gICAgICAgICAgICByb3dDb250cm9sV2lkdGggPSByb3dDb250cm9sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy50YWJsZUNvbXBvbmVudC50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArIHJvd0NvbnRyb2xXaWR0aDtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmIS5hZGRQYW5lbENsYXNzKHRoaXMucm93UmVzaXplQ2xhc3MpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYhLnVwZGF0ZVNpemUoeyB3aWR0aCwgaGVpZ2h0OiBPVkVSTEFZX0lOSVRfU0laRSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5U2l6ZShkZWx0YVNpemU6IG51bWJlciwgcHJldmlvdXNTaXplPzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIHVwZGF0ZSBjb2wgd2lkdGggYW5kIHRhYmxlIHdpZHRoXG4gICAgICAgIGlmICh0aGlzLmlzWEF4aXNIb3Zlcikge1xuICAgICAgICAgICAgdGhpcy5hcHBseUNvbHVtblNpemUoZGVsdGFTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlSb3dTaXplKGRlbHRhU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZUNvbXBvbmVudC51c2VSb3dDb250cm9scygpO1xuICAgICAgICB0aGlzLnRhYmxlQ29tcG9uZW50LmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZU92ZXJsYXlGb3JIYW5kbGUoKTogT3ZlcmxheVJlZiB7XG4gICAgICAgIC8vIFVzZSBvZiBvdmVybGF5cyBhbGxvd3MgdXMgdG8gcHJvcGVybHkgY2FwdHVyZSBjbGljayBldmVudHMgc3Bhbm5pbmcgcGFydHNcbiAgICAgICAgLy8gb2YgdHdvIHRhYmxlIGNlbGxzIGFuZCBpcyBhbHNvIHVzZWZ1bCBmb3IgZGlzcGxheWluZyBhIHJlc2l6ZSB0aHVtYlxuICAgICAgICAvLyBvdmVyIGJvdGggY2VsbHMgYW5kIGV4dGVuZGluZyBpdCBkb3duIHRoZSB0YWJsZSBhcyBuZWVkZWQuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlPcHRpb24gPSB0aGlzLmlzWEF4aXNIb3ZlclxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogT1ZFUkxBWV9JTklUX1NJWkUgKyAncHgnLFxuICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogJ3RoZS1jb2x1bW4tcmVzaXplLWhhbmRsZS1wYW5lbCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IE9WRVJMQVlfSU5JVF9TSVpFICsgJ3B4JyxcbiAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IHRoaXMucm93UmVzaXplQ2xhc3NcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheS5jcmVhdGUoe1xuICAgICAgICAgICAgLy8gQWx3YXlzIHBvc2l0aW9uIHRoZSBvdmVybGF5IGJhc2VkIG9uIGxlZnQtaW5kZXhlZCBjb29yZGluYXRlcy5cbiAgICAgICAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgICAgICAgIC4uLm92ZXJsYXlPcHRpb25cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCkge1xuICAgICAgICBsZXQgb2Zmc2V0WSA9IHRoaXMuY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFkoKTtcbiAgICAgICAgbGV0IG9mZnNldFggPSB0aGlzLmNhbGN1bGF0ZU92ZXJsYXlIYW5kbGVPZmZzZXRYKCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHRoaXMuaXNYQXhpc0hvdmVyXG4gICAgICAgICAgICA/IHsgLi4uUE9TSVRJT05fTUFQW3RoaXMuaG92ZXJkRGlyZWN0aW9uXSwgb2Zmc2V0WSB9XG4gICAgICAgICAgICA6IHsgLi4uUE9TSVRJT05fTUFQW3RoaXMuaG92ZXJkRGlyZWN0aW9uXSwgb2Zmc2V0WCB9O1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgICAgICAgIC53aXRoR3Jvd0FmdGVyT3BlbihmYWxzZSlcbiAgICAgICAgICAgIC53aXRoUHVzaChmYWxzZSlcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtwb3NpdGlvbl0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFkoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudFRvcCA9IHRoaXMudGFibGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgaWYgKHRhYmxlRWxlbWVudFRvcCA8IHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRUb3ApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGFibGVFbGVtZW50VG9wIC0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRWxlbWVudFRvcCAtIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFgoKSB7XG4gICAgICAgIGNvbnN0IGNlbGxFbGVtZW50TGVmdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudExlZnQgPSB0aGlzLnRhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgICAgICByZXR1cm4gdGFibGVFbGVtZW50TGVmdCAtIGNlbGxFbGVtZW50TGVmdCArIHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRMZWZ0O1xuICAgIH1cblxuICAgIGFwcGx5Q29sdW1uU2l6ZShkZWx0YVg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb2xzID0gWy4uLnRoaXMudGFibGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NvbGdyb3VwJykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZUNvbEVsZW1lbnRbXTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlVGFibGVXaWR0aChjb2xzKTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLmluaXREaXJlY3Rpb24oZGVsdGFYKTtcbiAgICAgICAgbGV0IGNlbGxJbmRleCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNlbGxJbmRleDtcbiAgICAgICAgaWYgKHRoaXMuaG92ZXJkRGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGNlbGxJbmRleCA9IGNlbGxJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sc3BhbiA9ICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJykgfHwgMTtcbiAgICAgICAgY2VsbEluZGV4ID0gY2VsbEluZGV4ICsgKGNvbHNwYW4gYXMgbnVtYmVyKSAvIDEgLSAxO1xuICAgICAgICBpZiAoZGVsdGFYID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHBseVJpZ2h0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCArIDEpO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXppbmdTdG9yZS5pc1Jlc3RvcmluZyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVMZWZ0Q29scyhkZWx0YVgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbHRhWCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb2xzW2NlbGxJbmRleF0uc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShjb2xzW2NlbGxJbmRleF0uc3R5bGUud2lkdGgpICsgZGVsdGFYKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRDb2wgPSBjb2xzW2NlbGxJbmRleCArIDFdO1xuICAgICAgICAgICAgaWYgKG5leHRDb2wpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdERlbHRhWCA9IHRoaXMucmVzaXppbmdTdG9yZS5nZXRTY3JvbGxXaWR0aChkZWx0YVgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kZWx0YSA9IHRoaXMuYXBwbHlMZWZ0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKF9kZWx0YSA9PT0gZGVsdGFYKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBub3QgcmVzaXplXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gZGVsdGFYIC0gX2RlbHRhO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6aW5nU3RvcmUuaXNSZXN0b3JpbmcoZGVsdGFYKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdERlbHRhWCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnREZWx0YVggPSB0aGlzLnJlc2l6aW5nU3RvcmUucmVzdG9yZVJpZ2h0Q29scyhsZWZ0RGVsdGFYKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdERlbHRhWCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDb2wuc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGdldEVsZW1lbnRXaWR0aChuZXh0Q29sKSArIE1hdGguYWJzKGxlZnREZWx0YVgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRDb2wuc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGdldEVsZW1lbnRXaWR0aChuZXh0Q29sKSArIE1hdGguYWJzKGRlbHRhWCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSBnZXRFbGVtZW50V2lkdGgodGhpcy50YWJsZUVsZW1lbnQpIC0gdGhpcy50aGVUYWJsZVdyYXBwZXJXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsV2lkdGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY3JvbGxXaWR0aCA+IE1hdGguYWJzKGRlbHRhWCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlMZWZ0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5TGVmdENvbHMoY29scywgLXNjcm9sbFdpZHRoLCBjZWxsSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlMZWZ0Q29scyhjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10sIGRlbHRhWDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgd2hpbGUgKGRlbHRhWCA8IDAgJiYgY29sc1tjb2xJbmRleF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IGdldEVsZW1lbnRXaWR0aChjb2xzW2NvbEluZGV4XSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoID4gdGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6aW5nU3RvcmUuaXNSZXNpemluZyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5zdG9yZVJlc2l6aW5nQ29sKGNvbHNbY29sSW5kZXhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHggKyBNYXRoLmFicyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHNbY29sSW5kZXhdLnN0eWxlLndpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjdXJyZW50V2lkdGggLSBNYXRoLmFicyhkZWx0YVgpKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVggKz0gY3VycmVudFdpZHRoIC0gdGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeDtcbiAgICAgICAgICAgICAgICAgICAgY29sc1tjb2xJbmRleF0uc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbHRhWDtcbiAgICB9XG5cbiAgICBhcHBseVJpZ2h0Q29scyhjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10sIGRlbHRhWDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHdoaWxlIChkZWx0YVggPiAwICYmIGNvbHNbY29sSW5kZXhdKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50V2lkdGggPSBnZXRFbGVtZW50V2lkdGgoY29sc1tjb2xJbmRleF0pO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFYKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6aW5nU3RvcmUuc3RvcmVSZXNpemluZ0NvbChjb2xzW2NvbEluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50V2lkdGggPiBkZWx0YVggKyB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHNbY29sSW5kZXhdLnN0eWxlLndpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjdXJyZW50V2lkdGggLSBkZWx0YVgpO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWCAtPSBjdXJyZW50V2lkdGggLSB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4O1xuICAgICAgICAgICAgICAgICAgICBjb2xzW2NvbEluZGV4XS5zdHlsZS53aWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUodGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsdGFYO1xuICAgIH1cblxuICAgIGFwcGx5Um93U2l6ZShkZWx0YVk6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCByb3dzID0gWy4uLnRoaXMudGFibGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRbXTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlVGFibGVIZWlnaHQocm93cyk7XG4gICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5pbml0RGlyZWN0aW9uKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpO1xuICAgICAgICBsZXQgcm93SW5kZXggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnJvd0luZGV4IC0gMTsgLy8gc3VidHJhY3QgdGhlYWQncyB0clxuICAgICAgICBpZiAodGhpcy5ob3ZlcmREaXJlY3Rpb24gPT09IFBvc2l0aW9uLnRvcCkge1xuICAgICAgICAgICAgcm93SW5kZXggPSByb3dJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93U3BhbiA9ICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCkucm93U3BhbjtcbiAgICAgICAgY29uc3QgYm90dG9tUm93SW5kZXggPSByb3dJbmRleCArIChyb3dTcGFuIC0gMSkgKyAxO1xuICAgICAgICBpZiAoZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHBseUJvdHRvbVJvd3Mocm93cywgZGVsdGFZLCBib3R0b21Sb3dJbmRleCk7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzdG9yaW5nKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFZID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVUb3BSb3dzKGRlbHRhWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBpbml0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShpbml0SGVpZ2h0ICsgZGVsdGFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhZGREZWx0YVkgPSB0aGlzLnJlc2l6aW5nU3RvcmUuZ2V0QWRkVGFibGVIZWlnaHQoZGVsdGFZKTtcbiAgICAgICAgICAgIGNvbnN0IF9kZWx0YSA9IHRoaXMuYXBwbHlUb3BSb3dzKHJvd3MsIGRlbHRhWSwgcm93SW5kZXgpO1xuICAgICAgICAgICAgaWYgKF9kZWx0YSA9PT0gZGVsdGFZKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FuIG5vdCByZXNpemVcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWx0YVkgPSBkZWx0YVkgLSBfZGVsdGE7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzdG9yaW5nKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFkZERlbHRhWSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVCb3R0b21Sb3dzKGRlbHRhWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlUb3BSb3dzKHJvd3M6IEhUTUxUYWJsZVJvd0VsZW1lbnRbXSwgZGVsdGFZOiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB3aGlsZSAoZGVsdGFZIDwgMCAmJiByb3dzW3Jvd0luZGV4XSkge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICBjb25zdCByb3dTdHlsZUhlaWdodCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShyb3dzW3Jvd0luZGV4XS5zdHlsZS5oZWlnaHQpO1xuICAgICAgICAgICAgaWYgKHJvd09mZnNldEhlaWdodCA+IHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4ICYmIHJvd09mZnNldEhlaWdodCA9PT0gcm93U3R5bGVIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFZLCB0aGlzLmlzWEF4aXNIb3ZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlUmVzaXppbmdSb3cocm93c1tyb3dJbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHggKyBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd3Nbcm93SW5kZXhdLnN0eWxlLmhlaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUocm93T2Zmc2V0SGVpZ2h0IC0gTWF0aC5hYnMoZGVsdGFZKSk7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFZICs9IHJvd09mZnNldEhlaWdodCAtIHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4O1xuICAgICAgICAgICAgICAgICAgICByb3dzW3Jvd0luZGV4XS5zdHlsZS5oZWlnaHQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dJbmRleC0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWx0YVk7XG4gICAgfVxuXG4gICAgYXBwbHlCb3R0b21Sb3dzKHJvd3M6IEhUTUxUYWJsZVJvd0VsZW1lbnRbXSwgZGVsdGFZOiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB3aGlsZSAocm93c1tyb3dJbmRleF0gJiYgZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICBjb25zdCByb3dTdHlsZUhlaWdodCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShyb3dzW3Jvd0luZGV4XS5zdHlsZS5oZWlnaHQpO1xuICAgICAgICAgICAgaWYgKHJvd09mZnNldEhlaWdodCA+IHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4ICYmIHJvd09mZnNldEhlaWdodCA9PT0gcm93U3R5bGVIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFZLCB0aGlzLmlzWEF4aXNIb3ZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlUmVzaXppbmdSb3cocm93c1tyb3dJbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gZGVsdGFZICsgdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHgpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShyb3dPZmZzZXRIZWlnaHQgLSBkZWx0YVkpO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWSAtPSByb3dPZmZzZXRIZWlnaHQgLSB0aGlzLnRhYmxlT3B0aW9ucy5taW5IZWlnaHRQeDtcbiAgICAgICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh0aGlzLnRhYmxlT3B0aW9ucy5taW5IZWlnaHRQeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsdGFZO1xuICAgIH1cblxuICAgIC8vI3JlZ2lvblxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgI2NlbGxJbm5lcj5cbiAgICA8c2xhdGUtY2hpbGRyZW4gW2NoaWxkcmVuXT1cImNoaWxkcmVuXCIgW2NvbnRleHRdPVwiY2hpbGRyZW5Db250ZXh0XCIgW3ZpZXdDb250ZXh0XT1cInZpZXdDb250ZXh0XCI+PC9zbGF0ZS1jaGlsZHJlbj5cbjwvZGl2PlxuIl19
|