@datorama/core 22.13.8-rc.2 → 22.14.0
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/bundle.scss +5696 -4767
- package/bundles/datorama-core.umd.js +156 -199
- package/bundles/datorama-core.umd.js.map +1 -1
- package/bundles/datorama-core.umd.min.js +61 -61
- package/bundles/datorama-core.umd.min.js.map +1 -1
- package/datorama-core.d.ts +0 -1
- package/datorama-core.metadata.json +1 -1
- package/esm2015/datorama-core.js +1 -2
- package/esm2015/lib/breadcrumbs/breadcrumbs.component.js +2 -4
- package/esm2015/lib/directives/clipboard.directive.js +7 -16
- package/esm2015/lib/grid/dato-grid-api.js +1 -1
- package/esm2015/lib/grid/dato-grid.js +1 -1
- package/esm2015/lib/grid/grid/grid.component.js +7 -6
- package/esm2015/lib/grid/grid-header/grid-header.component.js +1 -1
- package/esm2015/lib/grid/grid-helper.js +1 -1
- package/esm2015/lib/grid/grid-pagination/grid-pagination.component.js +2 -2
- package/esm2015/lib/grid/grid-toolbar/grid-toolbar.component.js +2 -2
- package/esm2015/lib/grid/grid.module.js +2 -2
- package/esm2015/lib/grid-v2/grid/grid-v2.component.js +10 -8
- package/esm2015/lib/grid-v2/grid/grid-v2.config.js +5 -22
- package/esm2015/lib/grid-v2/grid/grid-v2.types.js +3 -3
- package/esm2015/lib/grid-v2/grid-column-cell-components/grid-avatar-cell/grid-avatar-cell.component.js +3 -3
- package/esm2015/lib/grid-v2/grid-column-cell-components/grid-initials-cell/grid-initials-cell.component.js +3 -3
- package/esm2015/lib/grid-v2/grid-column-cell-components/grid-items-cell/grid-items-cell.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-column-cell-components/grid-items-count-cell/grid-items-count-cell.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-column-cell-components/grid-status-cell/grid-status-cell.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-column-header/grid-column-header.component.js +2 -2
- package/esm2015/lib/grid-v2/grid-column-header/grid-column-header.types.js +1 -1
- package/esm2015/lib/grid-v2/grid-column-header/grid-multi-select-header/grid-multi-select-header.component.js +4 -3
- package/esm2015/lib/grid-v2/grid-column-header-more-menu/grid-column-header-more-menu.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-columns-display-menu/grid-columns-display-menu.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-controller/grid-controller.component.js +11 -17
- package/esm2015/lib/grid-v2/grid-controller/grid-controller.types.js +1 -1
- package/esm2015/lib/grid-v2/grid-custom-header/custom-header-template.directive.js +1 -1
- package/esm2015/lib/grid-v2/grid-filter/filter-validator.js +1 -1
- package/esm2015/lib/grid-v2/grid-filter/grid-filter.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-groups-menu/grid-groups-menu.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-loader/grid-v2-loader.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-no-data-overlay/grid-v2-no-data-overlay.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-on-hover/grid-on-hover.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-pagination/grid-pagination.component.js +1 -1
- package/esm2015/lib/grid-v2/grid-settings.js +2 -2
- package/esm2015/lib/grid-v2/grid-store/grid.query.js +2 -2
- package/esm2015/lib/grid-v2/grid-store/grid.service.js +52 -42
- package/esm2015/lib/grid-v2/grid-store/util.js +1 -1
- package/esm2015/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +4 -10
- package/esm2015/lib/grid-v2/grid-toolbar/grid-toolbar.types.js +1 -1
- package/esm2015/lib/grid-v2/grid-v2.module.js +2 -2
- package/esm2015/lib/grid-v2/grid-v2.util.js +1 -1
- package/esm2015/lib/icon/icon.types.js +1 -1
- package/esm2015/lib/rich-text/rich-text.directive.js +38 -20
- package/esm2015/lib/select/select.component.js +9 -4
- package/esm2015/lib/version.js +2 -2
- package/esm5/datorama-core.js +1 -2
- package/esm5/lib/breadcrumbs/breadcrumbs.component.js +2 -4
- package/esm5/lib/directives/clipboard.directive.js +7 -16
- package/esm5/lib/grid/dato-grid-api.js +1 -1
- package/esm5/lib/grid/dato-grid.js +1 -1
- package/esm5/lib/grid/grid/grid.component.js +7 -6
- package/esm5/lib/grid/grid-header/grid-header.component.js +1 -1
- package/esm5/lib/grid/grid-helper.js +1 -1
- package/esm5/lib/grid/grid-pagination/grid-pagination.component.js +2 -2
- package/esm5/lib/grid/grid-toolbar/grid-toolbar.component.js +2 -2
- package/esm5/lib/grid/grid.module.js +2 -2
- package/esm5/lib/grid-v2/grid/grid-v2.component.js +10 -8
- package/esm5/lib/grid-v2/grid/grid-v2.config.js +5 -22
- package/esm5/lib/grid-v2/grid/grid-v2.types.js +3 -3
- package/esm5/lib/grid-v2/grid-column-cell-components/grid-avatar-cell/grid-avatar-cell.component.js +3 -3
- package/esm5/lib/grid-v2/grid-column-cell-components/grid-initials-cell/grid-initials-cell.component.js +3 -3
- package/esm5/lib/grid-v2/grid-column-cell-components/grid-items-cell/grid-items-cell.component.js +1 -1
- package/esm5/lib/grid-v2/grid-column-cell-components/grid-items-count-cell/grid-items-count-cell.component.js +1 -1
- package/esm5/lib/grid-v2/grid-column-cell-components/grid-status-cell/grid-status-cell.component.js +1 -1
- package/esm5/lib/grid-v2/grid-column-header/grid-column-header.component.js +2 -2
- package/esm5/lib/grid-v2/grid-column-header/grid-column-header.types.js +1 -1
- package/esm5/lib/grid-v2/grid-column-header/grid-multi-select-header/grid-multi-select-header.component.js +4 -3
- package/esm5/lib/grid-v2/grid-column-header-more-menu/grid-column-header-more-menu.component.js +1 -1
- package/esm5/lib/grid-v2/grid-columns-display-menu/grid-columns-display-menu.component.js +1 -1
- package/esm5/lib/grid-v2/grid-controller/grid-controller.component.js +11 -17
- package/esm5/lib/grid-v2/grid-controller/grid-controller.types.js +1 -1
- package/esm5/lib/grid-v2/grid-custom-header/custom-header-template.directive.js +1 -1
- package/esm5/lib/grid-v2/grid-filter/filter-validator.js +1 -1
- package/esm5/lib/grid-v2/grid-filter/grid-filter.component.js +1 -1
- package/esm5/lib/grid-v2/grid-groups-menu/grid-groups-menu.component.js +1 -1
- package/esm5/lib/grid-v2/grid-loader/grid-v2-loader.component.js +1 -1
- package/esm5/lib/grid-v2/grid-no-data-overlay/grid-v2-no-data-overlay.component.js +1 -1
- package/esm5/lib/grid-v2/grid-on-hover/grid-on-hover.component.js +1 -1
- package/esm5/lib/grid-v2/grid-pagination/grid-pagination.component.js +1 -1
- package/esm5/lib/grid-v2/grid-settings.js +2 -2
- package/esm5/lib/grid-v2/grid-store/grid.query.js +2 -2
- package/esm5/lib/grid-v2/grid-store/grid.service.js +52 -42
- package/esm5/lib/grid-v2/grid-store/util.js +1 -1
- package/esm5/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +4 -16
- package/esm5/lib/grid-v2/grid-toolbar/grid-toolbar.types.js +1 -1
- package/esm5/lib/grid-v2/grid-v2.module.js +2 -2
- package/esm5/lib/grid-v2/grid-v2.util.js +1 -1
- package/esm5/lib/icon/icon.types.js +1 -1
- package/esm5/lib/rich-text/rich-text.directive.js +39 -21
- package/esm5/lib/select/select.component.js +9 -4
- package/esm5/lib/version.js +2 -2
- package/fesm2015/datorama-core.js +143 -178
- package/fesm2015/datorama-core.js.map +1 -1
- package/fesm5/datorama-core.js +144 -186
- package/fesm5/datorama-core.js.map +1 -1
- package/lib/directives/clipboard.directive.d.ts +2 -1
- package/lib/grid/dato-grid-api.d.ts +1 -1
- package/lib/grid/dato-grid.d.ts +1 -1
- package/lib/grid/grid/grid.component.d.ts +3 -4
- package/lib/grid/grid-helper.d.ts +1 -1
- package/lib/grid/grid-pagination/grid-pagination.component.d.ts +1 -1
- package/lib/grid-v2/grid/grid-v2.component.d.ts +2 -2
- package/lib/grid-v2/grid/grid-v2.config.d.ts +0 -1
- package/lib/grid-v2/grid/grid-v2.types.d.ts +1 -3
- package/lib/grid-v2/grid-column-cell-components/grid-avatar-cell/grid-avatar-cell.component.d.ts +2 -2
- package/lib/grid-v2/grid-column-cell-components/grid-initials-cell/grid-initials-cell.component.d.ts +2 -2
- package/lib/grid-v2/grid-column-cell-components/grid-items-cell/grid-items-cell.component.d.ts +2 -2
- package/lib/grid-v2/grid-column-cell-components/grid-items-count-cell/grid-items-count-cell.component.d.ts +2 -2
- package/lib/grid-v2/grid-column-cell-components/grid-status-cell/grid-status-cell.component.d.ts +2 -2
- package/lib/grid-v2/grid-column-header/grid-column-header.component.d.ts +2 -2
- package/lib/grid-v2/grid-column-header/grid-column-header.types.d.ts +1 -1
- package/lib/grid-v2/grid-column-header/grid-multi-select-header/grid-multi-select-header.component.d.ts +2 -2
- package/lib/grid-v2/grid-column-header-more-menu/grid-column-header-more-menu.component.d.ts +1 -1
- package/lib/grid-v2/grid-columns-display-menu/grid-columns-display-menu.component.d.ts +1 -1
- package/lib/grid-v2/grid-controller/grid-controller.component.d.ts +7 -7
- package/lib/grid-v2/grid-controller/grid-controller.types.d.ts +1 -1
- package/lib/grid-v2/grid-custom-header/custom-header-template.directive.d.ts +1 -1
- package/lib/grid-v2/grid-filter/filter-validator.d.ts +1 -1
- package/lib/grid-v2/grid-groups-menu/grid-groups-menu.component.d.ts +1 -1
- package/lib/grid-v2/grid-loader/grid-v2-loader.component.d.ts +2 -2
- package/lib/grid-v2/grid-no-data-overlay/grid-v2-no-data-overlay.component.d.ts +2 -2
- package/lib/grid-v2/grid-on-hover/grid-on-hover.component.d.ts +1 -1
- package/lib/grid-v2/grid-settings.d.ts +2 -2
- package/lib/grid-v2/grid-store/grid.query.d.ts +4 -4
- package/lib/grid-v2/grid-store/grid.service.d.ts +377 -6
- package/lib/grid-v2/grid-store/util.d.ts +1 -1
- package/lib/grid-v2/grid-toolbar/grid-toolbar.component.d.ts +1 -3
- package/lib/grid-v2/grid-toolbar/grid-toolbar.types.d.ts +1 -1
- package/lib/grid-v2/grid-v2.util.d.ts +1 -1
- package/lib/icon/icon.types.d.ts +1 -1
- package/lib/rich-text/rich-text.directive.d.ts +6 -4
- package/package.json +2 -2
- package/testing/src/grid/row.ts +1 -1
- package/esm2015/lib/rich-text/rich-text.service.js +0 -50
- package/esm5/lib/rich-text/rich-text.service.js +0 -51
- package/lib/rich-text/rich-text.service.d.ts +0 -10
|
@@ -10,7 +10,7 @@ import { isEmpty, isFunction, isNil, isString } from '../../utils/validators';
|
|
|
10
10
|
import { validateFilter } from '../grid-filter/filter-validator';
|
|
11
11
|
import { IconRegistry, SvgRegistry } from '../../services/icon-registry';
|
|
12
12
|
import { getVisibleActions, toolbarActionToContextAction } from '../grid-v2.util';
|
|
13
|
-
import {
|
|
13
|
+
import { writeToClipboard } from '../../directives/clipboard.directive';
|
|
14
14
|
import { GridStore } from './grid.store';
|
|
15
15
|
import { DATO_GRID_STORAGE_API } from '../grid-settings';
|
|
16
16
|
import { DatoGridColumnTypes, editableCellRendererWithSearchHighlight, GridMinWidths, GridRowSelectionType, searchHighlightCellRenderer } from '../grid/grid-v2.types';
|
|
@@ -36,7 +36,7 @@ let GridService = class GridService {
|
|
|
36
36
|
this.logger = logger;
|
|
37
37
|
this.treeConfig = defaultGridTreeLabel;
|
|
38
38
|
this.pageNumberToReturnAfterRefresh = -1;
|
|
39
|
-
this.
|
|
39
|
+
this.reloadGridActionsSubject = new Subject();
|
|
40
40
|
this.CHECKBOX_SELECTION_COL_ID = 'grid-checkbox-selection';
|
|
41
41
|
}
|
|
42
42
|
set treeData(isTreeData) {
|
|
@@ -63,11 +63,11 @@ let GridService = class GridService {
|
|
|
63
63
|
? context
|
|
64
64
|
: deepmerge(this.gridRef.gridOptions.context || {}, context);
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
this.
|
|
66
|
+
reloadGridActions() {
|
|
67
|
+
this.reloadGridActionsSubject.next();
|
|
68
68
|
}
|
|
69
|
-
|
|
70
|
-
return this.
|
|
69
|
+
onReloadGridActions() {
|
|
70
|
+
return this.reloadGridActionsSubject.asObservable();
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
73
|
* @deprecated use selectRows instead
|
|
@@ -168,25 +168,40 @@ let GridService = class GridService {
|
|
|
168
168
|
this.loadSavedSettings(savedSettings);
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
|
+
initGridOptions(gridOptions) {
|
|
172
|
+
let options = Object.assign({}, gridOptions);
|
|
173
|
+
if (typeof gridOptions.enableSearch === 'undefined') {
|
|
174
|
+
options.enableSearch = options.enableV2_1;
|
|
175
|
+
}
|
|
176
|
+
if (typeof gridOptions.enableBackground === 'undefined') {
|
|
177
|
+
options.enableBackground = options.enableV2_1;
|
|
178
|
+
}
|
|
179
|
+
if (typeof gridOptions.showMultiSelectionCheckboxes === 'undefined') {
|
|
180
|
+
options.showMultiSelectionCheckboxes =
|
|
181
|
+
gridOptions.enableV2_1 && options.rowSelection !== GridRowSelectionType.SINGLE;
|
|
182
|
+
}
|
|
183
|
+
if (typeof gridOptions.enableSearchHighlight === 'undefined') {
|
|
184
|
+
options.enableSearchHighlight = options.enableSearch && defaultGridOptions.enableSearchHighlight;
|
|
185
|
+
}
|
|
186
|
+
if (gridOptions.usePivotGridStyle) {
|
|
187
|
+
const rowHeight = 30;
|
|
188
|
+
options.rowHeight = rowHeight;
|
|
189
|
+
options.defaultColDef = Object.assign(Object.assign({}, options.defaultColDef), { cellClassRules: this.getPivotModeCellClassRules(), headerClass: this.getPivotHeaderClass.bind(this), cellStyle: params => {
|
|
190
|
+
const style = { lineHeight: `${rowHeight}px` };
|
|
191
|
+
if (params.colDef.type === DatoGridColumnTypes.Number) {
|
|
192
|
+
style.textAlign = 'end';
|
|
193
|
+
}
|
|
194
|
+
return style;
|
|
195
|
+
} });
|
|
196
|
+
options.autoGroupColumnDef = Object.assign(Object.assign({}, options.autoGroupColumnDef), { cellClassRules: this.getPivotModeCellClassRules(), headerClass: this.getPivotHeaderClass.bind(this) });
|
|
197
|
+
}
|
|
198
|
+
return options;
|
|
199
|
+
}
|
|
171
200
|
normalizeOptions(params) {
|
|
172
201
|
this.customHeadersTemplates = params.customHeadersTemplates;
|
|
173
202
|
const headerComponentParams = { gridService: this, gridQuery: this.gridQuery };
|
|
174
203
|
params.gridOptions.autoGroupColumnDef = Object.assign(Object.assign({}, headerComponentParams), params.gridOptions.autoGroupColumnDef);
|
|
175
204
|
params.gridOptions.defaultColDef = Object.assign(Object.assign({}, params.gridOptions.defaultColDef), { headerComponentParams });
|
|
176
|
-
if (typeof params.gridOptions.enableSearch === 'undefined') {
|
|
177
|
-
params.gridOptions.enableSearch = params.gridOptions.enableV2_1;
|
|
178
|
-
}
|
|
179
|
-
if (typeof params.gridOptions.enableBackground === 'undefined') {
|
|
180
|
-
params.gridOptions.enableBackground = params.gridOptions.enableV2_1;
|
|
181
|
-
}
|
|
182
|
-
if (typeof params.gridOptions.showMultiSelectionCheckboxes === 'undefined') {
|
|
183
|
-
params.gridOptions.showMultiSelectionCheckboxes =
|
|
184
|
-
params.gridOptions.enableV2_1 && params.gridOptions.rowSelection !== GridRowSelectionType.SINGLE;
|
|
185
|
-
}
|
|
186
|
-
if (typeof params.gridOptions.enableSearchHighlight === 'undefined') {
|
|
187
|
-
params.gridOptions.enableSearchHighlight =
|
|
188
|
-
params.gridOptions.enableSearch && defaultGridOptions.enableSearchHighlight;
|
|
189
|
-
}
|
|
190
205
|
params.gridOptions.columnDefs = this.normalizeColumns(params.gridOptions.columnDefs, params.gridOptions);
|
|
191
206
|
/** Add core filters */
|
|
192
207
|
params.gridOptions.isExternalFilterPresent = () => true;
|
|
@@ -213,23 +228,18 @@ let GridService = class GridService {
|
|
|
213
228
|
params.gridOptions.saveSettings = saveSettings !== false && !isNil(gridName);
|
|
214
229
|
/** Server Side Pagination for select all option */
|
|
215
230
|
this.initOnRowSelectedForServerSidePagination(params);
|
|
231
|
+
/** Add tree grid specific required settings */
|
|
232
|
+
if (this.isTreeData) {
|
|
233
|
+
const inputRowClassRules = params.gridOptions.rowClassRules;
|
|
234
|
+
params.gridOptions.rowClassRules = Object.assign(Object.assign({}, inputRowClassRules), { 'ag-empty-folder': params => {
|
|
235
|
+
return params.data.isFolder && size(params.node.childrenAfterGroup) === 0;
|
|
236
|
+
} });
|
|
237
|
+
}
|
|
216
238
|
/** Add pivot specific required settings */
|
|
217
|
-
if (
|
|
239
|
+
if (this.isPivotMode) {
|
|
218
240
|
this.initPivotSecondaryColsProcess(params);
|
|
219
241
|
params.gridOptions.saveSettings = false;
|
|
220
242
|
}
|
|
221
|
-
if (params.gridOptions.usePivotGridStyle) {
|
|
222
|
-
const rowHeight = 30;
|
|
223
|
-
params.gridOptions.rowHeight = rowHeight;
|
|
224
|
-
params.gridOptions.defaultColDef = Object.assign(Object.assign({}, params.gridOptions.defaultColDef), { cellClassRules: this.getPivotModeCellClassRules(), headerClass: this.getPivotHeaderClass.bind(this), cellStyle: params => {
|
|
225
|
-
const style = { lineHeight: `${rowHeight}px` };
|
|
226
|
-
if (params.colDef.type === DatoGridColumnTypes.Number) {
|
|
227
|
-
style.textAlign = 'end';
|
|
228
|
-
}
|
|
229
|
-
return style;
|
|
230
|
-
} });
|
|
231
|
-
params.gridOptions.autoGroupColumnDef = Object.assign(Object.assign({}, params.gridOptions.autoGroupColumnDef), { cellClassRules: this.getPivotModeCellClassRules(), headerClass: this.getPivotHeaderClass.bind(this) });
|
|
232
|
-
}
|
|
233
243
|
return params.gridOptions;
|
|
234
244
|
}
|
|
235
245
|
getPivotHeaderClass(params) {
|
|
@@ -309,8 +319,9 @@ let GridService = class GridService {
|
|
|
309
319
|
colId: this.CHECKBOX_SELECTION_COL_ID,
|
|
310
320
|
checkboxSelection: true,
|
|
311
321
|
headerComponentFramework: DatoGridMultiSelectColumnHeaderComponent,
|
|
312
|
-
|
|
313
|
-
|
|
322
|
+
minWidth: 29,
|
|
323
|
+
width: 29,
|
|
324
|
+
maxWidth: 29,
|
|
314
325
|
suppressSizeToFit: true,
|
|
315
326
|
cellClass: 'checkbox-selection-cell',
|
|
316
327
|
headerClass: 'header-checkbox-selection-cell',
|
|
@@ -515,8 +526,7 @@ let GridService = class GridService {
|
|
|
515
526
|
this.updateSettings({ gridAlignment, columnsSizes: null });
|
|
516
527
|
}
|
|
517
528
|
saveSettingsToServer(settings) {
|
|
518
|
-
|
|
519
|
-
this.storageAPI.set(this.gridName, settings, isGlobal);
|
|
529
|
+
this.storageAPI.set(this.gridName, settings);
|
|
520
530
|
}
|
|
521
531
|
/**
|
|
522
532
|
* @internal used to log grid events to the platform's logging service
|
|
@@ -621,8 +631,8 @@ let GridService = class GridService {
|
|
|
621
631
|
copyAction.onClick = ([row]) => {
|
|
622
632
|
const rawValue = this.api.grid.getValue(column.getColId(), row);
|
|
623
633
|
const formatter = column.getColDef().valueFormatter;
|
|
624
|
-
const value = formatter ? formatter(rawValue) : rawValue;
|
|
625
|
-
|
|
634
|
+
const value = formatter && typeof formatter !== 'string' ? formatter(rawValue) : rawValue;
|
|
635
|
+
writeToClipboard(value);
|
|
626
636
|
};
|
|
627
637
|
if (node.isSelected()) {
|
|
628
638
|
selected = this.gridQuery.getSelectedRowNodes();
|
|
@@ -996,8 +1006,8 @@ let GridService = class GridService {
|
|
|
996
1006
|
* Refer docs - https://www.ag-grid.com/angular-data-grid/cell-styles/#cell-class-rules */
|
|
997
1007
|
getPivotModeCellClassRules() {
|
|
998
1008
|
return {
|
|
999
|
-
'
|
|
1000
|
-
'
|
|
1009
|
+
'even-row-group-leaf-cell': this.isLeafGroupEvenCell.bind(this),
|
|
1010
|
+
'row-group-root-cell': this.isRowGroupValuedCell.bind(this)
|
|
1001
1011
|
};
|
|
1002
1012
|
}
|
|
1003
1013
|
isLeafGroupEvenCell(params) {
|
|
@@ -1041,4 +1051,4 @@ GridService = __decorate([
|
|
|
1041
1051
|
SvgRegistry, Object, Object])
|
|
1042
1052
|
], GridService);
|
|
1043
1053
|
export { GridService };
|
|
1044
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBZXpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG9CQUFvQixFQUtwQixzQkFBc0IsRUFRdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBU2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBSUwsbUJBQW1CLEVBT25CLHVDQUF1QyxFQUN2QyxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLDJCQUEy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O0lBQ1osQ0FBQztDQUNGLENBQUE7O1lBeHFDa0IsU0FBUztZQUNMLFNBQVM7WUFDVCxvQkFBb0I7WUFDakIsWUFBWTtZQUNiLFdBQVc7NENBQy9CLE1BQU0sU0FBQyxxQkFBcUI7NENBQzVCLE1BQU0sU0FBQyxnQkFBZ0I7O0FBakNmLFdBQVc7SUFEdkIsVUFBVSxFQUFFO0lBaUNSLFdBQUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDN0IsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtxQ0FOVixTQUFTO1FBQ0wsU0FBUztRQUNULG9CQUFvQjtRQUNqQixZQUFZO1FBQ2IsV0FBVztHQS9CdkIsV0FBVyxDQW1zQ3ZCO1NBbnNDWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0b0dyaWRBcGkgfSBmcm9tICcuLi9ncmlkLWNvbnRyb2xsZXIvZ3JpZC1jb250cm9sbGVyLnR5cGVzJztcbmltcG9ydCB7XG4gIENlbGxDbGFzc1BhcmFtcyxcbiAgQ29sR3JvdXBEZWYsXG4gIENvbHVtbixcbiAgR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcyxcbiAgR3JpZE9wdGlvbnMsXG4gIElDZWxsUmVuZGVyZXJQYXJhbXMsXG4gIElHZXRSb3dzUGFyYW1zLFxuICBSb3dOb2RlLFxuICBSb3dOb2RlVHJhbnNhY3Rpb24sXG4gIFJvd1NlbGVjdGVkRXZlbnRcbn0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHsgUm93RGF0YVRyYW5zYWN0aW9uIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHkvZGlzdC9saWIvcm93TW9kZWxzL2NsaWVudFNpZGUvY2xpZW50U2lkZVJvd01vZGVsJztcbmltcG9ydCB7IEdyaWRRdWVyeSB9IGZyb20gJy4vZ3JpZC5xdWVyeSc7XG5pbXBvcnQgeyBEYXRvQ29yZUVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IERhdG9UcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0b0N1c3RvbUhlYWRlclRlbXBsYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC1jdXN0b20taGVhZGVyL2N1c3RvbS1oZWFkZXItdGVtcGxhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBEYXRvRmlsdGVyQ29uZGl0aW9ucyxcbiAgRGF0b0dyaWRDb25kaXRpb25hbEZpbHRlcixcbiAgRGF0b0dyaWRFeHRlcm5hbEZpbHRlcixcbiAgRGF0b0dyaWRGaWx0ZXIsXG4gIERhdG9HcmlkRmlsdGVyQ29uZGl0aW9uLFxuICBEYXRvR3JpZEZpbHRlclNlY3Rpb25zLFxuICBEYXRvR3JpZEZpbHRlcnNNYXAsXG4gIERhdG9HcmlkUmFuZ2VGaWx0ZXJDb25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkxpc3RDb25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uUmFuZ2VDb25kaXRpb25cbn0gZnJvbSAnLi4vZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIudHlwZXMnO1xuaW1wb3J0IHsgY29lcmNlQXJyYXkgfSBmcm9tICcuLi8uLi91dGlscy9jb2VyY2lvbic7XG5pbXBvcnQgeyBpc0VtcHR5LCBpc0Z1bmN0aW9uLCBpc05pbCwgaXNTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscy92YWxpZGF0b3JzJztcbmltcG9ydCB7IHZhbGlkYXRlRmlsdGVyIH0gZnJvbSAnLi4vZ3JpZC1maWx0ZXIvZmlsdGVyLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBBZ0dyaWROZzIgfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xuaW1wb3J0IHsgSWNvblJlZ2lzdHJ5LCBTdmdSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ljb24tcmVnaXN0cnknO1xuaW1wb3J0IHsgZ2V0VmlzaWJsZUFjdGlvbnMsIHRvb2xiYXJBY3Rpb25Ub0NvbnRleHRBY3Rpb24gfSBmcm9tICcuLi9ncmlkLXYyLnV0aWwnO1xuaW1wb3J0IHtcbiAgRGF0b0dyaWRTZXR0aW5ncyxcbiAgTm9ybWFsaXplT3B0aW9uc1BhcmFtcyxcbiAgUGl2b3RDb2x1bW5EYXRhLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmZpZyxcbiAgU3VjY2Vzc1dyYXBwZXJQYXJhbXNcbn0gZnJvbSAnLi9ncmlkLnN0b3JlLnR5cGVzJztcbmltcG9ydCB7IFJvd0FjdGlvbiB9IGZyb20gJy4uL2dyaWQtdG9vbGJhci9ncmlkLXRvb2xiYXIudHlwZXMnO1xuaW1wb3J0IHsgY29weVRvQ2xpcGJvYXJkIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jbGlwYm9hcmQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWRTdG9yZSB9IGZyb20gJy4vZ3JpZC5zdG9yZSc7XG5pbXBvcnQgeyBEQVRPX0dSSURfU1RPUkFHRV9BUEksIEdyaWRTdG9yYWdlQVBJIH0gZnJvbSAnLi4vZ3JpZC1zZXR0aW5ncyc7XG5pbXBvcnQge1xuICBBY3Rpb25Db252ZXJ0ZXJQYXJhbXMsXG4gIERhdG9HcmlkQWxpZ25tZW50LFxuICBEYXRvR3JpZENvbHVtbkRlZixcbiAgRGF0b0dyaWRDb2x1bW5UeXBlcyxcbiAgRGF0b0dyaWRHZXRSb3dzUGFyYW1zLFxuICBEYXRvR3JpZE9wdGlvbnMsXG4gIERhdG9HcmlkU2VydmVyU29ydCxcbiAgRGF0b0dyaWRTZXJ2ZXJTb3J0RGlyZWN0aW9uLFxuICBEYXRvR3JpZFNvcnQsXG4gIERhdG9HcmlkVHJlZUNvbmZpZyxcbiAgZWRpdGFibGVDZWxsUmVuZGVyZXJXaXRoU2VhcmNoSGlnaGxpZ2h0LFxuICBHcmlkTWluV2lkdGhzLFxuICBHcmlkUm93U2VsZWN0aW9uVHlwZSxcbiAgc2VhcmNoSGlnaGxpZ2h0Q2VsbFJlbmRlcmVyXG59IGZyb20gJy4uL2dyaWQvZ3JpZC12Mi50eXBlcyc7XG5cbmltcG9ydCB7IGNvbnZlcnRUb1RyZWVEYXRhLCBkZWZhdWx0R3JpZE9wdGlvbnMsIGRlZmF1bHRHcmlkVHJlZUxhYmVsIH0gZnJvbSAnLi4vZ3JpZC9ncmlkLXYyLmNvbmZpZyc7XG5pbXBvcnQgeyBkaWZmIH0gZnJvbSAnLi4vLi4vdXRpbHMvb2JqZWN0JztcbmltcG9ydCB7IHVudGlsRGVzdHJveWVkIH0gZnJvbSAnbmd4LXRha2UtdW50aWwtZGVzdHJveSc7XG5pbXBvcnQgeyBDb3JlRXZlbnRMb2dnZXIsIENvcmVFdmVudFR5cGVzLCBEQVRPX0NPUkVfTE9HR0VSIH0gZnJvbSAnLi4vLi4vZXZlbnQtbG9nZ2VyJztcbmltcG9ydCB7IEhhc2hNYXAgfSBmcm9tICcuLi8uLi91dGlscy90eXBlcyc7XG5pbXBvcnQgeyBzaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29sbGVjdGlvbic7XG5pbXBvcnQgeyBPcGVyYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vb3BlcmF0b3ItdG9nZ2xlci9vcGVyYXRvci10b2dnbGVyLnR5cGVzJztcbmltcG9ydCB7IGRlZXBtZXJnZSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2RlZXAtbWVyZ2UnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdHJpZ2dlcldpbmRvd1Jlc2l6ZSB9IGZyb20gJy4uLy4uL3V0aWxzL3VzZXItYWdlbnQnO1xuaW1wb3J0IHsgZ2V0Q29sRmllbGQsIGdldENvbHVtbnNTaXplcywgaXNIdG1sQWxsb3dlZEZvckNvbCwgdHJ5UGFyc2VQaXZvdFZhbHVlIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IERhdG9HcmlkTXVsdGlTZWxlY3RDb2x1bW5IZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9ncmlkLWNvbHVtbi1oZWFkZXIvZ3JpZC1tdWx0aS1zZWxlY3QtaGVhZGVyL2dyaWQtbXVsdGktc2VsZWN0LWhlYWRlci5jb21wb25lbnQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR3JpZFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBhcGk6IERhdG9HcmlkQXBpO1xuICB0cmVlQ29uZmlnOiBEYXRvR3JpZFRyZWVDb25maWcgPSBkZWZhdWx0R3JpZFRyZWVMYWJlbDtcbiAgaXNQaXZvdE1vZGU6IGJvb2xlYW47XG5cbiAgLyoqIEBpbnRlcm5hbCAtIHVzZWQgZm9yIHNlcnZlciBzaWRlIGJ5IHZhbHVlIGZpbHRlciAqL1xuICBfb3JpZ2luYWxHZXRSb3dzOiAocGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHZvaWQ7XG4gIHByaXZhdGUgaW5pdGlhbFNldHRpbmdzOiBEYXRvR3JpZFNldHRpbmdzO1xuICBwcml2YXRlIGdyaWROYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgZ3JpZFJlZjogQWdHcmlkTmcyO1xuICBwcml2YXRlIGN1c3RvbUhlYWRlcnNUZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxEYXRvQ3VzdG9tSGVhZGVyVGVtcGxhdGVDb21wb25lbnQ+O1xuICBwcml2YXRlIGlzVHJlZURhdGE6IGJvb2xlYW47XG4gIHByaXZhdGUgcGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gLTE7XG4gIHByaXZhdGUgbGFzdFRvdGFsUm93czogbnVtYmVyO1xuICBwcml2YXRlIHVwZGF0ZUdyaWRBY3Rpb25zU3ViamVjdCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lEID0gJ2dyaWQtY2hlY2tib3gtc2VsZWN0aW9uJztcblxuICBzZXQgdHJlZURhdGEoaXNUcmVlRGF0YTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNUcmVlRGF0YSA9IGlzVHJlZURhdGE7XG4gIH1cblxuICBnZXQgdHJlZURhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmVlRGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IEdyaWRTdG9yZSxcbiAgICBwcml2YXRlIGdyaWRRdWVyeTogR3JpZFF1ZXJ5LFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBEYXRvVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGljb25SZWdpc3RyeTogSWNvblJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgc3ZnUmVnaXN0cnk6IFN2Z1JlZ2lzdHJ5LFxuICAgIEBJbmplY3QoREFUT19HUklEX1NUT1JBR0VfQVBJKSBwcml2YXRlIHN0b3JhZ2VBUEk6IEdyaWRTdG9yYWdlQVBJLFxuICAgIEBJbmplY3QoREFUT19DT1JFX0xPR0dFUikgcHJpdmF0ZSBsb2dnZXI6IENvcmVFdmVudExvZ2dlclxuICApIHt9XG5cbiAgbmdPbkRlc3Ryb3koKSB7fVxuXG4gIC8qKiBAaW50ZXJuYWwgLSB1c2VkIHRvIGluaXQgdGhlIHNlcnZpY2UgKi9cbiAgX3NldEFwaShhcGk6IERhdG9HcmlkQXBpLCBncmlkUmVmOiBBZ0dyaWROZzIpIHtcbiAgICB0aGlzLmFwaSA9IGFwaTtcbiAgICB0aGlzLmdyaWRSZWYgPSBncmlkUmVmO1xuICAgIHRoaXMuZ3JpZE5hbWUgPSAoZ3JpZFJlZi5ncmlkT3B0aW9ucyBhcyBEYXRvR3JpZE9wdGlvbnMpLmdyaWROYW1lO1xuICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oe1xuICAgICAgZW5hYmxlZDogdGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRSZWYuZ3JpZE9wdGlvbnMpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdyaWRPcHRpb25zLnJvd01vZGVsVHlwZSA9PT0gJ2luZmluaXRlJztcbiAgfVxuXG4gIHVwZGF0ZUdyaWRDb250ZXh0KGNvbnRleHQgPSB7fSwgcmVwbGFjZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5jb250ZXh0ID0gcmVwbGFjZVxuICAgICAgPyBjb250ZXh0XG4gICAgICA6IGRlZXBtZXJnZSh0aGlzLmdyaWRSZWYuZ3JpZE9wdGlvbnMuY29udGV4dCB8fCB7fSwgY29udGV4dCk7XG4gIH1cblxuICB1cGRhdGVHcmlkQWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUdyaWRBY3Rpb25zU3ViamVjdC5uZXh0KHRydWUpO1xuICB9XG5cbiAgZ2V0VXBkYXRlR3JpZEFjdGlvbnNTdGF0dXMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlR3JpZEFjdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZWxlY3RSb3dzIGluc3RlYWRcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgc2V0U2VsZWN0ZWRSb3dzPFQ+KHJvdzogKFQgJiBSb3dOb2RlKSB8IChUW10gJiBSb3dOb2RlW10pKSB7XG4gICAgdGhpcy5zZWxlY3RSb3dzKHJvdyk7XG4gIH1cblxuICBzZWxlY3RSb3dzPFQ+KHJvdzogKFQgJiBSb3dOb2RlKSB8IChUW10gJiBSb3dOb2RlW10pKSB7XG4gICAgY29uc3Qgcm93Tm9kZXMgPSBjb2VyY2VBcnJheShyb3cpLmZpbHRlcihyb3dOb2RlID0+ICFyb3dOb2RlLmlzU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGFzdE5vZGUgPSByb3dOb2Rlcy5wb3AoKTtcbiAgICByb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZCh0cnVlLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIGlmIChsYXN0Tm9kZSkge1xuICAgICAgbGFzdE5vZGUuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgZGVzZWxlY3RSb3dzPFQ+KHJvdzogKFQgJiBSb3dOb2RlKSB8IChUW10gJiBSb3dOb2RlW10pKSB7XG4gICAgY29uc3Qgcm93Tm9kZXMgPSBjb2VyY2VBcnJheShyb3cpLmZpbHRlcihyb3dOb2RlID0+IHJvd05vZGUuaXNTZWxlY3RlZCgpKTtcbiAgICBjb25zdCBsYXN0Tm9kZSA9IHJvd05vZGVzLnBvcCgpO1xuICAgIHJvd05vZGVzLmZvckVhY2gocm93Tm9kZSA9PiByb3dOb2RlLnNldFNlbGVjdGVkKGZhbHNlLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIGlmIChsYXN0Tm9kZSkge1xuICAgICAgbGFzdE5vZGUuc2V0U2VsZWN0ZWQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHNldFJvd3M8VD4oZGF0YTogVFtdLCBmaXRDb250YWluZXIgPSBmYWxzZSwgdHJlZUNvbmZpZzogUGFydGlhbDxEYXRvR3JpZFRyZWVDb25maWc+ID0ge30pIHtcbiAgICB0aGlzLmdyaWRRdWVyeS5ncmlkUmVhZHkkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVHJlZURhdGEpIHtcbiAgICAgICAgdGhpcy50cmVlQ29uZmlnID0ge1xuICAgICAgICAgIC4uLmRlZmF1bHRHcmlkVHJlZUxhYmVsLFxuICAgICAgICAgIC4uLnRyZWVDb25maWdcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdHJlZURhdGUgPSBjb252ZXJ0VG9UcmVlRGF0YShkYXRhLCB0aGlzLnRyZWVDb25maWcpO1xuICAgICAgICB0aGlzLmFwaS5ncmlkLnNldFJvd0RhdGEodHJlZURhdGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUGl2b3RNb2RlKSB7XG4gICAgICAgIHRoaXMuc2V0UGl2b3RNb2RlUm93czxUPihkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXBpLmdyaWQuc2V0Um93RGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXRDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5maXRHcmlkKCdjb250YWluZXInKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJXaW5kb3dSZXNpemUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldERhdGFzb3VyY2UoZ2V0Um93czogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkLCByZXR1cm5Ub0N1cnJlbnRQYWdlID0gZmFsc2UsIHNob3dMb2FkaW5nID0gZmFsc2UpIHtcbiAgICByZXR1cm5Ub0N1cnJlbnRQYWdlICYmIHRoaXMudXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKTtcbiAgICBzaG93TG9hZGluZyAmJiB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5fb3JpZ2luYWxHZXRSb3dzID0gZ2V0Um93cztcbiAgICB0aGlzLmFwaS5ncmlkLnNldERhdGFzb3VyY2UoeyBnZXRSb3dzOiB0aGlzLndyYXBHZXRSb3dzKHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCksIGdldFJvd3MpIH0pO1xuICB9XG5cbiAgcmVmcmVzaFNlcnZlckRhdGEoa2VlcEN1cnJlbnRQYWdlID0gZmFsc2UsIHNob3dMb2FkaW5nID0gZmFsc2UpIHtcbiAgICBrZWVwQ3VycmVudFBhZ2UgJiYgdGhpcy51cGRhdGVQYWdlVG9LZWVwT25SZWZyZXNoU2VydmVyRGF0YSgpO1xuICAgIHNob3dMb2FkaW5nICYmIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLmFwaS5ncmlkLnNldERhdGFzb3VyY2UoeyBnZXRSb3dzOiB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmRhdGFzb3VyY2UuZ2V0Um93cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKSB7XG4gICAgLy8gS2VlcGluZyB0aGUgY3VycmVudCBwYWdlIG9uIHNlcnZlciByZWZyZXNoIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgb25seSB3aGVuIG5vIHBhZ2UgY2xpZW50IGNhY2hpbmcgaXMgZW5hYmxlZFxuICAgIGlmICh0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLm1heEJsb2Nrc0luQ2FjaGUgPT09IDEpIHtcbiAgICAgIHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gdGhpcy5hcGkuZ3JpZC5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKTtcbiAgICB9XG4gIH1cblxuICBhZGRSb3dzPFQ+KHJvdzogVCwgaW5kZXg/OiBudW1iZXIpOiBSb3dOb2RlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpO1xuICAgIGNvbnN0IGRhdGE6IFJvd0RhdGFUcmFuc2FjdGlvbiA9IHsgYWRkOiByb3dzIH07XG4gICAgaWYgKCFpc05pbChpbmRleCkpIHtcbiAgICAgIGRhdGEuYWRkSW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YShkYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZVJvd3M8VD4ocm93OiBUW10pOiBhbnkge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpO1xuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoeyB1cGRhdGU6IHJvd3MgfSk7XG4gIH1cblxuICB1cGRhdGVSb3dWYWx1ZTxUPihyb3c6IFJvd05vZGUsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCk7XG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KGlkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCk7XG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KHJvdzogc3RyaW5nIHwgUm93Tm9kZSwga2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBUKSB7XG4gICAgY29uc3Qgcm93Tm9kZSA9IGlzU3RyaW5nKHJvdykgPyB0aGlzLmFwaS5ncmlkLmdldFJvd05vZGUocm93KSA6IHJvdztcbiAgICByb3dOb2RlLnNldERhdGFWYWx1ZShrZXksIG5ld1ZhbHVlKTtcbiAgfVxuXG4gIHJlbW92ZVJvd3Mocm93OiBSb3dOb2RlIHwgUm93Tm9kZVtdKTogUm93Tm9kZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KS5tYXAoKHsgZGF0YSB9KSA9PiBkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKHsgcmVtb3ZlOiByb3dzIH0pO1xuICB9XG5cbiAgcmVtb3ZlU2VsZWN0ZWRSb3dzKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNlbGVjdGVkUm93Tm9kZXMoKTtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVSb3dzKHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBjbGVhclRhYmxlKCkge1xuICAgIHRoaXMuc2V0Um93cyhbXSk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW5zKGNvbERlZnM6IERhdG9HcmlkQ29sdW1uRGVmIHwgRGF0b0dyaWRDb2x1bW5EZWZbXSwgcmVsb2FkU2V0dGluZ3MgPSBmYWxzZSkge1xuICAgIGlmICghY29sRGVmcykge1xuICAgICAgdGhyb3cgbmV3IERhdG9Db3JlRXJyb3IoJ05vIGNvbHVtbkRlZnMgd2VyZSBwcm92aWRlZC4g8J+VtfCfj7vigI3imYDvuI8nKTtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplQ29sdW1ucyhjb2VyY2VBcnJheShjb2xEZWZzKSk7XG4gICAgY29uc3Qgc2F2ZWRTZXR0aW5ncyA9IHJlbG9hZFNldHRpbmdzICYmIHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICB0aGlzLmFwaS5ncmlkLnNldENvbHVtbkRlZnMobm9ybWFsaXplZCk7XG4gICAgaWYgKHNhdmVkU2V0dGluZ3MpIHtcbiAgICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gICAgfVxuICB9XG5cbiAgbm9ybWFsaXplT3B0aW9ucyhwYXJhbXM6IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICB0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMgPSBwYXJhbXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcztcbiAgICBjb25zdCBoZWFkZXJDb21wb25lbnRQYXJhbXMgPSB7IGdyaWRTZXJ2aWNlOiB0aGlzLCBncmlkUXVlcnk6IHRoaXMuZ3JpZFF1ZXJ5IH07XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZiA9IHtcbiAgICAgIC4uLmhlYWRlckNvbXBvbmVudFBhcmFtcyxcbiAgICAgIC4uLnBhcmFtcy5ncmlkT3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWZcbiAgICB9O1xuXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmRlZmF1bHRDb2xEZWYgPSB7XG4gICAgICAuLi5wYXJhbXMuZ3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZixcbiAgICAgIGhlYWRlckNvbXBvbmVudFBhcmFtc1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaCA9IHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVWMl8xO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVCYWNrZ3JvdW5kID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZUJhY2tncm91bmQgPSBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlVjJfMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID1cbiAgICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVYyXzEgJiYgcGFyYW1zLmdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbiAhPT0gR3JpZFJvd1NlbGVjdGlvblR5cGUuU0lOR0xFO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0ID1cbiAgICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaCAmJiBkZWZhdWx0R3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0O1xuICAgIH1cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcyA9IHRoaXMubm9ybWFsaXplQ29sdW1ucyhwYXJhbXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcywgcGFyYW1zLmdyaWRPcHRpb25zKTtcblxuICAgIC8qKiBBZGQgY29yZSBmaWx0ZXJzICovXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmlzRXh0ZXJuYWxGaWx0ZXJQcmVzZW50ID0gKCkgPT4gdHJ1ZTtcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZG9lc0V4dGVybmFsRmlsdGVyUGFzcyA9IChyb3c6IFJvd05vZGUpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHZhbGlkYXRlRmlsdGVyKHsgcm93LCBhcGk6IHRoaXMuZ3JpZFF1ZXJ5LmFwaS5ncmlkIH0sIHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpKSAmJiB0aGlzLnJvd01hdGNoZXNTZWFyY2gocm93KVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqIFdyYXAgdGhlIHNlcnZlciBzaWRlIHBhZ2luYXRpb24gZ2V0IHJvd3MgZnVuY3Rpb24gKi9cbiAgICBpZiAodGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKHBhcmFtcy5ncmlkT3B0aW9ucykpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5ibG9ja0xvYWREZWJvdW5jZU1pbGxpcyA9IDMwMDtcbiAgICAgIHRoaXMuX29yaWdpbmFsR2V0Um93cyA9IHBhcmFtcy5ncmlkT3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3M7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZGF0YXNvdXJjZS5nZXRSb3dzID0gdGhpcy53cmFwR2V0Um93cyhwYXJhbXMuZ3JpZE9wdGlvbnMpO1xuICAgICAgLyogVGhlIGNhY2hlIHNpemUgaXMgc3luY2VkIHdpdGggdGhlIHBhZ2luYXRpb24gcGFnZSBzaXplICovXG4gICAgICBjb25zdCBjYWNoZVNpemUgPSBwYXJhbXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgICAgaWYgKGNhY2hlU2l6ZSkge1xuICAgICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuY2FjaGVCbG9ja1NpemUgPSBjYWNoZVNpemU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEVkaXRhYmxlIGNlbGwgKi9cbiAgICB0aGlzLmluaXRFZGl0YWJsZUNvbHVtbnNDZWxsQ2xhc3MocGFyYW1zKTtcblxuICAgIC8qKiBXcmFwIGNvbnRleHQgbWVudSAqL1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5nZXRDb250ZXh0TWVudUl0ZW1zID0gdGhpcy53cmFwQ29udGV4dE1lbnVCdWlsZGVyKHBhcmFtcyk7XG5cbiAgICAvKiogU2F2ZSBncmlkIHNldHRpbmdzICovXG4gICAgY29uc3QgeyBzYXZlU2V0dGluZ3MsIGdyaWROYW1lIH0gPSBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLnNhdmVTZXR0aW5ncyA9IHNhdmVTZXR0aW5ncyAhPT0gZmFsc2UgJiYgIWlzTmlsKGdyaWROYW1lKTtcblxuICAgIC8qKiBTZXJ2ZXIgU2lkZSBQYWdpbmF0aW9uIGZvciBzZWxlY3QgYWxsIG9wdGlvbiAqL1xuICAgIHRoaXMuaW5pdE9uUm93U2VsZWN0ZWRGb3JTZXJ2ZXJTaWRlUGFnaW5hdGlvbihwYXJhbXMpO1xuXG4gICAgLyoqIEFkZCBwaXZvdCBzcGVjaWZpYyByZXF1aXJlZCBzZXR0aW5ncyAqL1xuICAgIGlmIChwYXJhbXMuZ3JpZE9wdGlvbnMucGl2b3RNb2RlKSB7XG4gICAgICB0aGlzLmluaXRQaXZvdFNlY29uZGFyeUNvbHNQcm9jZXNzKHBhcmFtcyk7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuc2F2ZVNldHRpbmdzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5ncmlkT3B0aW9ucy51c2VQaXZvdEdyaWRTdHlsZSkge1xuICAgICAgY29uc3Qgcm93SGVpZ2h0ID0gMzA7XG5cbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZiA9IHtcbiAgICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmRlZmF1bHRDb2xEZWYsXG4gICAgICAgIGNlbGxDbGFzc1J1bGVzOiB0aGlzLmdldFBpdm90TW9kZUNlbGxDbGFzc1J1bGVzKCksXG4gICAgICAgIGhlYWRlckNsYXNzOiB0aGlzLmdldFBpdm90SGVhZGVyQ2xhc3MuYmluZCh0aGlzKSxcbiAgICAgICAgY2VsbFN0eWxlOiBwYXJhbXMgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0eWxlOiBhbnkgPSB7IGxpbmVIZWlnaHQ6IGAke3Jvd0hlaWdodH1weGAgfTtcblxuICAgICAgICAgIGlmIChwYXJhbXMuY29sRGVmLnR5cGUgPT09IERhdG9HcmlkQ29sdW1uVHlwZXMuTnVtYmVyKSB7XG4gICAgICAgICAgICBzdHlsZS50ZXh0QWxpZ24gPSAnZW5kJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XG4gICAgICAgIC4uLnBhcmFtcy5ncmlkT3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYsXG4gICAgICAgIGNlbGxDbGFzc1J1bGVzOiB0aGlzLmdldFBpdm90TW9kZUNlbGxDbGFzc1J1bGVzKCksXG4gICAgICAgIGhlYWRlckNsYXNzOiB0aGlzLmdldFBpdm90SGVhZGVyQ2xhc3MuYmluZCh0aGlzKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zLmdyaWRPcHRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQaXZvdEhlYWRlckNsYXNzKHBhcmFtcykge1xuICAgIGNvbnN0IGdyaWRRdWVyeSA9IHBhcmFtcy5jb2xEZWYuaGVhZGVyQ29tcG9uZW50UGFyYW1zLmdyaWRRdWVyeTtcbiAgICBsZXQgY2VsbENsYXNzID0gJyc7XG5cbiAgICBpZiAoZ3JpZFF1ZXJ5ICYmIGdyaWRRdWVyeS5hcGkpIHtcbiAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gZ3JpZFF1ZXJ5LmFwaSBhcyBEYXRvR3JpZEFwaTtcbiAgICAgIC8qKiBVc2UgZ2V0UGl2b3RSZXN1bHRDb2x1bW5zIGZyb20gdmVyIDI4ICovXG4gICAgICBjb25zdCBwaXZvdENvbHVtbnMgPSBjb2x1bW5zLmdldFNlY29uZGFyeUNvbHVtbnMoKTtcblxuICAgICAgaWYgKHBpdm90Q29sdW1ucyAmJiBwaXZvdENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjZWxsQ2xhc3MgKz0gJ3RvcC1ib3JkZXInO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjZWxsQ2xhc3M7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUNvbHVtbnMoY29sRGVmczogRGF0b0dyaWRDb2x1bW5EZWZbXSwgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyA9IG51bGwpOiBEYXRvR3JpZENvbHVtbkRlZltdIHtcbiAgICBpZiAoIWdyaWRPcHRpb25zKSB7XG4gICAgICBncmlkT3B0aW9ucyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZWRDb2xEZWZzID0gY29sRGVmcy5tYXAoKGNvbDogRGF0b0dyaWRDb2x1bW5EZWYpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICAgIC4uLmNvbCxcbiAgICAgICAgaGVhZGVyTmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKGNvbC5oZWFkZXJOYW1lKVxuICAgICAgfTtcbiAgICAgIC8qKiBBZGp1c3QgdGhlIHdpZHRoIGluIGNhc2UgdGhlIGNvbHVtbiBoYXMgaW5mbyAqL1xuICAgICAgaWYgKGNvbC5pbmZvKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQubWluV2lkdGggPSBjb2wubWluV2lkdGggfHwgR3JpZE1pbldpZHRocy5XaXRoX0luZm87XG4gICAgICB9XG4gICAgICBpZiAoIWNvbC5jb2xJZCkge1xuICAgICAgICBub3JtYWxpemVkLmNvbElkID0gY29sLmZpZWxkO1xuICAgICAgfVxuICAgICAgaWYgKG5vcm1hbGl6ZWQudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5JdGVtcyAmJiAhbm9ybWFsaXplZC5maWx0ZXJzQ29uZmlnKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuZmlsdGVyc0NvbmZpZyA9IHsgc2VjdGlvbnM6IERhdG9HcmlkRmlsdGVyU2VjdGlvbnMuQ29uZGl0aW9uYWwgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm9ybWFsaXplQ29sdW1uU2VhcmNoQ29uZmlnKGdyaWRPcHRpb25zLCBjb2wsIG5vcm1hbGl6ZWQpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hZGRNdWx0aVNlbGVjdEhlYWRlckNvbHVtbklmUmVxdWlyZWQodXBkYXRlZENvbERlZnMsIGdyaWRPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQ29sdW1uU2VhcmNoQ29uZmlnKFxuICAgIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMsXG4gICAgY29sOiBEYXRvR3JpZENvbHVtbkRlZixcbiAgICBub3JtYWxpemVkOiBEYXRvR3JpZENvbHVtbkRlZlxuICApIHtcbiAgICAvKiogQ2hlY2sgaWYgY29sdW1uIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHNlYXJjaCAqKi9cbiAgICBjb25zdCBpc1NlcnZlclBhZ2luYXRpb24gPSB0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZE9wdGlvbnMpO1xuICAgIGlmICh0eXBlb2YgY29sLmluY2x1ZGVJblNlYXJjaCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChpc1NlcnZlclBhZ2luYXRpb24gJiYgY29sLnR5cGUgPT09IERhdG9HcmlkQ29sdW1uVHlwZXMuRGF0ZSkge1xuICAgICAgICBub3JtYWxpemVkLmluY2x1ZGVJblNlYXJjaCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZC5pbmNsdWRlSW5TZWFyY2ggPVxuICAgICAgICAgIHR5cGVvZiBncmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gZ3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHRcbiAgICAgICAgICAgIDogZGVmYXVsdEdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBub3JtYWxpemVkLmluY2x1ZGVJblNlYXJjaCAmJlxuICAgICAgIXRoaXMuaGFzQ2VsbFJlbmRlcmVyKG5vcm1hbGl6ZWQsIGdyaWRPcHRpb25zKSAmJlxuICAgICAgZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0XG4gICAgKSB7XG4gICAgICBub3JtYWxpemVkLmNlbGxSZW5kZXJlciA9IChwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgYWxsb3dIVE1MID0gaXNIdG1sQWxsb3dlZEZvckNvbChncmlkT3B0aW9ucywgcGFyYW1zLmNvbERlZik7XG4gICAgICAgIGNvbnN0IGlzRWRpdGFibGUgPVxuICAgICAgICAgIChpc0Z1bmN0aW9uKG5vcm1hbGl6ZWQuZWRpdGFibGUpICYmIG5vcm1hbGl6ZWQuZWRpdGFibGUocGFyYW1zKSkgfHxcbiAgICAgICAgICAoIWlzRnVuY3Rpb24obm9ybWFsaXplZC5lZGl0YWJsZSkgJiYgbm9ybWFsaXplZC5lZGl0YWJsZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzRWRpdGFibGVcbiAgICAgICAgICA/IGVkaXRhYmxlQ2VsbFJlbmRlcmVyV2l0aFNlYXJjaEhpZ2hsaWdodChwYXJhbXMsIHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSwgYWxsb3dIVE1MKVxuICAgICAgICAgIDogc2VhcmNoSGlnaGxpZ2h0Q2VsbFJlbmRlcmVyKHBhcmFtcywgdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpLCBhbGxvd0hUTUwpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0NlbGxSZW5kZXJlcihjb2x1bW46IERhdG9HcmlkQ29sdW1uRGVmLCBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgaWYgKGNvbHVtbi5jZWxsUmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gY29sdW1uLnR5cGUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIgPSAob3B0aW9uczogUGFydGlhbDxEYXRvR3JpZE9wdGlvbnM+KTogYm9vbGVhbiA9PlxuICAgICAgb3B0aW9ucy5jb2x1bW5UeXBlcyAmJiAhIW9wdGlvbnMuY29sdW1uVHlwZXNbdHlwZV0gJiYgISFvcHRpb25zLmNvbHVtblR5cGVzW3R5cGVdLmNlbGxSZW5kZXJlcjtcblxuICAgIHJldHVybiBjb2x1bW5UeXBlSGFzQ2VsbFJlbmRlcmVyKGdyaWRPcHRpb25zKSB8fCBjb2x1bW5UeXBlSGFzQ2VsbFJlbmRlcmVyKGRlZmF1bHRHcmlkT3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFkZE11bHRpU2VsZWN0SGVhZGVyQ29sdW1uSWZSZXF1aXJlZChcbiAgICBjb2x1bW5EZWZzOiBEYXRvR3JpZENvbHVtbkRlZltdLFxuICAgIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnNcbiAgKTogRGF0b0dyaWRDb2x1bW5EZWZbXSB7XG4gICAgY29uc3Qgc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9IGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLnNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXM7XG4gICAgY29uc3Qgcm93U2VsZWN0aW9uID1cbiAgICAgIGdyaWRPcHRpb25zICYmIGdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbiA/IGdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbiA6IGRlZmF1bHRHcmlkT3B0aW9ucy5yb3dTZWxlY3Rpb247XG5cbiAgICBpZiAoc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyAmJiByb3dTZWxlY3Rpb24gPT09IEdyaWRSb3dTZWxlY3Rpb25UeXBlLk1VTFRJUExFKSB7XG4gICAgICBjb25zdCBjaGVja2JveGVzQ29sdW1uOiBEYXRvR3JpZENvbHVtbkRlZiA9IHtcbiAgICAgICAgY29sSWQ6IHRoaXMuQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRCxcbiAgICAgICAgY2hlY2tib3hTZWxlY3Rpb246IHRydWUsXG4gICAgICAgIGhlYWRlckNvbXBvbmVudEZyYW1ld29yazogRGF0b0dyaWRNdWx0aVNlbGVjdENvbHVtbkhlYWRlckNvbXBvbmVudCxcbiAgICAgICAgd2lkdGg6IDMwLFxuICAgICAgICBtYXhXaWR0aDogMzAsXG4gICAgICAgIHN1cHByZXNzU2l6ZVRvRml0OiB0cnVlLFxuICAgICAgICBjZWxsQ2xhc3M6ICdjaGVja2JveC1zZWxlY3Rpb24tY2VsbCcsXG4gICAgICAgIGhlYWRlckNsYXNzOiAnaGVhZGVyLWNoZWNrYm94LXNlbGVjdGlvbi1jZWxsJyxcbiAgICAgICAgcmVzaXphYmxlOiBmYWxzZSxcbiAgICAgICAgcGlubmVkOiAnbGVmdCcsXG4gICAgICAgIGxvY2tQb3NpdGlvbjogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZUluU2VhcmNoOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHJldHVybiBbY2hlY2tib3hlc0NvbHVtbiwgLi4uY29sdW1uRGVmc107XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5EZWZzO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0T25Sb3dTZWxlY3RlZEZvclNlcnZlclNpZGVQYWdpbmF0aW9uKHsgZ3JpZE9wdGlvbnMgfTogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIGlmICghdGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRPcHRpb25zKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHRlcm5hbE9uUm93U2VsZWN0ZWQgPSBncmlkT3B0aW9ucy5vblJvd1NlbGVjdGVkO1xuICAgIGdyaWRPcHRpb25zLm9uUm93U2VsZWN0ZWQgPSAoZXZ0OiBSb3dTZWxlY3RlZEV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTZWxlY3RBbGxSb3dzRW5hYmxlZCkge1xuICAgICAgICBjb25zdCBub2RlID0gZXZ0Lm5vZGU7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBub2RlLmlzU2VsZWN0ZWQoKTtcbiAgICAgICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgICAgIGNvbnN0IGlzRXhjbHVkZWQgPSBleGNsdWRlZEZyb21TZWxlY3RBbGwuaW5jbHVkZXMobm9kZS5pZCk7XG4gICAgICAgIGlmIChpc1NlbGVjdGVkICYmIGlzRXhjbHVkZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHtcbiAgICAgICAgICAgIGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmZpbHRlcigobm9kZUlkOiBzdHJpbmcpID0+IG5vZGVJZCAhPT0gbm9kZS5pZClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNTZWxlY3RlZCAmJiAhaXNFeGNsdWRlZCkge1xuICAgICAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyBleGNsdWRlZEZyb21TZWxlY3RBbGw6IFsuLi5leGNsdWRlZEZyb21TZWxlY3RBbGwsIG5vZGUuaWRdIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXh0ZXJuYWxPblJvd1NlbGVjdGVkKSB7XG4gICAgICAgIGV4dGVybmFsT25Sb3dTZWxlY3RlZChldnQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJvd01hdGNoZXNTZWFyY2gocm93OiBSb3dOb2RlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VhcmNoVGVybSA9ICh0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCkgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGlmIChpc0VtcHR5KHNlYXJjaFRlcm0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuaW5jbHVkZUhpZGRlbkNvbHVtbnNJblNlYXJjaFxuICAgICAgPyB0aGlzLmdyaWRRdWVyeS5nZXRBbGxDb2x1bW5zKClcbiAgICAgIDogdGhpcy5ncmlkUXVlcnkuZ2V0QWxsRGlzcGxheWVkQ29sdW1ucygpO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbERlZiA9IHRoaXMuYXBpLmdyaWQuZ2V0Q29sdW1uRGVmKGNvbC5nZXRDb2xJZCgpKSBhcyBEYXRvR3JpZENvbHVtbkRlZjtcbiAgICAgIGlmICghY29sRGVmLmluY2x1ZGVJblNlYXJjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvd1ZhbHVlID0gKHRoaXMuYXBpLmdyaWQuZ2V0VmFsdWUoY29sLmdldENvbElkKCksIHJvdykgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChyb3dWYWx1ZS5pbmNsdWRlcyhzZWFyY2hUZXJtKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmaXRHcmlkKCdjb250YWluZXInKSBpbnN0ZWFkXG4gICAqL1xuICBmaXRUb0NvbnRhaW5lcigpIHtcbiAgICB0aGlzLmFwaS5ncmlkLnNpemVDb2x1bW5zVG9GaXQoKTtcbiAgfVxuXG4gIGdldEN1c3RvbUhlYWRlcihmaWVsZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcykge1xuICAgICAgY29uc3Qgc3BlY2lmaWMgPSB0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMuZmluZCgoeyBjb2x1bW4gfSkgPT4gY29sdW1uID09PSBmaWVsZCk7XG4gICAgICBjb25zdCBjb21tb24gPSB0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMuZmluZCgoeyBjb2x1bW4gfSkgPT4gIWNvbHVtbik7XG4gICAgICBpZiAoc3BlY2lmaWMgfHwgY29tbW9uKSB7XG4gICAgICAgIGNvbnN0IHsgbW9yZU1lbnUsIGN1c3RvbUhlYWRlciB9ID0ge1xuICAgICAgICAgIG1vcmVNZW51OiAoc3BlY2lmaWMgJiYgc3BlY2lmaWMubW9yZU1lbnUpIHx8IChjb21tb24gJiYgY29tbW9uLm1vcmVNZW51KSxcbiAgICAgICAgICBjdXN0b21IZWFkZXI6IChzcGVjaWZpYyAmJiBzcGVjaWZpYy5jdXN0b21IZWFkZXIpIHx8IChjb21tb24gJiYgY29tbW9uLmN1c3RvbUhlYWRlcilcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHsgbW9yZU1lbnU6IG1vcmVNZW51ICYmIG1vcmVNZW51LnRwbCwgY3VzdG9tSGVhZGVyOiBjdXN0b21IZWFkZXIgJiYgY3VzdG9tSGVhZGVyLnRwbCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNsZWFyQWxsRmlsdGVycygpIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlcjoge30sXG4gICAgICAgICAgc2VhcmNoVGVybTogbnVsbFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gIH1cblxuICBjbGVhckNvbHVtbkZpbHRlcihjb2x1bW5GaWVsZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBbY29sdW1uRmllbGRdOiBkZWxldGVkLCAuLi5maWx0ZXIgfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgZmlsdGVyXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIHNldENvbHVtbkZpbHRlcihjb2x1bW46IENvbHVtbiwgZmlsdGVyOiBEYXRvR3JpZEZpbHRlciwgbm90aWZ5R3JpZCA9IHRydWUpIHtcbiAgICB0aGlzLl9sb2dFdmVudChDb3JlRXZlbnRUeXBlcy5HUklEX0ZJTFRFUl9BUFBMSUVELCB7XG4gICAgICBjb2x1bW46IGNvbHVtbi5nZXRDb2xJZCgpLFxuICAgICAgbnVtT2ZDb25kaXRpb25zOiAoZmlsdGVyLmNvbmRpdGlvbmFsICYmIGZpbHRlci5jb25kaXRpb25hbC5jb25kaXRpb25zLmxlbmd0aCkgfHwgMCxcbiAgICAgIGJ5VmFsdWU6ICEhZmlsdGVyLmJ5VmFsdWUgPyAnWWVzJyA6ICdObydcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlRmlsdGVyKGNvbHVtbiwgZmlsdGVyKTtcblxuICAgIGlmIChub3RpZnlHcmlkKSB7XG4gICAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldEdyaWRGaWx0ZXJzKGZpbHRlcnM6IERhdG9HcmlkRXh0ZXJuYWxGaWx0ZXJbXSkge1xuICAgIGlmICh0aGlzLmFwaSAmJiBmaWx0ZXJzKSB7XG4gICAgICBsZXQgYXBwbGllZEZpbHRlciA9IHt9O1xuXG4gICAgICBmb3IgKGNvbnN0IHsgZmlsdGVyLCBmaWVsZCB9IG9mIGZpbHRlcnMpIHtcbiAgICAgICAgYXBwbGllZEZpbHRlcltmaWVsZF0gPSBmaWx0ZXI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoeyBmaWx0ZXI6IGFwcGxpZWRGaWx0ZXIgfSk7XG4gICAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFNvcnRCeUNvbHVtbihjb2xJZCwgc29ydCkge1xuICAgIGNvbnN0IHNvcnRUb1NldCA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNvcnQoeyBjb2xJZCwgc29ydCB9KTtcblxuICAgIHRoaXMuc2V0R3JpZFNvcnQoc29ydFRvU2V0KTtcbiAgfVxuXG4gIHNldEdyaWRTb3J0KGdyaWRTb3J0OiBEYXRvR3JpZFNvcnQpIHtcbiAgICBpZiAoZ3JpZFNvcnQgJiYgdGhpcy5hcGkgJiYgdGhpcy5hcGkuZ3JpZC5nZXREaXNwbGF5ZWRSb3dDb3VudCgpID4gMCkge1xuICAgICAgY29uc3QgeyBjb2xJZCwgc29ydCwgc29ydEluZGV4IH0gPSBncmlkU29ydDtcbiAgICAgIGNvbnN0IGdyaWRDb2x1bW5zID0gdGhpcy5hcGkuY29sdW1ucy5nZXRBbGxHcmlkQ29sdW1ucygpO1xuXG4gICAgICBpZiAoZ3JpZENvbHVtbnMpIHtcbiAgICAgICAgbGV0IHNvcnRUb0FwcGx5ID0gZ3JpZFNvcnQ7XG4gICAgICAgIC8qKiBTb3J0IGJ5IGNvbHVtbiBpZCAqL1xuICAgICAgICBjb25zdCBjb2x1bW5CeUlkID0gZ3JpZENvbHVtbnMuZmluZCgoY29sOiBDb2x1bW4pID0+IHtcbiAgICAgICAgICByZXR1cm4gKGNvbC5nZXRDb2xEZWYoKS5zaG93Um93R3JvdXAgfHwgY29sLmdldENvbElkKCkpID09PSBjb2xJZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbHVtbkJ5SWQpIHtcbiAgICAgICAgICBzb3J0VG9BcHBseSA9IHsgY29sSWQ6IGNvbHVtbkJ5SWQuZ2V0Q29sSWQoKSwgc29ydCB9O1xuICAgICAgICB9IGVsc2UgaWYgKCFpc05pbChzb3J0SW5kZXgpKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVDb2x1bW5zID0gdGhpcy5hcGkuY29sdW1ucy5nZXRWYWx1ZUNvbHVtbnMoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZUNvbHVtbiA9IHZhbHVlQ29sdW1ucy5maW5kKChjb2w6IENvbHVtbikgPT4gY29sLmdldENvbElkKCkgPT09IGNvbElkKTtcbiAgICAgICAgICBjb25zdCBpc1Bpdm90Q29sSWQgPSBjb2xJZC5zdGFydHNXaXRoKCdwaXZvdCcpO1xuXG4gICAgICAgICAgaWYgKGlzUGl2b3RDb2xJZCB8fCB2YWx1ZUNvbHVtbikge1xuICAgICAgICAgICAgLyoqIENvbHVtbiBpcyBwaXZvdCB2YWx1ZSBjb2x1bW4sIHNvcnQgYnkgaW5kZXggKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkJ5SW5kZXggPSBncmlkQ29sdW1uc1tzb3J0SW5kZXhdO1xuXG4gICAgICAgICAgICBzb3J0VG9BcHBseSA9IHsgY29sSWQ6IGNvbHVtbkJ5SW5kZXguZ2V0Q29sSWQoKSwgc29ydCwgc29ydEluZGV4IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyh7IHNvcnQ6IHNvcnRUb0FwcGx5IH0pO1xuICAgICAgICB0aGlzLmFwaS5ncmlkLnNldFNvcnRNb2RlbChbc29ydFRvQXBwbHldKTtcblxuICAgICAgICBpZiAoKHRoaXMuZ3JpZFJlZi5ncmlkT3B0aW9ucyBhcyBEYXRvR3JpZE9wdGlvbnMpLnVzZVBpdm90R3JpZFN0eWxlKSB7XG4gICAgICAgICAgdGhpcy5hcGkuZ3JpZC5yZWRyYXdSb3dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlcihjb2x1bW46IENvbHVtbiwgZmlsdGVyOiBEYXRvR3JpZEZpbHRlcikge1xuICAgIGNvbnN0IGNvbEZpZWxkID0gZ2V0Q29sRmllbGQoY29sdW1uLmdldENvbERlZigpKTtcblxuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncy5maWx0ZXIsXG4gICAgICAgICAgICBbY29sRmllbGRdOiBmaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzZXRTZWFyY2hUZXJtKHNlYXJjaFRlcm06IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgc2VhcmNoVGVybVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gIH1cblxuICBzZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbihjb25maWc6IFBhcnRpYWw8U2VydmVyU2lkZVBhZ2luYXRpb25Db25maWc+KSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VydmVyU2lkZVBhZ2luYXRpb246IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXJ2ZXJTaWRlUGFnaW5hdGlvbixcbiAgICAgICAgICAuLi5jb25maWdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldExvYWRpbmcoc2hvdzogYm9vbGVhbikge1xuICAgIGlmIChzaG93KSB7XG4gICAgICB0aGlzLmFwaS5ncmlkLnNob3dMb2FkaW5nT3ZlcmxheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwaS5ncmlkLmdldERpc3BsYXllZFJvd0NvdW50KCkgPT09IDAgPyB0aGlzLnNldE92ZXJsYXkodHJ1ZSkgOiB0aGlzLnNldE92ZXJsYXkoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0T3ZlcmxheSBpbnN0ZWFkXG4gICAqIEBwYXJhbSBzaG93XG4gICAqL1xuICBzZXROb0RhdGEoc2hvdzogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0T3ZlcmxheShzaG93KTtcbiAgfVxuXG4gIHNldE92ZXJsYXkoc2hvdzogYm9vbGVhbikge1xuICAgIHNob3cgPyB0aGlzLmFwaS5ncmlkLnNob3dOb1Jvd3NPdmVybGF5KCkgOiB0aGlzLmFwaS5ncmlkLmhpZGVPdmVybGF5KCk7XG4gIH1cblxuICB1cGRhdGVTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgLi4uc2V0dGluZ3NcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpdEdyaWQodG86ICdjb250YWluZXInIHwgJ2NvbnRlbnQnKSB7XG4gICAgdG8gPT09ICdjb250YWluZXInID8gdGhpcy5hcGkuZ3JpZC5zaXplQ29sdW1uc1RvRml0KCkgOiB0aGlzLmFwaS5jb2x1bW5zLmF1dG9TaXplQWxsQ29sdW1ucygpO1xuICAgIGNvbnN0IGdyaWRBbGlnbm1lbnQgPSB0byA9PT0gJ2NvbnRhaW5lcicgPyBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEFJTkVSIDogRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRFTlQ7XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyh7IGdyaWRBbGlnbm1lbnQsIGNvbHVtbnNTaXplczogbnVsbCB9KTtcbiAgfVxuXG4gIHNhdmVTZXR0aW5nc1RvU2VydmVyKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgY29uc3QgaXNHbG9iYWwgPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmlzR2xvYmFsU2V0dGluZ3M7XG4gICAgdGhpcy5zdG9yYWdlQVBJLnNldCh0aGlzLmdyaWROYW1lLCBzZXR0aW5ncywgaXNHbG9iYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCB1c2VkIHRvIGxvZyBncmlkIGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBsb2dnaW5nIHNlcnZpY2VcbiAgICovXG4gIF9sb2dFdmVudChldmVudFR5cGU6IENvcmVFdmVudFR5cGVzLCBldmVudFByb3BlcnRpZXM/OiBIYXNoTWFwPGFueT4pIHtcbiAgICB0aGlzLmxvZ2dlci5sb2dFdmVudChldmVudFR5cGUsIHsgdGFibGU6IHRoaXMuZ3JpZE5hbWUsIC4uLmV2ZW50UHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcFN1Y2Nlc3NDYWxsYmFjayh7IHN1Y2Nlc3NDYiwgcGFnZU51bWJlciwgaXNQZW5kaW5nUmV0dXJuVG9QYWdlIH06IFN1Y2Nlc3NXcmFwcGVyUGFyYW1zKSB7XG4gICAgcmV0dXJuIChyb3dzVGhpc0Jsb2NrOiBhbnlbXSwgdG90YWxSb3dzOiBudW1iZXIpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyB0b3RhbFJvd3MsIGhhc0Vycm9yOiBmYWxzZSB9KTtcbiAgICAgIHN1Y2Nlc3NDYihyb3dzVGhpc0Jsb2NrLCB0b3RhbFJvd3MpO1xuICAgICAgdGhpcy5ncmlkUXVlcnkuX3NlcnZlckRhdGFMb2FkZWQubmV4dCh7XG4gICAgICAgIGFwaTogdGhpcy5hcGkuZ3JpZCxcbiAgICAgICAgY29sdW1uQXBpOiB0aGlzLmFwaS5jb2x1bW5zLFxuICAgICAgICB0eXBlOiAnU2VydmVyRGF0YUxvYWRlZCcsXG4gICAgICAgIHBhZ2luYXRpb25QYWdlOiBwYWdlTnVtYmVyXG4gICAgICB9KTtcbiAgICAgIGlmICghaXNQZW5kaW5nUmV0dXJuVG9QYWdlKSB7XG4gICAgICAgIHRoaXMuc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIC8qKiBzbyB0aGUgZ3JpZCBmaXRzIGluIGV2ZXJ5IG5ldyBkYXRhIGlucHV0ICovXG4gICAgICAgIHRyaWdnZXJXaW5kb3dSZXNpemUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFRvdGFsUm93cyA9IHRvdGFsUm93cztcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwR2V0Um93cyhvcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMsIGdldFJvd3M/OiAocGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHZvaWQpIHtcbiAgICBjb25zdCBnZXRSb3dzQ2IgPSBnZXRSb3dzIHx8IG9wdGlvbnMuZGF0YXNvdXJjZS5nZXRSb3dzO1xuICAgIHJldHVybiAoZ2V0Um93c1BhcmFtczogSUdldFJvd3NQYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IHsgc3RhcnRSb3csIGVuZFJvdywgc29ydE1vZGVsLCBzdWNjZXNzQ2FsbGJhY2sgfSA9IGdldFJvd3NQYXJhbXM7XG4gICAgICBjb25zdCBwYWdlU2l6ZSA9IG9wdGlvbnMucGFnaW5hdGlvblBhZ2VTaXplIHx8IDEwMDtcbiAgICAgIGNvbnN0IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkID0gdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPiAwO1xuICAgICAgY29uc3QgaXNQZW5kaW5nUmV0dXJuVG9QYWdlID0gaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWQgJiYgc3RhcnRSb3cgPT09IDA7XG5cbiAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZFxuICAgICAgICA/IHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoICsgMVxuICAgICAgICA6IE1hdGguY2VpbChlbmRSb3cgLyBwYWdlU2l6ZSk7XG5cbiAgICAgIHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gLTE7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgICAgY29uc3QgbmV3UGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMgPSB7XG4gICAgICAgIC4uLmdldFJvd3NQYXJhbXMsXG4gICAgICAgIGZhaWxDYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyBoYXNFcnJvcjogdHJ1ZSB9KTtcbiAgICAgICAgICB0aGlzLnNldE92ZXJsYXkodHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3NDYWxsYmFjazogdGhpcy53cmFwU3VjY2Vzc0NhbGxiYWNrKHsgcGFnZU51bWJlciwgc3VjY2Vzc0NiOiBzdWNjZXNzQ2FsbGJhY2ssIGlzUGVuZGluZ1JldHVyblRvUGFnZSB9KSxcbiAgICAgICAgc2VydmVyQ29uZmlnOiB7XG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgICBjb2x1bW5GaWx0ZXJzOiBpc0VtcHR5KGZpbHRlcikgfHwgb3B0aW9ucy5lbmFibGVWMl8xID8gbnVsbCA6IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVycyhmaWx0ZXIpLFxuICAgICAgICAgIGZpbHRlcjogb3B0aW9ucy5lbmFibGVWMl8xID8gdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEob3B0aW9ucy5jb2x1bW5EZWZzKSA6IG51bGwsXG4gICAgICAgICAgc29ydDogdGhpcy5idWlsZFNlcnZlclJlcXVlc3RTb3J0KHNvcnRNb2RlbClcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UpIHtcbiAgICAgICAgLy8gU2NlbmFyaW8gdGhlIGZvbGxvd2luZyBoYW5kbGVzIC0gc2VydmVyIHJlZnJlc2ggd2hlcmUgaXQgd2FzIHJlcXVlc3RlZCB0byBrZWVwIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICAgIC8vIFRoZSBwcm9ibGVtIC0gZ2V0Um93cyB3aWxsIGluaXRpYWxseSBiZSBjYWxsZWQgZm9yIHBhZ2UgMSAoYXV0b21hdGljYWxseSBoYXBwZW5zIHdoZW4gY2FsbGluZyBhZy1ncmlkJ3Mgc2V0RGF0YVNvdXJjZSkuXG4gICAgICAgIC8vIEluIG9yZGVyIHRvIHRyaWdnZXIgaXQgYWdhaW4sIHN1Y2Nlc3NDYWxsYmFjayBpcyBjYWxsZWQgd2l0aCB0aGUgZGVzaXJlZCBwYWdlLlxuICAgICAgICAvLyBmYWtlR2V0Um93cyBpcyB1c2VkIGluIG9yZGVyIHRvIGF2b2lkIHJldHJpZXZpbmcgdGhlIHVubmVjZXNzYXJ5IHJlYWwgZGF0YSBmb3IgcGFnZSAxLlxuICAgICAgICBjb25zdCBmYWtlR2V0Um93cyA9ICh7IHN1Y2Nlc3NDYWxsYmFjayB9OiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHtcbiAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soW10sIHRoaXMubGFzdFRvdGFsUm93cyk7XG4gICAgICAgIH07XG4gICAgICAgIGZha2VHZXRSb3dzKG5ld1BhcmFtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRSb3dzQ2IobmV3UGFyYW1zKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RWRpdGFibGVDb2x1bW5zQ2VsbENsYXNzKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzLmZvckVhY2goY29sRGVmID0+IHtcbiAgICAgIGlmIChjb2xEZWYuZWRpdGFibGUpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29sRGVmLmVkaXRhYmxlKSkge1xuICAgICAgICAgIGNvbnN0IGluaXRpYWxDZWxsQ2xhc3MgPSBjb2xEZWYuY2VsbENsYXNzO1xuICAgICAgICAgIGNvbERlZi5jZWxsQ2xhc3MgPSAoY2VsbENsYXNzUGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzRWRpdGFibGUgPSAoY29sRGVmLmVkaXRhYmxlIGFzIEZ1bmN0aW9uKShjZWxsQ2xhc3NQYXJhbXMgYXMgYW55KTtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlUmVzdWx0ID0gdGhpcy5hZGRFZGl0YWJsZUNlbGxDbGFzcyhpbml0aWFsQ2VsbENsYXNzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZWRpdGFibGVSZXN1bHQpID8gZWRpdGFibGVSZXN1bHQoY2VsbENsYXNzUGFyYW1zKSA6IGVkaXRhYmxlUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oaW5pdGlhbENlbGxDbGFzcykgPyBpbml0aWFsQ2VsbENsYXNzKGNlbGxDbGFzc1BhcmFtcykgOiBpbml0aWFsQ2VsbENsYXNzO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sRGVmLmNlbGxDbGFzcyA9IHRoaXMuYWRkRWRpdGFibGVDZWxsQ2xhc3MoY29sRGVmLmNlbGxDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcENvbnRleHRNZW51QnVpbGRlcihwYXJhbXM6IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBjb25zdCB7IGN1c3RvbUNvbnRleHRNZW51IH0gPSBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gICAgY29uc3QgYWxsQWN0aW9ucyA9IGlzRnVuY3Rpb24oY3VzdG9tQ29udGV4dE1lbnUpID8gY3VzdG9tQ29udGV4dE1lbnUocGFyYW1zLnJvd0FjdGlvbnMpIDogcGFyYW1zLnJvd0FjdGlvbnM7XG4gICAgdGhpcy50cmFuc2xhdGVBY3Rpb25MYWJlbHMoYWxsQWN0aW9ucyk7XG4gICAgY29uc3QgY29weUFjdGlvbjogUm93QWN0aW9uID0ge1xuICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybSgnY29yZS5jb3B5LWNlbGwnKSxcbiAgICAgIGljb246ICdjb3B5JyxcbiAgICAgIGtleTogJ0NvcHkgQ2VsbCdcbiAgICB9O1xuICAgIHJldHVybiAoeyBub2RlLCBjb2x1bW4sIGNvbnRleHQgfTogR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcykgPT4ge1xuICAgICAgY29uc3Qgb25Ib3ZlckFjdGlvbk1lbnUgPSBjb250ZXh0ICYmIGNvbnRleHQuY29udGV4dE1lbnUgJiYgY29udGV4dC5jb250ZXh0TWVudS5mcm9tT25Ib3ZlcjtcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuIFtdO1xuICAgICAgbGV0IHNlbGVjdGVkID0gW25vZGVdO1xuICAgICAgbGV0IHJvd3NDb3VudCA9IDE7XG4gICAgICBpZiAob25Ib3ZlckFjdGlvbk1lbnUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkQ29udGV4dCh7IGNvbnRleHRNZW51OiB7IGZyb21PbkhvdmVyOiBmYWxzZSB9IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29weUFjdGlvbi5vbkNsaWNrID0gKFtyb3ddKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLmFwaS5ncmlkLmdldFZhbHVlKGNvbHVtbi5nZXRDb2xJZCgpLCByb3cpO1xuICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IGNvbHVtbi5nZXRDb2xEZWYoKS52YWx1ZUZvcm1hdHRlcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1hdHRlciA/IGZvcm1hdHRlcihyYXdWYWx1ZSkgOiByYXdWYWx1ZTtcbiAgICAgICAgICBjb3B5VG9DbGlwYm9hcmQodmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAobm9kZS5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICBzZWxlY3RlZCA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNlbGVjdGVkUm93Tm9kZXMoKTtcbiAgICAgICAgICByb3dzQ291bnQgPSBzaXplKHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgdmlzaWJsZUFjdGlvbnMgPSBnZXRWaXNpYmxlQWN0aW9ucyhcbiAgICAgICAgYWxsQWN0aW9ucyxcbiAgICAgICAgcm93c0NvdW50LFxuICAgICAgICBzZWxlY3RlZCxcbiAgICAgICAgdGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTZWxlY3RBbGxSb3dzRW5hYmxlZFxuICAgICAgKS5maWx0ZXIoKHsgdmlzaWJsZSB9KSA9PiB2aXNpYmxlKTtcbiAgICAgIGxldCB0b29sYmFyQWN0aW9ucyA9IFtjb3B5QWN0aW9uXTtcbiAgICAgIGlmIChvbkhvdmVyQWN0aW9uTWVudSkge1xuICAgICAgICB0b29sYmFyQWN0aW9ucyA9IHZpc2libGVBY3Rpb25zO1xuICAgICAgfSBlbHNlIGlmICh2aXNpYmxlQWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zID0gW3sgLi4uY29weUFjdGlvbiwgc2VwYXJhdG9yOiB0cnVlIH0sIC4uLnZpc2libGVBY3Rpb25zXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnZlcnRlclBhcmFtczogQWN0aW9uQ29udmVydGVyUGFyYW1zID0ge1xuICAgICAgICB0b29sYmFyQWN0aW9ucyxcbiAgICAgICAgc2VsZWN0ZWRSb3dzOiBzZWxlY3RlZCxcbiAgICAgICAgaWNvblJlZ2lzdHJ5OiB0aGlzLnN2Z1JlZ2lzdHJ5LFxuICAgICAgICBub2RlLFxuICAgICAgICBsb2dnZXI6IHtcbiAgICAgICAgICBsb2c6IHRoaXMuX2xvZ0V2ZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgZXZlbnRPcmlnaW46IG9uSG92ZXJBY3Rpb25NZW51ID8gJ09uIEhvdmVyJyA6ICdDb250ZXh0IE1lbnUnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gdG9vbGJhckFjdGlvblRvQ29udGV4dEFjdGlvbihjb252ZXJ0ZXJQYXJhbXMpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhbGxBY3Rpb25zOiBSb3dBY3Rpb25bXSkge1xuICAgIGFsbEFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgYWN0aW9uLmxhYmVsID0gdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKGFjdGlvbi5sYWJlbCk7XG4gICAgICBpZiAoYWN0aW9uLnN1Yk1lbnUpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVBY3Rpb25MYWJlbHMoYWN0aW9uLnN1Yk1lbnUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9hZFNhdmVkU2V0dGluZ3Moc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICBjb25zdCB7XG4gICAgICBzb3J0LFxuICAgICAgaGlkZGVuQ29sdW1ucyxcbiAgICAgIGZpbHRlcixcbiAgICAgIGdyb3VwZWRDb2x1bW5zLFxuICAgICAgY29sdW1uc1NpemVzLFxuICAgICAgcGlubmVkQ29sdW1ucyxcbiAgICAgIGNvbHVtbnNPcmRlcixcbiAgICAgIGdyaWRBbGlnbm1lbnRcbiAgICB9ID0gc2V0dGluZ3M7XG4gICAgY29uc3QgeyBncmlkLCBjb2x1bW5zIH0gPSB0aGlzLmFwaTtcbiAgICAvKiBIaWRlIGNvbHVtbnMgKi9cbiAgICAvKiBOT1RFOiBjb2x1bW5zIG9yZGVyIGFyZSB0cmVhdGVkIGFzIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBjb2x1bW5zICovXG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZSh0aGlzLmluaXRpYWxTZXR0aW5ncy5jb2x1bW5zT3JkZXIsIHRydWUpO1xuICAgIGNvbnN0IGNvbHVtblRvSGlkZSA9ICFpc05pbChoaWRkZW5Db2x1bW5zKSA/IGhpZGRlbkNvbHVtbnMgOiB0aGlzLmluaXRpYWxTZXR0aW5ncy5oaWRkZW5Db2x1bW5zO1xuICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUoY29sdW1uVG9IaWRlLCBmYWxzZSk7XG5cbiAgICAvKiBBcHBseSBmaWx0ZXJzICovXG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgZ3JpZC5vbkZpbHRlckNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICAvKiBHcm91cCBjb2x1bW5zICovXG4gICAgY29uc3QgYWxsR3JvdXBlZENvbHVtbnMgPSBjb2x1bW5zLmdldFJvd0dyb3VwQ29sdW1ucygpO1xuICAgIGxldCByZW1vdmVHcm91cGVkO1xuICAgIGlmIChncm91cGVkQ29sdW1ucykge1xuICAgICAgcmVtb3ZlR3JvdXBlZCA9IGFsbEdyb3VwZWRDb2x1bW5zLmZpbHRlcihjb2wgPT4gIWdyb3VwZWRDb2x1bW5zLmluY2x1ZGVzKGNvbC5nZXRDb2xJZCgpKSk7XG4gICAgICBjb2x1bW5zLmFkZFJvd0dyb3VwQ29sdW1ucyhncm91cGVkQ29sdW1ucyk7XG4gICAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKGdyb3VwZWRDb2x1bW5zLCBmYWxzZSk7XG4gICAgfVxuICAgIGNvbHVtbnMucmVtb3ZlUm93R3JvdXBDb2x1bW5zKHJlbW92ZUdyb3VwZWQpO1xuICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUocmVtb3ZlR3JvdXBlZCwgdHJ1ZSk7XG5cbiAgICAvKiBBcHBseSBzb3J0ICovXG4gICAgY29uc3QgZ3JpZFNvcnQgPSBzb3J0IHx8IHRoaXMuaW5pdGlhbFNldHRpbmdzLnNvcnQ7XG4gICAgZ3JpZC5zZXRTb3J0TW9kZWwoZ3JpZFNvcnQgPyBbZ3JpZFNvcnRdIDogbnVsbCk7XG5cbiAgICAvKiBBbGlnbiBncmlkICovXG4gICAgaWYgKGdyaWRBbGlnbm1lbnQgPT09IERhdG9HcmlkQWxpZ25tZW50LkNVU1RPTSkge1xuICAgICAgLyogU2V0IGNvbHVtbiBzaXplcyAqL1xuICAgICAgY29sdW1uc1NpemVzICYmXG4gICAgICAgIE9iamVjdC5rZXlzKGNvbHVtbnNTaXplcykuZm9yRWFjaChjb2xJZCA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbnNTaXplc1tjb2xJZF0gPT09IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UKSB7XG4gICAgICAgICAgICBjb2x1bW5zLmF1dG9TaXplQ29sdW1uKGNvbElkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sdW1ucy5zZXRDb2x1bW5XaWR0aChjb2xJZCwgY29sdW1uc1NpemVzW2NvbElkXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZEFsaWdubWVudCA9PT0gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRFTlQgPyBjb2x1bW5zLmF1dG9TaXplQWxsQ29sdW1ucygpIDogZ3JpZC5zaXplQ29sdW1uc1RvRml0KCk7XG4gICAgfVxuXG4gICAgLyogUGluIGNvbHVtbnMgbGVmdCAqL1xuICAgIGNvbnN0IGZpbHRlcmVkUGlubmVkQ29sdW1ucyA9IHBpbm5lZENvbHVtbnNcbiAgICAgID8gcGlubmVkQ29sdW1ucy5maWx0ZXIoKGNvbDogc3RyaW5nKSA9PiBjb2wgIT09IHRoaXMuQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRClcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBmaWx0ZXJlZENvbHVtbnMgPSBjb2x1bW5zT3JkZXJcbiAgICAgID8gY29sdW1uc09yZGVyLmZpbHRlcigoY29sOiBzdHJpbmcpID0+IGNvbCAhPT0gdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lEKVxuICAgICAgOiBudWxsO1xuICAgIHNpemUoZmlsdGVyZWRQaW5uZWRDb2x1bW5zKSA+IDBcbiAgICAgID8gY29sdW1ucy5zZXRDb2x1bW5zUGlubmVkKGZpbHRlcmVkUGlubmVkQ29sdW1ucywgJ2xlZnQnKVxuICAgICAgOiBmaWx0ZXJlZENvbHVtbnMgJiYgY29sdW1ucy5zZXRDb2x1bW5zUGlubmVkKGZpbHRlcmVkQ29sdW1ucywgbnVsbCk7XG5cbiAgICAvKiBPcmRlciBjb2x1bW5zICovXG4gICAgY29sdW1uc09yZGVyICYmIGNvbHVtbnMubW92ZUNvbHVtbnMoY29sdW1uc09yZGVyLCAwKTtcbiAgfVxuXG4gIGdldFNldHRpbmdzRGlmZigpOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIGRpZmYoY3VycmVudFN0YXRlLCB0aGlzLmluaXRpYWxTZXR0aW5ncyk7XG4gIH1cblxuICByZXNldFRhYmxlU2V0dGluZ3MoKSB7XG4gICAgY29uc3QgeyBmaWx0ZXIsIC4uLnJlc3QgfSA9IHRoaXMuaW5pdGlhbFNldHRpbmdzO1xuICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gdGhpcy5hcGk7XG4gICAgY29uc3Qgb3JpZ2luYWxDb2xTaXplcyA9IGdldENvbHVtbnNTaXplcyhjb2x1bW5zLmdldEFsbEdyaWRDb2x1bW5zKCksIHRydWUpO1xuICAgIGNvbnN0IGdyaWRBbGlnbm1lbnQgPSBpc0VtcHR5KG9yaWdpbmFsQ29sU2l6ZXMpID8gcmVzdC5ncmlkQWxpZ25tZW50IDogRGF0b0dyaWRBbGlnbm1lbnQuQ1VTVE9NO1xuICAgIGNvbnN0IG5ld1NldHRpbmdzID0geyAuLi5yZXN0LCBjb2x1bW5zU2l6ZXM6IG9yaWdpbmFsQ29sU2l6ZXMsIGdyaWRBbGlnbm1lbnQgfTtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKG5ld1NldHRpbmdzKTtcbiAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKG5ld1NldHRpbmdzKTtcbiAgICB0aGlzLnNhdmVTZXR0aW5nc1RvU2VydmVyKHsgZmlsdGVyIH0pO1xuICB9XG5cbiAgaW5pdFNldHRpbmdzKHNhdmVkU2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICB0aGlzLmluaXRpYWxTZXR0aW5ncyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gIH1cblxuICBub3RpZnlGaWx0ZXJVcGRhdGUoKSB7XG4gICAgY29uc3Qgd2F0Y2ggPSBbdGhpcy5ncmlkUmVmLmZpbHRlckNoYW5nZWQuYXNPYnNlcnZhYmxlKCldO1xuICAgIGlmICh0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNpZGUpIHtcbiAgICAgIHdhdGNoLnB1c2godGhpcy5ncmlkUXVlcnkuc2VydmVyRGF0YUxvYWRlZCQpO1xuICAgICAgdGhpcy5zZXRMb2FkaW5nKHRydWUpO1xuICAgIH1cbiAgICBjb21iaW5lTGF0ZXN0KHdhdGNoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHVudGlsRGVzdHJveWVkKHRoaXMpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgcm93c0FmdGVyRmlsdGVyID0gdGhpcy5hcGkuZ3JpZC5nZXREaXNwbGF5ZWRSb3dDb3VudCgpO1xuICAgICAgICB0aGlzLnNldE92ZXJsYXkocm93c0FmdGVyRmlsdGVyID09PSAwKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuYXBpLmdyaWQub25GaWx0ZXJDaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnMoZmlsdGVyOiBEYXRvR3JpZEZpbHRlcnNNYXApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcnMge1xuICAgIGNvbnN0IGNvbHVtbnNGaWx0ZXJzOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBjb25zdCB7IGJ5VmFsdWUsIGNvbmRpdGlvbmFsIH0gPSB2YWx1ZTtcbiAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgIGNvbHVtbnNGaWx0ZXJzW2NvbHVtbl0gPSB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IFtieVZhbHVlXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvbmRpdGlvbmFsKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbmFsRmlsdGVyID0ge1xuICAgICAgICAgIG9wZXJhdG9yOiBjb25kaXRpb25hbC5vcGVyYXRvcixcbiAgICAgICAgICBmaWx0ZXJzOiBjb25kaXRpb25hbC5jb25kaXRpb25zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29uZGl0aW9uLCB2YWx1ZSB9ID0gaXRlbTtcbiAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklOX1JBTkdFKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgIHN0YXJ0OiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBlbmQ6IChpdGVtIGFzIERhdG9HcmlkUmFuZ2VGaWx0ZXJDb25kaXRpb24pLnJhbmdlRW5kXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbSBhcyBEYXRvR3JpZEZpbHRlckNvbmRpdGlvbjtcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICAgIGNvbHVtbnNGaWx0ZXJzW2NvbHVtbl0uZmlsdGVycy5wdXNoKGNvbmRpdGlvbmFsRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dID0gY29uZGl0aW9uYWxGaWx0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29sdW1uc0ZpbHRlcnM7XG4gIH1cblxuICBidWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEoZ3JpZENvbHVtbnM6IERhdG9HcmlkQ29sdW1uRGVmW10pOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgY29uc3Qgc2VhcmNoVGVybSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKTtcblxuICAgIGxldCBjb2x1bW5GaWx0ZXJzID0gdGhpcy5idWlsZFNlcnZlckNvbHVtbkZpbHRlcnNfdjJfMShmaWx0ZXIpO1xuICAgIGlmIChjb2x1bW5GaWx0ZXJzLmV2ZXJ5KCh7IG9wZXJhdG9yIH06IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyKSA9PiBvcGVyYXRvciA9PT0gT3BlcmF0b3JUeXBlcy5BTkQpKSB7XG4gICAgICBjb25zdCBmbGF0dGVuZWRGaWx0ZXJzID0gY29sdW1uRmlsdGVyc1xuICAgICAgICAubWFwKCh7IGZpbHRlcnMgfTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIpID0+IGZpbHRlcnMpXG4gICAgICAgIC5yZWR1Y2UoKGFyciwgcmVzKSA9PiByZXMuY29uY2F0KGFyciksIFtdKTtcbiAgICAgIGNvbHVtbkZpbHRlcnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogZmxhdHRlbmVkRmlsdGVyc1xuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5GaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID1cbiAgICAgIHNpemUoY29sdW1uRmlsdGVycykgPiAxXG4gICAgICAgID8geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsIGZpbHRlcnM6IGNvbHVtbkZpbHRlcnMgfVxuICAgICAgICA6IHNpemUoY29sdW1uRmlsdGVycykgPT09IDFcbiAgICAgICAgPyBjb2x1bW5GaWx0ZXJzWzBdXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAoIXNlYXJjaFRlcm0pIHtcbiAgICAgIHJldHVybiBjb2x1bW5GaWx0ZXI7XG4gICAgfVxuICAgIGNvbnN0IHsgaW5jbHVkZUhpZGRlbkNvbHVtbnNJblNlYXJjaCB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICBjb25zdCBzZWFyY2hhYmxlQ29sdW1ucyA9IGdyaWRDb2x1bW5zLmZpbHRlcigoY29sRGVmOiBEYXRvR3JpZENvbHVtbkRlZikgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29sRGVmLmluY2x1ZGVJblNlYXJjaCAmJiAoaW5jbHVkZUhpZGRlbkNvbHVtbnNJblNlYXJjaCB8fCB0aGlzLmFwaS5jb2x1bW5zLmdldENvbHVtbihjb2xEZWYuY29sSWQpLmlzVmlzaWJsZSgpKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCBzZWFyY2hGaWx0ZXJzOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbltdID0gc2VhcmNoYWJsZUNvbHVtbnMubWFwKCh7IGZpZWxkIH06IERhdG9HcmlkQ29sdW1uRGVmKSA9PiAoe1xuICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5DT05UQUlOUyxcbiAgICAgIHZhbHVlOiBzZWFyY2hUZXJtLFxuICAgICAgY29sdW1uOiBmaWVsZFxuICAgIH0pKTtcbiAgICBjb25zdCBzZWFyY2hGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID1cbiAgICAgIHNpemUoc2VhcmNoRmlsdGVycykgPiAwID8geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5PUiwgZmlsdGVyczogc2VhcmNoRmlsdGVycyB9IDogbnVsbDtcbiAgICBpZiAoIWNvbHVtbkZpbHRlcikge1xuICAgICAgcmV0dXJuIHNlYXJjaEZpbHRlcjtcbiAgICB9XG4gICAgcmV0dXJuIHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELCBmaWx0ZXJzOiBbY29sdW1uRmlsdGVyLCBzZWFyY2hGaWx0ZXJdIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VydmVyQ29sdW1uRmlsdGVyc192Ml8xKGZpbHRlcjogRGF0b0dyaWRGaWx0ZXJzTWFwKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJbXSB7XG4gICAgbGV0IGNvbHVtbkZpbHRlcnM6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2NvbHVtbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcikpIHtcbiAgICAgIGxldCBjb2x1bW5GaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID0gbnVsbDtcbiAgICAgIGNvbnN0IHsgYnlWYWx1ZSwgY29uZGl0aW9uYWwgfSA9IHZhbHVlO1xuICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgY29sdW1uRmlsdGVyID0ge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBbeyBjb2x1bW4sIC4uLmJ5VmFsdWUgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25hbCkge1xuICAgICAgICBjb25zdCBjb25kaXRpb25hbEZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPSB0aGlzLmdldFNlcnZlckNvbmRpdGlvbmFsRmlsdGVyKGNvbmRpdGlvbmFsLCBjb2x1bW4pO1xuICAgICAgICBpZiAoY29sdW1uRmlsdGVyKSB7XG4gICAgICAgICAgY29sdW1uRmlsdGVyLmZpbHRlcnMucHVzaChjb25kaXRpb25hbEZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sdW1uRmlsdGVyID0gY29uZGl0aW9uYWxGaWx0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbHVtbkZpbHRlcnMucHVzaChjb2x1bW5GaWx0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uRmlsdGVycztcbiAgfVxuXG4gIGdldEZpbHRlckZvclNlcnZlckFjdGlvbk9uU2VsZWN0QWxsKCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyIHtcbiAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICBjb25zdCB7IGNvbHVtbkRlZnMsIGlkQ29sdW1uS2V5IH0gPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpO1xuICAgIGNvbnN0IG1haW5GaWx0ZXIgPSB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnNfdjJfMShjb2x1bW5EZWZzKTtcbiAgICBpZiAoaXNFbXB0eShleGNsdWRlZEZyb21TZWxlY3RBbGwpKSB7XG4gICAgICByZXR1cm4gbWFpbkZpbHRlcjtcbiAgICB9XG4gICAgY29uc3QgZXhjbHVkZWRSb3dzRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkxpc3RDb25kaXRpb24gPSB7XG4gICAgICBjb25kaXRpb246IERhdG9GaWx0ZXJDb25kaXRpb25zLk5PVF9JTl9MSVNULFxuICAgICAgdmFsdWVzOiBleGNsdWRlZEZyb21TZWxlY3RBbGwsXG4gICAgICBjb2x1bW46IGlkQ29sdW1uS2V5XG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXJzID0gbWFpbkZpbHRlciA/IFttYWluRmlsdGVyLCBleGNsdWRlZFJvd3NGaWx0ZXJdIDogW2V4Y2x1ZGVkUm93c0ZpbHRlcl07XG4gICAgcmV0dXJuIHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELCBmaWx0ZXJzIH07XG4gIH1cblxuICBwcml2YXRlIGdldFNlcnZlckNvbmRpdGlvbmFsRmlsdGVyKFxuICAgIGNvbmRpdGlvbmFsRmlsdGVyOiBEYXRvR3JpZENvbmRpdGlvbmFsRmlsdGVyLFxuICAgIGNvbHVtbjogc3RyaW5nXG4gICk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0b3I6IGNvbmRpdGlvbmFsRmlsdGVyLm9wZXJhdG9yLFxuICAgICAgZmlsdGVyczogY29uZGl0aW9uYWxGaWx0ZXIuY29uZGl0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZGl0aW9uLCB2YWx1ZSB9ID0gaXRlbTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSU5fUkFOR0UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IHZhbHVlLFxuICAgICAgICAgICAgZW5kOiAoaXRlbSBhcyBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uKS5yYW5nZUVuZCxcbiAgICAgICAgICAgIGNvbHVtblxuICAgICAgICAgIH0gYXMgU2VydmVyU2lkZVBhZ2luYXRpb25SYW5nZUNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSB8fCBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLk5PVF9FTVBUWSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25kaXRpb246IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZLFxuICAgICAgICAgICAgdmFsdWU6IGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFkgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19OVUxMIHx8IGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuTk9UX05VTEwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19OVUxMLFxuICAgICAgICAgICAgdmFsdWU6IGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCA/ICd0cnVlJyA6ICdmYWxzZScsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLml0ZW0sIGNvbHVtbiB9IGFzIFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uO1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlclJlcXVlc3RTb3J0KHNvcnRNb2RlbDogRGF0b0dyaWRTb3J0W10pOiBEYXRvR3JpZFNlcnZlclNvcnRbXSB7XG4gICAgcmV0dXJuIHNvcnRNb2RlbC5tYXAoKHsgY29sSWQsIHNvcnQgfSkgPT4gKHtcbiAgICAgIGNvbHVtbjogY29sSWQsXG4gICAgICBzb3J0T3JkZXI6IHNvcnQudG9VcHBlckNhc2UoKSBhcyBEYXRvR3JpZFNlcnZlclNvcnREaXJlY3Rpb25cbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEVkaXRhYmxlQ2VsbENsYXNzKFxuICAgIGNlbGxDbGFzc1ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8ICgoY2VsbENsYXNzUGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpID0+IHN0cmluZyB8IHN0cmluZ1tdKVxuICApIHtcbiAgICBpZiAoaXNOaWwoY2VsbENsYXNzVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2RhdG8tZWRpdGFibGUtY2VsbCc7XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKGNlbGxDbGFzc1ZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNlbGxDbGFzc1BhcmFtcyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVkaXRhYmxlQ2xhc3NBcnJheShjZWxsQ2xhc3NWYWx1ZShjZWxsQ2xhc3NQYXJhbXMpKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEVkaXRhYmxlQ2xhc3NBcnJheShjZWxsQ2xhc3NWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldEVkaXRhYmxlQ2xhc3NBcnJheShjdXJyZW50Q2xhc3M6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNlbGxDbGFzcyA9IGNvZXJjZUFycmF5KGN1cnJlbnRDbGFzcyk7XG4gICAgY2VsbENsYXNzLnB1c2goJ2RhdG8tZWRpdGFibGUtY2VsbCcpO1xuICAgIHJldHVybiBjZWxsQ2xhc3M7XG4gIH1cblxuICBzZWxlY3RBbGxDdXJyZW50UGFnZVJvd3MoaXNTZWxlY3RlZCA9IHRydWUsIGNvbnNpZGVyRXhjbHVkZWQgPSBmYWxzZSkge1xuICAgIGxldCByb3dzRm9yU2VsZWN0aW9uID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudFBhZ2VSb3dzKCk7XG4gICAgaWYgKGNvbnNpZGVyRXhjbHVkZWQpIHtcbiAgICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgICAgaWYgKCFpc0VtcHR5KGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCkpIHtcbiAgICAgICAgcm93c0ZvclNlbGVjdGlvbiA9IHJvd3NGb3JTZWxlY3Rpb24uZmlsdGVyKCh7IGlkIH06IFJvd05vZGUpID0+ICFleGNsdWRlZEZyb21TZWxlY3RBbGwuaW5jbHVkZXMoaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaXNTZWxlY3RlZCA/IHRoaXMuc2VsZWN0Um93cyhyb3dzRm9yU2VsZWN0aW9uKSA6IHRoaXMuZGVzZWxlY3RSb3dzKHJvd3NGb3JTZWxlY3Rpb24pO1xuICB9XG5cbiAgZGVzZWxlY3RBbGxSb3dzKCkge1xuICAgIHRoaXMuYXBpLmdyaWQuZGVzZWxlY3RBbGwoKTtcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTZWxlY3RBbGxSb3dzRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IHNlbGVjdEFsbFJvd3NFbmFibGVkOiBmYWxzZSwgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBbXSB9KTtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlUm93QWN0aW9uc1Zpc2liaWxpdHkoKSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuX3Jvd0FjdGlvblZpc2liaWxpdHlDaGFuZ2VkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHBpdm90aW5nLFxuICAgKiB3ZSBhZGQgdGhlIGZpZWxkIG5hbWUgdG8gdGhlIGNvbHVtbiBoZWFkZXIgY2xhc3MgaW4gb3JkZXIgdG8gYWNjZXNzIGl0IHRocm91Z2ggdGhlIGF1dG8gZ2VuZXJhdGVkIHBpdm90IGNvbHVtbi5cbiAgICovXG4gIHByaXZhdGUgaW5pdFBpdm90U2Vjb25kYXJ5Q29sc1Byb2Nlc3MoeyBncmlkT3B0aW9ucyB9OiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgLyoqIFVzZSBwcm9jZXNzUGl2b3RSZXN1bHRDb2xEZWYgZnJvbSB2ZXIgMjggKi9cbiAgICBncmlkT3B0aW9ucy5wcm9jZXNzU2Vjb25kYXJ5Q29sRGVmID0gY29sRGVmID0+IHtcbiAgICAgIGNvbnN0IHVzZXJQcm92aWRlZENvbERlZiA9IGNvbERlZi5waXZvdFZhbHVlQ29sdW1uICYmIGNvbERlZi5waXZvdFZhbHVlQ29sdW1uLmdldFVzZXJQcm92aWRlZENvbERlZigpO1xuXG4gICAgICBpZiAodXNlclByb3ZpZGVkQ29sRGVmKSB7XG4gICAgICAgIGNvbERlZi5maWx0ZXIgPSB1c2VyUHJvdmlkZWRDb2xEZWYuZmlsdGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sRGVmLnBpdm90S2V5cykge1xuICAgICAgICBjb2xEZWYucGl2b3RLZXlzID0gY29sRGVmLnBpdm90S2V5cy5tYXAoa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRLZXkgPSB0cnlQYXJzZVBpdm90VmFsdWUoa2V5KTtcblxuICAgICAgICAgIHJldHVybiAocGFyc2VkS2V5ICYmIHBhcnNlZEtleS52YWx1ZSkgfHwgJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogVXNlIHByb2Nlc3NQaXZvdFJlc3VsdENvbEdyb3VwRGUgZnJvbSB2ZXIgMjggKi9cbiAgICBncmlkT3B0aW9ucy5wcm9jZXNzU2Vjb25kYXJ5Q29sR3JvdXBEZWYgPSAoY29sR3JvdXBEZWY6IENvbEdyb3VwRGVmKSA9PiB7XG4gICAgICBpZiAoY29sR3JvdXBEZWYuaGVhZGVyTmFtZSkge1xuICAgICAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHRyeVBhcnNlUGl2b3RWYWx1ZShjb2xHcm91cERlZi5oZWFkZXJOYW1lKTtcblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB7IGZpZWxkLCB2YWx1ZSB9ID0gcGFyc2VkVmFsdWU7XG5cbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcyA9IFtmaWVsZF07XG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyTmFtZSA9IHZhbHVlO1xuXG4gICAgICAgICAgaWYgKGNvbEdyb3VwRGVmLmNoaWxkcmVuICYmIGNvbEdyb3VwRGVmLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlckNsYXNzLnB1c2goJ2dyb3VwLXBpdm90LWNlbGwnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29sR3JvdXBEZWYuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgW2NvbENoaWxkXTogYW55ID0gY29sR3JvdXBEZWYuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IHBpdm90VG90YWxDb2x1bW5JZHMgPSBjb2xDaGlsZCAmJiBjb2xDaGlsZC5waXZvdFRvdGFsQ29sdW1uSWRzO1xuXG4gICAgICAgIGlmIChwaXZvdFRvdGFsQ29sdW1uSWRzICYmIHBpdm90VG90YWxDb2x1bW5JZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlckNsYXNzID0gWyd0b3RhbC1waXZvdC1jZWxsJ107XG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyTmFtZSA9IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybSgnY29yZS50b3RhbCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcyA9IFsnZW1wdHktcGl2b3QtaGVhZGVyJ107XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2xHcm91cERlZi5waXZvdEtleXMpIHtcbiAgICAgICAgY29sR3JvdXBEZWYucGl2b3RLZXlzID0gY29sR3JvdXBEZWYucGl2b3RLZXlzLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEtleSA9IHRyeVBhcnNlUGl2b3RWYWx1ZShrZXkpO1xuXG4gICAgICAgICAgcmV0dXJuIChwYXJzZWRLZXkgJiYgcGFyc2VkS2V5LnZhbHVlKSB8fCAnJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGl2b3RNb2RlUm93czxUPihkYXRhOiBUW10pIHtcbiAgICBjb25zdCBwaXZvdENvbHVtbnMgPSB0aGlzLmdyaWRRdWVyeS5nZXRBbGxQaXZvdENvbHVtbnMoKTtcbiAgICBjb25zdCBjb252ZXJ0ZWREYXRhID0gZGF0YS5tYXAoKGN1cnJlbnRWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG1hcHBlZFZhbHVlcyA9IHsgLi4uY3VycmVudFZhbHVlIH07XG5cbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHBpdm90Q29sdW1ucykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbC5nZXRDb2xEZWYoKS5maWVsZDtcbiAgICAgICAgY29uc3QgcGl2b3RWYWx1ZTogUGl2b3RDb2x1bW5EYXRhID0geyBmaWVsZCwgdmFsdWU6IGN1cnJlbnRWYWx1ZVtmaWVsZF0gfTtcblxuICAgICAgICBtYXBwZWRWYWx1ZXNbZmllbGRdID0gSlNPTi5zdHJpbmdpZnkocGl2b3RWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXBwZWRWYWx1ZXM7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFwaS5ncmlkLnNldFJvd0RhdGEoY29udmVydGVkRGF0YSk7XG4gIH1cblxuICAvKiogTm8gZGVjbGFyZWQgaW50ZXJmYWNlIGluIGN1cnJlbnQgZ3JpZCB2ZXJzaW9uIHlldC5cbiAgICogIFJlZmVyIGRvY3MgLSBodHRwczovL3d3dy5hZy1ncmlkLmNvbS9hbmd1bGFyLWRhdGEtZ3JpZC9jZWxsLXN0eWxlcy8jY2VsbC1jbGFzcy1ydWxlcyAqL1xuICBwcml2YXRlIGdldFBpdm90TW9kZUNlbGxDbGFzc1J1bGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAncHJpbWFyeS0wLWJhY2tncm91bmQtY29sb3InOiB0aGlzLmlzTGVhZkdyb3VwRXZlbkNlbGwuYmluZCh0aGlzKSxcbiAgICAgICdwcmltYXJ5LTEwMC1iYWNrZ3JvdW5kLWNvbG9yIHBvaW50ZXIgZGF0by1zaW1wbGUtYm9sZCc6IHRoaXMuaXNSb3dHcm91cFZhbHVlZENlbGwuYmluZCh0aGlzKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGlzTGVhZkdyb3VwRXZlbkNlbGwocGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGxlYWZHcm91cCwgY2hpbGRJbmRleCwgcm93R3JvdXBJbmRleCB9ID0gcGFyYW1zLm5vZGU7XG4gICAgY29uc3QgY29sSW5kZXggPSB0aGlzLmdldENlbGxDbGFzc1J1bGVDb2xJbmRleChwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHJvd0dyb3VwSW5kZXggPD0gY29sSW5kZXggJiYgbGVhZkdyb3VwICYmIGNoaWxkSW5kZXggJSAyID09PSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1Jvd0dyb3VwVmFsdWVkQ2VsbChwYXJhbXM6IENlbGxDbGFzc1BhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgbGVhZkdyb3VwLCByb3dHcm91cEluZGV4IH0gPSBwYXJhbXMubm9kZTtcbiAgICBjb25zdCBjb2xJbmRleCA9IHRoaXMuZ2V0Q2VsbENsYXNzUnVsZUNvbEluZGV4KHBhcmFtcyk7XG5cbiAgICByZXR1cm4gcm93R3JvdXBJbmRleCA8PSBjb2xJbmRleCAmJiAhbGVhZkdyb3VwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDZWxsQ2xhc3NSdWxlQ29sSW5kZXgocGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpOiBudW1iZXIge1xuICAgIGNvbnN0IGdyaWRRdWVyeSA9IHBhcmFtcy5jb2xEZWYuaGVhZGVyQ29tcG9uZW50UGFyYW1zLmdyaWRRdWVyeTtcblxuICAgIGlmIChncmlkUXVlcnkgJiYgZ3JpZFF1ZXJ5LmFwaSkge1xuICAgICAgY29uc3QgeyBjb2x1bW5zIH0gPSBncmlkUXVlcnkuYXBpIGFzIERhdG9HcmlkQXBpO1xuICAgICAgY29uc3QgYWxsRGlzcGxheWVkQ29sdW1ucyA9IGNvbHVtbnMuZ2V0QWxsRGlzcGxheWVkQ29sdW1ucygpO1xuICAgICAgY29uc3QgZGlzcGxheWVkQ29sdW1uID0gYWxsRGlzcGxheWVkQ29sdW1ucy5maW5kKGNvbCA9PiBjb2wuZ2V0Q29sSWQoKSA9PT0gcGFyYW1zLmNvbERlZi5jb2xJZCk7XG5cbiAgICAgIHJldHVybiBhbGxEaXNwbGF5ZWRDb2x1bW5zLmluZGV4T2YoZGlzcGxheWVkQ29sdW1uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cbiJdfQ==
|
|
1054
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBZXpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG9CQUFvQixFQUtwQixzQkFBc0IsRUFRdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBU2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFJTCxtQkFBbUIsRUFPbkIsdUNBQXVDLEVBQ3ZDLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsMkJB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LEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVoRyxPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNyRDtRQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO0NBQ0YsQ0FBQTs7WUE3ckNrQixTQUFTO1lBQ0wsU0FBUztZQUNULG9CQUFvQjtZQUNqQixZQUFZO1lBQ2IsV0FBVzs0Q0FDL0IsTUFBTSxTQUFDLHFCQUFxQjs0Q0FDNUIsTUFBTSxTQUFDLGdCQUFnQjs7QUFqQ2YsV0FBVztJQUR2QixVQUFVLEVBQUU7SUFpQ1IsV0FBQSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUM3QixXQUFBLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO3FDQU5WLFNBQVM7UUFDTCxTQUFTO1FBQ1Qsb0JBQW9CO1FBQ2pCLFlBQVk7UUFDYixXQUFXO0dBL0J2QixXQUFXLENBd3RDdkI7U0F4dENZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRvR3JpZEFwaSB9IGZyb20gJy4uL2dyaWQtY29udHJvbGxlci9ncmlkLWNvbnRyb2xsZXIudHlwZXMnO1xuaW1wb3J0IHtcbiAgQ2VsbENsYXNzUGFyYW1zLFxuICBDb2xHcm91cERlZixcbiAgQ29sdW1uLFxuICBHZXRDb250ZXh0TWVudUl0ZW1zUGFyYW1zLFxuICBHcmlkT3B0aW9ucyxcbiAgSUNlbGxSZW5kZXJlclBhcmFtcyxcbiAgSUdldFJvd3NQYXJhbXMsXG4gIFJvd0RhdGFUcmFuc2FjdGlvbixcbiAgUm93Tm9kZSxcbiAgUm93Tm9kZVRyYW5zYWN0aW9uLFxuICBSb3dTZWxlY3RlZEV2ZW50XG59IGZyb20gJ0BhZy1ncmlkLWNvbW11bml0eS9jb3JlJztcbmltcG9ydCB7IEdyaWRRdWVyeSB9IGZyb20gJy4vZ3JpZC5xdWVyeSc7XG5pbXBvcnQgeyBEYXRvQ29yZUVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IERhdG9UcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0b0N1c3RvbUhlYWRlclRlbXBsYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC1jdXN0b20taGVhZGVyL2N1c3RvbS1oZWFkZXItdGVtcGxhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBEYXRvRmlsdGVyQ29uZGl0aW9ucyxcbiAgRGF0b0dyaWRDb25kaXRpb25hbEZpbHRlcixcbiAgRGF0b0dyaWRFeHRlcm5hbEZpbHRlcixcbiAgRGF0b0dyaWRGaWx0ZXIsXG4gIERhdG9HcmlkRmlsdGVyQ29uZGl0aW9uLFxuICBEYXRvR3JpZEZpbHRlclNlY3Rpb25zLFxuICBEYXRvR3JpZEZpbHRlcnNNYXAsXG4gIERhdG9HcmlkUmFuZ2VGaWx0ZXJDb25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkxpc3RDb25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uUmFuZ2VDb25kaXRpb25cbn0gZnJvbSAnLi4vZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIudHlwZXMnO1xuaW1wb3J0IHsgY29lcmNlQXJyYXkgfSBmcm9tICcuLi8uLi91dGlscy9jb2VyY2lvbic7XG5pbXBvcnQgeyBpc0VtcHR5LCBpc0Z1bmN0aW9uLCBpc05pbCwgaXNTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscy92YWxpZGF0b3JzJztcbmltcG9ydCB7IHZhbGlkYXRlRmlsdGVyIH0gZnJvbSAnLi4vZ3JpZC1maWx0ZXIvZmlsdGVyLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBBZ0dyaWRBbmd1bGFyIH0gZnJvbSAnQGFnLWdyaWQtY29tbXVuaXR5L2FuZ3VsYXInO1xuaW1wb3J0IHsgSWNvblJlZ2lzdHJ5LCBTdmdSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ljb24tcmVnaXN0cnknO1xuaW1wb3J0IHsgZ2V0VmlzaWJsZUFjdGlvbnMsIHRvb2xiYXJBY3Rpb25Ub0NvbnRleHRBY3Rpb24gfSBmcm9tICcuLi9ncmlkLXYyLnV0aWwnO1xuaW1wb3J0IHtcbiAgRGF0b0dyaWRTZXR0aW5ncyxcbiAgTm9ybWFsaXplT3B0aW9uc1BhcmFtcyxcbiAgUGl2b3RDb2x1bW5EYXRhLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmZpZyxcbiAgU3VjY2Vzc1dyYXBwZXJQYXJhbXNcbn0gZnJvbSAnLi9ncmlkLnN0b3JlLnR5cGVzJztcbmltcG9ydCB7IFJvd0FjdGlvbiB9IGZyb20gJy4uL2dyaWQtdG9vbGJhci9ncmlkLXRvb2xiYXIudHlwZXMnO1xuaW1wb3J0IHsgd3JpdGVUb0NsaXBib2FyZCB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY2xpcGJvYXJkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBHcmlkU3RvcmUgfSBmcm9tICcuL2dyaWQuc3RvcmUnO1xuaW1wb3J0IHsgREFUT19HUklEX1NUT1JBR0VfQVBJLCBHcmlkU3RvcmFnZUFQSSB9IGZyb20gJy4uL2dyaWQtc2V0dGluZ3MnO1xuaW1wb3J0IHtcbiAgQWN0aW9uQ29udmVydGVyUGFyYW1zLFxuICBEYXRvR3JpZEFsaWdubWVudCxcbiAgRGF0b0dyaWRDb2x1bW5EZWYsXG4gIERhdG9HcmlkQ29sdW1uVHlwZXMsXG4gIERhdG9HcmlkR2V0Um93c1BhcmFtcyxcbiAgRGF0b0dyaWRPcHRpb25zLFxuICBEYXRvR3JpZFNlcnZlclNvcnQsXG4gIERhdG9HcmlkU2VydmVyU29ydERpcmVjdGlvbixcbiAgRGF0b0dyaWRTb3J0LFxuICBEYXRvR3JpZFRyZWVDb25maWcsXG4gIGVkaXRhYmxlQ2VsbFJlbmRlcmVyV2l0aFNlYXJjaEhpZ2hsaWdodCxcbiAgR3JpZE1pbldpZHRocyxcbiAgR3JpZFJvd1NlbGVjdGlvblR5cGUsXG4gIHNlYXJjaEhpZ2hsaWdodENlbGxSZW5kZXJlclxufSBmcm9tICcuLi9ncmlkL2dyaWQtdjIudHlwZXMnO1xuXG5pbXBvcnQgeyBjb252ZXJ0VG9UcmVlRGF0YSwgZGVmYXVsdEdyaWRPcHRpb25zLCBkZWZhdWx0R3JpZFRyZWVMYWJlbCB9IGZyb20gJy4uL2dyaWQvZ3JpZC12Mi5jb25maWcnO1xuaW1wb3J0IHsgZGlmZiB9IGZyb20gJy4uLy4uL3V0aWxzL29iamVjdCc7XG5pbXBvcnQgeyB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ25neC10YWtlLXVudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgQ29yZUV2ZW50TG9nZ2VyLCBDb3JlRXZlbnRUeXBlcywgREFUT19DT1JFX0xPR0dFUiB9IGZyb20gJy4uLy4uL2V2ZW50LWxvZ2dlcic7XG5pbXBvcnQgeyBIYXNoTWFwIH0gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXMnO1xuaW1wb3J0IHsgc2l6ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgT3BlcmF0b3JUeXBlcyB9IGZyb20gJy4uLy4uL29wZXJhdG9yLXRvZ2dsZXIvb3BlcmF0b3ItdG9nZ2xlci50eXBlcyc7XG5pbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9kZWVwLW1lcmdlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRyaWdnZXJXaW5kb3dSZXNpemUgfSBmcm9tICcuLi8uLi91dGlscy91c2VyLWFnZW50JztcbmltcG9ydCB7IGdldENvbEZpZWxkLCBnZXRDb2x1bW5zU2l6ZXMsIGlzSHRtbEFsbG93ZWRGb3JDb2wsIHRyeVBhcnNlUGl2b3RWYWx1ZSB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBEYXRvR3JpZE11bHRpU2VsZWN0Q29sdW1uSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC1jb2x1bW4taGVhZGVyL2dyaWQtbXVsdGktc2VsZWN0LWhlYWRlci9ncmlkLW11bHRpLXNlbGVjdC1oZWFkZXIuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdyaWRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgYXBpOiBEYXRvR3JpZEFwaTtcbiAgdHJlZUNvbmZpZzogRGF0b0dyaWRUcmVlQ29uZmlnID0gZGVmYXVsdEdyaWRUcmVlTGFiZWw7XG4gIGlzUGl2b3RNb2RlOiBib29sZWFuO1xuXG4gIC8qKiBAaW50ZXJuYWwgLSB1c2VkIGZvciBzZXJ2ZXIgc2lkZSBieSB2YWx1ZSBmaWx0ZXIgKi9cbiAgX29yaWdpbmFsR2V0Um93czogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkO1xuICBwcml2YXRlIGluaXRpYWxTZXR0aW5nczogRGF0b0dyaWRTZXR0aW5ncztcbiAgcHJpdmF0ZSBncmlkTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGdyaWRSZWY6IEFnR3JpZEFuZ3VsYXI7XG4gIHByaXZhdGUgY3VzdG9tSGVhZGVyc1RlbXBsYXRlczogUXVlcnlMaXN0PERhdG9DdXN0b21IZWFkZXJUZW1wbGF0ZUNvbXBvbmVudD47XG4gIHByaXZhdGUgaXNUcmVlRGF0YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPSAtMTtcbiAgcHJpdmF0ZSBsYXN0VG90YWxSb3dzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVsb2FkR3JpZEFjdGlvbnNTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQgPSAnZ3JpZC1jaGVja2JveC1zZWxlY3Rpb24nO1xuXG4gIHNldCB0cmVlRGF0YShpc1RyZWVEYXRhOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1RyZWVEYXRhID0gaXNUcmVlRGF0YTtcbiAgfVxuXG4gIGdldCB0cmVlRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyZWVEYXRhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogR3JpZFN0b3JlLFxuICAgIHByaXZhdGUgZ3JpZFF1ZXJ5OiBHcmlkUXVlcnksXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IERhdG9UcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWNvblJlZ2lzdHJ5OiBJY29uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSBzdmdSZWdpc3RyeTogU3ZnUmVnaXN0cnksXG4gICAgQEluamVjdChEQVRPX0dSSURfU1RPUkFHRV9BUEkpIHByaXZhdGUgc3RvcmFnZUFQSTogR3JpZFN0b3JhZ2VBUEksXG4gICAgQEluamVjdChEQVRPX0NPUkVfTE9HR0VSKSBwcml2YXRlIGxvZ2dlcjogQ29yZUV2ZW50TG9nZ2VyXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAtIHVzZWQgdG8gaW5pdCB0aGUgc2VydmljZSAqL1xuICBfc2V0QXBpKGFwaTogRGF0b0dyaWRBcGksIGdyaWRSZWY6IEFnR3JpZEFuZ3VsYXIpIHtcbiAgICB0aGlzLmFwaSA9IGFwaTtcbiAgICB0aGlzLmdyaWRSZWYgPSBncmlkUmVmO1xuICAgIHRoaXMuZ3JpZE5hbWUgPSAoZ3JpZFJlZi5ncmlkT3B0aW9ucyBhcyBEYXRvR3JpZE9wdGlvbnMpLmdyaWROYW1lO1xuICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oe1xuICAgICAgZW5hYmxlZDogdGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRSZWYuZ3JpZE9wdGlvbnMpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdyaWRPcHRpb25zLnJvd01vZGVsVHlwZSA9PT0gJ2luZmluaXRlJztcbiAgfVxuXG4gIHVwZGF0ZUdyaWRDb250ZXh0KGNvbnRleHQgPSB7fSwgcmVwbGFjZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5jb250ZXh0ID0gcmVwbGFjZVxuICAgICAgPyBjb250ZXh0XG4gICAgICA6IGRlZXBtZXJnZSh0aGlzLmdyaWRSZWYuZ3JpZE9wdGlvbnMuY29udGV4dCB8fCB7fSwgY29udGV4dCk7XG4gIH1cblxuICByZWxvYWRHcmlkQWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbG9hZEdyaWRBY3Rpb25zU3ViamVjdC5uZXh0KCk7XG4gIH1cblxuICBvblJlbG9hZEdyaWRBY3Rpb25zKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVsb2FkR3JpZEFjdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZWxlY3RSb3dzIGluc3RlYWRcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgc2V0U2VsZWN0ZWRSb3dzPFQ+KHJvdzogKFQgJiBSb3dOb2RlKSB8IChUW10gJiBSb3dOb2RlW10pKSB7XG4gICAgdGhpcy5zZWxlY3RSb3dzKHJvdyk7XG4gIH1cblxuICBzZWxlY3RSb3dzPFQ+KHJvdzogKFQgJiBSb3dOb2RlKSB8IChUW10gJiBSb3dOb2RlW10pKSB7XG4gICAgY29uc3Qgcm93Tm9kZXMgPSBjb2VyY2VBcnJheShyb3cpLmZpbHRlcihyb3dOb2RlID0+ICFyb3dOb2RlLmlzU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGFzdE5vZGUgPSByb3dOb2Rlcy5wb3AoKTtcbiAgICByb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZCh0cnVlLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIGlmIChsYXN0Tm9kZSkge1xuICAgICAgbGFzdE5vZGUuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgZGVzZWxlY3RSb3dzPFQ+KHJvdzogKFQgJiBSb3dOb2RlKSB8IChUW10gJiBSb3dOb2RlW10pKSB7XG4gICAgY29uc3Qgcm93Tm9kZXMgPSBjb2VyY2VBcnJheShyb3cpLmZpbHRlcihyb3dOb2RlID0+IHJvd05vZGUuaXNTZWxlY3RlZCgpKTtcbiAgICBjb25zdCBsYXN0Tm9kZSA9IHJvd05vZGVzLnBvcCgpO1xuICAgIHJvd05vZGVzLmZvckVhY2gocm93Tm9kZSA9PiByb3dOb2RlLnNldFNlbGVjdGVkKGZhbHNlLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIGlmIChsYXN0Tm9kZSkge1xuICAgICAgbGFzdE5vZGUuc2V0U2VsZWN0ZWQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHNldFJvd3M8VD4oZGF0YTogVFtdLCBmaXRDb250YWluZXIgPSBmYWxzZSwgdHJlZUNvbmZpZzogUGFydGlhbDxEYXRvR3JpZFRyZWVDb25maWc+ID0ge30pIHtcbiAgICB0aGlzLmdyaWRRdWVyeS5ncmlkUmVhZHkkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVHJlZURhdGEpIHtcbiAgICAgICAgdGhpcy50cmVlQ29uZmlnID0ge1xuICAgICAgICAgIC4uLmRlZmF1bHRHcmlkVHJlZUxhYmVsLFxuICAgICAgICAgIC4uLnRyZWVDb25maWdcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdHJlZURhdGUgPSBjb252ZXJ0VG9UcmVlRGF0YShkYXRhLCB0aGlzLnRyZWVDb25maWcpO1xuICAgICAgICB0aGlzLmFwaS5ncmlkLnNldFJvd0RhdGEodHJlZURhdGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUGl2b3RNb2RlKSB7XG4gICAgICAgIHRoaXMuc2V0UGl2b3RNb2RlUm93czxUPihkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXBpLmdyaWQuc2V0Um93RGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXRDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5maXRHcmlkKCdjb250YWluZXInKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJXaW5kb3dSZXNpemUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldERhdGFzb3VyY2UoZ2V0Um93czogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkLCByZXR1cm5Ub0N1cnJlbnRQYWdlID0gZmFsc2UsIHNob3dMb2FkaW5nID0gZmFsc2UpIHtcbiAgICByZXR1cm5Ub0N1cnJlbnRQYWdlICYmIHRoaXMudXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKTtcbiAgICBzaG93TG9hZGluZyAmJiB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5fb3JpZ2luYWxHZXRSb3dzID0gZ2V0Um93cztcbiAgICB0aGlzLmFwaS5ncmlkLnNldERhdGFzb3VyY2UoeyBnZXRSb3dzOiB0aGlzLndyYXBHZXRSb3dzKHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCksIGdldFJvd3MpIH0pO1xuICB9XG5cbiAgcmVmcmVzaFNlcnZlckRhdGEoa2VlcEN1cnJlbnRQYWdlID0gZmFsc2UsIHNob3dMb2FkaW5nID0gZmFsc2UpIHtcbiAgICBrZWVwQ3VycmVudFBhZ2UgJiYgdGhpcy51cGRhdGVQYWdlVG9LZWVwT25SZWZyZXNoU2VydmVyRGF0YSgpO1xuICAgIHNob3dMb2FkaW5nICYmIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLmFwaS5ncmlkLnNldERhdGFzb3VyY2UoeyBnZXRSb3dzOiB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmRhdGFzb3VyY2UuZ2V0Um93cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKSB7XG4gICAgLy8gS2VlcGluZyB0aGUgY3VycmVudCBwYWdlIG9uIHNlcnZlciByZWZyZXNoIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgb25seSB3aGVuIG5vIHBhZ2UgY2xpZW50IGNhY2hpbmcgaXMgZW5hYmxlZFxuICAgIGlmICh0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLm1heEJsb2Nrc0luQ2FjaGUgPT09IDEpIHtcbiAgICAgIHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gdGhpcy5hcGkuZ3JpZC5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKTtcbiAgICB9XG4gIH1cblxuICBhZGRSb3dzPFQ+KHJvdzogVCwgaW5kZXg/OiBudW1iZXIpOiBSb3dOb2RlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpO1xuICAgIGNvbnN0IGRhdGE6IFJvd0RhdGFUcmFuc2FjdGlvbiA9IHsgYWRkOiByb3dzIH07XG4gICAgaWYgKCFpc05pbChpbmRleCkpIHtcbiAgICAgIGRhdGEuYWRkSW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YShkYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZVJvd3M8VD4ocm93OiBUW10pOiBhbnkge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpO1xuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoeyB1cGRhdGU6IHJvd3MgfSk7XG4gIH1cblxuICB1cGRhdGVSb3dWYWx1ZTxUPihyb3c6IFJvd05vZGUsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCk7XG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KGlkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCk7XG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KHJvdzogc3RyaW5nIHwgUm93Tm9kZSwga2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBUKSB7XG4gICAgY29uc3Qgcm93Tm9kZSA9IGlzU3RyaW5nKHJvdykgPyB0aGlzLmFwaS5ncmlkLmdldFJvd05vZGUocm93KSA6IHJvdztcbiAgICByb3dOb2RlLnNldERhdGFWYWx1ZShrZXksIG5ld1ZhbHVlKTtcbiAgfVxuXG4gIHJlbW92ZVJvd3Mocm93OiBSb3dOb2RlIHwgUm93Tm9kZVtdKTogUm93Tm9kZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KS5tYXAoKHsgZGF0YSB9KSA9PiBkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKHsgcmVtb3ZlOiByb3dzIH0pO1xuICB9XG5cbiAgcmVtb3ZlU2VsZWN0ZWRSb3dzKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNlbGVjdGVkUm93Tm9kZXMoKTtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVSb3dzKHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBjbGVhclRhYmxlKCkge1xuICAgIHRoaXMuc2V0Um93cyhbXSk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW5zKGNvbERlZnM6IERhdG9HcmlkQ29sdW1uRGVmIHwgRGF0b0dyaWRDb2x1bW5EZWZbXSwgcmVsb2FkU2V0dGluZ3MgPSBmYWxzZSkge1xuICAgIGlmICghY29sRGVmcykge1xuICAgICAgdGhyb3cgbmV3IERhdG9Db3JlRXJyb3IoJ05vIGNvbHVtbkRlZnMgd2VyZSBwcm92aWRlZC4g8J+VtfCfj7vigI3imYDvuI8nKTtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplQ29sdW1ucyhjb2VyY2VBcnJheShjb2xEZWZzKSk7XG4gICAgY29uc3Qgc2F2ZWRTZXR0aW5ncyA9IHJlbG9hZFNldHRpbmdzICYmIHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICB0aGlzLmFwaS5ncmlkLnNldENvbHVtbkRlZnMobm9ybWFsaXplZCk7XG4gICAgaWYgKHNhdmVkU2V0dGluZ3MpIHtcbiAgICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgIC4uLmdyaWRPcHRpb25zXG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9ucy5lbmFibGVTZWFyY2ggPSBvcHRpb25zLmVuYWJsZVYyXzE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ3JpZE9wdGlvbnMuZW5hYmxlQmFja2dyb3VuZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuZW5hYmxlQmFja2dyb3VuZCA9IG9wdGlvbnMuZW5hYmxlVjJfMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBncmlkT3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID1cbiAgICAgICAgZ3JpZE9wdGlvbnMuZW5hYmxlVjJfMSAmJiBvcHRpb25zLnJvd1NlbGVjdGlvbiAhPT0gR3JpZFJvd1NlbGVjdGlvblR5cGUuU0lOR0xFO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0ID0gb3B0aW9ucy5lbmFibGVTZWFyY2ggJiYgZGVmYXVsdEdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodDtcbiAgICB9XG5cbiAgICBpZiAoZ3JpZE9wdGlvbnMudXNlUGl2b3RHcmlkU3R5bGUpIHtcbiAgICAgIGNvbnN0IHJvd0hlaWdodCA9IDMwO1xuXG4gICAgICBvcHRpb25zLnJvd0hlaWdodCA9IHJvd0hlaWdodDtcbiAgICAgIG9wdGlvbnMuZGVmYXVsdENvbERlZiA9IHtcbiAgICAgICAgLi4ub3B0aW9ucy5kZWZhdWx0Q29sRGVmLFxuICAgICAgICBjZWxsQ2xhc3NSdWxlczogdGhpcy5nZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpLFxuICAgICAgICBoZWFkZXJDbGFzczogdGhpcy5nZXRQaXZvdEhlYWRlckNsYXNzLmJpbmQodGhpcyksXG4gICAgICAgIGNlbGxTdHlsZTogcGFyYW1zID0+IHtcbiAgICAgICAgICBjb25zdCBzdHlsZTogYW55ID0geyBsaW5lSGVpZ2h0OiBgJHtyb3dIZWlnaHR9cHhgIH07XG5cbiAgICAgICAgICBpZiAocGFyYW1zLmNvbERlZi50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLk51bWJlcikge1xuICAgICAgICAgICAgc3R5bGUudGV4dEFsaWduID0gJ2VuZCc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBvcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZiA9IHtcbiAgICAgICAgLi4ub3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYsXG4gICAgICAgIGNlbGxDbGFzc1J1bGVzOiB0aGlzLmdldFBpdm90TW9kZUNlbGxDbGFzc1J1bGVzKCksXG4gICAgICAgIGhlYWRlckNsYXNzOiB0aGlzLmdldFBpdm90SGVhZGVyQ2xhc3MuYmluZCh0aGlzKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIG5vcm1hbGl6ZU9wdGlvbnMocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzID0gcGFyYW1zLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXM7XG4gICAgY29uc3QgaGVhZGVyQ29tcG9uZW50UGFyYW1zID0geyBncmlkU2VydmljZTogdGhpcywgZ3JpZFF1ZXJ5OiB0aGlzLmdyaWRRdWVyeSB9O1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XG4gICAgICAuLi5oZWFkZXJDb21wb25lbnRQYXJhbXMsXG4gICAgICAuLi5wYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmXG4gICAgfTtcblxuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmID0ge1xuICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmRlZmF1bHRDb2xEZWYsXG4gICAgICBoZWFkZXJDb21wb25lbnRQYXJhbXNcbiAgICB9O1xuXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMgPSB0aGlzLm5vcm1hbGl6ZUNvbHVtbnMocGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMsIHBhcmFtcy5ncmlkT3B0aW9ucyk7XG5cbiAgICAvKiogQWRkIGNvcmUgZmlsdGVycyAqL1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5pc0V4dGVybmFsRmlsdGVyUHJlc2VudCA9ICgpID0+IHRydWU7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmRvZXNFeHRlcm5hbEZpbHRlclBhc3MgPSAocm93OiBSb3dOb2RlKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB2YWxpZGF0ZUZpbHRlcih7IHJvdywgYXBpOiB0aGlzLmdyaWRRdWVyeS5hcGkuZ3JpZCB9LCB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKSkgJiYgdGhpcy5yb3dNYXRjaGVzU2VhcmNoKHJvdylcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKiBXcmFwIHRoZSBzZXJ2ZXIgc2lkZSBwYWdpbmF0aW9uIGdldCByb3dzIGZ1bmN0aW9uICovXG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihwYXJhbXMuZ3JpZE9wdGlvbnMpKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuYmxvY2tMb2FkRGVib3VuY2VNaWxsaXMgPSAzMDA7XG4gICAgICB0aGlzLl9vcmlnaW5hbEdldFJvd3MgPSBwYXJhbXMuZ3JpZE9wdGlvbnMuZGF0YXNvdXJjZS5nZXRSb3dzO1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cyA9IHRoaXMud3JhcEdldFJvd3MocGFyYW1zLmdyaWRPcHRpb25zKTtcbiAgICAgIC8qIFRoZSBjYWNoZSBzaXplIGlzIHN5bmNlZCB3aXRoIHRoZSBwYWdpbmF0aW9uIHBhZ2Ugc2l6ZSAqL1xuICAgICAgY29uc3QgY2FjaGVTaXplID0gcGFyYW1zLmdyaWRPcHRpb25zLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICAgIGlmIChjYWNoZVNpemUpIHtcbiAgICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmNhY2hlQmxvY2tTaXplID0gY2FjaGVTaXplO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBFZGl0YWJsZSBjZWxsICovXG4gICAgdGhpcy5pbml0RWRpdGFibGVDb2x1bW5zQ2VsbENsYXNzKHBhcmFtcyk7XG5cbiAgICAvKiogV3JhcCBjb250ZXh0IG1lbnUgKi9cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZ2V0Q29udGV4dE1lbnVJdGVtcyA9IHRoaXMud3JhcENvbnRleHRNZW51QnVpbGRlcihwYXJhbXMpO1xuXG4gICAgLyoqIFNhdmUgZ3JpZCBzZXR0aW5ncyAqL1xuICAgIGNvbnN0IHsgc2F2ZVNldHRpbmdzLCBncmlkTmFtZSB9ID0gcGFyYW1zLmdyaWRPcHRpb25zO1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5zYXZlU2V0dGluZ3MgPSBzYXZlU2V0dGluZ3MgIT09IGZhbHNlICYmICFpc05pbChncmlkTmFtZSk7XG5cbiAgICAvKiogU2VydmVyIFNpZGUgUGFnaW5hdGlvbiBmb3Igc2VsZWN0IGFsbCBvcHRpb24gKi9cbiAgICB0aGlzLmluaXRPblJvd1NlbGVjdGVkRm9yU2VydmVyU2lkZVBhZ2luYXRpb24ocGFyYW1zKTtcblxuICAgIC8qKiBBZGQgdHJlZSBncmlkIHNwZWNpZmljIHJlcXVpcmVkIHNldHRpbmdzICovXG4gICAgaWYgKHRoaXMuaXNUcmVlRGF0YSkge1xuICAgICAgY29uc3QgaW5wdXRSb3dDbGFzc1J1bGVzID0gcGFyYW1zLmdyaWRPcHRpb25zLnJvd0NsYXNzUnVsZXM7XG5cbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5yb3dDbGFzc1J1bGVzID0ge1xuICAgICAgICAuLi5pbnB1dFJvd0NsYXNzUnVsZXMsXG4gICAgICAgICdhZy1lbXB0eS1mb2xkZXInOiBwYXJhbXMgPT4ge1xuICAgICAgICAgIHJldHVybiBwYXJhbXMuZGF0YS5pc0ZvbGRlciAmJiBzaXplKHBhcmFtcy5ub2RlLmNoaWxkcmVuQWZ0ZXJHcm91cCkgPT09IDA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEFkZCBwaXZvdCBzcGVjaWZpYyByZXF1aXJlZCBzZXR0aW5ncyAqL1xuICAgIGlmICh0aGlzLmlzUGl2b3RNb2RlKSB7XG4gICAgICB0aGlzLmluaXRQaXZvdFNlY29uZGFyeUNvbHNQcm9jZXNzKHBhcmFtcyk7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuc2F2ZVNldHRpbmdzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGl2b3RIZWFkZXJDbGFzcyhwYXJhbXMpIHtcbiAgICBjb25zdCBncmlkUXVlcnkgPSBwYXJhbXMuY29sRGVmLmhlYWRlckNvbXBvbmVudFBhcmFtcy5ncmlkUXVlcnk7XG4gICAgbGV0IGNlbGxDbGFzcyA9ICcnO1xuXG4gICAgaWYgKGdyaWRRdWVyeSAmJiBncmlkUXVlcnkuYXBpKSB7XG4gICAgICBjb25zdCB7IGNvbHVtbnMgfSA9IGdyaWRRdWVyeS5hcGkgYXMgRGF0b0dyaWRBcGk7XG4gICAgICAvKiogVXNlIGdldFBpdm90UmVzdWx0Q29sdW1ucyBmcm9tIHZlciAyOCAqL1xuICAgICAgY29uc3QgcGl2b3RDb2x1bW5zID0gY29sdW1ucy5nZXRTZWNvbmRhcnlDb2x1bW5zKCk7XG5cbiAgICAgIGlmIChwaXZvdENvbHVtbnMgJiYgcGl2b3RDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2VsbENsYXNzICs9ICd0b3AtYm9yZGVyJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2VsbENsYXNzO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVDb2x1bW5zKGNvbERlZnM6IERhdG9HcmlkQ29sdW1uRGVmW10sIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMgPSBudWxsKTogRGF0b0dyaWRDb2x1bW5EZWZbXSB7XG4gICAgaWYgKCFncmlkT3B0aW9ucykge1xuICAgICAgZ3JpZE9wdGlvbnMgPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkQ29sRGVmcyA9IGNvbERlZnMubWFwKChjb2w6IERhdG9HcmlkQ29sdW1uRGVmKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgICAgICAuLi5jb2wsXG4gICAgICAgIGhlYWRlck5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShjb2wuaGVhZGVyTmFtZSlcbiAgICAgIH07XG4gICAgICAvKiogQWRqdXN0IHRoZSB3aWR0aCBpbiBjYXNlIHRoZSBjb2x1bW4gaGFzIGluZm8gKi9cbiAgICAgIGlmIChjb2wuaW5mbykge1xuICAgICAgICBub3JtYWxpemVkLm1pbldpZHRoID0gY29sLm1pbldpZHRoIHx8IEdyaWRNaW5XaWR0aHMuV2l0aF9JbmZvO1xuICAgICAgfVxuICAgICAgaWYgKCFjb2wuY29sSWQpIHtcbiAgICAgICAgbm9ybWFsaXplZC5jb2xJZCA9IGNvbC5maWVsZDtcbiAgICAgIH1cbiAgICAgIGlmIChub3JtYWxpemVkLnR5cGUgPT09IERhdG9HcmlkQ29sdW1uVHlwZXMuSXRlbXMgJiYgIW5vcm1hbGl6ZWQuZmlsdGVyc0NvbmZpZykge1xuICAgICAgICBub3JtYWxpemVkLmZpbHRlcnNDb25maWcgPSB7IHNlY3Rpb25zOiBEYXRvR3JpZEZpbHRlclNlY3Rpb25zLkNvbmRpdGlvbmFsIH07XG4gICAgICB9XG4gICAgICB0aGlzLm5vcm1hbGl6ZUNvbHVtblNlYXJjaENvbmZpZyhncmlkT3B0aW9ucywgY29sLCBub3JtYWxpemVkKTtcbiAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRkTXVsdGlTZWxlY3RIZWFkZXJDb2x1bW5JZlJlcXVpcmVkKHVwZGF0ZWRDb2xEZWZzLCBncmlkT3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUNvbHVtblNlYXJjaENvbmZpZyhcbiAgICBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zLFxuICAgIGNvbDogRGF0b0dyaWRDb2x1bW5EZWYsXG4gICAgbm9ybWFsaXplZDogRGF0b0dyaWRDb2x1bW5EZWZcbiAgKSB7XG4gICAgLyoqIENoZWNrIGlmIGNvbHVtbiBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBzZWFyY2ggKiovXG4gICAgY29uc3QgaXNTZXJ2ZXJQYWdpbmF0aW9uID0gdGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRPcHRpb25zKTtcbiAgICBpZiAodHlwZW9mIGNvbC5pbmNsdWRlSW5TZWFyY2ggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoaXNTZXJ2ZXJQYWdpbmF0aW9uICYmIGNvbC50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLkRhdGUpIHtcbiAgICAgICAgbm9ybWFsaXplZC5pbmNsdWRlSW5TZWFyY2ggPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoID1cbiAgICAgICAgICB0eXBlb2YgZ3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHQgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IGdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0XG4gICAgICAgICAgICA6IGRlZmF1bHRHcmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgbm9ybWFsaXplZC5pbmNsdWRlSW5TZWFyY2ggJiZcbiAgICAgICF0aGlzLmhhc0NlbGxSZW5kZXJlcihub3JtYWxpemVkLCBncmlkT3B0aW9ucykgJiZcbiAgICAgIGdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodFxuICAgICkge1xuICAgICAgbm9ybWFsaXplZC5jZWxsUmVuZGVyZXIgPSAocGFyYW1zOiBJQ2VsbFJlbmRlcmVyUGFyYW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbG93SFRNTCA9IGlzSHRtbEFsbG93ZWRGb3JDb2woZ3JpZE9wdGlvbnMsIHBhcmFtcy5jb2xEZWYpO1xuICAgICAgICBjb25zdCBpc0VkaXRhYmxlID1cbiAgICAgICAgICAoaXNGdW5jdGlvbihub3JtYWxpemVkLmVkaXRhYmxlKSAmJiBub3JtYWxpemVkLmVkaXRhYmxlKHBhcmFtcykpIHx8XG4gICAgICAgICAgKCFpc0Z1bmN0aW9uKG5vcm1hbGl6ZWQuZWRpdGFibGUpICYmIG5vcm1hbGl6ZWQuZWRpdGFibGUpO1xuXG4gICAgICAgIHJldHVybiBpc0VkaXRhYmxlXG4gICAgICAgICAgPyBlZGl0YWJsZUNlbGxSZW5kZXJlcldpdGhTZWFyY2hIaWdobGlnaHQocGFyYW1zLCB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCksIGFsbG93SFRNTClcbiAgICAgICAgICA6IHNlYXJjaEhpZ2hsaWdodENlbGxSZW5kZXJlcihwYXJhbXMsIHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSwgYWxsb3dIVE1MKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNDZWxsUmVuZGVyZXIoY29sdW1uOiBEYXRvR3JpZENvbHVtbkRlZiwgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGlmIChjb2x1bW4uY2VsbFJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGNvbHVtbi50eXBlIGFzIHN0cmluZztcbiAgICBjb25zdCBjb2x1bW5UeXBlSGFzQ2VsbFJlbmRlcmVyID0gKG9wdGlvbnM6IFBhcnRpYWw8RGF0b0dyaWRPcHRpb25zPik6IGJvb2xlYW4gPT5cbiAgICAgIG9wdGlvbnMuY29sdW1uVHlwZXMgJiYgISFvcHRpb25zLmNvbHVtblR5cGVzW3R5cGVdICYmICEhb3B0aW9ucy5jb2x1bW5UeXBlc1t0eXBlXS5jZWxsUmVuZGVyZXI7XG5cbiAgICByZXR1cm4gY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlcihncmlkT3B0aW9ucykgfHwgY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlcihkZWZhdWx0R3JpZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNdWx0aVNlbGVjdEhlYWRlckNvbHVtbklmUmVxdWlyZWQoXG4gICAgY29sdW1uRGVmczogRGF0b0dyaWRDb2x1bW5EZWZbXSxcbiAgICBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zXG4gICk6IERhdG9HcmlkQ29sdW1uRGVmW10ge1xuICAgIGNvbnN0IHNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgPSBncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzO1xuICAgIGNvbnN0IHJvd1NlbGVjdGlvbiA9XG4gICAgICBncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb24gPyBncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb24gOiBkZWZhdWx0R3JpZE9wdGlvbnMucm93U2VsZWN0aW9uO1xuXG4gICAgaWYgKHNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgJiYgcm93U2VsZWN0aW9uID09PSBHcmlkUm93U2VsZWN0aW9uVHlwZS5NVUxUSVBMRSkge1xuICAgICAgY29uc3QgY2hlY2tib3hlc0NvbHVtbjogRGF0b0dyaWRDb2x1bW5EZWYgPSB7XG4gICAgICAgIGNvbElkOiB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQsXG4gICAgICAgIGNoZWNrYm94U2VsZWN0aW9uOiB0cnVlLFxuICAgICAgICBoZWFkZXJDb21wb25lbnRGcmFtZXdvcms6IERhdG9HcmlkTXVsdGlTZWxlY3RDb2x1bW5IZWFkZXJDb21wb25lbnQsXG4gICAgICAgIG1pbldpZHRoOiAyOSxcbiAgICAgICAgd2lkdGg6IDI5LFxuICAgICAgICBtYXhXaWR0aDogMjksXG4gICAgICAgIHN1cHByZXNzU2l6ZVRvRml0OiB0cnVlLFxuICAgICAgICBjZWxsQ2xhc3M6ICdjaGVja2JveC1zZWxlY3Rpb24tY2VsbCcsXG4gICAgICAgIGhlYWRlckNsYXNzOiAnaGVhZGVyLWNoZWNrYm94LXNlbGVjdGlvbi1jZWxsJyxcbiAgICAgICAgcmVzaXphYmxlOiBmYWxzZSxcbiAgICAgICAgcGlubmVkOiAnbGVmdCcsXG4gICAgICAgIGxvY2tQb3NpdGlvbjogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZUluU2VhcmNoOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHJldHVybiBbY2hlY2tib3hlc0NvbHVtbiwgLi4uY29sdW1uRGVmc107XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5EZWZzO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0T25Sb3dTZWxlY3RlZEZvclNlcnZlclNpZGVQYWdpbmF0aW9uKHsgZ3JpZE9wdGlvbnMgfTogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIGlmICghdGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRPcHRpb25zKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHRlcm5hbE9uUm93U2VsZWN0ZWQgPSBncmlkT3B0aW9ucy5vblJvd1NlbGVjdGVkO1xuICAgIGdyaWRPcHRpb25zLm9uUm93U2VsZWN0ZWQgPSAoZXZ0OiBSb3dTZWxlY3RlZEV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTZWxlY3RBbGxSb3dzRW5hYmxlZCkge1xuICAgICAgICBjb25zdCBub2RlID0gZXZ0Lm5vZGU7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBub2RlLmlzU2VsZWN0ZWQoKTtcbiAgICAgICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgICAgIGNvbnN0IGlzRXhjbHVkZWQgPSBleGNsdWRlZEZyb21TZWxlY3RBbGwuaW5jbHVkZXMobm9kZS5pZCk7XG4gICAgICAgIGlmIChpc1NlbGVjdGVkICYmIGlzRXhjbHVkZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHtcbiAgICAgICAgICAgIGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmZpbHRlcigobm9kZUlkOiBzdHJpbmcpID0+IG5vZGVJZCAhPT0gbm9kZS5pZClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNTZWxlY3RlZCAmJiAhaXNFeGNsdWRlZCkge1xuICAgICAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyBleGNsdWRlZEZyb21TZWxlY3RBbGw6IFsuLi5leGNsdWRlZEZyb21TZWxlY3RBbGwsIG5vZGUuaWRdIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXh0ZXJuYWxPblJvd1NlbGVjdGVkKSB7XG4gICAgICAgIGV4dGVybmFsT25Sb3dTZWxlY3RlZChldnQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJvd01hdGNoZXNTZWFyY2gocm93OiBSb3dOb2RlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VhcmNoVGVybSA9ICh0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCkgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGlmIChpc0VtcHR5KHNlYXJjaFRlcm0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuaW5jbHVkZUhpZGRlbkNvbHVtbnNJblNlYXJjaFxuICAgICAgPyB0aGlzLmdyaWRRdWVyeS5nZXRBbGxDb2x1bW5zKClcbiAgICAgIDogdGhpcy5ncmlkUXVlcnkuZ2V0QWxsRGlzcGxheWVkQ29sdW1ucygpO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbERlZiA9IHRoaXMuYXBpLmdyaWQuZ2V0Q29sdW1uRGVmKGNvbC5nZXRDb2xJZCgpKSBhcyBEYXRvR3JpZENvbHVtbkRlZjtcbiAgICAgIGlmICghY29sRGVmLmluY2x1ZGVJblNlYXJjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvd1ZhbHVlID0gKHRoaXMuYXBpLmdyaWQuZ2V0VmFsdWUoY29sLmdldENvbElkKCksIHJvdykgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChyb3dWYWx1ZS5pbmNsdWRlcyhzZWFyY2hUZXJtKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmaXRHcmlkKCdjb250YWluZXInKSBpbnN0ZWFkXG4gICAqL1xuICBmaXRUb0NvbnRhaW5lcigpIHtcbiAgICB0aGlzLmFwaS5ncmlkLnNpemVDb2x1bW5zVG9GaXQoKTtcbiAgfVxuXG4gIGdldEN1c3RvbUhlYWRlcihmaWVsZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcykge1xuICAgICAgY29uc3Qgc3BlY2lmaWMgPSB0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMuZmluZCgoeyBjb2x1bW4gfSkgPT4gY29sdW1uID09PSBmaWVsZCk7XG4gICAgICBjb25zdCBjb21tb24gPSB0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMuZmluZCgoeyBjb2x1bW4gfSkgPT4gIWNvbHVtbik7XG4gICAgICBpZiAoc3BlY2lmaWMgfHwgY29tbW9uKSB7XG4gICAgICAgIGNvbnN0IHsgbW9yZU1lbnUsIGN1c3RvbUhlYWRlciB9ID0ge1xuICAgICAgICAgIG1vcmVNZW51OiAoc3BlY2lmaWMgJiYgc3BlY2lmaWMubW9yZU1lbnUpIHx8IChjb21tb24gJiYgY29tbW9uLm1vcmVNZW51KSxcbiAgICAgICAgICBjdXN0b21IZWFkZXI6IChzcGVjaWZpYyAmJiBzcGVjaWZpYy5jdXN0b21IZWFkZXIpIHx8IChjb21tb24gJiYgY29tbW9uLmN1c3RvbUhlYWRlcilcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHsgbW9yZU1lbnU6IG1vcmVNZW51ICYmIG1vcmVNZW51LnRwbCwgY3VzdG9tSGVhZGVyOiBjdXN0b21IZWFkZXIgJiYgY3VzdG9tSGVhZGVyLnRwbCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNsZWFyQWxsRmlsdGVycygpIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlcjoge30sXG4gICAgICAgICAgc2VhcmNoVGVybTogbnVsbFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gIH1cblxuICBjbGVhckNvbHVtbkZpbHRlcihjb2x1bW5GaWVsZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBbY29sdW1uRmllbGRdOiBkZWxldGVkLCAuLi5maWx0ZXIgfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgZmlsdGVyXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIHNldENvbHVtbkZpbHRlcihjb2x1bW46IENvbHVtbiwgZmlsdGVyOiBEYXRvR3JpZEZpbHRlciwgbm90aWZ5R3JpZCA9IHRydWUpIHtcbiAgICB0aGlzLl9sb2dFdmVudChDb3JlRXZlbnRUeXBlcy5HUklEX0ZJTFRFUl9BUFBMSUVELCB7XG4gICAgICBjb2x1bW46IGNvbHVtbi5nZXRDb2xJZCgpLFxuICAgICAgbnVtT2ZDb25kaXRpb25zOiAoZmlsdGVyLmNvbmRpdGlvbmFsICYmIGZpbHRlci5jb25kaXRpb25hbC5jb25kaXRpb25zLmxlbmd0aCkgfHwgMCxcbiAgICAgIGJ5VmFsdWU6ICEhZmlsdGVyLmJ5VmFsdWUgPyAnWWVzJyA6ICdObydcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlRmlsdGVyKGNvbHVtbiwgZmlsdGVyKTtcblxuICAgIGlmIChub3RpZnlHcmlkKSB7XG4gICAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldEdyaWRGaWx0ZXJzKGZpbHRlcnM6IERhdG9HcmlkRXh0ZXJuYWxGaWx0ZXJbXSkge1xuICAgIGlmICh0aGlzLmFwaSAmJiBmaWx0ZXJzKSB7XG4gICAgICBsZXQgYXBwbGllZEZpbHRlciA9IHt9O1xuXG4gICAgICBmb3IgKGNvbnN0IHsgZmlsdGVyLCBmaWVsZCB9IG9mIGZpbHRlcnMpIHtcbiAgICAgICAgYXBwbGllZEZpbHRlcltmaWVsZF0gPSBmaWx0ZXI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoeyBmaWx0ZXI6IGFwcGxpZWRGaWx0ZXIgfSk7XG4gICAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFNvcnRCeUNvbHVtbihjb2xJZCwgc29ydCkge1xuICAgIGNvbnN0IHNvcnRUb1NldCA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNvcnQoeyBjb2xJZCwgc29ydCB9KTtcblxuICAgIHRoaXMuc2V0R3JpZFNvcnQoc29ydFRvU2V0KTtcbiAgfVxuXG4gIHNldEdyaWRTb3J0KGdyaWRTb3J0OiBEYXRvR3JpZFNvcnQpIHtcbiAgICBpZiAoZ3JpZFNvcnQgJiYgdGhpcy5hcGkgJiYgdGhpcy5hcGkuZ3JpZC5nZXREaXNwbGF5ZWRSb3dDb3VudCgpID4gMCkge1xuICAgICAgY29uc3QgeyBjb2xJZCwgc29ydCwgc29ydEluZGV4IH0gPSBncmlkU29ydDtcbiAgICAgIGNvbnN0IGdyaWRDb2x1bW5zID0gdGhpcy5hcGkuY29sdW1ucy5nZXRBbGxHcmlkQ29sdW1ucygpO1xuXG4gICAgICBpZiAoZ3JpZENvbHVtbnMpIHtcbiAgICAgICAgbGV0IHNvcnRUb0FwcGx5ID0gZ3JpZFNvcnQ7XG4gICAgICAgIC8qKiBTb3J0IGJ5IGNvbHVtbiBpZCAqL1xuICAgICAgICBjb25zdCBjb2x1bW5CeUlkID0gZ3JpZENvbHVtbnMuZmluZCgoY29sOiBDb2x1bW4pID0+IHtcbiAgICAgICAgICByZXR1cm4gKGNvbC5nZXRDb2xEZWYoKS5zaG93Um93R3JvdXAgfHwgY29sLmdldENvbElkKCkpID09PSBjb2xJZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbHVtbkJ5SWQpIHtcbiAgICAgICAgICBzb3J0VG9BcHBseSA9IHsgY29sSWQ6IGNvbHVtbkJ5SWQuZ2V0Q29sSWQoKSwgc29ydCB9O1xuICAgICAgICB9IGVsc2UgaWYgKCFpc05pbChzb3J0SW5kZXgpKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVDb2x1bW5zID0gdGhpcy5hcGkuY29sdW1ucy5nZXRWYWx1ZUNvbHVtbnMoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZUNvbHVtbiA9IHZhbHVlQ29sdW1ucy5maW5kKChjb2w6IENvbHVtbikgPT4gY29sLmdldENvbElkKCkgPT09IGNvbElkKTtcbiAgICAgICAgICBjb25zdCBpc1Bpdm90Q29sSWQgPSBjb2xJZC5zdGFydHNXaXRoKCdwaXZvdCcpO1xuXG4gICAgICAgICAgaWYgKGlzUGl2b3RDb2xJZCB8fCB2YWx1ZUNvbHVtbikge1xuICAgICAgICAgICAgLyoqIENvbHVtbiBpcyBwaXZvdCB2YWx1ZSBjb2x1bW4sIHNvcnQgYnkgaW5kZXggKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkJ5SW5kZXggPSBncmlkQ29sdW1uc1tzb3J0SW5kZXhdO1xuXG4gICAgICAgICAgICBzb3J0VG9BcHBseSA9IHsgY29sSWQ6IGNvbHVtbkJ5SW5kZXguZ2V0Q29sSWQoKSwgc29ydCwgc29ydEluZGV4IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyh7IHNvcnQ6IHNvcnRUb0FwcGx5IH0pO1xuICAgICAgICB0aGlzLmFwaS5ncmlkLnNldFNvcnRNb2RlbChbc29ydFRvQXBwbHldKTtcblxuICAgICAgICBpZiAoKHRoaXMuZ3JpZFJlZi5ncmlkT3B0aW9ucyBhcyBEYXRvR3JpZE9wdGlvbnMpLnVzZVBpdm90R3JpZFN0eWxlKSB7XG4gICAgICAgICAgdGhpcy5hcGkuZ3JpZC5yZWRyYXdSb3dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlcihjb2x1bW46IENvbHVtbiwgZmlsdGVyOiBEYXRvR3JpZEZpbHRlcikge1xuICAgIGNvbnN0IGNvbEZpZWxkID0gZ2V0Q29sRmllbGQoY29sdW1uLmdldENvbERlZigpKTtcblxuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncy5maWx0ZXIsXG4gICAgICAgICAgICBbY29sRmllbGRdOiBmaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzZXRTZWFyY2hUZXJtKHNlYXJjaFRlcm06IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgc2VhcmNoVGVybVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gIH1cblxuICBzZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbihjb25maWc6IFBhcnRpYWw8U2VydmVyU2lkZVBhZ2luYXRpb25Db25maWc+KSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VydmVyU2lkZVBhZ2luYXRpb246IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXJ2ZXJTaWRlUGFnaW5hdGlvbixcbiAgICAgICAgICAuLi5jb25maWdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldExvYWRpbmcoc2hvdzogYm9vbGVhbikge1xuICAgIGlmIChzaG93KSB7XG4gICAgICB0aGlzLmFwaS5ncmlkLnNob3dMb2FkaW5nT3ZlcmxheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwaS5ncmlkLmdldERpc3BsYXllZFJvd0NvdW50KCkgPT09IDAgPyB0aGlzLnNldE92ZXJsYXkodHJ1ZSkgOiB0aGlzLnNldE92ZXJsYXkoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0T3ZlcmxheSBpbnN0ZWFkXG4gICAqIEBwYXJhbSBzaG93XG4gICAqL1xuICBzZXROb0RhdGEoc2hvdzogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0T3ZlcmxheShzaG93KTtcbiAgfVxuXG4gIHNldE92ZXJsYXkoc2hvdzogYm9vbGVhbikge1xuICAgIHNob3cgPyB0aGlzLmFwaS5ncmlkLnNob3dOb1Jvd3NPdmVybGF5KCkgOiB0aGlzLmFwaS5ncmlkLmhpZGVPdmVybGF5KCk7XG4gIH1cblxuICB1cGRhdGVTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgLi4uc2V0dGluZ3NcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpdEdyaWQodG86ICdjb250YWluZXInIHwgJ2NvbnRlbnQnKSB7XG4gICAgdG8gPT09ICdjb250YWluZXInID8gdGhpcy5hcGkuZ3JpZC5zaXplQ29sdW1uc1RvRml0KCkgOiB0aGlzLmFwaS5jb2x1bW5zLmF1dG9TaXplQWxsQ29sdW1ucygpO1xuICAgIGNvbnN0IGdyaWRBbGlnbm1lbnQgPSB0byA9PT0gJ2NvbnRhaW5lcicgPyBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEFJTkVSIDogRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRFTlQ7XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyh7IGdyaWRBbGlnbm1lbnQsIGNvbHVtbnNTaXplczogbnVsbCB9KTtcbiAgfVxuXG4gIHNhdmVTZXR0aW5nc1RvU2VydmVyKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5zdG9yYWdlQVBJLnNldCh0aGlzLmdyaWROYW1lLCBzZXR0aW5ncyk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIHVzZWQgdG8gbG9nIGdyaWQgZXZlbnRzIHRvIHRoZSBwbGF0Zm9ybSdzIGxvZ2dpbmcgc2VydmljZVxuICAgKi9cbiAgX2xvZ0V2ZW50KGV2ZW50VHlwZTogQ29yZUV2ZW50VHlwZXMsIGV2ZW50UHJvcGVydGllcz86IEhhc2hNYXA8YW55Pikge1xuICAgIHRoaXMubG9nZ2VyLmxvZ0V2ZW50KGV2ZW50VHlwZSwgeyB0YWJsZTogdGhpcy5ncmlkTmFtZSwgLi4uZXZlbnRQcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwU3VjY2Vzc0NhbGxiYWNrKHsgc3VjY2Vzc0NiLCBwYWdlTnVtYmVyLCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgfTogU3VjY2Vzc1dyYXBwZXJQYXJhbXMpIHtcbiAgICByZXR1cm4gKHJvd3NUaGlzQmxvY2s6IGFueVtdLCB0b3RhbFJvd3M6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IHRvdGFsUm93cywgaGFzRXJyb3I6IGZhbHNlIH0pO1xuICAgICAgc3VjY2Vzc0NiKHJvd3NUaGlzQmxvY2ssIHRvdGFsUm93cyk7XG4gICAgICB0aGlzLmdyaWRRdWVyeS5fc2VydmVyRGF0YUxvYWRlZC5uZXh0KHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaS5ncmlkLFxuICAgICAgICBjb2x1bW5BcGk6IHRoaXMuYXBpLmNvbHVtbnMsXG4gICAgICAgIHR5cGU6ICdTZXJ2ZXJEYXRhTG9hZGVkJyxcbiAgICAgICAgcGFnaW5hdGlvblBhZ2U6IHBhZ2VOdW1iZXJcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgLyoqIHNvIHRoZSBncmlkIGZpdHMgaW4gZXZlcnkgbmV3IGRhdGEgaW5wdXQgKi9cbiAgICAgICAgdHJpZ2dlcldpbmRvd1Jlc2l6ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0VG90YWxSb3dzID0gdG90YWxSb3dzO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHdyYXBHZXRSb3dzKG9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucywgZ2V0Um93cz86IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZCkge1xuICAgIGNvbnN0IGdldFJvd3NDYiA9IGdldFJvd3MgfHwgb3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3M7XG4gICAgcmV0dXJuIChnZXRSb3dzUGFyYW1zOiBJR2V0Um93c1BhcmFtcykgPT4ge1xuICAgICAgY29uc3QgeyBzdGFydFJvdywgZW5kUm93LCBzb3J0TW9kZWwsIHN1Y2Nlc3NDYWxsYmFjayB9ID0gZ2V0Um93c1BhcmFtcztcbiAgICAgIGNvbnN0IHBhZ2VTaXplID0gb3B0aW9ucy5wYWdpbmF0aW9uUGFnZVNpemUgfHwgMTAwO1xuICAgICAgY29uc3QgaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWQgPSB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA+IDA7XG4gICAgICBjb25zdCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgPSBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZCAmJiBzdGFydFJvdyA9PT0gMDtcblxuICAgICAgY29uc3QgcGFnZU51bWJlciA9IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkXG4gICAgICAgID8gdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggKyAxXG4gICAgICAgIDogTWF0aC5jZWlsKGVuZFJvdyAvIHBhZ2VTaXplKTtcblxuICAgICAgdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPSAtMTtcblxuICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgICBjb25zdCBuZXdQYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcyA9IHtcbiAgICAgICAgLi4uZ2V0Um93c1BhcmFtcyxcbiAgICAgICAgZmFpbENhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGhhc0Vycm9yOiB0cnVlIH0pO1xuICAgICAgICAgIHRoaXMuc2V0T3ZlcmxheSh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3VjY2Vzc0NhbGxiYWNrOiB0aGlzLndyYXBTdWNjZXNzQ2FsbGJhY2soeyBwYWdlTnVtYmVyLCBzdWNjZXNzQ2I6IHN1Y2Nlc3NDYWxsYmFjaywgaXNQZW5kaW5nUmV0dXJuVG9QYWdlIH0pLFxuICAgICAgICBzZXJ2ZXJDb25maWc6IHtcbiAgICAgICAgICBwYWdlU2l6ZSxcbiAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICAgIGNvbHVtbkZpbHRlcnM6IGlzRW1wdHkoZmlsdGVyKSB8fCBvcHRpb25zLmVuYWJsZVYyXzEgPyBudWxsIDogdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzKGZpbHRlciksXG4gICAgICAgICAgZmlsdGVyOiBvcHRpb25zLmVuYWJsZVYyXzEgPyB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnNfdjJfMShvcHRpb25zLmNvbHVtbkRlZnMpIDogbnVsbCxcbiAgICAgICAgICBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdFNvcnQoc29ydE1vZGVsKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKGlzUGVuZGluZ1JldHVyblRvUGFnZSkge1xuICAgICAgICAvLyBTY2VuYXJpbyB0aGUgZm9sbG93aW5nIGhhbmRsZXMgLSBzZXJ2ZXIgcmVmcmVzaCB3aGVyZSBpdCB3YXMgcmVxdWVzdGVkIHRvIGtlZXAgdGhlIGN1cnJlbnQgcGFnZS5cbiAgICAgICAgLy8gVGhlIHByb2JsZW0gLSBnZXRSb3dzIHdpbGwgaW5pdGlhbGx5IGJlIGNhbGxlZCBmb3IgcGFnZSAxIChhdXRvbWF0aWNhbGx5IGhhcHBlbnMgd2hlbiBjYWxsaW5nIGFnLWdyaWQncyBzZXREYXRhU291cmNlKS5cbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gdHJpZ2dlciBpdCBhZ2Fpbiwgc3VjY2Vzc0NhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHRoZSBkZXNpcmVkIHBhZ2UuXG4gICAgICAgIC8vIGZha2VHZXRSb3dzIGlzIHVzZWQgaW4gb3JkZXIgdG8gYXZvaWQgcmV0cmlldmluZyB0aGUgdW5uZWNlc3NhcnkgcmVhbCBkYXRhIGZvciBwYWdlIDEuXG4gICAgICAgIGNvbnN0IGZha2VHZXRSb3dzID0gKHsgc3VjY2Vzc0NhbGxiYWNrIH06IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4ge1xuICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhbXSwgdGhpcy5sYXN0VG90YWxSb3dzKTtcbiAgICAgICAgfTtcbiAgICAgICAgZmFrZUdldFJvd3MobmV3UGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdldFJvd3NDYihuZXdQYXJhbXMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGluaXRFZGl0YWJsZUNvbHVtbnNDZWxsQ2xhc3MocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMuZm9yRWFjaChjb2xEZWYgPT4ge1xuICAgICAgaWYgKGNvbERlZi5lZGl0YWJsZSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjb2xEZWYuZWRpdGFibGUpKSB7XG4gICAgICAgICAgY29uc3QgaW5pdGlhbENlbGxDbGFzcyA9IGNvbERlZi5jZWxsQ2xhc3M7XG4gICAgICAgICAgY29sRGVmLmNlbGxDbGFzcyA9IChjZWxsQ2xhc3NQYXJhbXM6IENlbGxDbGFzc1BhcmFtcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNFZGl0YWJsZSA9IChjb2xEZWYuZWRpdGFibGUgYXMgRnVuY3Rpb24pKGNlbGxDbGFzc1BhcmFtcyBhcyBhbnkpO1xuICAgICAgICAgICAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVSZXN1bHQgPSB0aGlzLmFkZEVkaXRhYmxlQ2VsbENsYXNzKGluaXRpYWxDZWxsQ2xhc3MpO1xuICAgICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihlZGl0YWJsZVJlc3VsdCkgPyBlZGl0YWJsZVJlc3VsdChjZWxsQ2xhc3NQYXJhbXMpIDogZWRpdGFibGVSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihpbml0aWFsQ2VsbENsYXNzKSA/IGluaXRpYWxDZWxsQ2xhc3MoY2VsbENsYXNzUGFyYW1zKSA6IGluaXRpYWxDZWxsQ2xhc3M7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xEZWYuY2VsbENsYXNzID0gdGhpcy5hZGRFZGl0YWJsZUNlbGxDbGFzcyhjb2xEZWYuY2VsbENsYXNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwQ29udGV4dE1lbnVCdWlsZGVyKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIGNvbnN0IHsgY3VzdG9tQ29udGV4dE1lbnUgfSA9IHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgICBjb25zdCBhbGxBY3Rpb25zID0gaXNGdW5jdGlvbihjdXN0b21Db250ZXh0TWVudSkgPyBjdXN0b21Db250ZXh0TWVudShwYXJhbXMucm93QWN0aW9ucykgOiBwYXJhbXMucm93QWN0aW9ucztcbiAgICB0aGlzLnRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhbGxBY3Rpb25zKTtcbiAgICBjb25zdCBjb3B5QWN0aW9uOiBSb3dBY3Rpb24gPSB7XG4gICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKCdjb3JlLmNvcHktY2VsbCcpLFxuICAgICAgaWNvbjogJ2NvcHknLFxuICAgICAga2V5OiAnQ29weSBDZWxsJ1xuICAgIH07XG4gICAgcmV0dXJuICh7IG5vZGUsIGNvbHVtbiwgY29udGV4dCB9OiBHZXRDb250ZXh0TWVudUl0ZW1zUGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBvbkhvdmVyQWN0aW9uTWVudSA9IGNvbnRleHQgJiYgY29udGV4dC5jb250ZXh0TWVudSAmJiBjb250ZXh0LmNvbnRleHRNZW51LmZyb21PbkhvdmVyO1xuICAgICAgaWYgKCFub2RlKSByZXR1cm4gW107XG4gICAgICBsZXQgc2VsZWN0ZWQgPSBbbm9kZV07XG4gICAgICBsZXQgcm93c0NvdW50ID0gMTtcbiAgICAgIGlmIChvbkhvdmVyQWN0aW9uTWVudSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRDb250ZXh0KHsgY29udGV4dE1lbnU6IHsgZnJvbU9uSG92ZXI6IGZhbHNlIH0gfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3B5QWN0aW9uLm9uQ2xpY2sgPSAoW3Jvd10pID0+IHtcbiAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHRoaXMuYXBpLmdyaWQuZ2V0VmFsdWUoY29sdW1uLmdldENvbElkKCksIHJvdyk7XG4gICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gY29sdW1uLmdldENvbERlZigpLnZhbHVlRm9ybWF0dGVyO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybWF0dGVyICYmIHR5cGVvZiBmb3JtYXR0ZXIgIT09ICdzdHJpbmcnID8gZm9ybWF0dGVyKHJhd1ZhbHVlKSA6IHJhd1ZhbHVlO1xuICAgICAgICAgIHdyaXRlVG9DbGlwYm9hcmQodmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAobm9kZS5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICBzZWxlY3RlZCA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNlbGVjdGVkUm93Tm9kZXMoKTtcbiAgICAgICAgICByb3dzQ291bnQgPSBzaXplKHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgdmlzaWJsZUFjdGlvbnMgPSBnZXRWaXNpYmxlQWN0aW9ucyhcbiAgICAgICAgYWxsQWN0aW9ucyxcbiAgICAgICAgcm93c0NvdW50LFxuICAgICAgICBzZWxlY3RlZCxcbiAgICAgICAgdGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTZWxlY3RBbGxSb3dzRW5hYmxlZFxuICAgICAgKS5maWx0ZXIoKHsgdmlzaWJsZSB9KSA9PiB2aXNpYmxlKTtcbiAgICAgIGxldCB0b29sYmFyQWN0aW9ucyA9IFtjb3B5QWN0aW9uXTtcbiAgICAgIGlmIChvbkhvdmVyQWN0aW9uTWVudSkge1xuICAgICAgICB0b29sYmFyQWN0aW9ucyA9IHZpc2libGVBY3Rpb25zO1xuICAgICAgfSBlbHNlIGlmICh2aXNpYmxlQWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zID0gW3sgLi4uY29weUFjdGlvbiwgc2VwYXJhdG9yOiB0cnVlIH0sIC4uLnZpc2libGVBY3Rpb25zXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnZlcnRlclBhcmFtczogQWN0aW9uQ29udmVydGVyUGFyYW1zID0ge1xuICAgICAgICB0b29sYmFyQWN0aW9ucyxcbiAgICAgICAgc2VsZWN0ZWRSb3dzOiBzZWxlY3RlZCxcbiAgICAgICAgaWNvblJlZ2lzdHJ5OiB0aGlzLnN2Z1JlZ2lzdHJ5LFxuICAgICAgICBub2RlLFxuICAgICAgICBsb2dnZXI6IHtcbiAgICAgICAgICBsb2c6IHRoaXMuX2xvZ0V2ZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgZXZlbnRPcmlnaW46IG9uSG92ZXJBY3Rpb25NZW51ID8gJ09uIEhvdmVyJyA6ICdDb250ZXh0IE1lbnUnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gdG9vbGJhckFjdGlvblRvQ29udGV4dEFjdGlvbihjb252ZXJ0ZXJQYXJhbXMpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhbGxBY3Rpb25zOiBSb3dBY3Rpb25bXSkge1xuICAgIGFsbEFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgYWN0aW9uLmxhYmVsID0gdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKGFjdGlvbi5sYWJlbCk7XG4gICAgICBpZiAoYWN0aW9uLnN1Yk1lbnUpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVBY3Rpb25MYWJlbHMoYWN0aW9uLnN1Yk1lbnUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9hZFNhdmVkU2V0dGluZ3Moc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICBjb25zdCB7XG4gICAgICBzb3J0LFxuICAgICAgaGlkZGVuQ29sdW1ucyxcbiAgICAgIGZpbHRlcixcbiAgICAgIGdyb3VwZWRDb2x1bW5zLFxuICAgICAgY29sdW1uc1NpemVzLFxuICAgICAgcGlubmVkQ29sdW1ucyxcbiAgICAgIGNvbHVtbnNPcmRlcixcbiAgICAgIGdyaWRBbGlnbm1lbnRcbiAgICB9ID0gc2V0dGluZ3M7XG4gICAgY29uc3QgeyBncmlkLCBjb2x1bW5zIH0gPSB0aGlzLmFwaTtcbiAgICAvKiBIaWRlIGNvbHVtbnMgKi9cbiAgICAvKiBOT1RFOiBjb2x1bW5zIG9yZGVyIGFyZSB0cmVhdGVkIGFzIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBjb2x1bW5zICovXG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZSh0aGlzLmluaXRpYWxTZXR0aW5ncy5jb2x1bW5zT3JkZXIsIHRydWUpO1xuICAgIGNvbnN0IGNvbHVtblRvSGlkZSA9ICFpc05pbChoaWRkZW5Db2x1bW5zKSA/IGhpZGRlbkNvbHVtbnMgOiB0aGlzLmluaXRpYWxTZXR0aW5ncy5oaWRkZW5Db2x1bW5zO1xuICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUoY29sdW1uVG9IaWRlLCBmYWxzZSk7XG5cbiAgICAvKiBBcHBseSBmaWx0ZXJzICovXG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgZ3JpZC5vbkZpbHRlckNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICAvKiBHcm91cCBjb2x1bW5zICovXG4gICAgY29uc3QgYWxsR3JvdXBlZENvbHVtbnMgPSBjb2x1bW5zLmdldFJvd0dyb3VwQ29sdW1ucygpO1xuICAgIGxldCByZW1vdmVHcm91cGVkO1xuICAgIGlmIChncm91cGVkQ29sdW1ucykge1xuICAgICAgcmVtb3ZlR3JvdXBlZCA9IGFsbEdyb3VwZWRDb2x1bW5zLmZpbHRlcihjb2wgPT4gIWdyb3VwZWRDb2x1bW5zLmluY2x1ZGVzKGNvbC5nZXRDb2xJZCgpKSk7XG4gICAgICBjb2x1bW5zLmFkZFJvd0dyb3VwQ29sdW1ucyhncm91cGVkQ29sdW1ucyk7XG4gICAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKGdyb3VwZWRDb2x1bW5zLCBmYWxzZSk7XG4gICAgfVxuICAgIGNvbHVtbnMucmVtb3ZlUm93R3JvdXBDb2x1bW5zKHJlbW92ZUdyb3VwZWQpO1xuICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUocmVtb3ZlR3JvdXBlZCwgdHJ1ZSk7XG5cbiAgICAvKiBBcHBseSBzb3J0ICovXG4gICAgY29uc3QgZ3JpZFNvcnQgPSBzb3J0IHx8IHRoaXMuaW5pdGlhbFNldHRpbmdzLnNvcnQ7XG4gICAgZ3JpZC5zZXRTb3J0TW9kZWwoZ3JpZFNvcnQgPyBbZ3JpZFNvcnRdIDogbnVsbCk7XG5cbiAgICAvKiBBbGlnbiBncmlkICovXG4gICAgaWYgKGdyaWRBbGlnbm1lbnQgPT09IERhdG9HcmlkQWxpZ25tZW50LkNVU1RPTSkge1xuICAgICAgLyogU2V0IGNvbHVtbiBzaXplcyAqL1xuICAgICAgY29sdW1uc1NpemVzICYmXG4gICAgICAgIE9iamVjdC5rZXlzKGNvbHVtbnNTaXplcykuZm9yRWFjaChjb2xJZCA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbnNTaXplc1tjb2xJZF0gPT09IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UKSB7XG4gICAgICAgICAgICBjb2x1bW5zLmF1dG9TaXplQ29sdW1uKGNvbElkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sdW1ucy5zZXRDb2x1bW5XaWR0aChjb2xJZCwgY29sdW1uc1NpemVzW2NvbElkXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZEFsaWdubWVudCA9PT0gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRFTlQgPyBjb2x1bW5zLmF1dG9TaXplQWxsQ29sdW1ucygpIDogZ3JpZC5zaXplQ29sdW1uc1RvRml0KCk7XG4gICAgfVxuXG4gICAgLyogUGluIGNvbHVtbnMgbGVmdCAqL1xuICAgIGNvbnN0IGZpbHRlcmVkUGlubmVkQ29sdW1ucyA9IHBpbm5lZENvbHVtbnNcbiAgICAgID8gcGlubmVkQ29sdW1ucy5maWx0ZXIoKGNvbDogc3RyaW5nKSA9PiBjb2wgIT09IHRoaXMuQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRClcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBmaWx0ZXJlZENvbHVtbnMgPSBjb2x1bW5zT3JkZXJcbiAgICAgID8gY29sdW1uc09yZGVyLmZpbHRlcigoY29sOiBzdHJpbmcpID0+IGNvbCAhPT0gdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lEKVxuICAgICAgOiBudWxsO1xuICAgIHNpemUoZmlsdGVyZWRQaW5uZWRDb2x1bW5zKSA+IDBcbiAgICAgID8gY29sdW1ucy5zZXRDb2x1bW5zUGlubmVkKGZpbHRlcmVkUGlubmVkQ29sdW1ucywgJ2xlZnQnKVxuICAgICAgOiBmaWx0ZXJlZENvbHVtbnMgJiYgY29sdW1ucy5zZXRDb2x1bW5zUGlubmVkKGZpbHRlcmVkQ29sdW1ucywgbnVsbCk7XG5cbiAgICAvKiBPcmRlciBjb2x1bW5zICovXG4gICAgY29sdW1uc09yZGVyICYmIGNvbHVtbnMubW92ZUNvbHVtbnMoY29sdW1uc09yZGVyLCAwKTtcbiAgfVxuXG4gIGdldFNldHRpbmdzRGlmZigpOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIGRpZmYoY3VycmVudFN0YXRlLCB0aGlzLmluaXRpYWxTZXR0aW5ncyk7XG4gIH1cblxuICByZXNldFRhYmxlU2V0dGluZ3MoKSB7XG4gICAgY29uc3QgeyBmaWx0ZXIsIC4uLnJlc3QgfSA9IHRoaXMuaW5pdGlhbFNldHRpbmdzO1xuICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gdGhpcy5hcGk7XG4gICAgY29uc3Qgb3JpZ2luYWxDb2xTaXplcyA9IGdldENvbHVtbnNTaXplcyhjb2x1bW5zLmdldEFsbEdyaWRDb2x1bW5zKCksIHRydWUpO1xuICAgIGNvbnN0IGdyaWRBbGlnbm1lbnQgPSBpc0VtcHR5KG9yaWdpbmFsQ29sU2l6ZXMpID8gcmVzdC5ncmlkQWxpZ25tZW50IDogRGF0b0dyaWRBbGlnbm1lbnQuQ1VTVE9NO1xuICAgIGNvbnN0IG5ld1NldHRpbmdzID0geyAuLi5yZXN0LCBjb2x1bW5zU2l6ZXM6IG9yaWdpbmFsQ29sU2l6ZXMsIGdyaWRBbGlnbm1lbnQgfTtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKG5ld1NldHRpbmdzKTtcbiAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKG5ld1NldHRpbmdzKTtcbiAgICB0aGlzLnNhdmVTZXR0aW5nc1RvU2VydmVyKHsgZmlsdGVyIH0pO1xuICB9XG5cbiAgaW5pdFNldHRpbmdzKHNhdmVkU2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICB0aGlzLmluaXRpYWxTZXR0aW5ncyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gIH1cblxuICBub3RpZnlGaWx0ZXJVcGRhdGUoKSB7XG4gICAgY29uc3Qgd2F0Y2ggPSBbdGhpcy5ncmlkUmVmLmZpbHRlckNoYW5nZWQuYXNPYnNlcnZhYmxlKCldO1xuICAgIGlmICh0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNpZGUpIHtcbiAgICAgIHdhdGNoLnB1c2godGhpcy5ncmlkUXVlcnkuc2VydmVyRGF0YUxvYWRlZCQpO1xuICAgICAgdGhpcy5zZXRMb2FkaW5nKHRydWUpO1xuICAgIH1cbiAgICBjb21iaW5lTGF0ZXN0KHdhdGNoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHVudGlsRGVzdHJveWVkKHRoaXMpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgcm93c0FmdGVyRmlsdGVyID0gdGhpcy5hcGkuZ3JpZC5nZXREaXNwbGF5ZWRSb3dDb3VudCgpO1xuICAgICAgICB0aGlzLnNldE92ZXJsYXkocm93c0FmdGVyRmlsdGVyID09PSAwKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuYXBpLmdyaWQub25GaWx0ZXJDaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnMoZmlsdGVyOiBEYXRvR3JpZEZpbHRlcnNNYXApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcnMge1xuICAgIGNvbnN0IGNvbHVtbnNGaWx0ZXJzOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBjb25zdCB7IGJ5VmFsdWUsIGNvbmRpdGlvbmFsIH0gPSB2YWx1ZTtcbiAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgIGNvbHVtbnNGaWx0ZXJzW2NvbHVtbl0gPSB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IFtieVZhbHVlXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvbmRpdGlvbmFsKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbmFsRmlsdGVyID0ge1xuICAgICAgICAgIG9wZXJhdG9yOiBjb25kaXRpb25hbC5vcGVyYXRvcixcbiAgICAgICAgICBmaWx0ZXJzOiBjb25kaXRpb25hbC5jb25kaXRpb25zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29uZGl0aW9uLCB2YWx1ZSB9ID0gaXRlbTtcbiAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklOX1JBTkdFKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgIHN0YXJ0OiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBlbmQ6IChpdGVtIGFzIERhdG9HcmlkUmFuZ2VGaWx0ZXJDb25kaXRpb24pLnJhbmdlRW5kXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbSBhcyBEYXRvR3JpZEZpbHRlckNvbmRpdGlvbjtcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICAgIGNvbHVtbnNGaWx0ZXJzW2NvbHVtbl0uZmlsdGVycy5wdXNoKGNvbmRpdGlvbmFsRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dID0gY29uZGl0aW9uYWxGaWx0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29sdW1uc0ZpbHRlcnM7XG4gIH1cblxuICBidWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEoZ3JpZENvbHVtbnM6IERhdG9HcmlkQ29sdW1uRGVmW10pOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgY29uc3Qgc2VhcmNoVGVybSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKTtcblxuICAgIGxldCBjb2x1bW5GaWx0ZXJzID0gdGhpcy5idWlsZFNlcnZlckNvbHVtbkZpbHRlcnNfdjJfMShmaWx0ZXIpO1xuICAgIGlmIChjb2x1bW5GaWx0ZXJzLmV2ZXJ5KCh7IG9wZXJhdG9yIH06IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyKSA9PiBvcGVyYXRvciA9PT0gT3BlcmF0b3JUeXBlcy5BTkQpKSB7XG4gICAgICBjb25zdCBmbGF0dGVuZWRGaWx0ZXJzID0gY29sdW1uRmlsdGVyc1xuICAgICAgICAubWFwKCh7IGZpbHRlcnMgfTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIpID0+IGZpbHRlcnMpXG4gICAgICAgIC5yZWR1Y2UoKGFyciwgcmVzKSA9PiByZXMuY29uY2F0KGFyciksIFtdKTtcbiAgICAgIGNvbHVtbkZpbHRlcnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogZmxhdHRlbmVkRmlsdGVyc1xuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5GaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID1cbiAgICAgIHNpemUoY29sdW1uRmlsdGVycykgPiAxXG4gICAgICAgID8geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsIGZpbHRlcnM6IGNvbHVtbkZpbHRlcnMgfVxuICAgICAgICA6IHNpemUoY29sdW1uRmlsdGVycykgPT09IDFcbiAgICAgICAgPyBjb2x1bW5GaWx0ZXJzWzBdXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAoIXNlYXJjaFRlcm0pIHtcbiAgICAgIHJldHVybiBjb2x1bW5GaWx0ZXI7XG4gICAgfVxuICAgIGNvbnN0IHsgaW5jbHVkZUhpZGRlbkNvbHVtbnNJblNlYXJjaCB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICBjb25zdCBzZWFyY2hhYmxlQ29sdW1ucyA9IGdyaWRDb2x1bW5zLmZpbHRlcigoY29sRGVmOiBEYXRvR3JpZENvbHVtbkRlZikgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29sRGVmLmluY2x1ZGVJblNlYXJjaCAmJiAoaW5jbHVkZUhpZGRlbkNvbHVtbnNJblNlYXJjaCB8fCB0aGlzLmFwaS5jb2x1bW5zLmdldENvbHVtbihjb2xEZWYuY29sSWQpLmlzVmlzaWJsZSgpKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCBzZWFyY2hGaWx0ZXJzOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbltdID0gc2VhcmNoYWJsZUNvbHVtbnMubWFwKCh7IGZpZWxkIH06IERhdG9HcmlkQ29sdW1uRGVmKSA9PiAoe1xuICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5DT05UQUlOUyxcbiAgICAgIHZhbHVlOiBzZWFyY2hUZXJtLFxuICAgICAgY29sdW1uOiBmaWVsZFxuICAgIH0pKTtcbiAgICBjb25zdCBzZWFyY2hGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID1cbiAgICAgIHNpemUoc2VhcmNoRmlsdGVycykgPiAwID8geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5PUiwgZmlsdGVyczogc2VhcmNoRmlsdGVycyB9IDogbnVsbDtcbiAgICBpZiAoIWNvbHVtbkZpbHRlcikge1xuICAgICAgcmV0dXJuIHNlYXJjaEZpbHRlcjtcbiAgICB9XG4gICAgcmV0dXJuIHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELCBmaWx0ZXJzOiBbY29sdW1uRmlsdGVyLCBzZWFyY2hGaWx0ZXJdIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VydmVyQ29sdW1uRmlsdGVyc192Ml8xKGZpbHRlcjogRGF0b0dyaWRGaWx0ZXJzTWFwKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJbXSB7XG4gICAgbGV0IGNvbHVtbkZpbHRlcnM6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2NvbHVtbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcikpIHtcbiAgICAgIGxldCBjb2x1bW5GaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID0gbnVsbDtcbiAgICAgIGNvbnN0IHsgYnlWYWx1ZSwgY29uZGl0aW9uYWwgfSA9IHZhbHVlO1xuICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgY29sdW1uRmlsdGVyID0ge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBbeyBjb2x1bW4sIC4uLmJ5VmFsdWUgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25hbCkge1xuICAgICAgICBjb25zdCBjb25kaXRpb25hbEZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPSB0aGlzLmdldFNlcnZlckNvbmRpdGlvbmFsRmlsdGVyKGNvbmRpdGlvbmFsLCBjb2x1bW4pO1xuICAgICAgICBpZiAoY29sdW1uRmlsdGVyKSB7XG4gICAgICAgICAgY29sdW1uRmlsdGVyLmZpbHRlcnMucHVzaChjb25kaXRpb25hbEZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sdW1uRmlsdGVyID0gY29uZGl0aW9uYWxGaWx0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbHVtbkZpbHRlcnMucHVzaChjb2x1bW5GaWx0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uRmlsdGVycztcbiAgfVxuXG4gIGdldEZpbHRlckZvclNlcnZlckFjdGlvbk9uU2VsZWN0QWxsKCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyIHtcbiAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICBjb25zdCB7IGNvbHVtbkRlZnMsIGlkQ29sdW1uS2V5IH0gPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpO1xuICAgIGNvbnN0IG1haW5GaWx0ZXIgPSB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnNfdjJfMShjb2x1bW5EZWZzKTtcbiAgICBpZiAoaXNFbXB0eShleGNsdWRlZEZyb21TZWxlY3RBbGwpKSB7XG4gICAgICByZXR1cm4gbWFpbkZpbHRlcjtcbiAgICB9XG4gICAgY29uc3QgZXhjbHVkZWRSb3dzRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkxpc3RDb25kaXRpb24gPSB7XG4gICAgICBjb25kaXRpb246IERhdG9GaWx0ZXJDb25kaXRpb25zLk5PVF9JTl9MSVNULFxuICAgICAgdmFsdWVzOiBleGNsdWRlZEZyb21TZWxlY3RBbGwsXG4gICAgICBjb2x1bW46IGlkQ29sdW1uS2V5XG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXJzID0gbWFpbkZpbHRlciA/IFttYWluRmlsdGVyLCBleGNsdWRlZFJvd3NGaWx0ZXJdIDogW2V4Y2x1ZGVkUm93c0ZpbHRlcl07XG4gICAgcmV0dXJuIHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELCBmaWx0ZXJzIH07XG4gIH1cblxuICBwcml2YXRlIGdldFNlcnZlckNvbmRpdGlvbmFsRmlsdGVyKFxuICAgIGNvbmRpdGlvbmFsRmlsdGVyOiBEYXRvR3JpZENvbmRpdGlvbmFsRmlsdGVyLFxuICAgIGNvbHVtbjogc3RyaW5nXG4gICk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0b3I6IGNvbmRpdGlvbmFsRmlsdGVyLm9wZXJhdG9yLFxuICAgICAgZmlsdGVyczogY29uZGl0aW9uYWxGaWx0ZXIuY29uZGl0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZGl0aW9uLCB2YWx1ZSB9ID0gaXRlbTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSU5fUkFOR0UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IHZhbHVlLFxuICAgICAgICAgICAgZW5kOiAoaXRlbSBhcyBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uKS5yYW5nZUVuZCxcbiAgICAgICAgICAgIGNvbHVtblxuICAgICAgICAgIH0gYXMgU2VydmVyU2lkZVBhZ2luYXRpb25SYW5nZUNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSB8fCBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLk5PVF9FTVBUWSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25kaXRpb246IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZLFxuICAgICAgICAgICAgdmFsdWU6IGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFkgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19OVUxMIHx8IGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuTk9UX05VTEwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19OVUxMLFxuICAgICAgICAgICAgdmFsdWU6IGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCA/ICd0cnVlJyA6ICdmYWxzZScsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLml0ZW0sIGNvbHVtbiB9IGFzIFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uO1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlclJlcXVlc3RTb3J0KHNvcnRNb2RlbDogRGF0b0dyaWRTb3J0W10pOiBEYXRvR3JpZFNlcnZlclNvcnRbXSB7XG4gICAgcmV0dXJuIHNvcnRNb2RlbC5tYXAoKHsgY29sSWQsIHNvcnQgfSkgPT4gKHtcbiAgICAgIGNvbHVtbjogY29sSWQsXG4gICAgICBzb3J0T3JkZXI6IHNvcnQudG9VcHBlckNhc2UoKSBhcyBEYXRvR3JpZFNlcnZlclNvcnREaXJlY3Rpb25cbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEVkaXRhYmxlQ2VsbENsYXNzKFxuICAgIGNlbGxDbGFzc1ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8ICgoY2VsbENsYXNzUGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpID0+IHN0cmluZyB8IHN0cmluZ1tdKVxuICApIHtcbiAgICBpZiAoaXNOaWwoY2VsbENsYXNzVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2RhdG8tZWRpdGFibGUtY2VsbCc7XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKGNlbGxDbGFzc1ZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNlbGxDbGFzc1BhcmFtcyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVkaXRhYmxlQ2xhc3NBcnJheShjZWxsQ2xhc3NWYWx1ZShjZWxsQ2xhc3NQYXJhbXMpKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEVkaXRhYmxlQ2xhc3NBcnJheShjZWxsQ2xhc3NWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldEVkaXRhYmxlQ2xhc3NBcnJheShjdXJyZW50Q2xhc3M6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNlbGxDbGFzcyA9IGNvZXJjZUFycmF5KGN1cnJlbnRDbGFzcyk7XG4gICAgY2VsbENsYXNzLnB1c2goJ2RhdG8tZWRpdGFibGUtY2VsbCcpO1xuICAgIHJldHVybiBjZWxsQ2xhc3M7XG4gIH1cblxuICBzZWxlY3RBbGxDdXJyZW50UGFnZVJvd3MoaXNTZWxlY3RlZCA9IHRydWUsIGNvbnNpZGVyRXhjbHVkZWQgPSBmYWxzZSkge1xuICAgIGxldCByb3dzRm9yU2VsZWN0aW9uID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudFBhZ2VSb3dzKCk7XG4gICAgaWYgKGNvbnNpZGVyRXhjbHVkZWQpIHtcbiAgICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgICAgaWYgKCFpc0VtcHR5KGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCkpIHtcbiAgICAgICAgcm93c0ZvclNlbGVjdGlvbiA9IHJvd3NGb3JTZWxlY3Rpb24uZmlsdGVyKCh7IGlkIH06IFJvd05vZGUpID0+ICFleGNsdWRlZEZyb21TZWxlY3RBbGwuaW5jbHVkZXMoaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaXNTZWxlY3RlZCA/IHRoaXMuc2VsZWN0Um93cyhyb3dzRm9yU2VsZWN0aW9uKSA6IHRoaXMuZGVzZWxlY3RSb3dzKHJvd3NGb3JTZWxlY3Rpb24pO1xuICB9XG5cbiAgZGVzZWxlY3RBbGxSb3dzKCkge1xuICAgIHRoaXMuYXBpLmdyaWQuZGVzZWxlY3RBbGwoKTtcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTZWxlY3RBbGxSb3dzRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IHNlbGVjdEFsbFJvd3NFbmFibGVkOiBmYWxzZSwgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBbXSB9KTtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlUm93QWN0aW9uc1Zpc2liaWxpdHkoKSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuX3Jvd0FjdGlvblZpc2liaWxpdHlDaGFuZ2VkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHBpdm90aW5nLFxuICAgKiB3ZSBhZGQgdGhlIGZpZWxkIG5hbWUgdG8gdGhlIGNvbHVtbiBoZWFkZXIgY2xhc3MgaW4gb3JkZXIgdG8gYWNjZXNzIGl0IHRocm91Z2ggdGhlIGF1dG8gZ2VuZXJhdGVkIHBpdm90IGNvbHVtbi5cbiAgICovXG4gIHByaXZhdGUgaW5pdFBpdm90U2Vjb25kYXJ5Q29sc1Byb2Nlc3MoeyBncmlkT3B0aW9ucyB9OiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgLyoqIFVzZSBwcm9jZXNzUGl2b3RSZXN1bHRDb2xEZWYgZnJvbSB2ZXIgMjggKi9cbiAgICBncmlkT3B0aW9ucy5wcm9jZXNzU2Vjb25kYXJ5Q29sRGVmID0gY29sRGVmID0+IHtcbiAgICAgIGNvbnN0IHVzZXJQcm92aWRlZENvbERlZiA9IGNvbERlZi5waXZvdFZhbHVlQ29sdW1uICYmIGNvbERlZi5waXZvdFZhbHVlQ29sdW1uLmdldFVzZXJQcm92aWRlZENvbERlZigpO1xuXG4gICAgICBpZiAodXNlclByb3ZpZGVkQ29sRGVmKSB7XG4gICAgICAgIGNvbERlZi5maWx0ZXIgPSB1c2VyUHJvdmlkZWRDb2xEZWYuZmlsdGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sRGVmLnBpdm90S2V5cykge1xuICAgICAgICBjb2xEZWYucGl2b3RLZXlzID0gY29sRGVmLnBpdm90S2V5cy5tYXAoa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRLZXkgPSB0cnlQYXJzZVBpdm90VmFsdWUoa2V5KTtcblxuICAgICAgICAgIHJldHVybiAocGFyc2VkS2V5ICYmIHBhcnNlZEtleS52YWx1ZSkgfHwgJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogVXNlIHByb2Nlc3NQaXZvdFJlc3VsdENvbEdyb3VwRGUgZnJvbSB2ZXIgMjggKi9cbiAgICBncmlkT3B0aW9ucy5wcm9jZXNzU2Vjb25kYXJ5Q29sR3JvdXBEZWYgPSAoY29sR3JvdXBEZWY6IENvbEdyb3VwRGVmKSA9PiB7XG4gICAgICBpZiAoY29sR3JvdXBEZWYuaGVhZGVyTmFtZSkge1xuICAgICAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHRyeVBhcnNlUGl2b3RWYWx1ZShjb2xHcm91cERlZi5oZWFkZXJOYW1lKTtcblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB7IGZpZWxkLCB2YWx1ZSB9ID0gcGFyc2VkVmFsdWU7XG5cbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcyA9IFtmaWVsZF07XG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyTmFtZSA9IHZhbHVlO1xuXG4gICAgICAgICAgaWYgKGNvbEdyb3VwRGVmLmNoaWxkcmVuICYmIGNvbEdyb3VwRGVmLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlckNsYXNzLnB1c2goJ2dyb3VwLXBpdm90LWNlbGwnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29sR3JvdXBEZWYuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgW2NvbENoaWxkXTogYW55ID0gY29sR3JvdXBEZWYuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IHBpdm90VG90YWxDb2x1bW5JZHMgPSBjb2xDaGlsZCAmJiBjb2xDaGlsZC5waXZvdFRvdGFsQ29sdW1uSWRzO1xuXG4gICAgICAgIGlmIChwaXZvdFRvdGFsQ29sdW1uSWRzICYmIHBpdm90VG90YWxDb2x1bW5JZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlckNsYXNzID0gWyd0b3RhbC1waXZvdC1jZWxsJ107XG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyTmFtZSA9IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybSgnY29yZS50b3RhbCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcyA9IFsnZW1wdHktcGl2b3QtaGVhZGVyJ107XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2xHcm91cERlZi5waXZvdEtleXMpIHtcbiAgICAgICAgY29sR3JvdXBEZWYucGl2b3RLZXlzID0gY29sR3JvdXBEZWYucGl2b3RLZXlzLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEtleSA9IHRyeVBhcnNlUGl2b3RWYWx1ZShrZXkpO1xuXG4gICAgICAgICAgcmV0dXJuIChwYXJzZWRLZXkgJiYgcGFyc2VkS2V5LnZhbHVlKSB8fCAnJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGl2b3RNb2RlUm93czxUPihkYXRhOiBUW10pIHtcbiAgICBjb25zdCBwaXZvdENvbHVtbnMgPSB0aGlzLmdyaWRRdWVyeS5nZXRBbGxQaXZvdENvbHVtbnMoKTtcbiAgICBjb25zdCBjb252ZXJ0ZWREYXRhID0gZGF0YS5tYXAoKGN1cnJlbnRWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG1hcHBlZFZhbHVlcyA9IHsgLi4uY3VycmVudFZhbHVlIH07XG5cbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHBpdm90Q29sdW1ucykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbC5nZXRDb2xEZWYoKS5maWVsZDtcbiAgICAgICAgY29uc3QgcGl2b3RWYWx1ZTogUGl2b3RDb2x1bW5EYXRhID0geyBmaWVsZCwgdmFsdWU6IGN1cnJlbnRWYWx1ZVtmaWVsZF0gfTtcblxuICAgICAgICBtYXBwZWRWYWx1ZXNbZmllbGRdID0gSlNPTi5zdHJpbmdpZnkocGl2b3RWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXBwZWRWYWx1ZXM7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFwaS5ncmlkLnNldFJvd0RhdGEoY29udmVydGVkRGF0YSk7XG4gIH1cblxuICAvKiogTm8gZGVjbGFyZWQgaW50ZXJmYWNlIGluIGN1cnJlbnQgZ3JpZCB2ZXJzaW9uIHlldC5cbiAgICogIFJlZmVyIGRvY3MgLSBodHRwczovL3d3dy5hZy1ncmlkLmNvbS9hbmd1bGFyLWRhdGEtZ3JpZC9jZWxsLXN0eWxlcy8jY2VsbC1jbGFzcy1ydWxlcyAqL1xuICBwcml2YXRlIGdldFBpdm90TW9kZUNlbGxDbGFzc1J1bGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnZXZlbi1yb3ctZ3JvdXAtbGVhZi1jZWxsJzogdGhpcy5pc0xlYWZHcm91cEV2ZW5DZWxsLmJpbmQodGhpcyksXG4gICAgICAncm93LWdyb3VwLXJvb3QtY2VsbCc6IHRoaXMuaXNSb3dHcm91cFZhbHVlZENlbGwuYmluZCh0aGlzKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGlzTGVhZkdyb3VwRXZlbkNlbGwocGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGxlYWZHcm91cCwgY2hpbGRJbmRleCwgcm93R3JvdXBJbmRleCB9ID0gcGFyYW1zLm5vZGU7XG4gICAgY29uc3QgY29sSW5kZXggPSB0aGlzLmdldENlbGxDbGFzc1J1bGVDb2xJbmRleChwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHJvd0dyb3VwSW5kZXggPD0gY29sSW5kZXggJiYgbGVhZkdyb3VwICYmIGNoaWxkSW5kZXggJSAyID09PSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1Jvd0dyb3VwVmFsdWVkQ2VsbChwYXJhbXM6IENlbGxDbGFzc1BhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgbGVhZkdyb3VwLCByb3dHcm91cEluZGV4IH0gPSBwYXJhbXMubm9kZTtcbiAgICBjb25zdCBjb2xJbmRleCA9IHRoaXMuZ2V0Q2VsbENsYXNzUnVsZUNvbEluZGV4KHBhcmFtcyk7XG5cbiAgICByZXR1cm4gcm93R3JvdXBJbmRleCA8PSBjb2xJbmRleCAmJiAhbGVhZkdyb3VwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDZWxsQ2xhc3NSdWxlQ29sSW5kZXgocGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpOiBudW1iZXIge1xuICAgIGNvbnN0IGdyaWRRdWVyeSA9IHBhcmFtcy5jb2xEZWYuaGVhZGVyQ29tcG9uZW50UGFyYW1zLmdyaWRRdWVyeTtcblxuICAgIGlmIChncmlkUXVlcnkgJiYgZ3JpZFF1ZXJ5LmFwaSkge1xuICAgICAgY29uc3QgeyBjb2x1bW5zIH0gPSBncmlkUXVlcnkuYXBpIGFzIERhdG9HcmlkQXBpO1xuICAgICAgY29uc3QgYWxsRGlzcGxheWVkQ29sdW1ucyA9IGNvbHVtbnMuZ2V0QWxsRGlzcGxheWVkQ29sdW1ucygpO1xuICAgICAgY29uc3QgZGlzcGxheWVkQ29sdW1uID0gYWxsRGlzcGxheWVkQ29sdW1ucy5maW5kKGNvbCA9PiBjb2wuZ2V0Q29sSWQoKSA9PT0gcGFyYW1zLmNvbERlZi5jb2xJZCk7XG5cbiAgICAgIHJldHVybiBhbGxEaXNwbGF5ZWRDb2x1bW5zLmluZGV4T2YoZGlzcGxheWVkQ29sdW1uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cbiJdfQ==
|