basesite-shared-grid-lib 0.0.0-watch
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/basesite-shared-grid-lib-0.0.0-watch+1699364357423.tgz +0 -0
- package/esm2020/basesite-shared-grid-lib.mjs +5 -0
- package/esm2020/lib/formatters/column-value-formatter.mjs +27 -0
- package/esm2020/lib/grid-library.component.mjs +546 -0
- package/esm2020/lib/grid-library.module.mjs +47 -0
- package/esm2020/lib/grid-library.service.mjs +44 -0
- package/esm2020/lib/helpers/index.mjs +3 -0
- package/esm2020/lib/helpers/oDataProvider.mjs +787 -0
- package/esm2020/lib/helpers/types.mjs +2 -0
- package/esm2020/lib/helpers/utils.mjs +7 -0
- package/esm2020/lib/renderer/button-renderer/button-renderer.component.mjs +49 -0
- package/esm2020/lib/renderer/dropdown-renderer/drop-down-renderer.mjs +52 -0
- package/esm2020/lib/renderer/tooltip-renderer/custom-tooltip-renderer.mjs +30 -0
- package/esm2020/public-api.mjs +7 -0
- package/fesm2015/basesite-shared-grid-lib.mjs +1580 -0
- package/fesm2015/basesite-shared-grid-lib.mjs.map +1 -0
- package/fesm2020/basesite-shared-grid-lib.mjs +1575 -0
- package/fesm2020/basesite-shared-grid-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/formatters/column-value-formatter.d.ts +10 -0
- package/lib/grid-library.component.d.ts +62 -0
- package/lib/grid-library.module.d.ts +14 -0
- package/lib/grid-library.service.d.ts +15 -0
- package/lib/helpers/index.d.ts +2 -0
- package/lib/helpers/oDataProvider.d.ts +338 -0
- package/lib/helpers/types.d.ts +20 -0
- package/lib/helpers/utils.d.ts +2 -0
- package/lib/renderer/button-renderer/button-renderer.component.d.ts +12 -0
- package/lib/renderer/dropdown-renderer/drop-down-renderer.d.ts +11 -0
- package/lib/renderer/tooltip-renderer/custom-tooltip-renderer.d.ts +16 -0
- package/package.json +49 -0
- package/public-api.d.ts +3 -0
- package/src/lib/styles/styles.scss +184 -0
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { OdataServerSideProvider } from './helpers';
|
|
3
|
+
import { ButtonRendererComponent } from './renderer/button-renderer/button-renderer.component';
|
|
4
|
+
import { CustomTooltip } from './renderer/tooltip-renderer/custom-tooltip-renderer';
|
|
5
|
+
import { DropdownRenderer } from './renderer/dropdown-renderer/drop-down-renderer';
|
|
6
|
+
import { takeUntil } from 'rxjs/operators';
|
|
7
|
+
import { Subject } from 'rxjs';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "./grid-library.service";
|
|
10
|
+
import * as i2 from "./formatters/column-value-formatter";
|
|
11
|
+
import * as i3 from "ag-grid-angular";
|
|
12
|
+
export class GridLibraryComponent {
|
|
13
|
+
constructor(gridService, formatterService) {
|
|
14
|
+
this.gridService = gridService;
|
|
15
|
+
this.formatterService = formatterService;
|
|
16
|
+
this.pageSize = 20;
|
|
17
|
+
this.rowSelection = 'multiple';
|
|
18
|
+
this.enableServerSidePaging = false;
|
|
19
|
+
this.cacheBlockSize = 0;
|
|
20
|
+
this.rowMultiSelectWithClick = false;
|
|
21
|
+
this.floatingFilter = false;
|
|
22
|
+
this.paginationAutoPageSize = false;
|
|
23
|
+
//event emitters
|
|
24
|
+
this.btnClickHandler = new EventEmitter();
|
|
25
|
+
this.firstDataRendered = new EventEmitter();
|
|
26
|
+
this.filterChanged = new EventEmitter();
|
|
27
|
+
this.selectionChanged = new EventEmitter();
|
|
28
|
+
//paramters
|
|
29
|
+
this.rowDataHidden = [];
|
|
30
|
+
this.exportColumnsList = [];
|
|
31
|
+
this.tooltipShowDelay = 0;
|
|
32
|
+
this.tooltipHideDelay = 2000;
|
|
33
|
+
this.rowModelType = 'clientSide';
|
|
34
|
+
this.gridPageSize = 0;
|
|
35
|
+
//unsubscribe subject
|
|
36
|
+
this.unsubscribe$ = new Subject();
|
|
37
|
+
this.defaultColDef = {
|
|
38
|
+
sortable: true,
|
|
39
|
+
filter: true,
|
|
40
|
+
tooltipComponent: CustomTooltip,
|
|
41
|
+
};
|
|
42
|
+
this.paginationNumberFormatter = (params) => {
|
|
43
|
+
return '[' + params.value.toLocaleString() + ']';
|
|
44
|
+
};
|
|
45
|
+
this.getRowById = (params) => {
|
|
46
|
+
var data = params.data;
|
|
47
|
+
return data.id ?? 0;
|
|
48
|
+
};
|
|
49
|
+
// Custom right click Context Menu to support custom excel exports
|
|
50
|
+
this.getContextMenuItems = (params) => {
|
|
51
|
+
let res = [
|
|
52
|
+
'cut',
|
|
53
|
+
'copy',
|
|
54
|
+
'copyWithHeaders',
|
|
55
|
+
'copyWithGroupHeaders',
|
|
56
|
+
'paste',
|
|
57
|
+
{
|
|
58
|
+
name: 'Export',
|
|
59
|
+
subMenu: [
|
|
60
|
+
{
|
|
61
|
+
name: 'CSV Export',
|
|
62
|
+
action: () => {
|
|
63
|
+
this.exportFile('csv');
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'Excel Export',
|
|
68
|
+
action: () => {
|
|
69
|
+
this.exportFile('xlsx');
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
return res;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
onSortChangedEvent() {
|
|
79
|
+
this.gridColumnState = this.agGrid.columnApi.getColumnState();
|
|
80
|
+
}
|
|
81
|
+
ngOnInit() {
|
|
82
|
+
this.gridPageSize = this.pageSize;
|
|
83
|
+
this.cacheBlockSize = this.cacheBlockSize = 0
|
|
84
|
+
? this.pageSize
|
|
85
|
+
: this.cacheBlockSize;
|
|
86
|
+
this.gridService.setBaseUrl(this.environment);
|
|
87
|
+
this.getGridState();
|
|
88
|
+
this.getColDef();
|
|
89
|
+
if (this.enableServerSidePaging == true) {
|
|
90
|
+
this.rowModelType = 'serverSide';
|
|
91
|
+
this.rowData = '';
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this.rowModelType = 'clientSide';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
onModelUpdated() {
|
|
98
|
+
this.setGridState();
|
|
99
|
+
}
|
|
100
|
+
getColDef() {
|
|
101
|
+
if (this.gridId && this.loggedInUser) {
|
|
102
|
+
this.gridService.getColDef(this.gridId).pipe(takeUntil(this.unsubscribe$)).subscribe((response) => {
|
|
103
|
+
if (response.status == 1) {
|
|
104
|
+
let coldef = response.list.map((res) => {
|
|
105
|
+
if (res.isButton === false) {
|
|
106
|
+
if (res.columnType === 'checkbox') {
|
|
107
|
+
return {
|
|
108
|
+
field: res.field,
|
|
109
|
+
headerName: res.title,
|
|
110
|
+
sortable: false,
|
|
111
|
+
tooltipField: res.field,
|
|
112
|
+
resizable: true,
|
|
113
|
+
headerCheckboxSelection: false,
|
|
114
|
+
filterable: false,
|
|
115
|
+
checkboxSelection: true,
|
|
116
|
+
showDisabledCheckboxes: true,
|
|
117
|
+
suppressFilter: true,
|
|
118
|
+
suppressSorting: true,
|
|
119
|
+
suppressMenu: true,
|
|
120
|
+
width: 55,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
else if (res.columnType === 'dropdown') {
|
|
124
|
+
return {
|
|
125
|
+
field: res.field,
|
|
126
|
+
headerName: res.title,
|
|
127
|
+
resizable: true,
|
|
128
|
+
sortable: false,
|
|
129
|
+
suppressFilter: true,
|
|
130
|
+
suppressSorting: true,
|
|
131
|
+
suppressMenu: true,
|
|
132
|
+
tooltipField: res.field,
|
|
133
|
+
cellRenderer: DropdownRenderer,
|
|
134
|
+
cellRendererParams: {
|
|
135
|
+
onClick: this.onBtnClick.bind(this),
|
|
136
|
+
tooltip: res.tooltip,
|
|
137
|
+
dropDownData: res.dropDownData,
|
|
138
|
+
},
|
|
139
|
+
onCellClicked: (e) => {
|
|
140
|
+
e.node.setSelected(false);
|
|
141
|
+
},
|
|
142
|
+
width: 40,
|
|
143
|
+
pinned: res.pinPosition,
|
|
144
|
+
lockPinned: true,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
return {
|
|
149
|
+
field: res.field,
|
|
150
|
+
headerName: res.title,
|
|
151
|
+
resizable: true,
|
|
152
|
+
hide: !res.visible,
|
|
153
|
+
sortable: true,
|
|
154
|
+
tooltipField: res.field,
|
|
155
|
+
floatingFilter: this.floatingFilter,
|
|
156
|
+
valueFormatter: (params) => this.formatterService.colValueFormatter(params, res.columnType),
|
|
157
|
+
filterable: res.filterable,
|
|
158
|
+
filter: res.columnType == 'string'
|
|
159
|
+
? 'agTextColumnFilter'
|
|
160
|
+
: res.columnType == 'number'
|
|
161
|
+
? 'agNumberColumnFilter'
|
|
162
|
+
: 'agDateColumnFilter',
|
|
163
|
+
filterParams: {
|
|
164
|
+
comparator: (filterLocalDateAtMidnight, cellValue) => {
|
|
165
|
+
const dateAsString = cellValue;
|
|
166
|
+
if (dateAsString == null) {
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
if (res.columnType == 'date') {
|
|
170
|
+
const cellDate = new Date(dateAsString);
|
|
171
|
+
if (cellDate < filterLocalDateAtMidnight) {
|
|
172
|
+
return -1;
|
|
173
|
+
}
|
|
174
|
+
else if (cellDate > filterLocalDateAtMidnight) {
|
|
175
|
+
return 1;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return 0;
|
|
179
|
+
},
|
|
180
|
+
buttons: ['reset']
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
return {
|
|
187
|
+
field: res.field,
|
|
188
|
+
headerName: res.title,
|
|
189
|
+
resizable: true,
|
|
190
|
+
sortable: false,
|
|
191
|
+
hide: !res.visible,
|
|
192
|
+
suppressFilter: true,
|
|
193
|
+
suppressSorting: true,
|
|
194
|
+
suppressMenu: true,
|
|
195
|
+
tooltipField: res.field,
|
|
196
|
+
cellRenderer: ButtonRendererComponent,
|
|
197
|
+
cellRendererParams: {
|
|
198
|
+
onClick: this.onBtnClick.bind(this),
|
|
199
|
+
label: res.label,
|
|
200
|
+
icon: res.icon,
|
|
201
|
+
buttonName: res.buttonName,
|
|
202
|
+
tooltip: res.tooltip,
|
|
203
|
+
},
|
|
204
|
+
valueGetter: (params) => {
|
|
205
|
+
return res.tooltip || res.title;
|
|
206
|
+
},
|
|
207
|
+
minWidth: 20,
|
|
208
|
+
cellClass: 'action-button',
|
|
209
|
+
pinned: res.pinPosition,
|
|
210
|
+
lockPinned: true,
|
|
211
|
+
width: res.label ? 100 : 40,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
this.exportColumnsList = response.list;
|
|
216
|
+
this.columnDefs = coldef;
|
|
217
|
+
this.agGrid.gridOptions?.api?.setColumnDefs(coldef);
|
|
218
|
+
this.getGridState();
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
console.log('ColDef Read Error=>', response.message);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
console.log('Please pass valid GridId and loggedIn user Id');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
setExternalFilters(options) {
|
|
230
|
+
var serverUrl = '';
|
|
231
|
+
if (this.serverDataUrl.indexOf('filter') >= 0 &&
|
|
232
|
+
options.indexOf('filter') >= 0) {
|
|
233
|
+
let slug = this.serverDataUrl.split('?$filter=');
|
|
234
|
+
if (slug && slug.length > 0) {
|
|
235
|
+
options = options + ' and ' + slug[1];
|
|
236
|
+
serverUrl = slug[0];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else if (this.serverDataUrl.indexOf('?') >= 0) {
|
|
240
|
+
serverUrl = this.serverDataUrl;
|
|
241
|
+
options = options.replace('?', '&');
|
|
242
|
+
}
|
|
243
|
+
return `${serverUrl}${options}`;
|
|
244
|
+
}
|
|
245
|
+
onGridReady(params) {
|
|
246
|
+
this.gridPageSize = this.pageSize;
|
|
247
|
+
if (this.enableServerSidePaging == true) {
|
|
248
|
+
params.api.setServerSideDatasource(new OdataServerSideProvider({
|
|
249
|
+
isCaseSensitiveStringFilter: false,
|
|
250
|
+
callApi: (options) => fetch(`${this.setExternalFilters(options)}`, {
|
|
251
|
+
headers: {
|
|
252
|
+
'Content-type': 'application/json',
|
|
253
|
+
Accept: 'application/json',
|
|
254
|
+
},
|
|
255
|
+
}).then((response) => response.json()),
|
|
256
|
+
afterLoadData: (options, rowData, totalCount) => {
|
|
257
|
+
if (!rowData || rowData.length <= 0) {
|
|
258
|
+
this.agGrid.api.showNoRowsOverlay();
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
this.agGrid.api.hideOverlay();
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
}));
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
setGridState() {
|
|
268
|
+
if (this.gridColumnState) {
|
|
269
|
+
this.agGrid.columnApi.applyColumnState({
|
|
270
|
+
state: this.gridColumnState,
|
|
271
|
+
applyOrder: true,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
var columns = this.agGrid.columnApi.getColumns();
|
|
276
|
+
if (columns && columns.length > 0) {
|
|
277
|
+
if (columns.length > 15) {
|
|
278
|
+
const allColumnIds = [];
|
|
279
|
+
this.agGrid.columnApi.getColumns().forEach((column) => {
|
|
280
|
+
allColumnIds.push(column.getId());
|
|
281
|
+
});
|
|
282
|
+
this.agGrid.columnApi.autoSizeColumns(allColumnIds, false);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
this.agGrid.api.sizeColumnsToFit();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
getGridState() {
|
|
291
|
+
if (this.gridId && this.loggedInUser) {
|
|
292
|
+
this.gridService
|
|
293
|
+
.getGridState(this.gridId, this.loggedInUser)
|
|
294
|
+
.pipe(takeUntil(this.unsubscribe$))
|
|
295
|
+
.subscribe((response) => {
|
|
296
|
+
if (response.status == 1 &&
|
|
297
|
+
response.object &&
|
|
298
|
+
response.object.gridConfig) {
|
|
299
|
+
this.gridColumnState = JSON.parse(response.object.gridConfig);
|
|
300
|
+
this.setGridState();
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
console.log('Error while loading grid state');
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
onBtnClick(e) {
|
|
309
|
+
console.log('btn click=>', e);
|
|
310
|
+
this.btnClickHandler.emit(e.rowData);
|
|
311
|
+
}
|
|
312
|
+
onSaveGridColumnState(event) {
|
|
313
|
+
let columnState = this.agGrid.columnApi?.getColumnState();
|
|
314
|
+
let columnData = {
|
|
315
|
+
gridConfig: JSON.stringify(columnState),
|
|
316
|
+
uiGridId: this.gridId,
|
|
317
|
+
userId: this.loggedInUser,
|
|
318
|
+
};
|
|
319
|
+
if (event.finished == true || event.type === 'columnPinned') {
|
|
320
|
+
this.gridColumnState = columnState;
|
|
321
|
+
this.gridService.saveColumnConfig(columnData)
|
|
322
|
+
.pipe(takeUntil(this.unsubscribe$))
|
|
323
|
+
.subscribe((res) => {
|
|
324
|
+
this.setGridState();
|
|
325
|
+
if (res.status == 0) {
|
|
326
|
+
console.log('Error while saving column configuration:', res.message);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
//custom export method
|
|
332
|
+
exportFile(type) {
|
|
333
|
+
this.getDataForExcelExport(type);
|
|
334
|
+
}
|
|
335
|
+
//Generate only those columns for export which are visible and are not of other types that are not required for export
|
|
336
|
+
generateColumnsForExcel() {
|
|
337
|
+
let columnsToBeDisplayedForExcel = [];
|
|
338
|
+
this.exportColumnsList.forEach((column) => {
|
|
339
|
+
if (column.visible == true &&
|
|
340
|
+
column.columnType != 'checkbox' &&
|
|
341
|
+
column.columnType != 'dropdown' &&
|
|
342
|
+
column.columnType != '') {
|
|
343
|
+
columnsToBeDisplayedForExcel.push(column.field);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
return columnsToBeDisplayedForExcel;
|
|
347
|
+
}
|
|
348
|
+
//Get data from server without paging so that whole data can be exported to excel
|
|
349
|
+
// and also check for server side and client side rendering of data for export.
|
|
350
|
+
getDataForExcelExport(type) {
|
|
351
|
+
this.agGrid.api.showLoadingOverlay();
|
|
352
|
+
if (this.enableServerSidePaging) {
|
|
353
|
+
this.gridService
|
|
354
|
+
.getDataForExport(this.serverDataUrl)
|
|
355
|
+
.pipe(takeUntil(this.unsubscribe$))
|
|
356
|
+
.subscribe((response) => {
|
|
357
|
+
this.agGrid.api.hideOverlay();
|
|
358
|
+
if (response && response.value.length > 0) {
|
|
359
|
+
this.excelAPI.setRowData(response.value);
|
|
360
|
+
this.excelAPI.sizeColumnsToFit();
|
|
361
|
+
if (type == 'csv') {
|
|
362
|
+
this.excelAPI.exportDataAsCsv({
|
|
363
|
+
columnKeys: this.generateColumnsForExcel(),
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
this.excelAPI.exportDataAsExcel({
|
|
368
|
+
columnKeys: this.generateColumnsForExcel(),
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
console.log('Error while fetching data for excel/csv export');
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
this.agGrid.api.hideOverlay();
|
|
379
|
+
if (type == 'csv') {
|
|
380
|
+
this.agGrid.api.exportDataAsCsv({
|
|
381
|
+
columnKeys: this.generateColumnsForExcel(),
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
this.agGrid.api.exportDataAsExcel({
|
|
386
|
+
columnKeys: this.generateColumnsForExcel(),
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
onSelectionChanged(e) {
|
|
392
|
+
this.selectionChanged.emit(e);
|
|
393
|
+
}
|
|
394
|
+
onFilterChanged(e) {
|
|
395
|
+
this.filterChanged.emit(e);
|
|
396
|
+
}
|
|
397
|
+
onFirstDataRendered(e) {
|
|
398
|
+
this.firstDataRendered.emit(e);
|
|
399
|
+
}
|
|
400
|
+
onGridReadyExcel(params) {
|
|
401
|
+
this.excelAPI = params.api;
|
|
402
|
+
}
|
|
403
|
+
//destroy all associated subscriptions on component destroy
|
|
404
|
+
ngOnDestroy() {
|
|
405
|
+
this.unsubscribe$.next();
|
|
406
|
+
this.unsubscribe$.complete();
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
GridLibraryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: GridLibraryComponent, deps: [{ token: i1.GridLibraryService }, { token: i2.ColumnValueFormatter }], target: i0.ɵɵFactoryTarget.Component });
|
|
410
|
+
GridLibraryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.6", type: GridLibraryComponent, selector: "lib-basesite-shared-grid-lib", inputs: { columnDefs: "columnDefs", rowData: "rowData", pageSize: "pageSize", rowSelection: "rowSelection", gridId: "gridId", loggedInUser: "loggedInUser", enableServerSidePaging: "enableServerSidePaging", serverDataUrl: "serverDataUrl", environment: "environment", cacheBlockSize: "cacheBlockSize", rowMultiSelectWithClick: "rowMultiSelectWithClick", floatingFilter: "floatingFilter", paginationAutoPageSize: "paginationAutoPageSize" }, outputs: { btnClickHandler: "btnClickHandler", firstDataRendered: "firstDataRendered", filterChanged: "filterChanged", selectionChanged: "selectionChanged" }, viewQueries: [{ propertyName: "agGrid", first: true, predicate: ["agGrid"], descendants: true }], ngImport: i0, template: `
|
|
411
|
+
<ag-grid-angular #agGrid
|
|
412
|
+
style="width: 100%;height:98.2vh"
|
|
413
|
+
class="ag-theme-balham shared-grid-lib"
|
|
414
|
+
[columnDefs]="columnDefs"
|
|
415
|
+
[defaultColDef]="defaultColDef"
|
|
416
|
+
[rowData]="rowData"
|
|
417
|
+
[rowSelection]="rowSelection"
|
|
418
|
+
[animateRows]="true"
|
|
419
|
+
(gridReady)="onGridReady($event)"
|
|
420
|
+
[pagination]="true"
|
|
421
|
+
[paginationPageSize]="gridPageSize"
|
|
422
|
+
[paginationNumberFormatter]="paginationNumberFormatter"
|
|
423
|
+
(modelUpdated)="onModelUpdated()"
|
|
424
|
+
[tooltipShowDelay]="tooltipShowDelay"
|
|
425
|
+
[tooltipHideDelay]="tooltipHideDelay"
|
|
426
|
+
[rowModelType]="rowModelType"
|
|
427
|
+
[cacheBlockSize]="cacheBlockSize"
|
|
428
|
+
[maxConcurrentDatasourceRequests]="1"
|
|
429
|
+
[blockLoadDebounceMillis]="100"
|
|
430
|
+
[paginationAutoPageSize]="paginationAutoPageSize"
|
|
431
|
+
(columnVisible)="onSaveGridColumnState($event)"
|
|
432
|
+
(columnPinned)="onSaveGridColumnState($event)"
|
|
433
|
+
(columnResized)="onSaveGridColumnState($event)"
|
|
434
|
+
(columnMoved)="onSaveGridColumnState($event)"
|
|
435
|
+
(sortChanged)="onSortChangedEvent()"
|
|
436
|
+
[rowMultiSelectWithClick]="rowMultiSelectWithClick"
|
|
437
|
+
[getContextMenuItems]="getContextMenuItems"
|
|
438
|
+
(selectionChanged)="onSelectionChanged($event)"
|
|
439
|
+
(filterChanged)="onFilterChanged($event)"
|
|
440
|
+
(firstDataRendered)="onFirstDataRendered($event)"
|
|
441
|
+
>
|
|
442
|
+
</ag-grid-angular>
|
|
443
|
+
<ag-grid-angular
|
|
444
|
+
#agGridHidden
|
|
445
|
+
style="height:100vh; width:100%;display:none"
|
|
446
|
+
class="ag-theme-balham"
|
|
447
|
+
[rowData]="rowDataHidden"
|
|
448
|
+
[columnDefs]="columnDefs"
|
|
449
|
+
[defaultColDef]="defaultColDef"
|
|
450
|
+
[animateRows]="false"
|
|
451
|
+
[rowSelection]="'multiple'"
|
|
452
|
+
(gridReady)="onGridReadyExcel($event)"
|
|
453
|
+
[suppressScrollOnNewData]="true"
|
|
454
|
+
[cacheQuickFilter]="false"
|
|
455
|
+
>
|
|
456
|
+
</ag-grid-angular>
|
|
457
|
+
`, isInline: true, dependencies: [{ kind: "component", type: i3.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "quickFilterText", "cacheQuickFilter", "excludeHiddenColumnsFromQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "suppressChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "suppressServerSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }] });
|
|
458
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: GridLibraryComponent, decorators: [{
|
|
459
|
+
type: Component,
|
|
460
|
+
args: [{ selector: 'lib-basesite-shared-grid-lib', template: `
|
|
461
|
+
<ag-grid-angular #agGrid
|
|
462
|
+
style="width: 100%;height:98.2vh"
|
|
463
|
+
class="ag-theme-balham shared-grid-lib"
|
|
464
|
+
[columnDefs]="columnDefs"
|
|
465
|
+
[defaultColDef]="defaultColDef"
|
|
466
|
+
[rowData]="rowData"
|
|
467
|
+
[rowSelection]="rowSelection"
|
|
468
|
+
[animateRows]="true"
|
|
469
|
+
(gridReady)="onGridReady($event)"
|
|
470
|
+
[pagination]="true"
|
|
471
|
+
[paginationPageSize]="gridPageSize"
|
|
472
|
+
[paginationNumberFormatter]="paginationNumberFormatter"
|
|
473
|
+
(modelUpdated)="onModelUpdated()"
|
|
474
|
+
[tooltipShowDelay]="tooltipShowDelay"
|
|
475
|
+
[tooltipHideDelay]="tooltipHideDelay"
|
|
476
|
+
[rowModelType]="rowModelType"
|
|
477
|
+
[cacheBlockSize]="cacheBlockSize"
|
|
478
|
+
[maxConcurrentDatasourceRequests]="1"
|
|
479
|
+
[blockLoadDebounceMillis]="100"
|
|
480
|
+
[paginationAutoPageSize]="paginationAutoPageSize"
|
|
481
|
+
(columnVisible)="onSaveGridColumnState($event)"
|
|
482
|
+
(columnPinned)="onSaveGridColumnState($event)"
|
|
483
|
+
(columnResized)="onSaveGridColumnState($event)"
|
|
484
|
+
(columnMoved)="onSaveGridColumnState($event)"
|
|
485
|
+
(sortChanged)="onSortChangedEvent()"
|
|
486
|
+
[rowMultiSelectWithClick]="rowMultiSelectWithClick"
|
|
487
|
+
[getContextMenuItems]="getContextMenuItems"
|
|
488
|
+
(selectionChanged)="onSelectionChanged($event)"
|
|
489
|
+
(filterChanged)="onFilterChanged($event)"
|
|
490
|
+
(firstDataRendered)="onFirstDataRendered($event)"
|
|
491
|
+
>
|
|
492
|
+
</ag-grid-angular>
|
|
493
|
+
<ag-grid-angular
|
|
494
|
+
#agGridHidden
|
|
495
|
+
style="height:100vh; width:100%;display:none"
|
|
496
|
+
class="ag-theme-balham"
|
|
497
|
+
[rowData]="rowDataHidden"
|
|
498
|
+
[columnDefs]="columnDefs"
|
|
499
|
+
[defaultColDef]="defaultColDef"
|
|
500
|
+
[animateRows]="false"
|
|
501
|
+
[rowSelection]="'multiple'"
|
|
502
|
+
(gridReady)="onGridReadyExcel($event)"
|
|
503
|
+
[suppressScrollOnNewData]="true"
|
|
504
|
+
[cacheQuickFilter]="false"
|
|
505
|
+
>
|
|
506
|
+
</ag-grid-angular>
|
|
507
|
+
` }]
|
|
508
|
+
}], ctorParameters: function () { return [{ type: i1.GridLibraryService }, { type: i2.ColumnValueFormatter }]; }, propDecorators: { columnDefs: [{
|
|
509
|
+
type: Input
|
|
510
|
+
}], rowData: [{
|
|
511
|
+
type: Input
|
|
512
|
+
}], pageSize: [{
|
|
513
|
+
type: Input
|
|
514
|
+
}], rowSelection: [{
|
|
515
|
+
type: Input
|
|
516
|
+
}], gridId: [{
|
|
517
|
+
type: Input
|
|
518
|
+
}], loggedInUser: [{
|
|
519
|
+
type: Input
|
|
520
|
+
}], enableServerSidePaging: [{
|
|
521
|
+
type: Input
|
|
522
|
+
}], serverDataUrl: [{
|
|
523
|
+
type: Input
|
|
524
|
+
}], environment: [{
|
|
525
|
+
type: Input
|
|
526
|
+
}], cacheBlockSize: [{
|
|
527
|
+
type: Input
|
|
528
|
+
}], rowMultiSelectWithClick: [{
|
|
529
|
+
type: Input
|
|
530
|
+
}], floatingFilter: [{
|
|
531
|
+
type: Input
|
|
532
|
+
}], paginationAutoPageSize: [{
|
|
533
|
+
type: Input
|
|
534
|
+
}], btnClickHandler: [{
|
|
535
|
+
type: Output
|
|
536
|
+
}], firstDataRendered: [{
|
|
537
|
+
type: Output
|
|
538
|
+
}], filterChanged: [{
|
|
539
|
+
type: Output
|
|
540
|
+
}], selectionChanged: [{
|
|
541
|
+
type: Output
|
|
542
|
+
}], agGrid: [{
|
|
543
|
+
type: ViewChild,
|
|
544
|
+
args: ['agGrid']
|
|
545
|
+
}] } });
|
|
546
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1saWJyYXJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Jhc2VzaXRlLXNoYXJlZC1ncmlkLWxpYi9zcmMvbGliL2dyaWQtbGlicmFyeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFnQnZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scURBQXFELENBQUM7QUFDcEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFFbkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBc0QvQixNQUFNLE9BQU8sb0JBQW9CO0lBcUMvQixZQUNVLFdBQStCLEVBQy9CLGdCQUFzQztRQUR0QyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFzQjtRQW5DdkMsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixpQkFBWSxHQUFRLFVBQVUsQ0FBQztRQUcvQiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFHeEMsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0IsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBQ3pDLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLDJCQUFzQixHQUFZLEtBQUssQ0FBQztRQUNqRCxnQkFBZ0I7UUFDTixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDMUMsc0JBQWlCLEdBQUcs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QUE4QixZQUM5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQ1Q7NElBS1EsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBR2MsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBZ0dyaWRBbmd1bGFyIH0gZnJvbSAnYWctZ3JpZC1hbmd1bGFyJztcclxuaW1wb3J0IHtcclxuICBDb2xEZWYsXHJcbiAgR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcyxcclxuICBHZXRSb3dJZEZ1bmMsXHJcbiAgR2V0Um93SWRQYXJhbXMsXHJcbiAgR3JpZEFwaSxcclxuICBHcmlkUmVhZHlFdmVudCxcclxuICBNZW51SXRlbURlZixcclxuICBQYWdpbmF0aW9uTnVtYmVyRm9ybWF0dGVyUGFyYW1zLFxyXG4gIFJvd01vZGVsVHlwZSxcclxuICBSb3dOb2RlLFxyXG4gIFZhbHVlRm9ybWF0dGVyUGFyYW1zLFxyXG59IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcclxuaW1wb3J0IHsgR3JpZExpYnJhcnlTZXJ2aWNlIH0gZnJvbSAnLi9ncmlkLWxpYnJhcnkuc2VydmljZSc7XHJcbmltcG9ydCB7IE9kYXRhU2VydmVyU2lkZVByb3ZpZGVyIH0gZnJvbSAnLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgQnV0dG9uUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL3JlbmRlcmVyL2J1dHRvbi1yZW5kZXJlci9idXR0b24tcmVuZGVyZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ3VzdG9tVG9vbHRpcCB9IGZyb20gJy4vcmVuZGVyZXIvdG9vbHRpcC1yZW5kZXJlci9jdXN0b20tdG9vbHRpcC1yZW5kZXJlcic7XHJcbmltcG9ydCB7IERyb3Bkb3duUmVuZGVyZXIgfSBmcm9tICcuL3JlbmRlcmVyL2Ryb3Bkb3duLXJlbmRlcmVyL2Ryb3AtZG93bi1yZW5kZXJlcic7XHJcbmltcG9ydCB7IENvbHVtblZhbHVlRm9ybWF0dGVyIH0gZnJvbSAnLi9mb3JtYXR0ZXJzL2NvbHVtbi12YWx1ZS1mb3JtYXR0ZXInO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWJhc2VzaXRlLXNoYXJlZC1ncmlkLWxpYicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxhZy1ncmlkLWFuZ3VsYXIgI2FnR3JpZFxyXG4gICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO2hlaWdodDo5OC4ydmhcIlxyXG4gICAgICBjbGFzcz1cImFnLXRoZW1lLWJhbGhhbSBzaGFyZWQtZ3JpZC1saWJcIlxyXG4gICAgICBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCJcclxuICAgICAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiXHJcbiAgICAgIFtyb3dEYXRhXT1cInJvd0RhdGFcIlxyXG4gICAgICBbcm93U2VsZWN0aW9uXT1cInJvd1NlbGVjdGlvblwiXHJcbiAgICAgIFthbmltYXRlUm93c109XCJ0cnVlXCJcclxuICAgICAgKGdyaWRSZWFkeSk9XCJvbkdyaWRSZWFkeSgkZXZlbnQpXCJcclxuICAgICAgW3BhZ2luYXRpb25dPVwidHJ1ZVwiXHJcbiAgICAgIFtwYWdpbmF0aW9uUGFnZVNpemVdPVwiZ3JpZFBhZ2VTaXplXCJcclxuICAgICAgW3BhZ2luYXRpb25OdW1iZXJGb3JtYXR0ZXJdPVwicGFnaW5hdGlvbk51bWJlckZvcm1hdHRlclwiXHJcbiAgICAgIChtb2RlbFVwZGF0ZWQpPVwib25Nb2RlbFVwZGF0ZWQoKVwiXHJcbiAgICAgIFt0b29sdGlwU2hvd0RlbGF5XT1cInRvb2x0aXBTaG93RGVsYXlcIlxyXG4gICAgICBbdG9vbHRpcEhpZGVEZWxheV09XCJ0b29sdGlwSGlkZURlbGF5XCJcclxuICAgICAgW3Jvd01vZGVsVHlwZV09XCJyb3dNb2RlbFR5cGVcIlxyXG4gICAgICBbY2FjaGVCbG9ja1NpemVdPVwiY2FjaGVCbG9ja1NpemVcIlxyXG4gICAgICBbbWF4Q29uY3VycmVudERhdGFzb3VyY2VSZXF1ZXN0c109XCIxXCJcclxuICAgICAgW2Jsb2NrTG9hZERlYm91bmNlTWlsbGlzXT1cIjEwMFwiXHJcbiAgICAgIFtwYWdpbmF0aW9uQXV0b1BhZ2VTaXplXT1cInBhZ2luYXRpb25BdXRvUGFnZVNpemVcIlxyXG4gICAgICAoY29sdW1uVmlzaWJsZSk9XCJvblNhdmVHcmlkQ29sdW1uU3RhdGUoJGV2ZW50KVwiXHJcbiAgICAgIChjb2x1bW5QaW5uZWQpPVwib25TYXZlR3JpZENvbHVtblN0YXRlKCRldmVudClcIlxyXG4gICAgICAoY29sdW1uUmVzaXplZCk9XCJvblNhdmVHcmlkQ29sdW1uU3RhdGUoJGV2ZW50KVwiXHJcbiAgICAgIChjb2x1bW5Nb3ZlZCk9XCJvblNhdmVHcmlkQ29sdW1uU3RhdGUoJGV2ZW50KVwiXHJcbiAgICAgIChzb3J0Q2hhbmdlZCk9XCJvblNvcnRDaGFuZ2VkRXZlbnQoKVwiXHJcbiAgICAgIFtyb3dNdWx0aVNlbGVjdFdpdGhDbGlja109XCJyb3dNdWx0aVNlbGVjdFdpdGhDbGlja1wiXHJcbiAgICAgIFtnZXRDb250ZXh0TWVudUl0ZW1zXT1cImdldENvbnRleHRNZW51SXRlbXNcIlxyXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlZCk9XCJvblNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgIChmaWx0ZXJDaGFuZ2VkKT1cIm9uRmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgKGZpcnN0RGF0YVJlbmRlcmVkKT1cIm9uRmlyc3REYXRhUmVuZGVyZWQoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgIDxhZy1ncmlkLWFuZ3VsYXJcclxuICAgICAgI2FnR3JpZEhpZGRlblxyXG4gICAgICBzdHlsZT1cImhlaWdodDoxMDB2aDsgd2lkdGg6MTAwJTtkaXNwbGF5Om5vbmVcIlxyXG4gICAgICBjbGFzcz1cImFnLXRoZW1lLWJhbGhhbVwiXHJcbiAgICAgIFtyb3dEYXRhXT1cInJvd0RhdGFIaWRkZW5cIlxyXG4gICAgICBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCJcclxuICAgICAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiXHJcbiAgICAgIFthbmltYXRlUm93c109XCJmYWxzZVwiXHJcbiAgICAgIFtyb3dTZWxlY3Rpb25dPVwiJ211bHRpcGxlJ1wiXHJcbiAgICAgIChncmlkUmVhZHkpPVwib25HcmlkUmVhZHlFeGNlbCgkZXZlbnQpXCJcclxuICAgICAgW3N1cHByZXNzU2Nyb2xsT25OZXdEYXRhXT1cInRydWVcIlxyXG4gICAgICBbY2FjaGVRdWlja0ZpbHRlcl09XCJmYWxzZVwiXHJcbiAgICA+XHJcbiAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICBgLFxyXG4gIHN0eWxlczogW10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHcmlkTGlicmFyeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCxPbkRlc3Ryb3kge1xyXG4gIC8vaW5wdXQgcGFyYW1zXHJcbiAgQElucHV0KCkgY29sdW1uRGVmczogYW55O1xyXG4gIEBJbnB1dCgpIHJvd0RhdGE6IGFueTtcclxuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMjA7XHJcbiAgQElucHV0KCkgcm93U2VsZWN0aW9uOiBhbnkgPSAnbXVsdGlwbGUnO1xyXG4gIEBJbnB1dCgpIGdyaWRJZDogYW55O1xyXG4gIEBJbnB1dCgpIGxvZ2dlZEluVXNlcjogYW55O1xyXG4gIEBJbnB1dCgpIGVuYWJsZVNlcnZlclNpZGVQYWdpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZXJ2ZXJEYXRhVXJsITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGVudmlyb25tZW50ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNhY2hlQmxvY2tTaXplOiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpIHJvd011bHRpU2VsZWN0V2l0aENsaWNrOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZmxvYXRpbmdGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwYWdpbmF0aW9uQXV0b1BhZ2VTaXplOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy9ldmVudCBlbWl0dGVyc1xyXG4gIEBPdXRwdXQoKSBidG5DbGlja0hhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZmlyc3REYXRhUmVuZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZmlsdGVyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8vdmlld0NoaWxkc1xyXG4gIEBWaWV3Q2hpbGQoJ2FnR3JpZCcpIGFnR3JpZCE6IEFnR3JpZEFuZ3VsYXI7XHJcblxyXG4gIC8vcGFyYW10ZXJzXHJcbiAgcm93RGF0YUhpZGRlbjogYW55ID0gW107XHJcbiAgZ3JpZENvbHVtblN0YXRlOiBhbnk7XHJcbiAgZXhwb3J0Q29sdW1uc0xpc3Q6IGFueSA9IFtdO1xyXG4gIHB1YmxpYyB0b29sdGlwU2hvd0RlbGF5ID0gMDtcclxuICBwdWJsaWMgdG9vbHRpcEhpZGVEZWxheSA9IDIwMDA7XHJcbiAgcHVibGljIHJvd01vZGVsVHlwZTogUm93TW9kZWxUeXBlID0gJ2NsaWVudFNpZGUnO1xyXG4gIHB1YmxpYyBncmlkUGFnZVNpemU6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBleGNlbEFQSSE6IEdyaWRBcGk7XHJcblxyXG4gIC8vdW5zdWJzY3JpYmUgc3ViamVjdFxyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IEdyaWRMaWJyYXJ5U2VydmljZSxcclxuICAgIHByaXZhdGUgZm9ybWF0dGVyU2VydmljZTogQ29sdW1uVmFsdWVGb3JtYXR0ZXJcclxuICApIHtcclxuICB9XHJcblxyXG4gIG9uU29ydENoYW5nZWRFdmVudCgpIHtcclxuICAgIHRoaXMuZ3JpZENvbHVtblN0YXRlID0gdGhpcy5hZ0dyaWQuY29sdW1uQXBpLmdldENvbHVtblN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVmYXVsdENvbERlZjogQ29sRGVmID0ge1xyXG4gICAgc29ydGFibGU6IHRydWUsXHJcbiAgICBmaWx0ZXI6IHRydWUsXHJcbiAgICB0b29sdGlwQ29tcG9uZW50OiBDdXN0b21Ub29sdGlwLFxyXG4gIH07XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5ncmlkUGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5jYWNoZUJsb2NrU2l6ZSA9IHRoaXMuY2FjaGVCbG9ja1NpemUgPSAwXHJcbiAgICAgID8gdGhpcy5wYWdlU2l6ZVxyXG4gICAgICA6IHRoaXMuY2FjaGVCbG9ja1NpemU7XHJcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLnNldEJhc2VVcmwodGhpcy5lbnZpcm9ubWVudCk7XHJcbiAgICB0aGlzLmdldEdyaWRTdGF0ZSgpO1xyXG4gICAgdGhpcy5nZXRDb2xEZWYoKTtcclxuICAgIGlmICh0aGlzLmVuYWJsZVNlcnZlclNpZGVQYWdpbmcgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnJvd01vZGVsVHlwZSA9ICdzZXJ2ZXJTaWRlJztcclxuICAgICAgdGhpcy5yb3dEYXRhID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJvd01vZGVsVHlwZSA9ICdjbGllbnRTaWRlJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBwYWdpbmF0aW9uTnVtYmVyRm9ybWF0dGVyOiAoXHJcbiAgICBwYXJhbXM6IFBhZ2luYXRpb25OdW1iZXJGb3JtYXR0ZXJQYXJhbXNcclxuICApID0+IHN0cmluZyA9IChwYXJhbXM6IFBhZ2luYXRpb25OdW1iZXJGb3JtYXR0ZXJQYXJhbXMpID0+IHtcclxuICAgIHJldHVybiAnWycgKyBwYXJhbXMudmFsdWUudG9Mb2NhbGVTdHJpbmcoKSArICddJztcclxuICB9O1xyXG5cclxuICBvbk1vZGVsVXBkYXRlZCgpIHtcclxuICAgIHRoaXMuc2V0R3JpZFN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRDb2xEZWYoKSB7XHJcbiAgICBpZiAodGhpcy5ncmlkSWQgJiYgdGhpcy5sb2dnZWRJblVzZXIpIHtcclxuICAgICAgdGhpcy5ncmlkU2VydmljZS5nZXRDb2xEZWYodGhpcy5ncmlkSWQpLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAxKSB7XHJcbiAgICAgICAgICBsZXQgY29sZGVmOiBDb2xEZWZbXSA9IHJlc3BvbnNlLmxpc3QubWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLmlzQnV0dG9uID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIGlmIChyZXMuY29sdW1uVHlwZSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgZmllbGQ6IHJlcy5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogcmVzLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXBGaWVsZDogcmVzLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGhlYWRlckNoZWNrYm94U2VsZWN0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGNoZWNrYm94U2VsZWN0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICBzaG93RGlzYWJsZWRDaGVja2JveGVzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICBzdXBwcmVzc0ZpbHRlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgc3VwcHJlc3NTb3J0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICBzdXBwcmVzc01lbnU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiA1NSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuY29sdW1uVHlwZSA9PT0gJ2Ryb3Bkb3duJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgZmllbGQ6IHJlcy5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogcmVzLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIHNvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgc3VwcHJlc3NGaWx0ZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIHN1cHByZXNzU29ydGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgc3VwcHJlc3NNZW51OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwRmllbGQ6IHJlcy5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiBEcm9wZG93blJlbmRlcmVyLFxyXG4gICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IHtcclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLm9uQnRuQ2xpY2suYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiByZXMudG9vbHRpcCxcclxuICAgICAgICAgICAgICAgICAgICBkcm9wRG93bkRhdGE6IHJlcy5kcm9wRG93bkRhdGEsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2VsbENsaWNrZWQ6IChlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLm5vZGUuc2V0U2VsZWN0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogNDAsXHJcbiAgICAgICAgICAgICAgICAgIHBpbm5lZDogcmVzLnBpblBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICBsb2NrUGlubmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgZmllbGQ6IHJlcy5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZTogcmVzLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGhpZGU6ICFyZXMudmlzaWJsZSxcclxuICAgICAgICAgICAgICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXBGaWVsZDogcmVzLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICBmbG9hdGluZ0ZpbHRlcjogdGhpcy5mbG9hdGluZ0ZpbHRlcixcclxuICAgICAgICAgICAgICAgICAgdmFsdWVGb3JtYXR0ZXI6IChwYXJhbXM6IFZhbHVlRm9ybWF0dGVyUGFyYW1zKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0dGVyU2VydmljZS5jb2xWYWx1ZUZvcm1hdHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlcy5jb2x1bW5UeXBlXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgZmlsdGVyYWJsZTogcmVzLmZpbHRlcmFibGUsXHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlcjpcclxuICAgICAgICAgICAgICAgICAgICByZXMuY29sdW1uVHlwZSA9PSAnc3RyaW5nJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgPyAnYWdUZXh0Q29sdW1uRmlsdGVyJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgOiByZXMuY29sdW1uVHlwZSA9PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgPyAnYWdOdW1iZXJDb2x1bW5GaWx0ZXInXHJcbiAgICAgICAgICAgICAgICAgICAgICA6ICdhZ0RhdGVDb2x1bW5GaWx0ZXInLFxyXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJQYXJhbXM6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJMb2NhbERhdGVBdE1pZG5pZ2h0OiBhbnksXHJcbiAgICAgICAgICAgICAgICAgICAgICBjZWxsVmFsdWU6IGFueVxyXG4gICAgICAgICAgICAgICAgICAgICkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZUFzU3RyaW5nID0gY2VsbFZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRlQXNTdHJpbmcgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuY29sdW1uVHlwZSA9PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbERhdGUgPSBuZXcgRGF0ZShkYXRlQXNTdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbERhdGUgPCBmaWx0ZXJMb2NhbERhdGVBdE1pZG5pZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNlbGxEYXRlID4gZmlsdGVyTG9jYWxEYXRlQXRNaWRuaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFsncmVzZXQnXVxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiByZXMuZmllbGQsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiByZXMudGl0bGUsXHJcbiAgICAgICAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBoaWRlOiAhcmVzLnZpc2libGUsXHJcbiAgICAgICAgICAgICAgICBzdXBwcmVzc0ZpbHRlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHN1cHByZXNzU29ydGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHN1cHByZXNzTWVudTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHRvb2x0aXBGaWVsZDogcmVzLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgY2VsbFJlbmRlcmVyOiBCdXR0b25SZW5kZXJlckNvbXBvbmVudCxcclxuICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlclBhcmFtczoge1xyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLm9uQnRuQ2xpY2suYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHJlcy5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgaWNvbjogcmVzLmljb24sXHJcbiAgICAgICAgICAgICAgICAgIGJ1dHRvbk5hbWU6IHJlcy5idXR0b25OYW1lLFxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwOiByZXMudG9vbHRpcCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB2YWx1ZUdldHRlcjogKHBhcmFtczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXMudG9vbHRpcCB8fCByZXMudGl0bGU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbWluV2lkdGg6IDIwLFxyXG4gICAgICAgICAgICAgICAgY2VsbENsYXNzOiAnYWN0aW9uLWJ1dHRvbicsXHJcbiAgICAgICAgICAgICAgICBwaW5uZWQ6IHJlcy5waW5Qb3NpdGlvbixcclxuICAgICAgICAgICAgICAgIGxvY2tQaW5uZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogcmVzLmxhYmVsID8gMTAwIDogNDAsXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmV4cG9ydENvbHVtbnNMaXN0ID0gcmVzcG9uc2UubGlzdDtcclxuICAgICAgICAgIHRoaXMuY29sdW1uRGVmcyA9IGNvbGRlZjtcclxuICAgICAgICAgIHRoaXMuYWdHcmlkLmdyaWRPcHRpb25zPy5hcGk/LnNldENvbHVtbkRlZnMoY29sZGVmKTtcclxuICAgICAgICAgIHRoaXMuZ2V0R3JpZFN0YXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdDb2xEZWYgUmVhZCBFcnJvcj0+JywgcmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdQbGVhc2UgcGFzcyB2YWxpZCBHcmlkSWQgYW5kIGxvZ2dlZEluIHVzZXIgSWQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEV4dGVybmFsRmlsdGVycyhvcHRpb25zOiBhbnkpIHtcclxuICAgIHZhciBzZXJ2ZXJVcmwgPSAnJztcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zZXJ2ZXJEYXRhVXJsLmluZGV4T2YoJ2ZpbHRlcicpID49IDAgJiZcclxuICAgICAgb3B0aW9ucy5pbmRleE9mKCdmaWx0ZXInKSA+PSAwXHJcbiAgICApIHtcclxuICAgICAgbGV0IHNsdWcgPSB0aGlzLnNlcnZlckRhdGFVcmwuc3BsaXQoJz8kZmlsdGVyPScpO1xyXG4gICAgICBpZiAoc2x1ZyAmJiBzbHVnLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyArICcgYW5kICcgKyBzbHVnWzFdO1xyXG4gICAgICAgIHNlcnZlclVybCA9IHNsdWdbMF07XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZXJ2ZXJEYXRhVXJsLmluZGV4T2YoJz8nKSA+PSAwKSB7XHJcbiAgICAgIHNlcnZlclVybCA9IHRoaXMuc2VydmVyRGF0YVVybDtcclxuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMucmVwbGFjZSgnPycsICcmJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYCR7c2VydmVyVXJsfSR7b3B0aW9uc31gO1xyXG4gIH1cclxuXHJcbiAgb25HcmlkUmVhZHkocGFyYW1zOiBHcmlkUmVhZHlFdmVudCkge1xyXG4gICAgdGhpcy5ncmlkUGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgaWYgKHRoaXMuZW5hYmxlU2VydmVyU2lkZVBhZ2luZyA9PSB0cnVlKSB7XHJcbiAgICAgIHBhcmFtcy5hcGkuc2V0U2VydmVyU2lkZURhdGFzb3VyY2UoXHJcbiAgICAgICAgbmV3IE9kYXRhU2VydmVyU2lkZVByb3ZpZGVyKHtcclxuICAgICAgICAgIGlzQ2FzZVNlbnNpdGl2ZVN0cmluZ0ZpbHRlcjogZmFsc2UsXHJcbiAgICAgICAgICBjYWxsQXBpOiAob3B0aW9ucykgPT5cclxuICAgICAgICAgICAgZmV0Y2goYCR7dGhpcy5zZXRFeHRlcm5hbEZpbHRlcnMob3B0aW9ucyl9YCwge1xyXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICdDb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgICAgICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKSxcclxuICAgICAgICAgIGFmdGVyTG9hZERhdGE6IChvcHRpb25zLCByb3dEYXRhLCB0b3RhbENvdW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcm93RGF0YSB8fCByb3dEYXRhLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZ0dyaWQuYXBpLnNob3dOb1Jvd3NPdmVybGF5KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZ0dyaWQuYXBpLmhpZGVPdmVybGF5KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEdyaWRTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLmdyaWRDb2x1bW5TdGF0ZSkge1xyXG4gICAgICB0aGlzLmFnR3JpZC5jb2x1bW5BcGkuYXBwbHlDb2x1bW5TdGF0ZSh7XHJcbiAgICAgICAgc3RhdGU6IHRoaXMuZ3JpZENvbHVtblN0YXRlLFxyXG4gICAgICAgIGFwcGx5T3JkZXI6IHRydWUsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFyIGNvbHVtbnMgPSB0aGlzLmFnR3JpZC5jb2x1bW5BcGkuZ2V0Q29sdW1ucygpO1xyXG4gICAgICBpZiAoY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAxNSkge1xyXG4gICAgICAgICAgY29uc3QgYWxsQ29sdW1uSWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5hZ0dyaWQuY29sdW1uQXBpIS5nZXRDb2x1bW5zKCkhLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICBhbGxDb2x1bW5JZHMucHVzaChjb2x1bW4uZ2V0SWQoKSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMuYWdHcmlkLmNvbHVtbkFwaSEuYXV0b1NpemVDb2x1bW5zKGFsbENvbHVtbklkcywgZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFnR3JpZC5hcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZFN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZElkICYmIHRoaXMubG9nZ2VkSW5Vc2VyKSB7XHJcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2VcclxuICAgICAgICAuZ2V0R3JpZFN0YXRlKHRoaXMuZ3JpZElkLCB0aGlzLmxvZ2dlZEluVXNlcilcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09IDEgJiZcclxuICAgICAgICAgICAgcmVzcG9uc2Uub2JqZWN0ICYmXHJcbiAgICAgICAgICAgIHJlc3BvbnNlLm9iamVjdC5ncmlkQ29uZmlnXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkQ29sdW1uU3RhdGUgPSBKU09OLnBhcnNlKHJlc3BvbnNlLm9iamVjdC5ncmlkQ29uZmlnKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRHcmlkU3RhdGUoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGlsZSBsb2FkaW5nIGdyaWQgc3RhdGUnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQnRuQ2xpY2soZTogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZygnYnRuIGNsaWNrPT4nLCBlKTtcclxuICAgIHRoaXMuYnRuQ2xpY2tIYW5kbGVyLmVtaXQoZS5yb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIG9uU2F2ZUdyaWRDb2x1bW5TdGF0ZShldmVudDogYW55KSB7XHJcbiAgICBsZXQgY29sdW1uU3RhdGUgPSB0aGlzLmFnR3JpZC5jb2x1bW5BcGk/LmdldENvbHVtblN0YXRlKCk7XHJcbiAgICBsZXQgY29sdW1uRGF0YSA9IHtcclxuICAgICAgZ3JpZENvbmZpZzogSlNPTi5zdHJpbmdpZnkoY29sdW1uU3RhdGUpLFxyXG4gICAgICB1aUdyaWRJZDogdGhpcy5ncmlkSWQsXHJcbiAgICAgIHVzZXJJZDogdGhpcy5sb2dnZWRJblVzZXIsXHJcbiAgICB9O1xyXG4gICAgaWYgKGV2ZW50LmZpbmlzaGVkID09IHRydWUgfHwgZXZlbnQudHlwZSA9PT0gJ2NvbHVtblBpbm5lZCcpIHtcclxuICAgICAgdGhpcy5ncmlkQ29sdW1uU3RhdGUgPSBjb2x1bW5TdGF0ZTtcclxuICAgICAgdGhpcy5ncmlkU2VydmljZS5zYXZlQ29sdW1uQ29uZmlnKGNvbHVtbkRhdGEpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRHcmlkU3RhdGUoKTtcclxuICAgICAgICBpZiAocmVzLnN0YXR1cyA9PSAwKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3Igd2hpbGUgc2F2aW5nIGNvbHVtbiBjb25maWd1cmF0aW9uOicsIHJlcy5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Um93QnlJZDogR2V0Um93SWRGdW5jID0gKHBhcmFtczogR2V0Um93SWRQYXJhbXMpID0+IHtcclxuICAgIHZhciBkYXRhID0gcGFyYW1zLmRhdGE7XHJcbiAgICByZXR1cm4gZGF0YS5pZCA/PyAwO1xyXG4gIH07XHJcblxyXG4gIC8vIEN1c3RvbSByaWdodCBjbGljayBDb250ZXh0IE1lbnUgdG8gc3VwcG9ydCBjdXN0b20gZXhjZWwgZXhwb3J0c1xyXG4gIHB1YmxpYyBnZXRDb250ZXh0TWVudUl0ZW1zID0gKFxyXG4gICAgcGFyYW1zOiBHZXRDb250ZXh0TWVudUl0ZW1zUGFyYW1zXHJcbiAgKTogKHN0cmluZyB8IE1lbnVJdGVtRGVmKVtdID0+IHtcclxuICAgIGxldCByZXM6IChzdHJpbmcgfCBNZW51SXRlbURlZilbXSA9IFtcclxuICAgICAgJ2N1dCcsXHJcbiAgICAgICdjb3B5JyxcclxuICAgICAgJ2NvcHlXaXRoSGVhZGVycycsXHJcbiAgICAgICdjb3B5V2l0aEdyb3VwSGVhZGVycycsXHJcbiAgICAgICdwYXN0ZScsXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnRXhwb3J0JyxcclxuICAgICAgICBzdWJNZW51OiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdDU1YgRXhwb3J0JyxcclxuICAgICAgICAgICAgYWN0aW9uOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5leHBvcnRGaWxlKCdjc3YnKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdFeGNlbCBFeHBvcnQnLFxyXG4gICAgICAgICAgICBhY3Rpb246ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmV4cG9ydEZpbGUoJ3hsc3gnKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSxcclxuICAgIF07XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH07XHJcblxyXG4gIC8vY3VzdG9tIGV4cG9ydCBtZXRob2RcclxuICBwdWJsaWMgZXhwb3J0RmlsZSh0eXBlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZ2V0RGF0YUZvckV4Y2VsRXhwb3J0KHR5cGUpO1xyXG4gIH1cclxuICAvL0dlbmVyYXRlIG9ubHkgdGhvc2UgY29sdW1ucyBmb3IgZXhwb3J0IHdoaWNoIGFyZSB2aXNpYmxlIGFuZCBhcmUgbm90IG9mIG90aGVyIHR5cGVzIHRoYXQgYXJlIG5vdCByZXF1aXJlZCBmb3IgZXhwb3J0XHJcbiAgZ2VuZXJhdGVDb2x1bW5zRm9yRXhjZWwoKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IGNvbHVtbnNUb0JlRGlzcGxheWVkRm9yRXhjZWw6IGFueSA9IFtdO1xyXG4gICAgdGhpcy5leHBvcnRDb2x1bW5zTGlzdC5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgY29sdW1uLnZpc2libGUgPT0gdHJ1ZSAmJlxyXG4gICAgICAgIGNvbHVtbi5jb2x1bW5UeXBlICE9ICdjaGVja2JveCcgJiZcclxuICAgICAgICBjb2x1bW4uY29sdW1uVHlwZSAhPSAnZHJvcGRvd24nICYmXHJcbiAgICAgICAgY29sdW1uLmNvbHVtblR5cGUgIT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29sdW1uc1RvQmVEaXNwbGF5ZWRGb3JFeGNlbC5wdXNoKGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbHVtbnNUb0JlRGlzcGxheWVkRm9yRXhjZWw7XHJcbiAgfVxyXG5cclxuICAvL0dldCBkYXRhIGZyb20gc2VydmVyIHdpdGhvdXQgcGFnaW5nIHNvIHRoYXQgd2hvbGUgZGF0YSBjYW4gYmUgZXhwb3J0ZWQgdG8gZXhjZWxcclxuICAvLyBhbmQgYWxzbyBjaGVjayBmb3Igc2VydmVyIHNpZGUgYW5kIGNsaWVudCBzaWRlIHJlbmRlcmluZyBvZiBkYXRhIGZvciBleHBvcnQuXHJcbiAgZ2V0RGF0YUZvckV4Y2VsRXhwb3J0KHR5cGU6IHN0cmluZykge1xyXG4gICAgdGhpcy5hZ0dyaWQuYXBpLnNob3dMb2FkaW5nT3ZlcmxheSgpO1xyXG4gICAgaWYgKHRoaXMuZW5hYmxlU2VydmVyU2lkZVBhZ2luZykge1xyXG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlXHJcbiAgICAgICAgLmdldERhdGFGb3JFeHBvcnQodGhpcy5zZXJ2ZXJEYXRhVXJsKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hZ0dyaWQuYXBpLmhpZGVPdmVybGF5KCk7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmV4Y2VsQVBJLnNldFJvd0RhdGEocmVzcG9uc2UudmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmV4Y2VsQVBJLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ2NzdicpIHtcclxuICAgICAgICAgICAgICB0aGlzLmV4Y2VsQVBJLmV4cG9ydERhdGFBc0Nzdih7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5LZXlzOiB0aGlzLmdlbmVyYXRlQ29sdW1uc0ZvckV4Y2VsKCksXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5leGNlbEFQSS5leHBvcnREYXRhQXNFeGNlbCh7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5LZXlzOiB0aGlzLmdlbmVyYXRlQ29sdW1uc0ZvckV4Y2VsKCksXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGlsZSBmZXRjaGluZyBkYXRhIGZvciBleGNlbC9jc3YgZXhwb3J0Jyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFnR3JpZC5hcGkuaGlkZU92ZXJsYXkoKTtcclxuICAgICAgaWYgKHR5cGUgPT0gJ2NzdicpIHtcclxuICAgICAgICB0aGlzLmFnR3JpZC5hcGkuZXhwb3J0RGF0YUFzQ3N2KHtcclxuICAgICAgICAgIGNvbHVtbktleXM6IHRoaXMuZ2VuZXJhdGVDb2x1bW5zRm9yRXhjZWwoKSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmFnR3JpZC5hcGkuZXhwb3J0RGF0YUFzRXhjZWwoe1xyXG4gICAgICAgICAgY29sdW1uS2V5czogdGhpcy5nZW5lcmF0ZUNvbHVtbnNGb3JFeGNlbCgpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdGlvbkNoYW5nZWQoZTogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQuZW1pdChlKTtcclxuICB9XHJcblxyXG4gIG9uRmlsdGVyQ2hhbmdlZChlOiBhbnkpIHtcclxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlZC5lbWl0KGUpO1xyXG4gIH1cclxuXHJcbiAgb25GaXJzdERhdGFSZW5kZXJlZChlOiBhbnkpIHtcclxuICAgIHRoaXMuZmlyc3REYXRhUmVuZGVyZWQuZW1pdChlKTtcclxuICB9XHJcblxyXG4gIG9uR3JpZFJlYWR5RXhjZWwocGFyYW1zOiBhbnkpIHtcclxuICAgIHRoaXMuZXhjZWxBUEkgPSBwYXJhbXMuYXBpO1xyXG4gIH1cclxuXHJcbiAgLy9kZXN0cm95IGFsbCBhc3NvY2lhdGVkIHN1YnNjcmlwdGlvbnMgb24gY29tcG9uZW50IGRlc3Ryb3lcclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcclxuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|