@one-grid-core/angular 0.5.3 → 0.5.5
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/README.md +1 -1
- package/esm2022/lib/components/one-grid/one-grid.component.mjs +10 -4
- package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +9 -3
- package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +26 -8
- package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
- package/fesm2022/one-grid-core-angular.mjs +42 -12
- package/fesm2022/one-grid-core-angular.mjs.map +1 -1
- package/lib/components/one-grid/one-grid.component.d.ts +3 -1
- package/lib/components/one-grid-body/one-grid-body.component.d.ts +3 -1
- package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +6 -1
- package/lib/core/models/one-column-def-types.model.d.ts +3 -0
- package/package.json +1 -1
- package/scss/_one-grid.scss +27 -13
|
@@ -74,6 +74,7 @@ export class OneGridBodyComponent {
|
|
|
74
74
|
* Passing Row Action Events to Parent
|
|
75
75
|
*/
|
|
76
76
|
this.onRowGotoDetail = new EventEmitter();
|
|
77
|
+
this.onRowDetail = new EventEmitter();
|
|
77
78
|
this.onRowAddNew = new EventEmitter();
|
|
78
79
|
this.onRowView = new EventEmitter();
|
|
79
80
|
this.onRowCopy = new EventEmitter();
|
|
@@ -504,6 +505,9 @@ export class OneGridBodyComponent {
|
|
|
504
505
|
invokeRowActionGotoDetail(event) {
|
|
505
506
|
this.onRowGotoDetail.emit(event);
|
|
506
507
|
}
|
|
508
|
+
invokeRowActionDetail(event) {
|
|
509
|
+
this.onRowDetail.emit(event);
|
|
510
|
+
}
|
|
507
511
|
invokeRowActionAddNew(event) {
|
|
508
512
|
this.onRowAddNew.emit(event);
|
|
509
513
|
}
|
|
@@ -1120,7 +1124,7 @@ export class OneGridBodyComponent {
|
|
|
1120
1124
|
this.subscriptions.unsubscribe();
|
|
1121
1125
|
}
|
|
1122
1126
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridBodyComponent, deps: [{ token: i1.OgColumnService }, { token: i2.OneGridCellService }, { token: i3.OneGridEventService }, { token: i4.OneGridRowDragService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1123
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridBodyComponent, isStandalone: true, selector: "one-grid-body", inputs: { rowData: "rowData", rowNumber: "rowNumber", api: "api", pagination: "pagination", allowedEdit: "allowedEdit", enableGroupColumnDefs: "enableGroupColumnDefs", submitted: "submitted", editType: "editType", context: "context", getRowId: "getRowId", gridCopy$: "gridCopy$", pinnedTopRowData: "pinnedTopRowData", pinnedBottomRowData: "pinnedBottomRowData", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailRowMaxHeight: "detailRowMaxHeight", detailCellRendererParams: "detailCellRendererParams", detailGridTemplate: "detailGridTemplate", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded" }, outputs: { onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowCopy: "onRowCopy", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowCellOption: "onRowCellOption", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", expansionChanged: "expansionChanged", bodyScroll: "bodyScroll", cellOptionSelect: "cellOptionSelect", rowDragEnd: "rowDragEnd" }, host: { attributes: { "role": "presentation" }, listeners: { "document:click": "onDocumentClick($event)", "document:mouseup": "onGlobalMouseUp()" } }, viewQueries: [{ propertyName: "bodyRef", first: true, predicate: ["bodyRef"], descendants: true, static: true }, { propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "pinnedViewports", predicate: ["pinnedViewport"], descendants: true }], ngImport: i0, template: "<div #bodyRef class=\"one-grid-body\" role=\"presentation\">\n\n <!-- Pinned rows live outside the scroll viewport so they never scroll\n vertically, and mirror its scrollLeft so the columns stay aligned. -->\n @if (pinnedTopNodes.length) {\n <div #pinnedViewport class=\"one-pinned-rows one-pinned-rows-top\" role=\"rowgroup\">\n <ng-container [ngTemplateOutlet]=\"pinnedRows\" [ngTemplateOutletContext]=\"{ nodes: pinnedTopNodes, side: 'top' }\"></ng-container>\n </div>\n }\n\n <!-- tabindex makes the scroll container reachable, so a keyboard user can\n scroll the rows with the arrow keys, Page Up/Down and Home/End. Without\n it the body is scrollable by pointer only (WCAG 2.1.1). -->\n <cdk-virtual-scroll-viewport\n class=\"one-grid-body-viewport\"\n role=\"rowgroup\"\n [attr.tabindex]=\"nodes?.length ? null : 0\"\n (keydown)=\"onGridKeydown($event)\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n (scroll)=\"onBodyScroll($event)\">\n\n <ng-container *cdkVirtualFor=\"let node of nodes; trackBy: trackByRowId;\">\n \n <div class=\"one-row\"\n role=\"row\"\n [attr.aria-rowindex]=\"dataRowAriaIndex(node)\"\n [attr.aria-selected]=\"rowSelectionEnabled ? node.selected : null\"\n [attr.data-row-id]=\"node.rowId\"\n [class.one-row-selected]=\"node.selected\"\n [class.one-row-dragging]=\"isRowDragging(node)\">\n @for (col of columnDefs; track col.field;) {\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{ node, rowIndex: node.rowIndex, column: col, colIndex: $index }\"></ng-container>\n }\n </div>\n\n <!-- Custom Detail Component -->\n @if(node.leaf && node.detailActive && node?.detailRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"node?.detailRendererComponent\"\n [params]=\"{ data: node.data, rowIndex: node.rowIndex, node: node, context: context }\">\n </ng-container>\n }\n\n <!-- Master Detail Grid (template provided by the parent one-grid to avoid a compile-time import cycle) -->\n @if (masterDetail && node.expanded && node?.detailRowData) {\n <div class=\"one-row-detail-container\" [attr.data-row-id]=\"node.rowId + '-detail'\">\n <ng-container\n [ngTemplateOutlet]=\"detailGridTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node }\">\n </ng-container>\n </div>\n }\n </ng-container>\n @if (!nodes?.length) {\n <div style=\"width: max-content; border-top: 1px solid transparent;\">\n <div [style.width.px]=\"rowWidth\"></div>\n </div>\n }\n </cdk-virtual-scroll-viewport>\n\n <!-- Drop indicator.\n A line at the insertion point rather than a gap opened between rows:\n the viewport is virtualised at a fixed itemSize, so shifting rows apart\n would desynchronise the scroller from its own geometry. It is also the\n clearer signal \u2014 the row lands exactly where the line is.\n Positioned against the body, with the viewport's scroll subtracted, so\n it stays put while the content moves under it during auto-scroll. -->\n @if (dropIndicatorTop !== null) {\n <div class=\"one-row-drop-indicator\" aria-hidden=\"true\"\n [style.top.px]=\"dropIndicatorTop\"\n [style.width.px]=\"dropIndicatorWidth\"></div>\n }\n\n <!-- Keyboard reordering has no drag image to watch, so it narrates instead.\n Assertive because the message is the only feedback that the row moved. -->\n <div class=\"one-grid-visually-hidden\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">{{ dragAnnouncement }}</div>\n @if (!nodes?.length) {\n <span class=\"one-grid-empty-message\" style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">No Rows to Show</span>\n }\n\n @if (pinnedBottomNodes.length) {\n <div #pinnedViewport class=\"one-pinned-rows one-pinned-rows-bottom\" role=\"rowgroup\">\n <ng-container [ngTemplateOutlet]=\"pinnedRows\" [ngTemplateOutletContext]=\"{ nodes: pinnedBottomNodes, side: 'bottom' }\"></ng-container>\n </div>\n }\n</div>\n\n<!-- Pinned rows are display-only: they render exactly what a data cell renders,\n but carry none of its interactions. A totals row should not open an editor\n on double-click or start a range selection on drag. -->\n<ng-template #pinnedRows let-nodes=\"nodes\" let-side=\"side\">\n @for (node of nodes; track node.rowId) {\n <div class=\"one-row one-row-pinned\"\n role=\"row\"\n [attr.aria-rowindex]=\"pinnedRowAriaIndex(node, side)\"\n [attr.data-row-id]=\"node.rowId\">\n @for (column of columnDefs; track column.field) {\n <div\n class=\"one-column\"\n role=\"gridcell\"\n [attr.aria-colindex]=\"$index + 1\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [class.one-column-pinned-left]=\"column.pinned === 'left'\"\n [class.one-column-pinned-right]=\"column.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"column._pinnedEdge\"\n [style.left.px]=\"column.pinned === 'left' ? column._pinnedOffset : null\"\n [style.right.px]=\"column.pinned === 'right' ? column._pinnedOffset : null\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\">\n\n @if (column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px', position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellClass(column, cellParams(node, column))\"\n [ngStyle]=\"colService.resolveCellStyle(column, cellParams(node, column))\">\n <div class=\"one-cell-text\">{{ (node.cellStates | cellStateRenderer:column.field) }}</div>\n </div>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n\n<!-- Master Column Template -->\n<ng-template #cellTemplate let-node=\"node\" let-rowIndex=\"rowIndex\" let-column=\"column\" let-colIndex=\"colIndex\">\n <div\n class=\"one-column\"\n role=\"gridcell\"\n [attr.aria-colindex]=\"colIndex + 1\"\n [attr.tabindex]=\"isActiveCell(node, column) ? 0 : -1\"\n [class.one-cell-active]=\"isActiveCell(node, column)\"\n (focus)=\"onCellFocus(node, column)\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [class.one-column-pinned-left]=\"column.pinned === 'left'\"\n [class.one-column-pinned-right]=\"column.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"column._pinnedEdge\"\n [style.left.px]=\"column.pinned === 'left' ? column._pinnedOffset : null\"\n [style.right.px]=\"column.pinned === 'right' ? column._pinnedOffset : null\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\"\n [class.one-column-border-top]=\"masterDetail && nodes?.length > 0 && nodes[node.rowIndex - 1]?.expanded\"\n [class.one-cell-selected]=\"selectedCells | cellSelected:node.rowId:column.field\"\n [class.one-cell-invalid]=\"node.cellStates | cellInvalid:node.data[column.field]:column:node:allowedEdit:submitted\"\n (dblclick)=\"startEdit($event, node, column)\"\n (mousedown)=\"startSelection(node.rowId, column.field)\"\n (mouseenter)=\"extendSelection(node.rowId, column.field)\"\n (mouseup)=\"endSelection()\">\n\n <!-- One Grid Cell Option -->\n @if (node.cellOptions[column.field]) {\n <one-grid-cell-option-menu\n #contextOptionMenuRef\n [node]=\"node\"\n [column]=\"column\"\n [options]=\"column.cellOptionMenu\"\n (cellOptionMenuSelect)=\"cellOptionMenuSelected($event)\"\n (cellOptionMenuClose)=\"cellOptionMenuClosed()\"/>\n }\n\n <!-- Grid Cell Template -->\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else if (node.editing[column.field]) {\n @if (column?.cellRendererParams?.inputType === 'select') {\n <!-- Cell Editing Select. Commits on change \u2014 picking an option\n is the whole edit \u2014 with blur as the keyboard fallback. -->\n <select class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n (change)=\"stopEditSelect(node, column, $event)\"\n (blur)=\"stopEditSelect(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\">\n @for (option of column?.cellRendererParams?.selectOptions ?? []; track $index) {\n <option [selected]=\"option.value === node.data[column.field]\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <!-- Cell Editing Input -->\n <input class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n oneCellInputValidator\n [validationType]=\"column?.cellRendererParams?.inputType === 'number' ? 'number' : 'none'\"\n [placeholder]=\"column?.cellRendererParams?.placeholder\"\n [type]=\"column?.cellRendererParams?.inputType === 'number' ? 'text' : column?.cellRendererParams?.inputType\"\n [value]=\"node?.data[column?.field]\"\n [maxLength]=\"250\"\n (blur)=\"stopEdit(node, column, $event)\"\n (keydown.enter)=\"stopEdit(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\"\n />\n }\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px' , position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\"\n [class.editable-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellClass(column, cellParams(node, column))\"\n [ngStyle]=\"colService.resolveCellStyle(column, cellParams(node, column))\"\n [style.padding-left.px]=\"column.autoGroupField && node.level | cellLevelPadding:24\"\n [class.one-cell-allowed-edit-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n\n <!-- Row Drag Handle -->\n @if (cellService.rowDragFn(column, node)) {\n <one-grid-row-drag-handle\n [node]=\"node\"\n [suppressedReason]=\"rowDragSuppressed\"\n (dragEnd)=\"onRowDragEnd($event)\"\n />\n }\n\n <!-- Cell Checkbox Selection -->\n @if (column?.checkboxSelection) {\n <one-grid-checkbox\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [api]=\"api\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n />\n }\n\n <!-- Expand & Collapse Icon -->\n @if (((node?.group || detailRendererComponent) && column?.autoGroupField) || (masterDetail && node?.expandable && gridType === 'master' && column?.masterGroupField)) {\n <one-grid-cell-group-renderer\n [node]=\"node\"\n [masterDetail]=\"masterDetail\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n />\n }\n\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else {\n <!-- Cell Value OR Placeholder -->\n <div oneCellTextExpand class=\"one-cell-text\" [class.one-cell-placeholder]=\"node.cellStates[column.field]?.type === 'placeholder'\">\n {{ (node.cellStates | cellStateRenderer:column.field) }}\n </div>\n }\n\n <!-- Cell Action Buttons -->\n @if (column.cellRendererParams | cellActionButtonEnable) {\n <one-grid-row-action\n [ngStyle]=\"{ marginLeft: 'auto' }\"\n [column]=\"column\"\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [masterNode]=\"masterNode\"\n [masterDetail]=\"masterDetail\"\n [gridType]=\"gridType\"\n [context]=\"context\"\n [cellRendererParams]=\"column?.cellRendererParams\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n />\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: OneGridCheckboxComponent, selector: "one-grid-checkbox", inputs: ["node", "allowedEdit", "api"], outputs: ["onRowSelection"] }, { kind: "component", type: OneGridCellGroupRendererComponent, selector: "one-grid-cell-group-renderer", inputs: ["node", "masterDetail", "detailCellRendererParams", "detailRendererComponent"], outputs: ["expansionChanged"] }, { kind: "component", type: OneGridCellOptionMenuComponent, selector: "one-grid-cell-option-menu", inputs: ["column", "node", "options"], outputs: ["cellOptionMenuSelect", "cellOptionMenuClose"] }, { kind: "component", type: OneGridRowActionComponent, selector: "one-grid-row-action", inputs: ["column", "node", "allowedEdit", "masterDetail", "masterNode", "cellRendererParams", "gridType", "context"], outputs: ["onRowGotoDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption"] }, { kind: "component", type: OneGridRowDragHandleComponent, selector: "one-grid-row-drag-handle", inputs: ["node", "suppressedReason"], outputs: ["dragEnd"] }, { kind: "directive", type: OneCellInputValidatorDirective, selector: "[oneCellInputValidator]", inputs: ["validationType", "regex"] }, { kind: "directive", type: OneCellRendererComponentDirective, selector: "[oneCellRendererComponent]", inputs: ["cellRendererComponent", "params"] }, { kind: "directive", type: OneCellTextExpandDirective, selector: "[oneCellTextExpand]" }, { kind: "pipe", type: CellActionButtonEnablePipe, name: "cellActionButtonEnable" }, { kind: "pipe", type: CellEditablePipe, name: "cellEditable" }, { kind: "pipe", type: CellInvalidPipe, name: "cellInvalid" }, { kind: "pipe", type: CellKeyPipe, name: "cellKey" }, { kind: "pipe", type: CellLevelPaddingPipe, name: "cellLevelPadding" }, { kind: "pipe", type: CellSelectedPipe, name: "cellSelected" }, { kind: "pipe", type: CellStateRendererPipe, name: "cellStateRenderer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1127
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridBodyComponent, isStandalone: true, selector: "one-grid-body", inputs: { rowData: "rowData", rowNumber: "rowNumber", api: "api", pagination: "pagination", allowedEdit: "allowedEdit", enableGroupColumnDefs: "enableGroupColumnDefs", submitted: "submitted", editType: "editType", context: "context", getRowId: "getRowId", gridCopy$: "gridCopy$", pinnedTopRowData: "pinnedTopRowData", pinnedBottomRowData: "pinnedBottomRowData", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailRowMaxHeight: "detailRowMaxHeight", detailCellRendererParams: "detailCellRendererParams", detailGridTemplate: "detailGridTemplate", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded" }, outputs: { onRowGotoDetail: "onRowGotoDetail", onRowDetail: "onRowDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowCopy: "onRowCopy", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowCellOption: "onRowCellOption", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", expansionChanged: "expansionChanged", bodyScroll: "bodyScroll", cellOptionSelect: "cellOptionSelect", rowDragEnd: "rowDragEnd" }, host: { attributes: { "role": "presentation" }, listeners: { "document:click": "onDocumentClick($event)", "document:mouseup": "onGlobalMouseUp()" } }, viewQueries: [{ propertyName: "bodyRef", first: true, predicate: ["bodyRef"], descendants: true, static: true }, { propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "pinnedViewports", predicate: ["pinnedViewport"], descendants: true }], ngImport: i0, template: "<div #bodyRef class=\"one-grid-body\" role=\"presentation\">\n\n <!-- Pinned rows live outside the scroll viewport so they never scroll\n vertically, and mirror its scrollLeft so the columns stay aligned. -->\n @if (pinnedTopNodes.length) {\n <div #pinnedViewport class=\"one-pinned-rows one-pinned-rows-top\" role=\"rowgroup\">\n <ng-container [ngTemplateOutlet]=\"pinnedRows\" [ngTemplateOutletContext]=\"{ nodes: pinnedTopNodes, side: 'top' }\"></ng-container>\n </div>\n }\n\n <!-- tabindex makes the scroll container reachable, so a keyboard user can\n scroll the rows with the arrow keys, Page Up/Down and Home/End. Without\n it the body is scrollable by pointer only (WCAG 2.1.1). -->\n <cdk-virtual-scroll-viewport\n class=\"one-grid-body-viewport\"\n role=\"rowgroup\"\n [attr.tabindex]=\"nodes?.length ? null : 0\"\n (keydown)=\"onGridKeydown($event)\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n (scroll)=\"onBodyScroll($event)\">\n\n <ng-container *cdkVirtualFor=\"let node of nodes; trackBy: trackByRowId;\">\n \n <div class=\"one-row\"\n role=\"row\"\n [attr.aria-rowindex]=\"dataRowAriaIndex(node)\"\n [attr.aria-selected]=\"rowSelectionEnabled ? node.selected : null\"\n [attr.data-row-id]=\"node.rowId\"\n [class.one-row-selected]=\"node.selected\"\n [class.one-row-dragging]=\"isRowDragging(node)\">\n @for (col of columnDefs; track col.field;) {\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{ node, rowIndex: node.rowIndex, column: col, colIndex: $index }\"></ng-container>\n }\n </div>\n\n <!-- Custom Detail Component -->\n @if(node.leaf && node.detailActive && node?.detailRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"node?.detailRendererComponent\"\n [params]=\"{ data: node.data, rowIndex: node.rowIndex, node: node, context: context }\">\n </ng-container>\n }\n\n <!-- Master Detail Grid (template provided by the parent one-grid to avoid a compile-time import cycle) -->\n @if (masterDetail && node.expanded && node?.detailRowData) {\n <div class=\"one-row-detail-container\" [attr.data-row-id]=\"node.rowId + '-detail'\">\n <ng-container\n [ngTemplateOutlet]=\"detailGridTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node }\">\n </ng-container>\n </div>\n }\n </ng-container>\n @if (!nodes?.length) {\n <div style=\"width: max-content; border-top: 1px solid transparent;\">\n <div [style.width.px]=\"rowWidth\"></div>\n </div>\n }\n </cdk-virtual-scroll-viewport>\n\n <!-- Drop indicator.\n A line at the insertion point rather than a gap opened between rows:\n the viewport is virtualised at a fixed itemSize, so shifting rows apart\n would desynchronise the scroller from its own geometry. It is also the\n clearer signal \u2014 the row lands exactly where the line is.\n Positioned against the body, with the viewport's scroll subtracted, so\n it stays put while the content moves under it during auto-scroll. -->\n @if (dropIndicatorTop !== null) {\n <div class=\"one-row-drop-indicator\" aria-hidden=\"true\"\n [style.top.px]=\"dropIndicatorTop\"\n [style.width.px]=\"dropIndicatorWidth\"></div>\n }\n\n <!-- Keyboard reordering has no drag image to watch, so it narrates instead.\n Assertive because the message is the only feedback that the row moved. -->\n <div class=\"one-grid-visually-hidden\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">{{ dragAnnouncement }}</div>\n @if (!nodes?.length) {\n <span class=\"one-grid-empty-message\" style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">No Rows to Show</span>\n }\n\n @if (pinnedBottomNodes.length) {\n <div #pinnedViewport class=\"one-pinned-rows one-pinned-rows-bottom\" role=\"rowgroup\">\n <ng-container [ngTemplateOutlet]=\"pinnedRows\" [ngTemplateOutletContext]=\"{ nodes: pinnedBottomNodes, side: 'bottom' }\"></ng-container>\n </div>\n }\n</div>\n\n<!-- Pinned rows are display-only: they render exactly what a data cell renders,\n but carry none of its interactions. A totals row should not open an editor\n on double-click or start a range selection on drag. -->\n<ng-template #pinnedRows let-nodes=\"nodes\" let-side=\"side\">\n @for (node of nodes; track node.rowId) {\n <div class=\"one-row one-row-pinned\"\n role=\"row\"\n [attr.aria-rowindex]=\"pinnedRowAriaIndex(node, side)\"\n [attr.data-row-id]=\"node.rowId\">\n @for (column of columnDefs; track column.field) {\n <div\n class=\"one-column\"\n role=\"gridcell\"\n [attr.aria-colindex]=\"$index + 1\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [class.one-column-pinned-left]=\"column.pinned === 'left'\"\n [class.one-column-pinned-right]=\"column.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"column._pinnedEdge\"\n [style.left.px]=\"column.pinned === 'left' ? column._pinnedOffset : null\"\n [style.right.px]=\"column.pinned === 'right' ? column._pinnedOffset : null\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\">\n\n @if (column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px', position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellClass(column, cellParams(node, column))\"\n [ngStyle]=\"colService.resolveCellStyle(column, cellParams(node, column))\">\n <div class=\"one-cell-text\">{{ (node.cellStates | cellStateRenderer:column.field) }}</div>\n </div>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n\n<!-- Master Column Template -->\n<ng-template #cellTemplate let-node=\"node\" let-rowIndex=\"rowIndex\" let-column=\"column\" let-colIndex=\"colIndex\">\n <div\n class=\"one-column\"\n role=\"gridcell\"\n [attr.aria-colindex]=\"colIndex + 1\"\n [attr.tabindex]=\"isActiveCell(node, column) ? 0 : -1\"\n [class.one-cell-active]=\"isActiveCell(node, column)\"\n (focus)=\"onCellFocus(node, column)\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [class.one-column-pinned-left]=\"column.pinned === 'left'\"\n [class.one-column-pinned-right]=\"column.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"column._pinnedEdge\"\n [style.left.px]=\"column.pinned === 'left' ? column._pinnedOffset : null\"\n [style.right.px]=\"column.pinned === 'right' ? column._pinnedOffset : null\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\"\n [class.one-column-border-top]=\"masterDetail && nodes?.length > 0 && nodes[node.rowIndex - 1]?.expanded\"\n [class.one-cell-selected]=\"selectedCells | cellSelected:node.rowId:column.field\"\n [class.one-cell-invalid]=\"node.cellStates | cellInvalid:node.data[column.field]:column:node:allowedEdit:submitted\"\n (dblclick)=\"startEdit($event, node, column)\"\n (mousedown)=\"startSelection(node.rowId, column.field)\"\n (mouseenter)=\"extendSelection(node.rowId, column.field)\"\n (mouseup)=\"endSelection()\">\n\n <!-- One Grid Cell Option -->\n @if (node.cellOptions[column.field]) {\n <one-grid-cell-option-menu\n #contextOptionMenuRef\n [node]=\"node\"\n [column]=\"column\"\n [options]=\"column.cellOptionMenu\"\n (cellOptionMenuSelect)=\"cellOptionMenuSelected($event)\"\n (cellOptionMenuClose)=\"cellOptionMenuClosed()\"/>\n }\n\n <!-- Grid Cell Template -->\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else if (node.editing[column.field]) {\n @if (column?.cellRendererParams?.inputType === 'select') {\n <!-- Cell Editing Select. Commits on change \u2014 picking an option\n is the whole edit \u2014 with blur as the keyboard fallback. -->\n <select class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n (change)=\"stopEditSelect(node, column, $event)\"\n (blur)=\"stopEditSelect(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\">\n @for (option of column?.cellRendererParams?.selectOptions ?? []; track $index) {\n <option [selected]=\"option.value === node.data[column.field]\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <!-- Cell Editing Input -->\n <input class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n oneCellInputValidator\n [validationType]=\"column?.cellRendererParams?.inputType === 'number' ? 'number' : 'none'\"\n [placeholder]=\"column?.cellRendererParams?.placeholder\"\n [type]=\"column?.cellRendererParams?.inputType === 'number' ? 'text' : column?.cellRendererParams?.inputType\"\n [value]=\"node?.data[column?.field]\"\n [maxLength]=\"250\"\n (blur)=\"stopEdit(node, column, $event)\"\n (keydown.enter)=\"stopEdit(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\"\n />\n }\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px' , position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\"\n [class.editable-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellClass(column, cellParams(node, column))\"\n [ngStyle]=\"colService.resolveCellStyle(column, cellParams(node, column))\"\n [style.padding-left.px]=\"column.autoGroupField && node.level | cellLevelPadding:24\"\n [class.one-cell-allowed-edit-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n\n <!-- Row Drag Handle -->\n @if (cellService.rowDragFn(column, node)) {\n <one-grid-row-drag-handle\n [node]=\"node\"\n [suppressedReason]=\"rowDragSuppressed\"\n (dragEnd)=\"onRowDragEnd($event)\"\n />\n }\n\n <!-- Cell Checkbox Selection -->\n @if (column?.checkboxSelection) {\n <one-grid-checkbox\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [api]=\"api\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n />\n }\n\n <!-- Expand & Collapse Icon -->\n @if (((node?.group || detailRendererComponent) && column?.autoGroupField) || (masterDetail && node?.expandable && gridType === 'master' && column?.masterGroupField)) {\n <one-grid-cell-group-renderer\n [node]=\"node\"\n [masterDetail]=\"masterDetail\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n />\n }\n\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else {\n <!-- Cell Value OR Placeholder -->\n <div oneCellTextExpand class=\"one-cell-text\" [class.one-cell-placeholder]=\"node.cellStates[column.field]?.type === 'placeholder'\">\n {{ (node.cellStates | cellStateRenderer:column.field) }}\n </div>\n }\n\n <!-- Cell Action Buttons -->\n @if (column.cellRendererParams | cellActionButtonEnable) {\n <one-grid-row-action\n [ngStyle]=\"{ marginLeft: 'auto' }\"\n [column]=\"column\"\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [masterNode]=\"masterNode\"\n [masterDetail]=\"masterDetail\"\n [gridType]=\"gridType\"\n [context]=\"context\"\n [cellRendererParams]=\"column?.cellRendererParams\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowDetail)=\"invokeRowActionDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n />\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: OneGridCheckboxComponent, selector: "one-grid-checkbox", inputs: ["node", "allowedEdit", "api"], outputs: ["onRowSelection"] }, { kind: "component", type: OneGridCellGroupRendererComponent, selector: "one-grid-cell-group-renderer", inputs: ["node", "masterDetail", "detailCellRendererParams", "detailRendererComponent"], outputs: ["expansionChanged"] }, { kind: "component", type: OneGridCellOptionMenuComponent, selector: "one-grid-cell-option-menu", inputs: ["column", "node", "options"], outputs: ["cellOptionMenuSelect", "cellOptionMenuClose"] }, { kind: "component", type: OneGridRowActionComponent, selector: "one-grid-row-action", inputs: ["column", "node", "allowedEdit", "masterDetail", "masterNode", "cellRendererParams", "gridType", "context"], outputs: ["onRowGotoDetail", "onRowDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption"] }, { kind: "component", type: OneGridRowDragHandleComponent, selector: "one-grid-row-drag-handle", inputs: ["node", "suppressedReason"], outputs: ["dragEnd"] }, { kind: "directive", type: OneCellInputValidatorDirective, selector: "[oneCellInputValidator]", inputs: ["validationType", "regex"] }, { kind: "directive", type: OneCellRendererComponentDirective, selector: "[oneCellRendererComponent]", inputs: ["cellRendererComponent", "params"] }, { kind: "directive", type: OneCellTextExpandDirective, selector: "[oneCellTextExpand]" }, { kind: "pipe", type: CellActionButtonEnablePipe, name: "cellActionButtonEnable" }, { kind: "pipe", type: CellEditablePipe, name: "cellEditable" }, { kind: "pipe", type: CellInvalidPipe, name: "cellInvalid" }, { kind: "pipe", type: CellKeyPipe, name: "cellKey" }, { kind: "pipe", type: CellLevelPaddingPipe, name: "cellLevelPadding" }, { kind: "pipe", type: CellSelectedPipe, name: "cellSelected" }, { kind: "pipe", type: CellStateRendererPipe, name: "cellStateRenderer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1124
1128
|
}
|
|
1125
1129
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridBodyComponent, decorators: [{
|
|
1126
1130
|
type: Component,
|
|
@@ -1144,7 +1148,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1144
1148
|
CellLevelPaddingPipe,
|
|
1145
1149
|
CellSelectedPipe,
|
|
1146
1150
|
CellStateRendererPipe,
|
|
1147
|
-
], selector: 'one-grid-body', host: { 'role': 'presentation' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #bodyRef class=\"one-grid-body\" role=\"presentation\">\n\n <!-- Pinned rows live outside the scroll viewport so they never scroll\n vertically, and mirror its scrollLeft so the columns stay aligned. -->\n @if (pinnedTopNodes.length) {\n <div #pinnedViewport class=\"one-pinned-rows one-pinned-rows-top\" role=\"rowgroup\">\n <ng-container [ngTemplateOutlet]=\"pinnedRows\" [ngTemplateOutletContext]=\"{ nodes: pinnedTopNodes, side: 'top' }\"></ng-container>\n </div>\n }\n\n <!-- tabindex makes the scroll container reachable, so a keyboard user can\n scroll the rows with the arrow keys, Page Up/Down and Home/End. Without\n it the body is scrollable by pointer only (WCAG 2.1.1). -->\n <cdk-virtual-scroll-viewport\n class=\"one-grid-body-viewport\"\n role=\"rowgroup\"\n [attr.tabindex]=\"nodes?.length ? null : 0\"\n (keydown)=\"onGridKeydown($event)\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n (scroll)=\"onBodyScroll($event)\">\n\n <ng-container *cdkVirtualFor=\"let node of nodes; trackBy: trackByRowId;\">\n \n <div class=\"one-row\"\n role=\"row\"\n [attr.aria-rowindex]=\"dataRowAriaIndex(node)\"\n [attr.aria-selected]=\"rowSelectionEnabled ? node.selected : null\"\n [attr.data-row-id]=\"node.rowId\"\n [class.one-row-selected]=\"node.selected\"\n [class.one-row-dragging]=\"isRowDragging(node)\">\n @for (col of columnDefs; track col.field;) {\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{ node, rowIndex: node.rowIndex, column: col, colIndex: $index }\"></ng-container>\n }\n </div>\n\n <!-- Custom Detail Component -->\n @if(node.leaf && node.detailActive && node?.detailRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"node?.detailRendererComponent\"\n [params]=\"{ data: node.data, rowIndex: node.rowIndex, node: node, context: context }\">\n </ng-container>\n }\n\n <!-- Master Detail Grid (template provided by the parent one-grid to avoid a compile-time import cycle) -->\n @if (masterDetail && node.expanded && node?.detailRowData) {\n <div class=\"one-row-detail-container\" [attr.data-row-id]=\"node.rowId + '-detail'\">\n <ng-container\n [ngTemplateOutlet]=\"detailGridTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node }\">\n </ng-container>\n </div>\n }\n </ng-container>\n @if (!nodes?.length) {\n <div style=\"width: max-content; border-top: 1px solid transparent;\">\n <div [style.width.px]=\"rowWidth\"></div>\n </div>\n }\n </cdk-virtual-scroll-viewport>\n\n <!-- Drop indicator.\n A line at the insertion point rather than a gap opened between rows:\n the viewport is virtualised at a fixed itemSize, so shifting rows apart\n would desynchronise the scroller from its own geometry. It is also the\n clearer signal \u2014 the row lands exactly where the line is.\n Positioned against the body, with the viewport's scroll subtracted, so\n it stays put while the content moves under it during auto-scroll. -->\n @if (dropIndicatorTop !== null) {\n <div class=\"one-row-drop-indicator\" aria-hidden=\"true\"\n [style.top.px]=\"dropIndicatorTop\"\n [style.width.px]=\"dropIndicatorWidth\"></div>\n }\n\n <!-- Keyboard reordering has no drag image to watch, so it narrates instead.\n Assertive because the message is the only feedback that the row moved. -->\n <div class=\"one-grid-visually-hidden\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">{{ dragAnnouncement }}</div>\n @if (!nodes?.length) {\n <span class=\"one-grid-empty-message\" style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">No Rows to Show</span>\n }\n\n @if (pinnedBottomNodes.length) {\n <div #pinnedViewport class=\"one-pinned-rows one-pinned-rows-bottom\" role=\"rowgroup\">\n <ng-container [ngTemplateOutlet]=\"pinnedRows\" [ngTemplateOutletContext]=\"{ nodes: pinnedBottomNodes, side: 'bottom' }\"></ng-container>\n </div>\n }\n</div>\n\n<!-- Pinned rows are display-only: they render exactly what a data cell renders,\n but carry none of its interactions. A totals row should not open an editor\n on double-click or start a range selection on drag. -->\n<ng-template #pinnedRows let-nodes=\"nodes\" let-side=\"side\">\n @for (node of nodes; track node.rowId) {\n <div class=\"one-row one-row-pinned\"\n role=\"row\"\n [attr.aria-rowindex]=\"pinnedRowAriaIndex(node, side)\"\n [attr.data-row-id]=\"node.rowId\">\n @for (column of columnDefs; track column.field) {\n <div\n class=\"one-column\"\n role=\"gridcell\"\n [attr.aria-colindex]=\"$index + 1\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [class.one-column-pinned-left]=\"column.pinned === 'left'\"\n [class.one-column-pinned-right]=\"column.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"column._pinnedEdge\"\n [style.left.px]=\"column.pinned === 'left' ? column._pinnedOffset : null\"\n [style.right.px]=\"column.pinned === 'right' ? column._pinnedOffset : null\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\">\n\n @if (column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px', position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellClass(column, cellParams(node, column))\"\n [ngStyle]=\"colService.resolveCellStyle(column, cellParams(node, column))\">\n <div class=\"one-cell-text\">{{ (node.cellStates | cellStateRenderer:column.field) }}</div>\n </div>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n\n<!-- Master Column Template -->\n<ng-template #cellTemplate let-node=\"node\" let-rowIndex=\"rowIndex\" let-column=\"column\" let-colIndex=\"colIndex\">\n <div\n class=\"one-column\"\n role=\"gridcell\"\n [attr.aria-colindex]=\"colIndex + 1\"\n [attr.tabindex]=\"isActiveCell(node, column) ? 0 : -1\"\n [class.one-cell-active]=\"isActiveCell(node, column)\"\n (focus)=\"onCellFocus(node, column)\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [class.one-column-pinned-left]=\"column.pinned === 'left'\"\n [class.one-column-pinned-right]=\"column.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"column._pinnedEdge\"\n [style.left.px]=\"column.pinned === 'left' ? column._pinnedOffset : null\"\n [style.right.px]=\"column.pinned === 'right' ? column._pinnedOffset : null\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\"\n [class.one-column-border-top]=\"masterDetail && nodes?.length > 0 && nodes[node.rowIndex - 1]?.expanded\"\n [class.one-cell-selected]=\"selectedCells | cellSelected:node.rowId:column.field\"\n [class.one-cell-invalid]=\"node.cellStates | cellInvalid:node.data[column.field]:column:node:allowedEdit:submitted\"\n (dblclick)=\"startEdit($event, node, column)\"\n (mousedown)=\"startSelection(node.rowId, column.field)\"\n (mouseenter)=\"extendSelection(node.rowId, column.field)\"\n (mouseup)=\"endSelection()\">\n\n <!-- One Grid Cell Option -->\n @if (node.cellOptions[column.field]) {\n <one-grid-cell-option-menu\n #contextOptionMenuRef\n [node]=\"node\"\n [column]=\"column\"\n [options]=\"column.cellOptionMenu\"\n (cellOptionMenuSelect)=\"cellOptionMenuSelected($event)\"\n (cellOptionMenuClose)=\"cellOptionMenuClosed()\"/>\n }\n\n <!-- Grid Cell Template -->\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else if (node.editing[column.field]) {\n @if (column?.cellRendererParams?.inputType === 'select') {\n <!-- Cell Editing Select. Commits on change \u2014 picking an option\n is the whole edit \u2014 with blur as the keyboard fallback. -->\n <select class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n (change)=\"stopEditSelect(node, column, $event)\"\n (blur)=\"stopEditSelect(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\">\n @for (option of column?.cellRendererParams?.selectOptions ?? []; track $index) {\n <option [selected]=\"option.value === node.data[column.field]\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <!-- Cell Editing Input -->\n <input class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n oneCellInputValidator\n [validationType]=\"column?.cellRendererParams?.inputType === 'number' ? 'number' : 'none'\"\n [placeholder]=\"column?.cellRendererParams?.placeholder\"\n [type]=\"column?.cellRendererParams?.inputType === 'number' ? 'text' : column?.cellRendererParams?.inputType\"\n [value]=\"node?.data[column?.field]\"\n [maxLength]=\"250\"\n (blur)=\"stopEdit(node, column, $event)\"\n (keydown.enter)=\"stopEdit(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\"\n />\n }\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px' , position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\"\n [class.editable-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellClass(column, cellParams(node, column))\"\n [ngStyle]=\"colService.resolveCellStyle(column, cellParams(node, column))\"\n [style.padding-left.px]=\"column.autoGroupField && node.level | cellLevelPadding:24\"\n [class.one-cell-allowed-edit-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n\n <!-- Row Drag Handle -->\n @if (cellService.rowDragFn(column, node)) {\n <one-grid-row-drag-handle\n [node]=\"node\"\n [suppressedReason]=\"rowDragSuppressed\"\n (dragEnd)=\"onRowDragEnd($event)\"\n />\n }\n\n <!-- Cell Checkbox Selection -->\n @if (column?.checkboxSelection) {\n <one-grid-checkbox\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [api]=\"api\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n />\n }\n\n <!-- Expand & Collapse Icon -->\n @if (((node?.group || detailRendererComponent) && column?.autoGroupField) || (masterDetail && node?.expandable && gridType === 'master' && column?.masterGroupField)) {\n <one-grid-cell-group-renderer\n [node]=\"node\"\n [masterDetail]=\"masterDetail\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n />\n }\n\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else {\n <!-- Cell Value OR Placeholder -->\n <div oneCellTextExpand class=\"one-cell-text\" [class.one-cell-placeholder]=\"node.cellStates[column.field]?.type === 'placeholder'\">\n {{ (node.cellStates | cellStateRenderer:column.field) }}\n </div>\n }\n\n <!-- Cell Action Buttons -->\n @if (column.cellRendererParams | cellActionButtonEnable) {\n <one-grid-row-action\n [ngStyle]=\"{ marginLeft: 'auto' }\"\n [column]=\"column\"\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [masterNode]=\"masterNode\"\n [masterDetail]=\"masterDetail\"\n [gridType]=\"gridType\"\n [context]=\"context\"\n [cellRendererParams]=\"column?.cellRendererParams\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n />\n }\n </div>\n }\n </div>\n</ng-template>\n" }]
|
|
1151
|
+
], selector: 'one-grid-body', host: { 'role': 'presentation' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #bodyRef class=\"one-grid-body\" role=\"presentation\">\n\n <!-- Pinned rows live outside the scroll viewport so they never scroll\n vertically, and mirror its scrollLeft so the columns stay aligned. -->\n @if (pinnedTopNodes.length) {\n <div #pinnedViewport class=\"one-pinned-rows one-pinned-rows-top\" role=\"rowgroup\">\n <ng-container [ngTemplateOutlet]=\"pinnedRows\" [ngTemplateOutletContext]=\"{ nodes: pinnedTopNodes, side: 'top' }\"></ng-container>\n </div>\n }\n\n <!-- tabindex makes the scroll container reachable, so a keyboard user can\n scroll the rows with the arrow keys, Page Up/Down and Home/End. Without\n it the body is scrollable by pointer only (WCAG 2.1.1). -->\n <cdk-virtual-scroll-viewport\n class=\"one-grid-body-viewport\"\n role=\"rowgroup\"\n [attr.tabindex]=\"nodes?.length ? null : 0\"\n (keydown)=\"onGridKeydown($event)\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n (scroll)=\"onBodyScroll($event)\">\n\n <ng-container *cdkVirtualFor=\"let node of nodes; trackBy: trackByRowId;\">\n \n <div class=\"one-row\"\n role=\"row\"\n [attr.aria-rowindex]=\"dataRowAriaIndex(node)\"\n [attr.aria-selected]=\"rowSelectionEnabled ? node.selected : null\"\n [attr.data-row-id]=\"node.rowId\"\n [class.one-row-selected]=\"node.selected\"\n [class.one-row-dragging]=\"isRowDragging(node)\">\n @for (col of columnDefs; track col.field;) {\n <ng-container [ngTemplateOutlet]=\"cellTemplate\" [ngTemplateOutletContext]=\"{ node, rowIndex: node.rowIndex, column: col, colIndex: $index }\"></ng-container>\n }\n </div>\n\n <!-- Custom Detail Component -->\n @if(node.leaf && node.detailActive && node?.detailRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"node?.detailRendererComponent\"\n [params]=\"{ data: node.data, rowIndex: node.rowIndex, node: node, context: context }\">\n </ng-container>\n }\n\n <!-- Master Detail Grid (template provided by the parent one-grid to avoid a compile-time import cycle) -->\n @if (masterDetail && node.expanded && node?.detailRowData) {\n <div class=\"one-row-detail-container\" [attr.data-row-id]=\"node.rowId + '-detail'\">\n <ng-container\n [ngTemplateOutlet]=\"detailGridTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node }\">\n </ng-container>\n </div>\n }\n </ng-container>\n @if (!nodes?.length) {\n <div style=\"width: max-content; border-top: 1px solid transparent;\">\n <div [style.width.px]=\"rowWidth\"></div>\n </div>\n }\n </cdk-virtual-scroll-viewport>\n\n <!-- Drop indicator.\n A line at the insertion point rather than a gap opened between rows:\n the viewport is virtualised at a fixed itemSize, so shifting rows apart\n would desynchronise the scroller from its own geometry. It is also the\n clearer signal \u2014 the row lands exactly where the line is.\n Positioned against the body, with the viewport's scroll subtracted, so\n it stays put while the content moves under it during auto-scroll. -->\n @if (dropIndicatorTop !== null) {\n <div class=\"one-row-drop-indicator\" aria-hidden=\"true\"\n [style.top.px]=\"dropIndicatorTop\"\n [style.width.px]=\"dropIndicatorWidth\"></div>\n }\n\n <!-- Keyboard reordering has no drag image to watch, so it narrates instead.\n Assertive because the message is the only feedback that the row moved. -->\n <div class=\"one-grid-visually-hidden\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">{{ dragAnnouncement }}</div>\n @if (!nodes?.length) {\n <span class=\"one-grid-empty-message\" style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">No Rows to Show</span>\n }\n\n @if (pinnedBottomNodes.length) {\n <div #pinnedViewport class=\"one-pinned-rows one-pinned-rows-bottom\" role=\"rowgroup\">\n <ng-container [ngTemplateOutlet]=\"pinnedRows\" [ngTemplateOutletContext]=\"{ nodes: pinnedBottomNodes, side: 'bottom' }\"></ng-container>\n </div>\n }\n</div>\n\n<!-- Pinned rows are display-only: they render exactly what a data cell renders,\n but carry none of its interactions. A totals row should not open an editor\n on double-click or start a range selection on drag. -->\n<ng-template #pinnedRows let-nodes=\"nodes\" let-side=\"side\">\n @for (node of nodes; track node.rowId) {\n <div class=\"one-row one-row-pinned\"\n role=\"row\"\n [attr.aria-rowindex]=\"pinnedRowAriaIndex(node, side)\"\n [attr.data-row-id]=\"node.rowId\">\n @for (column of columnDefs; track column.field) {\n <div\n class=\"one-column\"\n role=\"gridcell\"\n [attr.aria-colindex]=\"$index + 1\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [class.one-column-pinned-left]=\"column.pinned === 'left'\"\n [class.one-column-pinned-right]=\"column.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"column._pinnedEdge\"\n [style.left.px]=\"column.pinned === 'left' ? column._pinnedOffset : null\"\n [style.right.px]=\"column.pinned === 'right' ? column._pinnedOffset : null\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\">\n\n @if (column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px', position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellClass(column, cellParams(node, column))\"\n [ngStyle]=\"colService.resolveCellStyle(column, cellParams(node, column))\">\n <div class=\"one-cell-text\">{{ (node.cellStates | cellStateRenderer:column.field) }}</div>\n </div>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n\n<!-- Master Column Template -->\n<ng-template #cellTemplate let-node=\"node\" let-rowIndex=\"rowIndex\" let-column=\"column\" let-colIndex=\"colIndex\">\n <div\n class=\"one-column\"\n role=\"gridcell\"\n [attr.aria-colindex]=\"colIndex + 1\"\n [attr.tabindex]=\"isActiveCell(node, column) ? 0 : -1\"\n [class.one-cell-active]=\"isActiveCell(node, column)\"\n (focus)=\"onCellFocus(node, column)\"\n [attr.data-cell-id]=\"node.rowId | cellKey:column.field\"\n [class.one-column-pinned-left]=\"column.pinned === 'left'\"\n [class.one-column-pinned-right]=\"column.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"column._pinnedEdge\"\n [style.left.px]=\"column.pinned === 'left' ? column._pinnedOffset : null\"\n [style.right.px]=\"column.pinned === 'right' ? column._pinnedOffset : null\"\n [style.width.px]=\"column?.width\"\n [style.min-width.px]=\"column?.minWidth\"\n [style.max-width.px]=\"column?.maxWidth\"\n [class.one-column-border-top]=\"masterDetail && nodes?.length > 0 && nodes[node.rowIndex - 1]?.expanded\"\n [class.one-cell-selected]=\"selectedCells | cellSelected:node.rowId:column.field\"\n [class.one-cell-invalid]=\"node.cellStates | cellInvalid:node.data[column.field]:column:node:allowedEdit:submitted\"\n (dblclick)=\"startEdit($event, node, column)\"\n (mousedown)=\"startSelection(node.rowId, column.field)\"\n (mouseenter)=\"extendSelection(node.rowId, column.field)\"\n (mouseup)=\"endSelection()\">\n\n <!-- One Grid Cell Option -->\n @if (node.cellOptions[column.field]) {\n <one-grid-cell-option-menu\n #contextOptionMenuRef\n [node]=\"node\"\n [column]=\"column\"\n [options]=\"column.cellOptionMenu\"\n (cellOptionMenuSelect)=\"cellOptionMenuSelected($event)\"\n (cellOptionMenuClose)=\"cellOptionMenuClosed()\"/>\n }\n\n <!-- Grid Cell Template -->\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else if (node.editing[column.field]) {\n @if (column?.cellRendererParams?.inputType === 'select') {\n <!-- Cell Editing Select. Commits on change \u2014 picking an option\n is the whole edit \u2014 with blur as the keyboard fallback. -->\n <select class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n (change)=\"stopEditSelect(node, column, $event)\"\n (blur)=\"stopEditSelect(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\">\n @for (option of column?.cellRendererParams?.selectOptions ?? []; track $index) {\n <option [selected]=\"option.value === node.data[column.field]\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <!-- Cell Editing Input -->\n <input class=\"one-cell-input\"\n name=\"{{ node.rowId + '' + column.field }}\"\n oneCellInputValidator\n [validationType]=\"column?.cellRendererParams?.inputType === 'number' ? 'number' : 'none'\"\n [placeholder]=\"column?.cellRendererParams?.placeholder\"\n [type]=\"column?.cellRendererParams?.inputType === 'number' ? 'text' : column?.cellRendererParams?.inputType\"\n [value]=\"node?.data[column?.field]\"\n [maxLength]=\"250\"\n (blur)=\"stopEdit(node, column, $event)\"\n (keydown.enter)=\"stopEdit(node, column, $event)\"\n (keydown.esc)=\"cancelEdit(node, column)\"\n />\n }\n }\n @else if (column?.cellRenderer) {\n <div\n [ngStyle]=\"{ width: column.width + 'px' , position: 'relative' }\"\n [innerHTML]=\"node.cellStates | cellStateRenderer:column.field\"\n [class.editable-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n </div>\n }\n @else {\n <div class=\"one-cell\"\n [class.align-content-left]=\"column?.alignContent === 'left'\"\n [class.align-content-center]=\"column?.alignContent === 'center'\"\n [class.align-content-right]=\"column?.alignContent === 'right'\"\n [ngClass]=\"colService.resolveCellClass(column, cellParams(node, column))\"\n [ngStyle]=\"colService.resolveCellStyle(column, cellParams(node, column))\"\n [style.padding-left.px]=\"column.autoGroupField && node.level | cellLevelPadding:24\"\n [class.one-cell-allowed-edit-active]=\"node.cellStates | cellEditable:column:node:cellService.editableFn:cellService.updatableFn:allowedEdit\">\n\n <!-- Row Drag Handle -->\n @if (cellService.rowDragFn(column, node)) {\n <one-grid-row-drag-handle\n [node]=\"node\"\n [suppressedReason]=\"rowDragSuppressed\"\n (dragEnd)=\"onRowDragEnd($event)\"\n />\n }\n\n <!-- Cell Checkbox Selection -->\n @if (column?.checkboxSelection) {\n <one-grid-checkbox\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [api]=\"api\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n />\n }\n\n <!-- Expand & Collapse Icon -->\n @if (((node?.group || detailRendererComponent) && column?.autoGroupField) || (masterDetail && node?.expandable && gridType === 'master' && column?.masterGroupField)) {\n <one-grid-cell-group-renderer\n [node]=\"node\"\n [masterDetail]=\"masterDetail\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n />\n }\n\n @if(column?.cellRendererComponent) {\n <ng-container\n oneCellRendererComponent\n [cellRendererComponent]=\"column?.cellRendererComponent\"\n [params]=\"rendererParams(node, column)\">\n </ng-container>\n }\n @else {\n <!-- Cell Value OR Placeholder -->\n <div oneCellTextExpand class=\"one-cell-text\" [class.one-cell-placeholder]=\"node.cellStates[column.field]?.type === 'placeholder'\">\n {{ (node.cellStates | cellStateRenderer:column.field) }}\n </div>\n }\n\n <!-- Cell Action Buttons -->\n @if (column.cellRendererParams | cellActionButtonEnable) {\n <one-grid-row-action\n [ngStyle]=\"{ marginLeft: 'auto' }\"\n [column]=\"column\"\n [node]=\"node\"\n [allowedEdit]=\"allowedEdit\"\n [masterNode]=\"masterNode\"\n [masterDetail]=\"masterDetail\"\n [gridType]=\"gridType\"\n [context]=\"context\"\n [cellRendererParams]=\"column?.cellRendererParams\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowDetail)=\"invokeRowActionDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n />\n }\n </div>\n }\n </div>\n</ng-template>\n" }]
|
|
1148
1152
|
}], ctorParameters: () => [{ type: i1.OgColumnService }, { type: i2.OneGridCellService }, { type: i3.OneGridEventService }, { type: i4.OneGridRowDragService }, { type: i0.ChangeDetectorRef }], propDecorators: { bodyRef: [{
|
|
1149
1153
|
type: ViewChild,
|
|
1150
1154
|
args: ['bodyRef', { static: true }]
|
|
@@ -1206,6 +1210,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1206
1210
|
type: Input
|
|
1207
1211
|
}], onRowGotoDetail: [{
|
|
1208
1212
|
type: Output
|
|
1213
|
+
}], onRowDetail: [{
|
|
1214
|
+
type: Output
|
|
1209
1215
|
}], onRowAddNew: [{
|
|
1210
1216
|
type: Output
|
|
1211
1217
|
}], onRowView: [{
|
|
@@ -1253,4 +1259,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1253
1259
|
type: HostListener,
|
|
1254
1260
|
args: ['document:mouseup']
|
|
1255
1261
|
}] } });
|
|
1256
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtYm9keS9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1ib2R5L29uZS1ncmlkLWJvZHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWdDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLdE8sT0FBTyxFQUFXLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDNUYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDM0gsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sa0VBQWtF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LE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQXdWUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBa0IxQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVHlwZSwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENlbGxTZWxlY3Rpb24sIE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXMsIE9uZUNlbGxSZW5kZXJlclBhcmFtcywgT25lQ29sdW1uRGVmIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLXRyZWUtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgT25lR3JpZEFwaSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT25lR3JpZEdldFJvd0lkUGFyYW1zLCBPbmVHcmlkUmVhZHlFdmVudCwgT25lR3JpZFJvd0FjdGlvbkV2ZW50LCBPbmVHcmlkVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50LCBDb2x1bW5DaGFuZ2VkRXZlbnQsIEV4cGFuc2lvbkNoYW5nZWRFdmVudCwgUGlubmVkUm93RGF0YUNoYW5nZWRFdmVudCwgUm93RGF0YUNoYW5nZWRFdmVudCwgUm93T3JkZXJDaGFuZ2VkRXZlbnQsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCwgU29ydENoYW5nZWRFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtbWFzdGVyLWRldGFpbC5tb2RlbCc7XG5pbXBvcnQgeyBDZWxsRWRpdGFibGVQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWVkaXRhYmxlLnBpcGUnO1xuaW1wb3J0IHsgZ2V0Q2VsbEtleSwgZ2V0RmllbGRWYWx1ZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvb25lLWNlbGwuaGVscGVyJztcbmltcG9ydCB7IE9uZUdyaWRDZWxsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBPZ0NvbHVtblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29nLWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCB7IHJlc29sdmVDb2x1bW5XaWR0aCB9IGZyb20gJy4uLy4uL2hlbHBlcnMvb25lLWNvbHVtbi1kZWYuaGVscGVyJztcbmltcG9ydCB7IE9uZUdyaWRSb3dEcmFnU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtcm93LWRyYWcuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dEcmFnRXZlbnQsIE9uZVJvd0RyYWdTdGF0ZSwgT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtcm93LWRyYWcubW9kZWwnO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBPbmVHcmlkQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1jaGVja2JveC9vbmUtZ3JpZC1jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lR3JpZENlbGxHcm91cFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vb25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlci9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbE9wdGlvbk1lbnVDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51L29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE9uZUdyaWRSb3dBY3Rpb25Db21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1yb3ctYWN0aW9uL29uZS1ncmlkLXJvdy1hY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE9uZUdyaWRSb3dEcmFnSGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vb25lLWdyaWQtcm93LWRyYWctaGFuZGxlL29uZS1ncmlkLXJvdy1kcmFnLWhhbmRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lQ2VsbElucHV0VmFsaWRhdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vY29yZS9kaXJlY3RpdmVzL29uZS1jZWxsLWlucHV0LXZhbGlkYXRvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vY29yZS9kaXJlY3RpdmVzL29uZS1jZWxsLXJlbmRlcmVyLWNvbXBvbmVudC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgT25lQ2VsbFRleHRFeHBhbmREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvb25lLWNlbGwtdGV4dC1leHBhbmQuZGlyZWN0aXZlJztcbmltcG9ydCB7IENlbGxBY3Rpb25CdXR0b25FbmFibGVQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWFjdGlvbi1idXR0b24tZW5hYmxlLnBpcGUnO1xuaW1wb3J0IHsgQ2VsbEludmFsaWRQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWludmFsaWQucGlwZSc7XG5pbXBvcnQgeyBDZWxsS2V5UGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1rZXkucGlwZSc7XG5pbXBvcnQgeyBDZWxsTGV2ZWxQYWRkaW5nUGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1sZXZlbC1wYWRkaW5nLnBpcGUnO1xuaW1wb3J0IHsgQ2VsbFNlbGVjdGVkUGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1zZWxlY3RlZC5waXBlJztcbmltcG9ydCB7IENlbGxTdGF0ZVJlbmRlcmVyUGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1zdGF0ZS1yZW5kZXJlci5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0NsYXNzLFxuICAgIE5nU3R5bGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgT25lR3JpZENoZWNrYm94Q29tcG9uZW50LFxuICAgIE9uZUdyaWRDZWxsR3JvdXBSZW5kZXJlckNvbXBvbmVudCxcbiAgICBPbmVHcmlkQ2VsbE9wdGlvbk1lbnVDb21wb25lbnQsXG4gICAgT25lR3JpZFJvd0FjdGlvbkNvbXBvbmVudCxcbiAgICBPbmVHcmlkUm93RHJhZ0hhbmRsZUNvbXBvbmVudCxcbiAgICBPbmVDZWxsSW5wdXRWYWxpZGF0b3JEaXJlY3RpdmUsXG4gICAgT25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50RGlyZWN0aXZlLFxuICAgIE9uZUNlbGxUZXh0RXhwYW5kRGlyZWN0aXZlLFxuICAgIENlbGxBY3Rpb25CdXR0b25FbmFibGVQaXBlLFxuICAgIENlbGxFZGl0YWJsZVBpcGUsXG4gICAgQ2VsbEludmFsaWRQaXBlLFxuICAgIENlbGxLZXlQaXBlLFxuICAgIENlbGxMZXZlbFBhZGRpbmdQaXBlLFxuICAgIENlbGxTZWxlY3RlZFBpcGUsXG4gICAgQ2VsbFN0YXRlUmVuZGVyZXJQaXBlLFxuICBdLFxuICBzZWxlY3RvcjogJ29uZS1ncmlkLWJvZHknLFxuICAvLyBUaGUgaG9zdCBzaXRzIGJldHdlZW4gcm9sZT1cImdyaWRcIiBhbmQgdGhlIHJvd3MgaXQgbXVzdCBvd247IGEgZ2VuZXJpY1xuICAvLyBlbGVtZW50IHRoZXJlIGJyZWFrcyB0aGUgb3duZXJzaGlwIGNoYWluLCBzbyBpdCBsZWF2ZXMgdGhlIGExMXkgdHJlZS5cbiAgaG9zdDogeyAncm9sZSc6ICdwcmVzZW50YXRpb24nIH0sXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWJvZHkuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZEJvZHlDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIENvcmUgUHJvcGVydGllc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnYm9keVJlZicsIHsgc3RhdGljOiB0cnVlIH0pIGJvZHlSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgcm93RGF0YTogVFtdID0gW107XG4gIEBJbnB1dCgpIHJvd051bWJlcjogYm9vbGVhbjtcbiAgQElucHV0KCkgYXBpITogT25lR3JpZEFwaTxUPjtcbiAgQElucHV0KCkgcGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd2VkRWRpdDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGVuYWJsZUdyb3VwQ29sdW1uRGVmczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzdWJtaXR0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogYCdmdWxsUm93J2A6IGEgZG91YmxlLWNsaWNrIG9wZW5zIGV2ZXJ5IGVkaXRhYmxlIGNlbGwgb2YgdGhlIHJvdywgRW50ZXIgb3JcbiAgICogZm9jdXMgbGVhdmluZyB0aGUgcm93IGNvbW1pdHMgdGhlbSB0b2dldGhlciwgRXNjYXBlIGNsb3NlcyB0aGVtIGFsbFxuICAgKiB3aXRob3V0IGNvbW1pdHRpbmcuIERlZmF1bHQ6IG9uZSBjZWxsIGF0IGEgdGltZS5cbiAgICovXG4gIEBJbnB1dCgpIGVkaXRUeXBlOiAnZnVsbFJvdycgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgY29udGV4dDogYW55ID0gbnVsbDtcbiAgQElucHV0KCkgZ2V0Um93SWQ6IChwYXJhbXM6IE9uZUdyaWRHZXRSb3dJZFBhcmFtczxUPikgPT4gc3RyaW5nO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBncmlkQ29weSQhOiBTdWJqZWN0PENsaXBib2FyZEV2ZW50PjtcblxuICAvKipcbiAgICogUGlubmVkIHJvd3MgYXJlIGJvdW5kIG9ubHkgc28gdGhlIGNvbXBvbmVudCByZS1yZW5kZXJzIHdoZW4gdGhleSBjaGFuZ2U7XG4gICAqIHRoZSBub2RlcyB0aGVtc2VsdmVzIGNvbWUgZnJvbSB0aGUgQVBJLCB3aGljaCBvd25zIHRoZW0uXG4gICAqL1xuICBASW5wdXQoKSBwaW5uZWRUb3BSb3dEYXRhOiBUW10gPSBbXTtcbiAgQElucHV0KCkgcGlubmVkQm90dG9tUm93RGF0YTogVFtdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBwaW5uZWQgcm93IGNvbnRhaW5lcnMgc2l0IG91dHNpZGUgdGhlIHNjcm9sbCB2aWV3cG9ydCwgc28gdGhleSBoYXZlIHRvXG4gICAqIGJlIHRvbGQgdGhlIGhvcml6b250YWwgb2Zmc2V0IOKAlCB0aGUgc2FtZSBhcnJhbmdlbWVudCB0aGUgaGVhZGVyIHVzZXMuXG4gICAqL1xuICBAVmlld0NoaWxkcmVuKCdwaW5uZWRWaWV3cG9ydCcpIHByaXZhdGUgcGlubmVkVmlld3BvcnRzPzogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICBwcm90ZWN0ZWQgcGlubmVkVG9wTm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcm90ZWN0ZWQgcGlubmVkQm90dG9tTm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgdmlld3BvcnQhOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgcHJvdGVjdGVkIGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdID0gW107XG4gIHByb3RlY3RlZCBjZWxsUmVuZGVyZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBQcm9wZXJ0aWVzXG4gICAqL1xuICBASW5wdXQoKSBncmlkVHlwZTogT25lR3JpZFR5cGUgPSAnc2ltcGxlJztcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc3Rlck5vZGU6IE9uZVJvd05vZGU8VD4gPSBudWxsO1xuICAvLyBASW5wdXQoKSBkZXRhaWxSb3dIZWlnaHQ6IG51bWJlciA9IG51bGw7XG4gIC8vIEBJbnB1dCgpIGRldGFpbFJvd0F1dG9IZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGV0YWlsUm93TWF4SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgQElucHV0KCkgZGV0YWlsR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPiA9IG51bGw7XG4gIEBJbnB1dCgpIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50OiBUeXBlPE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudD47XG5cbiAgLyoqXG4gICAqIFRyZWUgRGF0YSBQcm9wZXJ0aWVzXG4gICAqL1xuICBASW5wdXQoKSB0cmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0cmVlRGF0YUNoaWxkcmVuRmllbGQ6IHN0cmluZztcbiAgQElucHV0KCkgYXV0b0dyb3VwQ29sdW1uRGVmOiBPbmVDb2x1bW5EZWY8VD47XG4gIEBJbnB1dCgpIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAtMTsgLy8gSXQncyB3b3JrIHdpdGggbWFzdGVyIGRldGFpbCBhbHNvXG5cbiAgLyoqXG4gICAqIFBhc3NpbmcgUm93IEFjdGlvbiBFdmVudHMgdG8gUGFyZW50XG4gICAqL1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvRGV0YWlsID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0FkZE5ldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0NvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TG9jYXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RG9jdW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0dvdG9MaXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93UHJpbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93SGlzdG9yeSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TGFuZ3VhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q2VsbE9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uU2hpZnREb3VibGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgcm93Q291bnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQE91dHB1dCgpIGV4cGFuc2lvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIGJvZHlTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGNlbGxPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZVJvd0RyYWdFdmVudDxUPj4oKTtcblxuICAvKipcbiAgICogU2VsZWN0aW9uIFJhbmdlIFZhcmlhYmxlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJvd1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgbm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBSb3cgZHJhZyBzdGF0ZSwgbWlycm9yZWQgZnJvbSB0aGUgc2VydmljZSBzbyB0aGUgdGVtcGxhdGUgY2FuIHJlYWQgaXRcbiAgICogc3luY2hyb25vdXNseS4gYG51bGxgIHdoZW5ldmVyIG5vIGRyYWcgaXMgaW4gZmxpZ2h0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGRyYWdTdGF0ZTogT25lUm93RHJhZ1N0YXRlIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBkcmFnQW5ub3VuY2VtZW50ID0gJyc7XG4gIHByb3RlY3RlZCByb3dEcmFnU3VwcHJlc3NlZDogT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkQ2VsbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBpc01vdXNlRG93biA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXJ0Q2VsbDogQ2VsbFNlbGVjdGlvbiA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFNjcm9sbExlZnQgPSAwO1xuICBwcml2YXRlIGNlbGxFZGl0YWJsZVBpcGUgPSBuZXcgQ2VsbEVkaXRhYmxlUGlwZSgpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJvdGVjdGVkIGNlbGxSZW5kZXJlclBhcmFtczogT25lQ2VsbFJlbmRlcmVyUGFyYW1zID0ge1xuICAgICAgZ290b0RldGFpbEJ1dHRvblN0YXR1czogMSxcbiAgICAgIGFkZE5ld0J1dHRvblN0YXR1czogMSxcbiAgICAgIHZpZXdCdXR0b25TdGF0dXM6IDEsXG4gICAgICBsb2NhdGlvbkJ1dHRvblN0YXR1czogMSxcbiAgICAgIGRvY3VtZW50QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgY29weUJ1dHRvblN0YXR1czogMSxcbiAgICAgIGRlbGV0ZUJ1dHRvblN0YXR1czogMSxcbiAgICAgIGdvdG9MaXN0QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgb3B0aW9uQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgbGFuZ3VhZ2VCdXR0b25TdGF0dXM6IDEsXG4gICAgICBlZGl0QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgcHJpbnRCdXR0b25TdGF0dXM6IDEsXG4gICAgICBoaXN0b3J5QnV0dG9uU3RhdHVzOiAxLFxuICB9XG5cbiAgLyoqXG4gICAqIFZpcnR1YWwgU2Nyb2xsIFByb3BlcnRpZXNcbiAgICovXG4gIHByb3RlY3RlZCBpdGVtU2l6ZTogbnVtYmVyID0gMzA7XG4gIHByb3RlY3RlZCBtaW5CdWZmZXJQeDogbnVtYmVyID0gMjAwO1xuICBwcm90ZWN0ZWQgbWF4QnVmZmVyUHg6IG51bWJlciA9IDQwMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY29sU2VydmljZTogT2dDb2x1bW5TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZWxsU2VydmljZTogT25lR3JpZENlbGxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXZlbnRTZXJ2aWNlOiBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3dEcmFnU2VydmljZTogT25lR3JpZFJvd0RyYWdTZXJ2aWNlPFQ+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIEdyaWQgQ29weSBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ncmlkQ29weSQuc3Vic2NyaWJlKChldmVudDogQ2xpcGJvYXJkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5vbkdyaWRDb3B5KGV2ZW50KTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBSb3cgZHJhZ1xuICAgICAqXG4gICAgICogVGhlIHNlcnZpY2Ugb3ducyB0aGUgZ2VzdHVyZTsgdGhlIGJvZHkgb25seSByZW5kZXJzIGl0IGFuZCBsZW5kcyBpdCB0aGVcbiAgICAgKiB2aWV3cG9ydCwgdGhlIHJvdyBoZWlnaHQgYW5kIGEgd2F5IHRvIGFwcGx5IGEgbW92ZS4gVGhlIHN1cHByZXNzaW9uXG4gICAgICogcmVhc29uIGlzIHJlLXJlYWQgb24gZXZlcnkgZXZlbnQgdGhhdCBjb3VsZCBjaGFuZ2UgdGhlIG9yZGVyLCBzbyB0aGVcbiAgICAgKiBoYW5kbGUgZGlzYWJsZXMgaXRzZWxmIHRoZSBtb21lbnQgYSBzb3J0IG9yIGZpbHRlciBpcyBhcHBsaWVkLlxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5yb3dEcmFnU2VydmljZS5zdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuXG4gICAgICB0aGlzLmRyYWdTdGF0ZSA9IHN0YXRlO1xuXG4gICAgICB0aGlzLnVwZGF0ZURyb3BJbmRpY2F0b3IoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLnJvd0RyYWdTZXJ2aWNlLmFubm91bmNlbWVudCQuc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG5cbiAgICAgIHRoaXMuZHJhZ0Fubm91bmNlbWVudCA9IG1lc3NhZ2U7XG5cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBDb2x1bW4gQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsIChwYXlsb2FkOiBDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5jb2x1bW5EZWZzID0gWy4uLnBheWxvYWQuY29sdW1uc10gYXMgT25lQ29sdW1uRGVmW107XG5cbiAgICAgIC8vIFBhcmFtcyBjYXJyeSB0aGUgY29sdW1uRGVmLCBzbyBhIGNvbHVtbiBjaGFuZ2UgaW52YWxpZGF0ZXMgdGhlbSBhbGwuXG4gICAgICB0aGlzLnJlbmRlcmVyUGFyYW1zQ2FjaGUuY2xlYXIoKTtcblxuICAgICAgdGhpcy5jZWxsUmVuZGVyZXIgPSB0aGlzLmNvbHVtbkRlZnMuc29tZShjb2wgPT4gY29sLmNlbGxSZW5kZXJlckNvbXBvbmVudCk7XG5cbiAgICAgIHRoaXMucm93V2lkdGggPSB0aGlzLmNvbHVtbkRlZnMucmVkdWNlKChzdW0sIGNvbCkgPT4gc3VtICsgcmVzb2x2ZUNvbHVtbldpZHRoKGNvbCksIDApO1xuXG4gICAgICAvLyBBIGNvbHVtbiBjaGFuZ2UgY2FuIGFsdGVyIHRoZSB3aWR0aCBsZWZ0IGZvciBmbGV4IGNvbHVtbnMgKGEgaGlkZSwgYVxuICAgICAgLy8gcmVzaXplLCBuZXcgZGVmcykuIFJlLWZsZXhpbmcgb25seSBkaXNwYXRjaGVzIHdoZW4gYSB3aWR0aCBhY3R1YWxseVxuICAgICAgLy8gY2hhbmdlcywgc28gdGhpcyBjYW5ub3QgcGluZy1wb25nLlxuICAgICAgdGhpcy5hcHBseUZsZXhXaWR0aHMoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFJvdyBEYXRhIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd0RhdGFDaGFuZ2VkJywgKHsgbm9kZXM6IGFsbE5vZGVzIH06IFJvd0RhdGFDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgLy8gVGhlIGZ1bGwgcG9zdC1maWx0ZXIgY291bnQsIHJlcG9ydGVkIGJlZm9yZSB0aGUgcGFnZSBzbGljZSBpcyB0YWtlbixcbiAgICAgIC8vIHNvIHRoZSBob3N0J3MgcGFnaW5nIHRvdGFscyBzZWUgZXZlcnl0aGluZy5cbiAgICAgIHRoaXMucm93Q291bnRDaGFuZ2VkLmVtaXQoYWxsTm9kZXM/Lmxlbmd0aCA/PyAwKTtcblxuICAgICAgLy8gTmV3IHJvd3MsIG5ldyByZW5kZXJlciBwYXJhbXMg4oCUIGFuZCByZW1vdmVkIHJvd3MgbGVhdmUgbm8gc3RhbGVcbiAgICAgIC8vIGNhY2hlIGVudHJpZXMgYmVoaW5kLlxuICAgICAgdGhpcy5yZW5kZXJlclBhcmFtc0NhY2hlLmNsZWFyKCk7XG5cbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5hcGkucGFnZU5vZGVzKGFsbE5vZGVzKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgdGhpcy52aWV3cG9ydD8uY2hlY2tWaWV3cG9ydFNpemUoKTtcblxuICAgICAgICB0aGlzLnNldFZpcnR1YWxTY3JvbGwobm9kZXM/Lmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgICAgICB0aGlzLm5vZGVzID0gbm9kZXMubWFwKChub2RlOiBPbmVSb3dOb2RlKSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChub2RlLmxlYWYgJiYgdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgIG5vZGUuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXRhaWwgcm93cyBjYW4gc3RpbGwgYmUgaW4gZmxpZ2h0IHdoZW4gYSByb3cgaXMgZXhwYW5kZWQsIGFuZFxuICAgICAgICAgICAgLy8gc3ByZWFkaW5nIG51bGwgdGhyb3dzLiBOb3RoaW5nIHRvIHJlLXNlZWQgdW50aWwgdGhleSBhcnJpdmUuXG4gICAgICAgICAgICBpZiAobm9kZS5leHBhbmRlZCAmJiBub2RlLmRldGFpbFJvd0RhdGEpIHtcblxuICAgICAgICAgICAgICB0aGlzLmFwaS5zZXREZXRhaWxSb3dEYXRhKG5vZGUsIFsuLi5ub2RlLmRldGFpbFJvd0RhdGFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIHRoaXMubm9kZXMgPSBub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpO1xuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gUGlubmVkIFJvdyBEYXRhIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Bpbm5lZFJvd0RhdGFDaGFuZ2VkJywgKHsgc2lkZSwgbm9kZXMgfTogUGlubmVkUm93RGF0YUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyUGFyYW1zQ2FjaGUuY2xlYXIoKTtcblxuICAgICAgaWYgKHNpZGUgPT09ICd0b3AnKSB7XG5cbiAgICAgICAgdGhpcy5waW5uZWRUb3BOb2RlcyA9IG5vZGVzIGFzIE9uZVJvd05vZGU8VD5bXTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICB0aGlzLnBpbm5lZEJvdHRvbU5vZGVzID0gbm9kZXMgYXMgT25lUm93Tm9kZTxUPltdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gU29ydCBDaGFuZ2VkIEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzb3J0Q2hhbmdlZCcsICh7IG5vZGVzIH06IFNvcnRDaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5ub2RlcyA9IHRoaXMuYXBpLnBhZ2VOb2Rlcyhub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W10pO1xuXG4gICAgICAvLyBTb3J0aW5nIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgb3JkZXIgYXdheSBmcm9tIHRoZSB1c2VyLCBzbyB0aGUgaGFuZGxlc1xuICAgICAgLy8gaGF2ZSB0byBkaXNhYmxlIGluIHRoZSBzYW1lIGZyYW1lIHRoZSByb3dzIHJlLXNvcnQuXG4gICAgICB0aGlzLnJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpO1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gUm93IE9yZGVyIENoYW5nZWQgRXZlbnRcbiAgICAgKlxuICAgICAqIERlbGliZXJhdGVseSBub3QgZm9sZGVkIGludG8gYHJvd0RhdGFDaGFuZ2VkYDogdGhhdCBwYXRoIGRlZmVycyBhIGZyYW1lXG4gICAgICogYW5kIHJlLXNlZWRzIGRldGFpbCByb3dzLCB3aGljaCBpcyByaWdodCBmb3IgYSBkYXRhIGxvYWQgYW5kIGZhciB0b28gbXVjaFxuICAgICAqIGZvciBhIG1vdmUuIEEgcmVvcmRlciBpcyB0aGUgc2FtZSBub2RlcyBpbiBhIGRpZmZlcmVudCBvcmRlci5cbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd09yZGVyQ2hhbmdlZCcsICh7IG5vZGVzIH06IFJvd09yZGVyQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmFwaS5wYWdlTm9kZXMoWy4uLm5vZGVzXSBhcyBPbmVSb3dOb2RlPFQ+W10pO1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gQ2VsbCBTdGF0ZSBDaGFuZ2VkIEV2ZW50XG4gICAgICpcbiAgICAgKiBUaGUgYm9keSByZW5kZXJzIE9uUHVzaCwgc28gcmVnZW5lcmF0aW5nIGEgcm93J3MgY2VsbCBzdGF0ZSBpcyBpbnZpc2libGVcbiAgICAgKiB1bnRpbCBzb21ldGhpbmcgbWFya3MgdGhlIGJvZHkgZGlydHkuIFRoaXMgaXMgdGhhdCBzb21ldGhpbmcuXG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjZWxsU3RhdGVDaGFuZ2VkJywgKCkgPT4ge1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gU2VsZWN0aW9uIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGlvbkNoYW5nZWQnLCAocGF5bG9hZDogU2VsZWN0aW9uQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgIGlmIChwYXlsb2FkKSB7XG5cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgb25HcmlkUmVhZHkocGFyYW1zOiBPbmVHcmlkUmVhZHlFdmVudCkge1xuXG4gICAgcGFyYW1zLmFwaS5zZXRSb3dEYXRhKHRoaXMubWFzdGVyTm9kZT8uZGV0YWlsUm93RGF0YSA/PyBbXSk7XG4gIH1cblxuICBvbkJvZHlTY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XG5cbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcblxuICAgIGlmIChzY3JvbGxMZWZ0ICE9PSB0aGlzLmxhc3RTY3JvbGxMZWZ0KSB7XG5cbiAgICAgIHRoaXMubGFzdFNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuXG4gICAgICB0aGlzLnN5bmNQaW5uZWRSb3dzKHNjcm9sbExlZnQpO1xuXG4gICAgICB0aGlzLmJvZHlTY3JvbGwuZW1pdChzY3JvbGxMZWZ0KTtcblxuICAgICAgLy8gVGhlIGluZGljYXRvciBpcyBjbGlwcGVkIHRvIHRoZSByb3cgY29udGVudCwgd2hpY2ggbW92ZXMgc2lkZXdheXMgdG9vLlxuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG5cbiAgICAgICAgdGhpcy51cGRhdGVEcm9wSW5kaWNhdG9yKCk7XG5cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWZXJ0aWNhbDogdGhlIGRyb3AgaW5kaWNhdG9yIGlzIGFuY2hvcmVkIHRvIHRoZSBib2R5LCBub3QgdGhlIGNvbnRlbnQsIHNvXG4gICAgLy8gaXQgaGFzIHRvIGJlIHJlcG9zaXRpb25lZCBhcyB0aGUgcm93cyBtb3ZlIGJlbmVhdGggaXQg4oCUIHdoaWNoIHRoZXkgZG8gb25cbiAgICAvLyB0aGVpciBvd24gZHVyaW5nIGF1dG8tc2Nyb2xsLCB3aXRoIHRoZSBwb2ludGVyIHN0YW5kaW5nIHN0aWxsLlxuICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuXG4gICAgICB0aGlzLnVwZGF0ZURyb3BJbmRpY2F0b3IoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIHBpbm5lZCByb3dzIGluIHN0ZXAgd2l0aCB0aGUgYm9keSdzIGhvcml6b250YWwgcG9zaXRpb24uXG4gICAqXG4gICAqIEFzc2lnbmVkIHJhdGhlciB0aGFuIHRyYW5zZm9ybWVkLCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBoZWFkZXI6IHN0aWNreVxuICAgKiBwb3NpdGlvbmluZyBmb3IgcGlubmVkICpjb2x1bW5zKiBoYXMgdG8gcmVzb2x2ZSBhZ2FpbnN0IGEgcmVhbCBzY3JvbGxwb3J0LFxuICAgKiBhbmQgYSB0cmFuc2Zvcm1lZCBhbmNlc3RvciBpcyBub3Qgb25lLiBQaW5uZWQgcm93cyBhbmQgcGlubmVkIGNvbHVtbnNcbiAgICogdGhlcmVmb3JlIGNvbXBvc2Ug4oCUIGEgZnJvemVuIGNvcm5lciBjZWxsIHN0YXlzIGZyb3plbiBvbiBib3RoIGF4ZXMuXG4gICAqL1xuICBwcml2YXRlIHN5bmNQaW5uZWRSb3dzKHNjcm9sbExlZnQ6IG51bWJlcik6IHZvaWQge1xuXG4gICAgdGhpcy5waW5uZWRWaWV3cG9ydHM/LmZvckVhY2godmlld3BvcnQgPT4gKHZpZXdwb3J0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBSZW5kZXJpbmcgUm93IE5vZGUgQnkgUm93IElEXG4gICAqL1xuICB0cmFja0J5Um93SWQoaW5kZXg6IG51bWJlciwgbm9kZTogT25lUm93Tm9kZTxUPik6IHN0cmluZyB7XG5cbiAgICByZXR1cm4gbm9kZS5yb3dJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDZWxsIFNlbGVjdGlvbiBSYW5nZSBGZWF0dXJlXG4gICAqL1xuICBzdGFydFNlbGVjdGlvbihyb3dJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nKSB7XG5cbiAgICB0aGlzLmlzTW91c2VEb3duID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IHsgcm93SWQsIGZpZWxkIH07XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkQ2VsbHMpLmFkZChnZXRDZWxsS2V5KHJvd0lkLCBmaWVsZCkpO1xuICB9XG5cbiAgZXh0ZW5kU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIGlmICghdGhpcy5pc01vdXNlRG93biB8fCAhdGhpcy5zdGFydENlbGwpIHJldHVybjtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLm5vZGVzOyAvLyBhbHJlYWR5IHNvcnRlZFxuICAgIGNvbnN0IHN0YXJ0Um93SW5kZXggPSByb3dzLmZpbmRJbmRleChyID0+IHIucm93SWQgPT09IHRoaXMuc3RhcnRDZWxsIS5yb3dJZCk7XG4gICAgY29uc3QgZW5kUm93SW5kZXggICA9IHJvd3MuZmluZEluZGV4KHIgPT4gci5yb3dJZCA9PT0gcm93SWQpO1xuXG4gICAgaWYgKHN0YXJ0Um93SW5kZXggPT09IC0xIHx8IGVuZFJvd0luZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29sU3RhcnRJbmRleCA9IHRoaXMuY29sdW1uRGVmcy5maW5kSW5kZXgoYyA9PiBjLmZpZWxkID09PSB0aGlzLnN0YXJ0Q2VsbCEuZmllbGQpO1xuICAgIGNvbnN0IGNvbEVuZEluZGV4ICAgPSB0aGlzLmNvbHVtbkRlZnMuZmluZEluZGV4KGMgPT4gYy5maWVsZCA9PT0gZmllbGQpO1xuXG4gICAgaWYgKGNvbFN0YXJ0SW5kZXggPT09IC0xIHx8IGNvbEVuZEluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93U3RhcnQgPSBNYXRoLm1pbihzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3Qgcm93RW5kICAgPSBNYXRoLm1heChzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3QgY29sU3RhcnQgPSBNYXRoLm1pbihjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG4gICAgY29uc3QgY29sRW5kICAgPSBNYXRoLm1heChjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG5cbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGxldCByID0gcm93U3RhcnQ7IHIgPD0gcm93RW5kOyByKyspIHtcbiAgICAgIGZvciAobGV0IGMgPSBjb2xTdGFydDsgYyA8PSBjb2xFbmQ7IGMrKykge1xuICAgICAgICBuZXh0LmFkZChnZXRDZWxsS2V5KHJvd3Nbcl0ucm93SWQsIHRoaXMuY29sdW1uRGVmc1tjXS5maWVsZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDZWxscyA9IG5leHQ7XG4gIH1cblxuXG4gIGVuZFNlbGVjdGlvbigpIHtcblxuICAgIHRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgQ2VsbHMgU2VsZWN0ZWRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5ib2R5UmVmPy5uYXRpdmVFbGVtZW50KSB7XG5cbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmJvZHlSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSk7XG5cbiAgICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gUmFuZ2UgRXZlbnQgSG9sZCBNb3VzZSBDbGlja1xuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcpXG4gIG9uR2xvYmFsTW91c2VVcCgpIHtcblxuICAgIHRoaXMuZW5kU2VsZWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIENvcHkgQ2xpcGJvYXJkIEV2ZW50XG4gICAqL1xuICBvbkdyaWRDb3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMuc2l6ZSA+IDApIHtcblxuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuYnVpbGRDbGlwYm9hcmRUZXh0KCk7XG5cbiAgICAgIGV2ZW50LmNsaXBib2FyZERhdGE/LnNldERhdGEoJ3RleHQvcGxhaW4nLCB0ZXh0KTtcblxuICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLmZvckVhY2goY2VsbElkID0+IHtcblxuICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWNlbGwtaWQ9XCIke2NlbGxJZH1cIl1gKTtcblxuICAgICAgICBpZiAoY2VsbEVsZW1lbnQpIHtcblxuICAgICAgICAgIGNlbGxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29uZS1jZWxsLWNvcGllZCcpO1xuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBjZWxsRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvbmUtY2VsbC1jb3BpZWQnKSwgNDAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29weVRvQ2xpcGJvYXJkKHZhbHVlOiBzdHJpbmcpIHtcblxuICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQpIHtcblxuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodmFsdWUpO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgLy8gRmFsbGJhY2sgKFNhZmFyaSAvIG9sZGVyIGJyb3dzZXJzKVxuICAgICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgdGV4dGFyZWEudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRleHRhcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRleHRhcmVhLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRhcmVhKTtcbiAgICAgIHRleHRhcmVhLnNlbGVjdCgpO1xuICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dGFyZWEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBDb3B5IENlbGwgVGV4dCB0byBDbGlwYm9hcmRcbiAgICovXG4gIHByaXZhdGUgYnVpbGRDbGlwYm9hcmRUZXh0KCk6IHN0cmluZyB7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDZWxscy5zaXplKSByZXR1cm4gJyc7XG5cbiAgICAvLyBQYXJzZSBzZWxlY3RlZCBjZWxsc1xuICAgIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkQ2VsbHMpLm1hcChrZXkgPT4ge1xuXG4gICAgICBjb25zdCBbcm93SWQsIGZpZWxkXSA9IGtleS5zcGxpdCgnLS0nKTtcbiAgICAgIHJldHVybiB7IHJvd0lkLCBmaWVsZCB9O1xuICAgIH0pO1xuXG4gICAgLy8gUmVzb2x2ZSB2aXN1YWwgcm93IGluZGV4ZXMgZnJvbSBkaXNwbGF5ZWRSb3dzXG4gICAgY29uc3Qgcm93SW5kZXhlcyA9IHNlbGVjdGVkXG4gICAgICAubWFwKHMgPT4gdGhpcy5ub2Rlcy5maW5kSW5kZXgociA9PiByLnJvd0lkID09PSBzLnJvd0lkKSlcbiAgICAgIC5maWx0ZXIoaSA9PiBpICE9PSAtMSk7XG5cbiAgICBjb25zdCBjb2xJbmRleGVzID0gc2VsZWN0ZWRcbiAgICAgIC5tYXAocyA9PiB0aGlzLmNvbHVtbkRlZnMuZmluZEluZGV4KGMgPT4gYy5maWVsZCA9PT0gcy5maWVsZCkpXG4gICAgICAuZmlsdGVyKGkgPT4gaSAhPT0gLTEpO1xuXG4gICAgaWYgKCFyb3dJbmRleGVzLmxlbmd0aCB8fCAhY29sSW5kZXhlcy5sZW5ndGgpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHJvd1N0YXJ0ID0gTWF0aC5taW4oLi4ucm93SW5kZXhlcyk7XG4gICAgY29uc3Qgcm93RW5kICAgPSBNYXRoLm1heCguLi5yb3dJbmRleGVzKTtcbiAgICBjb25zdCBjb2xTdGFydCA9IE1hdGgubWluKC4uLmNvbEluZGV4ZXMpO1xuICAgIGNvbnN0IGNvbEVuZCAgID0gTWF0aC5tYXgoLi4uY29sSW5kZXhlcyk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEZpZWxkcyA9IHRoaXMuY29sdW1uRGVmc1xuICAgICAgLnNsaWNlKGNvbFN0YXJ0LCBjb2xFbmQgKyAxKVxuICAgICAgLm1hcChjID0+IGMuZmllbGQpO1xuXG4gICAgY29uc3QgY2xpcGJvYXJkTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGxldCByID0gcm93U3RhcnQ7IHIgPD0gcm93RW5kOyByKyspIHtcblxuICAgICAgY29uc3Qgcm93ID0gdGhpcy5ub2Rlc1tyXTtcbiAgICAgIGNvbnN0IGxpbmUgPSBzZWxlY3RlZEZpZWxkc1xuICAgICAgICAubWFwKGZpZWxkID0+IHtcblxuICAgICAgICAgIGNvbnN0IGtleSA9IGAke3Jvdy5yb3dJZH0tLSR7ZmllbGR9YDtcblxuICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZENlbGxzLmhhcyhrZXkpKSB7XG5cbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKHJvdy5kYXRhLCBmaWVsZCk7XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWUgPz8gJyc7XG5cbiAgICAgICAgfSkuam9pbignXFx0Jyk7XG5cbiAgICAgIGNsaXBib2FyZExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBib2FyZExpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRpbmcgRXZlbnRzIFJvdyBBY3Rpb24gdG8gUGFyZW50XG4gICAqL1xuICBpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvRGV0YWlsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQWRkTmV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dBZGROZXcuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25WaWV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dWaWV3LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTG9jYXRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0xvY2F0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0RvY3VtZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQ29weShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Q29weS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRlbGV0ZShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RGVsZXRlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uR290b0xpc3QoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0dvdG9MaXN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRWRpdChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RWRpdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblByaW50KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dQcmludC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkhpc3RvcnkoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0hpc3RvcnkuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25PcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd09wdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxhbmd1YWdlKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dMYW5ndWFnZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBjZWxsIG9wdGlvbiBtZW51LCBhbmQgdGVsbCB0aGUgaG9zdCBpdCB3YXMgYXNrZWQgZm9yLlxuICAgKlxuICAgKiBUaGUgb3BlbmluZyBpcyB0aGUgcGFydCB0aGF0IHdhcyBtaXNzaW5nLiBFdmVyeXRoaW5nIGVsc2UgZXhpc3RlZCDigJQgdGhlXG4gICAqIHRyaWdnZXIgYnV0dG9uIGJlaGluZCBgY2VsbFJlbmRlcmVyUGFyYW1zLmNlbGxPcHRpb25CdXR0b25TdGF0dXNgLCB0aGUgbWVudVxuICAgKiBjb21wb25lbnQsIHRoZSBgY2VsbE9wdGlvbk1lbnVgIGNvbHVtbiBwcm9wZXJ0eSwgdGhlIHNlbGVjdGlvbiBldmVudCB3aXJlZFxuICAgKiB0aHJvdWdoIHRvIHRoZSBncmlkJ3Mgb3V0cHV0IOKAlCBidXQgbm90aGluZyBldmVyIHNldCB0aGUgZmxhZyB0aGUgdGVtcGxhdGVcbiAgICogcmVuZGVycyBvbiwgc28gdGhlIGJ1dHRvbiBkaWQgbm90aGluZyBhdCBhbGwuXG4gICAqXG4gICAqIERvbmUgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgcm93LWFjdGlvbiBjb21wb25lbnQgYmVjYXVzZSB0aGlzIGlzIHRoZVxuICAgKiBjb21wb25lbnQgd2hvc2UgdGVtcGxhdGUgcmVuZGVycyB0aGUgbWVudSwgYW5kIHNvIHRoZSBvbmUgdGhhdCBoYXMgdG8gYmVcbiAgICogbWFya2VkIGZvciBjaGVjay5cbiAgICovXG4gIGludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgY29uc3QgZmllbGQgPSBldmVudC5jb2x1bW4/LmZpZWxkIGFzIHN0cmluZztcblxuICAgIC8vIE5vdGhpbmcgdG8gb3BlbiB3aGVuIHRoZSBjb2x1bW4gZGVjbGFyZWQgbm8gb3B0aW9uczsgdGhlIGV2ZW50IHN0aWxsXG4gICAgLy8gZ29lcyB0byB0aGUgaG9zdCwgd2hpY2ggbWF5IGJlIGRyaXZpbmcgc29tZXRoaW5nIG9mIGl0cyBvd24uXG4gICAgaWYgKGZpZWxkICYmIGV2ZW50Lm5vZGUgJiYgZXZlbnQuY29sdW1uPy5jZWxsT3B0aW9uTWVudT8ubGVuZ3RoKSB7XG5cbiAgICAgIGV2ZW50Lm5vZGUuY2VsbE9wdGlvbnNbZmllbGRdID0gdHJ1ZTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0NlbGxPcHRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1lbnUgY2xvc2VkIGl0c2VsZiDigJQgb24gc2VsZWN0LCBvbiBFc2NhcGUsIG9yIG9uIGEgY2xpY2sgb3V0c2lkZS4gSXRcbiAgICogaGFzIGFscmVhZHkgY2xlYXJlZCBpdHMgb3duIGZsYWc7IHRoaXMgaXMgd2hhdCByZXBhaW50cyB3aXRob3V0IGl0LlxuICAgKi9cbiAgY2VsbE9wdGlvbk1lbnVDbG9zZWQoKTogdm9pZCB7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblNlbGVjdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93U2VsZWN0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBhIGdyb3VwIC8gbWFzdGVyIHJvdywgdGhlbiByZXBvcnQgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogVGhlIGdyb3VwIHJlbmRlcmVyIGlzIHByZXNlbnRhdGlvbmFsOiBpdCBzYXlzIFwidGhlIGV4cGFuZGVyIHdhcyBjbGlja2VkXCJcbiAgICogYW5kIG5vdGhpbmcgbW9yZS4gUGVyZm9ybWluZyB0aGUgc3RhdGUgY2hhbmdlIGJlbG9uZ3MgaGVyZSwgd2hlcmUgdGhlIEFQSVxuICAgKiBpcyBhdmFpbGFibGUuIFByZXZpb3VzbHkgdGhpcyBtZXRob2Qgb25seSByZS1lbWl0dGVkLCBzbyB0aGUgZXhwYW5kZXJcbiAgICogcmVuZGVyZWQsIGFuaW1hdGVkIG9uIGhvdmVyIGFuZCBkaWQgbm90aGluZyBhdCBhbGwg4oCUIGV2ZXJ5IGNvbnN1bWVyIGhhZCB0b1xuICAgKiBkaXNjb3ZlciBmb3IgaXRzZWxmIHRoYXQgYGV4cGFuc2lvbkNoYW5nZWRgIHdhcyBhIHJlcXVlc3QgcmF0aGVyIHRoYW4gdGhlXG4gICAqIG5vdGlmaWNhdGlvbiBpdHMgcGFzdC10ZW5zZSBuYW1lIHByb21pc2VzLlxuICAgKlxuICAgKiBUaGUgZXZlbnQgaXMgcmUtZW1pdHRlZCAqYWZ0ZXIqIHRoZSB0b2dnbGUsIHNvIGBldmVudC5ub2RlLmV4cGFuZGVkYCBpcyB0aGVcbiAgICogbmV3IHN0YXRlLCB3aGljaCBpcyB3aGF0IGEgcGFzdC10ZW5zZSBldmVudCBzaG91bGQgY2FycnkuXG4gICAqL1xuICBpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soZXZlbnQ6IEV4cGFuc2lvbkNoYW5nZWRFdmVudCk6IHZvaWQge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKGV2ZW50Lm5vZGUucm93SWQpID8/IGV2ZW50Lm5vZGU7XG5cbiAgICB0aGlzLmFwaS5zZXRFeHBhbmRlZEJ5SWQobm9kZS5yb3dJZCwgIW5vZGUuZXhwYW5kZWQpO1xuXG4gICAgdGhpcy5leHBhbnNpb25DaGFuZ2VkLmVtaXQoeyAuLi5ldmVudCwgbm9kZSwgYXBpOiB0aGlzLmFwaSB9KTtcbiAgfVxuXG4gIGNlbGxPcHRpb25NZW51U2VsZWN0ZWQoZXZlbnQ6IENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudCkge1xuXG4gICAgdGhpcy5jZWxsT3B0aW9uU2VsZWN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpYWwgRXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGludm9rZVNoaWZ0RG91YmxlQ2xpY2sobm9kZTpPbmVSb3dOb2RlLCBjb2x1bW46IE9uZUNvbHVtbkRlZik6IHZvaWQge1xuXG4gICAgbGV0IGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBldmVudCA9IHsgLi4uZXZlbnQsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uU2hpZnREb3VibGVDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDZWxsIEVkaXQgRmVhdHVyZVxuICAgKi9cbiAgc3RhcnRFZGl0KGV2ZW50OiBNb3VzZUV2ZW50LCBub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpJykge1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG5cbiAgICAgIHRoaXMuaW52b2tlU2hpZnREb3VibGVDbGljayhub2RlLCBjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jZWxsRWRpdGFibGVQaXBlLnRyYW5zZm9ybShub2RlLmNlbGxTdGF0ZXMsIGNvbHVtbiwgbm9kZSwgdGhpcy5jZWxsU2VydmljZS5lZGl0YWJsZUZuLCB0aGlzLmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuLCB0aGlzLmFsbG93ZWRFZGl0KSkge1xuXG4gICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMuY2xlYXIoKTtcblxuICAgICAgY29uc3QgY2VsbEtleSA9IGdldENlbGxLZXkobm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkKTtcblxuICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLmFkZChjZWxsS2V5KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICBpZiAodGhpcy5lZGl0VHlwZSA9PT0gJ2Z1bGxSb3cnKSB7XG5cbiAgICAgICAgLy8gVGhlIHdob2xlIHJvdyBlZGl0cyB0b2dldGhlciwgc28gZXZlcnkgY2VsbCB0aGF0IHdvdWxkIGFjY2VwdCBpdHNcbiAgICAgICAgLy8gb3duIGRvdWJsZS1jbGljayBvcGVucyBub3cuIFRoZSBjbGlja2VkIG9uZSBzdGlsbCB0YWtlcyBmb2N1cyBiZWxvdy5cbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5jb2x1bW5EZWZzKSB7XG5cbiAgICAgICAgICBpZiAoIWNvbC5maWVsZCkgY29udGludWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5jZWxsRWRpdGFibGVQaXBlLnRyYW5zZm9ybShyb3dOb2RlLmNlbGxTdGF0ZXMsIGNvbCwgcm93Tm9kZSwgdGhpcy5jZWxsU2VydmljZS5lZGl0YWJsZUZuLCB0aGlzLmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuLCB0aGlzLmFsbG93ZWRFZGl0KSkge1xuXG4gICAgICAgICAgICByb3dOb2RlLmVkaXRpbmdbY29sLmZpZWxkXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgcm93Tm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcblxuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50PihgW2RhdGEtY2VsbC1pZD1cIiR7IGdldENlbGxLZXkobm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkKSB9XCJdIGlucHV0LCBbZGF0YS1jZWxsLWlkPVwiJHsgZ2V0Q2VsbEtleShub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpIH1cIl0gc2VsZWN0YCk7XG5cbiAgICAgICAgaWYgKGlucHV0KSB7XG5cbiAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuICAgICAgICAgIC8vIEEgc2VsZWN0IHJlcG9ydHMgdHlwZSAnc2VsZWN0LW9uZScsIHNvIG9ubHkgYSB0ZXh0IGlucHV0IGdldHMgaXRzXG4gICAgICAgICAgLy8gY2FyZXQgcGxhY2VkLlxuICAgICAgICAgIGlmICh2YWx1ZSAmJiBbXCJ0ZXh0XCJdLmluY2x1ZGVzKGlucHV0LnR5cGUpICYmICdzZXRTZWxlY3Rpb25SYW5nZScgaW4gaW5wdXQpIHtcblxuICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UodmFsdWUubGVuZ3RoLCB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIDEwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBDZWxsIEVkaXQgTW9kZVxuICAgKi9cbiAgc3RvcEVkaXQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4sIGV2ZW50OiBhbnkpIHtcblxuICAgIGlmICh0aGlzLmVkaXRUeXBlID09PSAnZnVsbFJvdycpIHtcblxuICAgICAgdGhpcy5zdG9wUm93RWRpdEZyb21FdmVudChub2RlLCBldmVudCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcm93Tm9kZTogT25lUm93Tm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgLy8gVGhlIGVkaXRpbmcgZ3VhcmQgbWFrZXMgYSBzZWNvbmQgY29tbWl0IGZvciBvbmUgZWRpdCBhIG5vLW9wOiBhIHNlbGVjdFxuICAgIC8vIGNvbW1pdHMgb24gKGNoYW5nZSksIHdoaWNoIGNsb3NlcyB0aGUgZWRpdG9yLCBhbmQgdGhlIChibHVyKSB0aGF0IGNhblxuICAgIC8vIGZvbGxvdyBtdXN0IG5vdCBjb21taXQgYWdhaW4uXG4gICAgaWYgKHJvd05vZGUgJiYgcm93Tm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0pIHtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZSA/PyAnJztcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gcm93Tm9kZS5kYXRhW2NvbHVtbi5maWVsZF07XG5cbiAgICAgIHRoaXMuc2V0Q2VsbFZhbHVlQnlSb3dJZChub2RlLnJvd0lkLCBjb2x1bW4sIHZhbHVlKTtcblxuICAgICAgdGhpcy5maW5pc2hFZGl0KHJvd05vZGUsIGNvbHVtbiwgb2xkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGEgYHNlbGVjdGAgZWRpdG9yJ3MgY2hvaWNlLlxuICAgKlxuICAgKiBTZXBhcmF0ZSBmcm9tIGBzdG9wRWRpdGAgYmVjYXVzZSB0aGUgdmFsdWUgaXMgbm90IHRoZSBlbGVtZW50J3Mgc3RyaW5nOlxuICAgKiB0aGUgY2hvc2VuIGluZGV4IG1hcHMgYmFjayBpbnRvIGBzZWxlY3RPcHRpb25zYCwgc28gdGhlIGNvbW1pdHRlZCB2YWx1ZVxuICAgKiBrZWVwcyB3aGF0ZXZlciB0eXBlIHRoZSBvcHRpb24gZGVjbGFyZWQuXG4gICAqL1xuICBzdG9wRWRpdFNlbGVjdChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPiwgZXZlbnQ6IGFueSkge1xuXG4gICAgaWYgKHRoaXMuZWRpdFR5cGUgPT09ICdmdWxsUm93Jykge1xuXG4gICAgICAvLyAoY2hhbmdlKSBpcyBub3QgYSBjb21taXQgaW4gZnVsbC1yb3cgbW9kZSDigJQgdGhlIGNob2ljZSBzaXRzIGluIHRoZVxuICAgICAgLy8gc2VsZWN0IHVudGlsIHRoZSByb3cgY29tbWl0cyBhbmQgcmVhZHMgZXZlcnkgZWRpdG9yIGF0IG9uY2UuIE9ubHkgYVxuICAgICAgLy8gYmx1ciB0aGF0IGFjdHVhbGx5IGxlYXZlcyB0aGUgcm93IGNsb3NlcyBpdC5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnYmx1cicpIHRoaXMuc3RvcFJvd0VkaXRGcm9tRXZlbnQobm9kZSwgZXZlbnQpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJvd05vZGU6IE9uZVJvd05vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlICYmIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdKSB7XG5cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCBvcHRpb25zID0gY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LnNlbGVjdE9wdGlvbnMgPz8gW107XG4gICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zWyhldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnNlbGVjdGVkSW5kZXhdO1xuXG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHJvd05vZGUuZGF0YVtjb2x1bW4uZmllbGRdO1xuXG4gICAgICByb3dOb2RlLmRhdGFbY29sdW1uLmZpZWxkXSA9IG9wdGlvbi52YWx1ZTtcblxuICAgICAgdGhpcy5maW5pc2hFZGl0KHJvd05vZGUsIGNvbHVtbiwgb2xkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgZWRpdG9yIGFuZCBhbm5vdW5jZSB0aGUgY29tbWl0LiBTaGFyZWQgYnkgYm90aCBlZGl0b3Iga2luZHMuICovXG4gIHByaXZhdGUgZmluaXNoRWRpdChyb3dOb2RlOiBPbmVSb3dOb2RlLCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPiwgb2xkVmFsdWU6IGFueSkge1xuXG4gICAgY29uc3QgbmV3VmFsdWUgPSByb3dOb2RlLmRhdGFbY29sdW1uLmZpZWxkXTtcblxuICAgIHJvd05vZGUuY2VsbFN0YXRlcyA9IHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKHJvd05vZGUpO1xuICAgIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdID0gZmFsc2U7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsU3RhdGVDaGFuZ2VkJywge1xuICAgICAgZGF0YTogcm93Tm9kZS5kYXRhLFxuICAgICAgbm9kZTogcm93Tm9kZSxcbiAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgfSk7XG5cbiAgICAvLyBDb21wYXJlZCBhZnRlciBub3JtYWxpc2F0aW9uICgnJyAtPiBudWxsLCBudW1iZXIgY29lcmNpb24pLCBzbyBhIGJsdXJcbiAgICAvLyB0aGF0IGxlYXZlcyB0aGUgdmFsdWUgYXMgaXQgd2FzIGRvZXMgbm90IGFubm91bmNlIGFuIGVkaXQuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSBvbGRWYWx1ZSkge1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsVmFsdWVDaGFuZ2VkJywge1xuICAgICAgICBub2RlOiByb3dOb2RlLFxuICAgICAgICBkYXRhOiByb3dOb2RlLmRhdGEsXG4gICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICBmaWVsZDogY29sdW1uLmZpZWxkLFxuICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgbmV3VmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIENlbGwgRWRpdCBNb2RlXG4gICAqL1xuICBjYW5jZWxFZGl0KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgcm93Tm9kZTogT25lUm93Tm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUpIHtcblxuICAgICAgaWYgKHRoaXMuZWRpdFR5cGUgPT09ICdmdWxsUm93Jykge1xuXG4gICAgICAgIC8vIEVzY2FwZSBhYmFuZG9ucyB0aGUgd2hvbGUgcm93OiBldmVyeSBlZGl0b3IgY2xvc2VzLCBub3RoaW5nIGNvbW1pdHMuXG4gICAgICAgIE9iamVjdC5rZXlzKHJvd05vZGUuZWRpdGluZykuZm9yRWFjaChmaWVsZCA9PiByb3dOb2RlLmVkaXRpbmdbZmllbGRdID0gZmFsc2UpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcm93Tm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRnVsbC1yb3cgY29tbWl0LCByb3V0ZWQgZnJvbSBhbnkgb25lIGVkaXRvcidzIEVudGVyIG9yIGJsdXIuXG4gICAqXG4gICAqIEEgYmx1ciB0aGF0IGxhbmRzIG9uIGFub3RoZXIgZWRpdG9yIGluIHRoZSBzYW1lIHJvdyBpcyB0aGUgdXNlciB0YWJiaW5nXG4gICAqIGJldHdlZW4gZmllbGRzLCBub3QgbGVhdmluZyB0aGUgcm93IOKAlCB0aGUgZWRpdG9ycyBzdGF5IG9wZW4gYW5kIHRoZWlyXG4gICAqIHR5cGVkIHZhbHVlcyBzdGF5IGluIHRoZSBET00gdW50aWwgdGhlIHJvdyBjb21taXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdG9wUm93RWRpdEZyb21FdmVudChub2RlOiBPbmVSb3dOb2RlPFQ+LCBldmVudDogYW55KSB7XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2JsdXInKSB7XG5cbiAgICAgIGNvbnN0IG5leHQgPSAoZXZlbnQgYXMgRm9jdXNFdmVudCkucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICAgIGlmIChuZXh0Py5tYXRjaGVzPy4oJ2lucHV0Lm9uZS1jZWxsLWlucHV0LCBzZWxlY3Qub25lLWNlbGwtaW5wdXQnKVxuICAgICAgICAmJiBuZXh0LmNsb3Nlc3Q/LihgW2RhdGEtY2VsbC1pZF49XCIke25vZGUucm93SWR9LS1cIl1gKSkge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKTtcblxuICAgIHRoaXMuc3RvcFJvd0VkaXQobm9kZSk7XG4gIH1cblxuICAvKiogQ29tbWl0IGV2ZXJ5IG9wZW4gZWRpdG9yIG9mIG9uZSByb3csIHJlYWRpbmcgZWFjaCBmcm9tIHRoZSBET00uICovXG4gIHByaXZhdGUgc3RvcFJvd0VkaXQobm9kZTogT25lUm93Tm9kZTxUPikge1xuXG4gICAgY29uc3Qgcm93Tm9kZTogT25lUm93Tm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKCFyb3dOb2RlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLmNvbHVtbkRlZnMpIHtcblxuICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4uZmllbGQgYXMgc3RyaW5nO1xuXG4gICAgICBpZiAoIWZpZWxkIHx8ICFyb3dOb2RlLmVkaXRpbmdbZmllbGRdKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qga2V5ID0gZ2V0Q2VsbEtleShyb3dOb2RlLnJvd0lkLCBmaWVsZCk7XG4gICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudD4oXG4gICAgICAgIGBbZGF0YS1jZWxsLWlkPVwiJHtrZXl9XCJdIGlucHV0LCBbZGF0YS1jZWxsLWlkPVwiJHtrZXl9XCJdIHNlbGVjdGApO1xuXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHJvd05vZGUuZGF0YVtmaWVsZF07XG5cbiAgICAgIGlmIChlZGl0b3I/LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbHVtbi5jZWxsUmVuZGVyZXJQYXJhbXM/LnNlbGVjdE9wdGlvbnMgPz8gW107XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnNbKGVkaXRvciBhcyBIVE1MU2VsZWN0RWxlbWVudCkuc2VsZWN0ZWRJbmRleF07XG5cbiAgICAgICAgaWYgKG9wdGlvbikgcm93Tm9kZS5kYXRhW2ZpZWxkXSA9IG9wdGlvbi52YWx1ZTtcblxuICAgICAgfSBlbHNlIGlmIChlZGl0b3IpIHtcblxuICAgICAgICBjb25zdCByYXcgPSBlZGl0b3IudmFsdWUgPz8gJyc7XG5cbiAgICAgICAgcm93Tm9kZS5kYXRhW2ZpZWxkXSA9IHJhdyA9PT0gJydcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IGNvbHVtbi5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyBOdW1iZXIocmF3KSA6IHJhdztcbiAgICAgIH1cblxuICAgICAgLy8gZmluaXNoRWRpdCBjbG9zZXMgdGhlIGVkaXRvciwgcmVmcmVzaGVzIHRoZSBjZWxsIHN0YXRlIGFuZCByYWlzZXNcbiAgICAgIC8vIGNlbGxWYWx1ZUNoYW5nZWQgd2hlbiB0aGUgdmFsdWUgbW92ZWQg4oCUIG9uZSBldmVudCBwZXIgY2hhbmdlZCBjZWxsLFxuICAgICAgLy8gdGhlIHNhbWUgY29udHJhY3QgYXMgc2luZ2xlLWNlbGwgZWRpdGluZy5cbiAgICAgIHRoaXMuZmluaXNoRWRpdChyb3dOb2RlLCBjb2x1bW4sIG9sZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IENlbGwgVmFsdWVcbiAgICovXG4gIHNldENlbGxWYWx1ZUJ5Um93SWQocm93SWQ6IHN0cmluZywgY29sdW1uOiBPbmVDb2x1bW5EZWYsIHZhbHVlOiBhbnkpIHtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAobm9kZSAmJiBjb2x1bW4uZmllbGQpIHtcblxuICAgICAgaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5pbnB1dFR5cGUgIT09ICdudW1iZXInKSB7XG5cbiAgICAgICAgbm9kZS5kYXRhW2NvbHVtbi5maWVsZF0gPSB2YWx1ZSA9PT0gJycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbm9kZS5kYXRhW2NvbHVtbi5maWVsZF0gPSB2YWx1ZSA9PT0gJycgPyBudWxsIDogTnVtYmVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlydHVhbCBTY3JvbGwgUHJvcGVydGllc1xuICAgKlxuICAgKiBUaGUgYnVmZmVyIHNjYWxlcyB3aXRoIHRoZSByb3cgY291bnQgc28gc21hbGwgZ3JpZHMgcmVuZGVyIGluIG9uZSBwYXNzLCBidXRcbiAgICogaXQgaXMgY2FwcGVkOiBgaXRlbVNpemUgKiBpdGVtcyAqIDEuNWAgaXMgMS41eCB0aGUgKnRvdGFsKiBjb250ZW50IGhlaWdodCxcbiAgICogYW5kIENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwgZXhwYW5kcyBpdHMgcmVuZGVyZWQgcmFuZ2UgdW50aWwgdGhlIGJ1ZmZlciBpc1xuICAgKiBzYXRpc2ZpZWQuIFVuY2FwcGVkLCB0aGF0IG1ha2VzIHRoZSB2aWV3cG9ydCBtYXRlcmlhbGlzZSBldmVyeSByb3cgYW5kXG4gICAqIHZpcnR1YWwgc2Nyb2xsaW5nIHN0b3BzIGRvaW5nIGFueXRoaW5nIGF0IGFsbCAoMTAwayByb3dzIGxvY2tlZCB0aGUgdGFiKS5cbiAgICogTUFYX0JVRkZFUl9QWCBrZWVwcyByb3VnaGx5IHR3ZW50eSByb3dzIG9mIG92ZXJzY2FuIGVpdGhlciBzaWRlIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9CVUZGRVJfUFg6IG51bWJlciA9IDYwMDtcblxuICBzZXRWaXJ0dWFsU2Nyb2xsKGl0ZW1zOiBudW1iZXIgPSAwKTogdm9pZCB7XG5cbiAgICB0aGlzLm1pbkJ1ZmZlclB4ID0gTWF0aC5taW4odGhpcy5pdGVtU2l6ZSAqIGl0ZW1zICogMS41LCB0aGlzLk1BWF9CVUZGRVJfUFgpO1xuXG4gICAgdGhpcy5tYXhCdWZmZXJQeCA9IHRoaXMubWluQnVmZmVyUHggKiAyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIEFsbCBTdWJzY3JpcHRpb25zXG4gICAqL1xuICAvKipcbiAgICogSGFuZCB0aGUgZHJhZyBzZXJ2aWNlIHdoYXQgaXQgbmVlZHMgdG8gcnVuIGEgZ2VzdHVyZS5cbiAgICpcbiAgICogRGVmZXJyZWQgdG8gaGVyZSBiZWNhdXNlIHRoZSB2aWV3cG9ydCBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHVudGlsIHRoZSB2aWV3XG4gICAqIGlzIHVwLCBhbmQgYG5vZGVzYCBpcyBwYXNzZWQgYXMgYSBnZXR0ZXIgcmF0aGVyIHRoYW4gYSB2YWx1ZSDigJQgYSBkcmFnXG4gICAqIG11dGF0ZXMgdGhlIG9yZGVyIHVuZGVybmVhdGggaXQsIHNvIGEgc25hcHNob3QgdGFrZW4gYXQgYXR0YWNoIHRpbWUgd291bGRcbiAgICogZ28gc3RhbGUgb24gdGhlIGZpcnN0IG1vdmUuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy52aWV3cG9ydD8uZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudDtcblxuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgdGhpcy5yb3dEcmFnU2VydmljZS5hdHRhY2goe1xuICAgICAgdmlld3BvcnQ6IGVsZW1lbnQsXG4gICAgICBpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcbiAgICAgIG5vZGVzOiAoKSA9PiB0aGlzLm5vZGVzLFxuICAgICAgbW92ZTogKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpID0+IHtcblxuICAgICAgICBjb25zdCBtb3ZlZCA9IHRoaXMuYXBpLm1vdmVSb3coZnJvbUluZGV4LCB0b0luZGV4KTtcblxuICAgICAgICBpZiAobW92ZWQpIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIHJldHVybiBtb3ZlZDtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpO1xuXG4gICAgLy8gVGhlIENESyBpbnNlcnRzIGl0cyBvd24gY29udGVudCB3cmFwcGVyIGJldHdlZW4gdGhlIHZpZXdwb3J0IGFuZCB0aGVcbiAgICAvLyByb3dzLiBJdCBoYXMgbm8gdGVtcGxhdGUgb2Ygb3VycyB0byBhbm5vdGF0ZSwgYW5kIGxlZnQgZ2VuZXJpYyBpdCBicmVha3NcbiAgICAvLyB0aGUgYGdyaWQgPiByb3dgIG93bmVyc2hpcCB0aGUgcm9sZXMgZGVwZW5kIG9uLlxuICAgIGNvbnN0IHdyYXBwZXIgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyJyk7XG5cbiAgICB3cmFwcGVyPy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncHJlc2VudGF0aW9uJyk7XG5cbiAgICAvLyBGbGV4IGNvbHVtbnMgc2l6ZSBhZ2FpbnN0IHRoaXMgdmlld3BvcnQsIG5vdyBhbmQgd2hlbmV2ZXIgaXQgcmVzaXplcy5cbiAgICAvLyBhcHBseUZsZXhXaWR0aHMgaXMgYSBuby1vcCB3aXRob3V0IGZsZXggY29sdW1ucyBhbmQgZGlzcGF0Y2hlcyBvbmx5IG9uIGFcbiAgICAvLyByZWFsIGNoYW5nZSwgc28gZ3JpZHMgdGhhdCBuZXZlciB1c2UgZmxleCBwYXkgbm90aGluZyBoZXJlLlxuICAgIHRoaXMuYXBwbHlGbGV4V2lkdGhzKCk7XG5cbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICB0aGlzLmZsZXhSZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLmFwcGx5RmxleFdpZHRocygpKTtcbiAgICAgIHRoaXMuZmxleFJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbGV4UmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcblxuICBwcml2YXRlIGFwcGx5RmxleFdpZHRocygpOiB2b2lkIHtcblxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy52aWV3cG9ydD8uZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudD8uY2xpZW50V2lkdGggPz8gMDtcblxuICAgIGlmICh3aWR0aCA+IDApIHRoaXMuYXBpLmFwcGx5RmxleFdpZHRocyh3aWR0aCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcmFtcyBldmVyeSBwZXItY2VsbCBjYWxsYmFjayByZWNlaXZlcy5cbiAgICpcbiAgICogQnVpbHQgaGVyZSByYXRoZXIgdGhhbiBpbmxpbmUgaW4gdGhlIHRlbXBsYXRlIHNvIHRoZSB3aG9sZSBkb2N1bWVudGVkXG4gICAqIHNoYXBlIGlzIHBhc3NlZCDigJQgYHZhbHVlYCwgYGZpZWxkYCwgYHJvd0luZGV4YCwgYGFwaWAgYW5kIGBjb250ZXh0YCB3ZXJlXG4gICAqIGFsbCBkZWNsYXJlZCBvbiBgT25lQ2VsbFJlbmRlcmVyUGFyYW1zYCBhbmQgbm9uZSBvZiB0aGVtIHdlcmUgYmVpbmcgc2VudCxcbiAgICogc28gYSBgY2VsbENsYXNzYCByZWFkaW5nIGBwYXJhbXMudmFsdWVgIHNpbGVudGx5IGdvdCBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHByb3RlY3RlZCBjZWxsUGFyYW1zKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KTogT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtczxUPiB7XG5cbiAgICByZXR1cm4gdGhpcy5jZWxsU2VydmljZS5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkgYXMgT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtczxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJhbXMgZm9yIGEgY29tcG9uZW50IGNlbGwgcmVuZGVyZXIuXG4gICAqXG4gICAqIFRoZSBjZWxsIHBhcmFtcywgcGx1cyB3aGF0ZXZlciB0aGUgY29sdW1uIGRlY2xhcmVkIGluXG4gICAqIGBjZWxsUmVuZGVyZXJQYXJhbXNgIOKAlCBhIGZpZWxkIHRoYXQgZXhpc3RzIHByZWNpc2VseSBzbyBhIHJlbmRlcmVyIGNhbiBiZVxuICAgKiBjb25maWd1cmVkIHBlciBjb2x1bW4sIGFuZCB0aGF0IG5vdGhpbmcgaGFkIGV2ZXIgZm9yd2FyZGVkIHRvIGl0LiBDb2x1bW5cbiAgICogY29uZmlnIGdvZXMgZmlyc3Qgc28gdGhlIGdyaWQncyBvd24gZmllbGRzIHdpbiBhIG5hbWUgY29sbGlzaW9uLlxuICAgKi9cbiAgLyoqXG4gICAqIENhY2hlZCBwZXIgY2VsbCwga2V5ZWQgb24gdGhlIGlkZW50aXRpZXMgdGhhdCBtZWFuIFwidGhpcyBjZWxsIGNoYW5nZWRcIjpcbiAgICogaXRzIGNlbGxTdGF0ZXMgb2JqZWN0IChyZXBsYWNlZCBvbiBldmVyeSBlZGl0IGFuZCBzdGF0ZSByZWZyZXNoKSBhbmQgaXRzXG4gICAqIGRhdGEgb2JqZWN0LiBCdWlsZGluZyBhIGZyZXNoIG9iamVjdCBwZXIgY2FsbCDigJQgd2hpY2ggYSB0ZW1wbGF0ZSBtZXRob2RcbiAgICogZG9lcyBwZXIgY2hhbmdlLWRldGVjdGlvbiBwYXNzIOKAlCBtYWRlIHRoZSByZW5kZXJlciBkaXJlY3RpdmUgc2VlIFwicGFyYW1zXG4gICAqIGNoYW5nZWRcIiBldmVyeSBwYXNzIGFuZCByZS1ydW4gdGhlIGNvbXBvbmVudCdzIG9uZUluaXQgZWFjaCB0aW1lLiBBXG4gICAqIHJlbmRlcmVyIHdob3NlIG9uZUluaXQgdG91Y2hlZCBncmlkIHN0YXRlIChhIGN1c3RvbSB0cmVlIGV4cGFuZGVyIGlzIHRoZVxuICAgKiBjbGFzc2ljIGNhc2UpIHRoZW4gcmUtdHJpZ2dlcmVkIGNoYW5nZSBkZXRlY3Rpb24gYW5kIGxvb3BlZCBmb3JldmVyLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJlclBhcmFtc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgc3RhdGVzOiB1bmtub3duOyBkYXRhOiB1bmtub3duOyBwYXJhbXM6IE9uZUNlbGxSZW5kZXJlclBhcmFtczxUPiB9PigpO1xuXG4gIHByb3RlY3RlZCByZW5kZXJlclBhcmFtcyhub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPik6IE9uZUNlbGxSZW5kZXJlclBhcmFtczxUPiB7XG5cbiAgICBjb25zdCBrZXkgPSBnZXRDZWxsS2V5KG5vZGUucm93SWQsIChjb2x1bW4uZmllbGQgYXMgc3RyaW5nKSA/PyBjb2x1bW4uaWQgPz8gJycpO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmVuZGVyZXJQYXJhbXNDYWNoZS5nZXQoa2V5KTtcblxuICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnN0YXRlcyA9PT0gbm9kZS5jZWxsU3RhdGVzICYmIGNhY2hlZC5kYXRhID09PSBub2RlLmRhdGEpIHJldHVybiBjYWNoZWQucGFyYW1zO1xuXG4gICAgY29uc3QgcGFyYW1zID0geyAuLi4oY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXMgPz8ge30pLCAuLi50aGlzLmNlbGxQYXJhbXMobm9kZSwgY29sdW1uKSB9O1xuXG4gICAgdGhpcy5yZW5kZXJlclBhcmFtc0NhY2hlLnNldChrZXksIHsgc3RhdGVzOiBub2RlLmNlbGxTdGF0ZXMsIGRhdGE6IG5vZGUuZGF0YSwgcGFyYW1zIH0pO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBgYXJpYS1yb3dpbmRleGAgaXMgMS1iYXNlZCBvdmVyIHRoZSB3aG9sZSBncmlkLCBub3Qgb3ZlciB3aGF0IGlzIHJlbmRlcmVkLlxuICAgKlxuICAgKiBUaGF0IGlzIHRoZSBwb2ludCBvZiBpdDogdGhlIGJvZHkgdmlydHVhbGlzZXMsIHNvIHRoZSBET00gaG9sZHMgYSBzbGlkaW5nXG4gICAqIHdpbmRvdyBvZiByb3dzIGFuZCB0aGUgaW5kZXggaXMgaG93IGEgc2NyZWVuIHJlYWRlciBrbm93cyB3aGVyZSB0aGUgd2luZG93XG4gICAqIHNpdHMuIFJvdyAxIGlzIHRoZSBoZWFkZXIsIHRoZW4gYW55IHBpbm5lZC10b3Agcm93cywgdGhlbiB0aGUgZGF0YS5cbiAgICovXG4gIHByb3RlY3RlZCBkYXRhUm93QXJpYUluZGV4KG5vZGU6IE9uZVJvd05vZGU8VD4pOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIDIgKyB0aGlzLnBpbm5lZFRvcE5vZGVzLmxlbmd0aCArIG5vZGUucm93SW5kZXg7XG4gIH1cblxuICAvKiogUGlubmVkIHJvd3MgYnJhY2tldCB0aGUgZGF0YTogdG9wIG9uZXMgZm9sbG93IHRoZSBoZWFkZXIsIGJvdHRvbSBvbmVzIGVuZCB0aGUgZ3JpZC4gKi9cbiAgcHJvdGVjdGVkIHBpbm5lZFJvd0FyaWFJbmRleChub2RlOiBPbmVSb3dOb2RlPFQ+LCBzaWRlOiAndG9wJyB8ICdib3R0b20nKTogbnVtYmVyIHtcblxuICAgIGNvbnN0IGluZGV4ID0gKHNpZGUgPT09ICd0b3AnID8gdGhpcy5waW5uZWRUb3BOb2RlcyA6IHRoaXMucGlubmVkQm90dG9tTm9kZXMpLmluZGV4T2Yobm9kZSk7XG5cbiAgICByZXR1cm4gc2lkZSA9PT0gJ3RvcCdcbiAgICAgID8gMiArIGluZGV4XG4gICAgICA6IDIgKyB0aGlzLnBpbm5lZFRvcE5vZGVzLmxlbmd0aCArIHRoaXMubm9kZXMubGVuZ3RoICsgaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciByb3dzIGNhbiBiZSBzZWxlY3RlZCBhdCBhbGwuXG4gICAqXG4gICAqIGBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcImAgb24gZXZlcnkgcm93IG9mIGEgZ3JpZCBub2JvZHkgY2FuIHNlbGVjdCBhbm5vdW5jZXNcbiAgICogYSBzZWxlY3Rpb24gYWZmb3JkYW5jZSB0aGF0IGRvZXMgbm90IGV4aXN0LCBzbyB0aGUgYXR0cmlidXRlIGlzIG9taXR0ZWRcbiAgICogcmF0aGVyIHRoYW4gc2V0IGZhbHNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCByb3dTZWxlY3Rpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuICEhdGhpcy5hcGk/LnJvd1NlbGVjdGlvbjtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDZWxsIG5hdmlnYXRpb25cbiAgLy9cbiAgLy8gVGhlIFdBSS1BUklBIGdyaWQgcGF0dGVybjogdGhlIHdob2xlIGdyaWQgaXMgb25lIHRhYiBzdG9wLCBhbmQgdGhlIGFycm93c1xuICAvLyBtb3ZlIGEgZm9jdXNlZCBjZWxsIHdpdGhpbiBpdC4gQmVmb3JlIHRoaXMgdGhlIG9ubHkgdGFiIHN0b3Agd2FzIHRoZSBzY3JvbGxcbiAgLy8gdmlld3BvcnQsIHNvIGEga2V5Ym9hcmQgdXNlciBjb3VsZCBzY3JvbGwgdGhlIHJvd3MgYW5kIHJlYWNoIG5vdGhpbmcgaW5cbiAgLy8gdGhlbSDigJQgYW5kIGEgc2NyZWVuIHJlYWRlciBoYWQgbm8gY3Vyc29yIHRvIHJlYWQgYSBjZWxsIGZyb20uXG4gIC8vXG4gIC8vIEZvY3VzIGlzIHJlYWwgRE9NIGZvY3VzIG9uIGEgcm92aW5nIHRhYmluZGV4IHJhdGhlciB0aGFuXG4gIC8vIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgLCBiZWNhdXNlIHRoZSByb3dzIGFyZSB2aXJ0dWFsaXNlZDogdGhlIGVsZW1lbnQgYVxuICAvLyBkZXNjZW5kYW50IGlkIHBvaW50ZWQgYXQgd291bGQga2VlcCBiZWluZyBkZXN0cm95ZWQgdW5kZXJuZWF0aCBpdC5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIFRoZSBjZWxsIGhvbGRpbmcgdGhlIGdyaWQncyB0YWIgc3RvcC4gTnVsbCB1bnRpbCBzb21ldGhpbmcgaXMgZm9jdXNlZC4gKi9cbiAgcHJvdGVjdGVkIGFjdGl2ZUNlbGw6IHsgcm93SWQ6IHN0cmluZzsgZmllbGQ6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGlzQWN0aXZlQ2VsbChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlQ2VsbCkge1xuXG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVDZWxsLnJvd0lkID09PSBub2RlLnJvd0lkICYmIHRoaXMuYWN0aXZlQ2VsbC5maWVsZCA9PT0gY29sdW1uLmZpZWxkO1xuICAgIH1cblxuICAgIC8vIE5vdGhpbmcgZm9jdXNlZCB5ZXQsIHNvIHRoZSBmaXJzdCBjZWxsIGhvbGRzIHRoZSB0YWIgc3RvcC4gV2l0aG91dCB0aGlzXG4gICAgLy8gZmFsbGJhY2sgYSBncmlkIG5vYm9keSBoYXMgY2xpY2tlZCBoYXMgKm5vKiB0YWJiYWJsZSBjZWxsLCBhbmQgYSBrZXlib2FyZFxuICAgIC8vIHVzZXIgY2Fubm90IGdldCBpbnRvIGl0IGF0IGFsbCDigJQgdGhlIHJvdmluZyB0YWJpbmRleCBoYXMgdG8gc3RhcnRcbiAgICAvLyBzb21ld2hlcmUuXG4gICAgcmV0dXJuIG5vZGUgPT09IHRoaXMubm9kZXNbMF0gJiYgY29sdW1uID09PSB0aGlzLm5hdmlnYWJsZUNvbHVtbnMoKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZG9wdCB3aGF0ZXZlciB0aGUgdXNlciBmb2N1c2VkLCBob3dldmVyIHRoZXkgZ290IHRoZXJlIOKAlCBjbGljaywgdGFiLCBvclxuICAgKiB0aGUgYXJyb3cga2V5cyBiZWxvdy4gS2VlcGluZyB0aGlzIGluIG9uZSBwbGFjZSBpcyB3aGF0IHN0b3BzIHRoZSByb3ZpbmdcbiAgICogdGFiaW5kZXggZHJpZnRpbmcgYXdheSBmcm9tIHRoZSBlbGVtZW50IHRoYXQgYWN0dWFsbHkgaGFzIGZvY3VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQ2VsbEZvY3VzKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5pc0FjdGl2ZUNlbGwobm9kZSwgY29sdW1uKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5hY3RpdmVDZWxsID0geyByb3dJZDogbm9kZS5yb3dJZCwgZmllbGQ6IGNvbHVtbi5maWVsZCBhcyBzdHJpbmcgfTtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcblxuICAgIC8vIFVuZG8vcmVkbyBvZiBjb21taXR0ZWQgZWRpdHMsIGFueXdoZXJlIGluIHRoZSBncmlkIGV4Y2VwdCBpbnNpZGUgYW5cbiAgICAvLyBvcGVuIGVkaXRvciDigJQgYSB0ZXh0IGlucHV0J3MgQ3RybCtaIGlzIHRoZSBicm93c2VyJ3MsIGFuZCBpdCBvcGVyYXRlc1xuICAgIC8vIG9uIHRoZSB1bmNvbW1pdHRlZCB0ZXh0LlxuICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBbJ3onLCAneSddLmluY2x1ZGVzKGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpKSkge1xuXG4gICAgICBjb25zdCB0YWcgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8udGFnTmFtZT8udG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJykgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCByZWRvID0gZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09ICd5JyB8fCBldmVudC5zaGlmdEtleTtcbiAgICAgIGNvbnN0IGFwcGxpZWQgPSByZWRvID8gdGhpcy5hcGkucmVkb0NlbGxFZGl0aW5nKCkgOiB0aGlzLmFwaS51bmRvQ2VsbEVkaXRpbmcoKTtcblxuICAgICAgaWYgKGFwcGxpZWQpIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMubmF2aWdhYmxlQ29sdW1ucygpO1xuXG4gICAgaWYgKCF0aGlzLm5vZGVzLmxlbmd0aCB8fCAhY29sdW1ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE5hdmlnYXRlIG9ubHkgd2hlbiBhIGNlbGwgaXRzZWxmIGhvbGRzIGZvY3VzLiBBbnl0aGluZyBmb2N1c2FibGUgKmluc2lkZSpcbiAgICAvLyBhIGNlbGwgb3ducyBpdHMgb3duIGtleXMg4oCUIGEgdGV4dCBlZGl0b3IncyBjYXJldCwgdGhlIHJvdyBkcmFnIGhhbmRsZSdzXG4gICAgLy8gcmVvcmRlciBrZXlzLCB0aGUgb3B0aW9uIG1lbnUncyBhcnJvd3Mg4oCUIGFuZCBhbGwgb2YgdGhlbSBidWJibGUgdG8gaGVyZS5cbiAgICAvLyBDaGVja2luZyB0aGUgdGFyZ2V0IHJhdGhlciB0aGFuIGJsb2NrbGlzdGluZyB0YWcgbmFtZXMgaXMgd2hhdCBrZWVwcyB0aGlzXG4gICAgLy8gY29ycmVjdCBhcyBtb3JlIGNvbnRyb2xzIGFyZSBhZGRlZCB0byBjZWxscy5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgaWYgKCF0YXJnZXQ/Lm1hdGNoZXM/LignW3JvbGU9XCJncmlkY2VsbFwiXScpKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5hY3RpdmVDZWxsUG9zaXRpb24oY29sdW1ucyk7XG5cbiAgICBsZXQgcm93ID0gY3VycmVudC5yb3c7XG4gICAgbGV0IGNvbCA9IGN1cnJlbnQuY29sO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcblxuICAgICAgY2FzZSAnQXJyb3dEb3duJzogIHJvdyArPSAxOyBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93VXAnOiAgICByb3cgLT0gMTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzogY29sICs9IDE7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzogIGNvbCAtPSAxOyBicmVhaztcblxuICAgICAgLy8gU2VsZWN0aW9uLiBTcGFjZSBpcyB0aGUgZ3JpZCBwYXR0ZXJuJ3MgdG9nZ2xlLCBhbmQgaXQgaGFzIHRvIGJlIGNhdWdodFxuICAgICAgLy8gaGVyZSBvciB0aGUgYnJvd3NlciBzY3JvbGxzIHRoZSBwYWdlIHdpdGggaXQuXG4gICAgICBjYXNlICcgJzoge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5ub2Rlc1tjdXJyZW50LnJvd107XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGlvbihub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgY2FzZSAnQSc6XG4gICAgICAgIGlmICghZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleSkgcmV0dXJuO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmFwaS5zZWxlY3RBbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIGNvbCA9IDA7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHJvdyA9IDA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICBjb2wgPSBjb2x1bW5zLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHJvdyA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIEEgcGFnZSBpcyB3aGF0IHRoZSB2aWV3cG9ydCBjYW4gc2hvdywgd2hpY2ggaXMgdGhlIG9ubHkgZGVmaW5pdGlvbiB0aGF0XG4gICAgICAvLyBtYXRjaGVzIHdoYXQgdGhlIHVzZXIgc2VlcyBtb3ZlLlxuICAgICAgY2FzZSAnUGFnZURvd24nOiByb3cgKz0gdGhpcy5yb3dzUGVyUGFnZSgpOyBicmVhaztcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6ICAgcm93IC09IHRoaXMucm93c1BlclBhZ2UoKTsgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJ0YyJzoge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5ub2Rlc1tjdXJyZW50LnJvd107XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnNbY3VycmVudC5jb2xdO1xuICAgICAgICBpZiAobm9kZSAmJiBjb2x1bW4pIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuc3RhcnRFZGl0KHsgdGFyZ2V0OiBldmVudC50YXJnZXQgfSBhcyB1bmtub3duIGFzIE1vdXNlRXZlbnQsIG5vZGUsIGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IHRhcmdldFJvdyA9IE1hdGgubWluKE1hdGgubWF4KHJvdywgMCksIHRoaXMubm9kZXMubGVuZ3RoIC0gMSk7XG5cbiAgICB0aGlzLmZvY3VzQ2VsbCh0YXJnZXRSb3csIE1hdGgubWluKE1hdGgubWF4KGNvbCwgMCksIGNvbHVtbnMubGVuZ3RoIC0gMSkpO1xuXG4gICAgLy8gU2hpZnQgd2l0aCBhIHZlcnRpY2FsIG1vdmUgZXh0ZW5kcyB0aGUgc2VsZWN0aW9uLCBhbmNob3JlZCB3aGVyZSB0aGVcbiAgICAvLyBleHRlbnNpb24gYmVnYW4g4oCUIHRoZSBzYW1lIGdlc3R1cmUgYSBmaWxlIGxpc3QgdXNlcy5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgdGFyZ2V0Um93ICE9PSBjdXJyZW50LnJvdykge1xuXG4gICAgICB0aGlzLmV4dGVuZFNlbGVjdGlvblRvKGN1cnJlbnQucm93LCB0YXJnZXRSb3cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgcm93IGEgc2hpZnQtZXh0ZW5kZWQgc2VsZWN0aW9uIGlzIG1lYXN1cmVkIGZyb20uICovXG4gIHByaXZhdGUgc2VsZWN0aW9uQW5jaG9yUm93SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgdG9nZ2xlUm93U2VsZWN0aW9uKG5vZGU6IE9uZVJvd05vZGU8VD4pOiB2b2lkIHtcblxuICAgIGlmICghdGhpcy5hcGkudG9nZ2xlUm93U2VsZWN0aW9uKG5vZGUucm93SWQsICFub2RlLnNlbGVjdGVkKSkgcmV0dXJuO1xuXG4gICAgLy8gV2hlcmUgYSBzdWJzZXF1ZW50IHNoaWZ0LWV4dGVuc2lvbiBjb3VudHMgZnJvbS5cbiAgICB0aGlzLnNlbGVjdGlvbkFuY2hvclJvd0lkID0gbm9kZS5yb3dJZDtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRlbmRTZWxlY3Rpb25Ubyhmcm9tUm93OiBudW1iZXIsIHRvUm93OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMubm9kZXNbdG9Sb3ddO1xuXG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIC8vIFdpdGggbm90aGluZyBzZWxlY3RlZCB5ZXQgdGhlIHJvdyB0aGUgZXh0ZW5zaW9uIHN0YXJ0ZWQgb24gYmVjb21lcyB0aGVcbiAgICAvLyBhbmNob3IsIHNvIHNoaWZ0K2Fycm93IHNlbGVjdHMgYm90aCBlbmRzIHJhdGhlciB0aGFuIG9ubHkgdGhlIGZhciBvbmUuXG4gICAgY29uc3QgYW5jaG9yID0gdGhpcy5zZWxlY3Rpb25BbmNob3JSb3dJZCA/PyB0aGlzLm5vZGVzW2Zyb21Sb3ddPy5yb3dJZDtcblxuICAgIGlmICghYW5jaG9yKSByZXR1cm47XG5cbiAgICB0aGlzLnNlbGVjdGlvbkFuY2hvclJvd0lkID0gYW5jaG9yO1xuXG4gICAgdGhpcy5hcGkuc2VsZWN0Um93UmFuZ2UoYW5jaG9yLCB0YXJnZXQucm93SWQpO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29sdW1ucyBhIGNlbGwgY3Vyc29yIGNhbiBsYW5kIG9uLlxuICAgKlxuICAgKiBBIGNvbHVtbiB3aXRoIG5vIGZpZWxkIHJlbmRlcnMgbm8gY2VsbCBzdGF0ZSBhbmQgaXMga2V5ZWQgYnkgZmllbGQsIHNvIGl0XG4gICAqIGNhbm5vdCBiZSBhZGRyZXNzZWQg4oCUIGFuIGFjdGlvbi1vbmx5IGNvbHVtbiBpcyBhIGxlZ2l0aW1hdGUgZXhhbXBsZS5cbiAgICovXG4gIHByaXZhdGUgbmF2aWdhYmxlQ29sdW1ucygpOiBPbmVDb2x1bW5EZWY8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5EZWZzLmZpbHRlcihjb2x1bW4gPT4gISFjb2x1bW4/LmZpZWxkKTtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZlQ2VsbFBvc2l0aW9uKGNvbHVtbnM6IE9uZUNvbHVtbkRlZjxUPltdKTogeyByb3c6IG51bWJlcjsgY29sOiBudW1iZXIgfSB7XG5cbiAgICBpZiAoIXRoaXMuYWN0aXZlQ2VsbCkgcmV0dXJuIHsgcm93OiAwLCBjb2w6IDAgfTtcblxuICAgIGNvbnN0IHJvdyA9IHRoaXMubm9kZXMuZmluZEluZGV4KG5vZGUgPT4gbm9kZS5yb3dJZCA9PT0gdGhpcy5hY3RpdmVDZWxsIS5yb3dJZCk7XG4gICAgY29uc3QgY29sID0gY29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5maWVsZCA9PT0gdGhpcy5hY3RpdmVDZWxsIS5maWVsZCk7XG5cbiAgICByZXR1cm4geyByb3c6IHJvdyA8IDAgPyAwIDogcm93LCBjb2w6IGNvbCA8IDAgPyAwIDogY29sIH07XG4gIH1cblxuICBwcml2YXRlIHJvd3NQZXJQYWdlKCk6IG51bWJlciB7XG5cbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnZpZXdwb3J0Py5lbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50Py5jbGllbnRIZWlnaHQgPz8gMDtcblxuICAgIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGhlaWdodCAvIHRoaXMuaXRlbVNpemUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBjdXJzb3IsIHNjcm9sbGluZyB0aGUgcm93IGludG8gdmlldyBmaXJzdCB3aGVuIGl0IGlzIG91dHNpZGUgdGhlXG4gICAqIHJlbmRlcmVkIHdpbmRvdy5cbiAgICpcbiAgICogVGhlIHNjcm9sbCBpcyB0aGUgcmVhc29uIGZvY3VzaW5nIGlzIGRlZmVycmVkOiBhIHZpcnR1YWxpc2VkIHJvdyB0aGF0IGlzXG4gICAqIG5vdCBvbiBzY3JlZW4gaGFzIG5vIGVsZW1lbnQgdG8gZm9jdXMgdW50aWwgdGhlIHZpZXdwb3J0IGhhcyByZW5kZXJlZCBpdC5cbiAgICovXG4gIHByaXZhdGUgZm9jdXNDZWxsKHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzW3Jvd0luZGV4XTtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLm5hdmlnYWJsZUNvbHVtbnMoKVtjb2xJbmRleF07XG5cbiAgICBpZiAoIW5vZGUgfHwgIWNvbHVtbikgcmV0dXJuO1xuXG4gICAgdGhpcy5hY3RpdmVDZWxsID0geyByb3dJZDogbm9kZS5yb3dJZCwgZmllbGQ6IGNvbHVtbi5maWVsZCBhcyBzdHJpbmcgfTtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLnZpZXdwb3J0Py5nZXRSZW5kZXJlZFJhbmdlKCk7XG4gICAgY29uc3QgcmVuZGVyZWQgPSByYW5nZSAmJiByb3dJbmRleCA+PSByYW5nZS5zdGFydCAmJiByb3dJbmRleCA8IHJhbmdlLmVuZDtcblxuICAgIGlmIChyZW5kZXJlZCkge1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNDZWxsRWxlbWVudChub2RlLCBjb2x1bW4pKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgocm93SW5kZXgpO1xuXG4gICAgLy8gU2Nyb2xsaW5nIGlzIG5vdCBlbm91Z2g6IHRoZSBDREsgcmVuZGVycyBvbiBpdHMgb3duIHNjaGVkdWxlLCBzbyB0aGUgcm93XG4gICAgLy8gaGFzIG5vIGVsZW1lbnQgdG8gZm9jdXMgdW50aWwgaXQgaGFzLiBXYWl0aW5nIGZvciB0aGUgcmVuZGVyZWQgcmFuZ2UgdG9cbiAgICAvLyBhY3R1YWxseSBjb250YWluIHRoZSByb3cgaXMgdGhlIG9ubHkgcmVsaWFibGUgc2lnbmFsIOKAlCBhIGZpeGVkIGRlbGF5XG4gICAgLy8gcmFjZXMgdGhlIHZpZXdwb3J0IGFuZCBzaWxlbnRseSBkcm9wcyBmb2N1cyB3aGVuIGl0IGxvc2VzLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnZpZXdwb3J0Py5yZW5kZXJlZFJhbmdlU3RyZWFtXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihuZXh0ID0+IHJvd0luZGV4ID49IG5leHQuc3RhcnQgJiYgcm93SW5kZXggPCBuZXh0LmVuZCksXG4gICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb2N1c0NlbGxFbGVtZW50KG5vZGUsIGNvbHVtbikpKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0NlbGxFbGVtZW50KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KTogdm9pZCB7XG5cbiAgICBjb25zdCBrZXkgPSBnZXRDZWxsS2V5KG5vZGUucm93SWQsIGNvbHVtbi5maWVsZCBhcyBzdHJpbmcpO1xuXG4gICAgdGhpcy5ib2R5UmVmPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2RhdGEtY2VsbC1pZD1cIiR7a2V5fVwiXWApPy5mb2N1cygpO1xuICB9XG5cbiAgLyoqIElzIHRoaXMgdGhlIHJvdyBjdXJyZW50bHkgYmVpbmcgbW92ZWQ/ICovXG4gIHByb3RlY3RlZCBpc1Jvd0RyYWdnaW5nKG5vZGU6IE9uZVJvd05vZGU8VD4pOiBib29sZWFuIHtcblxuICAgIHJldHVybiB0aGlzLmRyYWdTdGF0ZT8ucm93SWQgPT09IG5vZGUucm93SWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hlcmUgdG8gcGFpbnQgdGhlIGRyb3AgaW5kaWNhdG9yLCBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wIG9mIHRoZSBib2R5LlxuICAgKlxuICAgKiBgaW5zZXJ0QXRgIGlzIGEgYm91bmRhcnksIHNvIHRoZSBsaW5lIHNpdHMgYXQgcm93LWhlaWdodCB0aW1lcyB0aGUgbnVtYmVyXG4gICAqIG9mIHJvd3MgYWJvdmUgaXQg4oCUIGluIGNvbnRlbnQgc3BhY2UuIFRoZSBpbmRpY2F0b3IgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgKiB2aWV3cG9ydCByYXRoZXIgdGhhbiBhIGNoaWxkLCBiZWNhdXNlIGFueXRoaW5nIGluc2lkZSBpdCBlaXRoZXIgc2Nyb2xsc1xuICAgKiBhd2F5IHdpdGggdGhlIHRyYW5zZm9ybWVkIGNvbnRlbnQgd3JhcHBlciBvciBpZ25vcmVzIHRoZSBzY3JvbGwgZW50aXJlbHksXG4gICAqIHNvIHRoZSB2aWV3cG9ydCdzIG93biBzY3JvbGwgb2Zmc2V0IGFuZCBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBib2R5IGFyZVxuICAgKiBib3RoIHN1YnRyYWN0ZWQgYmFjayBvdXQgaGVyZS5cbiAgICpcbiAgICogQSBmaWVsZCByYXRoZXIgdGhhbiBhIGdldHRlcjogaXQgaXMgcmVhZCBmcm9tIHRoZSB0ZW1wbGF0ZSBvbiBldmVyeSBjaGFuZ2VcbiAgICogZGV0ZWN0aW9uIHBhc3MsIGFuZCBpdCBvbmx5IGFjdHVhbGx5IG1vdmVzIHdoZW4gdGhlIGRyYWcgc3RhdGUgb3IgdGhlXG4gICAqIHNjcm9sbCBwb3NpdGlvbiBkb2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRyb3BJbmRpY2F0b3JUb3A6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBIb3cgd2lkZSB0aGUgbGluZSBpcyBkcmF3bi4gUm93cyBhcmUgYHdpZHRoOiBmaXQtY29udGVudGAsIHNvIHRoZXkgYXJlXG4gICAqIG9mdGVuIG5hcnJvd2VyIHRoYW4gdGhlIHZpZXdwb3J0IOKAlCBhIGZ1bGwtYmxlZWQgbGluZSB3b3VsZCBoYW5nIHBhc3QgdGhlXG4gICAqIGxhc3QgY29sdW1uIGludG8gZW1wdHkgc3BhY2UgYW5kIHJlYWQgYXMgcGFydCBvZiB0aGUgZnJhbWUgcmF0aGVyIHRoYW4gdGhlXG4gICAqIHJvd3MuIFRoaXMgaXMgdGhlIHZpc2libGUgZXh0ZW50IG9mIHRoZSByb3cgY29udGVudCwgd2hpY2ggYWxzbyBzaHJpbmtzXG4gICAqIGNvcnJlY3RseSBhcyB0aGUgZ3JpZCBpcyBzY3JvbGxlZCBzaWRld2F5cy5cbiAgICovXG4gIHByb3RlY3RlZCBkcm9wSW5kaWNhdG9yV2lkdGggPSAwO1xuXG4gIHByaXZhdGUgdXBkYXRlRHJvcEluZGljYXRvcigpOiB2b2lkIHtcblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMudmlld3BvcnQ/LmVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoc3RhdGU/LnNvdXJjZSAhPT0gJ3BvaW50ZXInIHx8ICFlbGVtZW50KSB7XG5cbiAgICAgIHRoaXMuZHJvcEluZGljYXRvclRvcCA9IG51bGw7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyb3BJbmRpY2F0b3JUb3AgPSAoc3RhdGUuaW5zZXJ0QXQgKiB0aGlzLml0ZW1TaXplKSAtIGVsZW1lbnQuc2Nyb2xsVG9wICsgZWxlbWVudC5vZmZzZXRUb3A7XG5cbiAgICB0aGlzLmRyb3BJbmRpY2F0b3JXaWR0aCA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMucm93V2lkdGggLSBlbGVtZW50LnNjcm9sbExlZnQsIGVsZW1lbnQuY2xpZW50V2lkdGgpLCAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd0RyYWdFbmQoZXZlbnQ6IE9uZVJvd0RyYWdFdmVudDxUPik6IHZvaWQge1xuXG4gICAgdGhpcy5yb3dEcmFnRW5kLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoUm93RHJhZ1N1cHByZXNzZWQoKTogdm9pZCB7XG5cbiAgICBjb25zdCByZWFzb24gPSB0aGlzLmFwaT8uZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24/LigpID8/IG51bGw7XG5cbiAgICBpZiAocmVhc29uID09PSB0aGlzLnJvd0RyYWdTdXBwcmVzc2VkKSByZXR1cm47XG5cbiAgICB0aGlzLnJvd0RyYWdTdXBwcmVzc2VkID0gcmVhc29uO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMuZmxleFJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiAjYm9keVJlZiBjbGFzcz1cIm9uZS1ncmlkLWJvZHlcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG5cbiAgICA8IS0tIFBpbm5lZCByb3dzIGxpdmUgb3V0c2lkZSB0aGUgc2Nyb2xsIHZpZXdwb3J0IHNvIHRoZXkgbmV2ZXIgc2Nyb2xsXG4gICAgICAgICB2ZXJ0aWNhbGx5LCBhbmQgbWlycm9yIGl0cyBzY3JvbGxMZWZ0IHNvIHRoZSBjb2x1bW5zIHN0YXkgYWxpZ25lZC4gLS0+XG4gICAgQGlmIChwaW5uZWRUb3BOb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiAjcGlubmVkVmlld3BvcnQgY2xhc3M9XCJvbmUtcGlubmVkLXJvd3Mgb25lLXBpbm5lZC1yb3dzLXRvcFwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwaW5uZWRSb3dzXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgbm9kZXM6IHBpbm5lZFRvcE5vZGVzLCBzaWRlOiAndG9wJyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gdGFiaW5kZXggbWFrZXMgdGhlIHNjcm9sbCBjb250YWluZXIgcmVhY2hhYmxlLCBzbyBhIGtleWJvYXJkIHVzZXIgY2FuXG4gICAgICAgICBzY3JvbGwgdGhlIHJvd3Mgd2l0aCB0aGUgYXJyb3cga2V5cywgUGFnZSBVcC9Eb3duIGFuZCBIb21lL0VuZC4gV2l0aG91dFxuICAgICAgICAgaXQgdGhlIGJvZHkgaXMgc2Nyb2xsYWJsZSBieSBwb2ludGVyIG9ubHkgKFdDQUcgMi4xLjEpLiAtLT5cbiAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgIGNsYXNzPVwib25lLWdyaWQtYm9keS12aWV3cG9ydFwiXG4gICAgICAgIHJvbGU9XCJyb3dncm91cFwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIm5vZGVzPy5sZW5ndGggPyBudWxsIDogMFwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uR3JpZEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgIFtpdGVtU2l6ZV09XCJpdGVtU2l6ZVwiXG4gICAgICAgIFttaW5CdWZmZXJQeF09XCJtaW5CdWZmZXJQeFwiXG4gICAgICAgIFttYXhCdWZmZXJQeF09XCJtYXhCdWZmZXJQeFwiXG4gICAgICAgIChzY3JvbGwpPVwib25Cb2R5U2Nyb2xsKCRldmVudClcIj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpjZGtWaXJ0dWFsRm9yPVwibGV0IG5vZGUgb2Ygbm9kZXM7IHRyYWNrQnk6IHRyYWNrQnlSb3dJZDtcIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1yb3dcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcm93aW5kZXhdPVwiZGF0YVJvd0FyaWFJbmRleChub2RlKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJyb3dTZWxlY3Rpb25FbmFibGVkID8gbm9kZS5zZWxlY3RlZCA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtcm93LWlkXT1cIm5vZGUucm93SWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtcm93LXNlbGVjdGVkXT1cIm5vZGUuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtcm93LWRyYWdnaW5nXT1cImlzUm93RHJhZ2dpbmcobm9kZSlcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uRGVmczsgdHJhY2sgY29sLmZpZWxkOykge1xuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG5vZGUsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBjb2x1bW46IGNvbCwgY29sSW5kZXg6ICRpbmRleCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQ3VzdG9tIERldGFpbCBDb21wb25lbnQgLS0+XG4gICAgICAgICAgICAgQGlmKG5vZGUubGVhZiAmJiBub2RlLmRldGFpbEFjdGl2ZSAmJiBub2RlPy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgb25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJDb21wb25lbnRdPVwibm9kZT8uZGV0YWlsUmVuZGVyZXJDb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInsgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgbm9kZTogbm9kZSwgY29udGV4dDogY29udGV4dCB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwhLS0gTWFzdGVyIERldGFpbCBHcmlkICh0ZW1wbGF0ZSBwcm92aWRlZCBieSB0aGUgcGFyZW50IG9uZS1ncmlkIHRvIGF2b2lkIGEgY29tcGlsZS10aW1lIGltcG9ydCBjeWNsZSkgLS0+XG4gICAgICAgICAgICBAaWYgKG1hc3RlckRldGFpbCAmJiBub2RlLmV4cGFuZGVkICYmIG5vZGU/LmRldGFpbFJvd0RhdGEpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXJvdy1kZXRhaWwtY29udGFpbmVyXCIgW2F0dHIuZGF0YS1yb3ctaWRdPVwibm9kZS5yb3dJZCArICctZGV0YWlsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJkZXRhaWxHcmlkVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBub2RlLCBub2RlOiBub2RlIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICBAaWYgKCFub2Rlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IG1heC1jb250ZW50OyBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGgucHhdPVwicm93V2lkdGhcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbiAgICA8IS0tIERyb3AgaW5kaWNhdG9yLlxuICAgICAgICAgQSBsaW5lIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQgcmF0aGVyIHRoYW4gYSBnYXAgb3BlbmVkIGJldHdlZW4gcm93czpcbiAgICAgICAgIHRoZSB2aWV3cG9ydCBpcyB2aXJ0dWFsaXNlZCBhdCBhIGZpeGVkIGl0ZW1TaXplLCBzbyBzaGlmdGluZyByb3dzIGFwYXJ0XG4gICAgICAgICB3b3VsZCBkZXN5bmNocm9uaXNlIHRoZSBzY3JvbGxlciBmcm9tIGl0cyBvd24gZ2VvbWV0cnkuIEl0IGlzIGFsc28gdGhlXG4gICAgICAgICBjbGVhcmVyIHNpZ25hbCDigJQgdGhlIHJvdyBsYW5kcyBleGFjdGx5IHdoZXJlIHRoZSBsaW5lIGlzLlxuICAgICAgICAgUG9zaXRpb25lZCBhZ2FpbnN0IHRoZSBib2R5LCB3aXRoIHRoZSB2aWV3cG9ydCdzIHNjcm9sbCBzdWJ0cmFjdGVkLCBzb1xuICAgICAgICAgaXQgc3RheXMgcHV0IHdoaWxlIHRoZSBjb250ZW50IG1vdmVzIHVuZGVyIGl0IGR1cmluZyBhdXRvLXNjcm9sbC4gLS0+XG4gICAgQGlmIChkcm9wSW5kaWNhdG9yVG9wICE9PSBudWxsKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtcm93LWRyb3AtaW5kaWNhdG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cImRyb3BJbmRpY2F0b3JUb3BcIlxuICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkcm9wSW5kaWNhdG9yV2lkdGhcIj48L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIEtleWJvYXJkIHJlb3JkZXJpbmcgaGFzIG5vIGRyYWcgaW1hZ2UgdG8gd2F0Y2gsIHNvIGl0IG5hcnJhdGVzIGluc3RlYWQuXG4gICAgICAgICBBc3NlcnRpdmUgYmVjYXVzZSB0aGUgbWVzc2FnZSBpcyB0aGUgb25seSBmZWVkYmFjayB0aGF0IHRoZSByb3cgbW92ZWQuIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JpZC12aXN1YWxseS1oaWRkZW5cIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCI+e3sgZHJhZ0Fubm91bmNlbWVudCB9fTwvZGl2PlxuICAgIEBpZiAoIW5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvbmUtZ3JpZC1lbXB0eS1tZXNzYWdlXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyBsZWZ0OiA1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiPk5vIFJvd3MgdG8gU2hvdzwvc3Bhbj5cbiAgICB9XG5cbiAgICBAaWYgKHBpbm5lZEJvdHRvbU5vZGVzLmxlbmd0aCkge1xuICAgICAgICA8ZGl2ICNwaW5uZWRWaWV3cG9ydCBjbGFzcz1cIm9uZS1waW5uZWQtcm93cyBvbmUtcGlubmVkLXJvd3MtYm90dG9tXCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBpbm5lZFJvd3NcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBub2RlczogcGlubmVkQm90dG9tTm9kZXMsIHNpZGU6ICdib3R0b20nIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9kaXY+XG5cbjwhLS0gUGlubmVkIHJvd3MgYXJlIGRpc3BsYXktb25seTogdGhleSByZW5kZXIgZXhhY3RseSB3aGF0IGEgZGF0YSBjZWxsIHJlbmRlcnMsXG4gICAgIGJ1dCBjYXJyeSBub25lIG9mIGl0cyBpbnRlcmFjdGlvbnMuIEEgdG90YWxzIHJvdyBzaG91bGQgbm90IG9wZW4gYW4gZWRpdG9yXG4gICAgIG9uIGRvdWJsZS1jbGljayBvciBzdGFydCBhIHJhbmdlIHNlbGVjdGlvbiBvbiBkcmFnLiAtLT5cbjxuZy10ZW1wbGF0ZSAjcGlubmVkUm93cyBsZXQtbm9kZXM9XCJub2Rlc1wiIGxldC1zaWRlPVwic2lkZVwiPlxuICAgIEBmb3IgKG5vZGUgb2Ygbm9kZXM7IHRyYWNrIG5vZGUucm93SWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1yb3cgb25lLXJvdy1waW5uZWRcIlxuICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInBpbm5lZFJvd0FyaWFJbmRleChub2RlLCBzaWRlKVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXJvdy1pZF09XCJub2RlLnJvd0lkXCI+XG4gICAgICAgICAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1uRGVmczsgdHJhY2sgY29sdW1uLmZpZWxkKSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm9uZS1jb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbGluZGV4XT1cIiRpbmRleCArIDFcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWNlbGwtaWRdPVwibm9kZS5yb3dJZCB8IGNlbGxLZXk6Y29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9uZS1jb2x1bW4tcGlubmVkLWxlZnRdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9uZS1jb2x1bW4tcGlubmVkLXJpZ2h0XT1cImNvbHVtbi5waW5uZWQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtZWRnZV09XCJjb2x1bW4uX3Bpbm5lZEVkZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJjb2x1bW4ucGlubmVkID09PSAnbGVmdCcgPyBjb2x1bW4uX3Bpbm5lZE9mZnNldCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUucmlnaHQucHhdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ3JpZ2h0JyA/IGNvbHVtbi5fcGlubmVkT2Zmc2V0IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4/LndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW4/Lm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4/Lm1heFdpZHRoXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJDb21wb25lbnRdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJDb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwicmVuZGVyZXJQYXJhbXMobm9kZSwgY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGVsc2UgaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogY29sdW1uLndpZHRoICsgJ3B4JywgcG9zaXRpb246ICdyZWxhdGl2ZScgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJub2RlLmNlbGxTdGF0ZXMgfCBjZWxsU3RhdGVSZW5kZXJlcjpjb2x1bW4uZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtbGVmdF09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1jZW50ZXJdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdjZW50ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1yaWdodF09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sU2VydmljZS5yZXNvbHZlQ2VsbENsYXNzKGNvbHVtbiwgY2VsbFBhcmFtcyhub2RlLCBjb2x1bW4pKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sU2VydmljZS5yZXNvbHZlQ2VsbFN0eWxlKGNvbHVtbiwgY2VsbFBhcmFtcyhub2RlLCBjb2x1bW4pKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtY2VsbC10ZXh0XCI+e3sgKG5vZGUuY2VsbFN0YXRlcyB8IGNlbGxTdGF0ZVJlbmRlcmVyOmNvbHVtbi5maWVsZCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gTWFzdGVyIENvbHVtbiBUZW1wbGF0ZSAgLS0+XG48bmctdGVtcGxhdGUgI2NlbGxUZW1wbGF0ZSBsZXQtbm9kZT1cIm5vZGVcIiBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIiBsZXQtY29sSW5kZXg9XCJjb2xJbmRleFwiPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJvbmUtY29sdW1uXCJcbiAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1jb2xpbmRleF09XCJjb2xJbmRleCArIDFcIlxuICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpc0FjdGl2ZUNlbGwobm9kZSwgY29sdW1uKSA/IDAgOiAtMVwiXG4gICAgICAgIFtjbGFzcy5vbmUtY2VsbC1hY3RpdmVdPVwiaXNBY3RpdmVDZWxsKG5vZGUsIGNvbHVtbilcIlxuICAgICAgICAoZm9jdXMpPVwib25DZWxsRm9jdXMobm9kZSwgY29sdW1uKVwiXG4gICAgICAgIFthdHRyLmRhdGEtY2VsbC1pZF09XCJub2RlLnJvd0lkIHwgY2VsbEtleTpjb2x1bW4uZmllbGRcIlxuICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtbGVmdF09XCJjb2x1bW4ucGlubmVkID09PSAnbGVmdCdcIlxuICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtcmlnaHRdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1lZGdlXT1cImNvbHVtbi5fcGlubmVkRWRnZVwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImNvbHVtbi5waW5uZWQgPT09ICdsZWZ0JyA/IGNvbHVtbi5fcGlubmVkT2Zmc2V0IDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS5yaWdodC5weF09XCJjb2x1bW4ucGlubmVkID09PSAncmlnaHQnID8gY29sdW1uLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbj8ud2lkdGhcIlxuICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbj8ubWluV2lkdGhcIlxuICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbHVtbj8ubWF4V2lkdGhcIlxuICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1ib3JkZXItdG9wXT1cIm1hc3RlckRldGFpbCAmJiBub2Rlcz8ubGVuZ3RoID4gMCAmJiBub2Rlc1tub2RlLnJvd0luZGV4IC0gMV0/LmV4cGFuZGVkXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jZWxsLXNlbGVjdGVkXT1cInNlbGVjdGVkQ2VsbHMgfCBjZWxsU2VsZWN0ZWQ6bm9kZS5yb3dJZDpjb2x1bW4uZmllbGRcIlxuICAgICAgICBbY2xhc3Mub25lLWNlbGwtaW52YWxpZF09XCJub2RlLmNlbGxTdGF0ZXMgfCBjZWxsSW52YWxpZDpub2RlLmRhdGFbY29sdW1uLmZpZWxkXTpjb2x1bW46bm9kZTphbGxvd2VkRWRpdDpzdWJtaXR0ZWRcIlxuICAgICAgICAoZGJsY2xpY2spPVwic3RhcnRFZGl0KCRldmVudCwgbm9kZSwgY29sdW1uKVwiXG4gICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRTZWxlY3Rpb24obm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkKVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cImV4dGVuZFNlbGVjdGlvbihub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpXCJcbiAgICAgICAgKG1vdXNldXApPVwiZW5kU2VsZWN0aW9uKClcIj5cblxuICAgICAgICA8IS0tIE9uZSBHcmlkIENlbGwgT3B0aW9uIC0tPlxuICAgICAgICBAaWYgKG5vZGUuY2VsbE9wdGlvbnNbY29sdW1uLmZpZWxkXSkge1xuICAgICAgICAgICAgPG9uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnVcbiAgICAgICAgICAgICAgICAjY29udGV4dE9wdGlvbk1lbnVSZWZcbiAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY29sdW1uLmNlbGxPcHRpb25NZW51XCJcbiAgICAgICAgICAgICAgICAoY2VsbE9wdGlvbk1lbnVTZWxlY3QpPVwiY2VsbE9wdGlvbk1lbnVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2VsbE9wdGlvbk1lbnVDbG9zZSk9XCJjZWxsT3B0aW9uTWVudUNsb3NlZCgpXCIvPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBHcmlkIENlbGwgVGVtcGxhdGUgLS0+XG4gICAgICAgIEBpZihjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJDb21wb25lbnRdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJDb21wb25lbnRcIlxuICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwicmVuZGVyZXJQYXJhbXMobm9kZSwgY29sdW1uKVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKG5vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICAgICAgICBAaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5pbnB1dFR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDZWxsIEVkaXRpbmcgU2VsZWN0LiBDb21taXRzIG9uIGNoYW5nZSDigJQgcGlja2luZyBhbiBvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSB3aG9sZSBlZGl0IOKAlCB3aXRoIGJsdXIgYXMgdGhlIGtleWJvYXJkIGZhbGxiYWNrLiAtLT5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwib25lLWNlbGwtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3sgbm9kZS5yb3dJZCArICcnICsgY29sdW1uLmZpZWxkIH19XCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzdG9wRWRpdFNlbGVjdChub2RlLCBjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJzdG9wRWRpdFNlbGVjdChub2RlLCBjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lc2MpPVwiY2FuY2VsRWRpdChub2RlLCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uc2VsZWN0T3B0aW9ucyA/PyBbXTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtzZWxlY3RlZF09XCJvcHRpb24udmFsdWUgPT09IG5vZGUuZGF0YVtjb2x1bW4uZmllbGRdXCI+e3sgb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgRWRpdGluZyBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJvbmUtY2VsbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7eyBub2RlLnJvd0lkICsgJycgKyBjb2x1bW4uZmllbGQgfX1cIlxuICAgICAgICAgICAgICAgICAgICBvbmVDZWxsSW5wdXRWYWxpZGF0b3JcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25UeXBlXT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5pbnB1dFR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyAndGV4dCcgOiBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uaW5wdXRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm5vZGU/LmRhdGFbY29sdW1uPy5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjI1MFwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cInN0b3BFZGl0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInN0b3BFZGl0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVzYyk9XCJjYW5jZWxFZGl0KG5vZGUsIGNvbHVtbilcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogY29sdW1uLndpZHRoICsgJ3B4JyAsIHBvc2l0aW9uOiAncmVsYXRpdmUnIH1cIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZWRpdGFibGUtYWN0aXZlXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxFZGl0YWJsZTpjb2x1bW46bm9kZTpjZWxsU2VydmljZS5lZGl0YWJsZUZuOmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuOmFsbG93ZWRFZGl0XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWNlbGxcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hbGlnbi1jb250ZW50LWxlZnRdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtY2VudGVyXT1cImNvbHVtbj8uYWxpZ25Db250ZW50ID09PSAnY2VudGVyJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtcmlnaHRdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbFNlcnZpY2UucmVzb2x2ZUNlbGxDbGFzcyhjb2x1bW4sIGNlbGxQYXJhbXMobm9kZSwgY29sdW1uKSlcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbFNlcnZpY2UucmVzb2x2ZUNlbGxTdHlsZShjb2x1bW4sIGNlbGxQYXJhbXMobm9kZSwgY29sdW1uKSlcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLWxlZnQucHhdPVwiY29sdW1uLmF1dG9Hcm91cEZpZWxkICYmIG5vZGUubGV2ZWwgfCBjZWxsTGV2ZWxQYWRkaW5nOjI0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mub25lLWNlbGwtYWxsb3dlZC1lZGl0LWFjdGl2ZV09XCJub2RlLmNlbGxTdGF0ZXMgfCBjZWxsRWRpdGFibGU6Y29sdW1uOm5vZGU6Y2VsbFNlcnZpY2UuZWRpdGFibGVGbjpjZWxsU2VydmljZS51cGRhdGFibGVGbjphbGxvd2VkRWRpdFwiPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBSb3cgRHJhZyBIYW5kbGUgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjZWxsU2VydmljZS5yb3dEcmFnRm4oY29sdW1uLCBub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtcm93LWRyYWctaGFuZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdXBwcmVzc2VkUmVhc29uXT1cInJvd0RyYWdTdXBwcmVzc2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkcmFnRW5kKT1cIm9uUm93RHJhZ0VuZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgQ2hlY2tib3ggU2VsZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uPy5jaGVja2JveFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcGldPVwiYXBpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdGlvbik9XCJpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBFeHBhbmQgJiBDb2xsYXBzZSBJY29uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoKChub2RlPy5ncm91cCB8fCBkZXRhaWxSZW5kZXJlckNvbXBvbmVudCkgJiYgY29sdW1uPy5hdXRvR3JvdXBGaWVsZCkgfHwgKG1hc3RlckRldGFpbCAmJiBub2RlPy5leHBhbmRhYmxlICYmIGdyaWRUeXBlID09PSAnbWFzdGVyJyAmJiBjb2x1bW4/Lm1hc3Rlckdyb3VwRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxSZW5kZXJlckNvbXBvbmVudF09XCJkZXRhaWxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXhwYW5zaW9uQ2hhbmdlZCk9XCJpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmKGNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInJlbmRlcmVyUGFyYW1zKG5vZGUsIGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDZWxsIFZhbHVlIE9SIFBsYWNlaG9sZGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IG9uZUNlbGxUZXh0RXhwYW5kIGNsYXNzPVwib25lLWNlbGwtdGV4dFwiIFtjbGFzcy5vbmUtY2VsbC1wbGFjZWhvbGRlcl09XCJub2RlLmNlbGxTdGF0ZXNbY29sdW1uLmZpZWxkXT8udHlwZSA9PT0gJ3BsYWNlaG9sZGVyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgKG5vZGUuY2VsbFN0YXRlcyB8IGNlbGxTdGF0ZVJlbmRlcmVyOmNvbHVtbi5maWVsZCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBDZWxsIEFjdGlvbiBCdXR0b25zIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uLmNlbGxSZW5kZXJlclBhcmFtcyB8IGNlbGxBY3Rpb25CdXR0b25FbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPG9uZS1ncmlkLXJvdy1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgbWFyZ2luTGVmdDogJ2F1dG8nIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsb3dlZEVkaXRdPVwiYWxsb3dlZEVkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21hc3Rlck5vZGVdPVwibWFzdGVyTm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWFzdGVyRGV0YWlsXT1cIm1hc3RlckRldGFpbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZFR5cGVdPVwiZ3JpZFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcmVyUGFyYW1zXT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0dvdG9EZXRhaWwpPVwiaW52b2tlUm93QWN0aW9uR290b0RldGFpbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0FkZE5ldyk9XCJpbnZva2VSb3dBY3Rpb25BZGROZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dMb2NhdGlvbik9XCJpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0RvY3VtZW50KT1cImludm9rZVJvd0FjdGlvbkRvY3VtZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RGVsZXRlKT1cImludm9rZVJvd0FjdGlvbkRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0dvdG9MaXN0KT1cImludm9rZVJvd0FjdGlvbkdvdG9MaXN0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93UHJpbnQpPVwiaW52b2tlUm93QWN0aW9uUHJpbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dIaXN0b3J5KT1cImludm9rZVJvd0FjdGlvbkhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93TGFuZ3VhZ2UpPVwiaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dDZWxsT3B0aW9uKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
1262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtYm9keS9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1ib2R5L29uZS1ncmlkLWJvZHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWdDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLdE8sT0FBTyxFQUFXLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDNUYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDM0gsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sa0VBQWtF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VztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBd1ZQLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFrQjFDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBUeXBlLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2VsbFNlbGVjdGlvbiwgT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcywgT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVHcmlkQXBpIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtZ3JpZC1hcGkuY2xhc3MnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPbmVHcmlkR2V0Um93SWRQYXJhbXMsIE9uZUdyaWRSZWFkeUV2ZW50LCBPbmVHcmlkUm93QWN0aW9uRXZlbnQsIE9uZUdyaWRUeXBlIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQsIENvbHVtbkNoYW5nZWRFdmVudCwgRXhwYW5zaW9uQ2hhbmdlZEV2ZW50LCBQaW5uZWRSb3dEYXRhQ2hhbmdlZEV2ZW50LCBSb3dEYXRhQ2hhbmdlZEV2ZW50LCBSb3dPcmRlckNoYW5nZWRFdmVudCwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LCBTb3J0Q2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsJztcbmltcG9ydCB7IENlbGxFZGl0YWJsZVBpcGUgfSBmcm9tICcuLi8uLi9jb3JlL3BpcGVzL2NlbGwtZWRpdGFibGUucGlwZSc7XG5pbXBvcnQgeyBnZXRDZWxsS2V5LCBnZXRGaWVsZFZhbHVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9vbmUtY2VsbC5oZWxwZXInO1xuaW1wb3J0IHsgT25lR3JpZENlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1jZWxsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbHVtbldpZHRoIH0gZnJvbSAnLi4vLi4vaGVscGVycy9vbmUtY29sdW1uLWRlZi5oZWxwZXInO1xuaW1wb3J0IHsgT25lR3JpZFJvd0RyYWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3ctZHJhZy5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZVJvd0RyYWdFdmVudCwgT25lUm93RHJhZ1N0YXRlLCBPbmVSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1yb3ctZHJhZy5tb2RlbCc7XG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE9uZUdyaWRDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL29uZS1ncmlkLWNoZWNrYm94L29uZS1ncmlkLWNoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbEdyb3VwUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyL29uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE9uZUdyaWRDZWxsT3B0aW9uTWVudUNvbXBvbmVudCB9IGZyb20gJy4uL29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUvb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lR3JpZFJvd0FjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL29uZS1ncmlkLXJvdy1hY3Rpb24vb25lLWdyaWQtcm93LWFjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lR3JpZFJvd0RyYWdIYW5kbGVDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1yb3ctZHJhZy1oYW5kbGUvb25lLWdyaWQtcm93LWRyYWctaGFuZGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPbmVDZWxsSW5wdXRWYWxpZGF0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvb25lLWNlbGwtaW5wdXQtdmFsaWRhdG9yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvb25lLWNlbGwtcmVuZGVyZXItY29tcG9uZW50LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPbmVDZWxsVGV4dEV4cGFuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2NvcmUvZGlyZWN0aXZlcy9vbmUtY2VsbC10ZXh0LWV4cGFuZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ2VsbEFjdGlvbkJ1dHRvbkVuYWJsZVBpcGUgfSBmcm9tICcuLi8uLi9jb3JlL3BpcGVzL2NlbGwtYWN0aW9uLWJ1dHRvbi1lbmFibGUucGlwZSc7XG5pbXBvcnQgeyBDZWxsSW52YWxpZFBpcGUgfSBmcm9tICcuLi8uLi9jb3JlL3BpcGVzL2NlbGwtaW52YWxpZC5waXBlJztcbmltcG9ydCB7IENlbGxLZXlQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWtleS5waXBlJztcbmltcG9ydCB7IENlbGxMZXZlbFBhZGRpbmdQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWxldmVsLXBhZGRpbmcucGlwZSc7XG5pbXBvcnQgeyBDZWxsU2VsZWN0ZWRQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLXNlbGVjdGVkLnBpcGUnO1xuaW1wb3J0IHsgQ2VsbFN0YXRlUmVuZGVyZXJQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLXN0YXRlLXJlbmRlcmVyLnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICBPbmVHcmlkQ2hlY2tib3hDb21wb25lbnQsXG4gICAgT25lR3JpZENlbGxHcm91cFJlbmRlcmVyQ29tcG9uZW50LFxuICAgIE9uZUdyaWRDZWxsT3B0aW9uTWVudUNvbXBvbmVudCxcbiAgICBPbmVHcmlkUm93QWN0aW9uQ29tcG9uZW50LFxuICAgIE9uZUdyaWRSb3dEcmFnSGFuZGxlQ29tcG9uZW50LFxuICAgIE9uZUNlbGxJbnB1dFZhbGlkYXRvckRpcmVjdGl2ZSxcbiAgICBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnREaXJlY3RpdmUsXG4gICAgT25lQ2VsbFRleHRFeHBhbmREaXJlY3RpdmUsXG4gICAgQ2VsbEFjdGlvbkJ1dHRvbkVuYWJsZVBpcGUsXG4gICAgQ2VsbEVkaXRhYmxlUGlwZSxcbiAgICBDZWxsSW52YWxpZFBpcGUsXG4gICAgQ2VsbEtleVBpcGUsXG4gICAgQ2VsbExldmVsUGFkZGluZ1BpcGUsXG4gICAgQ2VsbFNlbGVjdGVkUGlwZSxcbiAgICBDZWxsU3RhdGVSZW5kZXJlclBpcGUsXG4gIF0sXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtYm9keScsXG4gIC8vIFRoZSBob3N0IHNpdHMgYmV0d2VlbiByb2xlPVwiZ3JpZFwiIGFuZCB0aGUgcm93cyBpdCBtdXN0IG93bjsgYSBnZW5lcmljXG4gIC8vIGVsZW1lbnQgdGhlcmUgYnJlYWtzIHRoZSBvd25lcnNoaXAgY2hhaW4sIHNvIGl0IGxlYXZlcyB0aGUgYTExeSB0cmVlLlxuICBob3N0OiB7ICdyb2xlJzogJ3ByZXNlbnRhdGlvbicgfSxcbiAgdGVtcGxhdGVVcmw6ICcuL29uZS1ncmlkLWJvZHkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb25lLWdyaWQtYm9keS5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBPbmVHcmlkQm9keUNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQ29yZSBQcm9wZXJ0aWVzXG4gICAqL1xuICBAVmlld0NoaWxkKCdib2R5UmVmJywgeyBzdGF0aWM6IHRydWUgfSkgYm9keVJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSByb3dEYXRhOiBUW10gPSBbXTtcbiAgQElucHV0KCkgcm93TnVtYmVyOiBib29sZWFuO1xuICBASW5wdXQoKSBhcGkhOiBPbmVHcmlkQXBpPFQ+O1xuICBASW5wdXQoKSBwYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93ZWRFZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZW5hYmxlR3JvdXBDb2x1bW5EZWZzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBgJ2Z1bGxSb3cnYDogYSBkb3VibGUtY2xpY2sgb3BlbnMgZXZlcnkgZWRpdGFibGUgY2VsbCBvZiB0aGUgcm93LCBFbnRlciBvclxuICAgKiBmb2N1cyBsZWF2aW5nIHRoZSByb3cgY29tbWl0cyB0aGVtIHRvZ2V0aGVyLCBFc2NhcGUgY2xvc2VzIHRoZW0gYWxsXG4gICAqIHdpdGhvdXQgY29tbWl0dGluZy4gRGVmYXVsdDogb25lIGNlbGwgYXQgYSB0aW1lLlxuICAgKi9cbiAgQElucHV0KCkgZWRpdFR5cGU6ICdmdWxsUm93JyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBjb250ZXh0OiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBnZXRSb3dJZDogKHBhcmFtczogT25lR3JpZEdldFJvd0lkUGFyYW1zPFQ+KSA9PiBzdHJpbmc7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGdyaWRDb3B5JCE6IFN1YmplY3Q8Q2xpcGJvYXJkRXZlbnQ+O1xuXG4gIC8qKlxuICAgKiBQaW5uZWQgcm93cyBhcmUgYm91bmQgb25seSBzbyB0aGUgY29tcG9uZW50IHJlLXJlbmRlcnMgd2hlbiB0aGV5IGNoYW5nZTtcbiAgICogdGhlIG5vZGVzIHRoZW1zZWx2ZXMgY29tZSBmcm9tIHRoZSBBUEksIHdoaWNoIG93bnMgdGhlbS5cbiAgICovXG4gIEBJbnB1dCgpIHBpbm5lZFRvcFJvd0RhdGE6IFRbXSA9IFtdO1xuICBASW5wdXQoKSBwaW5uZWRCb3R0b21Sb3dEYXRhOiBUW10gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHBpbm5lZCByb3cgY29udGFpbmVycyBzaXQgb3V0c2lkZSB0aGUgc2Nyb2xsIHZpZXdwb3J0LCBzbyB0aGV5IGhhdmUgdG9cbiAgICogYmUgdG9sZCB0aGUgaG9yaXpvbnRhbCBvZmZzZXQg4oCUIHRoZSBzYW1lIGFycmFuZ2VtZW50IHRoZSBoZWFkZXIgdXNlcy5cbiAgICovXG4gIEBWaWV3Q2hpbGRyZW4oJ3Bpbm5lZFZpZXdwb3J0JykgcHJpdmF0ZSBwaW5uZWRWaWV3cG9ydHM/OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+O1xuXG4gIHByb3RlY3RlZCBwaW5uZWRUb3BOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHByb3RlY3RlZCBwaW5uZWRCb3R0b21Ob2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB2aWV3cG9ydCE6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcblxuICBwcm90ZWN0ZWQgY29sdW1uRGVmczogT25lQ29sdW1uRGVmPFQ+W10gPSBbXTtcbiAgcHJvdGVjdGVkIGNlbGxSZW5kZXJlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNYXN0ZXIgRGV0YWlsIFByb3BlcnRpZXNcbiAgICovXG4gIEBJbnB1dCgpIGdyaWRUeXBlOiBPbmVHcmlkVHlwZSA9ICdzaW1wbGUnO1xuICBASW5wdXQoKSBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbWFzdGVyTm9kZTogT25lUm93Tm9kZTxUPiA9IG51bGw7XG4gIC8vIEBJbnB1dCgpIGRldGFpbFJvd0hlaWdodDogbnVtYmVyID0gbnVsbDtcbiAgLy8gQElucHV0KCkgZGV0YWlsUm93QXV0b0hlaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkZXRhaWxSb3dNYXhIZWlnaHQ6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBASW5wdXQoKSBkZXRhaWxHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+ID0gbnVsbDtcbiAgQElucHV0KCkgZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ6IFR5cGU8T25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogVHJlZSBEYXRhIFByb3BlcnRpZXNcbiAgICovXG4gIEBJbnB1dCgpIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRyZWVEYXRhQ2hpbGRyZW5GaWVsZDogc3RyaW5nO1xuICBASW5wdXQoKSBhdXRvR3JvdXBDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZjxUPjtcbiAgQElucHV0KCkgZ3JvdXBEZWZhdWx0RXhwYW5kZWQ6IG51bWJlciA9IC0xOyAvLyBJdCdzIHdvcmsgd2l0aCBtYXN0ZXIgZGV0YWlsIGFsc29cblxuICAvKipcbiAgICogUGFzc2luZyBSb3cgQWN0aW9uIEV2ZW50cyB0byBQYXJlbnRcbiAgICovXG4gIEBPdXRwdXQoKSBvblJvd0dvdG9EZXRhaWwgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RGV0YWlsID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0FkZE5ldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0NvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TG9jYXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RG9jdW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0dvdG9MaXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93UHJpbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93SGlzdG9yeSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TGFuZ3VhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q2VsbE9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uU2hpZnREb3VibGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgcm93Q291bnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQE91dHB1dCgpIGV4cGFuc2lvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIGJvZHlTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGNlbGxPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZVJvd0RyYWdFdmVudDxUPj4oKTtcblxuICAvKipcbiAgICogU2VsZWN0aW9uIFJhbmdlIFZhcmlhYmxlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJvd1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgbm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBSb3cgZHJhZyBzdGF0ZSwgbWlycm9yZWQgZnJvbSB0aGUgc2VydmljZSBzbyB0aGUgdGVtcGxhdGUgY2FuIHJlYWQgaXRcbiAgICogc3luY2hyb25vdXNseS4gYG51bGxgIHdoZW5ldmVyIG5vIGRyYWcgaXMgaW4gZmxpZ2h0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGRyYWdTdGF0ZTogT25lUm93RHJhZ1N0YXRlIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBkcmFnQW5ub3VuY2VtZW50ID0gJyc7XG4gIHByb3RlY3RlZCByb3dEcmFnU3VwcHJlc3NlZDogT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkQ2VsbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBpc01vdXNlRG93biA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXJ0Q2VsbDogQ2VsbFNlbGVjdGlvbiA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFNjcm9sbExlZnQgPSAwO1xuICBwcml2YXRlIGNlbGxFZGl0YWJsZVBpcGUgPSBuZXcgQ2VsbEVkaXRhYmxlUGlwZSgpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJvdGVjdGVkIGNlbGxSZW5kZXJlclBhcmFtczogT25lQ2VsbFJlbmRlcmVyUGFyYW1zID0ge1xuICAgICAgZ290b0RldGFpbEJ1dHRvblN0YXR1czogMSxcbiAgICAgIGFkZE5ld0J1dHRvblN0YXR1czogMSxcbiAgICAgIHZpZXdCdXR0b25TdGF0dXM6IDEsXG4gICAgICBsb2NhdGlvbkJ1dHRvblN0YXR1czogMSxcbiAgICAgIGRvY3VtZW50QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgY29weUJ1dHRvblN0YXR1czogMSxcbiAgICAgIGRlbGV0ZUJ1dHRvblN0YXR1czogMSxcbiAgICAgIGdvdG9MaXN0QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgb3B0aW9uQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgbGFuZ3VhZ2VCdXR0b25TdGF0dXM6IDEsXG4gICAgICBlZGl0QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgcHJpbnRCdXR0b25TdGF0dXM6IDEsXG4gICAgICBoaXN0b3J5QnV0dG9uU3RhdHVzOiAxLFxuICB9XG5cbiAgLyoqXG4gICAqIFZpcnR1YWwgU2Nyb2xsIFByb3BlcnRpZXNcbiAgICovXG4gIHByb3RlY3RlZCBpdGVtU2l6ZTogbnVtYmVyID0gMzA7XG4gIHByb3RlY3RlZCBtaW5CdWZmZXJQeDogbnVtYmVyID0gMjAwO1xuICBwcm90ZWN0ZWQgbWF4QnVmZmVyUHg6IG51bWJlciA9IDQwMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY29sU2VydmljZTogT2dDb2x1bW5TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZWxsU2VydmljZTogT25lR3JpZENlbGxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXZlbnRTZXJ2aWNlOiBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3dEcmFnU2VydmljZTogT25lR3JpZFJvd0RyYWdTZXJ2aWNlPFQ+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIEdyaWQgQ29weSBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ncmlkQ29weSQuc3Vic2NyaWJlKChldmVudDogQ2xpcGJvYXJkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5vbkdyaWRDb3B5KGV2ZW50KTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBSb3cgZHJhZ1xuICAgICAqXG4gICAgICogVGhlIHNlcnZpY2Ugb3ducyB0aGUgZ2VzdHVyZTsgdGhlIGJvZHkgb25seSByZW5kZXJzIGl0IGFuZCBsZW5kcyBpdCB0aGVcbiAgICAgKiB2aWV3cG9ydCwgdGhlIHJvdyBoZWlnaHQgYW5kIGEgd2F5IHRvIGFwcGx5IGEgbW92ZS4gVGhlIHN1cHByZXNzaW9uXG4gICAgICogcmVhc29uIGlzIHJlLXJlYWQgb24gZXZlcnkgZXZlbnQgdGhhdCBjb3VsZCBjaGFuZ2UgdGhlIG9yZGVyLCBzbyB0aGVcbiAgICAgKiBoYW5kbGUgZGlzYWJsZXMgaXRzZWxmIHRoZSBtb21lbnQgYSBzb3J0IG9yIGZpbHRlciBpcyBhcHBsaWVkLlxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5yb3dEcmFnU2VydmljZS5zdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuXG4gICAgICB0aGlzLmRyYWdTdGF0ZSA9IHN0YXRlO1xuXG4gICAgICB0aGlzLnVwZGF0ZURyb3BJbmRpY2F0b3IoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLnJvd0RyYWdTZXJ2aWNlLmFubm91bmNlbWVudCQuc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG5cbiAgICAgIHRoaXMuZHJhZ0Fubm91bmNlbWVudCA9IG1lc3NhZ2U7XG5cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBDb2x1bW4gQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsIChwYXlsb2FkOiBDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5jb2x1bW5EZWZzID0gWy4uLnBheWxvYWQuY29sdW1uc10gYXMgT25lQ29sdW1uRGVmW107XG5cbiAgICAgIC8vIFBhcmFtcyBjYXJyeSB0aGUgY29sdW1uRGVmLCBzbyBhIGNvbHVtbiBjaGFuZ2UgaW52YWxpZGF0ZXMgdGhlbSBhbGwuXG4gICAgICB0aGlzLnJlbmRlcmVyUGFyYW1zQ2FjaGUuY2xlYXIoKTtcblxuICAgICAgdGhpcy5jZWxsUmVuZGVyZXIgPSB0aGlzLmNvbHVtbkRlZnMuc29tZShjb2wgPT4gY29sLmNlbGxSZW5kZXJlckNvbXBvbmVudCk7XG5cbiAgICAgIHRoaXMucm93V2lkdGggPSB0aGlzLmNvbHVtbkRlZnMucmVkdWNlKChzdW0sIGNvbCkgPT4gc3VtICsgcmVzb2x2ZUNvbHVtbldpZHRoKGNvbCksIDApO1xuXG4gICAgICAvLyBBIGNvbHVtbiBjaGFuZ2UgY2FuIGFsdGVyIHRoZSB3aWR0aCBsZWZ0IGZvciBmbGV4IGNvbHVtbnMgKGEgaGlkZSwgYVxuICAgICAgLy8gcmVzaXplLCBuZXcgZGVmcykuIFJlLWZsZXhpbmcgb25seSBkaXNwYXRjaGVzIHdoZW4gYSB3aWR0aCBhY3R1YWxseVxuICAgICAgLy8gY2hhbmdlcywgc28gdGhpcyBjYW5ub3QgcGluZy1wb25nLlxuICAgICAgdGhpcy5hcHBseUZsZXhXaWR0aHMoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFJvdyBEYXRhIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd0RhdGFDaGFuZ2VkJywgKHsgbm9kZXM6IGFsbE5vZGVzIH06IFJvd0RhdGFDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgLy8gVGhlIGZ1bGwgcG9zdC1maWx0ZXIgY291bnQsIHJlcG9ydGVkIGJlZm9yZSB0aGUgcGFnZSBzbGljZSBpcyB0YWtlbixcbiAgICAgIC8vIHNvIHRoZSBob3N0J3MgcGFnaW5nIHRvdGFscyBzZWUgZXZlcnl0aGluZy5cbiAgICAgIHRoaXMucm93Q291bnRDaGFuZ2VkLmVtaXQoYWxsTm9kZXM/Lmxlbmd0aCA/PyAwKTtcblxuICAgICAgLy8gTmV3IHJvd3MsIG5ldyByZW5kZXJlciBwYXJhbXMg4oCUIGFuZCByZW1vdmVkIHJvd3MgbGVhdmUgbm8gc3RhbGVcbiAgICAgIC8vIGNhY2hlIGVudHJpZXMgYmVoaW5kLlxuICAgICAgdGhpcy5yZW5kZXJlclBhcmFtc0NhY2hlLmNsZWFyKCk7XG5cbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5hcGkucGFnZU5vZGVzKGFsbE5vZGVzKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgdGhpcy52aWV3cG9ydD8uY2hlY2tWaWV3cG9ydFNpemUoKTtcblxuICAgICAgICB0aGlzLnNldFZpcnR1YWxTY3JvbGwobm9kZXM/Lmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgICAgICB0aGlzLm5vZGVzID0gbm9kZXMubWFwKChub2RlOiBPbmVSb3dOb2RlKSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChub2RlLmxlYWYgJiYgdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgIG5vZGUuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXRhaWwgcm93cyBjYW4gc3RpbGwgYmUgaW4gZmxpZ2h0IHdoZW4gYSByb3cgaXMgZXhwYW5kZWQsIGFuZFxuICAgICAgICAgICAgLy8gc3ByZWFkaW5nIG51bGwgdGhyb3dzLiBOb3RoaW5nIHRvIHJlLXNlZWQgdW50aWwgdGhleSBhcnJpdmUuXG4gICAgICAgICAgICBpZiAobm9kZS5leHBhbmRlZCAmJiBub2RlLmRldGFpbFJvd0RhdGEpIHtcblxuICAgICAgICAgICAgICB0aGlzLmFwaS5zZXREZXRhaWxSb3dEYXRhKG5vZGUsIFsuLi5ub2RlLmRldGFpbFJvd0RhdGFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIHRoaXMubm9kZXMgPSBub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpO1xuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gUGlubmVkIFJvdyBEYXRhIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Bpbm5lZFJvd0RhdGFDaGFuZ2VkJywgKHsgc2lkZSwgbm9kZXMgfTogUGlubmVkUm93RGF0YUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyUGFyYW1zQ2FjaGUuY2xlYXIoKTtcblxuICAgICAgaWYgKHNpZGUgPT09ICd0b3AnKSB7XG5cbiAgICAgICAgdGhpcy5waW5uZWRUb3BOb2RlcyA9IG5vZGVzIGFzIE9uZVJvd05vZGU8VD5bXTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICB0aGlzLnBpbm5lZEJvdHRvbU5vZGVzID0gbm9kZXMgYXMgT25lUm93Tm9kZTxUPltdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gU29ydCBDaGFuZ2VkIEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzb3J0Q2hhbmdlZCcsICh7IG5vZGVzIH06IFNvcnRDaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5ub2RlcyA9IHRoaXMuYXBpLnBhZ2VOb2Rlcyhub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W10pO1xuXG4gICAgICAvLyBTb3J0aW5nIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgb3JkZXIgYXdheSBmcm9tIHRoZSB1c2VyLCBzbyB0aGUgaGFuZGxlc1xuICAgICAgLy8gaGF2ZSB0byBkaXNhYmxlIGluIHRoZSBzYW1lIGZyYW1lIHRoZSByb3dzIHJlLXNvcnQuXG4gICAgICB0aGlzLnJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpO1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gUm93IE9yZGVyIENoYW5nZWQgRXZlbnRcbiAgICAgKlxuICAgICAqIERlbGliZXJhdGVseSBub3QgZm9sZGVkIGludG8gYHJvd0RhdGFDaGFuZ2VkYDogdGhhdCBwYXRoIGRlZmVycyBhIGZyYW1lXG4gICAgICogYW5kIHJlLXNlZWRzIGRldGFpbCByb3dzLCB3aGljaCBpcyByaWdodCBmb3IgYSBkYXRhIGxvYWQgYW5kIGZhciB0b28gbXVjaFxuICAgICAqIGZvciBhIG1vdmUuIEEgcmVvcmRlciBpcyB0aGUgc2FtZSBub2RlcyBpbiBhIGRpZmZlcmVudCBvcmRlci5cbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd09yZGVyQ2hhbmdlZCcsICh7IG5vZGVzIH06IFJvd09yZGVyQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmFwaS5wYWdlTm9kZXMoWy4uLm5vZGVzXSBhcyBPbmVSb3dOb2RlPFQ+W10pO1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gQ2VsbCBTdGF0ZSBDaGFuZ2VkIEV2ZW50XG4gICAgICpcbiAgICAgKiBUaGUgYm9keSByZW5kZXJzIE9uUHVzaCwgc28gcmVnZW5lcmF0aW5nIGEgcm93J3MgY2VsbCBzdGF0ZSBpcyBpbnZpc2libGVcbiAgICAgKiB1bnRpbCBzb21ldGhpbmcgbWFya3MgdGhlIGJvZHkgZGlydHkuIFRoaXMgaXMgdGhhdCBzb21ldGhpbmcuXG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjZWxsU3RhdGVDaGFuZ2VkJywgKCkgPT4ge1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gU2VsZWN0aW9uIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGlvbkNoYW5nZWQnLCAocGF5bG9hZDogU2VsZWN0aW9uQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgIGlmIChwYXlsb2FkKSB7XG5cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgb25HcmlkUmVhZHkocGFyYW1zOiBPbmVHcmlkUmVhZHlFdmVudCkge1xuXG4gICAgcGFyYW1zLmFwaS5zZXRSb3dEYXRhKHRoaXMubWFzdGVyTm9kZT8uZGV0YWlsUm93RGF0YSA/PyBbXSk7XG4gIH1cblxuICBvbkJvZHlTY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XG5cbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcblxuICAgIGlmIChzY3JvbGxMZWZ0ICE9PSB0aGlzLmxhc3RTY3JvbGxMZWZ0KSB7XG5cbiAgICAgIHRoaXMubGFzdFNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuXG4gICAgICB0aGlzLnN5bmNQaW5uZWRSb3dzKHNjcm9sbExlZnQpO1xuXG4gICAgICB0aGlzLmJvZHlTY3JvbGwuZW1pdChzY3JvbGxMZWZ0KTtcblxuICAgICAgLy8gVGhlIGluZGljYXRvciBpcyBjbGlwcGVkIHRvIHRoZSByb3cgY29udGVudCwgd2hpY2ggbW92ZXMgc2lkZXdheXMgdG9vLlxuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG5cbiAgICAgICAgdGhpcy51cGRhdGVEcm9wSW5kaWNhdG9yKCk7XG5cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWZXJ0aWNhbDogdGhlIGRyb3AgaW5kaWNhdG9yIGlzIGFuY2hvcmVkIHRvIHRoZSBib2R5LCBub3QgdGhlIGNvbnRlbnQsIHNvXG4gICAgLy8gaXQgaGFzIHRvIGJlIHJlcG9zaXRpb25lZCBhcyB0aGUgcm93cyBtb3ZlIGJlbmVhdGggaXQg4oCUIHdoaWNoIHRoZXkgZG8gb25cbiAgICAvLyB0aGVpciBvd24gZHVyaW5nIGF1dG8tc2Nyb2xsLCB3aXRoIHRoZSBwb2ludGVyIHN0YW5kaW5nIHN0aWxsLlxuICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuXG4gICAgICB0aGlzLnVwZGF0ZURyb3BJbmRpY2F0b3IoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIHBpbm5lZCByb3dzIGluIHN0ZXAgd2l0aCB0aGUgYm9keSdzIGhvcml6b250YWwgcG9zaXRpb24uXG4gICAqXG4gICAqIEFzc2lnbmVkIHJhdGhlciB0aGFuIHRyYW5zZm9ybWVkLCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBoZWFkZXI6IHN0aWNreVxuICAgKiBwb3NpdGlvbmluZyBmb3IgcGlubmVkICpjb2x1bW5zKiBoYXMgdG8gcmVzb2x2ZSBhZ2FpbnN0IGEgcmVhbCBzY3JvbGxwb3J0LFxuICAgKiBhbmQgYSB0cmFuc2Zvcm1lZCBhbmNlc3RvciBpcyBub3Qgb25lLiBQaW5uZWQgcm93cyBhbmQgcGlubmVkIGNvbHVtbnNcbiAgICogdGhlcmVmb3JlIGNvbXBvc2Ug4oCUIGEgZnJvemVuIGNvcm5lciBjZWxsIHN0YXlzIGZyb3plbiBvbiBib3RoIGF4ZXMuXG4gICAqL1xuICBwcml2YXRlIHN5bmNQaW5uZWRSb3dzKHNjcm9sbExlZnQ6IG51bWJlcik6IHZvaWQge1xuXG4gICAgdGhpcy5waW5uZWRWaWV3cG9ydHM/LmZvckVhY2godmlld3BvcnQgPT4gKHZpZXdwb3J0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBSZW5kZXJpbmcgUm93IE5vZGUgQnkgUm93IElEXG4gICAqL1xuICB0cmFja0J5Um93SWQoaW5kZXg6IG51bWJlciwgbm9kZTogT25lUm93Tm9kZTxUPik6IHN0cmluZyB7XG5cbiAgICByZXR1cm4gbm9kZS5yb3dJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDZWxsIFNlbGVjdGlvbiBSYW5nZSBGZWF0dXJlXG4gICAqL1xuICBzdGFydFNlbGVjdGlvbihyb3dJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nKSB7XG5cbiAgICB0aGlzLmlzTW91c2VEb3duID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IHsgcm93SWQsIGZpZWxkIH07XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkQ2VsbHMpLmFkZChnZXRDZWxsS2V5KHJvd0lkLCBmaWVsZCkpO1xuICB9XG5cbiAgZXh0ZW5kU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIGlmICghdGhpcy5pc01vdXNlRG93biB8fCAhdGhpcy5zdGFydENlbGwpIHJldHVybjtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLm5vZGVzOyAvLyBhbHJlYWR5IHNvcnRlZFxuICAgIGNvbnN0IHN0YXJ0Um93SW5kZXggPSByb3dzLmZpbmRJbmRleChyID0+IHIucm93SWQgPT09IHRoaXMuc3RhcnRDZWxsIS5yb3dJZCk7XG4gICAgY29uc3QgZW5kUm93SW5kZXggICA9IHJvd3MuZmluZEluZGV4KHIgPT4gci5yb3dJZCA9PT0gcm93SWQpO1xuXG4gICAgaWYgKHN0YXJ0Um93SW5kZXggPT09IC0xIHx8IGVuZFJvd0luZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29sU3RhcnRJbmRleCA9IHRoaXMuY29sdW1uRGVmcy5maW5kSW5kZXgoYyA9PiBjLmZpZWxkID09PSB0aGlzLnN0YXJ0Q2VsbCEuZmllbGQpO1xuICAgIGNvbnN0IGNvbEVuZEluZGV4ICAgPSB0aGlzLmNvbHVtbkRlZnMuZmluZEluZGV4KGMgPT4gYy5maWVsZCA9PT0gZmllbGQpO1xuXG4gICAgaWYgKGNvbFN0YXJ0SW5kZXggPT09IC0xIHx8IGNvbEVuZEluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93U3RhcnQgPSBNYXRoLm1pbihzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3Qgcm93RW5kICAgPSBNYXRoLm1heChzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3QgY29sU3RhcnQgPSBNYXRoLm1pbihjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG4gICAgY29uc3QgY29sRW5kICAgPSBNYXRoLm1heChjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG5cbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGxldCByID0gcm93U3RhcnQ7IHIgPD0gcm93RW5kOyByKyspIHtcbiAgICAgIGZvciAobGV0IGMgPSBjb2xTdGFydDsgYyA8PSBjb2xFbmQ7IGMrKykge1xuICAgICAgICBuZXh0LmFkZChnZXRDZWxsS2V5KHJvd3Nbcl0ucm93SWQsIHRoaXMuY29sdW1uRGVmc1tjXS5maWVsZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDZWxscyA9IG5leHQ7XG4gIH1cblxuXG4gIGVuZFNlbGVjdGlvbigpIHtcblxuICAgIHRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgQ2VsbHMgU2VsZWN0ZWRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5ib2R5UmVmPy5uYXRpdmVFbGVtZW50KSB7XG5cbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmJvZHlSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSk7XG5cbiAgICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gUmFuZ2UgRXZlbnQgSG9sZCBNb3VzZSBDbGlja1xuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcpXG4gIG9uR2xvYmFsTW91c2VVcCgpIHtcblxuICAgIHRoaXMuZW5kU2VsZWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIENvcHkgQ2xpcGJvYXJkIEV2ZW50XG4gICAqL1xuICBvbkdyaWRDb3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMuc2l6ZSA+IDApIHtcblxuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuYnVpbGRDbGlwYm9hcmRUZXh0KCk7XG5cbiAgICAgIGV2ZW50LmNsaXBib2FyZERhdGE/LnNldERhdGEoJ3RleHQvcGxhaW4nLCB0ZXh0KTtcblxuICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLmZvckVhY2goY2VsbElkID0+IHtcblxuICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWNlbGwtaWQ9XCIke2NlbGxJZH1cIl1gKTtcblxuICAgICAgICBpZiAoY2VsbEVsZW1lbnQpIHtcblxuICAgICAgICAgIGNlbGxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29uZS1jZWxsLWNvcGllZCcpO1xuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBjZWxsRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvbmUtY2VsbC1jb3BpZWQnKSwgNDAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29weVRvQ2xpcGJvYXJkKHZhbHVlOiBzdHJpbmcpIHtcblxuICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQpIHtcblxuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodmFsdWUpO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgLy8gRmFsbGJhY2sgKFNhZmFyaSAvIG9sZGVyIGJyb3dzZXJzKVxuICAgICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgdGV4dGFyZWEudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRleHRhcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRleHRhcmVhLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRhcmVhKTtcbiAgICAgIHRleHRhcmVhLnNlbGVjdCgpO1xuICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dGFyZWEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBDb3B5IENlbGwgVGV4dCB0byBDbGlwYm9hcmRcbiAgICovXG4gIHByaXZhdGUgYnVpbGRDbGlwYm9hcmRUZXh0KCk6IHN0cmluZyB7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDZWxscy5zaXplKSByZXR1cm4gJyc7XG5cbiAgICAvLyBQYXJzZSBzZWxlY3RlZCBjZWxsc1xuICAgIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkQ2VsbHMpLm1hcChrZXkgPT4ge1xuXG4gICAgICBjb25zdCBbcm93SWQsIGZpZWxkXSA9IGtleS5zcGxpdCgnLS0nKTtcbiAgICAgIHJldHVybiB7IHJvd0lkLCBmaWVsZCB9O1xuICAgIH0pO1xuXG4gICAgLy8gUmVzb2x2ZSB2aXN1YWwgcm93IGluZGV4ZXMgZnJvbSBkaXNwbGF5ZWRSb3dzXG4gICAgY29uc3Qgcm93SW5kZXhlcyA9IHNlbGVjdGVkXG4gICAgICAubWFwKHMgPT4gdGhpcy5ub2Rlcy5maW5kSW5kZXgociA9PiByLnJvd0lkID09PSBzLnJvd0lkKSlcbiAgICAgIC5maWx0ZXIoaSA9PiBpICE9PSAtMSk7XG5cbiAgICBjb25zdCBjb2xJbmRleGVzID0gc2VsZWN0ZWRcbiAgICAgIC5tYXAocyA9PiB0aGlzLmNvbHVtbkRlZnMuZmluZEluZGV4KGMgPT4gYy5maWVsZCA9PT0gcy5maWVsZCkpXG4gICAgICAuZmlsdGVyKGkgPT4gaSAhPT0gLTEpO1xuXG4gICAgaWYgKCFyb3dJbmRleGVzLmxlbmd0aCB8fCAhY29sSW5kZXhlcy5sZW5ndGgpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHJvd1N0YXJ0ID0gTWF0aC5taW4oLi4ucm93SW5kZXhlcyk7XG4gICAgY29uc3Qgcm93RW5kICAgPSBNYXRoLm1heCguLi5yb3dJbmRleGVzKTtcbiAgICBjb25zdCBjb2xTdGFydCA9IE1hdGgubWluKC4uLmNvbEluZGV4ZXMpO1xuICAgIGNvbnN0IGNvbEVuZCAgID0gTWF0aC5tYXgoLi4uY29sSW5kZXhlcyk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEZpZWxkcyA9IHRoaXMuY29sdW1uRGVmc1xuICAgICAgLnNsaWNlKGNvbFN0YXJ0LCBjb2xFbmQgKyAxKVxuICAgICAgLm1hcChjID0+IGMuZmllbGQpO1xuXG4gICAgY29uc3QgY2xpcGJvYXJkTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGxldCByID0gcm93U3RhcnQ7IHIgPD0gcm93RW5kOyByKyspIHtcblxuICAgICAgY29uc3Qgcm93ID0gdGhpcy5ub2Rlc1tyXTtcbiAgICAgIGNvbnN0IGxpbmUgPSBzZWxlY3RlZEZpZWxkc1xuICAgICAgICAubWFwKGZpZWxkID0+IHtcblxuICAgICAgICAgIGNvbnN0IGtleSA9IGAke3Jvdy5yb3dJZH0tLSR7ZmllbGR9YDtcblxuICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZENlbGxzLmhhcyhrZXkpKSB7XG5cbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKHJvdy5kYXRhLCBmaWVsZCk7XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWUgPz8gJyc7XG5cbiAgICAgICAgfSkuam9pbignXFx0Jyk7XG5cbiAgICAgIGNsaXBib2FyZExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBib2FyZExpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRpbmcgRXZlbnRzIFJvdyBBY3Rpb24gdG8gUGFyZW50XG4gICAqL1xuICBpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvRGV0YWlsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dEZXRhaWwuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25BZGROZXcoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0FkZE5ldy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblZpZXcoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1ZpZXcuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93TG9jYXRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Eb2N1bWVudChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RG9jdW1lbnQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Db3B5KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dDb3B5LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRGVsZXRlKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dEZWxldGUuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93R290b0xpc3QuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25FZGl0KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dFZGl0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uUHJpbnQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1ByaW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uSGlzdG9yeShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93SGlzdG9yeS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbk9wdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93T3B0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0xhbmd1YWdlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGNlbGwgb3B0aW9uIG1lbnUsIGFuZCB0ZWxsIHRoZSBob3N0IGl0IHdhcyBhc2tlZCBmb3IuXG4gICAqXG4gICAqIFRoZSBvcGVuaW5nIGlzIHRoZSBwYXJ0IHRoYXQgd2FzIG1pc3NpbmcuIEV2ZXJ5dGhpbmcgZWxzZSBleGlzdGVkIOKAlCB0aGVcbiAgICogdHJpZ2dlciBidXR0b24gYmVoaW5kIGBjZWxsUmVuZGVyZXJQYXJhbXMuY2VsbE9wdGlvbkJ1dHRvblN0YXR1c2AsIHRoZSBtZW51XG4gICAqIGNvbXBvbmVudCwgdGhlIGBjZWxsT3B0aW9uTWVudWAgY29sdW1uIHByb3BlcnR5LCB0aGUgc2VsZWN0aW9uIGV2ZW50IHdpcmVkXG4gICAqIHRocm91Z2ggdG8gdGhlIGdyaWQncyBvdXRwdXQg4oCUIGJ1dCBub3RoaW5nIGV2ZXIgc2V0IHRoZSBmbGFnIHRoZSB0ZW1wbGF0ZVxuICAgKiByZW5kZXJzIG9uLCBzbyB0aGUgYnV0dG9uIGRpZCBub3RoaW5nIGF0IGFsbC5cbiAgICpcbiAgICogRG9uZSBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSByb3ctYWN0aW9uIGNvbXBvbmVudCBiZWNhdXNlIHRoaXMgaXMgdGhlXG4gICAqIGNvbXBvbmVudCB3aG9zZSB0ZW1wbGF0ZSByZW5kZXJzIHRoZSBtZW51LCBhbmQgc28gdGhlIG9uZSB0aGF0IGhhcyB0byBiZVxuICAgKiBtYXJrZWQgZm9yIGNoZWNrLlxuICAgKi9cbiAgaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICBjb25zdCBmaWVsZCA9IGV2ZW50LmNvbHVtbj8uZmllbGQgYXMgc3RyaW5nO1xuXG4gICAgLy8gTm90aGluZyB0byBvcGVuIHdoZW4gdGhlIGNvbHVtbiBkZWNsYXJlZCBubyBvcHRpb25zOyB0aGUgZXZlbnQgc3RpbGxcbiAgICAvLyBnb2VzIHRvIHRoZSBob3N0LCB3aGljaCBtYXkgYmUgZHJpdmluZyBzb21ldGhpbmcgb2YgaXRzIG93bi5cbiAgICBpZiAoZmllbGQgJiYgZXZlbnQubm9kZSAmJiBldmVudC5jb2x1bW4/LmNlbGxPcHRpb25NZW51Py5sZW5ndGgpIHtcblxuICAgICAgZXZlbnQubm9kZS5jZWxsT3B0aW9uc1tmaWVsZF0gPSB0cnVlO1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93Q2VsbE9wdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWVudSBjbG9zZWQgaXRzZWxmIOKAlCBvbiBzZWxlY3QsIG9uIEVzY2FwZSwgb3Igb24gYSBjbGljayBvdXRzaWRlLiBJdFxuICAgKiBoYXMgYWxyZWFkeSBjbGVhcmVkIGl0cyBvd24gZmxhZzsgdGhpcyBpcyB3aGF0IHJlcGFpbnRzIHdpdGhvdXQgaXQuXG4gICAqL1xuICBjZWxsT3B0aW9uTWVudUNsb3NlZCgpOiB2b2lkIHtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uU2VsZWN0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dTZWxlY3Rpb24uZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGEgZ3JvdXAgLyBtYXN0ZXIgcm93LCB0aGVuIHJlcG9ydCB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBUaGUgZ3JvdXAgcmVuZGVyZXIgaXMgcHJlc2VudGF0aW9uYWw6IGl0IHNheXMgXCJ0aGUgZXhwYW5kZXIgd2FzIGNsaWNrZWRcIlxuICAgKiBhbmQgbm90aGluZyBtb3JlLiBQZXJmb3JtaW5nIHRoZSBzdGF0ZSBjaGFuZ2UgYmVsb25ncyBoZXJlLCB3aGVyZSB0aGUgQVBJXG4gICAqIGlzIGF2YWlsYWJsZS4gUHJldmlvdXNseSB0aGlzIG1ldGhvZCBvbmx5IHJlLWVtaXR0ZWQsIHNvIHRoZSBleHBhbmRlclxuICAgKiByZW5kZXJlZCwgYW5pbWF0ZWQgb24gaG92ZXIgYW5kIGRpZCBub3RoaW5nIGF0IGFsbCDigJQgZXZlcnkgY29uc3VtZXIgaGFkIHRvXG4gICAqIGRpc2NvdmVyIGZvciBpdHNlbGYgdGhhdCBgZXhwYW5zaW9uQ2hhbmdlZGAgd2FzIGEgcmVxdWVzdCByYXRoZXIgdGhhbiB0aGVcbiAgICogbm90aWZpY2F0aW9uIGl0cyBwYXN0LXRlbnNlIG5hbWUgcHJvbWlzZXMuXG4gICAqXG4gICAqIFRoZSBldmVudCBpcyByZS1lbWl0dGVkICphZnRlciogdGhlIHRvZ2dsZSwgc28gYGV2ZW50Lm5vZGUuZXhwYW5kZWRgIGlzIHRoZVxuICAgKiBuZXcgc3RhdGUsIHdoaWNoIGlzIHdoYXQgYSBwYXN0LXRlbnNlIGV2ZW50IHNob3VsZCBjYXJyeS5cbiAgICovXG4gIGludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljayhldmVudDogRXhwYW5zaW9uQ2hhbmdlZEV2ZW50KTogdm9pZCB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQoZXZlbnQubm9kZS5yb3dJZCkgPz8gZXZlbnQubm9kZTtcblxuICAgIHRoaXMuYXBpLnNldEV4cGFuZGVkQnlJZChub2RlLnJvd0lkLCAhbm9kZS5leHBhbmRlZCk7XG5cbiAgICB0aGlzLmV4cGFuc2lvbkNoYW5nZWQuZW1pdCh7IC4uLmV2ZW50LCBub2RlLCBhcGk6IHRoaXMuYXBpIH0pO1xuICB9XG5cbiAgY2VsbE9wdGlvbk1lbnVTZWxlY3RlZChldmVudDogQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50KSB7XG5cbiAgICB0aGlzLmNlbGxPcHRpb25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lhbCBFdmVudHNcbiAgICovXG4gIHByaXZhdGUgaW52b2tlU2hpZnREb3VibGVDbGljayhub2RlOk9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogdm9pZCB7XG5cbiAgICBsZXQgZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGV2ZW50ID0geyAuLi5ldmVudCwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25TaGlmdERvdWJsZUNsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENlbGwgRWRpdCBGZWF0dXJlXG4gICAqL1xuICBzdGFydEVkaXQoZXZlbnQ6IE1vdXNlRXZlbnQsIG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2knKSB7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcblxuICAgICAgdGhpcy5pbnZva2VTaGlmdERvdWJsZUNsaWNrKG5vZGUsIGNvbHVtbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNlbGxFZGl0YWJsZVBpcGUudHJhbnNmb3JtKG5vZGUuY2VsbFN0YXRlcywgY29sdW1uLCBub2RlLCB0aGlzLmNlbGxTZXJ2aWNlLmVkaXRhYmxlRm4sIHRoaXMuY2VsbFNlcnZpY2UudXBkYXRhYmxlRm4sIHRoaXMuYWxsb3dlZEVkaXQpKSB7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5jbGVhcigpO1xuXG4gICAgICBjb25zdCBjZWxsS2V5ID0gZ2V0Q2VsbEtleShub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMuYWRkKGNlbGxLZXkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJvd05vZGU6IE9uZVJvd05vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIGlmICh0aGlzLmVkaXRUeXBlID09PSAnZnVsbFJvdycpIHtcblxuICAgICAgICAvLyBUaGUgd2hvbGUgcm93IGVkaXRzIHRvZ2V0aGVyLCBzbyBldmVyeSBjZWxsIHRoYXQgd291bGQgYWNjZXB0IGl0c1xuICAgICAgICAvLyBvd24gZG91YmxlLWNsaWNrIG9wZW5zIG5vdy4gVGhlIGNsaWNrZWQgb25lIHN0aWxsIHRha2VzIGZvY3VzIGJlbG93LlxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmNvbHVtbkRlZnMpIHtcblxuICAgICAgICAgIGlmICghY29sLmZpZWxkKSBjb250aW51ZTtcblxuICAgICAgICAgIGlmICh0aGlzLmNlbGxFZGl0YWJsZVBpcGUudHJhbnNmb3JtKHJvd05vZGUuY2VsbFN0YXRlcywgY29sLCByb3dOb2RlLCB0aGlzLmNlbGxTZXJ2aWNlLmVkaXRhYmxlRm4sIHRoaXMuY2VsbFNlcnZpY2UudXBkYXRhYmxlRm4sIHRoaXMuYWxsb3dlZEVkaXQpKSB7XG5cbiAgICAgICAgICAgIHJvd05vZGUuZWRpdGluZ1tjb2wuZmllbGRdID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICByb3dOb2RlLmVkaXRpbmdbY29sdW1uLmZpZWxkXSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQ+KGBbZGF0YS1jZWxsLWlkPVwiJHsgZ2V0Q2VsbEtleShub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpIH1cIl0gaW5wdXQsIFtkYXRhLWNlbGwtaWQ9XCIkeyBnZXRDZWxsS2V5KG5vZGUucm93SWQsIGNvbHVtbi5maWVsZCkgfVwiXSBzZWxlY3RgKTtcblxuICAgICAgICBpZiAoaW5wdXQpIHtcblxuICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG5cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnZhbHVlO1xuXG4gICAgICAgICAgLy8gQSBzZWxlY3QgcmVwb3J0cyB0eXBlICdzZWxlY3Qtb25lJywgc28gb25seSBhIHRleHQgaW5wdXQgZ2V0cyBpdHNcbiAgICAgICAgICAvLyBjYXJldCBwbGFjZWQuXG4gICAgICAgICAgaWYgKHZhbHVlICYmIFtcInRleHRcIl0uaW5jbHVkZXMoaW5wdXQudHlwZSkgJiYgJ3NldFNlbGVjdGlvblJhbmdlJyBpbiBpbnB1dCkge1xuXG4gICAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSh2YWx1ZS5sZW5ndGgsIHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgMTApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIENlbGwgRWRpdCBNb2RlXG4gICAqL1xuICBzdG9wRWRpdChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPiwgZXZlbnQ6IGFueSkge1xuXG4gICAgaWYgKHRoaXMuZWRpdFR5cGUgPT09ICdmdWxsUm93Jykge1xuXG4gICAgICB0aGlzLnN0b3BSb3dFZGl0RnJvbUV2ZW50KG5vZGUsIGV2ZW50KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICAvLyBUaGUgZWRpdGluZyBndWFyZCBtYWtlcyBhIHNlY29uZCBjb21taXQgZm9yIG9uZSBlZGl0IGEgbm8tb3A6IGEgc2VsZWN0XG4gICAgLy8gY29tbWl0cyBvbiAoY2hhbmdlKSwgd2hpY2ggY2xvc2VzIHRoZSBlZGl0b3IsIGFuZCB0aGUgKGJsdXIpIHRoYXQgY2FuXG4gICAgLy8gZm9sbG93IG11c3Qgbm90IGNvbW1pdCBhZ2Fpbi5cbiAgICBpZiAocm93Tm9kZSAmJiByb3dOb2RlLmVkaXRpbmdbY29sdW1uLmZpZWxkXSkge1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlID8/ICcnO1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSByb3dOb2RlLmRhdGFbY29sdW1uLmZpZWxkXTtcblxuICAgICAgdGhpcy5zZXRDZWxsVmFsdWVCeVJvd0lkKG5vZGUucm93SWQsIGNvbHVtbiwgdmFsdWUpO1xuXG4gICAgICB0aGlzLmZpbmlzaEVkaXQocm93Tm9kZSwgY29sdW1uLCBvbGRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYSBgc2VsZWN0YCBlZGl0b3IncyBjaG9pY2UuXG4gICAqXG4gICAqIFNlcGFyYXRlIGZyb20gYHN0b3BFZGl0YCBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBub3QgdGhlIGVsZW1lbnQncyBzdHJpbmc6XG4gICAqIHRoZSBjaG9zZW4gaW5kZXggbWFwcyBiYWNrIGludG8gYHNlbGVjdE9wdGlvbnNgLCBzbyB0aGUgY29tbWl0dGVkIHZhbHVlXG4gICAqIGtlZXBzIHdoYXRldmVyIHR5cGUgdGhlIG9wdGlvbiBkZWNsYXJlZC5cbiAgICovXG4gIHN0b3BFZGl0U2VsZWN0KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+LCBldmVudDogYW55KSB7XG5cbiAgICBpZiAodGhpcy5lZGl0VHlwZSA9PT0gJ2Z1bGxSb3cnKSB7XG5cbiAgICAgIC8vIChjaGFuZ2UpIGlzIG5vdCBhIGNvbW1pdCBpbiBmdWxsLXJvdyBtb2RlIOKAlCB0aGUgY2hvaWNlIHNpdHMgaW4gdGhlXG4gICAgICAvLyBzZWxlY3QgdW50aWwgdGhlIHJvdyBjb21taXRzIGFuZCByZWFkcyBldmVyeSBlZGl0b3IgYXQgb25jZS4gT25seSBhXG4gICAgICAvLyBibHVyIHRoYXQgYWN0dWFsbHkgbGVhdmVzIHRoZSByb3cgY2xvc2VzIGl0LlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdibHVyJykgdGhpcy5zdG9wUm93RWRpdEZyb21FdmVudChub2RlLCBldmVudCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcm93Tm9kZTogT25lUm93Tm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUgJiYgcm93Tm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0pIHtcblxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uc2VsZWN0T3B0aW9ucyA/PyBbXTtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnNbKGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCkuc2VsZWN0ZWRJbmRleF07XG5cbiAgICAgIGlmICghb3B0aW9uKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gcm93Tm9kZS5kYXRhW2NvbHVtbi5maWVsZF07XG5cbiAgICAgIHJvd05vZGUuZGF0YVtjb2x1bW4uZmllbGRdID0gb3B0aW9uLnZhbHVlO1xuXG4gICAgICB0aGlzLmZpbmlzaEVkaXQocm93Tm9kZSwgY29sdW1uLCBvbGRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBlZGl0b3IgYW5kIGFubm91bmNlIHRoZSBjb21taXQuIFNoYXJlZCBieSBib3RoIGVkaXRvciBraW5kcy4gKi9cbiAgcHJpdmF0ZSBmaW5pc2hFZGl0KHJvd05vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+LCBvbGRWYWx1ZTogYW55KSB7XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IHJvd05vZGUuZGF0YVtjb2x1bW4uZmllbGRdO1xuXG4gICAgcm93Tm9kZS5jZWxsU3RhdGVzID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMocm93Tm9kZSk7XG4gICAgcm93Tm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0gPSBmYWxzZTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NlbGxTdGF0ZUNoYW5nZWQnLCB7XG4gICAgICBkYXRhOiByb3dOb2RlLmRhdGEsXG4gICAgICBub2RlOiByb3dOb2RlLFxuICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICB9KTtcblxuICAgIC8vIENvbXBhcmVkIGFmdGVyIG5vcm1hbGlzYXRpb24gKCcnIC0+IG51bGwsIG51bWJlciBjb2VyY2lvbiksIHNvIGEgYmx1clxuICAgIC8vIHRoYXQgbGVhdmVzIHRoZSB2YWx1ZSBhcyBpdCB3YXMgZG9lcyBub3QgYW5ub3VuY2UgYW4gZWRpdC5cbiAgICBpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NlbGxWYWx1ZUNoYW5nZWQnLCB7XG4gICAgICAgIG5vZGU6IHJvd05vZGUsXG4gICAgICAgIGRhdGE6IHJvd05vZGUuZGF0YSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgIGZpZWxkOiBjb2x1bW4uZmllbGQsXG4gICAgICAgIG9sZFZhbHVlLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgQ2VsbCBFZGl0IE1vZGVcbiAgICovXG4gIGNhbmNlbEVkaXQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICBpZiAodGhpcy5lZGl0VHlwZSA9PT0gJ2Z1bGxSb3cnKSB7XG5cbiAgICAgICAgLy8gRXNjYXBlIGFiYW5kb25zIHRoZSB3aG9sZSByb3c6IGV2ZXJ5IGVkaXRvciBjbG9zZXMsIG5vdGhpbmcgY29tbWl0cy5cbiAgICAgICAgT2JqZWN0LmtleXMocm93Tm9kZS5lZGl0aW5nKS5mb3JFYWNoKGZpZWxkID0+IHJvd05vZGUuZWRpdGluZ1tmaWVsZF0gPSBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByb3dOb2RlLmVkaXRpbmdbY29sdW1uLmZpZWxkXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxsLXJvdyBjb21taXQsIHJvdXRlZCBmcm9tIGFueSBvbmUgZWRpdG9yJ3MgRW50ZXIgb3IgYmx1ci5cbiAgICpcbiAgICogQSBibHVyIHRoYXQgbGFuZHMgb24gYW5vdGhlciBlZGl0b3IgaW4gdGhlIHNhbWUgcm93IGlzIHRoZSB1c2VyIHRhYmJpbmdcbiAgICogYmV0d2VlbiBmaWVsZHMsIG5vdCBsZWF2aW5nIHRoZSByb3cg4oCUIHRoZSBlZGl0b3JzIHN0YXkgb3BlbiBhbmQgdGhlaXJcbiAgICogdHlwZWQgdmFsdWVzIHN0YXkgaW4gdGhlIERPTSB1bnRpbCB0aGUgcm93IGNvbW1pdHMuXG4gICAqL1xuICBwcml2YXRlIHN0b3BSb3dFZGl0RnJvbUV2ZW50KG5vZGU6IE9uZVJvd05vZGU8VD4sIGV2ZW50OiBhbnkpIHtcblxuICAgIGlmIChldmVudC50eXBlID09PSAnYmx1cicpIHtcblxuICAgICAgY29uc3QgbmV4dCA9IChldmVudCBhcyBGb2N1c0V2ZW50KS5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgICAgaWYgKG5leHQ/Lm1hdGNoZXM/LignaW5wdXQub25lLWNlbGwtaW5wdXQsIHNlbGVjdC5vbmUtY2VsbC1pbnB1dCcpXG4gICAgICAgICYmIG5leHQuY2xvc2VzdD8uKGBbZGF0YS1jZWxsLWlkXj1cIiR7bm9kZS5yb3dJZH0tLVwiXWApKSB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24/LigpO1xuXG4gICAgdGhpcy5zdG9wUm93RWRpdChub2RlKTtcbiAgfVxuXG4gIC8qKiBDb21taXQgZXZlcnkgb3BlbiBlZGl0b3Igb2Ygb25lIHJvdywgcmVhZGluZyBlYWNoIGZyb20gdGhlIERPTS4gKi9cbiAgcHJpdmF0ZSBzdG9wUm93RWRpdChub2RlOiBPbmVSb3dOb2RlPFQ+KSB7XG5cbiAgICBjb25zdCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAoIXJvd05vZGUpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuY29sdW1uRGVmcykge1xuXG4gICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5maWVsZCBhcyBzdHJpbmc7XG5cbiAgICAgIGlmICghZmllbGQgfHwgIXJvd05vZGUuZWRpdGluZ1tmaWVsZF0pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBrZXkgPSBnZXRDZWxsS2V5KHJvd05vZGUucm93SWQsIGZpZWxkKTtcbiAgICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50PihcbiAgICAgICAgYFtkYXRhLWNlbGwtaWQ9XCIke2tleX1cIl0gaW5wdXQsIFtkYXRhLWNlbGwtaWQ9XCIke2tleX1cIl0gc2VsZWN0YCk7XG5cbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gcm93Tm9kZS5kYXRhW2ZpZWxkXTtcblxuICAgICAgaWYgKGVkaXRvcj8udGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gY29sdW1uLmNlbGxSZW5kZXJlclBhcmFtcz8uc2VsZWN0T3B0aW9ucyA/PyBbXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1soZWRpdG9yIGFzIEhUTUxTZWxlY3RFbGVtZW50KS5zZWxlY3RlZEluZGV4XTtcblxuICAgICAgICBpZiAob3B0aW9uKSByb3dOb2RlLmRhdGFbZmllbGRdID0gb3B0aW9uLnZhbHVlO1xuXG4gICAgICB9IGVsc2UgaWYgKGVkaXRvcikge1xuXG4gICAgICAgIGNvbnN0IHJhdyA9IGVkaXRvci52YWx1ZSA/PyAnJztcblxuICAgICAgICByb3dOb2RlLmRhdGFbZmllbGRdID0gcmF3ID09PSAnJ1xuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogY29sdW1uLmNlbGxSZW5kZXJlclBhcmFtcz8uaW5wdXRUeXBlID09PSAnbnVtYmVyJyA/IE51bWJlcihyYXcpIDogcmF3O1xuICAgICAgfVxuXG4gICAgICAvLyBmaW5pc2hFZGl0IGNsb3NlcyB0aGUgZWRpdG9yLCByZWZyZXNoZXMgdGhlIGNlbGwgc3RhdGUgYW5kIHJhaXNlc1xuICAgICAgLy8gY2VsbFZhbHVlQ2hhbmdlZCB3aGVuIHRoZSB2YWx1ZSBtb3ZlZCDigJQgb25lIGV2ZW50IHBlciBjaGFuZ2VkIGNlbGwsXG4gICAgICAvLyB0aGUgc2FtZSBjb250cmFjdCBhcyBzaW5nbGUtY2VsbCBlZGl0aW5nLlxuICAgICAgdGhpcy5maW5pc2hFZGl0KHJvd05vZGUsIGNvbHVtbiwgb2xkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgQ2VsbCBWYWx1ZVxuICAgKi9cbiAgc2V0Q2VsbFZhbHVlQnlSb3dJZChyb3dJZDogc3RyaW5nLCBjb2x1bW46IE9uZUNvbHVtbkRlZiwgdmFsdWU6IGFueSkge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKHJvd0lkKTtcblxuICAgIGlmIChub2RlICYmIGNvbHVtbi5maWVsZCkge1xuXG4gICAgICBpZiAoY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSAhPT0gJ251bWJlcicpIHtcblxuICAgICAgICBub2RlLmRhdGFbY29sdW1uLmZpZWxkXSA9IHZhbHVlID09PSAnJyA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBub2RlLmRhdGFbY29sdW1uLmZpZWxkXSA9IHZhbHVlID09PSAnJyA/IG51bGwgOiBOdW1iZXIodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXJ0dWFsIFNjcm9sbCBQcm9wZXJ0aWVzXG4gICAqXG4gICAqIFRoZSBidWZmZXIgc2NhbGVzIHdpdGggdGhlIHJvdyBjb3VudCBzbyBzbWFsbCBncmlkcyByZW5kZXIgaW4gb25lIHBhc3MsIGJ1dFxuICAgKiBpdCBpcyBjYXBwZWQ6IGBpdGVtU2l6ZSAqIGl0ZW1zICogMS41YCBpcyAxLjV4IHRoZSAqdG90YWwqIGNvbnRlbnQgaGVpZ2h0LFxuICAgKiBhbmQgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCBleHBhbmRzIGl0cyByZW5kZXJlZCByYW5nZSB1bnRpbCB0aGUgYnVmZmVyIGlzXG4gICAqIHNhdGlzZmllZC4gVW5jYXBwZWQsIHRoYXQgbWFrZXMgdGhlIHZpZXdwb3J0IG1hdGVyaWFsaXNlIGV2ZXJ5IHJvdyBhbmRcbiAgICogdmlydHVhbCBzY3JvbGxpbmcgc3RvcHMgZG9pbmcgYW55dGhpbmcgYXQgYWxsICgxMDBrIHJvd3MgbG9ja2VkIHRoZSB0YWIpLlxuICAgKiBNQVhfQlVGRkVSX1BYIGtlZXBzIHJvdWdobHkgdHdlbnR5IHJvd3Mgb2Ygb3ZlcnNjYW4gZWl0aGVyIHNpZGUgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX0JVRkZFUl9QWDogbnVtYmVyID0gNjAwO1xuXG4gIHNldFZpcnR1YWxTY3JvbGwoaXRlbXM6IG51bWJlciA9IDApOiB2b2lkIHtcblxuICAgIHRoaXMubWluQnVmZmVyUHggPSBNYXRoLm1pbih0aGlzLml0ZW1TaXplICogaXRlbXMgKiAxLjUsIHRoaXMuTUFYX0JVRkZFUl9QWCk7XG5cbiAgICB0aGlzLm1heEJ1ZmZlclB4ID0gdGhpcy5taW5CdWZmZXJQeCAqIDI7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmUgQWxsIFN1YnNjcmlwdGlvbnNcbiAgICovXG4gIC8qKlxuICAgKiBIYW5kIHRoZSBkcmFnIHNlcnZpY2Ugd2hhdCBpdCBuZWVkcyB0byBydW4gYSBnZXN0dXJlLlxuICAgKlxuICAgKiBEZWZlcnJlZCB0byBoZXJlIGJlY2F1c2UgdGhlIHZpZXdwb3J0IGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgdW50aWwgdGhlIHZpZXdcbiAgICogaXMgdXAsIGFuZCBgbm9kZXNgIGlzIHBhc3NlZCBhcyBhIGdldHRlciByYXRoZXIgdGhhbiBhIHZhbHVlIOKAlCBhIGRyYWdcbiAgICogbXV0YXRlcyB0aGUgb3JkZXIgdW5kZXJuZWF0aCBpdCwgc28gYSBzbmFwc2hvdCB0YWtlbiBhdCBhdHRhY2ggdGltZSB3b3VsZFxuICAgKiBnbyBzdGFsZSBvbiB0aGUgZmlyc3QgbW92ZS5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnZpZXdwb3J0Py5lbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG5cbiAgICB0aGlzLnJvd0RyYWdTZXJ2aWNlLmF0dGFjaCh7XG4gICAgICB2aWV3cG9ydDogZWxlbWVudCxcbiAgICAgIGl0ZW1TaXplOiB0aGlzLml0ZW1TaXplLFxuICAgICAgbm9kZXM6ICgpID0+IHRoaXMubm9kZXMsXG4gICAgICBtb3ZlOiAoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcikgPT4ge1xuXG4gICAgICAgIGNvbnN0IG1vdmVkID0gdGhpcy5hcGkubW92ZVJvdyhmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgICAgIGlmIChtb3ZlZCkgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdmVkO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMucmVmcmVzaFJvd0RyYWdTdXBwcmVzc2VkKCk7XG5cbiAgICAvLyBUaGUgQ0RLIGluc2VydHMgaXRzIG93biBjb250ZW50IHdyYXBwZXIgYmV0d2VlbiB0aGUgdmlld3BvcnQgYW5kIHRoZVxuICAgIC8vIHJvd3MuIEl0IGhhcyBubyB0ZW1wbGF0ZSBvZiBvdXJzIHRvIGFubm90YXRlLCBhbmQgbGVmdCBnZW5lcmljIGl0IGJyZWFrc1xuICAgIC8vIHRoZSBgZ3JpZCA+IHJvd2Agb3duZXJzaGlwIHRoZSByb2xlcyBkZXBlbmQgb24uXG4gICAgY29uc3Qgd3JhcHBlciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXInKTtcblxuICAgIHdyYXBwZXI/LnNldEF0dHJpYnV0ZSgncm9sZScsICdwcmVzZW50YXRpb24nKTtcblxuICAgIC8vIEZsZXggY29sdW1ucyBzaXplIGFnYWluc3QgdGhpcyB2aWV3cG9ydCwgbm93IGFuZCB3aGVuZXZlciBpdCByZXNpemVzLlxuICAgIC8vIGFwcGx5RmxleFdpZHRocyBpcyBhIG5vLW9wIHdpdGhvdXQgZmxleCBjb2x1bW5zIGFuZCBkaXNwYXRjaGVzIG9ubHkgb24gYVxuICAgIC8vIHJlYWwgY2hhbmdlLCBzbyBncmlkcyB0aGF0IG5ldmVyIHVzZSBmbGV4IHBheSBub3RoaW5nIGhlcmUuXG4gICAgdGhpcy5hcHBseUZsZXhXaWR0aHMoKTtcblxuICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgIHRoaXMuZmxleFJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuYXBwbHlGbGV4V2lkdGhzKCkpO1xuICAgICAgdGhpcy5mbGV4UmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZsZXhSZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuXG4gIHByaXZhdGUgYXBwbHlGbGV4V2lkdGhzKCk6IHZvaWQge1xuXG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLnZpZXdwb3J0Py5lbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50Py5jbGllbnRXaWR0aCA/PyAwO1xuXG4gICAgaWYgKHdpZHRoID4gMCkgdGhpcy5hcGkuYXBwbHlGbGV4V2lkdGhzKHdpZHRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1zIGV2ZXJ5IHBlci1jZWxsIGNhbGxiYWNrIHJlY2VpdmVzLlxuICAgKlxuICAgKiBCdWlsdCBoZXJlIHJhdGhlciB0aGFuIGlubGluZSBpbiB0aGUgdGVtcGxhdGUgc28gdGhlIHdob2xlIGRvY3VtZW50ZWRcbiAgICogc2hhcGUgaXMgcGFzc2VkIOKAlCBgdmFsdWVgLCBgZmllbGRgLCBgcm93SW5kZXhgLCBgYXBpYCBhbmQgYGNvbnRleHRgIHdlcmVcbiAgICogYWxsIGRlY2xhcmVkIG9uIGBPbmVDZWxsUmVuZGVyZXJQYXJhbXNgIGFuZCBub25lIG9mIHRoZW0gd2VyZSBiZWluZyBzZW50LFxuICAgKiBzbyBhIGBjZWxsQ2xhc3NgIHJlYWRpbmcgYHBhcmFtcy52YWx1ZWAgc2lsZW50bHkgZ290IGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNlbGxQYXJhbXMobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pOiBPbmVDZWxsUHJlc2VudGF0aW9uUGFyYW1zPFQ+IHtcblxuICAgIHJldHVybiB0aGlzLmNlbGxTZXJ2aWNlLmNlbGxQYXJhbXMoY29sdW1uLCBub2RlKSBhcyBPbmVDZWxsUHJlc2VudGF0aW9uUGFyYW1zPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcmFtcyBmb3IgYSBjb21wb25lbnQgY2VsbCByZW5kZXJlci5cbiAgICpcbiAgICogVGhlIGNlbGwgcGFyYW1zLCBwbHVzIHdoYXRldmVyIHRoZSBjb2x1bW4gZGVjbGFyZWQgaW5cbiAgICogYGNlbGxSZW5kZXJlclBhcmFtc2Ag4oCUIGEgZmllbGQgdGhhdCBleGlzdHMgcHJlY2lzZWx5IHNvIGEgcmVuZGVyZXIgY2FuIGJlXG4gICAqIGNvbmZpZ3VyZWQgcGVyIGNvbHVtbiwgYW5kIHRoYXQgbm90aGluZyBoYWQgZXZlciBmb3J3YXJkZWQgdG8gaXQuIENvbHVtblxuICAgKiBjb25maWcgZ29lcyBmaXJzdCBzbyB0aGUgZ3JpZCdzIG93biBmaWVsZHMgd2luIGEgbmFtZSBjb2xsaXNpb24uXG4gICAqL1xuICAvKipcbiAgICogQ2FjaGVkIHBlciBjZWxsLCBrZXllZCBvbiB0aGUgaWRlbnRpdGllcyB0aGF0IG1lYW4gXCJ0aGlzIGNlbGwgY2hhbmdlZFwiOlxuICAgKiBpdHMgY2VsbFN0YXRlcyBvYmplY3QgKHJlcGxhY2VkIG9uIGV2ZXJ5IGVkaXQgYW5kIHN0YXRlIHJlZnJlc2gpIGFuZCBpdHNcbiAgICogZGF0YSBvYmplY3QuIEJ1aWxkaW5nIGEgZnJlc2ggb2JqZWN0IHBlciBjYWxsIOKAlCB3aGljaCBhIHRlbXBsYXRlIG1ldGhvZFxuICAgKiBkb2VzIHBlciBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3Mg4oCUIG1hZGUgdGhlIHJlbmRlcmVyIGRpcmVjdGl2ZSBzZWUgXCJwYXJhbXNcbiAgICogY2hhbmdlZFwiIGV2ZXJ5IHBhc3MgYW5kIHJlLXJ1biB0aGUgY29tcG9uZW50J3Mgb25lSW5pdCBlYWNoIHRpbWUuIEFcbiAgICogcmVuZGVyZXIgd2hvc2Ugb25lSW5pdCB0b3VjaGVkIGdyaWQgc3RhdGUgKGEgY3VzdG9tIHRyZWUgZXhwYW5kZXIgaXMgdGhlXG4gICAqIGNsYXNzaWMgY2FzZSkgdGhlbiByZS10cmlnZ2VyZWQgY2hhbmdlIGRldGVjdGlvbiBhbmQgbG9vcGVkIGZvcmV2ZXIuXG4gICAqL1xuICBwcml2YXRlIHJlbmRlcmVyUGFyYW1zQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBzdGF0ZXM6IHVua25vd247IGRhdGE6IHVua25vd247IHBhcmFtczogT25lQ2VsbFJlbmRlcmVyUGFyYW1zPFQ+IH0+KCk7XG5cbiAgcHJvdGVjdGVkIHJlbmRlcmVyUGFyYW1zKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KTogT25lQ2VsbFJlbmRlcmVyUGFyYW1zPFQ+IHtcblxuICAgIGNvbnN0IGtleSA9IGdldENlbGxLZXkobm9kZS5yb3dJZCwgKGNvbHVtbi5maWVsZCBhcyBzdHJpbmcpID8/IGNvbHVtbi5pZCA/PyAnJyk7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yZW5kZXJlclBhcmFtc0NhY2hlLmdldChrZXkpO1xuXG4gICAgaWYgKGNhY2hlZCAmJiBjYWNoZWQuc3RhdGVzID09PSBub2RlLmNlbGxTdGF0ZXMgJiYgY2FjaGVkLmRhdGEgPT09IG5vZGUuZGF0YSkgcmV0dXJuIGNhY2hlZC5wYXJhbXM7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7IC4uLihjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcyA/PyB7fSksIC4uLnRoaXMuY2VsbFBhcmFtcyhub2RlLCBjb2x1bW4pIH07XG5cbiAgICB0aGlzLnJlbmRlcmVyUGFyYW1zQ2FjaGUuc2V0KGtleSwgeyBzdGF0ZXM6IG5vZGUuY2VsbFN0YXRlcywgZGF0YTogbm9kZS5kYXRhLCBwYXJhbXMgfSk7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIGBhcmlhLXJvd2luZGV4YCBpcyAxLWJhc2VkIG92ZXIgdGhlIHdob2xlIGdyaWQsIG5vdCBvdmVyIHdoYXQgaXMgcmVuZGVyZWQuXG4gICAqXG4gICAqIFRoYXQgaXMgdGhlIHBvaW50IG9mIGl0OiB0aGUgYm9keSB2aXJ0dWFsaXNlcywgc28gdGhlIERPTSBob2xkcyBhIHNsaWRpbmdcbiAgICogd2luZG93IG9mIHJvd3MgYW5kIHRoZSBpbmRleCBpcyBob3cgYSBzY3JlZW4gcmVhZGVyIGtub3dzIHdoZXJlIHRoZSB3aW5kb3dcbiAgICogc2l0cy4gUm93IDEgaXMgdGhlIGhlYWRlciwgdGhlbiBhbnkgcGlubmVkLXRvcCByb3dzLCB0aGVuIHRoZSBkYXRhLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRhdGFSb3dBcmlhSW5kZXgobm9kZTogT25lUm93Tm9kZTxUPik6IG51bWJlciB7XG5cbiAgICByZXR1cm4gMiArIHRoaXMucGlubmVkVG9wTm9kZXMubGVuZ3RoICsgbm9kZS5yb3dJbmRleDtcbiAgfVxuXG4gIC8qKiBQaW5uZWQgcm93cyBicmFja2V0IHRoZSBkYXRhOiB0b3Agb25lcyBmb2xsb3cgdGhlIGhlYWRlciwgYm90dG9tIG9uZXMgZW5kIHRoZSBncmlkLiAqL1xuICBwcm90ZWN0ZWQgcGlubmVkUm93QXJpYUluZGV4KG5vZGU6IE9uZVJvd05vZGU8VD4sIHNpZGU6ICd0b3AnIHwgJ2JvdHRvbScpOiBudW1iZXIge1xuXG4gICAgY29uc3QgaW5kZXggPSAoc2lkZSA9PT0gJ3RvcCcgPyB0aGlzLnBpbm5lZFRvcE5vZGVzIDogdGhpcy5waW5uZWRCb3R0b21Ob2RlcykuaW5kZXhPZihub2RlKTtcblxuICAgIHJldHVybiBzaWRlID09PSAndG9wJ1xuICAgICAgPyAyICsgaW5kZXhcbiAgICAgIDogMiArIHRoaXMucGlubmVkVG9wTm9kZXMubGVuZ3RoICsgdGhpcy5ub2Rlcy5sZW5ndGggKyBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHJvd3MgY2FuIGJlIHNlbGVjdGVkIGF0IGFsbC5cbiAgICpcbiAgICogYGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiYCBvbiBldmVyeSByb3cgb2YgYSBncmlkIG5vYm9keSBjYW4gc2VsZWN0IGFubm91bmNlc1xuICAgKiBhIHNlbGVjdGlvbiBhZmZvcmRhbmNlIHRoYXQgZG9lcyBub3QgZXhpc3QsIHNvIHRoZSBhdHRyaWJ1dGUgaXMgb21pdHRlZFxuICAgKiByYXRoZXIgdGhhbiBzZXQgZmFsc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHJvd1NlbGVjdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gISF0aGlzLmFwaT8ucm93U2VsZWN0aW9uO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENlbGwgbmF2aWdhdGlvblxuICAvL1xuICAvLyBUaGUgV0FJLUFSSUEgZ3JpZCBwYXR0ZXJuOiB0aGUgd2hvbGUgZ3JpZCBpcyBvbmUgdGFiIHN0b3AsIGFuZCB0aGUgYXJyb3dzXG4gIC8vIG1vdmUgYSBmb2N1c2VkIGNlbGwgd2l0aGluIGl0LiBCZWZvcmUgdGhpcyB0aGUgb25seSB0YWIgc3RvcCB3YXMgdGhlIHNjcm9sbFxuICAvLyB2aWV3cG9ydCwgc28gYSBrZXlib2FyZCB1c2VyIGNvdWxkIHNjcm9sbCB0aGUgcm93cyBhbmQgcmVhY2ggbm90aGluZyBpblxuICAvLyB0aGVtIOKAlCBhbmQgYSBzY3JlZW4gcmVhZGVyIGhhZCBubyBjdXJzb3IgdG8gcmVhZCBhIGNlbGwgZnJvbS5cbiAgLy9cbiAgLy8gRm9jdXMgaXMgcmVhbCBET00gZm9jdXMgb24gYSByb3ZpbmcgdGFiaW5kZXggcmF0aGVyIHRoYW5cbiAgLy8gYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAsIGJlY2F1c2UgdGhlIHJvd3MgYXJlIHZpcnR1YWxpc2VkOiB0aGUgZWxlbWVudCBhXG4gIC8vIGRlc2NlbmRhbnQgaWQgcG9pbnRlZCBhdCB3b3VsZCBrZWVwIGJlaW5nIGRlc3Ryb3llZCB1bmRlcm5lYXRoIGl0LlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogVGhlIGNlbGwgaG9sZGluZyB0aGUgZ3JpZCdzIHRhYiBzdG9wLiBOdWxsIHVudGlsIHNvbWV0aGluZyBpcyBmb2N1c2VkLiAqL1xuICBwcm90ZWN0ZWQgYWN0aXZlQ2VsbDogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgaXNBY3RpdmVDZWxsKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVDZWxsKSB7XG5cbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUNlbGwucm93SWQgPT09IG5vZGUucm93SWQgJiYgdGhpcy5hY3RpdmVDZWxsLmZpZWxkID09PSBjb2x1bW4uZmllbGQ7XG4gICAgfVxuXG4gICAgLy8gTm90aGluZyBmb2N1c2VkIHlldCwgc28gdGhlIGZpcnN0IGNlbGwgaG9sZHMgdGhlIHRhYiBzdG9wLiBXaXRob3V0IHRoaXNcbiAgICAvLyBmYWxsYmFjayBhIGdyaWQgbm9ib2R5IGhhcyBjbGlja2VkIGhhcyAqbm8qIHRhYmJhYmxlIGNlbGwsIGFuZCBhIGtleWJvYXJkXG4gICAgLy8gdXNlciBjYW5ub3QgZ2V0IGludG8gaXQgYXQgYWxsIOKAlCB0aGUgcm92aW5nIHRhYmluZGV4IGhhcyB0byBzdGFydFxuICAgIC8vIHNvbWV3aGVyZS5cbiAgICByZXR1cm4gbm9kZSA9PT0gdGhpcy5ub2Rlc1swXSAmJiBjb2x1bW4gPT09IHRoaXMubmF2aWdhYmxlQ29sdW1ucygpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkb3B0IHdoYXRldmVyIHRoZSB1c2VyIGZvY3VzZWQsIGhvd2V2ZXIgdGhleSBnb3QgdGhlcmUg4oCUIGNsaWNrLCB0YWIsIG9yXG4gICAqIHRoZSBhcnJvdyBrZXlzIGJlbG93LiBLZWVwaW5nIHRoaXMgaW4gb25lIHBsYWNlIGlzIHdoYXQgc3RvcHMgdGhlIHJvdmluZ1xuICAgKiB0YWJpbmRleCBkcmlmdGluZyBhd2F5IGZyb20gdGhlIGVsZW1lbnQgdGhhdCBhY3R1YWxseSBoYXMgZm9jdXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25DZWxsRm9jdXMobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLmlzQWN0aXZlQ2VsbChub2RlLCBjb2x1bW4pKSByZXR1cm47XG5cbiAgICB0aGlzLmFjdGl2ZUNlbGwgPSB7IHJvd0lkOiBub2RlLnJvd0lkLCBmaWVsZDogY29sdW1uLmZpZWxkIGFzIHN0cmluZyB9O1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25HcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuXG4gICAgLy8gVW5kby9yZWRvIG9mIGNvbW1pdHRlZCBlZGl0cywgYW55d2hlcmUgaW4gdGhlIGdyaWQgZXhjZXB0IGluc2lkZSBhblxuICAgIC8vIG9wZW4gZWRpdG9yIOKAlCBhIHRleHQgaW5wdXQncyBDdHJsK1ogaXMgdGhlIGJyb3dzZXIncywgYW5kIGl0IG9wZXJhdGVzXG4gICAgLy8gb24gdGhlIHVuY29tbWl0dGVkIHRleHQuXG4gICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIFsneicsICd5J10uaW5jbHVkZXMoZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkpKSB7XG5cbiAgICAgIGNvbnN0IHRhZyA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpPy50YWdOYW1lPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAodGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IHJlZG8gPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3knIHx8IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgY29uc3QgYXBwbGllZCA9IHJlZG8gPyB0aGlzLmFwaS5yZWRvQ2VsbEVkaXRpbmcoKSA6IHRoaXMuYXBpLnVuZG9DZWxsRWRpdGluZygpO1xuXG4gICAgICBpZiAoYXBwbGllZCkgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5uYXZpZ2FibGVDb2x1bW5zKCk7XG5cbiAgICBpZiAoIXRoaXMubm9kZXMubGVuZ3RoIHx8ICFjb2x1bW5zLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgLy8gTmF2aWdhdGUgb25seSB3aGVuIGEgY2VsbCBpdHNlbGYgaG9sZHMgZm9jdXMuIEFueXRoaW5nIGZvY3VzYWJsZSAqaW5zaWRlKlxuICAgIC8vIGEgY2VsbCBvd25zIGl0cyBvd24ga2V5cyDigJQgYSB0ZXh0IGVkaXRvcidzIGNhcmV0LCB0aGUgcm93IGRyYWcgaGFuZGxlJ3NcbiAgICAvLyByZW9yZGVyIGtleXMsIHRoZSBvcHRpb24gbWVudSdzIGFycm93cyDigJQgYW5kIGFsbCBvZiB0aGVtIGJ1YmJsZSB0byBoZXJlLlxuICAgIC8vIENoZWNraW5nIHRoZSB0YXJnZXQgcmF0aGVyIHRoYW4gYmxvY2tsaXN0aW5nIHRhZyBuYW1lcyBpcyB3aGF0IGtlZXBzIHRoaXNcbiAgICAvLyBjb3JyZWN0IGFzIG1vcmUgY29udHJvbHMgYXJlIGFkZGVkIHRvIGNlbGxzLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICBpZiAoIXRhcmdldD8ubWF0Y2hlcz8uKCdbcm9sZT1cImdyaWRjZWxsXCJdJykpIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmFjdGl2ZUNlbGxQb3NpdGlvbihjb2x1bW5zKTtcblxuICAgIGxldCByb3cgPSBjdXJyZW50LnJvdztcbiAgICBsZXQgY29sID0gY3VycmVudC5jb2w7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiAgcm93ICs9IDE7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6ICAgIHJvdyAtPSAxOyBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOiBjb2wgKz0gMTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOiAgY29sIC09IDE7IGJyZWFrO1xuXG4gICAgICAvLyBTZWxlY3Rpb24uIFNwYWNlIGlzIHRoZSBncmlkIHBhdHRlcm4ncyB0b2dnbGUsIGFuZCBpdCBoYXMgdG8gYmUgY2F1Z2h0XG4gICAgICAvLyBoZXJlIG9yIHRoZSBicm93c2VyIHNjcm9sbHMgdGhlIHBhZ2Ugd2l0aCBpdC5cbiAgICAgIGNhc2UgJyAnOiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzW2N1cnJlbnQucm93XTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMudG9nZ2xlUm93U2VsZWN0aW9uKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYSc6XG4gICAgICBjYXNlICdBJzpcbiAgICAgICAgaWYgKCFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5KSByZXR1cm47XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYXBpLnNlbGVjdEFsbCgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgY29sID0gMDtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgcm93ID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICAgIGNvbCA9IGNvbHVtbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgcm93ID0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gQSBwYWdlIGlzIHdoYXQgdGhlIHZpZXdwb3J0IGNhbiBzaG93LCB3aGljaCBpcyB0aGUgb25seSBkZWZpbml0aW9uIHRoYXRcbiAgICAgIC8vIG1hdGNoZXMgd2hhdCB0aGUgdXNlciBzZWVzIG1vdmUuXG4gICAgICBjYXNlICdQYWdlRG93bic6IHJvdyArPSB0aGlzLnJvd3NQZXJQYWdlKCk7IGJyZWFrO1xuICAgICAgY2FzZSAnUGFnZVVwJzogICByb3cgLT0gdGhpcy5yb3dzUGVyUGFnZSgpOyBicmVhaztcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnRjInOiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzW2N1cnJlbnQucm93XTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1uc1tjdXJyZW50LmNvbF07XG4gICAgICAgIGlmIChub2RlICYmIGNvbHVtbikge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5zdGFydEVkaXQoeyB0YXJnZXQ6IGV2ZW50LnRhcmdldCB9IGFzIHVua25vd24gYXMgTW91c2VFdmVudCwgbm9kZSwgY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgdGFyZ2V0Um93ID0gTWF0aC5taW4oTWF0aC5tYXgocm93LCAwKSwgdGhpcy5ub2Rlcy5sZW5ndGggLSAxKTtcblxuICAgIHRoaXMuZm9jdXNDZWxsKHRhcmdldFJvdywgTWF0aC5taW4oTWF0aC5tYXgoY29sLCAwKSwgY29sdW1ucy5sZW5ndGggLSAxKSk7XG5cbiAgICAvLyBTaGlmdCB3aXRoIGEgdmVydGljYWwgbW92ZSBleHRlbmRzIHRoZSBzZWxlY3Rpb24sIGFuY2hvcmVkIHdoZXJlIHRoZVxuICAgIC8vIGV4dGVuc2lvbiBiZWdhbiDigJQgdGhlIHNhbWUgZ2VzdHVyZSBhIGZpbGUgbGlzdCB1c2VzLlxuICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB0YXJnZXRSb3cgIT09IGN1cnJlbnQucm93KSB7XG5cbiAgICAgIHRoaXMuZXh0ZW5kU2VsZWN0aW9uVG8oY3VycmVudC5yb3csIHRhcmdldFJvdyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSByb3cgYSBzaGlmdC1leHRlbmRlZCBzZWxlY3Rpb24gaXMgbWVhc3VyZWQgZnJvbS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3Rpb25BbmNob3JSb3dJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSB0b2dnbGVSb3dTZWxlY3Rpb24obm9kZTogT25lUm93Tm9kZTxUPik6IHZvaWQge1xuXG4gICAgaWYgKCF0aGlzLmFwaS50b2dnbGVSb3dTZWxlY3Rpb24obm9kZS5yb3dJZCwgIW5vZGUuc2VsZWN0ZWQpKSByZXR1cm47XG5cbiAgICAvLyBXaGVyZSBhIHN1YnNlcXVlbnQgc2hpZnQtZXh0ZW5zaW9uIGNvdW50cyBmcm9tLlxuICAgIHRoaXMuc2VsZWN0aW9uQW5jaG9yUm93SWQgPSBub2RlLnJvd0lkO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGV4dGVuZFNlbGVjdGlvblRvKGZyb21Sb3c6IG51bWJlciwgdG9Sb3c6IG51bWJlcik6IHZvaWQge1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5ub2Rlc1t0b1Jvd107XG5cbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gICAgLy8gV2l0aCBub3RoaW5nIHNlbGVjdGVkIHlldCB0aGUgcm93IHRoZSBleHRlbnNpb24gc3RhcnRlZCBvbiBiZWNvbWVzIHRoZVxuICAgIC8vIGFuY2hvciwgc28gc2hpZnQrYXJyb3cgc2VsZWN0cyBib3RoIGVuZHMgcmF0aGVyIHRoYW4gb25seSB0aGUgZmFyIG9uZS5cbiAgICBjb25zdCBhbmNob3IgPSB0aGlzLnNlbGVjdGlvbkFuY2hvclJvd0lkID8/IHRoaXMubm9kZXNbZnJvbVJvd10/LnJvd0lkO1xuXG4gICAgaWYgKCFhbmNob3IpIHJldHVybjtcblxuICAgIHRoaXMuc2VsZWN0aW9uQW5jaG9yUm93SWQgPSBhbmNob3I7XG5cbiAgICB0aGlzLmFwaS5zZWxlY3RSb3dSYW5nZShhbmNob3IsIHRhcmdldC5yb3dJZCk7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2x1bW5zIGEgY2VsbCBjdXJzb3IgY2FuIGxhbmQgb24uXG4gICAqXG4gICAqIEEgY29sdW1uIHdpdGggbm8gZmllbGQgcmVuZGVycyBubyBjZWxsIHN0YXRlIGFuZCBpcyBrZXllZCBieSBmaWVsZCwgc28gaXRcbiAgICogY2Fubm90IGJlIGFkZHJlc3NlZCDigJQgYW4gYWN0aW9uLW9ubHkgY29sdW1uIGlzIGEgbGVnaXRpbWF0ZSBleGFtcGxlLlxuICAgKi9cbiAgcHJpdmF0ZSBuYXZpZ2FibGVDb2x1bW5zKCk6IE9uZUNvbHVtbkRlZjxUPltdIHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtbkRlZnMuZmlsdGVyKGNvbHVtbiA9PiAhIWNvbHVtbj8uZmllbGQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmVDZWxsUG9zaXRpb24oY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiB7IHJvdzogbnVtYmVyOyBjb2w6IG51bWJlciB9IHtcblxuICAgIGlmICghdGhpcy5hY3RpdmVDZWxsKSByZXR1cm4geyByb3c6IDAsIGNvbDogMCB9O1xuXG4gICAgY29uc3Qgcm93ID0gdGhpcy5ub2Rlcy5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSB0aGlzLmFjdGl2ZUNlbGwhLnJvd0lkKTtcbiAgICBjb25zdCBjb2wgPSBjb2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSB0aGlzLmFjdGl2ZUNlbGwhLmZpZWxkKTtcblxuICAgIHJldHVybiB7IHJvdzogcm93IDwgMCA/IDAgOiByb3csIGNvbDogY29sIDwgMCA/IDAgOiBjb2wgfTtcbiAgfVxuXG4gIHByaXZhdGUgcm93c1BlclBhZ2UoKTogbnVtYmVyIHtcblxuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMudmlld3BvcnQ/LmVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWVudEhlaWdodCA/PyAwO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguZmxvb3IoaGVpZ2h0IC8gdGhpcy5pdGVtU2l6ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGN1cnNvciwgc2Nyb2xsaW5nIHRoZSByb3cgaW50byB2aWV3IGZpcnN0IHdoZW4gaXQgaXMgb3V0c2lkZSB0aGVcbiAgICogcmVuZGVyZWQgd2luZG93LlxuICAgKlxuICAgKiBUaGUgc2Nyb2xsIGlzIHRoZSByZWFzb24gZm9jdXNpbmcgaXMgZGVmZXJyZWQ6IGEgdmlydHVhbGlzZWQgcm93IHRoYXQgaXNcbiAgICogbm90IG9uIHNjcmVlbiBoYXMgbm8gZWxlbWVudCB0byBmb2N1cyB1bnRpbCB0aGUgdmlld3BvcnQgaGFzIHJlbmRlcmVkIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c0NlbGwocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZXNbcm93SW5kZXhdO1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMubmF2aWdhYmxlQ29sdW1ucygpW2NvbEluZGV4XTtcblxuICAgIGlmICghbm9kZSB8fCAhY29sdW1uKSByZXR1cm47XG5cbiAgICB0aGlzLmFjdGl2ZUNlbGwgPSB7IHJvd0lkOiBub2RlLnJvd0lkLCBmaWVsZDogY29sdW1uLmZpZWxkIGFzIHN0cmluZyB9O1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICBjb25zdCByYW5nZSA9IHRoaXMudmlld3BvcnQ/LmdldFJlbmRlcmVkUmFuZ2UoKTtcbiAgICBjb25zdCByZW5kZXJlZCA9IHJhbmdlICYmIHJvd0luZGV4ID49IHJhbmdlLnN0YXJ0ICYmIHJvd0luZGV4IDwgcmFuZ2UuZW5kO1xuXG4gICAgaWYgKHJlbmRlcmVkKSB7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb2N1c0NlbGxFbGVtZW50KG5vZGUsIGNvbHVtbikpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy52aWV3cG9ydD8uc2Nyb2xsVG9JbmRleChyb3dJbmRleCk7XG5cbiAgICAvLyBTY3JvbGxpbmcgaXMgbm90IGVub3VnaDogdGhlIENESyByZW5kZXJzIG9uIGl0cyBvd24gc2NoZWR1bGUsIHNvIHRoZSByb3dcbiAgICAvLyBoYXMgbm8gZWxlbWVudCB0byBmb2N1cyB1bnRpbCBpdCBoYXMuIFdhaXRpbmcgZm9yIHRoZSByZW5kZXJlZCByYW5nZSB0b1xuICAgIC8vIGFjdHVhbGx5IGNvbnRhaW4gdGhlIHJvdyBpcyB0aGUgb25seSByZWxpYWJsZSBzaWduYWwg4oCUIGEgZml4ZWQgZGVsYXlcbiAgICAvLyByYWNlcyB0aGUgdmlld3BvcnQgYW5kIHNpbGVudGx5IGRyb3BzIGZvY3VzIHdoZW4gaXQgbG9zZXMuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudmlld3BvcnQ/LnJlbmRlcmVkUmFuZ2VTdHJlYW1cbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKG5leHQgPT4gcm93SW5kZXggPj0gbmV4dC5zdGFydCAmJiByb3dJbmRleCA8IG5leHQuZW5kKSxcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzQ2VsbEVsZW1lbnQobm9kZSwgY29sdW1uKSkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQ2VsbEVsZW1lbnQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pOiB2b2lkIHtcblxuICAgIGNvbnN0IGtleSA9IGdldENlbGxLZXkobm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkIGFzIHN0cmluZyk7XG5cbiAgICB0aGlzLmJvZHlSZWY/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbZGF0YS1jZWxsLWlkPVwiJHtrZXl9XCJdYCk/LmZvY3VzKCk7XG4gIH1cblxuICAvKiogSXMgdGhpcyB0aGUgcm93IGN1cnJlbnRseSBiZWluZyBtb3ZlZD8gKi9cbiAgcHJvdGVjdGVkIGlzUm93RHJhZ2dpbmcobm9kZTogT25lUm93Tm9kZTxUPik6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuZHJhZ1N0YXRlPy5yb3dJZCA9PT0gbm9kZS5yb3dJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBwYWludCB0aGUgZHJvcCBpbmRpY2F0b3IsIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb2YgdGhlIGJvZHkuXG4gICAqXG4gICAqIGBpbnNlcnRBdGAgaXMgYSBib3VuZGFyeSwgc28gdGhlIGxpbmUgc2l0cyBhdCByb3ctaGVpZ2h0IHRpbWVzIHRoZSBudW1iZXJcbiAgICogb2Ygcm93cyBhYm92ZSBpdCDigJQgaW4gY29udGVudCBzcGFjZS4gVGhlIGluZGljYXRvciBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAqIHZpZXdwb3J0IHJhdGhlciB0aGFuIGEgY2hpbGQsIGJlY2F1c2UgYW55dGhpbmcgaW5zaWRlIGl0IGVpdGhlciBzY3JvbGxzXG4gICAqIGF3YXkgd2l0aCB0aGUgdHJhbnNmb3JtZWQgY29udGVudCB3cmFwcGVyIG9yIGlnbm9yZXMgdGhlIHNjcm9sbCBlbnRpcmVseSxcbiAgICogc28gdGhlIHZpZXdwb3J0J3Mgb3duIHNjcm9sbCBvZmZzZXQgYW5kIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJvZHkgYXJlXG4gICAqIGJvdGggc3VidHJhY3RlZCBiYWNrIG91dCBoZXJlLlxuICAgKlxuICAgKiBBIGZpZWxkIHJhdGhlciB0aGFuIGEgZ2V0dGVyOiBpdCBpcyByZWFkIGZyb20gdGhlIHRlbXBsYXRlIG9uIGV2ZXJ5IGNoYW5nZVxuICAgKiBkZXRlY3Rpb24gcGFzcywgYW5kIGl0IG9ubHkgYWN0dWFsbHkgbW92ZXMgd2hlbiB0aGUgZHJhZyBzdGF0ZSBvciB0aGVcbiAgICogc2Nyb2xsIHBvc2l0aW9uIGRvZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZHJvcEluZGljYXRvclRvcDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEhvdyB3aWRlIHRoZSBsaW5lIGlzIGRyYXduLiBSb3dzIGFyZSBgd2lkdGg6IGZpdC1jb250ZW50YCwgc28gdGhleSBhcmVcbiAgICogb2Z0ZW4gbmFycm93ZXIgdGhhbiB0aGUgdmlld3BvcnQg4oCUIGEgZnVsbC1ibGVlZCBsaW5lIHdvdWxkIGhhbmcgcGFzdCB0aGVcbiAgICogbGFzdCBjb2x1bW4gaW50byBlbXB0eSBzcGFjZSBhbmQgcmVhZCBhcyBwYXJ0IG9mIHRoZSBmcmFtZSByYXRoZXIgdGhhbiB0aGVcbiAgICogcm93cy4gVGhpcyBpcyB0aGUgdmlzaWJsZSBleHRlbnQgb2YgdGhlIHJvdyBjb250ZW50LCB3aGljaCBhbHNvIHNocmlua3NcbiAgICogY29ycmVjdGx5IGFzIHRoZSBncmlkIGlzIHNjcm9sbGVkIHNpZGV3YXlzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRyb3BJbmRpY2F0b3JXaWR0aCA9IDA7XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcm9wSW5kaWNhdG9yKCk6IHZvaWQge1xuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy52aWV3cG9ydD8uZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudDtcblxuICAgIGlmIChzdGF0ZT8uc291cmNlICE9PSAncG9pbnRlcicgfHwgIWVsZW1lbnQpIHtcblxuICAgICAgdGhpcy5kcm9wSW5kaWNhdG9yVG9wID0gbnVsbDtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZHJvcEluZGljYXRvclRvcCA9IChzdGF0ZS5pbnNlcnRBdCAqIHRoaXMuaXRlbVNpemUpIC0gZWxlbWVudC5zY3JvbGxUb3AgKyBlbGVtZW50Lm9mZnNldFRvcDtcblxuICAgIHRoaXMuZHJvcEluZGljYXRvcldpZHRoID0gTWF0aC5tYXgoTWF0aC5taW4odGhpcy5yb3dXaWR0aCAtIGVsZW1lbnQuc2Nyb2xsTGVmdCwgZWxlbWVudC5jbGllbnRXaWR0aCksIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUm93RHJhZ0VuZChldmVudDogT25lUm93RHJhZ0V2ZW50PFQ+KTogdm9pZCB7XG5cbiAgICB0aGlzLnJvd0RyYWdFbmQuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuYXBpPy5nZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbj8uKCkgPz8gbnVsbDtcblxuICAgIGlmIChyZWFzb24gPT09IHRoaXMucm93RHJhZ1N1cHByZXNzZWQpIHJldHVybjtcblxuICAgIHRoaXMucm93RHJhZ1N1cHByZXNzZWQgPSByZWFzb247XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gICAgdGhpcy5mbGV4UmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2ICNib2R5UmVmIGNsYXNzPVwib25lLWdyaWQtYm9keVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cblxuICAgIDwhLS0gUGlubmVkIHJvd3MgbGl2ZSBvdXRzaWRlIHRoZSBzY3JvbGwgdmlld3BvcnQgc28gdGhleSBuZXZlciBzY3JvbGxcbiAgICAgICAgIHZlcnRpY2FsbHksIGFuZCBtaXJyb3IgaXRzIHNjcm9sbExlZnQgc28gdGhlIGNvbHVtbnMgc3RheSBhbGlnbmVkLiAtLT5cbiAgICBAaWYgKHBpbm5lZFRvcE5vZGVzLmxlbmd0aCkge1xuICAgICAgICA8ZGl2ICNwaW5uZWRWaWV3cG9ydCBjbGFzcz1cIm9uZS1waW5uZWQtcm93cyBvbmUtcGlubmVkLXJvd3MtdG9wXCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBpbm5lZFJvd3NcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBub2RlczogcGlubmVkVG9wTm9kZXMsIHNpZGU6ICd0b3AnIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSB0YWJpbmRleCBtYWtlcyB0aGUgc2Nyb2xsIGNvbnRhaW5lciByZWFjaGFibGUsIHNvIGEga2V5Ym9hcmQgdXNlciBjYW5cbiAgICAgICAgIHNjcm9sbCB0aGUgcm93cyB3aXRoIHRoZSBhcnJvdyBrZXlzLCBQYWdlIFVwL0Rvd24gYW5kIEhvbWUvRW5kLiBXaXRob3V0XG4gICAgICAgICBpdCB0aGUgYm9keSBpcyBzY3JvbGxhYmxlIGJ5IHBvaW50ZXIgb25seSAoV0NBRyAyLjEuMSkuIC0tPlxuICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgY2xhc3M9XCJvbmUtZ3JpZC1ib2R5LXZpZXdwb3J0XCJcbiAgICAgICAgcm9sZT1cInJvd2dyb3VwXCJcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwibm9kZXM/Lmxlbmd0aCA/IG51bGwgOiAwXCJcbiAgICAgICAgKGtleWRvd24pPVwib25HcmlkS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgW2l0ZW1TaXplXT1cIml0ZW1TaXplXCJcbiAgICAgICAgW21pbkJ1ZmZlclB4XT1cIm1pbkJ1ZmZlclB4XCJcbiAgICAgICAgW21heEJ1ZmZlclB4XT1cIm1heEJ1ZmZlclB4XCJcbiAgICAgICAgKHNjcm9sbCk9XCJvbkJvZHlTY3JvbGwoJGV2ZW50KVwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgbm9kZSBvZiBub2RlczsgdHJhY2tCeTogdHJhY2tCeVJvd0lkO1wiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXJvd1wiXG4gICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJkYXRhUm93QXJpYUluZGV4KG5vZGUpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInJvd1NlbGVjdGlvbkVuYWJsZWQgPyBub2RlLnNlbGVjdGVkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1yb3ctaWRdPVwibm9kZS5yb3dJZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm9uZS1yb3ctc2VsZWN0ZWRdPVwibm9kZS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm9uZS1yb3ctZHJhZ2dpbmddPVwiaXNSb3dEcmFnZ2luZyhub2RlKVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5EZWZzOyB0cmFjayBjb2wuZmllbGQ7KSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgbm9kZSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGNvbHVtbjogY29sLCBjb2xJbmRleDogJGluZGV4IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBDdXN0b20gRGV0YWlsIENvbXBvbmVudCAtLT5cbiAgICAgICAgICAgICBAaWYobm9kZS5sZWFmICYmIG5vZGUuZGV0YWlsQWN0aXZlICYmIG5vZGU/LmRldGFpbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBvbmVDZWxsUmVuZGVyZXJDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJub2RlPy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwieyBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBub2RlOiBub2RlLCBjb250ZXh0OiBjb250ZXh0IH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBNYXN0ZXIgRGV0YWlsIEdyaWQgKHRlbXBsYXRlIHByb3ZpZGVkIGJ5IHRoZSBwYXJlbnQgb25lLWdyaWQgdG8gYXZvaWQgYSBjb21waWxlLXRpbWUgaW1wb3J0IGN5Y2xlKSAtLT5cbiAgICAgICAgICAgIEBpZiAobWFzdGVyRGV0YWlsICYmIG5vZGUuZXhwYW5kZWQgJiYgbm9kZT8uZGV0YWlsUm93RGF0YSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtcm93LWRldGFpbC1jb250YWluZXJcIiBbYXR0ci5kYXRhLXJvdy1pZF09XCJub2RlLnJvd0lkICsgJy1kZXRhaWwnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRldGFpbEdyaWRUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG5vZGUsIG5vZGU6IG5vZGUgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIEBpZiAoIW5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogbWF4LWNvbnRlbnQ7IGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IFtzdHlsZS53aWR0aC5weF09XCJyb3dXaWR0aFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cblxuICAgIDwhLS0gRHJvcCBpbmRpY2F0b3IuXG4gICAgICAgICBBIGxpbmUgYXQgdGhlIGluc2VydGlvbiBwb2ludCByYXRoZXIgdGhhbiBhIGdhcCBvcGVuZWQgYmV0d2VlbiByb3dzOlxuICAgICAgICAgdGhlIHZpZXdwb3J0IGlzIHZpcnR1YWxpc2VkIGF0IGEgZml4ZWQgaXRlbVNpemUsIHNvIHNoaWZ0aW5nIHJvd3MgYXBhcnRcbiAgICAgICAgIHdvdWxkIGRlc3luY2hyb25pc2UgdGhlIHNjcm9sbGVyIGZyb20gaXRzIG93biBnZW9tZXRyeS4gSXQgaXMgYWxzbyB0aGVcbiAgICAgICAgIGNsZWFyZXIgc2lnbmFsIOKAlCB0aGUgcm93IGxhbmRzIGV4YWN0bHkgd2hlcmUgdGhlIGxpbmUgaXMuXG4gICAgICAgICBQb3NpdGlvbmVkIGFnYWluc3QgdGhlIGJvZHksIHdpdGggdGhlIHZpZXdwb3J0J3Mgc2Nyb2xsIHN1YnRyYWN0ZWQsIHNvXG4gICAgICAgICBpdCBzdGF5cyBwdXQgd2hpbGUgdGhlIGNvbnRlbnQgbW92ZXMgdW5kZXIgaXQgZHVyaW5nIGF1dG8tc2Nyb2xsLiAtLT5cbiAgICBAaWYgKGRyb3BJbmRpY2F0b3JUb3AgIT09IG51bGwpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1yb3ctZHJvcC1pbmRpY2F0b3JcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiZHJvcEluZGljYXRvclRvcFwiXG4gICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRyb3BJbmRpY2F0b3JXaWR0aFwiPjwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gS2V5Ym9hcmQgcmVvcmRlcmluZyBoYXMgbm8gZHJhZyBpbWFnZSB0byB3YXRjaCwgc28gaXQgbmFycmF0ZXMgaW5zdGVhZC5cbiAgICAgICAgIEFzc2VydGl2ZSBiZWNhdXNlIHRoZSBtZXNzYWdlIGlzIHRoZSBvbmx5IGZlZWRiYWNrIHRoYXQgdGhlIHJvdyBtb3ZlZC4gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLXZpc3VhbGx5LWhpZGRlblwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIiBhcmlhLWF0b21pYz1cInRydWVcIj57eyBkcmFnQW5ub3VuY2VtZW50IH19PC9kaXY+XG4gICAgQGlmICghbm9kZXM/Lmxlbmd0aCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm9uZS1ncmlkLWVtcHR5LW1lc3NhZ2VcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MCU7IGxlZnQ6IDUwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XCI+Tm8gUm93cyB0byBTaG93PC9zcGFuPlxuICAgIH1cblxuICAgIEBpZiAocGlubmVkQm90dG9tTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgI3Bpbm5lZFZpZXdwb3J0IGNsYXNzPVwib25lLXBpbm5lZC1yb3dzIG9uZS1waW5uZWQtcm93cy1ib3R0b21cIiByb2xlPVwicm93Z3JvdXBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicGlubmVkUm93c1wiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG5vZGVzOiBwaW5uZWRCb3R0b21Ob2Rlcywgc2lkZTogJ2JvdHRvbScgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L2Rpdj5cblxuPCEtLSBQaW5uZWQgcm93cyBhcmUgZGlzcGxheS1vbmx5OiB0aGV5IHJlbmRlciBleGFjdGx5IHdoYXQgYSBkYXRhIGNlbGwgcmVuZGVycyxcbiAgICAgYnV0IGNhcnJ5IG5vbmUgb2YgaXRzIGludGVyYWN0aW9ucy4gQSB0b3RhbHMgcm93IHNob3VsZCBub3Qgb3BlbiBhbiBlZGl0b3JcbiAgICAgb24gZG91YmxlLWNsaWNrIG9yIHN0YXJ0IGEgcmFuZ2Ugc2VsZWN0aW9uIG9uIGRyYWcuIC0tPlxuPG5nLXRlbXBsYXRlICNwaW5uZWRSb3dzIGxldC1ub2Rlcz1cIm5vZGVzXCIgbGV0LXNpZGU9XCJzaWRlXCI+XG4gICAgQGZvciAobm9kZSBvZiBub2RlczsgdHJhY2sgbm9kZS5yb3dJZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXJvdyBvbmUtcm93LXBpbm5lZFwiXG4gICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcm93aW5kZXhdPVwicGlubmVkUm93QXJpYUluZGV4KG5vZGUsIHNpZGUpXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtcm93LWlkXT1cIm5vZGUucm93SWRcIj5cbiAgICAgICAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5EZWZzOyB0cmFjayBjb2x1bW4uZmllbGQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwib25lLWNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29saW5kZXhdPVwiJGluZGV4ICsgMVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY2VsbC1pZF09XCJub2RlLnJvd0lkIHwgY2VsbEtleTpjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtbGVmdF09XCJjb2x1bW4ucGlubmVkID09PSAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtcmlnaHRdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1lZGdlXT1cImNvbHVtbi5fcGlubmVkRWRnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImNvbHVtbi5waW5uZWQgPT09ICdsZWZ0JyA/IGNvbHVtbi5fcGlubmVkT2Zmc2V0IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yaWdodC5weF09XCJjb2x1bW4ucGlubmVkID09PSAncmlnaHQnID8gY29sdW1uLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbj8ud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbj8ubWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbHVtbj8ubWF4V2lkdGhcIj5cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmFtc109XCJyZW5kZXJlclBhcmFtcyhub2RlLCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZWxzZSBpZiAoY29sdW1uPy5jZWxsUmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2x1bW4ud2lkdGggKyAncHgnLCBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxTdGF0ZVJlbmRlcmVyOmNvbHVtbi5maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1jZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1sZWZ0XT1cImNvbHVtbj8uYWxpZ25Db250ZW50ID09PSAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hbGlnbi1jb250ZW50LWNlbnRlcl09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ2NlbnRlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hbGlnbi1jb250ZW50LXJpZ2h0XT1cImNvbHVtbj8uYWxpZ25Db250ZW50ID09PSAncmlnaHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2xTZXJ2aWNlLnJlc29sdmVDZWxsQ2xhc3MoY29sdW1uLCBjZWxsUGFyYW1zKG5vZGUsIGNvbHVtbikpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb2xTZXJ2aWNlLnJlc29sdmVDZWxsU3R5bGUoY29sdW1uLCBjZWxsUGFyYW1zKG5vZGUsIGNvbHVtbikpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1jZWxsLXRleHRcIj57eyAobm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBNYXN0ZXIgQ29sdW1uIFRlbXBsYXRlICAtLT5cbjxuZy10ZW1wbGF0ZSAjY2VsbFRlbXBsYXRlIGxldC1ub2RlPVwibm9kZVwiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiIGxldC1jb2xJbmRleD1cImNvbEluZGV4XCI+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm9uZS1jb2x1bW5cIlxuICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWNvbGluZGV4XT1cImNvbEluZGV4ICsgMVwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzQWN0aXZlQ2VsbChub2RlLCBjb2x1bW4pID8gMCA6IC0xXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jZWxsLWFjdGl2ZV09XCJpc0FjdGl2ZUNlbGwobm9kZSwgY29sdW1uKVwiXG4gICAgICAgIChmb2N1cyk9XCJvbkNlbGxGb2N1cyhub2RlLCBjb2x1bW4pXCJcbiAgICAgICAgW2F0dHIuZGF0YS1jZWxsLWlkXT1cIm5vZGUucm93SWQgfCBjZWxsS2V5OmNvbHVtbi5maWVsZFwiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1sZWZ0XT1cImNvbHVtbi5waW5uZWQgPT09ICdsZWZ0J1wiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1yaWdodF09XCJjb2x1bW4ucGlubmVkID09PSAncmlnaHQnXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jb2x1bW4tcGlubmVkLWVkZ2VdPVwiY29sdW1uLl9waW5uZWRFZGdlXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ2xlZnQnID8gY29sdW1uLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgW3N0eWxlLnJpZ2h0LnB4XT1cImNvbHVtbi5waW5uZWQgPT09ICdyaWdodCcgPyBjb2x1bW4uX3Bpbm5lZE9mZnNldCA6IG51bGxcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29sdW1uPy53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sdW1uPy5taW5XaWR0aFwiXG4gICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sdW1uPy5tYXhXaWR0aFwiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLWJvcmRlci10b3BdPVwibWFzdGVyRGV0YWlsICYmIG5vZGVzPy5sZW5ndGggPiAwICYmIG5vZGVzW25vZGUucm93SW5kZXggLSAxXT8uZXhwYW5kZWRcIlxuICAgICAgICBbY2xhc3Mub25lLWNlbGwtc2VsZWN0ZWRdPVwic2VsZWN0ZWRDZWxscyB8IGNlbGxTZWxlY3RlZDpub2RlLnJvd0lkOmNvbHVtbi5maWVsZFwiXG4gICAgICAgIFtjbGFzcy5vbmUtY2VsbC1pbnZhbGlkXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxJbnZhbGlkOm5vZGUuZGF0YVtjb2x1bW4uZmllbGRdOmNvbHVtbjpub2RlOmFsbG93ZWRFZGl0OnN1Ym1pdHRlZFwiXG4gICAgICAgIChkYmxjbGljayk9XCJzdGFydEVkaXQoJGV2ZW50LCBub2RlLCBjb2x1bW4pXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydFNlbGVjdGlvbihub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiZXh0ZW5kU2VsZWN0aW9uKG5vZGUucm93SWQsIGNvbHVtbi5maWVsZClcIlxuICAgICAgICAobW91c2V1cCk9XCJlbmRTZWxlY3Rpb24oKVwiPlxuXG4gICAgICAgIDwhLS0gT25lIEdyaWQgQ2VsbCBPcHRpb24gLS0+XG4gICAgICAgIEBpZiAobm9kZS5jZWxsT3B0aW9uc1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICAgICAgICA8b25lLWdyaWQtY2VsbC1vcHRpb24tbWVudVxuICAgICAgICAgICAgICAgICNjb250ZXh0T3B0aW9uTWVudVJlZlxuICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2x1bW4uY2VsbE9wdGlvbk1lbnVcIlxuICAgICAgICAgICAgICAgIChjZWxsT3B0aW9uTWVudVNlbGVjdCk9XCJjZWxsT3B0aW9uTWVudVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjZWxsT3B0aW9uTWVudUNsb3NlKT1cImNlbGxPcHRpb25NZW51Q2xvc2VkKClcIi8+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIEdyaWQgQ2VsbCBUZW1wbGF0ZSAtLT5cbiAgICAgICAgQGlmKGNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgb25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgW3BhcmFtc109XCJyZW5kZXJlclBhcmFtcyhub2RlLCBjb2x1bW4pXCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSBpZiAobm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICAgIEBpZiAoY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgRWRpdGluZyBTZWxlY3QuIENvbW1pdHMgb24gY2hhbmdlIOKAlCBwaWNraW5nIGFuIG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHdob2xlIGVkaXQg4oCUIHdpdGggYmx1ciBhcyB0aGUga2V5Ym9hcmQgZmFsbGJhY2suIC0tPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJvbmUtY2VsbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7eyBub2RlLnJvd0lkICsgJycgKyBjb2x1bW4uZmllbGQgfX1cIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInN0b3BFZGl0U2VsZWN0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cInN0b3BFZGl0U2VsZWN0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVzYyk9XCJjYW5jZWxFZGl0KG5vZGUsIGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5zZWxlY3RPcHRpb25zID8/IFtdOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3NlbGVjdGVkXT1cIm9wdGlvbi52YWx1ZSA9PT0gbm9kZS5kYXRhW2NvbHVtbi5maWVsZF1cIj57eyBvcHRpb24ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgIDwhLS0gQ2VsbCBFZGl0aW5nIElucHV0IC0tPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm9uZS1jZWxsLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7IG5vZGUucm93SWQgKyAnJyArIGNvbHVtbi5maWVsZCB9fVwiXG4gICAgICAgICAgICAgICAgICAgIG9uZUNlbGxJbnB1dFZhbGlkYXRvclxuICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblR5cGVdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uaW5wdXRUeXBlID09PSAnbnVtYmVyJyA/ICd0ZXh0JyA6IGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5pbnB1dFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibm9kZT8uZGF0YVtjb2x1bW4/LmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwiMjUwXCJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwic3RvcEVkaXQobm9kZSwgY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic3RvcEVkaXQobm9kZSwgY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZXNjKT1cImNhbmNlbEVkaXQobm9kZSwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSBpZiAoY29sdW1uPy5jZWxsUmVuZGVyZXIpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2x1bW4ud2lkdGggKyAncHgnICwgcG9zaXRpb246ICdyZWxhdGl2ZScgfVwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJub2RlLmNlbGxTdGF0ZXMgfCBjZWxsU3RhdGVSZW5kZXJlcjpjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5lZGl0YWJsZS1hY3RpdmVdPVwibm9kZS5jZWxsU3RhdGVzIHwgY2VsbEVkaXRhYmxlOmNvbHVtbjpub2RlOmNlbGxTZXJ2aWNlLmVkaXRhYmxlRm46Y2VsbFNlcnZpY2UudXBkYXRhYmxlRm46YWxsb3dlZEVkaXRcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtY2VsbFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtbGVmdF09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1jZW50ZXJdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdjZW50ZXInXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1yaWdodF09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sU2VydmljZS5yZXNvbHZlQ2VsbENsYXNzKGNvbHVtbiwgY2VsbFBhcmFtcyhub2RlLCBjb2x1bW4pKVwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sU2VydmljZS5yZXNvbHZlQ2VsbFN0eWxlKGNvbHVtbiwgY2VsbFBhcmFtcyhub2RlLCBjb2x1bW4pKVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctbGVmdC5weF09XCJjb2x1bW4uYXV0b0dyb3VwRmllbGQgJiYgbm9kZS5sZXZlbCB8IGNlbGxMZXZlbFBhZGRpbmc6MjRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtY2VsbC1hbGxvd2VkLWVkaXQtYWN0aXZlXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxFZGl0YWJsZTpjb2x1bW46bm9kZTpjZWxsU2VydmljZS5lZGl0YWJsZUZuOmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuOmFsbG93ZWRFZGl0XCI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFJvdyBEcmFnIEhhbmRsZSAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGNlbGxTZXJ2aWNlLnJvd0RyYWdGbihjb2x1bW4sIG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1yb3ctZHJhZy1oYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N1cHByZXNzZWRSZWFzb25dPVwicm93RHJhZ1N1cHByZXNzZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRyYWdFbmQpPVwib25Sb3dEcmFnRW5kKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gQ2VsbCBDaGVja2JveCBTZWxlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjb2x1bW4/LmNoZWNrYm94U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsb3dlZEVkaXRdPVwiYWxsb3dlZEVkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FwaV09XCJhcGlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0aW9uKT1cImludm9rZVJvd0FjdGlvblNlbGVjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIEV4cGFuZCAmIENvbGxhcHNlIEljb24gLS0+XG4gICAgICAgICAgICAgICAgQGlmICgoKG5vZGU/Lmdyb3VwIHx8IGRldGFpbFJlbmRlcmVyQ29tcG9uZW50KSAmJiBjb2x1bW4/LmF1dG9Hcm91cEZpZWxkKSB8fCAobWFzdGVyRGV0YWlsICYmIG5vZGU/LmV4cGFuZGFibGUgJiYgZ3JpZFR5cGUgPT09ICdtYXN0ZXInICYmIGNvbHVtbj8ubWFzdGVyR3JvdXBGaWVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPG9uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21hc3RlckRldGFpbF09XCJtYXN0ZXJEZXRhaWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RldGFpbENlbGxSZW5kZXJlclBhcmFtc109XCJkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RldGFpbFJlbmRlcmVyQ29tcG9uZW50XT1cImRldGFpbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYoY29sdW1uPy5jZWxsUmVuZGVyZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgb25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcmVyQ29tcG9uZW50XT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwicmVuZGVyZXJQYXJhbXMobm9kZSwgY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8IS0tIENlbGwgVmFsdWUgT1IgUGxhY2Vob2xkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgb25lQ2VsbFRleHRFeHBhbmQgY2xhc3M9XCJvbmUtY2VsbC10ZXh0XCIgW2NsYXNzLm9uZS1jZWxsLXBsYWNlaG9sZGVyXT1cIm5vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdPy50eXBlID09PSAncGxhY2Vob2xkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAobm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjb2x1bW4uY2VsbFJlbmRlcmVyUGFyYW1zIHwgY2VsbEFjdGlvbkJ1dHRvbkVuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtcm93LWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBtYXJnaW5MZWZ0OiAnYXV0bycgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWFzdGVyTm9kZV09XCJtYXN0ZXJOb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncmlkVHlwZV09XCJncmlkVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJQYXJhbXNdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RGV0YWlsKT1cImludm9rZVJvd0FjdGlvbkRldGFpbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0FkZE5ldyk9XCJpbnZva2VSb3dBY3Rpb25BZGROZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dMb2NhdGlvbik9XCJpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0RvY3VtZW50KT1cImludm9rZVJvd0FjdGlvbkRvY3VtZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RGVsZXRlKT1cImludm9rZVJvd0FjdGlvbkRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0dvdG9MaXN0KT1cImludm9rZVJvd0FjdGlvbkdvdG9MaXN0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93UHJpbnQpPVwiaW52b2tlUm93QWN0aW9uUHJpbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dIaXN0b3J5KT1cImludm9rZVJvd0FjdGlvbkhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93TGFuZ3VhZ2UpPVwiaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dDZWxsT3B0aW9uKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|