cps-ui-kit 18.11.0 → 19.2.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.
Files changed (85) hide show
  1. package/fesm2022/cps-ui-kit.mjs +347 -307
  2. package/fesm2022/cps-ui-kit.mjs.map +1 -1
  3. package/lib/components/cps-autocomplete/cps-autocomplete.component.d.ts +2 -2
  4. package/lib/components/cps-menu/cps-menu.component.d.ts +4 -3
  5. package/lib/components/cps-select/cps-select.component.d.ts +2 -2
  6. package/lib/components/cps-tree-table/cps-tree-table.component.d.ts +25 -1
  7. package/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.d.ts +3 -3
  8. package/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.d.ts +3 -3
  9. package/package.json +6 -8
  10. package/styles/styles.scss +9 -0
  11. package/esm2022/cps-ui-kit.mjs +0 -5
  12. package/esm2022/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +0 -948
  13. package/esm2022/lib/components/cps-button/cps-button.component.mjs +0 -205
  14. package/esm2022/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +0 -239
  15. package/esm2022/lib/components/cps-checkbox/cps-checkbox.component.mjs +0 -154
  16. package/esm2022/lib/components/cps-chip/cps-chip.component.mjs +0 -94
  17. package/esm2022/lib/components/cps-datepicker/cps-datepicker.component.mjs +0 -382
  18. package/esm2022/lib/components/cps-divider/cps-divider.component.mjs +0 -60
  19. package/esm2022/lib/components/cps-expansion-panel/cps-expansion-panel.component.mjs +0 -213
  20. package/esm2022/lib/components/cps-file-upload/cps-file-upload.component.mjs +0 -182
  21. package/esm2022/lib/components/cps-icon/cps-icon.component.mjs +0 -203
  22. package/esm2022/lib/components/cps-info-circle/cps-info-circle.component.mjs +0 -61
  23. package/esm2022/lib/components/cps-input/cps-input.component.mjs +0 -385
  24. package/esm2022/lib/components/cps-loader/cps-loader.component.mjs +0 -58
  25. package/esm2022/lib/components/cps-menu/cps-menu.component.mjs +0 -572
  26. package/esm2022/lib/components/cps-paginator/cps-paginator.component.mjs +0 -118
  27. package/esm2022/lib/components/cps-paginator/pipes/cps-paginate.pipe.mjs +0 -30
  28. package/esm2022/lib/components/cps-progress-circular/cps-progress-circular.component.mjs +0 -51
  29. package/esm2022/lib/components/cps-progress-linear/cps-progress-linear.component.mjs +0 -75
  30. package/esm2022/lib/components/cps-radio-group/cps-radio/cps-radio.component.mjs +0 -42
  31. package/esm2022/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.mjs +0 -77
  32. package/esm2022/lib/components/cps-radio-group/cps-radio-group.component.mjs +0 -225
  33. package/esm2022/lib/components/cps-scheduler/cps-scheduler.component.mjs +0 -682
  34. package/esm2022/lib/components/cps-scheduler/cps-scheduler.utils.mjs +0 -604
  35. package/esm2022/lib/components/cps-select/cps-select.component.mjs +0 -654
  36. package/esm2022/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.mjs +0 -110
  37. package/esm2022/lib/components/cps-switch/cps-switch.component.mjs +0 -131
  38. package/esm2022/lib/components/cps-tab-group/cps-tab/cps-tab.component.mjs +0 -86
  39. package/esm2022/lib/components/cps-tab-group/cps-tab-group.component.mjs +0 -308
  40. package/esm2022/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.mjs +0 -79
  41. package/esm2022/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.mjs +0 -407
  42. package/esm2022/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +0 -147
  43. package/esm2022/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.mjs +0 -105
  44. package/esm2022/lib/components/cps-table/cps-column-filter-types.mjs +0 -29
  45. package/esm2022/lib/components/cps-table/cps-table.component.mjs +0 -1022
  46. package/esm2022/lib/components/cps-table/directives/cps-table-column-filter.directive.mjs +0 -181
  47. package/esm2022/lib/components/cps-table/directives/cps-table-column-resizable.directive.mjs +0 -22
  48. package/esm2022/lib/components/cps-table/directives/cps-table-column-sortable.directive.mjs +0 -47
  49. package/esm2022/lib/components/cps-table/directives/cps-table-header-selectable.directive.mjs +0 -32
  50. package/esm2022/lib/components/cps-table/directives/cps-table-row-selectable.directive.mjs +0 -35
  51. package/esm2022/lib/components/cps-table/directives/internal/table-unsort.directive.mjs +0 -212
  52. package/esm2022/lib/components/cps-table/pipes/cps-table-detect-filter-type.pipe.mjs +0 -29
  53. package/esm2022/lib/components/cps-tag/cps-tag.component.mjs +0 -121
  54. package/esm2022/lib/components/cps-textarea/cps-textarea.component.mjs +0 -290
  55. package/esm2022/lib/components/cps-timepicker/cps-timepicker.component.mjs +0 -370
  56. package/esm2022/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.mjs +0 -273
  57. package/esm2022/lib/components/cps-tree-select/cps-tree-select.component.mjs +0 -87
  58. package/esm2022/lib/components/cps-tree-table/cps-tree-table.component.mjs +0 -1279
  59. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-filter.directive.mjs +0 -174
  60. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-resizable.directive.mjs +0 -22
  61. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable.directive.mjs +0 -47
  62. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable.directive.mjs +0 -33
  63. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable.directive.mjs +0 -36
  64. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.mjs +0 -48
  65. package/esm2022/lib/components/cps-tree-table/directives/internal/tree-table-unsort.directive.mjs +0 -352
  66. package/esm2022/lib/components/cps-tree-table/pipes/cps-tree-table-detect-filter-type.pipe.mjs +0 -30
  67. package/esm2022/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +0 -656
  68. package/esm2022/lib/directives/cps-tooltip/cps-tooltip.directive.mjs +0 -275
  69. package/esm2022/lib/pipes/internal/check-option-selected.pipe.mjs +0 -24
  70. package/esm2022/lib/pipes/internal/combine-labels.pipe.mjs +0 -25
  71. package/esm2022/lib/pipes/internal/label-by-value.pipe.mjs +0 -16
  72. package/esm2022/lib/services/cps-dialog/cps-dialog.service.mjs +0 -146
  73. package/esm2022/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.mjs +0 -25
  74. package/esm2022/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.mjs +0 -470
  75. package/esm2022/lib/services/cps-dialog/internal/directives/cps-dialog-content.directive.mjs +0 -18
  76. package/esm2022/lib/services/cps-dialog/utils/cps-dialog-config.mjs +0 -3
  77. package/esm2022/lib/services/cps-dialog/utils/cps-dialog-ref.mjs +0 -128
  78. package/esm2022/lib/services/cps-notification/cps-notification.service.mjs +0 -122
  79. package/esm2022/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +0 -95
  80. package/esm2022/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.mjs +0 -106
  81. package/esm2022/lib/services/cps-notification/utils/cps-notification-config.mjs +0 -27
  82. package/esm2022/lib/services/cps-notification/utils/internal/cps-notification-data.mjs +0 -12
  83. package/esm2022/lib/utils/colors-utils.mjs +0 -59
  84. package/esm2022/lib/utils/internal/size-utils.mjs +0 -24
  85. package/esm2022/public-api.mjs +0 -58
@@ -1,1279 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Inject, Input, Output, RendererStyleFlags2, ViewChild } from '@angular/core';
2
- import { CommonModule, DOCUMENT } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import { TreeTable, TreeTableService, TreeTableModule } from 'primeng/treetable';
5
- import { DomHandler } from 'primeng/dom';
6
- import { AngleDoubleLeftIcon } from 'primeng/icons/angledoubleleft';
7
- import { AngleLeftIcon } from 'primeng/icons/angleleft';
8
- import { AngleRightIcon } from 'primeng/icons/angleright';
9
- import { AngleDoubleRightIcon } from 'primeng/icons/angledoubleright';
10
- import { cloneDeep, isEqual } from 'lodash-es';
11
- import { CpsInputComponent } from '../cps-input/cps-input.component';
12
- import { CpsButtonComponent } from '../cps-button/cps-button.component';
13
- import { CpsMenuComponent } from '../cps-menu/cps-menu.component';
14
- import { CpsIconComponent } from '../cps-icon/cps-icon.component';
15
- import { CpsSelectComponent } from '../cps-select/cps-select.component';
16
- import { CpsLoaderComponent } from '../cps-loader/cps-loader.component';
17
- import { CpsTreeTableColumnSortableDirective } from './directives/cps-tree-table-column-sortable.directive';
18
- import { TreeTableUnsortDirective } from './directives/internal/tree-table-unsort.directive';
19
- import { TableRowMenuComponent } from '../cps-table/components/internal/table-row-menu/table-row-menu.component';
20
- import { convertSize } from '../../utils/internal/size-utils';
21
- import { CpsTreeTableHeaderSelectableDirective } from './directives/cps-tree-table-header-selectable.directive';
22
- import { CpsTreeTableRowSelectableDirective } from './directives/cps-tree-table-row-selectable.directive';
23
- import { CpsTreetableRowTogglerDirective } from './directives/cps-tree-table-row-toggler.directive';
24
- import { fromEvent } from 'rxjs';
25
- import { CpsTreeTableColumnFilterDirective } from './directives/cps-tree-table-column-filter.directive';
26
- import { CpsTreeTableDetectFilterTypePipe } from './pipes/cps-tree-table-detect-filter-type.pipe';
27
- import { CpsTreeTableColumnResizableDirective } from './directives/cps-tree-table-column-resizable.directive';
28
- import * as i0 from "@angular/core";
29
- import * as i1 from "@angular/forms";
30
- import * as i2 from "@angular/common";
31
- import * as i3 from "primeng/treetable";
32
- import * as i4 from "primeng/api";
33
- export function treeTableFactory(tableComponent) {
34
- return tableComponent.primengTreeTable;
35
- }
36
- /**
37
- * CpsTreeTableComponent is used to display hierarchical data in tabular format.
38
- * @group Components
39
- */
40
- export class CpsTreeTableComponent {
41
- /**
42
- * An array of objects to display.
43
- * @default []
44
- * @group Props
45
- */
46
- set data(value) {
47
- const clone = cloneDeep(value);
48
- if (clone && clone.length > 0) {
49
- let i = 0;
50
- clone.forEach((v) => {
51
- v._defaultSortOrder = i++;
52
- });
53
- }
54
- this._data = clone;
55
- }
56
- get data() {
57
- return this._data;
58
- }
59
- // eslint-disable-next-line no-useless-constructor
60
- constructor(cdRef, document, renderer, ngZone) {
61
- this.cdRef = cdRef;
62
- this.document = document;
63
- this.renderer = renderer;
64
- this.ngZone = ngZone;
65
- /**
66
- * An array of objects to represent dynamic columns.
67
- * @group Props
68
- */
69
- this.columns = [];
70
- /**
71
- * A key used to retrieve the header from columns.
72
- * @group Props
73
- */
74
- this.colHeaderName = 'header';
75
- /**
76
- * A key used to retrieve the field from columns.
77
- * @group Props
78
- */
79
- this.colFieldName = 'field';
80
- /**
81
- * A key used to retrieve the filter type from columns.
82
- * @group Props
83
- */
84
- this.colFilterTypeName = 'filterType';
85
- /**
86
- * A key used to retrieve the date format from columns.
87
- * @group Props
88
- */
89
- this.colDateFormatName = 'dateFormat';
90
- /**
91
- * Treetable min width of type number denoting pixels or string.
92
- * @group Props
93
- */
94
- this.minWidth = '';
95
- /**
96
- * Determines whether minWidth prop is used for treetable body only, excluding toolbar and paginator.
97
- * @group Props
98
- */
99
- this.minWidthForBodyOnly = true;
100
- /**
101
- * Determines whether the cell widths scale according to their content or not.
102
- * @group Props
103
- */
104
- this.autoLayout = true;
105
- /**
106
- * Determines whether the treetable should have alternating stripes.
107
- * @group Props
108
- */
109
- this.striped = true;
110
- /**
111
- * Determines whether the treetable should have borders.
112
- * @group Props
113
- */
114
- this.bordered = true;
115
- /**
116
- * Size of treetable cells, it can be "small", "normal" or "large".
117
- * @group Props
118
- */
119
- this.size = 'normal';
120
- /**
121
- * Determines whether the treetable should have row selection.
122
- * @group Props
123
- */
124
- this.selectable = false;
125
- /**
126
- * Determines whether the treetable should have rows highlighting on hover.
127
- * @group Props
128
- */
129
- this.rowHover = true;
130
- /**
131
- * Determines whether the treetable should show row menus.
132
- * @group Props
133
- */
134
- this.showRowMenu = false;
135
- /**
136
- * Determines whether the 'Remove' button should be displayed in the row menu.
137
- * Note: This setting only takes effect if 'showRowMenu' is true and 'rowMenuItems' is not set.
138
- * @group Props
139
- */
140
- this.showRowRemoveButton = true;
141
- /**
142
- * Determines whether the 'Edit' button should be displayed in the row menu.
143
- * Note: This setting only takes effect if 'showRowMenu' is true and 'rowMenuItems' is not set.
144
- * @group Props
145
- */
146
- this.showRowEditButton = true;
147
- /**
148
- * When enabled, a loader component is displayed.
149
- * @group Props
150
- */
151
- this.loading = false;
152
- /**
153
- * Inline style of the treetable.
154
- * @group Props
155
- */
156
- this.tableStyle = undefined;
157
- /**
158
- * Style class of the treetable.
159
- * @group Props
160
- */
161
- this.tableStyleClass = '';
162
- /**
163
- * Makes all columns sortable if columns prop is provided.
164
- * @group Props
165
- */
166
- this.sortable = false;
167
- /**
168
- * Determines whether sorting works on single column or on multiple columns.
169
- * @group Props
170
- */
171
- this.sortMode = 'single';
172
- /**
173
- * Determines whether to use the default sorting or a custom one using sortFunction.
174
- * @group Props
175
- */
176
- this.customSort = false;
177
- /**
178
- * Determines whether the treetable has a toolbar.
179
- * @group Props
180
- */
181
- this.hasToolbar = true;
182
- /**
183
- * Toolbar size, it can be "small" or "normal".
184
- * @group Props
185
- */
186
- this.toolbarSize = 'normal';
187
- /**
188
- * Toolbar title.
189
- * @group Props
190
- */
191
- this.toolbarTitle = '';
192
- /**
193
- * Toolbar icon name.
194
- * @group Props
195
- */
196
- this.toolbarIcon = '';
197
- /**
198
- * Toolbar icon color.
199
- * @group Props
200
- */
201
- this.toolbarIconColor = '';
202
- /**
203
- * Makes treetable scrollable.
204
- * @group Props
205
- */
206
- this.scrollable = true;
207
- /**
208
- * Height of the scroll viewport in fixed pixels or the "flex" keyword for a dynamic size.
209
- * @group Props
210
- */
211
- this.scrollHeight = '';
212
- /**
213
- * Determines whether only the elements within scrollable area should be added into the DOM. Works only if scrollable prop is true.
214
- * @group Props
215
- */
216
- this.virtualScroll = false;
217
- /**
218
- * Height of a virtual scroll item in fixed pixels.
219
- * @group Props
220
- */
221
- this.virtualScrollItemHeight = 0;
222
- /**
223
- * Determines how many additional elements to add to the DOM outside of the view.
224
- * @group Props
225
- */
226
- this.numToleratedItems = 10;
227
- /**
228
- * Determines whether the treetable should have paginator.
229
- * @group Props
230
- */
231
- this.paginator = false;
232
- /**
233
- * Determines whether to show paginator even there is only one page.
234
- * @group Props
235
- */
236
- this.alwaysShowPaginator = true;
237
- /**
238
- * Array of integer values to display inside rows per page dropdown of paginator.
239
- * @group Props
240
- */
241
- this.rowsPerPageOptions = [];
242
- /**
243
- * Index of the first row to be displayed.
244
- * @group Props
245
- */
246
- this.first = 0;
247
- /**
248
- * Number of rows to display per page.
249
- * @group Props
250
- */
251
- this.rows = 0;
252
- /**
253
- * Determines whether to reset page on rows change.
254
- * @group Props
255
- */
256
- this.resetPageOnRowsChange = false;
257
- /**
258
- * Determines whether to reset page on treetable data sorting.
259
- * @group Props
260
- */
261
- this.resetPageOnSort = true;
262
- /**
263
- * Number of total records.
264
- * @group Props
265
- */
266
- this.totalRecords = 0;
267
- /**
268
- * Text to display when there is no data.
269
- * @group Props
270
- */
271
- this.emptyMessage = 'No data';
272
- /**
273
- * Height of treetable's body when there is no data, of type number denoting pixels or string.
274
- * @group Props
275
- */
276
- this.emptyBodyHeight = '';
277
- /**
278
- * Defines if data is loaded and interacted with in lazy manner.
279
- * @group Props
280
- */
281
- this.lazy = false;
282
- /**
283
- * Determines whether to call lazy loading on initialization.
284
- * @group Props
285
- */
286
- this.lazyLoadOnInit = true;
287
- /**
288
- * Determines whether to show global filter in the toolbar.
289
- * @group Props
290
- */
291
- this.showGlobalFilter = false;
292
- /**
293
- * Global filter placeholder.
294
- * @group Props
295
- */
296
- this.globalFilterPlaceholder = 'Search';
297
- /**
298
- * An array of fields to use in global filtering.
299
- * @group Props
300
- */
301
- this.globalFilterFields = [];
302
- /**
303
- * Determines whether to clear global filter on data loading.
304
- * @group Props
305
- */
306
- this.clearGlobalFilterOnLoading = false;
307
- /**
308
- * Determines whether to show remove button in the toolbar when rows are selected.
309
- * @group Props
310
- */
311
- this.showRemoveBtnOnSelect = true;
312
- /**
313
- * Determines whether removeBtnOnSelect is disabled.
314
- * @group Props
315
- */
316
- this.removeBtnOnSelectDisabled = false;
317
- /**
318
- * Determines whether to show additional button in the toolbar when rows are selected.
319
- * @group Props
320
- */
321
- this.showAdditionalBtnOnSelect = false;
322
- /**
323
- * AdditionalBtnOnSelect title.
324
- * @group Props
325
- */
326
- this.additionalBtnOnSelectTitle = 'Select action';
327
- /**
328
- * AdditionalBtnOnSelect icon.
329
- * @group Props
330
- */
331
- this.additionalBtnOnSelectIcon = '';
332
- /**
333
- * Determines whether additionalBtnOnSelect is disabled.
334
- * @group Props
335
- */
336
- this.additionalBtnOnSelectDisabled = false;
337
- /**
338
- * Determines whether to show action button in the toolbar.
339
- * @group Props
340
- */
341
- this.showActionBtn = false;
342
- /**
343
- * Action button title.
344
- * @group Props
345
- */
346
- this.actionBtnTitle = 'Action';
347
- /**
348
- * Action button icon.
349
- * @group Props
350
- */
351
- this.actionBtnIcon = '';
352
- /**
353
- * Determines whether actionBtn is disabled.
354
- * @group Props
355
- */
356
- this.actionBtnDisabled = false;
357
- /**
358
- * Determines whether to show data reload button in the toolbar.
359
- * @group Props
360
- */
361
- this.showDataReloadBtn = false;
362
- /**
363
- * Determines whether dataReloadBtn is disabled.
364
- * @group Props
365
- */
366
- this.dataReloadBtnDisabled = false;
367
- /**
368
- * Determines whether the treetable should show columnsToggle menu, where you can choose which columns to be displayed. If external body template is provided, use columnsSelected event emitter.
369
- * @group Props
370
- */
371
- this.showColumnsToggleBtn = false;
372
- /**
373
- * Determines whether columnsToggle button is disabled.
374
- * @group Props
375
- */
376
- this.columnsToggleBtnDisabled = false;
377
- /**
378
- * Array of initial columns to show in the treetable. If not provided, all columns are initially visible.
379
- * @group Props
380
- */
381
- this.initialColumns = [];
382
- /**
383
- * Enable filtering on all columns.
384
- * @group Props
385
- */
386
- this.filterableByColumns = false;
387
- /**
388
- * If true, automatically detects filter type based on values, otherwise sets 'text' filter type for all columns.
389
- * Note: This setting only takes effect if 'filterableByColumns' is true.
390
- * @group Props
391
- */
392
- this.autoColumnFilterType = true;
393
- /**
394
- * If set to true, row data are rendered using innerHTML.
395
- * @group Props
396
- */
397
- this.renderDataAsHTML = false;
398
- /**
399
- * Determines whether columns are resizable.
400
- * In case of using a custom template for columns, it is also needed to add cpsTTColResizable directive to th elements.
401
- * @group Props
402
- */
403
- this.resizableColumns = false;
404
- /**
405
- * Determines how the columns are resized. It can be 'fit' (total width of the table stays the same) or 'expand' (total width of the table changes when resizing columns).
406
- * Note: This setting only takes effect if 'resizableColumns' is true.
407
- *
408
- * @group Props
409
- */
410
- this.columnResizeMode = 'fit';
411
- /**
412
- * Callback to invoke on selected rows change.
413
- * @param {any[]} any[] - selected rows.
414
- * @group Emits
415
- */
416
- this.rowsSelected = new EventEmitter();
417
- /**
418
- * Callback to invoke when action button is clicked.
419
- * @param {void} void - action button clicked.
420
- * @group Emits
421
- */
422
- this.actionBtnClicked = new EventEmitter();
423
- /**
424
- * Callback to invoke when additional button on select is clicked.
425
- * @param {any[]} any[] - selected data.
426
- * @group Emits
427
- */
428
- this.additionalBtnOnSelectClicked = new EventEmitter();
429
- /**
430
- * Callback to invoke when edit-row button is clicked.
431
- * @param {any} any - button clicked.
432
- * @group Emits
433
- */
434
- this.editRowBtnClicked = new EventEmitter();
435
- /**
436
- * Callback to invoke when rows are removed.
437
- * @param {any[]} any[] - array of rows to remove.
438
- * @group Emits
439
- */
440
- this.rowsToRemove = new EventEmitter();
441
- /**
442
- * Callback to invoke when page is changed.
443
- * @param {any} any - page changed.
444
- * @group Emits
445
- */
446
- this.pageChanged = new EventEmitter();
447
- /**
448
- * Callback to invoke when data is sorted.
449
- * @param {any} any - Sort data.
450
- * @group Emits
451
- */
452
- this.sorted = new EventEmitter();
453
- /**
454
- * Callback to invoke when data is filtered.
455
- * @param {any} any - Custom filter event.
456
- * @group Emits
457
- */
458
- this.filtered = new EventEmitter();
459
- /**
460
- * Callback to invoke on selected columns.
461
- * @param {any[]} object[] - selection changed.
462
- * @group Emits
463
- */
464
- this.columnsSelected = new EventEmitter();
465
- /**
466
- * Callback to invoke when paging, sorting or filtering happens in lazy mode.
467
- * @param {any} any - Custom lazy load event.
468
- * @group Emits
469
- */
470
- this.lazyLoaded = new EventEmitter();
471
- /**
472
- * Callback to invoke when data reload button is clicked.
473
- * @param {any} any - data reload button clicked.
474
- * @group Emits
475
- */
476
- this.dataReloadBtnClicked = new EventEmitter();
477
- /**
478
- * Callback to invoke when a node is expanded.
479
- * @param {any} any - Node instance.
480
- * @group Emits
481
- */
482
- this.nodeExpanded = new EventEmitter();
483
- /**
484
- * Callback to invoke when a node is collapsed.
485
- * @param {any} any - Node collapse event.
486
- * @group Emits
487
- */
488
- this.nodeCollapsed = new EventEmitter();
489
- /**
490
- * Callback to invoke when a node is selected.
491
- * @param {any} any - Node instance.
492
- * @group Emits
493
- */
494
- this.nodeSelected = new EventEmitter();
495
- /**
496
- * Callback to invoke when a node is unselected.
497
- * @param {any} any - Custom node unselect event.
498
- * @group Emits
499
- */
500
- this.nodeUnselected = new EventEmitter();
501
- /**
502
- * A function to implement custom sorting. customSort must be true.
503
- * @param {any} any - sort meta.
504
- * @group Emits
505
- */
506
- this.customSortFunction = new EventEmitter();
507
- this.selectedColumns = [];
508
- this.rowOptions = [];
509
- this.selectedRows = [];
510
- this.virtualScrollItemSize = 0;
511
- this.defScrollHeight = '';
512
- this._defScrollHeightPx = 0;
513
- this._defScrollHeightPxInitial = 0;
514
- this._scrollbarWidth = 0;
515
- this._scrollbarVisible = true;
516
- this._needRecalcAutoLayout = true;
517
- this._data = [];
518
- this.window = this.document.defaultView;
519
- this._resizeObserver = new ResizeObserver((entries) => {
520
- entries.forEach((entry) => {
521
- const body = entry.target;
522
- this._scrollbarVisible = body.scrollHeight > body.clientHeight;
523
- if (this._scrollbarVisible && this.virtualScroll)
524
- this.renderer.setStyle(this._scrollableBody, 'overflow', 'auto', RendererStyleFlags2.Important);
525
- let wScroll = this._scrollbarVisible ? this._scrollbarWidth : 0;
526
- if (wScroll > 0)
527
- wScroll -= 1;
528
- this.renderer.setStyle(this._headerBox, 'padding-right', `${wScroll}px`);
529
- this.renderer.setStyle(this._headerBox, 'border-right', wScroll > 0 ? '1px solid #d7d5d5' : 'unset');
530
- this._calcAutoLayoutHeaderWidths();
531
- });
532
- });
533
- }
534
- ngOnInit() {
535
- if (!this.scrollable)
536
- this.virtualScroll = false;
537
- this.emptyBodyHeight = convertSize(this.emptyBodyHeight);
538
- this.minWidth = convertSize(this.minWidth);
539
- if (this.showAdditionalBtnOnSelect)
540
- this.showRemoveBtnOnSelect = false;
541
- this.defScrollHeight = this.scrollHeight;
542
- if (this.virtualScroll) {
543
- this.window.addEventListener('resize', this._onWindowResize.bind(this));
544
- if (this.defScrollHeight && this.defScrollHeight !== 'flex') {
545
- this._defScrollHeightPx = parseInt(this.scrollHeight, 10);
546
- }
547
- }
548
- if (this.paginator) {
549
- if (this.rowsPerPageOptions.length < 1)
550
- this.rowsPerPageOptions = [5, 10, 25, 50];
551
- if (!this.rows)
552
- this.rows = this.rowsPerPageOptions[0];
553
- else {
554
- if (!this.rowsPerPageOptions.includes(this.rows)) {
555
- throw new Error('rowsPerPageOptions must include rows');
556
- }
557
- }
558
- this.rowOptions = this.rowsPerPageOptions.map((v) => ({
559
- label: '' + v,
560
- value: v
561
- }));
562
- }
563
- if (this.showGlobalFilter &&
564
- this.globalFilterFields?.length < 1 &&
565
- this.data?.length > 0) {
566
- this.globalFilterFields = Object.keys(this.data[0].data);
567
- }
568
- this.selectedColumns =
569
- this.initialColumns.length > 0 ? this.initialColumns : this.columns;
570
- }
571
- ngAfterViewInit() {
572
- this._setMinWidthOverall();
573
- this._scrollableBody = this.primengTreeTable.el.nativeElement.querySelector('.p-treetable-scrollable-body');
574
- if (this._scrollableBody) {
575
- if (this.minWidthForBodyOnly && this.minWidth) {
576
- const table = this._scrollableBody.querySelector('table');
577
- if (table)
578
- this.renderer.setStyle(table, 'min-width', this.minWidth);
579
- }
580
- if (this.virtualScroll) {
581
- if (this.defScrollHeight === 'flex') {
582
- this._defScrollHeightPx = this._scrollableBody.clientHeight;
583
- this._defScrollHeightPxInitial = this._defScrollHeightPx;
584
- }
585
- if (this.autoLayout) {
586
- this._scrollSubscription = fromEvent(this._scrollableBody, 'scroll').subscribe(() => {
587
- this._calcAutoLayoutHeaderWidths(true);
588
- });
589
- }
590
- }
591
- this._headerBox = this.primengTreeTable.el.nativeElement.querySelector('.p-treetable-scrollable-header-box');
592
- if (this._headerBox) {
593
- if (this.minWidthForBodyOnly && this.minWidth) {
594
- const table = this._headerBox.querySelector('table');
595
- if (table)
596
- this.renderer.setStyle(table, 'min-width', this.minWidth);
597
- }
598
- this._scrollbarWidth = DomHandler.calculateScrollbarWidth();
599
- this._resizeObserver.observe(this._scrollableBody);
600
- }
601
- if (this._needRecalcAutoLayout) {
602
- this._calcAutoLayoutHeaderWidths();
603
- this.cdRef.detectChanges();
604
- }
605
- }
606
- if (!this.scrollable) {
607
- const tableWrapper = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable-wrapper');
608
- if (tableWrapper && this.minWidthForBodyOnly && this.minWidth) {
609
- const table = tableWrapper.querySelector('table');
610
- if (table)
611
- this.renderer.setStyle(table, 'min-width', this.minWidth);
612
- }
613
- }
614
- }
615
- ngAfterViewChecked() {
616
- if (this._needRecalcAutoLayout) {
617
- this._calcAutoLayoutHeaderWidths();
618
- this.cdRef.detectChanges();
619
- }
620
- if (!this.virtualScroll)
621
- return;
622
- if (!this._defScrollHeightPx && this.defScrollHeight === 'flex') {
623
- this._defScrollHeightPx = this._scrollableBody.clientHeight;
624
- this._defScrollHeightPxInitial = this._defScrollHeightPx;
625
- this.cdRef.detectChanges();
626
- }
627
- if (!this.virtualScrollItemSize) {
628
- setTimeout(() => {
629
- this._recalcVirtualHeight();
630
- this.cdRef.detectChanges();
631
- });
632
- }
633
- }
634
- ngOnChanges(changes) {
635
- if (this.loading) {
636
- this.clearSelection();
637
- if (this.clearGlobalFilterOnLoading)
638
- this.clearGlobalFilter();
639
- }
640
- if (this.virtualScrollItemHeight)
641
- this.virtualScrollItemSize = this.virtualScrollItemHeight;
642
- this._setMinWidthOverall();
643
- const dataChanges = changes?.data;
644
- if (dataChanges?.previousValue !== dataChanges?.currentValue) {
645
- this.clearSelection();
646
- setTimeout(() => {
647
- this._calcAutoLayoutHeaderWidths(true);
648
- });
649
- }
650
- this._calcAutoLayoutHeaderWidths(true);
651
- this._recalcVirtualHeight();
652
- }
653
- ngOnDestroy() {
654
- this._resizeObserver?.disconnect();
655
- if (this.virtualScroll) {
656
- if (this.autoLayout)
657
- this._scrollSubscription?.unsubscribe();
658
- this.window.removeEventListener('resize', this._onWindowResize.bind(this));
659
- }
660
- }
661
- _calcAutoLayoutHeaderWidths(forced = false) {
662
- this.ngZone.runOutsideAngular(() => {
663
- if (!this.autoLayout || !this.scrollable)
664
- return;
665
- if (!this._needRecalcAutoLayout && !forced)
666
- return;
667
- const headerRows = this._headerBox?.querySelectorAll('tr');
668
- if (!headerRows?.length)
669
- return;
670
- const headerCells = headerRows[headerRows.length - 1]?.querySelectorAll('th');
671
- if (!headerCells?.length)
672
- return;
673
- let hasSelectableCell = false;
674
- let hasRowMenuCell = false;
675
- const ths = Array.from(headerCells);
676
- if (ths.every((th) => th.offsetWidth === 0))
677
- return;
678
- const thWidths = ths.map((th) => {
679
- const wprev = th.style.width;
680
- const isSelectableCell = th.classList.contains('cps-treetable-selectable-cell');
681
- const isRowCell = th.classList.contains('cps-treetable-row-menu-cell');
682
- if (isSelectableCell)
683
- hasSelectableCell = true;
684
- if (isRowCell)
685
- hasRowMenuCell = true;
686
- let thWidth = 55;
687
- if (!isSelectableCell && !isRowCell) {
688
- this.renderer.setStyle(th, 'width', 'min-content');
689
- this.renderer.setStyle(th, 'display', 'block');
690
- this.renderer.setStyle(th, 'text-wrap', 'nowrap');
691
- thWidth = th.offsetWidth;
692
- this.renderer.setStyle(th, 'width', wprev);
693
- this.renderer.removeStyle(th, 'display');
694
- this.renderer.removeStyle(th, 'text-wrap');
695
- }
696
- return thWidth;
697
- });
698
- const bodyRows = this._scrollableBody?.querySelectorAll('tr');
699
- if (!bodyRows?.length)
700
- return;
701
- const tdWidths = [];
702
- const fragment = this.document.createDocumentFragment();
703
- const hiddenDiv = this.document.createElement('div');
704
- hiddenDiv.style.visibility = 'hidden';
705
- hiddenDiv.style.position = 'absolute';
706
- hiddenDiv.style.whiteSpace = 'nowrap';
707
- this.document.body.appendChild(hiddenDiv);
708
- bodyRows.forEach((tr) => {
709
- const tds = tr?.querySelectorAll('td');
710
- tds?.forEach((td, idx) => {
711
- const isSelectableOrRowMenuCell = td.classList.contains('cps-treetable-selectable-cell') ||
712
- td.classList.contains('cps-treetable-row-menu-cell');
713
- let tdWidth = 55;
714
- if (!isSelectableOrRowMenuCell) {
715
- const clonedTd = td.cloneNode(true);
716
- fragment.appendChild(clonedTd);
717
- this.renderer.setStyle(clonedTd, 'width', 'min-content');
718
- this.renderer.setStyle(clonedTd, 'display', 'block');
719
- hiddenDiv.innerHTML = clonedTd.innerHTML;
720
- hiddenDiv.style.width = 'auto';
721
- tdWidth = hiddenDiv.offsetWidth;
722
- fragment.removeChild(clonedTd);
723
- }
724
- if (!tdWidths[idx])
725
- tdWidths[idx] = 0;
726
- tdWidths[idx] = Math.max(tdWidths[idx], tdWidth);
727
- });
728
- });
729
- this.document.body.removeChild(hiddenDiv);
730
- if (thWidths.length !== tdWidths.length)
731
- return;
732
- const maxWidths = thWidths.map((v, idx) => Math.max(v, tdWidths[idx]));
733
- let sum = maxWidths.reduce((a, b) => a + b, 0);
734
- if (hasSelectableCell) {
735
- sum -= 55;
736
- maxWidths.shift();
737
- }
738
- if (hasRowMenuCell) {
739
- sum -= 55;
740
- maxWidths.pop();
741
- }
742
- const percentages = maxWidths.map((v) => (v / sum) * 100);
743
- headerCells.forEach((th, idx) => {
744
- if ((hasSelectableCell && idx === 0) ||
745
- (hasRowMenuCell && idx === headerCells.length - 1)) {
746
- this.renderer.setStyle(th, 'width', '55px');
747
- }
748
- else
749
- this.renderer.setStyle(th, 'width', percentages[hasSelectableCell ? idx - 1 : idx] + '%');
750
- });
751
- bodyRows.forEach((tr) => {
752
- const tds = tr?.querySelectorAll('td');
753
- tds?.forEach((td, idx) => {
754
- if ((hasSelectableCell && idx === 0) ||
755
- (hasRowMenuCell && idx === tds.length - 1)) {
756
- this.renderer.setStyle(td, 'width', '55px');
757
- }
758
- else {
759
- this.renderer.setStyle(td, 'width', percentages[hasSelectableCell ? idx - 1 : idx] + '%');
760
- }
761
- this.renderer.setStyle(td, 'opacity', '1');
762
- this.renderer.setStyle(td, 'overflow', 'hidden');
763
- if (this.bordered)
764
- this.renderer.setStyle(td, 'border-left-color', 'var(--cps-color-line-mid)');
765
- });
766
- });
767
- this._needRecalcAutoLayout = false;
768
- });
769
- }
770
- _updateVirtualScrollItemSize() {
771
- if (!this.virtualScroll || this.virtualScrollItemHeight)
772
- return;
773
- const trs = this.primengTreeTable?.el?.nativeElement
774
- ?.querySelector('.p-treetable-tbody')
775
- ?.querySelectorAll('tr');
776
- if (!trs?.length)
777
- return;
778
- if (!trs[0]?.offsetHeight)
779
- return;
780
- let h = 0;
781
- trs.forEach((tr, idx) => {
782
- let rh = 0;
783
- const tds = tr?.querySelectorAll('td');
784
- tds?.forEach((td) => {
785
- const wprev = td.style.width;
786
- this.renderer.setStyle(td, 'display', 'block');
787
- this.renderer.removeStyle(td, 'width');
788
- if (td.offsetHeight)
789
- rh = Math.max(rh, td.offsetHeight);
790
- this.renderer.removeStyle(td, 'display');
791
- this.renderer.setStyle(td, 'width', wprev);
792
- });
793
- if (rh) {
794
- h = idx === 0 ? rh : Math.min(h, rh);
795
- }
796
- });
797
- this.virtualScrollItemSize = h;
798
- }
799
- _setMinWidthOverall() {
800
- if (this.minWidthForBodyOnly || !this.minWidth || !this.primengTreeTable)
801
- return;
802
- const treeTableMain = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable');
803
- if (treeTableMain) {
804
- this.renderer.setStyle(treeTableMain, 'overflow', 'auto');
805
- const paginatorEl = treeTableMain.querySelector('.p-paginator');
806
- if (paginatorEl)
807
- this.renderer.setStyle(paginatorEl, 'min-width', this.minWidth);
808
- const loadingOverlay = treeTableMain.querySelector('.p-treetable-loading-overlay');
809
- if (loadingOverlay)
810
- this.renderer.setStyle(loadingOverlay, 'min-width', this.minWidth);
811
- }
812
- const scrollableWrapper = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable-scrollable-wrapper');
813
- if (scrollableWrapper)
814
- this.renderer.setStyle(scrollableWrapper, 'min-width', this.minWidth);
815
- if (!this.scrollable) {
816
- const tableWrapper = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable-wrapper');
817
- if (tableWrapper)
818
- this.renderer.setStyle(tableWrapper, 'min-width', this.minWidth);
819
- }
820
- const treeTableHeader = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable-header');
821
- if (treeTableHeader)
822
- this.renderer.setStyle(treeTableHeader, 'min-width', this.minWidth);
823
- }
824
- _onWindowResize() {
825
- // if (this.defScrollHeight === 'flex')
826
- // this.defScrollHeightPx = this.scrollableBody.clientHeight;
827
- clearTimeout(this._windowResizeDebouncer);
828
- this._windowResizeDebouncer = setTimeout(() => {
829
- this._recalcVirtualHeight();
830
- }, 100);
831
- }
832
- get styleClass() {
833
- const classesList = [];
834
- switch (this.size) {
835
- case 'small':
836
- classesList.push('p-treetable-sm');
837
- break;
838
- case 'large':
839
- classesList.push('p-treetable-lg');
840
- break;
841
- }
842
- if (this.hasToolbar) {
843
- switch (this.toolbarSize) {
844
- case 'small':
845
- classesList.push('cps-tbar-small');
846
- break;
847
- case 'normal':
848
- classesList.push('cps-tbar-normal');
849
- break;
850
- }
851
- }
852
- if (this.striped) {
853
- classesList.push('p-treetable-striped');
854
- }
855
- if (this.bordered) {
856
- classesList.push('p-treetable-gridlines');
857
- }
858
- return classesList.join(' ');
859
- }
860
- _recalcVirtualHeight() {
861
- if (!this._scrollbarVisible && this.virtualScroll)
862
- this.renderer.setStyle(this._scrollableBody, 'overflow', 'hidden', RendererStyleFlags2.Important);
863
- setTimeout(() => {
864
- if (this.virtualScroll && this.defScrollHeight) {
865
- this._updateVirtualScrollItemSize();
866
- const itemsLen = this.primengTreeTable.serializedValue?.length || 0;
867
- if (itemsLen < 1) {
868
- this.scrollHeight = this.emptyBodyHeight
869
- ? `calc(${this.emptyBodyHeight} + 1px)`
870
- : this.virtualScrollItemSize + 1 + 'px';
871
- }
872
- else {
873
- const curHeight = this.virtualScrollItemSize * itemsLen + 2;
874
- if (this.defScrollHeight === 'flex') {
875
- if (curHeight >= this._defScrollHeightPxInitial) {
876
- this.scrollHeight = 'flex';
877
- this.renderer.setStyle(this._scrollableBody, 'height', '100%');
878
- this.cdRef.markForCheck();
879
- return;
880
- }
881
- }
882
- this.scrollHeight =
883
- Math.min(this._defScrollHeightPx, curHeight) + 'px';
884
- }
885
- this.cdRef.markForCheck();
886
- }
887
- });
888
- }
889
- clearGlobalFilter() {
890
- this.globalFilterComp?.clear();
891
- }
892
- onSortFunction(event) {
893
- this.customSortFunction.emit(event);
894
- }
895
- onFilterGlobal(value) {
896
- this.primengTreeTable.filterGlobal(value, 'contains');
897
- }
898
- onClickAdditionalBtnOnSelect() {
899
- this.additionalBtnOnSelectClicked.emit(this.selectedRows);
900
- }
901
- onClickActionBtn() {
902
- this.actionBtnClicked.emit();
903
- }
904
- onReloadData() {
905
- if (this.dataReloadBtnDisabled)
906
- return;
907
- this.dataReloadBtnClicked.emit();
908
- }
909
- onColumnsToggle(event) {
910
- if (this.columnsToggleBtnDisabled)
911
- return;
912
- this.colToggleMenu?.toggle(event);
913
- }
914
- removeSelected() {
915
- this.rowsToRemove.emit(this.selectedRows);
916
- }
917
- clearSelection() {
918
- this.selectedRows = [];
919
- }
920
- onEditRowClicked(node) {
921
- this.editRowBtnClicked.emit(node);
922
- }
923
- onRemoveRowClicked(node) {
924
- this.rowsToRemove.emit([node]);
925
- }
926
- toggleAllColumns() {
927
- this.selectedColumns =
928
- this.selectedColumns.length < this.columns.length ? this.columns : [];
929
- this.columnsSelected.emit(this.selectedColumns);
930
- setTimeout(() => {
931
- this._calcAutoLayoutHeaderWidths(true);
932
- });
933
- }
934
- isColumnSelected(col) {
935
- return this.selectedColumns.some((item) => isEqual(item, col));
936
- }
937
- onRowsPerPageChanged() {
938
- if (this.resetPageOnRowsChange) {
939
- this.primengTreeTable.first = 0;
940
- }
941
- this.changePage(this.getPage());
942
- }
943
- getPageCount() {
944
- return Math.ceil(this.primengTreeTable.totalRecords / this.rows);
945
- }
946
- getPage() {
947
- return Math.floor(this.primengTreeTable.first / this.rows);
948
- }
949
- changePage(p) {
950
- const pc = Math.ceil(this.getPageCount());
951
- if (p >= 0 && p < pc) {
952
- this.first = this.rows * p;
953
- this.primengTreeTable.onPageChange({
954
- first: this.first,
955
- rows: this.rows
956
- });
957
- }
958
- }
959
- onPageChange(event) {
960
- this.first = event.first;
961
- this.rows = event.rows;
962
- const state = {
963
- page: this.getPage(),
964
- first: this.first,
965
- rows: this.rows,
966
- pageCount: Math.ceil(this.getPageCount())
967
- };
968
- this.pageChanged.emit(state);
969
- setTimeout(() => {
970
- this._calcAutoLayoutHeaderWidths(true);
971
- });
972
- }
973
- onLazyLoaded(event) {
974
- this.lazyLoaded.emit(event);
975
- }
976
- onNodeExpanded(event) {
977
- this.nodeExpanded.emit(event);
978
- setTimeout(() => {
979
- this._calcAutoLayoutHeaderWidths(true);
980
- });
981
- this._recalcVirtualHeight();
982
- }
983
- onNodeCollapsed(event) {
984
- this.nodeCollapsed.emit(event);
985
- setTimeout(() => {
986
- this._calcAutoLayoutHeaderWidths(true);
987
- });
988
- this._recalcVirtualHeight();
989
- }
990
- onNodeSelected(event) {
991
- this.nodeSelected.emit(event);
992
- }
993
- onNodeUnselected(event) {
994
- this.nodeUnselected.emit(event);
995
- }
996
- onSort(event) {
997
- this.sorted.emit(event);
998
- setTimeout(() => {
999
- this.cdRef.detectChanges();
1000
- this._calcAutoLayoutHeaderWidths(true);
1001
- });
1002
- }
1003
- onFilter(event) {
1004
- this.filtered.emit(event);
1005
- setTimeout(() => {
1006
- this._calcAutoLayoutHeaderWidths(true);
1007
- });
1008
- this._recalcVirtualHeight();
1009
- }
1010
- onSelectColumn(col) {
1011
- let res = [];
1012
- if (this.isColumnSelected(col)) {
1013
- res = this.selectedColumns.filter((v) => !isEqual(v, col));
1014
- }
1015
- else {
1016
- this.columns.forEach((o) => {
1017
- if (this.selectedColumns.some((v) => isEqual(v, o)) ||
1018
- isEqual(col, o)) {
1019
- res.push(o);
1020
- }
1021
- });
1022
- }
1023
- this.selectedColumns = res;
1024
- this.columnsSelected.emit(this.selectedColumns);
1025
- setTimeout(() => {
1026
- this._calcAutoLayoutHeaderWidths(true);
1027
- });
1028
- }
1029
- onSelectionChanged(selection) {
1030
- if (selection && !Array.isArray(selection))
1031
- selection = [selection];
1032
- this.rowsSelected.emit(selection);
1033
- }
1034
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: CpsTreeTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: DOCUMENT }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
1035
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.3", type: CpsTreeTableComponent, isStandalone: true, selector: "cps-tree-table", inputs: { columns: "columns", colHeaderName: "colHeaderName", colFieldName: "colFieldName", colFilterTypeName: "colFilterTypeName", colDateFormatName: "colDateFormatName", minWidth: "minWidth", minWidthForBodyOnly: "minWidthForBodyOnly", autoLayout: "autoLayout", striped: "striped", bordered: "bordered", size: "size", selectable: "selectable", rowHover: "rowHover", showRowMenu: "showRowMenu", showRowRemoveButton: "showRowRemoveButton", showRowEditButton: "showRowEditButton", rowMenuItems: "rowMenuItems", loading: "loading", tableStyle: "tableStyle", tableStyleClass: "tableStyleClass", sortable: "sortable", sortMode: "sortMode", customSort: "customSort", hasToolbar: "hasToolbar", toolbarSize: "toolbarSize", toolbarTitle: "toolbarTitle", toolbarIcon: "toolbarIcon", toolbarIconColor: "toolbarIconColor", scrollable: "scrollable", scrollHeight: "scrollHeight", virtualScroll: "virtualScroll", virtualScrollItemHeight: "virtualScrollItemHeight", numToleratedItems: "numToleratedItems", paginator: "paginator", alwaysShowPaginator: "alwaysShowPaginator", rowsPerPageOptions: "rowsPerPageOptions", first: "first", rows: "rows", resetPageOnRowsChange: "resetPageOnRowsChange", resetPageOnSort: "resetPageOnSort", totalRecords: "totalRecords", emptyMessage: "emptyMessage", emptyBodyHeight: "emptyBodyHeight", lazy: "lazy", lazyLoadOnInit: "lazyLoadOnInit", showGlobalFilter: "showGlobalFilter", globalFilterPlaceholder: "globalFilterPlaceholder", globalFilterFields: "globalFilterFields", clearGlobalFilterOnLoading: "clearGlobalFilterOnLoading", showRemoveBtnOnSelect: "showRemoveBtnOnSelect", removeBtnOnSelectDisabled: "removeBtnOnSelectDisabled", showAdditionalBtnOnSelect: "showAdditionalBtnOnSelect", additionalBtnOnSelectTitle: "additionalBtnOnSelectTitle", additionalBtnOnSelectIcon: "additionalBtnOnSelectIcon", additionalBtnOnSelectDisabled: "additionalBtnOnSelectDisabled", showActionBtn: "showActionBtn", actionBtnTitle: "actionBtnTitle", actionBtnIcon: "actionBtnIcon", actionBtnDisabled: "actionBtnDisabled", showDataReloadBtn: "showDataReloadBtn", dataReloadBtnDisabled: "dataReloadBtnDisabled", showColumnsToggleBtn: "showColumnsToggleBtn", columnsToggleBtnDisabled: "columnsToggleBtnDisabled", initialColumns: "initialColumns", filterableByColumns: "filterableByColumns", autoColumnFilterType: "autoColumnFilterType", renderDataAsHTML: "renderDataAsHTML", data: "data", resizableColumns: "resizableColumns", columnResizeMode: "columnResizeMode" }, outputs: { rowsSelected: "rowsSelected", actionBtnClicked: "actionBtnClicked", additionalBtnOnSelectClicked: "additionalBtnOnSelectClicked", editRowBtnClicked: "editRowBtnClicked", rowsToRemove: "rowsToRemove", pageChanged: "pageChanged", sorted: "sorted", filtered: "filtered", columnsSelected: "columnsSelected", lazyLoaded: "lazyLoaded", dataReloadBtnClicked: "dataReloadBtnClicked", nodeExpanded: "nodeExpanded", nodeCollapsed: "nodeCollapsed", nodeSelected: "nodeSelected", nodeUnselected: "nodeUnselected", customSortFunction: "customSortFunction" }, providers: [
1036
- TreeTableService,
1037
- {
1038
- provide: TreeTable,
1039
- useFactory: treeTableFactory,
1040
- // eslint-disable-next-line no-use-before-define
1041
- deps: [CpsTreeTableComponent]
1042
- }
1043
- ], queries: [{ propertyName: "toolbarTemplate", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: ["header"], descendants: true }, { propertyName: "nestedHeaderTemplate", first: true, predicate: ["nestedHeader"], descendants: true }, { propertyName: "bodyTemplate", first: true, predicate: ["body"], descendants: true }, { propertyName: "colgroupTemplate", first: true, predicate: ["colgroup"], descendants: true }], viewQueries: [{ propertyName: "primengTreeTable", first: true, predicate: ["primengTreeTable"], descendants: true, static: true }, { propertyName: "globalFilterComp", first: true, predicate: ["globalFilterComp"], descendants: true }, { propertyName: "colToggleMenu", first: true, predicate: ["colToggleMenu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<p-treeTable\n #primengTreeTable\n ttWithUnsort\n [ngClass]=\"{\n 'cps-treetable-loading': loading,\n 'cps-treetable-flex': defScrollHeight === 'flex',\n 'cps-treetable-nonvirtual': !virtualScroll,\n 'cps-treetable-autolayout-calced': autoLayout && scrollable\n }\"\n [value]=\"data\"\n [autoLayout]=\"autoLayout && !scrollable\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [virtualScroll]=\"virtualScroll\"\n [virtualScrollItemSize]=\"virtualScrollItemSize\"\n [virtualScrollOptions]=\"{\n numToleratedItems: numToleratedItems,\n autoSize: false\n }\"\n [columns]=\"selectedColumns\"\n [loading]=\"loading\"\n [rowHover]=\"rowHover\"\n [lazy]=\"lazy\"\n [(selection)]=\"selectedRows\"\n (selectionChange)=\"onSelectionChanged($event)\"\n compareSelectionBy=\"deepEquals\"\n [lazyLoadOnInit]=\"lazyLoadOnInit\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [tableStyleClass]=\"tableStyleClass\"\n [customSort]=\"customSort\"\n [sortMode]=\"sortMode\"\n [globalFilterFields]=\"globalFilterFields\"\n [paginator]=\"paginator\"\n [showCurrentPageReport]=\"true\"\n [alwaysShowPaginator]=\"alwaysShowPaginator\"\n [rows]=\"rows\"\n [first]=\"first\"\n [totalRecords]=\"totalRecords\"\n [resetPageOnSort]=\"resetPageOnSort\"\n [resizableColumns]=\"resizableColumns\"\n [columnResizeMode]=\"columnResizeMode\"\n currentPageReportTemplate=\"{first} - {last} of {totalRecords}\"\n (onPage)=\"onPageChange($event)\"\n (onSort)=\"onSort($event)\"\n (onFilter)=\"onFilter($event)\"\n (onLazyLoad)=\"onLazyLoaded($event)\"\n (sortFunction)=\"onSortFunction($event)\"\n (onNodeExpand)=\"onNodeExpanded($event)\"\n (onNodeCollapse)=\"onNodeCollapsed($event)\"\n (onNodeSelect)=\"onNodeSelected($event)\"\n (onNodeUnselect)=\"onNodeUnselected($event)\">\n @if (colgroupTemplate) {\n <ng-template pTemplate=\"colgroup\">\n <ng-container *ngTemplateOutlet=\"colgroupTemplate\"></ng-container>\n </ng-template>\n }\n <ng-template pTemplate=\"caption\" *ngIf=\"hasToolbar\">\n <ng-container *ngIf=\"toolbarTemplate\">\n <ng-container *ngTemplateOutlet=\"toolbarTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!toolbarTemplate\">\n <div class=\"cps-treetable-tbar-left\">\n <div *ngIf=\"toolbarIcon\" class=\"cps-treetable-tbar-icon\">\n <cps-icon [icon]=\"toolbarIcon\" [color]=\"toolbarIconColor\"></cps-icon>\n </div>\n <div class=\"cps-treetable-tbar-title\">{{ toolbarTitle }}</div>\n <div *ngIf=\"showGlobalFilter\" class=\"cps-treetable-tbar-global-filter\">\n <cps-input\n #globalFilterComp\n prefixIcon=\"search\"\n [placeholder]=\"globalFilterPlaceholder\"\n (valueChanged)=\"onFilterGlobal($event)\"\n [clearable]=\"true\"\n [disabled]=\"loading\"\n [appearance]=\"toolbarSize === 'small' ? 'underlined' : 'outlined'\"\n [hideDetails]=\"true\">\n </cps-input>\n </div>\n </div>\n <div class=\"cps-treetable-tbar-right\">\n <div\n *ngIf=\"showRemoveBtnOnSelect && selectedRows.length > 0\"\n class=\"cps-treetable-tbar-btn-on-select\">\n <cps-button\n label=\"Remove\"\n [disabled]=\"removeBtnOnSelectDisabled\"\n color=\"prepared\"\n type=\"borderless\"\n icon=\"remove\"\n [size]=\"toolbarSize\"\n (clicked)=\"removeSelected()\">\n </cps-button>\n </div>\n <div\n *ngIf=\"showAdditionalBtnOnSelect && selectedRows.length > 0\"\n class=\"cps-treetable-tbar-btn-on-select\">\n <cps-button\n [label]=\"additionalBtnOnSelectTitle\"\n [disabled]=\"additionalBtnOnSelectDisabled\"\n color=\"prepared\"\n type=\"borderless\"\n [icon]=\"additionalBtnOnSelectIcon\"\n [size]=\"toolbarSize\"\n (clicked)=\"onClickAdditionalBtnOnSelect()\">\n </cps-button>\n </div>\n <div *ngIf=\"showActionBtn\" class=\"cps-treetable-tbar-action-btn\">\n <cps-button\n [label]=\"actionBtnTitle\"\n [disabled]=\"actionBtnDisabled\"\n color=\"prepared\"\n type=\"outlined\"\n [icon]=\"actionBtnIcon\"\n [size]=\"toolbarSize\"\n (clicked)=\"onClickActionBtn()\">\n </cps-button>\n </div>\n <div\n *ngIf=\"showColumnsToggleBtn && columns.length > 0\"\n class=\"cps-treetable-tbar-coltoggle-btn\"\n [ngClass]=\"{ 'btn-disabled': columnsToggleBtnDisabled }\">\n <cps-icon\n icon=\"columns\"\n size=\"normal\"\n [color]=\"\n columnsToggleBtnDisabled ? 'text-lightest' : 'prepared-lighten1'\n \"\n (click)=\"onColumnsToggle($event)\"></cps-icon>\n <cps-menu #colToggleMenu [withArrow]=\"false\">\n <div class=\"cps-treetable-coltoggle-menu\">\n <div\n class=\"cps-treetable-coltoggle-menu-item select-all-option\"\n [class.allselected]=\"selectedColumns.length === columns.length\"\n (click)=\"toggleAllColumns()\">\n <span class=\"cps-treetable-coltoggle-menu-item-left\">\n <span class=\"cps-treetable-coltoggle-menu-item-check\"> </span>\n <span class=\"cps-treetable-coltoggle-menu-item-label\"\n >Show all columns</span\n >\n </span>\n </div>\n <div\n *ngFor=\"let col of columns\"\n class=\"cps-treetable-coltoggle-menu-item\"\n (click)=\"onSelectColumn(col)\"\n [class.selected]=\"isColumnSelected(col)\">\n <span class=\"cps-treetable-coltoggle-menu-item-left\">\n <span class=\"cps-treetable-coltoggle-menu-item-check\"></span>\n <span class=\"cps-treetable-coltoggle-menu-item-label\">{{\n col[colHeaderName]\n }}</span>\n </span>\n </div>\n </div>\n </cps-menu>\n </div>\n <div\n *ngIf=\"showDataReloadBtn\"\n class=\"cps-treetable-tbar-reload-btn\"\n [ngClass]=\"{ 'btn-disabled': dataReloadBtnDisabled }\">\n <cps-icon\n icon=\"refresh\"\n size=\"18\"\n [color]=\"dataReloadBtnDisabled ? 'text-light' : 'prepared-lighten1'\"\n (click)=\"onReloadData()\">\n </cps-icon>\n </div>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\" *ngIf=\"nestedHeaderTemplate\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"\n nestedHeaderTemplate;\n context: {\n $implicit: columns\n }\n \"></ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\" *ngIf=\"!nestedHeaderTemplate\" let-columns>\n <tr>\n <!-- <th style=\"width: 3rem\" *ngIf=\"reorderableRows\"></th> -->\n <th\n *ngIf=\"selectable\"\n cpsTTHdrSelectable\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\"></th>\n <ng-container *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n headerTemplate;\n context: {\n $implicit: columns\n }\n \"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!headerTemplate && columns.length > 0\">\n <ng-container *ngIf=\"sortable\">\n @if (filterableByColumns) {\n <th\n *ngFor=\"let col of columns\"\n [cpsTTColSortable]=\"col[colFieldName]\"\n [cpsTTColFilter]=\"col[colFieldName]\"\n [filterType]=\"\n col[colFilterTypeName] ??\n (autoColumnFilterType\n ? (data | cpsTTDetectFilterType: col[colFieldName])\n : 'text')\n \"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\">\n {{ col[colHeaderName] }}\n </th>\n } @else {\n <th\n *ngFor=\"let col of columns\"\n [cpsTTColSortable]=\"col[colFieldName]\"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\">\n {{ col[colHeaderName] }}\n </th>\n }\n </ng-container>\n <ng-container *ngIf=\"!sortable\">\n @if (filterableByColumns) {\n <th\n *ngFor=\"let col of columns\"\n [cpsTTColFilter]=\"col[colFieldName]\"\n [filterType]=\"\n col[colFilterTypeName] ??\n (autoColumnFilterType\n ? (data | cpsTTDetectFilterType: col[colFieldName])\n : 'text')\n \"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\">\n {{ col[colHeaderName] }}\n </th>\n } @else {\n <th\n *ngFor=\"let col of columns\"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\">\n {{ col[colHeaderName] }}\n </th>\n }\n </ng-container>\n </ng-container>\n <th\n class=\"cps-treetable-row-menu-cell\"\n *ngIf=\"showRowMenu && (showRowRemoveButton || showRowEditButton)\"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\"></th>\n </tr>\n </ng-template>\n\n <ng-template\n pTemplate=\"body\"\n let-rowData=\"rowData\"\n let-columns=\"columns\"\n let-rowNode\n let-rowIndex=\"rowIndex\">\n <tr\n [ttRow]=\"rowNode\"\n [ngClass]=\"{\n 'cps-treetable-row-selected':\n selectable && primengTreeTable.isSelected(rowNode.node)\n }\">\n <!-- <td *ngIf=\"reorderableRows\" class=\"cps-table-row-drag-handle-cell\">\n <span class=\"cps-table-row-drag-handle\" pReorderableRowHandle>\u2630</span>\n </td> -->\n <td [cpsTTRowSelectable]=\"rowNode\" *ngIf=\"selectable\"></td>\n <ng-container *ngIf=\"bodyTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n bodyTemplate;\n context: {\n $implicit: rowNode,\n rowIndex: rowIndex,\n columns: columns,\n rowData: rowData\n }\n \">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!bodyTemplate\">\n <ng-container *ngIf=\"columns.length > 0\">\n @if (renderDataAsHTML) {\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <td\n *ngIf=\"i === 0\"\n [cpsTTRowToggler]=\"rowNode\"\n [innerHTML]=\"rowData[col[colFieldName]]\"></td>\n <td *ngIf=\"i > 0\" [innerHTML]=\"rowData[col[colFieldName]]\"></td>\n </ng-container>\n } @else {\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <td *ngIf=\"i === 0\" [cpsTTRowToggler]=\"rowNode\">\n {{\n col[colDateFormatName]\n ? (rowData[col[colFieldName]]\n | date: col[colDateFormatName])\n : rowData[col[colFieldName]]\n }}\n </td>\n <td *ngIf=\"i > 0\">\n {{\n col[colDateFormatName]\n ? (rowData[col[colFieldName]]\n | date: col[colDateFormatName])\n : rowData[col[colFieldName]]\n }}\n </td>\n </ng-container>\n }\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"showRowMenu && (showRowRemoveButton || showRowEditButton)\"\n class=\"cps-treetable-row-menu-cell\">\n <table-row-menu\n (editRowBtnClicked)=\"onEditRowClicked(rowNode.node)\"\n (removeRowBtnClicked)=\"onRemoveRowClicked(rowNode.node)\"\n [showRowRemoveButton]=\"showRowRemoveButton\"\n [showRowEditButton]=\"showRowEditButton\"\n [customItems]=\"rowMenuItems\">\n </table-row-menu>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td\n colspan=\"100\"\n class=\"cps-treetable-empty-message-td\"\n [ngStyle]=\"{ height: emptyBodyHeight }\">\n {{ emptyMessage }}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <cps-loader [fullScreen]=\"false\" opacity=\"0\"></cps-loader>\n </ng-template>\n <ng-template pTemplate=\"paginatorleft\">\n <div class=\"cps-table-paginator-itms-per-page\">\n <span class=\"cps-table-paginator-items-per-page-title\"\n >Rows per page:\n </span>\n <cps-select\n [options]=\"rowOptions\"\n [hideDetails]=\"true\"\n [(ngModel)]=\"rows\"\n (valueChanged)=\"onRowsPerPageChanged()\"\n [returnObject]=\"false\"\n optionsClass=\"cps-paginator-page-options\">\n </cps-select>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"paginatorfirstpagelinkicon\">\n <AngleDoubleLeftIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatorpreviouspagelinkicon\">\n <AngleLeftIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatornextpagelinkicon\">\n <AngleRightIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatorlastpagelinkicon\">\n <AngleDoubleRightIcon />\n </ng-template>\n</p-treeTable>\n", styles: [":host ::ng-deep .p-treetable{position:relative}:host ::ng-deep .p-component,:host ::ng-deep .p-component *{box-sizing:border-box}:host ::ng-deep .p-component{font-family:Source Sans Pro,sans-serif;font-size:14px;font-weight:400}:host ::ng-deep .p-treetable-scrollable-wrapper{position:relative;background:#fff}:host ::ng-deep .p-treetable-wrapper{background:#fff}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable.cps-tbar-normal .p-treetable-scrollable-wrapper{height:calc(100% - 72px)}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable.cps-tbar-small .p-treetable-scrollable-wrapper{height:calc(100% - 43px)}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable .p-treetable-scrollable-wrapper .p-treetable-scrollable-view .p-treetable-scrollable-header{display:contents}:host ::ng-deep .p-treetable .p-treetable-scrollable-header,:host ::ng-deep .p-treetable .p-treetable-scrollable-footer{background:#fff}:host ::ng-deep .p-treetable-scrollable-header,:host ::ng-deep .p-treetable-scrollable-footer{overflow:hidden}:host ::ng-deep .p-treetable table{border-collapse:collapse;width:100%;table-layout:fixed}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th{text-align:left;padding:1rem;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 1px;font-weight:400;color:var(--cps-color-text-mild);background:#fff;transition:box-shadow .2s;overflow:hidden}:host ::ng-deep .p-treetable-scrollable-body{overflow:auto!important;position:relative}:host ::ng-deep .cps-treetable-flex .p-treetable-scrollable-body{height:100%}:host ::ng-deep .p-treetable .p-treetable-tbody{background:#fff}:host ::ng-deep .p-treetable .p-treetable-tbody>tr{background:#fff;color:var(--cps-color-text-dark);transition:box-shadow .2s}:host ::ng-deep .p-treetable .p-treetable-tbody>tr.cps-treetable-row-selected{background-color:var(--cps-color-highlight-active)!important}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td{text-align:left;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;padding:1rem}:host ::ng-deep p-treetable:not(.cps-treetable-autolayout-calced) .p-treetable .p-treetable-tbody>tr>td{overflow:hidden}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable .p-treetable-scrollable-body .p-treetable-tbody>tr>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){opacity:0;border-left-color:#fff}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable.p-treetable-striped .p-treetable-scrollable-body .p-treetable-tbody>tr:nth-child(odd)>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){border-left-color:var(--cps-color-bg-light)}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable .p-treetable-scrollable-body .p-treetable-tbody>tr:hover>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){border-left-color:var(--cps-color-highlight-hover)}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:first-child{border-width:0 0 1px 1px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:last-child{border-width:0 1px 1px 0}:host ::ng-deep .p-treetable-auto-layout table{table-layout:auto}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler{width:1rem;height:1rem;color:var(--cps-color-text-dark);border:0 none;background:transparent;border-radius:50%;margin-right:.5rem}:host ::ng-deep .p-treetable-toggler{cursor:pointer;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;overflow:hidden;position:relative}:host ::ng-deep .p-ripple{overflow:hidden;position:relative}:host ::ng-deep .p-link:focus{outline:0 none;outline-offset:0;box-shadow:unset}:host ::ng-deep .p-link{text-align:left;background-color:transparent;margin:0;padding:0;border:none;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:14px;font-family:Source Sans Pro,sans-serif;border-radius:6px}:host ::ng-deep input[type=button],:host ::ng-deep input[type=submit],:host ::ng-deep input[type=reset],:host ::ng-deep input[type=file]::-webkit-file-upload-button,:host ::ng-deep button{border-radius:0}:host ::ng-deep .p-treetable .p-treetable-tbody>tr:focus{outline:0 none;outline-offset:-.15rem}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:enabled:hover{color:var(--cps-color-calm);border-color:transparent;background:unset}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:focus{outline:0 none;outline-offset:0;box-shadow:unset}:host ::ng-deep .p-treetable .p-paginator{border-width:0 1px 1px 1px;border-radius:0}:host ::ng-deep .p-paginator{background:#fff;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;color:var(--cps-color-text-dark);padding:1rem;border:1px solid var(--cps-color-line-mid)}:host ::ng-deep .p-paginator-left-content{margin-right:auto}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page{display:inline-flex;align-items:center}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-table-paginator-items-per-page-title{font-family:Source Sans Pro,sans-serif;font-size:14px;margin-right:12px;cursor:default}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box{min-height:32px!important;background:transparent!important}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box .cps-select-box-items{font-size:14px!important}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box .cps-select-box-chevron .cps-icon{width:14px;height:14px}:host ::ng-deep .p-paginator .p-paginator-current{background-color:transparent;border:0 none;color:var(--cps-color-text-dark);min-width:3rem;margin:.143rem;padding:0 .5rem;font-family:Source Sans Pro,sans-serif;font-size:14px;height:unset}:host ::ng-deep .p-paginator-page,:host ::ng-deep .p-paginator-next,:host ::ng-deep .p-paginator-last,:host ::ng-deep .p-paginator-first,:host ::ng-deep .p-paginator-prev,:host ::ng-deep .p-paginator-current{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1;-webkit-user-select:none;user-select:none;overflow:hidden;position:relative}:host ::ng-deep .p-paginator-current{cursor:default}:host ::ng-deep .p-paginator .p-paginator-first:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-prev:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-next:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-last:not(.p-disabled):not(.p-highlight):hover{background:var(--cps-color-highlight-hover);border-color:unset}:host ::ng-deep .p-paginator .p-paginator-first:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-prev:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-next:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-last:not(.p-disabled):not(.p-highlight):active{background:var(--cps-color-highlight-active)}:host ::ng-deep .p-paginator .p-paginator-first,:host ::ng-deep .p-paginator .p-paginator-prev,:host ::ng-deep .p-paginator .p-paginator-next,:host ::ng-deep .p-paginator .p-paginator-last{background-color:transparent;border:1px solid var(--cps-color-text-dark);border-radius:4px;color:var(--cps-color-text-dark);min-width:32px;height:32px;margin:.143rem;transition:box-shadow .2s}:host ::ng-deep .p-disabled,:host ::ng-deep .p-disabled *{cursor:default!important;pointer-events:none}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page.p-highlight{background:var(--cps-color-calm);border-color:var(--cps-color-calm);color:#fff}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page:not(.p-highlight):hover{background:var(--cps-color-highlight-hover);border-color:unset}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page:not(.p-highlight):active{background:var(--cps-color-highlight-active)}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page{background-color:transparent;border:1px solid var(--cps-color-text-dark);border-radius:4px;color:var(--cps-color-text-dark);min-width:32px;height:32px;margin:.143rem;transition:box-shadow .2s}:host ::ng-deep .p-paginator-element:focus{z-index:1;position:relative}:host ::ng-deep span.p-paginator-icon{display:contents}:host ::ng-deep .p-disabled,:host ::ng-deep .p-component:disabled{opacity:.4}:host ::ng-deep .cps-treetable-empty-message-td{text-align:center!important;font-weight:600;background:#fff}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-header{border-width:1px 1px 0 1px}:host ::ng-deep .p-treetable .p-treetable-header{font-weight:600;display:flex;justify-content:space-between;align-items:center;padding:0 10px;border:unset;background:unset;border-top:1px solid var(--cps-color-line-mid);border-right:1px solid var(--cps-color-line-mid);border-left:4px solid var(--cps-color-surprise)!important;border-radius:4px 4px 0 0;font-size:16px;line-height:150%;background-color:#fff;color:var(--cps-color-text-darkest);overflow:auto}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left{display:flex;align-items:center}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-global-filter{margin-left:12px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-icon{display:flex;margin-right:8px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-title{cursor:default}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right{display:flex;align-items:center}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-btn-on-select{margin-right:4px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-action-btn{margin-right:4px;margin-left:8px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn{display:contents}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn cps-icon{margin-left:12px;margin-right:4px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn:not(.btn-disabled) cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn:not(.btn-disabled) cps-icon{cursor:pointer}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn:not(.btn-disabled) cps-icon:hover .cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn:not(.btn-disabled) cps-icon:hover .cps-icon{color:var(--cps-color-prepared)!important}:host ::ng-deep .cps-tbar-small.p-treetable .p-treetable-header{height:43px}:host ::ng-deep .cps-tbar-normal.p-treetable .p-treetable-header{height:72px}:host ::ng-deep .p-treetable .p-treetable-footer{background:#fff;color:#343a40;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;padding:1rem;font-weight:700}:host ::ng-deep .p-treetable .p-treetable-tfoot>tr>td{text-align:left;padding:1rem;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;font-weight:700;color:#343a40;background:#fff}:host ::ng-deep .p-treetable .p-sortable-column:not(.p-highlight):hover .cps-sortable-column-icon.sort-unsorted .sort-unsorted-arrow-up{border-bottom-color:var(--cps-color-text-mild)}:host ::ng-deep .p-treetable .p-sortable-column:not(.p-highlight):hover .cps-sortable-column-icon.sort-unsorted .sort-unsorted-arrow-down{border-top-color:var(--cps-color-text-mild)}:host ::ng-deep .p-icon-wrapper{display:inline-flex}:host ::ng-deep .p-icon{display:inline-block;width:1rem;height:1rem}:host ::ng-deep .p-treetable .p-sortable-column .cps-sortable-column-badge{display:inline-flex;align-items:center;justify-content:center;font-size:12px;vertical-align:top;color:var(--cps-color-calm);margin-left:.25rem}:host ::ng-deep .p-link{text-align:left;background-color:transparent;margin:0;padding:0;border:none;cursor:pointer;-webkit-user-select:none;user-select:none}:host ::ng-deep .p-treetable .p-sortable-column{cursor:pointer;-webkit-user-select:none;user-select:none}:host ::ng-deep .p-treetable .p-sortable-column:focus{box-shadow:none;outline:0 none}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler.p-icon{width:2rem;height:2rem}:host ::ng-deep .p-treetable .p-treetable-tbody>tr.p-highlight{background:#eff6ff;color:#1d4ed8}:host ::ng-deep .p-treetable.p-treetable-hoverable-rows .p-treetable-tbody>tr:not(.p-highlight):hover{background:var(--cps-color-highlight-hover)}:host ::ng-deep .p-treetable-hoverable-rows .p-treetable-tbody>tr{cursor:auto}:host ::ng-deep .p-treetable .p-column-resizer-helper{background:var(--cps-color-calm)}:host ::ng-deep .p-treetable .p-treetable-loading-overlay{position:absolute;display:flex;align-items:center;justify-content:center;z-index:1001;top:0;left:0;width:100%;height:100%;background-color:#fff;transition-duration:.2s;border:1px solid var(--cps-color-line-mid)}:host ::ng-deep .p-treetable.cps-tbar-small .p-treetable-loading-overlay{top:43px;height:calc(100% - 43px)}:host ::ng-deep .p-treetable.cps-tbar-normal .p-treetable-loading-overlay{top:72px;height:calc(100% - 72px)}:host ::ng-deep .cps-treetable-loading .p-treetable{min-height:200px}:host ::ng-deep .cps-treetable-loading .p-treetable.cps-tbar-normal{min-height:272px}:host ::ng-deep .cps-treetable-loading .p-treetable.cps-tbar-small{min-height:243px}:host ::ng-deep .cps-table-col-filter-menu-open .cps-table-col-filter-menu-button{color:var(--cps-color-text-dark)}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-footer{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-top{border-width:0 1px 0 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-bottom{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th{border-width:1px 0 1px 1px}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th:last-child{border-width:1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tbody>tr>td{border-width:0 0 1px 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tfoot>tr>td{border-width:1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tbody>tr>td:last-child{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:only-child{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-thead>tr>th{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-tbody>tr>td{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-tfoot>tr>td{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-footer{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-thead>tr>th{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-tbody>tr>td{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-tfoot>tr>td{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-footer{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-striped .p-treetable-tbody>tr:nth-child(odd){background:var(--cps-color-bg-light)}:host ::ng-deep .p-treetable.p-treetable-striped .p-treetable-tbody>tr:nth-child(2n){background:#fff}:host ::ng-deep .cps-treetable-row-menu-cell{width:55px;border-left:none!important}:host ::ng-deep .cps-treetable-selectable-cell{width:55px;text-align:center!important}:host ::ng-deep .p-checkbox{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none;vertical-align:bottom;position:relative;width:18px;height:18px}:host ::ng-deep .p-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}:host ::ng-deep .p-hidden-accessible input,:host ::ng-deep .p-hidden-accessible select{transform:scale(0)}:host ::ng-deep .p-checkbox .p-checkbox-box{background:#fff;width:18px;height:18px;color:var(--cps-color-text-dark);border:2px solid var(--cps-color-text-mild);border-radius:2px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}:host ::ng-deep .p-checkbox-box{display:flex;justify-content:center;align-items:center}:host ::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:var(--cps-color-calm);background:var(--cps-color-calm)}:host ::ng-deep .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box.p-highlight:hover{border-color:var(--cps-color-calm);background:var(--cps-color-calm);color:#fff}:host ::ng-deep .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box:hover{border-color:var(--cps-color-calm)}:host ::ng-deep .p-checkbox .p-checkbox-box .p-icon{width:14px;height:14px}:host ::ng-deep .p-checkbox .p-checkbox-box .p-checkbox-icon{transition-duration:.2s;color:#fff;font-size:14px}:host ::ng-deep .p-checkbox .p-checkbox-box minusicon .p-checkbox-icon{color:var(--cps-color-calm);width:12px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td p-treetablecheckbox .p-checkbox{margin-right:0}::ng-deep .p-scrollbar-measure{width:100px;height:100px;overflow:scroll;position:absolute;top:-9999px}.cps-treetable-coltoggle-menu{display:block;max-height:242px;overflow-x:hidden;background:#fff}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item{padding:12px;justify-content:space-between;display:flex;cursor:pointer}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item:hover{background:var(--cps-color-highlight-hover)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-label{color:var(--cps-color-text-dark)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-left{display:flex;align-items:center;margin-right:8px}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-check{background-color:transparent;border:0;width:16px;height:16px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1);margin-right:8px;opacity:0}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-check:after{color:var(--cps-color-calm);top:4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box;position:absolute;content:\"\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected{font-weight:600}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected .cps-treetable-coltoggle-menu-item-label,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected .cps-treetable-coltoggle-menu-item-label{color:var(--cps-color-calm)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected .cps-treetable-coltoggle-menu-item-check,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected .cps-treetable-coltoggle-menu-item-check{opacity:1}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected{background:var(--cps-color-highlight-selected)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.highlighten{background:var(--cps-color-highlight-active)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected.highlighten{background:var(--cps-color-highlight-selected-dark)}.cps-treetable-coltoggle-menu .select-all-option{border-bottom:1px solid lightgrey;font-weight:600}::ng-deep .cps-select-options-menu.cps-paginator-page-options .cps-select-options-option{font-size:14px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: TreeTableModule }, { kind: "component", type: i3.TreeTable, selector: "p-treeTable", inputs: ["columns", "style", "styleClass", "tableStyle", "tableStyleClass", "autoLayout", "lazy", "lazyLoadOnInit", "paginator", "rows", "first", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "customSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "compareSelectionBy", "rowHover", "loading", "loadingIcon", "showLoader", "scrollable", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "frozenColumns", "resizableColumns", "columnResizeMode", "reorderableColumns", "contextMenu", "rowTrackBy", "filters", "globalFilterFields", "filterDelay", "filterMode", "filterLocale", "paginatorLocale", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "value", "virtualRowHeight", "selectionKeys"], outputs: ["selectionChange", "contextMenuSelectionChange", "onFilter", "onNodeExpand", "onNodeCollapse", "onPage", "onSort", "onLazyLoad", "sortFunction", "onColResize", "onColReorder", "onNodeSelect", "onNodeUnselect", "onContextMenuSelect", "onHeaderCheckboxToggle", "onEditInit", "onEditComplete", "onEditCancel", "selectionKeysChange"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.TTRow, selector: "[ttRow]", inputs: ["ttRow"] }, { kind: "component", type: CpsInputComponent, selector: "cps-input", inputs: ["label", "hint", "placeholder", "disabled", "readonly", "width", "type", "loading", "clearable", "prefixIcon", "prefixIconClickable", "prefixIconSize", "prefixText", "hideDetails", "persistentClear", "error", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "appearance", "valueToDisplay", "value"], outputs: ["valueChanged", "focused", "prefixIconClicked", "blurred", "cleared", "enterClicked"] }, { kind: "component", type: CpsButtonComponent, selector: "cps-button", inputs: ["color", "contentColor", "borderRadius", "type", "label", "icon", "iconPosition", "size", "width", "height", "disabled", "loading"], outputs: ["clicked"] }, { kind: "component", type: CpsMenuComponent, selector: "cps-menu", inputs: ["header", "items", "withArrow", "compressed", "focusOnShow", "persistent", "containerClass", "showTransitionOptions", "hideTransitionOptions"], outputs: ["menuShown", "menuHidden", "beforeMenuHidden", "contentClicked"] }, { kind: "component", type: CpsIconComponent, selector: "cps-icon", inputs: ["icon", "size", "color"] }, { kind: "component", type: CpsSelectComponent, selector: "cps-select", inputs: ["label", "placeholder", "hint", "returnObject", "multiple", "disabled", "width", "selectAll", "chips", "closableChips", "clearable", "openOnClear", "options", "keepInitialOrder", "optionLabel", "optionValue", "optionInfo", "optionIcon", "optionIconColor", "hideDetails", "persistentClear", "prefixIcon", "prefixIconSize", "loading", "virtualScroll", "numToleratedItems", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "optionsClass", "appearance", "showChevron", "value"], outputs: ["valueChanged", "focused", "blurred"] }, { kind: "component", type: CpsLoaderComponent, selector: "cps-loader", inputs: ["fullScreen", "opacity", "labelColor", "showLabel"] }, { kind: "component", type: AngleDoubleLeftIcon, selector: "AngleDoubleLeftIcon" }, { kind: "component", type: AngleLeftIcon, selector: "AngleLeftIcon" }, { kind: "component", type: AngleRightIcon, selector: "AngleRightIcon" }, { kind: "component", type: AngleDoubleRightIcon, selector: "AngleDoubleRightIcon" }, { kind: "directive", type: CpsTreeTableColumnSortableDirective, selector: "[cpsTTColSortable]", inputs: ["cpsTTColSortable"] }, { kind: "directive", type: CpsTreeTableColumnFilterDirective, selector: "[cpsTTColFilter]", inputs: ["cpsTTColFilter", "filterType", "filterPersistent", "filterShowClearButton", "filterShowApplyButton", "filterShowCloseButton", "filterShowMatchModes", "filterMatchModes", "filterShowOperator", "filterHeaderTitle", "filterHideOnClear", "filterCategoryOptions", "filterAsButtonToggle", "filterSingleSelection", "filterPlaceholder"], exportAs: ["cpsTTColFilter"] }, { kind: "directive", type: CpsTreeTableHeaderSelectableDirective, selector: "[cpsTTHdrSelectable]" }, { kind: "directive", type: CpsTreeTableRowSelectableDirective, selector: "[cpsTTRowSelectable]", inputs: ["cpsTTRowSelectable"] }, { kind: "directive", type: CpsTreetableRowTogglerDirective, selector: "[cpsTTRowToggler]", inputs: ["cpsTTRowToggler"] }, { kind: "directive", type: CpsTreeTableColumnResizableDirective, selector: "[cpsTTColResizable]", inputs: ["cpsTTColResizableDisabled"] }, { kind: "directive", type: TreeTableUnsortDirective, selector: "[ttWithUnsort]" }, { kind: "component", type: TableRowMenuComponent, selector: "table-row-menu", inputs: ["showRowRemoveButton", "customItems", "showRowEditButton"], outputs: ["editRowBtnClicked", "removeRowBtnClicked"] }, { kind: "pipe", type: CpsTreeTableDetectFilterTypePipe, name: "cpsTTDetectFilterType" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1044
- }
1045
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: CpsTreeTableComponent, decorators: [{
1046
- type: Component,
1047
- args: [{ selector: 'cps-tree-table', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
1048
- FormsModule,
1049
- CommonModule,
1050
- TreeTableModule,
1051
- CpsInputComponent,
1052
- CpsButtonComponent,
1053
- CpsMenuComponent,
1054
- CpsIconComponent,
1055
- CpsSelectComponent,
1056
- CpsLoaderComponent,
1057
- AngleDoubleLeftIcon,
1058
- AngleLeftIcon,
1059
- AngleRightIcon,
1060
- AngleDoubleRightIcon,
1061
- CpsTreeTableColumnSortableDirective,
1062
- CpsTreeTableColumnFilterDirective,
1063
- CpsTreeTableHeaderSelectableDirective,
1064
- CpsTreeTableRowSelectableDirective,
1065
- CpsTreetableRowTogglerDirective,
1066
- CpsTreeTableColumnResizableDirective,
1067
- TreeTableUnsortDirective,
1068
- TableRowMenuComponent,
1069
- CpsTreeTableDetectFilterTypePipe
1070
- ], providers: [
1071
- TreeTableService,
1072
- {
1073
- provide: TreeTable,
1074
- useFactory: treeTableFactory,
1075
- // eslint-disable-next-line no-use-before-define
1076
- deps: [CpsTreeTableComponent]
1077
- }
1078
- ], template: "<p-treeTable\n #primengTreeTable\n ttWithUnsort\n [ngClass]=\"{\n 'cps-treetable-loading': loading,\n 'cps-treetable-flex': defScrollHeight === 'flex',\n 'cps-treetable-nonvirtual': !virtualScroll,\n 'cps-treetable-autolayout-calced': autoLayout && scrollable\n }\"\n [value]=\"data\"\n [autoLayout]=\"autoLayout && !scrollable\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [virtualScroll]=\"virtualScroll\"\n [virtualScrollItemSize]=\"virtualScrollItemSize\"\n [virtualScrollOptions]=\"{\n numToleratedItems: numToleratedItems,\n autoSize: false\n }\"\n [columns]=\"selectedColumns\"\n [loading]=\"loading\"\n [rowHover]=\"rowHover\"\n [lazy]=\"lazy\"\n [(selection)]=\"selectedRows\"\n (selectionChange)=\"onSelectionChanged($event)\"\n compareSelectionBy=\"deepEquals\"\n [lazyLoadOnInit]=\"lazyLoadOnInit\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [tableStyleClass]=\"tableStyleClass\"\n [customSort]=\"customSort\"\n [sortMode]=\"sortMode\"\n [globalFilterFields]=\"globalFilterFields\"\n [paginator]=\"paginator\"\n [showCurrentPageReport]=\"true\"\n [alwaysShowPaginator]=\"alwaysShowPaginator\"\n [rows]=\"rows\"\n [first]=\"first\"\n [totalRecords]=\"totalRecords\"\n [resetPageOnSort]=\"resetPageOnSort\"\n [resizableColumns]=\"resizableColumns\"\n [columnResizeMode]=\"columnResizeMode\"\n currentPageReportTemplate=\"{first} - {last} of {totalRecords}\"\n (onPage)=\"onPageChange($event)\"\n (onSort)=\"onSort($event)\"\n (onFilter)=\"onFilter($event)\"\n (onLazyLoad)=\"onLazyLoaded($event)\"\n (sortFunction)=\"onSortFunction($event)\"\n (onNodeExpand)=\"onNodeExpanded($event)\"\n (onNodeCollapse)=\"onNodeCollapsed($event)\"\n (onNodeSelect)=\"onNodeSelected($event)\"\n (onNodeUnselect)=\"onNodeUnselected($event)\">\n @if (colgroupTemplate) {\n <ng-template pTemplate=\"colgroup\">\n <ng-container *ngTemplateOutlet=\"colgroupTemplate\"></ng-container>\n </ng-template>\n }\n <ng-template pTemplate=\"caption\" *ngIf=\"hasToolbar\">\n <ng-container *ngIf=\"toolbarTemplate\">\n <ng-container *ngTemplateOutlet=\"toolbarTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!toolbarTemplate\">\n <div class=\"cps-treetable-tbar-left\">\n <div *ngIf=\"toolbarIcon\" class=\"cps-treetable-tbar-icon\">\n <cps-icon [icon]=\"toolbarIcon\" [color]=\"toolbarIconColor\"></cps-icon>\n </div>\n <div class=\"cps-treetable-tbar-title\">{{ toolbarTitle }}</div>\n <div *ngIf=\"showGlobalFilter\" class=\"cps-treetable-tbar-global-filter\">\n <cps-input\n #globalFilterComp\n prefixIcon=\"search\"\n [placeholder]=\"globalFilterPlaceholder\"\n (valueChanged)=\"onFilterGlobal($event)\"\n [clearable]=\"true\"\n [disabled]=\"loading\"\n [appearance]=\"toolbarSize === 'small' ? 'underlined' : 'outlined'\"\n [hideDetails]=\"true\">\n </cps-input>\n </div>\n </div>\n <div class=\"cps-treetable-tbar-right\">\n <div\n *ngIf=\"showRemoveBtnOnSelect && selectedRows.length > 0\"\n class=\"cps-treetable-tbar-btn-on-select\">\n <cps-button\n label=\"Remove\"\n [disabled]=\"removeBtnOnSelectDisabled\"\n color=\"prepared\"\n type=\"borderless\"\n icon=\"remove\"\n [size]=\"toolbarSize\"\n (clicked)=\"removeSelected()\">\n </cps-button>\n </div>\n <div\n *ngIf=\"showAdditionalBtnOnSelect && selectedRows.length > 0\"\n class=\"cps-treetable-tbar-btn-on-select\">\n <cps-button\n [label]=\"additionalBtnOnSelectTitle\"\n [disabled]=\"additionalBtnOnSelectDisabled\"\n color=\"prepared\"\n type=\"borderless\"\n [icon]=\"additionalBtnOnSelectIcon\"\n [size]=\"toolbarSize\"\n (clicked)=\"onClickAdditionalBtnOnSelect()\">\n </cps-button>\n </div>\n <div *ngIf=\"showActionBtn\" class=\"cps-treetable-tbar-action-btn\">\n <cps-button\n [label]=\"actionBtnTitle\"\n [disabled]=\"actionBtnDisabled\"\n color=\"prepared\"\n type=\"outlined\"\n [icon]=\"actionBtnIcon\"\n [size]=\"toolbarSize\"\n (clicked)=\"onClickActionBtn()\">\n </cps-button>\n </div>\n <div\n *ngIf=\"showColumnsToggleBtn && columns.length > 0\"\n class=\"cps-treetable-tbar-coltoggle-btn\"\n [ngClass]=\"{ 'btn-disabled': columnsToggleBtnDisabled }\">\n <cps-icon\n icon=\"columns\"\n size=\"normal\"\n [color]=\"\n columnsToggleBtnDisabled ? 'text-lightest' : 'prepared-lighten1'\n \"\n (click)=\"onColumnsToggle($event)\"></cps-icon>\n <cps-menu #colToggleMenu [withArrow]=\"false\">\n <div class=\"cps-treetable-coltoggle-menu\">\n <div\n class=\"cps-treetable-coltoggle-menu-item select-all-option\"\n [class.allselected]=\"selectedColumns.length === columns.length\"\n (click)=\"toggleAllColumns()\">\n <span class=\"cps-treetable-coltoggle-menu-item-left\">\n <span class=\"cps-treetable-coltoggle-menu-item-check\"> </span>\n <span class=\"cps-treetable-coltoggle-menu-item-label\"\n >Show all columns</span\n >\n </span>\n </div>\n <div\n *ngFor=\"let col of columns\"\n class=\"cps-treetable-coltoggle-menu-item\"\n (click)=\"onSelectColumn(col)\"\n [class.selected]=\"isColumnSelected(col)\">\n <span class=\"cps-treetable-coltoggle-menu-item-left\">\n <span class=\"cps-treetable-coltoggle-menu-item-check\"></span>\n <span class=\"cps-treetable-coltoggle-menu-item-label\">{{\n col[colHeaderName]\n }}</span>\n </span>\n </div>\n </div>\n </cps-menu>\n </div>\n <div\n *ngIf=\"showDataReloadBtn\"\n class=\"cps-treetable-tbar-reload-btn\"\n [ngClass]=\"{ 'btn-disabled': dataReloadBtnDisabled }\">\n <cps-icon\n icon=\"refresh\"\n size=\"18\"\n [color]=\"dataReloadBtnDisabled ? 'text-light' : 'prepared-lighten1'\"\n (click)=\"onReloadData()\">\n </cps-icon>\n </div>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\" *ngIf=\"nestedHeaderTemplate\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"\n nestedHeaderTemplate;\n context: {\n $implicit: columns\n }\n \"></ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\" *ngIf=\"!nestedHeaderTemplate\" let-columns>\n <tr>\n <!-- <th style=\"width: 3rem\" *ngIf=\"reorderableRows\"></th> -->\n <th\n *ngIf=\"selectable\"\n cpsTTHdrSelectable\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\"></th>\n <ng-container *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n headerTemplate;\n context: {\n $implicit: columns\n }\n \"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!headerTemplate && columns.length > 0\">\n <ng-container *ngIf=\"sortable\">\n @if (filterableByColumns) {\n <th\n *ngFor=\"let col of columns\"\n [cpsTTColSortable]=\"col[colFieldName]\"\n [cpsTTColFilter]=\"col[colFieldName]\"\n [filterType]=\"\n col[colFilterTypeName] ??\n (autoColumnFilterType\n ? (data | cpsTTDetectFilterType: col[colFieldName])\n : 'text')\n \"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\">\n {{ col[colHeaderName] }}\n </th>\n } @else {\n <th\n *ngFor=\"let col of columns\"\n [cpsTTColSortable]=\"col[colFieldName]\"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\">\n {{ col[colHeaderName] }}\n </th>\n }\n </ng-container>\n <ng-container *ngIf=\"!sortable\">\n @if (filterableByColumns) {\n <th\n *ngFor=\"let col of columns\"\n [cpsTTColFilter]=\"col[colFieldName]\"\n [filterType]=\"\n col[colFilterTypeName] ??\n (autoColumnFilterType\n ? (data | cpsTTDetectFilterType: col[colFieldName])\n : 'text')\n \"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\">\n {{ col[colHeaderName] }}\n </th>\n } @else {\n <th\n *ngFor=\"let col of columns\"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\">\n {{ col[colHeaderName] }}\n </th>\n }\n </ng-container>\n </ng-container>\n <th\n class=\"cps-treetable-row-menu-cell\"\n *ngIf=\"showRowMenu && (showRowRemoveButton || showRowEditButton)\"\n cpsTTColResizable\n [cpsTTColResizableDisabled]=\"!resizableColumns\"></th>\n </tr>\n </ng-template>\n\n <ng-template\n pTemplate=\"body\"\n let-rowData=\"rowData\"\n let-columns=\"columns\"\n let-rowNode\n let-rowIndex=\"rowIndex\">\n <tr\n [ttRow]=\"rowNode\"\n [ngClass]=\"{\n 'cps-treetable-row-selected':\n selectable && primengTreeTable.isSelected(rowNode.node)\n }\">\n <!-- <td *ngIf=\"reorderableRows\" class=\"cps-table-row-drag-handle-cell\">\n <span class=\"cps-table-row-drag-handle\" pReorderableRowHandle>\u2630</span>\n </td> -->\n <td [cpsTTRowSelectable]=\"rowNode\" *ngIf=\"selectable\"></td>\n <ng-container *ngIf=\"bodyTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n bodyTemplate;\n context: {\n $implicit: rowNode,\n rowIndex: rowIndex,\n columns: columns,\n rowData: rowData\n }\n \">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!bodyTemplate\">\n <ng-container *ngIf=\"columns.length > 0\">\n @if (renderDataAsHTML) {\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <td\n *ngIf=\"i === 0\"\n [cpsTTRowToggler]=\"rowNode\"\n [innerHTML]=\"rowData[col[colFieldName]]\"></td>\n <td *ngIf=\"i > 0\" [innerHTML]=\"rowData[col[colFieldName]]\"></td>\n </ng-container>\n } @else {\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <td *ngIf=\"i === 0\" [cpsTTRowToggler]=\"rowNode\">\n {{\n col[colDateFormatName]\n ? (rowData[col[colFieldName]]\n | date: col[colDateFormatName])\n : rowData[col[colFieldName]]\n }}\n </td>\n <td *ngIf=\"i > 0\">\n {{\n col[colDateFormatName]\n ? (rowData[col[colFieldName]]\n | date: col[colDateFormatName])\n : rowData[col[colFieldName]]\n }}\n </td>\n </ng-container>\n }\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"showRowMenu && (showRowRemoveButton || showRowEditButton)\"\n class=\"cps-treetable-row-menu-cell\">\n <table-row-menu\n (editRowBtnClicked)=\"onEditRowClicked(rowNode.node)\"\n (removeRowBtnClicked)=\"onRemoveRowClicked(rowNode.node)\"\n [showRowRemoveButton]=\"showRowRemoveButton\"\n [showRowEditButton]=\"showRowEditButton\"\n [customItems]=\"rowMenuItems\">\n </table-row-menu>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td\n colspan=\"100\"\n class=\"cps-treetable-empty-message-td\"\n [ngStyle]=\"{ height: emptyBodyHeight }\">\n {{ emptyMessage }}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <cps-loader [fullScreen]=\"false\" opacity=\"0\"></cps-loader>\n </ng-template>\n <ng-template pTemplate=\"paginatorleft\">\n <div class=\"cps-table-paginator-itms-per-page\">\n <span class=\"cps-table-paginator-items-per-page-title\"\n >Rows per page:\n </span>\n <cps-select\n [options]=\"rowOptions\"\n [hideDetails]=\"true\"\n [(ngModel)]=\"rows\"\n (valueChanged)=\"onRowsPerPageChanged()\"\n [returnObject]=\"false\"\n optionsClass=\"cps-paginator-page-options\">\n </cps-select>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"paginatorfirstpagelinkicon\">\n <AngleDoubleLeftIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatorpreviouspagelinkicon\">\n <AngleLeftIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatornextpagelinkicon\">\n <AngleRightIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatorlastpagelinkicon\">\n <AngleDoubleRightIcon />\n </ng-template>\n</p-treeTable>\n", styles: [":host ::ng-deep .p-treetable{position:relative}:host ::ng-deep .p-component,:host ::ng-deep .p-component *{box-sizing:border-box}:host ::ng-deep .p-component{font-family:Source Sans Pro,sans-serif;font-size:14px;font-weight:400}:host ::ng-deep .p-treetable-scrollable-wrapper{position:relative;background:#fff}:host ::ng-deep .p-treetable-wrapper{background:#fff}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable.cps-tbar-normal .p-treetable-scrollable-wrapper{height:calc(100% - 72px)}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable.cps-tbar-small .p-treetable-scrollable-wrapper{height:calc(100% - 43px)}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable .p-treetable-scrollable-wrapper .p-treetable-scrollable-view .p-treetable-scrollable-header{display:contents}:host ::ng-deep .p-treetable .p-treetable-scrollable-header,:host ::ng-deep .p-treetable .p-treetable-scrollable-footer{background:#fff}:host ::ng-deep .p-treetable-scrollable-header,:host ::ng-deep .p-treetable-scrollable-footer{overflow:hidden}:host ::ng-deep .p-treetable table{border-collapse:collapse;width:100%;table-layout:fixed}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th{text-align:left;padding:1rem;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 1px;font-weight:400;color:var(--cps-color-text-mild);background:#fff;transition:box-shadow .2s;overflow:hidden}:host ::ng-deep .p-treetable-scrollable-body{overflow:auto!important;position:relative}:host ::ng-deep .cps-treetable-flex .p-treetable-scrollable-body{height:100%}:host ::ng-deep .p-treetable .p-treetable-tbody{background:#fff}:host ::ng-deep .p-treetable .p-treetable-tbody>tr{background:#fff;color:var(--cps-color-text-dark);transition:box-shadow .2s}:host ::ng-deep .p-treetable .p-treetable-tbody>tr.cps-treetable-row-selected{background-color:var(--cps-color-highlight-active)!important}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td{text-align:left;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;padding:1rem}:host ::ng-deep p-treetable:not(.cps-treetable-autolayout-calced) .p-treetable .p-treetable-tbody>tr>td{overflow:hidden}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable .p-treetable-scrollable-body .p-treetable-tbody>tr>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){opacity:0;border-left-color:#fff}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable.p-treetable-striped .p-treetable-scrollable-body .p-treetable-tbody>tr:nth-child(odd)>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){border-left-color:var(--cps-color-bg-light)}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable .p-treetable-scrollable-body .p-treetable-tbody>tr:hover>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){border-left-color:var(--cps-color-highlight-hover)}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:first-child{border-width:0 0 1px 1px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:last-child{border-width:0 1px 1px 0}:host ::ng-deep .p-treetable-auto-layout table{table-layout:auto}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler{width:1rem;height:1rem;color:var(--cps-color-text-dark);border:0 none;background:transparent;border-radius:50%;margin-right:.5rem}:host ::ng-deep .p-treetable-toggler{cursor:pointer;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;overflow:hidden;position:relative}:host ::ng-deep .p-ripple{overflow:hidden;position:relative}:host ::ng-deep .p-link:focus{outline:0 none;outline-offset:0;box-shadow:unset}:host ::ng-deep .p-link{text-align:left;background-color:transparent;margin:0;padding:0;border:none;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:14px;font-family:Source Sans Pro,sans-serif;border-radius:6px}:host ::ng-deep input[type=button],:host ::ng-deep input[type=submit],:host ::ng-deep input[type=reset],:host ::ng-deep input[type=file]::-webkit-file-upload-button,:host ::ng-deep button{border-radius:0}:host ::ng-deep .p-treetable .p-treetable-tbody>tr:focus{outline:0 none;outline-offset:-.15rem}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:enabled:hover{color:var(--cps-color-calm);border-color:transparent;background:unset}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:focus{outline:0 none;outline-offset:0;box-shadow:unset}:host ::ng-deep .p-treetable .p-paginator{border-width:0 1px 1px 1px;border-radius:0}:host ::ng-deep .p-paginator{background:#fff;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;color:var(--cps-color-text-dark);padding:1rem;border:1px solid var(--cps-color-line-mid)}:host ::ng-deep .p-paginator-left-content{margin-right:auto}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page{display:inline-flex;align-items:center}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-table-paginator-items-per-page-title{font-family:Source Sans Pro,sans-serif;font-size:14px;margin-right:12px;cursor:default}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box{min-height:32px!important;background:transparent!important}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box .cps-select-box-items{font-size:14px!important}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box .cps-select-box-chevron .cps-icon{width:14px;height:14px}:host ::ng-deep .p-paginator .p-paginator-current{background-color:transparent;border:0 none;color:var(--cps-color-text-dark);min-width:3rem;margin:.143rem;padding:0 .5rem;font-family:Source Sans Pro,sans-serif;font-size:14px;height:unset}:host ::ng-deep .p-paginator-page,:host ::ng-deep .p-paginator-next,:host ::ng-deep .p-paginator-last,:host ::ng-deep .p-paginator-first,:host ::ng-deep .p-paginator-prev,:host ::ng-deep .p-paginator-current{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1;-webkit-user-select:none;user-select:none;overflow:hidden;position:relative}:host ::ng-deep .p-paginator-current{cursor:default}:host ::ng-deep .p-paginator .p-paginator-first:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-prev:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-next:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-last:not(.p-disabled):not(.p-highlight):hover{background:var(--cps-color-highlight-hover);border-color:unset}:host ::ng-deep .p-paginator .p-paginator-first:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-prev:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-next:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-last:not(.p-disabled):not(.p-highlight):active{background:var(--cps-color-highlight-active)}:host ::ng-deep .p-paginator .p-paginator-first,:host ::ng-deep .p-paginator .p-paginator-prev,:host ::ng-deep .p-paginator .p-paginator-next,:host ::ng-deep .p-paginator .p-paginator-last{background-color:transparent;border:1px solid var(--cps-color-text-dark);border-radius:4px;color:var(--cps-color-text-dark);min-width:32px;height:32px;margin:.143rem;transition:box-shadow .2s}:host ::ng-deep .p-disabled,:host ::ng-deep .p-disabled *{cursor:default!important;pointer-events:none}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page.p-highlight{background:var(--cps-color-calm);border-color:var(--cps-color-calm);color:#fff}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page:not(.p-highlight):hover{background:var(--cps-color-highlight-hover);border-color:unset}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page:not(.p-highlight):active{background:var(--cps-color-highlight-active)}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page{background-color:transparent;border:1px solid var(--cps-color-text-dark);border-radius:4px;color:var(--cps-color-text-dark);min-width:32px;height:32px;margin:.143rem;transition:box-shadow .2s}:host ::ng-deep .p-paginator-element:focus{z-index:1;position:relative}:host ::ng-deep span.p-paginator-icon{display:contents}:host ::ng-deep .p-disabled,:host ::ng-deep .p-component:disabled{opacity:.4}:host ::ng-deep .cps-treetable-empty-message-td{text-align:center!important;font-weight:600;background:#fff}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-header{border-width:1px 1px 0 1px}:host ::ng-deep .p-treetable .p-treetable-header{font-weight:600;display:flex;justify-content:space-between;align-items:center;padding:0 10px;border:unset;background:unset;border-top:1px solid var(--cps-color-line-mid);border-right:1px solid var(--cps-color-line-mid);border-left:4px solid var(--cps-color-surprise)!important;border-radius:4px 4px 0 0;font-size:16px;line-height:150%;background-color:#fff;color:var(--cps-color-text-darkest);overflow:auto}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left{display:flex;align-items:center}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-global-filter{margin-left:12px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-icon{display:flex;margin-right:8px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-title{cursor:default}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right{display:flex;align-items:center}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-btn-on-select{margin-right:4px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-action-btn{margin-right:4px;margin-left:8px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn{display:contents}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn cps-icon{margin-left:12px;margin-right:4px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn:not(.btn-disabled) cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn:not(.btn-disabled) cps-icon{cursor:pointer}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn:not(.btn-disabled) cps-icon:hover .cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn:not(.btn-disabled) cps-icon:hover .cps-icon{color:var(--cps-color-prepared)!important}:host ::ng-deep .cps-tbar-small.p-treetable .p-treetable-header{height:43px}:host ::ng-deep .cps-tbar-normal.p-treetable .p-treetable-header{height:72px}:host ::ng-deep .p-treetable .p-treetable-footer{background:#fff;color:#343a40;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;padding:1rem;font-weight:700}:host ::ng-deep .p-treetable .p-treetable-tfoot>tr>td{text-align:left;padding:1rem;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;font-weight:700;color:#343a40;background:#fff}:host ::ng-deep .p-treetable .p-sortable-column:not(.p-highlight):hover .cps-sortable-column-icon.sort-unsorted .sort-unsorted-arrow-up{border-bottom-color:var(--cps-color-text-mild)}:host ::ng-deep .p-treetable .p-sortable-column:not(.p-highlight):hover .cps-sortable-column-icon.sort-unsorted .sort-unsorted-arrow-down{border-top-color:var(--cps-color-text-mild)}:host ::ng-deep .p-icon-wrapper{display:inline-flex}:host ::ng-deep .p-icon{display:inline-block;width:1rem;height:1rem}:host ::ng-deep .p-treetable .p-sortable-column .cps-sortable-column-badge{display:inline-flex;align-items:center;justify-content:center;font-size:12px;vertical-align:top;color:var(--cps-color-calm);margin-left:.25rem}:host ::ng-deep .p-link{text-align:left;background-color:transparent;margin:0;padding:0;border:none;cursor:pointer;-webkit-user-select:none;user-select:none}:host ::ng-deep .p-treetable .p-sortable-column{cursor:pointer;-webkit-user-select:none;user-select:none}:host ::ng-deep .p-treetable .p-sortable-column:focus{box-shadow:none;outline:0 none}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler.p-icon{width:2rem;height:2rem}:host ::ng-deep .p-treetable .p-treetable-tbody>tr.p-highlight{background:#eff6ff;color:#1d4ed8}:host ::ng-deep .p-treetable.p-treetable-hoverable-rows .p-treetable-tbody>tr:not(.p-highlight):hover{background:var(--cps-color-highlight-hover)}:host ::ng-deep .p-treetable-hoverable-rows .p-treetable-tbody>tr{cursor:auto}:host ::ng-deep .p-treetable .p-column-resizer-helper{background:var(--cps-color-calm)}:host ::ng-deep .p-treetable .p-treetable-loading-overlay{position:absolute;display:flex;align-items:center;justify-content:center;z-index:1001;top:0;left:0;width:100%;height:100%;background-color:#fff;transition-duration:.2s;border:1px solid var(--cps-color-line-mid)}:host ::ng-deep .p-treetable.cps-tbar-small .p-treetable-loading-overlay{top:43px;height:calc(100% - 43px)}:host ::ng-deep .p-treetable.cps-tbar-normal .p-treetable-loading-overlay{top:72px;height:calc(100% - 72px)}:host ::ng-deep .cps-treetable-loading .p-treetable{min-height:200px}:host ::ng-deep .cps-treetable-loading .p-treetable.cps-tbar-normal{min-height:272px}:host ::ng-deep .cps-treetable-loading .p-treetable.cps-tbar-small{min-height:243px}:host ::ng-deep .cps-table-col-filter-menu-open .cps-table-col-filter-menu-button{color:var(--cps-color-text-dark)}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-footer{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-top{border-width:0 1px 0 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-bottom{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th{border-width:1px 0 1px 1px}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th:last-child{border-width:1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tbody>tr>td{border-width:0 0 1px 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tfoot>tr>td{border-width:1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tbody>tr>td:last-child{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:only-child{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-thead>tr>th{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-tbody>tr>td{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-tfoot>tr>td{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-footer{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-thead>tr>th{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-tbody>tr>td{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-tfoot>tr>td{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-footer{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-striped .p-treetable-tbody>tr:nth-child(odd){background:var(--cps-color-bg-light)}:host ::ng-deep .p-treetable.p-treetable-striped .p-treetable-tbody>tr:nth-child(2n){background:#fff}:host ::ng-deep .cps-treetable-row-menu-cell{width:55px;border-left:none!important}:host ::ng-deep .cps-treetable-selectable-cell{width:55px;text-align:center!important}:host ::ng-deep .p-checkbox{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none;vertical-align:bottom;position:relative;width:18px;height:18px}:host ::ng-deep .p-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}:host ::ng-deep .p-hidden-accessible input,:host ::ng-deep .p-hidden-accessible select{transform:scale(0)}:host ::ng-deep .p-checkbox .p-checkbox-box{background:#fff;width:18px;height:18px;color:var(--cps-color-text-dark);border:2px solid var(--cps-color-text-mild);border-radius:2px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}:host ::ng-deep .p-checkbox-box{display:flex;justify-content:center;align-items:center}:host ::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:var(--cps-color-calm);background:var(--cps-color-calm)}:host ::ng-deep .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box.p-highlight:hover{border-color:var(--cps-color-calm);background:var(--cps-color-calm);color:#fff}:host ::ng-deep .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box:hover{border-color:var(--cps-color-calm)}:host ::ng-deep .p-checkbox .p-checkbox-box .p-icon{width:14px;height:14px}:host ::ng-deep .p-checkbox .p-checkbox-box .p-checkbox-icon{transition-duration:.2s;color:#fff;font-size:14px}:host ::ng-deep .p-checkbox .p-checkbox-box minusicon .p-checkbox-icon{color:var(--cps-color-calm);width:12px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td p-treetablecheckbox .p-checkbox{margin-right:0}::ng-deep .p-scrollbar-measure{width:100px;height:100px;overflow:scroll;position:absolute;top:-9999px}.cps-treetable-coltoggle-menu{display:block;max-height:242px;overflow-x:hidden;background:#fff}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item{padding:12px;justify-content:space-between;display:flex;cursor:pointer}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item:hover{background:var(--cps-color-highlight-hover)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-label{color:var(--cps-color-text-dark)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-left{display:flex;align-items:center;margin-right:8px}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-check{background-color:transparent;border:0;width:16px;height:16px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1);margin-right:8px;opacity:0}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-check:after{color:var(--cps-color-calm);top:4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box;position:absolute;content:\"\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected{font-weight:600}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected .cps-treetable-coltoggle-menu-item-label,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected .cps-treetable-coltoggle-menu-item-label{color:var(--cps-color-calm)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected .cps-treetable-coltoggle-menu-item-check,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected .cps-treetable-coltoggle-menu-item-check{opacity:1}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected{background:var(--cps-color-highlight-selected)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.highlighten{background:var(--cps-color-highlight-active)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected.highlighten{background:var(--cps-color-highlight-selected-dark)}.cps-treetable-coltoggle-menu .select-all-option{border-bottom:1px solid lightgrey;font-weight:600}::ng-deep .cps-select-options-menu.cps-paginator-page-options .cps-select-options-option{font-size:14px}\n"] }]
1079
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
1080
- type: Inject,
1081
- args: [DOCUMENT]
1082
- }] }, { type: i0.Renderer2 }, { type: i0.NgZone }], propDecorators: { columns: [{
1083
- type: Input
1084
- }], colHeaderName: [{
1085
- type: Input
1086
- }], colFieldName: [{
1087
- type: Input
1088
- }], colFilterTypeName: [{
1089
- type: Input
1090
- }], colDateFormatName: [{
1091
- type: Input
1092
- }], minWidth: [{
1093
- type: Input
1094
- }], minWidthForBodyOnly: [{
1095
- type: Input
1096
- }], autoLayout: [{
1097
- type: Input
1098
- }], striped: [{
1099
- type: Input
1100
- }], bordered: [{
1101
- type: Input
1102
- }], size: [{
1103
- type: Input
1104
- }], selectable: [{
1105
- type: Input
1106
- }], rowHover: [{
1107
- type: Input
1108
- }], showRowMenu: [{
1109
- type: Input
1110
- }], showRowRemoveButton: [{
1111
- type: Input
1112
- }], showRowEditButton: [{
1113
- type: Input
1114
- }], rowMenuItems: [{
1115
- type: Input
1116
- }], loading: [{
1117
- type: Input
1118
- }], tableStyle: [{
1119
- type: Input
1120
- }], tableStyleClass: [{
1121
- type: Input
1122
- }], sortable: [{
1123
- type: Input
1124
- }], sortMode: [{
1125
- type: Input
1126
- }], customSort: [{
1127
- type: Input
1128
- }], hasToolbar: [{
1129
- type: Input
1130
- }], toolbarSize: [{
1131
- type: Input
1132
- }], toolbarTitle: [{
1133
- type: Input
1134
- }], toolbarIcon: [{
1135
- type: Input
1136
- }], toolbarIconColor: [{
1137
- type: Input
1138
- }], scrollable: [{
1139
- type: Input
1140
- }], scrollHeight: [{
1141
- type: Input
1142
- }], virtualScroll: [{
1143
- type: Input
1144
- }], virtualScrollItemHeight: [{
1145
- type: Input
1146
- }], numToleratedItems: [{
1147
- type: Input
1148
- }], paginator: [{
1149
- type: Input
1150
- }], alwaysShowPaginator: [{
1151
- type: Input
1152
- }], rowsPerPageOptions: [{
1153
- type: Input
1154
- }], first: [{
1155
- type: Input
1156
- }], rows: [{
1157
- type: Input
1158
- }], resetPageOnRowsChange: [{
1159
- type: Input
1160
- }], resetPageOnSort: [{
1161
- type: Input
1162
- }], totalRecords: [{
1163
- type: Input
1164
- }], emptyMessage: [{
1165
- type: Input
1166
- }], emptyBodyHeight: [{
1167
- type: Input
1168
- }], lazy: [{
1169
- type: Input
1170
- }], lazyLoadOnInit: [{
1171
- type: Input
1172
- }], showGlobalFilter: [{
1173
- type: Input
1174
- }], globalFilterPlaceholder: [{
1175
- type: Input
1176
- }], globalFilterFields: [{
1177
- type: Input
1178
- }], clearGlobalFilterOnLoading: [{
1179
- type: Input
1180
- }], showRemoveBtnOnSelect: [{
1181
- type: Input
1182
- }], removeBtnOnSelectDisabled: [{
1183
- type: Input
1184
- }], showAdditionalBtnOnSelect: [{
1185
- type: Input
1186
- }], additionalBtnOnSelectTitle: [{
1187
- type: Input
1188
- }], additionalBtnOnSelectIcon: [{
1189
- type: Input
1190
- }], additionalBtnOnSelectDisabled: [{
1191
- type: Input
1192
- }], showActionBtn: [{
1193
- type: Input
1194
- }], actionBtnTitle: [{
1195
- type: Input
1196
- }], actionBtnIcon: [{
1197
- type: Input
1198
- }], actionBtnDisabled: [{
1199
- type: Input
1200
- }], showDataReloadBtn: [{
1201
- type: Input
1202
- }], dataReloadBtnDisabled: [{
1203
- type: Input
1204
- }], showColumnsToggleBtn: [{
1205
- type: Input
1206
- }], columnsToggleBtnDisabled: [{
1207
- type: Input
1208
- }], initialColumns: [{
1209
- type: Input
1210
- }], filterableByColumns: [{
1211
- type: Input
1212
- }], autoColumnFilterType: [{
1213
- type: Input
1214
- }], renderDataAsHTML: [{
1215
- type: Input
1216
- }], data: [{
1217
- type: Input
1218
- }], resizableColumns: [{
1219
- type: Input
1220
- }], columnResizeMode: [{
1221
- type: Input
1222
- }], rowsSelected: [{
1223
- type: Output
1224
- }], actionBtnClicked: [{
1225
- type: Output
1226
- }], additionalBtnOnSelectClicked: [{
1227
- type: Output
1228
- }], editRowBtnClicked: [{
1229
- type: Output
1230
- }], rowsToRemove: [{
1231
- type: Output
1232
- }], pageChanged: [{
1233
- type: Output
1234
- }], sorted: [{
1235
- type: Output
1236
- }], filtered: [{
1237
- type: Output
1238
- }], columnsSelected: [{
1239
- type: Output
1240
- }], lazyLoaded: [{
1241
- type: Output
1242
- }], dataReloadBtnClicked: [{
1243
- type: Output
1244
- }], nodeExpanded: [{
1245
- type: Output
1246
- }], nodeCollapsed: [{
1247
- type: Output
1248
- }], nodeSelected: [{
1249
- type: Output
1250
- }], nodeUnselected: [{
1251
- type: Output
1252
- }], customSortFunction: [{
1253
- type: Output
1254
- }], toolbarTemplate: [{
1255
- type: ContentChild,
1256
- args: ['toolbar', { static: false }]
1257
- }], headerTemplate: [{
1258
- type: ContentChild,
1259
- args: ['header', { static: false }]
1260
- }], nestedHeaderTemplate: [{
1261
- type: ContentChild,
1262
- args: ['nestedHeader', { static: false }]
1263
- }], bodyTemplate: [{
1264
- type: ContentChild,
1265
- args: ['body', { static: false }]
1266
- }], colgroupTemplate: [{
1267
- type: ContentChild,
1268
- args: ['colgroup', { static: false }]
1269
- }], primengTreeTable: [{
1270
- type: ViewChild,
1271
- args: ['primengTreeTable', { static: true }]
1272
- }], globalFilterComp: [{
1273
- type: ViewChild,
1274
- args: ['globalFilterComp']
1275
- }], colToggleMenu: [{
1276
- type: ViewChild,
1277
- args: ['colToggleMenu']
1278
- }] } });
1279
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BzLXRyZWUtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXRyZWUtdGFibGUvY3BzLXRyZWUtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXRyZWUtdGFibGUvY3BzLXRyZWUtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUtMLE1BQU0sRUFFTixtQkFBbUIsRUFHbkIsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFFaEIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NB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QUF0QixNQUFNO2dCQU9HLFlBQVk7c0JBQXJCLE1BQU07Z0JBT0csY0FBYztzQkFBdkIsTUFBTTtnQkFPRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBR0EsZUFBZTtzQkFEckIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUluQyxjQUFjO3NCQURwQixZQUFZO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSWxDLG9CQUFvQjtzQkFEMUIsWUFBWTt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUl4QyxZQUFZO3NCQURsQixZQUFZO3VCQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSWhDLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUkzQyxnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSS9DLGdCQUFnQjtzQkFEZixTQUFTO3VCQUFDLGtCQUFrQjtnQkFJN0IsYUFBYTtzQkFEWixTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFJlbmRlcmVyU3R5bGVGbGFnczIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgVHJlZVRhYmxlLFxuICBUcmVlVGFibGVTZXJ2aWNlLFxuICBUcmVlVGFibGVNb2R1bGUsXG4gIFRyZWVUYWJsZVNvcnRFdmVudFxufSBmcm9tICdwcmltZW5nL3RyZWV0YWJsZSc7XG5pbXBvcnQgeyBEb21IYW5kbGVyIH0gZnJvbSAncHJpbWVuZy9kb20nO1xuaW1wb3J0IHsgQW5nbGVEb3VibGVMZWZ0SWNvbiB9IGZyb20gJ3ByaW1lbmcvaWNvbnMvYW5nbGVkb3VibGVsZWZ0JztcbmltcG9ydCB7IEFuZ2xlTGVmdEljb24gfSBmcm9tICdwcmltZW5nL2ljb25zL2FuZ2xlbGVmdCc7XG5pbXBvcnQgeyBBbmdsZVJpZ2h0SWNvbiB9IGZyb20gJ3ByaW1lbmcvaWNvbnMvYW5nbGVyaWdodCc7XG5pbXBvcnQgeyBBbmdsZURvdWJsZVJpZ2h0SWNvbiB9IGZyb20gJ3ByaW1lbmcvaWNvbnMvYW5nbGVkb3VibGVyaWdodCc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQ3BzSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtaW5wdXQvY3BzLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9jcHMtYnV0dG9uL2Nwcy1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IENwc01lbnVDb21wb25lbnQsIENwc01lbnVJdGVtIH0gZnJvbSAnLi4vY3BzLW1lbnUvY3BzLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IENwc0ljb25Db21wb25lbnQgfSBmcm9tICcuLi9jcHMtaWNvbi9jcHMtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3BzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLXNlbGVjdC9jcHMtc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNMb2FkZXJDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtbG9hZGVyL2Nwcy1sb2FkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENwc1RyZWVUYWJsZUNvbHVtblNvcnRhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2Nwcy10cmVlLXRhYmxlLWNvbHVtbi1zb3J0YWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVHJlZVRhYmxlVW5zb3J0RGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2ludGVybmFsL3RyZWUtdGFibGUtdW5zb3J0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUYWJsZVJvd01lbnVDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtdGFibGUvY29tcG9uZW50cy9pbnRlcm5hbC90YWJsZS1yb3ctbWVudS90YWJsZS1yb3ctbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgY29udmVydFNpemUgfSBmcm9tICcuLi8uLi91dGlscy9pbnRlcm5hbC9zaXplLXV0aWxzJztcbmltcG9ydCB7IENwc1RyZWVUYWJsZUhlYWRlclNlbGVjdGFibGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY3BzLXRyZWUtdGFibGUtaGVhZGVyLXNlbGVjdGFibGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IENwc1RyZWVUYWJsZVJvd1NlbGVjdGFibGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY3BzLXRyZWUtdGFibGUtcm93LXNlbGVjdGFibGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IENwc1RyZWV0YWJsZVJvd1RvZ2dsZXJEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY3BzLXRyZWUtdGFibGUtcm93LXRvZ2dsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDcHNUcmVlVGFibGVDb2x1bW5GaWx0ZXJEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY3BzLXRyZWUtdGFibGUtY29sdW1uLWZpbHRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ3BzVHJlZVRhYmxlRGV0ZWN0RmlsdGVyVHlwZVBpcGUgfSBmcm9tICcuL3BpcGVzL2Nwcy10cmVlLXRhYmxlLWRldGVjdC1maWx0ZXItdHlwZS5waXBlJztcbmltcG9ydCB7IENwc1RyZWVUYWJsZUNvbHVtblJlc2l6YWJsZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jcHMtdHJlZS10YWJsZS1jb2x1bW4tcmVzaXphYmxlLmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlVGFibGVGYWN0b3J5KHRhYmxlQ29tcG9uZW50OiBDcHNUcmVlVGFibGVDb21wb25lbnQpIHtcbiAgcmV0dXJuIHRhYmxlQ29tcG9uZW50LnByaW1lbmdUcmVlVGFibGU7XG59XG5cbi8qKlxuICogQ3BzVHJlZVRhYmxlU2l6ZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgc2l6ZSBvZiB0aGUgdHJlZSB0YWJsZS5cbiAqIEBncm91cCBUeXBlc1xuICovXG5leHBvcnQgdHlwZSBDcHNUcmVlVGFibGVTaXplID0gJ3NtYWxsJyB8ICdub3JtYWwnIHwgJ2xhcmdlJztcblxuLyoqXG4gKiBDcHNUcmVlVGFibGVUb29sYmFyU2l6ZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgc2l6ZSBvZiB0aGUgdHJlZSB0YWJsZSB0b29sYmFyLlxuICogQGdyb3VwIFR5cGVzXG4gKi9cbmV4cG9ydCB0eXBlIENwc1RyZWVUYWJsZVRvb2xiYXJTaXplID0gJ3NtYWxsJyB8ICdub3JtYWwnO1xuXG4vKipcbiAqIENwc1RyZWVUYWJsZVNvcnRNb2RlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBzb3J0aW5nIG1vZGUgb2YgdGhlIHRyZWUgdGFibGUuXG4gKiBAZ3JvdXAgVHlwZXNcbiAqL1xuZXhwb3J0IHR5cGUgQ3BzVHJlZVRhYmxlU29ydE1vZGUgPSAnc2luZ2xlJyB8ICdtdWx0aXBsZSc7XG5cbi8qKlxuICogQ3BzVHJlZVRhYmxlQ29tcG9uZW50IGlzIHVzZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgZGF0YSBpbiB0YWJ1bGFyIGZvcm1hdC5cbiAqIEBncm91cCBDb21wb25lbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nwcy10cmVlLXRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVHJlZVRhYmxlTW9kdWxlLFxuICAgIENwc0lucHV0Q29tcG9uZW50LFxuICAgIENwc0J1dHRvbkNvbXBvbmVudCxcbiAgICBDcHNNZW51Q29tcG9uZW50LFxuICAgIENwc0ljb25Db21wb25lbnQsXG4gICAgQ3BzU2VsZWN0Q29tcG9uZW50LFxuICAgIENwc0xvYWRlckNvbXBvbmVudCxcbiAgICBBbmdsZURvdWJsZUxlZnRJY29uLFxuICAgIEFuZ2xlTGVmdEljb24sXG4gICAgQW5nbGVSaWdodEljb24sXG4gICAgQW5nbGVEb3VibGVSaWdodEljb24sXG4gICAgQ3BzVHJlZVRhYmxlQ29sdW1uU29ydGFibGVEaXJlY3RpdmUsXG4gICAgQ3BzVHJlZVRhYmxlQ29sdW1uRmlsdGVyRGlyZWN0aXZlLFxuICAgIENwc1RyZWVUYWJsZUhlYWRlclNlbGVjdGFibGVEaXJlY3RpdmUsXG4gICAgQ3BzVHJlZVRhYmxlUm93U2VsZWN0YWJsZURpcmVjdGl2ZSxcbiAgICBDcHNUcmVldGFibGVSb3dUb2dnbGVyRGlyZWN0aXZlLFxuICAgIENwc1RyZWVUYWJsZUNvbHVtblJlc2l6YWJsZURpcmVjdGl2ZSxcbiAgICBUcmVlVGFibGVVbnNvcnREaXJlY3RpdmUsXG4gICAgVGFibGVSb3dNZW51Q29tcG9uZW50LFxuICAgIENwc1RyZWVUYWJsZURldGVjdEZpbHRlclR5cGVQaXBlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jcHMtdHJlZS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Nwcy10cmVlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIFRyZWVUYWJsZVNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogVHJlZVRhYmxlLFxuICAgICAgdXNlRmFjdG9yeTogdHJlZVRhYmxlRmFjdG9yeSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgZGVwczogW0Nwc1RyZWVUYWJsZUNvbXBvbmVudF1cbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ3BzVHJlZVRhYmxlQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQsIE9uQ2hhbmdlc1xue1xuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byByZXByZXNlbnQgZHluYW1pYyBjb2x1bW5zLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGNvbHVtbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBIGtleSB1c2VkIHRvIHJldHJpZXZlIHRoZSBoZWFkZXIgZnJvbSBjb2x1bW5zLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGNvbEhlYWRlck5hbWUgPSAnaGVhZGVyJztcblxuICAvKipcbiAgICogQSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZmllbGQgZnJvbSBjb2x1bW5zLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGNvbEZpZWxkTmFtZSA9ICdmaWVsZCc7XG5cbiAgLyoqXG4gICAqIEEga2V5IHVzZWQgdG8gcmV0cmlldmUgdGhlIGZpbHRlciB0eXBlIGZyb20gY29sdW1ucy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBjb2xGaWx0ZXJUeXBlTmFtZSA9ICdmaWx0ZXJUeXBlJztcblxuICAvKipcbiAgICogQSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGF0ZSBmb3JtYXQgZnJvbSBjb2x1bW5zLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGNvbERhdGVGb3JtYXROYW1lID0gJ2RhdGVGb3JtYXQnO1xuXG4gIC8qKlxuICAgKiBUcmVldGFibGUgbWluIHdpZHRoIG9mIHR5cGUgbnVtYmVyIGRlbm90aW5nIHBpeGVscyBvciBzdHJpbmcuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgbWluV2lkdGg6IG51bWJlciB8IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgbWluV2lkdGggcHJvcCBpcyB1c2VkIGZvciB0cmVldGFibGUgYm9keSBvbmx5LCBleGNsdWRpbmcgdG9vbGJhciBhbmQgcGFnaW5hdG9yLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIG1pbldpZHRoRm9yQm9keU9ubHkgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNlbGwgd2lkdGhzIHNjYWxlIGFjY29yZGluZyB0byB0aGVpciBjb250ZW50IG9yIG5vdC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBhdXRvTGF5b3V0ID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0cmVldGFibGUgc2hvdWxkIGhhdmUgYWx0ZXJuYXRpbmcgc3RyaXBlcy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzdHJpcGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0cmVldGFibGUgc2hvdWxkIGhhdmUgYm9yZGVycy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBib3JkZXJlZCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNpemUgb2YgdHJlZXRhYmxlIGNlbGxzLCBpdCBjYW4gYmUgXCJzbWFsbFwiLCBcIm5vcm1hbFwiIG9yIFwibGFyZ2VcIi5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaXplOiBDcHNUcmVlVGFibGVTaXplID0gJ25vcm1hbCc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdHJlZXRhYmxlIHNob3VsZCBoYXZlIHJvdyBzZWxlY3Rpb24uXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0YWJsZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRyZWV0YWJsZSBzaG91bGQgaGF2ZSByb3dzIGhpZ2hsaWdodGluZyBvbiBob3Zlci5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSByb3dIb3ZlciA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdHJlZXRhYmxlIHNob3VsZCBzaG93IHJvdyBtZW51cy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93Um93TWVudSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlICdSZW1vdmUnIGJ1dHRvbiBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSByb3cgbWVudS5cbiAgICogTm90ZTogVGhpcyBzZXR0aW5nIG9ubHkgdGFrZXMgZWZmZWN0IGlmICdzaG93Um93TWVudScgaXMgdHJ1ZSBhbmQgJ3Jvd01lbnVJdGVtcycgaXMgbm90IHNldC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93Um93UmVtb3ZlQnV0dG9uID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSAnRWRpdCcgYnV0dG9uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHJvdyBtZW51LlxuICAgKiBOb3RlOiBUaGlzIHNldHRpbmcgb25seSB0YWtlcyBlZmZlY3QgaWYgJ3Nob3dSb3dNZW51JyBpcyB0cnVlIGFuZCAncm93TWVudUl0ZW1zJyBpcyBub3Qgc2V0LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNob3dSb3dFZGl0QnV0dG9uID0gdHJ1ZTtcblxuICAvKipcbiAgICogQ3VzdG9tIGl0ZW1zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgcm93IG1lbnUuXG4gICAqIE5vdGU6IFRoaXMgc2V0dGluZyBvbmx5IHRha2VzIGVmZmVjdCBpZiAnc2hvd1Jvd01lbnUnIGlzIHRydWUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgcm93TWVudUl0ZW1zPzogQ3BzTWVudUl0ZW1bXTtcblxuICAvKipcbiAgICogV2hlbiBlbmFibGVkLCBhIGxvYWRlciBjb21wb25lbnQgaXMgZGlzcGxheWVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogSW5saW5lIHN0eWxlIG9mIHRoZSB0cmVldGFibGUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgdGFibGVTdHlsZSA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3R5bGUgY2xhc3Mgb2YgdGhlIHRyZWV0YWJsZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB0YWJsZVN0eWxlQ2xhc3MgPSAnJztcblxuICAvKipcbiAgICogTWFrZXMgYWxsIGNvbHVtbnMgc29ydGFibGUgaWYgY29sdW1ucyBwcm9wIGlzIHByb3ZpZGVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNvcnRhYmxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBzb3J0aW5nIHdvcmtzIG9uIHNpbmdsZSBjb2x1bW4gb3Igb24gbXVsdGlwbGUgY29sdW1ucy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzb3J0TW9kZTogQ3BzVHJlZVRhYmxlU29ydE1vZGUgPSAnc2luZ2xlJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgZGVmYXVsdCBzb3J0aW5nIG9yIGEgY3VzdG9tIG9uZSB1c2luZyBzb3J0RnVuY3Rpb24uXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgY3VzdG9tU29ydCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRyZWV0YWJsZSBoYXMgYSB0b29sYmFyLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGhhc1Rvb2xiYXIgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUb29sYmFyIHNpemUsIGl0IGNhbiBiZSBcInNtYWxsXCIgb3IgXCJub3JtYWxcIi5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB0b29sYmFyU2l6ZTogQ3BzVHJlZVRhYmxlVG9vbGJhclNpemUgPSAnbm9ybWFsJztcblxuICAvKipcbiAgICogVG9vbGJhciB0aXRsZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB0b29sYmFyVGl0bGUgPSAnJztcblxuICAvKipcbiAgICogVG9vbGJhciBpY29uIG5hbWUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgdG9vbGJhckljb24gPSAnJztcblxuICAvKipcbiAgICogVG9vbGJhciBpY29uIGNvbG9yLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHRvb2xiYXJJY29uQ29sb3IgPSAnJztcblxuICAvKipcbiAgICogTWFrZXMgdHJlZXRhYmxlIHNjcm9sbGFibGUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2Nyb2xsYWJsZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEhlaWdodCBvZiB0aGUgc2Nyb2xsIHZpZXdwb3J0IGluIGZpeGVkIHBpeGVscyBvciB0aGUgXCJmbGV4XCIga2V5d29yZCBmb3IgYSBkeW5hbWljIHNpemUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0ID0gJyc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvbmx5IHRoZSBlbGVtZW50cyB3aXRoaW4gc2Nyb2xsYWJsZSBhcmVhIHNob3VsZCBiZSBhZGRlZCBpbnRvIHRoZSBET00uIFdvcmtzIG9ubHkgaWYgc2Nyb2xsYWJsZSBwcm9wIGlzIHRydWUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgdmlydHVhbFNjcm9sbCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBIZWlnaHQgb2YgYSB2aXJ0dWFsIHNjcm9sbCBpdGVtIGluIGZpeGVkIHBpeGVscy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB2aXJ0dWFsU2Nyb2xsSXRlbUhlaWdodCA9IDA7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaG93IG1hbnkgYWRkaXRpb25hbCBlbGVtZW50cyB0byBhZGQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSB2aWV3LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIG51bVRvbGVyYXRlZEl0ZW1zID0gMTA7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdHJlZXRhYmxlIHNob3VsZCBoYXZlIHBhZ2luYXRvci5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBwYWdpbmF0b3IgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgcGFnaW5hdG9yIGV2ZW4gdGhlcmUgaXMgb25seSBvbmUgcGFnZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBhbHdheXNTaG93UGFnaW5hdG9yID0gdHJ1ZTtcblxuICAvKipcbiAgICogQXJyYXkgb2YgaW50ZWdlciB2YWx1ZXMgdG8gZGlzcGxheSBpbnNpZGUgcm93cyBwZXIgcGFnZSBkcm9wZG93biBvZiBwYWdpbmF0b3IuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgcm93c1BlclBhZ2VPcHRpb25zOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgZmlyc3Qgcm93IHRvIGJlIGRpc3BsYXllZC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBmaXJzdCA9IDA7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkgcGVyIHBhZ2UuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgcm93cyA9IDA7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0byByZXNldCBwYWdlIG9uIHJvd3MgY2hhbmdlLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHJlc2V0UGFnZU9uUm93c0NoYW5nZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gcmVzZXQgcGFnZSBvbiB0cmVldGFibGUgZGF0YSBzb3J0aW5nLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHJlc2V0UGFnZU9uU29ydCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiB0b3RhbCByZWNvcmRzLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHRvdGFsUmVjb3JkcyA9IDA7XG5cbiAgLyoqXG4gICAqIFRleHQgdG8gZGlzcGxheSB3aGVuIHRoZXJlIGlzIG5vIGRhdGEuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgZW1wdHlNZXNzYWdlID0gJ05vIGRhdGEnO1xuXG4gIC8qKlxuICAgKiBIZWlnaHQgb2YgdHJlZXRhYmxlJ3MgYm9keSB3aGVuIHRoZXJlIGlzIG5vIGRhdGEsIG9mIHR5cGUgbnVtYmVyIGRlbm90aW5nIHBpeGVscyBvciBzdHJpbmcuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgZW1wdHlCb2R5SGVpZ2h0OiBudW1iZXIgfCBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogRGVmaW5lcyBpZiBkYXRhIGlzIGxvYWRlZCBhbmQgaW50ZXJhY3RlZCB3aXRoIGluIGxhenkgbWFubmVyLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxhenkgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNhbGwgbGF6eSBsb2FkaW5nIG9uIGluaXRpYWxpemF0aW9uLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxhenlMb2FkT25Jbml0ID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgZ2xvYmFsIGZpbHRlciBpbiB0aGUgdG9vbGJhci5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93R2xvYmFsRmlsdGVyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdsb2JhbCBmaWx0ZXIgcGxhY2Vob2xkZXIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgZ2xvYmFsRmlsdGVyUGxhY2Vob2xkZXIgPSAnU2VhcmNoJztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgZmllbGRzIHRvIHVzZSBpbiBnbG9iYWwgZmlsdGVyaW5nLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGdsb2JhbEZpbHRlckZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNsZWFyIGdsb2JhbCBmaWx0ZXIgb24gZGF0YSBsb2FkaW5nLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGNsZWFyR2xvYmFsRmlsdGVyT25Mb2FkaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0byBzaG93IHJlbW92ZSBidXR0b24gaW4gdGhlIHRvb2xiYXIgd2hlbiByb3dzIGFyZSBzZWxlY3RlZC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93UmVtb3ZlQnRuT25TZWxlY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgcmVtb3ZlQnRuT25TZWxlY3QgaXMgZGlzYWJsZWQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgcmVtb3ZlQnRuT25TZWxlY3REaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc2hvdyBhZGRpdGlvbmFsIGJ1dHRvbiBpbiB0aGUgdG9vbGJhciB3aGVuIHJvd3MgYXJlIHNlbGVjdGVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNob3dBZGRpdGlvbmFsQnRuT25TZWxlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbEJ0bk9uU2VsZWN0IHRpdGxlLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxCdG5PblNlbGVjdFRpdGxlID0gJ1NlbGVjdCBhY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsQnRuT25TZWxlY3QgaWNvbi5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBhZGRpdGlvbmFsQnRuT25TZWxlY3RJY29uID0gJyc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBhZGRpdGlvbmFsQnRuT25TZWxlY3QgaXMgZGlzYWJsZWQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgYWRkaXRpb25hbEJ0bk9uU2VsZWN0RGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgYWN0aW9uIGJ1dHRvbiBpbiB0aGUgdG9vbGJhci5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93QWN0aW9uQnRuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEFjdGlvbiBidXR0b24gdGl0bGUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgYWN0aW9uQnRuVGl0bGUgPSAnQWN0aW9uJztcblxuICAvKipcbiAgICogQWN0aW9uIGJ1dHRvbiBpY29uLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGFjdGlvbkJ0bkljb24gPSAnJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFjdGlvbkJ0biBpcyBkaXNhYmxlZC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBhY3Rpb25CdG5EaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc2hvdyBkYXRhIHJlbG9hZCBidXR0b24gaW4gdGhlIHRvb2xiYXIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2hvd0RhdGFSZWxvYWRCdG4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGRhdGFSZWxvYWRCdG4gaXMgZGlzYWJsZWQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgZGF0YVJlbG9hZEJ0bkRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdHJlZXRhYmxlIHNob3VsZCBzaG93IGNvbHVtbnNUb2dnbGUgbWVudSwgd2hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggY29sdW1ucyB0byBiZSBkaXNwbGF5ZWQuIElmIGV4dGVybmFsIGJvZHkgdGVtcGxhdGUgaXMgcHJvdmlkZWQsIHVzZSBjb2x1bW5zU2VsZWN0ZWQgZXZlbnQgZW1pdHRlci5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93Q29sdW1uc1RvZ2dsZUJ0biA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgY29sdW1uc1RvZ2dsZSBidXR0b24gaXMgZGlzYWJsZWQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgY29sdW1uc1RvZ2dsZUJ0bkRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIGluaXRpYWwgY29sdW1ucyB0byBzaG93IGluIHRoZSB0cmVldGFibGUuIElmIG5vdCBwcm92aWRlZCwgYWxsIGNvbHVtbnMgYXJlIGluaXRpYWxseSB2aXNpYmxlLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGluaXRpYWxDb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9W10gPSBbXTtcblxuICAvKipcbiAgICogRW5hYmxlIGZpbHRlcmluZyBvbiBhbGwgY29sdW1ucy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJhYmxlQnlDb2x1bW5zID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBmaWx0ZXIgdHlwZSBiYXNlZCBvbiB2YWx1ZXMsIG90aGVyd2lzZSBzZXRzICd0ZXh0JyBmaWx0ZXIgdHlwZSBmb3IgYWxsIGNvbHVtbnMuXG4gICAqIE5vdGU6IFRoaXMgc2V0dGluZyBvbmx5IHRha2VzIGVmZmVjdCBpZiAnZmlsdGVyYWJsZUJ5Q29sdW1ucycgaXMgdHJ1ZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBhdXRvQ29sdW1uRmlsdGVyVHlwZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byB0cnVlLCByb3cgZGF0YSBhcmUgcmVuZGVyZWQgdXNpbmcgaW5uZXJIVE1MLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHJlbmRlckRhdGFBc0hUTUwgPSBmYWxzZTtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBkaXNwbGF5LlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNldCBkYXRhKHZhbHVlOiBhbnlbXSkge1xuICAgIGNvbnN0IGNsb25lID0gY2xvbmVEZWVwKHZhbHVlKTtcbiAgICBpZiAoY2xvbmUgJiYgY2xvbmUubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgY2xvbmUuZm9yRWFjaCgodjogYW55KSA9PiB7XG4gICAgICAgIHYuX2RlZmF1bHRTb3J0T3JkZXIgPSBpKys7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YSA9IGNsb25lO1xuICB9XG5cbiAgZ2V0IGRhdGEoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBjb2x1bW5zIGFyZSByZXNpemFibGUuXG4gICAqIEluIGNhc2Ugb2YgdXNpbmcgYSBjdXN0b20gdGVtcGxhdGUgZm9yIGNvbHVtbnMsIGl0IGlzIGFsc28gbmVlZGVkIHRvIGFkZCBjcHNUVENvbFJlc2l6YWJsZSBkaXJlY3RpdmUgdG8gdGggZWxlbWVudHMuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgcmVzaXphYmxlQ29sdW1ucyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGhvdyB0aGUgY29sdW1ucyBhcmUgcmVzaXplZC4gSXQgY2FuIGJlICdmaXQnICh0b3RhbCB3aWR0aCBvZiB0aGUgdGFibGUgc3RheXMgdGhlIHNhbWUpIG9yICdleHBhbmQnICh0b3RhbCB3aWR0aCBvZiB0aGUgdGFibGUgY2hhbmdlcyB3aGVuIHJlc2l6aW5nIGNvbHVtbnMpLlxuICAgKiBOb3RlOiBUaGlzIHNldHRpbmcgb25seSB0YWtlcyBlZmZlY3QgaWYgJ3Jlc2l6YWJsZUNvbHVtbnMnIGlzIHRydWUuXG4gICAqXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgY29sdW1uUmVzaXplTW9kZTogJ2ZpdCcgfCAnZXhwYW5kJyA9ICdmaXQnO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugb24gc2VsZWN0ZWQgcm93cyBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7YW55W119IGFueVtdIC0gc2VsZWN0ZWQgcm93cy5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgcm93c1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYWN0aW9uIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKiBAcGFyYW0ge3ZvaWR9IHZvaWQgLSBhY3Rpb24gYnV0dG9uIGNsaWNrZWQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGFjdGlvbkJ0bkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGFkZGl0aW9uYWwgYnV0dG9uIG9uIHNlbGVjdCBpcyBjbGlja2VkLlxuICAgKiBAcGFyYW0ge2FueVtdfSBhbnlbXSAtIHNlbGVjdGVkIGRhdGEuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGFkZGl0aW9uYWxCdG5PblNlbGVjdENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBlZGl0LXJvdyBidXR0b24gaXMgY2xpY2tlZC5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIGJ1dHRvbiBjbGlja2VkLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBlZGl0Um93QnRuQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiByb3dzIGFyZSByZW1vdmVkLlxuICAgKiBAcGFyYW0ge2FueVtdfSBhbnlbXSAtIGFycmF5IG9mIHJvd3MgdG8gcmVtb3ZlLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSByb3dzVG9SZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBwYWdlIGlzIGNoYW5nZWQuXG4gICAqIEBwYXJhbSB7YW55fSBhbnkgLSBwYWdlIGNoYW5nZWQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGRhdGEgaXMgc29ydGVkLlxuICAgKiBAcGFyYW0ge2FueX0gYW55IC0gU29ydCBkYXRhLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBzb3J0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gZGF0YSBpcyBmaWx0ZXJlZC5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIEN1c3RvbSBmaWx0ZXIgZXZlbnQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGZpbHRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSBvbiBzZWxlY3RlZCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge2FueVtdfSBvYmplY3RbXSAtIHNlbGVjdGlvbiBjaGFuZ2VkLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBjb2x1bW5zU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgW2tleTogc3RyaW5nXTogYW55IH1bXT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gcGFnaW5nLCBzb3J0aW5nIG9yIGZpbHRlcmluZyBoYXBwZW5zIGluIGxhenkgbW9kZS5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIEN1c3RvbSBsYXp5IGxvYWQgZXZlbnQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGxhenlMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gZGF0YSByZWxvYWQgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqIEBwYXJhbSB7YW55fSBhbnkgLSBkYXRhIHJlbG9hZCBidXR0b24gY2xpY2tlZC5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgZGF0YVJlbG9hZEJ0bkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYSBub2RlIGlzIGV4cGFuZGVkLlxuICAgKiBAcGFyYW0ge2FueX0gYW55IC0gTm9kZSBpbnN0YW5jZS5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgbm9kZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgbm9kZSBpcyBjb2xsYXBzZWQuXG4gICAqIEBwYXJhbSB7YW55fSBhbnkgLSBOb2RlIGNvbGxhcHNlIGV2ZW50LlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBub2RlQ29sbGFwc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgbm9kZSBpcyBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIE5vZGUgaW5zdGFuY2UuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIG5vZGVTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIG5vZGUgaXMgdW5zZWxlY3RlZC5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIEN1c3RvbSBub2RlIHVuc2VsZWN0IGV2ZW50LlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBub2RlVW5zZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBjdXN0b20gc29ydGluZy4gY3VzdG9tU29ydCBtdXN0IGJlIHRydWUuXG4gICAqIEBwYXJhbSB7YW55fSBhbnkgLSBzb3J0IG1ldGEuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGN1c3RvbVNvcnRGdW5jdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAQ29udGVudENoaWxkKCd0b29sYmFyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHB1YmxpYyB0b29sYmFyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2hlYWRlcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgaGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ25lc3RlZEhlYWRlcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgbmVzdGVkSGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2JvZHknLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHVibGljIGJvZHlUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZCgnY29sZ3JvdXAnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHVibGljIGNvbGdyb3VwVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBWaWV3Q2hpbGQoJ3ByaW1lbmdUcmVlVGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcmltZW5nVHJlZVRhYmxlITogVHJlZVRhYmxlO1xuXG4gIEBWaWV3Q2hpbGQoJ2dsb2JhbEZpbHRlckNvbXAnKVxuICBnbG9iYWxGaWx0ZXJDb21wITogQ3BzSW5wdXRDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgnY29sVG9nZ2xlTWVudScpXG4gIGNvbFRvZ2dsZU1lbnUhOiBDcHNNZW51Q29tcG9uZW50O1xuXG4gIHNlbGVjdGVkQ29sdW1uczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdID0gW107XG5cbiAgcm93T3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH1bXSA9IFtdO1xuXG4gIHNlbGVjdGVkUm93czogYW55ID0gW107XG5cbiAgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gMDtcbiAgZGVmU2Nyb2xsSGVpZ2h0ID0gJyc7XG5cbiAgcHJpdmF0ZSBfZGVmU2Nyb2xsSGVpZ2h0UHggPSAwO1xuICBwcml2YXRlIF9kZWZTY3JvbGxIZWlnaHRQeEluaXRpYWwgPSAwO1xuXG4gIHByaXZhdGUgX3Jlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBfd2luZG93UmVzaXplRGVib3VuY2VyOiBhbnk7XG4gIHByaXZhdGUgX3Njcm9sbFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIF9oZWFkZXJCb3g6IGFueTtcbiAgcHJpdmF0ZSBfc2Nyb2xsYWJsZUJvZHk6IGFueTtcbiAgcHJpdmF0ZSBfc2Nyb2xsYmFyV2lkdGggPSAwO1xuICBwcml2YXRlIF9zY3JvbGxiYXJWaXNpYmxlID0gdHJ1ZTtcblxuICBwcml2YXRlIF9uZWVkUmVjYWxjQXV0b0xheW91dCA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfZGF0YTogYW55W10gPSBbXTtcblxuICBwcml2YXRlIHdpbmRvdzogV2luZG93O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNvbnN0cnVjdG9yXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIHRoaXMud2luZG93ID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldyBhcyBXaW5kb3c7XG4gICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IGVudHJ5LnRhcmdldDtcbiAgICAgICAgdGhpcy5fc2Nyb2xsYmFyVmlzaWJsZSA9IGJvZHkuc2Nyb2xsSGVpZ2h0ID4gYm9keS5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbGJhclZpc2libGUgJiYgdGhpcy52aXJ0dWFsU2Nyb2xsKVxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxhYmxlQm9keSxcbiAgICAgICAgICAgICdvdmVyZmxvdycsXG4gICAgICAgICAgICAnYXV0bycsXG4gICAgICAgICAgICBSZW5kZXJlclN0eWxlRmxhZ3MyLkltcG9ydGFudFxuICAgICAgICAgICk7XG5cbiAgICAgICAgbGV0IHdTY3JvbGwgPSB0aGlzLl9zY3JvbGxiYXJWaXNpYmxlID8gdGhpcy5fc2Nyb2xsYmFyV2lkdGggOiAwO1xuICAgICAgICBpZiAod1Njcm9sbCA+IDApIHdTY3JvbGwgLT0gMTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuX2hlYWRlckJveCxcbiAgICAgICAgICAncGFkZGluZy1yaWdodCcsXG4gICAgICAgICAgYCR7d1Njcm9sbH1weGBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICB0aGlzLl9oZWFkZXJCb3gsXG4gICAgICAgICAgJ2JvcmRlci1yaWdodCcsXG4gICAgICAgICAgd1Njcm9sbCA+IDAgPyAnMXB4IHNvbGlkICNkN2Q1ZDUnIDogJ3Vuc2V0J1xuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY3JvbGxhYmxlKSB0aGlzLnZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcbiAgICB0aGlzLmVtcHR5Qm9keUhlaWdodCA9IGNvbnZlcnRTaXplKHRoaXMuZW1wdHlCb2R5SGVpZ2h0KTtcbiAgICB0aGlzLm1pbldpZHRoID0gY29udmVydFNpemUodGhpcy5taW5XaWR0aCk7XG5cbiAgICBpZiAodGhpcy5zaG93QWRkaXRpb25hbEJ0bk9uU2VsZWN0KSB0aGlzLnNob3dSZW1vdmVCdG5PblNlbGVjdCA9IGZhbHNlO1xuXG4gICAgdGhpcy5kZWZTY3JvbGxIZWlnaHQgPSB0aGlzLnNjcm9sbEhlaWdodDtcbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZS5iaW5kKHRoaXMpKTtcblxuICAgICAgaWYgKHRoaXMuZGVmU2Nyb2xsSGVpZ2h0ICYmIHRoaXMuZGVmU2Nyb2xsSGVpZ2h0ICE9PSAnZmxleCcpIHtcbiAgICAgICAgdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHggPSBwYXJzZUludCh0aGlzLnNjcm9sbEhlaWdodCwgMTApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgaWYgKHRoaXMucm93c1BlclBhZ2VPcHRpb25zLmxlbmd0aCA8IDEpXG4gICAgICAgIHRoaXMucm93c1BlclBhZ2VPcHRpb25zID0gWzUsIDEwLCAyNSwgNTBdO1xuXG4gICAgICBpZiAoIXRoaXMucm93cykgdGhpcy5yb3dzID0gdGhpcy5yb3dzUGVyUGFnZU9wdGlvbnNbMF07XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvd3NQZXJQYWdlT3B0aW9ucy5pbmNsdWRlcyh0aGlzLnJvd3MpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyb3dzUGVyUGFnZU9wdGlvbnMgbXVzdCBpbmNsdWRlIHJvd3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJvd09wdGlvbnMgPSB0aGlzLnJvd3NQZXJQYWdlT3B0aW9ucy5tYXAoKHYpID0+ICh7XG4gICAgICAgIGxhYmVsOiAnJyArIHYsXG4gICAgICAgIHZhbHVlOiB2XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG93R2xvYmFsRmlsdGVyICYmXG4gICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcz8ubGVuZ3RoIDwgMSAmJlxuICAgICAgdGhpcy5kYXRhPy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcyA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YVswXS5kYXRhKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9XG4gICAgICB0aGlzLmluaXRpYWxDb2x1bW5zLmxlbmd0aCA+IDAgPyB0aGlzLmluaXRpYWxDb2x1bW5zIDogdGhpcy5jb2x1bW5zO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NldE1pbldpZHRoT3ZlcmFsbCgpO1xuXG4gICAgdGhpcy5fc2Nyb2xsYWJsZUJvZHkgPSB0aGlzLnByaW1lbmdUcmVlVGFibGUuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJy5wLXRyZWV0YWJsZS1zY3JvbGxhYmxlLWJvZHknXG4gICAgKTtcbiAgICBpZiAodGhpcy5fc2Nyb2xsYWJsZUJvZHkpIHtcbiAgICAgIGlmICh0aGlzLm1pbldpZHRoRm9yQm9keU9ubHkgJiYgdGhpcy5taW5XaWR0aCkge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuX3Njcm9sbGFibGVCb2R5LnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0YWJsZSwgJ21pbi13aWR0aCcsIHRoaXMubWluV2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgIGlmICh0aGlzLmRlZlNjcm9sbEhlaWdodCA9PT0gJ2ZsZXgnKSB7XG4gICAgICAgICAgdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHggPSB0aGlzLl9zY3JvbGxhYmxlQm9keS5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHhJbml0aWFsID0gdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXV0b0xheW91dCkge1xuICAgICAgICAgIHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiA9IGZyb21FdmVudChcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbGFibGVCb2R5LFxuICAgICAgICAgICAgJ3Njcm9sbCdcbiAgICAgICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9oZWFkZXJCb3ggPSB0aGlzLnByaW1lbmdUcmVlVGFibGUuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLnAtdHJlZXRhYmxlLXNjcm9sbGFibGUtaGVhZGVyLWJveCdcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLl9oZWFkZXJCb3gpIHtcbiAgICAgICAgaWYgKHRoaXMubWluV2lkdGhGb3JCb2R5T25seSAmJiB0aGlzLm1pbldpZHRoKSB7XG4gICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLl9oZWFkZXJCb3gucXVlcnlTZWxlY3RvcigndGFibGUnKTtcbiAgICAgICAgICBpZiAodGFibGUpIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGFibGUsICdtaW4td2lkdGgnLCB0aGlzLm1pbldpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gRG9tSGFuZGxlci5jYWxjdWxhdGVTY3JvbGxiYXJXaWR0aCgpO1xuICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuX3Njcm9sbGFibGVCb2R5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX25lZWRSZWNhbGNBdXRvTGF5b3V0KSB7XG4gICAgICAgIHRoaXMuX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKCk7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zY3JvbGxhYmxlKSB7XG4gICAgICBjb25zdCB0YWJsZVdyYXBwZXIgPVxuICAgICAgICB0aGlzLnByaW1lbmdUcmVlVGFibGUuZWw/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgJy5wLXRyZWV0YWJsZS13cmFwcGVyJ1xuICAgICAgICApO1xuICAgICAgaWYgKHRhYmxlV3JhcHBlciAmJiB0aGlzLm1pbldpZHRoRm9yQm9keU9ubHkgJiYgdGhpcy5taW5XaWR0aCkge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRhYmxlV3JhcHBlci5xdWVyeVNlbGVjdG9yKCd0YWJsZScpO1xuICAgICAgICBpZiAodGFibGUpIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGFibGUsICdtaW4td2lkdGgnLCB0aGlzLm1pbldpZHRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuX25lZWRSZWNhbGNBdXRvTGF5b3V0KSB7XG4gICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocygpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuX2RlZlNjcm9sbEhlaWdodFB4ICYmIHRoaXMuZGVmU2Nyb2xsSGVpZ2h0ID09PSAnZmxleCcpIHtcbiAgICAgIHRoaXMuX2RlZlNjcm9sbEhlaWdodFB4ID0gdGhpcy5fc2Nyb2xsYWJsZUJvZHkuY2xpZW50SGVpZ2h0O1xuICAgICAgdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHhJbml0aWFsID0gdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHg7XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbEl0ZW1TaXplKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVjYWxjVmlydHVhbEhlaWdodCgpO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICBpZiAodGhpcy5jbGVhckdsb2JhbEZpbHRlck9uTG9hZGluZykgdGhpcy5jbGVhckdsb2JhbEZpbHRlcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxJdGVtSGVpZ2h0KVxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSB0aGlzLnZpcnR1YWxTY3JvbGxJdGVtSGVpZ2h0O1xuXG4gICAgdGhpcy5fc2V0TWluV2lkdGhPdmVyYWxsKCk7XG5cbiAgICBjb25zdCBkYXRhQ2hhbmdlcyA9IGNoYW5nZXM/LmRhdGE7XG5cbiAgICBpZiAoZGF0YUNoYW5nZXM/LnByZXZpb3VzVmFsdWUgIT09IGRhdGFDaGFuZ2VzPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKHRydWUpO1xuICAgIHRoaXMuX3JlY2FsY1ZpcnR1YWxIZWlnaHQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgaWYgKHRoaXMuYXV0b0xheW91dCkgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ3Jlc2l6ZScsXG4gICAgICAgIHRoaXMuX29uV2luZG93UmVzaXplLmJpbmQodGhpcylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2FsY0F1dG9MYXlvdXRIZWFkZXJXaWR0aHMoZm9yY2VkID0gZmFsc2UpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXV0b0xheW91dCB8fCAhdGhpcy5zY3JvbGxhYmxlKSByZXR1cm47XG5cbiAgICAgIGlmICghdGhpcy5fbmVlZFJlY2FsY0F1dG9MYXlvdXQgJiYgIWZvcmNlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBoZWFkZXJSb3dzID0gdGhpcy5faGVhZGVyQm94Py5xdWVyeVNlbGVjdG9yQWxsKCd0cicpO1xuICAgICAgaWYgKCFoZWFkZXJSb3dzPy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgY29uc3QgaGVhZGVyQ2VsbHMgPVxuICAgICAgICBoZWFkZXJSb3dzW2hlYWRlclJvd3MubGVuZ3RoIC0gMV0/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJyk7XG4gICAgICBpZiAoIWhlYWRlckNlbGxzPy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgbGV0IGhhc1NlbGVjdGFibGVDZWxsID0gZmFsc2U7XG4gICAgICBsZXQgaGFzUm93TWVudUNlbGwgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdGhzID0gQXJyYXkuZnJvbShoZWFkZXJDZWxscyk7XG4gICAgICBpZiAodGhzLmV2ZXJ5KCh0aDogYW55KSA9PiB0aC5vZmZzZXRXaWR0aCA9PT0gMCkpIHJldHVybjtcblxuICAgICAgY29uc3QgdGhXaWR0aHMgPSB0aHMubWFwKCh0aDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHdwcmV2ID0gdGguc3R5bGUud2lkdGg7XG5cbiAgICAgICAgY29uc3QgaXNTZWxlY3RhYmxlQ2VsbCA9IHRoLmNsYXNzTGlzdC5jb250YWlucyhcbiAgICAgICAgICAnY3BzLXRyZWV0YWJsZS1zZWxlY3RhYmxlLWNlbGwnXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaXNSb3dDZWxsID0gdGguY2xhc3NMaXN0LmNvbnRhaW5zKCdjcHMtdHJlZXRhYmxlLXJvdy1tZW51LWNlbGwnKTtcblxuICAgICAgICBpZiAoaXNTZWxlY3RhYmxlQ2VsbCkgaGFzU2VsZWN0YWJsZUNlbGwgPSB0cnVlO1xuICAgICAgICBpZiAoaXNSb3dDZWxsKSBoYXNSb3dNZW51Q2VsbCA9IHRydWU7XG5cbiAgICAgICAgbGV0IHRoV2lkdGggPSA1NTtcbiAgICAgICAgaWYgKCFpc1NlbGVjdGFibGVDZWxsICYmICFpc1Jvd0NlbGwpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoLCAnd2lkdGgnLCAnbWluLWNvbnRlbnQnKTtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoLCAnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGgsICd0ZXh0LXdyYXAnLCAnbm93cmFwJyk7XG4gICAgICAgICAgdGhXaWR0aCA9IHRoLm9mZnNldFdpZHRoO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGgsICd3aWR0aCcsIHdwcmV2KTtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoLCAnZGlzcGxheScpO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodGgsICd0ZXh0LXdyYXAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhXaWR0aDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBib2R5Um93cyA9IHRoaXMuX3Njcm9sbGFibGVCb2R5Py5xdWVyeVNlbGVjdG9yQWxsKCd0cicpO1xuICAgICAgaWYgKCFib2R5Um93cz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRkV2lkdGhzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgIGNvbnN0IGhpZGRlbkRpdiA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBoaWRkZW5EaXYuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgaGlkZGVuRGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgIGhpZGRlbkRpdi5zdHlsZS53aGl0ZVNwYWNlID0gJ25vd3JhcCc7XG5cbiAgICAgIHRoaXMuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoaWRkZW5EaXYpO1xuICAgICAgYm9keVJvd3MuZm9yRWFjaCgodHI6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRkcyA9IHRyPy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpO1xuICAgICAgICB0ZHM/LmZvckVhY2goKHRkOiBIVE1MRWxlbWVudCwgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGFibGVPclJvd01lbnVDZWxsID1cbiAgICAgICAgICAgIHRkLmNsYXNzTGlzdC5jb250YWlucygnY3BzLXRyZWV0YWJsZS1zZWxlY3RhYmxlLWNlbGwnKSB8fFxuICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjcHMtdHJlZXRhYmxlLXJvdy1tZW51LWNlbGwnKTtcblxuICAgICAgICAgIGxldCB0ZFdpZHRoID0gNTU7XG4gICAgICAgICAgaWYgKCFpc1NlbGVjdGFibGVPclJvd01lbnVDZWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjbG9uZWRUZCA9IHRkLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNsb25lZFRkKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY2xvbmVkVGQsICd3aWR0aCcsICdtaW4tY29udGVudCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjbG9uZWRUZCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgICAgIGhpZGRlbkRpdi5pbm5lckhUTUwgPSBjbG9uZWRUZC5pbm5lckhUTUw7XG4gICAgICAgICAgICBoaWRkZW5EaXYuc3R5bGUud2lkdGggPSAnYXV0byc7XG4gICAgICAgICAgICB0ZFdpZHRoID0gaGlkZGVuRGl2Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgZnJhZ21lbnQucmVtb3ZlQ2hpbGQoY2xvbmVkVGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRkV2lkdGhzW2lkeF0pIHRkV2lkdGhzW2lkeF0gPSAwO1xuICAgICAgICAgIHRkV2lkdGhzW2lkeF0gPSBNYXRoLm1heCh0ZFdpZHRoc1tpZHhdLCB0ZFdpZHRoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChoaWRkZW5EaXYpO1xuXG4gICAgICBpZiAodGhXaWR0aHMubGVuZ3RoICE9PSB0ZFdpZHRocy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgY29uc3QgbWF4V2lkdGhzID0gdGhXaWR0aHMubWFwKCh2LCBpZHgpID0+IE1hdGgubWF4KHYsIHRkV2lkdGhzW2lkeF0pKTtcbiAgICAgIGxldCBzdW0gPSBtYXhXaWR0aHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgICBpZiAoaGFzU2VsZWN0YWJsZUNlbGwpIHtcbiAgICAgICAgc3VtIC09IDU1O1xuICAgICAgICBtYXhXaWR0aHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNSb3dNZW51Q2VsbCkge1xuICAgICAgICBzdW0gLT0gNTU7XG4gICAgICAgIG1heFdpZHRocy5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGVyY2VudGFnZXMgPSBtYXhXaWR0aHMubWFwKCh2KSA9PiAodiAvIHN1bSkgKiAxMDApO1xuXG4gICAgICBoZWFkZXJDZWxscy5mb3JFYWNoKCh0aDogYW55LCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKGhhc1NlbGVjdGFibGVDZWxsICYmIGlkeCA9PT0gMCkgfHxcbiAgICAgICAgICAoaGFzUm93TWVudUNlbGwgJiYgaWR4ID09PSBoZWFkZXJDZWxscy5sZW5ndGggLSAxKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoLCAnd2lkdGgnLCAnNTVweCcpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgICAgdGgsXG4gICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgcGVyY2VudGFnZXNbaGFzU2VsZWN0YWJsZUNlbGwgPyBpZHggLSAxIDogaWR4XSArICclJ1xuICAgICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgYm9keVJvd3MuZm9yRWFjaCgodHI6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRkcyA9IHRyPy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpO1xuICAgICAgICB0ZHM/LmZvckVhY2goKHRkOiBIVE1MRWxlbWVudCwgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoaGFzU2VsZWN0YWJsZUNlbGwgJiYgaWR4ID09PSAwKSB8fFxuICAgICAgICAgICAgKGhhc1Jvd01lbnVDZWxsICYmIGlkeCA9PT0gdGRzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRkLCAnd2lkdGgnLCAnNTVweCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgICAgICB0ZCxcbiAgICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICAgcGVyY2VudGFnZXNbaGFzU2VsZWN0YWJsZUNlbGwgPyBpZHggLSAxIDogaWR4XSArICclJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0ZCwgJ29wYWNpdHknLCAnMScpO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGQsICdvdmVyZmxvdycsICdoaWRkZW4nKTtcbiAgICAgICAgICBpZiAodGhpcy5ib3JkZXJlZClcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgIHRkLFxuICAgICAgICAgICAgICAnYm9yZGVyLWxlZnQtY29sb3InLFxuICAgICAgICAgICAgICAndmFyKC0tY3BzLWNvbG9yLWxpbmUtbWlkKSdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX25lZWRSZWNhbGNBdXRvTGF5b3V0ID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKSB7XG4gICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGwgfHwgdGhpcy52aXJ0dWFsU2Nyb2xsSXRlbUhlaWdodCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJzID0gdGhpcy5wcmltZW5nVHJlZVRhYmxlPy5lbD8ubmF0aXZlRWxlbWVudFxuICAgICAgPy5xdWVyeVNlbGVjdG9yKCcucC10cmVldGFibGUtdGJvZHknKVxuICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0cicpO1xuXG4gICAgaWYgKCF0cnM/Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGlmICghdHJzWzBdPy5vZmZzZXRIZWlnaHQpIHJldHVybjtcblxuICAgIGxldCBoID0gMDtcbiAgICB0cnMuZm9yRWFjaCgodHI6IEhUTUxFbGVtZW50LCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHJoID0gMDtcbiAgICAgIGNvbnN0IHRkcyA9IHRyPy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpO1xuICAgICAgdGRzPy5mb3JFYWNoKCh0ZDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3Qgd3ByZXYgPSB0ZC5zdHlsZS53aWR0aDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0ZCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0ZCwgJ3dpZHRoJyk7XG4gICAgICAgIGlmICh0ZC5vZmZzZXRIZWlnaHQpIHJoID0gTWF0aC5tYXgocmgsIHRkLm9mZnNldEhlaWdodCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodGQsICdkaXNwbGF5Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGQsICd3aWR0aCcsIHdwcmV2KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHJoKSB7XG4gICAgICAgIGggPSBpZHggPT09IDAgPyByaCA6IE1hdGgubWluKGgsIHJoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldE1pbldpZHRoT3ZlcmFsbCgpIHtcbiAgICBpZiAodGhpcy5taW5XaWR0aEZvckJvZHlPbmx5IHx8ICF0aGlzLm1pbldpZHRoIHx8ICF0aGlzLnByaW1lbmdUcmVlVGFibGUpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCB0cmVlVGFibGVNYWluID1cbiAgICAgIHRoaXMucHJpbWVuZ1RyZWVUYWJsZS5lbD8ubmF0aXZlRWxlbWVudD8ucXVlcnlTZWxlY3RvcignLnAtdHJlZXRhYmxlJyk7XG4gICAgaWYgKHRyZWVUYWJsZU1haW4pIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodHJlZVRhYmxlTWFpbiwgJ292ZXJmbG93JywgJ2F1dG8nKTtcbiAgICAgIGNvbnN0IHBhZ2luYXRvckVsID0gdHJlZVRhYmxlTWFpbi5xdWVyeVNlbGVjdG9yKCcucC1wYWdpbmF0b3InKTtcbiAgICAgIGlmIChwYWdpbmF0b3JFbClcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwYWdpbmF0b3JFbCwgJ21pbi13aWR0aCcsIHRoaXMubWluV2lkdGgpO1xuICAgICAgY29uc3QgbG9hZGluZ092ZXJsYXkgPSB0cmVlVGFibGVNYWluLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcucC10cmVldGFibGUtbG9hZGluZy1vdmVybGF5J1xuICAgICAgKTtcbiAgICAgIGlmIChsb2FkaW5nT3ZlcmxheSlcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShsb2FkaW5nT3ZlcmxheSwgJ21pbi13aWR0aCcsIHRoaXMubWluV2lkdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjcm9sbGFibGVXcmFwcGVyID1cbiAgICAgIHRoaXMucHJpbWVuZ1RyZWVUYWJsZS5lbD8ubmF0aXZlRWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJy5wLXRyZWV0YWJsZS1zY3JvbGxhYmxlLXdyYXBwZXInXG4gICAgICApO1xuICAgIGlmIChzY3JvbGxhYmxlV3JhcHBlcilcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc2Nyb2xsYWJsZVdyYXBwZXIsICdtaW4td2lkdGgnLCB0aGlzLm1pbldpZHRoKTtcblxuICAgIGlmICghdGhpcy5zY3JvbGxhYmxlKSB7XG4gICAgICBjb25zdCB0YWJsZVdyYXBwZXIgPVxuICAgICAgICB0aGlzLnByaW1lbmdUcmVlVGFibGUuZWw/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgJy5wLXRyZWV0YWJsZS13cmFwcGVyJ1xuICAgICAgICApO1xuICAgICAgaWYgKHRhYmxlV3JhcHBlcilcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0YWJsZVdyYXBwZXIsICdtaW4td2lkdGgnLCB0aGlzLm1pbldpZHRoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmVlVGFibGVIZWFkZXIgPVxuICAgICAgdGhpcy5wcmltZW5nVHJlZVRhYmxlLmVsPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLnAtdHJlZXRhYmxlLWhlYWRlcidcbiAgICAgICk7XG4gICAgaWYgKHRyZWVUYWJsZUhlYWRlcilcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodHJlZVRhYmxlSGVhZGVyLCAnbWluLXdpZHRoJywgdGhpcy5taW5XaWR0aCk7XG4gIH1cblxuICBwcml2YXRlIF9vbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICAvLyBpZiAodGhpcy5kZWZTY3JvbGxIZWlnaHQgPT09ICdmbGV4JylcbiAgICAvLyAgIHRoaXMuZGVmU2Nyb2xsSGVpZ2h0UHggPSB0aGlzLnNjcm9sbGFibGVCb2R5LmNsaWVudEhlaWdodDtcblxuICAgIGNsZWFyVGltZW91dCh0aGlzLl93aW5kb3dSZXNpemVEZWJvdW5jZXIpO1xuICAgIHRoaXMuX3dpbmRvd1Jlc2l6ZURlYm91bmNlciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVjYWxjVmlydHVhbEhlaWdodCgpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBnZXQgc3R5bGVDbGFzcygpIHtcbiAgICBjb25zdCBjbGFzc2VzTGlzdCA9IFtdO1xuICAgIHN3aXRjaCAodGhpcy5zaXplKSB7XG4gICAgICBjYXNlICdzbWFsbCc6XG4gICAgICAgIGNsYXNzZXNMaXN0LnB1c2goJ3AtdHJlZXRhYmxlLXNtJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGFyZ2UnOlxuICAgICAgICBjbGFzc2VzTGlzdC5wdXNoKCdwLXRyZWV0YWJsZS1sZycpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzVG9vbGJhcikge1xuICAgICAgc3dpdGNoICh0aGlzLnRvb2xiYXJTaXplKSB7XG4gICAgICAgIGNhc2UgJ3NtYWxsJzpcbiAgICAgICAgICBjbGFzc2VzTGlzdC5wdXNoKCdjcHMtdGJhci1zbWFsbCcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdub3JtYWwnOlxuICAgICAgICAgIGNsYXNzZXNMaXN0LnB1c2goJ2Nwcy10YmFyLW5vcm1hbCcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zdHJpcGVkKSB7XG4gICAgICBjbGFzc2VzTGlzdC5wdXNoKCdwLXRyZWV0YWJsZS1zdHJpcGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJvcmRlcmVkKSB7XG4gICAgICBjbGFzc2VzTGlzdC5wdXNoKCdwLXRyZWV0YWJsZS1ncmlkbGluZXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3Nlc0xpc3Quam9pbignICcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVjYWxjVmlydHVhbEhlaWdodCgpIHtcbiAgICBpZiAoIXRoaXMuX3Njcm9sbGJhclZpc2libGUgJiYgdGhpcy52aXJ0dWFsU2Nyb2xsKVxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5fc2Nyb2xsYWJsZUJvZHksXG4gICAgICAgICdvdmVyZmxvdycsXG4gICAgICAgICdoaWRkZW4nLFxuICAgICAgICBSZW5kZXJlclN0eWxlRmxhZ3MyLkltcG9ydGFudFxuICAgICAgKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCAmJiB0aGlzLmRlZlNjcm9sbEhlaWdodCkge1xuICAgICAgICB0aGlzLl91cGRhdGVWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKTtcbiAgICAgICAgY29uc3QgaXRlbXNMZW4gPSB0aGlzLnByaW1lbmdUcmVlVGFibGUuc2VyaWFsaXplZFZhbHVlPy5sZW5ndGggfHwgMDtcbiAgICAgICAgaWYgKGl0ZW1zTGVuIDwgMSkge1xuICAgICAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gdGhpcy5lbXB0eUJvZHlIZWlnaHRcbiAgICAgICAgICAgID8gKGBjYWxjKCR7dGhpcy5lbXB0eUJvZHlIZWlnaHR9ICsgMXB4KWAgYXMgc3RyaW5nKVxuICAgICAgICAgICAgOiB0aGlzLnZpcnR1YWxTY3JvbGxJdGVtU2l6ZSArIDEgKyAncHgnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGN1ckhlaWdodCA9IHRoaXMudmlydHVhbFNjcm9sbEl0ZW1TaXplICogaXRlbXNMZW4gKyAyO1xuICAgICAgICAgIGlmICh0aGlzLmRlZlNjcm9sbEhlaWdodCA9PT0gJ2ZsZXgnKSB7XG4gICAgICAgICAgICBpZiAoY3VySGVpZ2h0ID49IHRoaXMuX2RlZlNjcm9sbEhlaWdodFB4SW5pdGlhbCkge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbEhlaWdodCA9ICdmbGV4JztcbiAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9zY3JvbGxhYmxlQm9keSwgJ2hlaWdodCcsICcxMDAlJyk7XG4gICAgICAgICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zY3JvbGxIZWlnaHQgPVxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHgsIGN1ckhlaWdodCkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGVhckdsb2JhbEZpbHRlcigpIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlckNvbXA/LmNsZWFyKCk7XG4gIH1cblxuICBvblNvcnRGdW5jdGlvbihldmVudDogVHJlZVRhYmxlU29ydEV2ZW50KSB7XG4gICAgdGhpcy5jdXN0b21Tb3J0RnVuY3Rpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBvbkZpbHRlckdsb2JhbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcmltZW5nVHJlZVRhYmxlLmZpbHRlckdsb2JhbCh2YWx1ZSwgJ2NvbnRhaW5zJyk7XG4gIH1cblxuICBvbkNsaWNrQWRkaXRpb25hbEJ0bk9uU2VsZWN0KCkge1xuICAgIHRoaXMuYWRkaXRpb25hbEJ0bk9uU2VsZWN0Q2xpY2tlZC5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIG9uQ2xpY2tBY3Rpb25CdG4oKSB7XG4gICAgdGhpcy5hY3Rpb25CdG5DbGlja2VkLmVtaXQoKTtcbiAgfVxuXG4gIG9uUmVsb2FkRGF0YSgpIHtcbiAgICBpZiAodGhpcy5kYXRhUmVsb2FkQnRuRGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLmRhdGFSZWxvYWRCdG5DbGlja2VkLmVtaXQoKTtcbiAgfVxuXG4gIG9uQ29sdW1uc1RvZ2dsZShldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuY29sdW1uc1RvZ2dsZUJ0bkRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy5jb2xUb2dnbGVNZW51Py50b2dnbGUoZXZlbnQpO1xuICB9XG5cbiAgcmVtb3ZlU2VsZWN0ZWQoKSB7XG4gICAgdGhpcy5yb3dzVG9SZW1vdmUuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFtdO1xuICB9XG5cbiAgb25FZGl0Um93Q2xpY2tlZChub2RlOiBhbnkpIHtcbiAgICB0aGlzLmVkaXRSb3dCdG5DbGlja2VkLmVtaXQobm9kZSk7XG4gIH1cblxuICBvblJlbW92ZVJvd0NsaWNrZWQobm9kZTogYW55KSB7XG4gICAgdGhpcy5yb3dzVG9SZW1vdmUuZW1pdChbbm9kZV0pO1xuICB9XG5cbiAgdG9nZ2xlQWxsQ29sdW1ucygpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9XG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPCB0aGlzLmNvbHVtbnMubGVuZ3RoID8gdGhpcy5jb2x1bW5zIDogW107XG4gICAgdGhpcy5jb2x1bW5zU2VsZWN0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkQ29sdW1ucyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQ29sdW1uU2VsZWN0ZWQoY29sOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvbHVtbnMuc29tZSgoaXRlbSkgPT4gaXNFcXVhbChpdGVtLCBjb2wpKTtcbiAgfVxuXG4gIG9uUm93c1BlclBhZ2VDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLnJlc2V0UGFnZU9uUm93c0NoYW5nZSkge1xuICAgICAgdGhpcy5wcmltZW5nVHJlZVRhYmxlLmZpcnN0ID0gMDtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VQYWdlKHRoaXMuZ2V0UGFnZSgpKTtcbiAgfVxuXG4gIGdldFBhZ2VDb3VudCgpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMucHJpbWVuZ1RyZWVUYWJsZS50b3RhbFJlY29yZHMgLyB0aGlzLnJvd3MpO1xuICB9XG5cbiAgZ2V0UGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMucHJpbWVuZ1RyZWVUYWJsZS5maXJzdCAvIHRoaXMucm93cyk7XG4gIH1cblxuICBjaGFuZ2VQYWdlKHA6IG51bWJlcikge1xuICAgIGNvbnN0IHBjID0gTWF0aC5jZWlsKHRoaXMuZ2V0UGFnZUNvdW50KCkpO1xuXG4gICAgaWYgKHAgPj0gMCAmJiBwIDwgcGMpIHtcbiAgICAgIHRoaXMuZmlyc3QgPSB0aGlzLnJvd3MgKiBwO1xuICAgICAgdGhpcy5wcmltZW5nVHJlZVRhYmxlLm9uUGFnZUNoYW5nZSh7XG4gICAgICAgIGZpcnN0OiB0aGlzLmZpcnN0LFxuICAgICAgICByb3dzOiB0aGlzLnJvd3NcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShldmVudDogYW55KSB7XG4gICAgdGhpcy5maXJzdCA9IGV2ZW50LmZpcnN0O1xuICAgIHRoaXMucm93cyA9IGV2ZW50LnJvd3M7XG5cbiAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgIHBhZ2U6IHRoaXMuZ2V0UGFnZSgpLFxuICAgICAgZmlyc3Q6IHRoaXMuZmlyc3QsXG4gICAgICByb3dzOiB0aGlzLnJvd3MsXG4gICAgICBwYWdlQ291bnQ6IE1hdGguY2VpbCh0aGlzLmdldFBhZ2VDb3VudCgpKVxuICAgIH07XG5cbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQoc3RhdGUpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fY2FsY0F1dG9MYXlvdXRIZWFkZXJXaWR0aHModHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBvbkxhenlMb2FkZWQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubGF6eUxvYWRlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uTm9kZUV4cGFuZGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm5vZGVFeHBhbmRlZC5lbWl0KGV2ZW50KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKHRydWUpO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlY2FsY1ZpcnR1YWxIZWlnaHQoKTtcbiAgfVxuXG4gIG9uTm9kZUNvbGxhcHNlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5ub2RlQ29sbGFwc2VkLmVtaXQoZXZlbnQpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fY2FsY0F1dG9MYXlvdXRIZWFkZXJXaWR0aHModHJ1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVjYWxjVmlydHVhbEhlaWdodCgpO1xuICB9XG5cbiAgb25Ob2RlU2VsZWN0ZWQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubm9kZVNlbGVjdGVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25Ob2RlVW5zZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5ub2RlVW5zZWxlY3RlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uU29ydChldmVudDogYW55KSB7XG4gICAgdGhpcy5zb3J0ZWQuZW1pdChldmVudCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgb25GaWx0ZXIoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZmlsdGVyZWQuZW1pdChldmVudCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZWNhbGNWaXJ0dWFsSGVpZ2h0KCk7XG4gIH1cblxuICBvblNlbGVjdENvbHVtbihjb2w6IGFueSkge1xuICAgIGxldCByZXMgPSBbXSBhcyBhbnk7XG4gICAgaWYgKHRoaXMuaXNDb2x1bW5TZWxlY3RlZChjb2wpKSB7XG4gICAgICByZXMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoKHY6IGFueSkgPT4gIWlzRXF1YWwodiwgY29sKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChvKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5zb21lKCh2OiBhbnkpID0+IGlzRXF1YWwodiwgbykpIHx8XG4gICAgICAgICAgaXNFcXVhbChjb2wsIG8pXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcy5wdXNoKG8pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSByZXM7XG4gICAgdGhpcy5jb2x1bW5zU2VsZWN0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkQ29sdW1ucyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb246IGFueSkge1xuICAgIGlmIChzZWxlY3Rpb24gJiYgIUFycmF5LmlzQXJyYXkoc2VsZWN0aW9uKSkgc2VsZWN0aW9uID0gW3NlbGVjdGlvbl07XG4gICAgdGhpcy5yb3dzU2VsZWN0ZWQuZW1pdChzZWxlY3Rpb24pO1xuICB9XG59XG4iLCI8cC10cmVlVGFibGVcbiAgI3ByaW1lbmdUcmVlVGFibGVcbiAgdHRXaXRoVW5zb3J0XG4gIFtuZ0NsYXNzXT1cIntcbiAgICAnY3BzLXRyZWV0YWJsZS1sb2FkaW5nJzogbG9hZGluZyxcbiAgICAnY3BzLXRyZWV0YWJsZS1mbGV4JzogZGVmU2Nyb2xsSGVpZ2h0ID09PSAnZmxleCcsXG4gICAgJ2Nwcy10cmVldGFibGUtbm9udmlydHVhbCc6ICF2aXJ0dWFsU2Nyb2xsLFxuICAgICdjcHMtdHJlZXRhYmxlLWF1dG9sYXlvdXQtY2FsY2VkJzogYXV0b0xheW91dCAmJiBzY3JvbGxhYmxlXG4gIH1cIlxuICBbdmFsdWVdPVwiZGF0YVwiXG4gIFthdXRvTGF5b3V0XT1cImF1dG9MYXlvdXQgJiYgIXNjcm9sbGFibGVcIlxuICBbc2Nyb2xsYWJsZV09XCJzY3JvbGxhYmxlXCJcbiAgW3Njcm9sbEhlaWdodF09XCJzY3JvbGxIZWlnaHRcIlxuICBbdmlydHVhbFNjcm9sbF09XCJ2aXJ0dWFsU2Nyb2xsXCJcbiAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemVcIlxuICBbdmlydHVhbFNjcm9sbE9wdGlvbnNdPVwie1xuICAgIG51bVRvbGVyYXRlZEl0ZW1zOiBudW1Ub2xlcmF0ZWRJdGVtcyxcbiAgICBhdXRvU2l6ZTogZmFsc2VcbiAgfVwiXG4gIFtjb2x1bW5zXT1cInNlbGVjdGVkQ29sdW1uc1wiXG4gIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICBbcm93SG92ZXJdPVwicm93SG92ZXJcIlxuICBbbGF6eV09XCJsYXp5XCJcbiAgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkUm93c1wiXG4gIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIlxuICBjb21wYXJlU2VsZWN0aW9uQnk9XCJkZWVwRXF1YWxzXCJcbiAgW2xhenlMb2FkT25Jbml0XT1cImxhenlMb2FkT25Jbml0XCJcbiAgW3N0eWxlQ2xhc3NdPVwic3R5bGVDbGFzc1wiXG4gIFt0YWJsZVN0eWxlXT1cInRhYmxlU3R5bGVcIlxuICBbdGFibGVTdHlsZUNsYXNzXT1cInRhYmxlU3R5bGVDbGFzc1wiXG4gIFtjdXN0b21Tb3J0XT1cImN1c3RvbVNvcnRcIlxuICBbc29ydE1vZGVdPVwic29ydE1vZGVcIlxuICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImdsb2JhbEZpbHRlckZpZWxkc1wiXG4gIFtwYWdpbmF0b3JdPVwicGFnaW5hdG9yXCJcbiAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcbiAgW2Fsd2F5c1Nob3dQYWdpbmF0b3JdPVwiYWx3YXlzU2hvd1BhZ2luYXRvclwiXG4gIFtyb3dzXT1cInJvd3NcIlxuICBbZmlyc3RdPVwiZmlyc3RcIlxuICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3Jkc1wiXG4gIFtyZXNldFBhZ2VPblNvcnRdPVwicmVzZXRQYWdlT25Tb3J0XCJcbiAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwicmVzaXphYmxlQ29sdW1uc1wiXG4gIFtjb2x1bW5SZXNpemVNb2RlXT1cImNvbHVtblJlc2l6ZU1vZGVcIlxuICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSAtIHtsYXN0fSBvZiB7dG90YWxSZWNvcmRzfVwiXG4gIChvblBhZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAob25Tb3J0KT1cIm9uU29ydCgkZXZlbnQpXCJcbiAgKG9uRmlsdGVyKT1cIm9uRmlsdGVyKCRldmVudClcIlxuICAob25MYXp5TG9hZCk9XCJvbkxhenlMb2FkZWQoJGV2ZW50KVwiXG4gIChzb3J0RnVuY3Rpb24pPVwib25Tb3J0RnVuY3Rpb24oJGV2ZW50KVwiXG4gIChvbk5vZGVFeHBhbmQpPVwib25Ob2RlRXhwYW5kZWQoJGV2ZW50KVwiXG4gIChvbk5vZGVDb2xsYXBzZSk9XCJvbk5vZGVDb2xsYXBzZWQoJGV2ZW50KVwiXG4gIChvbk5vZGVTZWxlY3QpPVwib25Ob2RlU2VsZWN0ZWQoJGV2ZW50KVwiXG4gIChvbk5vZGVVbnNlbGVjdCk9XCJvbk5vZGVVbnNlbGVjdGVkKCRldmVudClcIj5cbiAgQGlmIChjb2xncm91cFRlbXBsYXRlKSB7XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNvbGdyb3VwXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sZ3JvdXBUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIH1cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIiAqbmdJZj1cImhhc1Rvb2xiYXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidG9vbGJhclRlbXBsYXRlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9vbGJhclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0b29sYmFyVGVtcGxhdGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLXRiYXItbGVmdFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidG9vbGJhckljb25cIiBjbGFzcz1cImNwcy10cmVldGFibGUtdGJhci1pY29uXCI+XG4gICAgICAgICAgPGNwcy1pY29uIFtpY29uXT1cInRvb2xiYXJJY29uXCIgW2NvbG9yXT1cInRvb2xiYXJJY29uQ29sb3JcIj48L2Nwcy1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNwcy10cmVldGFibGUtdGJhci10aXRsZVwiPnt7IHRvb2xiYXJUaXRsZSB9fTwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0dsb2JhbEZpbHRlclwiIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS10YmFyLWdsb2JhbC1maWx0ZXJcIj5cbiAgICAgICAgICA8Y3BzLWlucHV0XG4gICAgICAgICAgICAjZ2xvYmFsRmlsdGVyQ29tcFxuICAgICAgICAgICAgcHJlZml4SWNvbj1cInNlYXJjaFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2xvYmFsRmlsdGVyUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvbkZpbHRlckdsb2JhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtjbGVhcmFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1wiXG4gICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJ0b29sYmFyU2l6ZSA9PT0gJ3NtYWxsJyA/ICd1bmRlcmxpbmVkJyA6ICdvdXRsaW5lZCdcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIj5cbiAgICAgICAgICA8L2Nwcy1pbnB1dD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLXRiYXItcmlnaHRcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwic2hvd1JlbW92ZUJ0bk9uU2VsZWN0ICYmIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBjbGFzcz1cImNwcy10cmVldGFibGUtdGJhci1idG4tb24tc2VsZWN0XCI+XG4gICAgICAgICAgPGNwcy1idXR0b25cbiAgICAgICAgICAgIGxhYmVsPVwiUmVtb3ZlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZW1vdmVCdG5PblNlbGVjdERpc2FibGVkXCJcbiAgICAgICAgICAgIGNvbG9yPVwicHJlcGFyZWRcIlxuICAgICAgICAgICAgdHlwZT1cImJvcmRlcmxlc3NcIlxuICAgICAgICAgICAgaWNvbj1cInJlbW92ZVwiXG4gICAgICAgICAgICBbc2l6ZV09XCJ0b29sYmFyU2l6ZVwiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJyZW1vdmVTZWxlY3RlZCgpXCI+XG4gICAgICAgICAgPC9jcHMtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwic2hvd0FkZGl0aW9uYWxCdG5PblNlbGVjdCAmJiBzZWxlY3RlZFJvd3MubGVuZ3RoID4gMFwiXG4gICAgICAgICAgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLXRiYXItYnRuLW9uLXNlbGVjdFwiPlxuICAgICAgICAgIDxjcHMtYnV0dG9uXG4gICAgICAgICAgICBbbGFiZWxdPVwiYWRkaXRpb25hbEJ0bk9uU2VsZWN0VGl0bGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFkZGl0aW9uYWxCdG5PblNlbGVjdERpc2FibGVkXCJcbiAgICAgICAgICAgIGNvbG9yPVwicHJlcGFyZWRcIlxuICAgICAgICAgICAgdHlwZT1cImJvcmRlcmxlc3NcIlxuICAgICAgICAgICAgW2ljb25dPVwiYWRkaXRpb25hbEJ0bk9uU2VsZWN0SWNvblwiXG4gICAgICAgICAgICBbc2l6ZV09XCJ0b29sYmFyU2l6ZVwiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkNsaWNrQWRkaXRpb25hbEJ0bk9uU2VsZWN0KClcIj5cbiAgICAgICAgICA8L2Nwcy1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0FjdGlvbkJ0blwiIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS10YmFyLWFjdGlvbi1idG5cIj5cbiAgICAgICAgICA8Y3BzLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cImFjdGlvbkJ0blRpdGxlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb25CdG5EaXNhYmxlZFwiXG4gICAgICAgICAgICBjb2xvcj1cInByZXBhcmVkXCJcbiAgICAgICAgICAgIHR5cGU9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbaWNvbl09XCJhY3Rpb25CdG5JY29uXCJcbiAgICAgICAgICAgIFtzaXplXT1cInRvb2xiYXJTaXplXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cIm9uQ2xpY2tBY3Rpb25CdG4oKVwiPlxuICAgICAgICAgIDwvY3BzLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInNob3dDb2x1bW5zVG9nZ2xlQnRuICYmIGNvbHVtbnMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLXRiYXItY29sdG9nZ2xlLWJ0blwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnYnRuLWRpc2FibGVkJzogY29sdW1uc1RvZ2dsZUJ0bkRpc2FibGVkIH1cIj5cbiAgICAgICAgICA8Y3BzLWljb25cbiAgICAgICAgICAgIGljb249XCJjb2x1bW5zXCJcbiAgICAgICAgICAgIHNpemU9XCJub3JtYWxcIlxuICAgICAgICAgICAgW2NvbG9yXT1cIlxuICAgICAgICAgICAgICBjb2x1bW5zVG9nZ2xlQnRuRGlzYWJsZWQgPyAndGV4dC1saWdodGVzdCcgOiAncHJlcGFyZWQtbGlnaHRlbjEnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29sdW1uc1RvZ2dsZSgkZXZlbnQpXCI+PC9jcHMtaWNvbj5cbiAgICAgICAgICA8Y3BzLW1lbnUgI2NvbFRvZ2dsZU1lbnUgW3dpdGhBcnJvd109XCJmYWxzZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNwcy10cmVldGFibGUtY29sdG9nZ2xlLW1lbnVcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS1jb2x0b2dnbGUtbWVudS1pdGVtIHNlbGVjdC1hbGwtb3B0aW9uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWxsc2VsZWN0ZWRdPVwic2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA9PT0gY29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBbGxDb2x1bW5zKClcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNwcy10cmVldGFibGUtY29sdG9nZ2xlLW1lbnUtaXRlbS1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNwcy10cmVldGFibGUtY29sdG9nZ2xlLW1lbnUtaXRlbS1jaGVja1wiPiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNwcy10cmVldGFibGUtY29sdG9nZ2xlLW1lbnUtaXRlbS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgID5TaG93IGFsbCBjb2x1bW5zPC9zcGFuXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLWNvbHRvZ2dsZS1tZW51LWl0ZW1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdENvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNDb2x1bW5TZWxlY3RlZChjb2wpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcHMtdHJlZXRhYmxlLWNvbHRvZ2dsZS1tZW51LWl0ZW0tbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcHMtdHJlZXRhYmxlLWNvbHRvZ2dsZS1tZW51LWl0ZW0tY2hlY2tcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNwcy10cmVldGFibGUtY29sdG9nZ2xlLW1lbnUtaXRlbS1sYWJlbFwiPnt7XG4gICAgICAgICAgICAgICAgICAgIGNvbFtjb2xIZWFkZXJOYW1lXVxuICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvY3BzLW1lbnU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJzaG93RGF0YVJlbG9hZEJ0blwiXG4gICAgICAgICAgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLXRiYXItcmVsb2FkLWJ0blwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnYnRuLWRpc2FibGVkJzogZGF0YVJlbG9hZEJ0bkRpc2FibGVkIH1cIj5cbiAgICAgICAgICA8Y3BzLWljb25cbiAgICAgICAgICAgIGljb249XCJyZWZyZXNoXCJcbiAgICAgICAgICAgIHNpemU9XCIxOFwiXG4gICAgICAgICAgICBbY29sb3JdPVwiZGF0YVJlbG9hZEJ0bkRpc2FibGVkID8gJ3RleHQtbGlnaHQnIDogJ3ByZXBhcmVkLWxpZ2h0ZW4xJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25SZWxvYWREYXRhKClcIj5cbiAgICAgICAgICA8L2Nwcy1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiAqbmdJZj1cIm5lc3RlZEhlYWRlclRlbXBsYXRlXCIgbGV0LWNvbHVtbnM+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgbmVzdGVkSGVhZGVyVGVtcGxhdGU7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAkaW1wbGljaXQ6IGNvbHVtbnNcbiAgICAgICAgfVxuICAgICAgXCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiICpuZ0lmPVwiIW5lc3RlZEhlYWRlclRlbXBsYXRlXCIgbGV0LWNvbHVtbnM+XG4gICAgPHRyPlxuICAgICAgPCEtLSA8dGggc3R5bGU9XCJ3aWR0aDogM3JlbVwiICpuZ0lmPVwicmVvcmRlcmFibGVSb3dzXCI+PC90aD4gLS0+XG4gICAgICA8dGhcbiAgICAgICAgKm5nSWY9XCJzZWxlY3RhYmxlXCJcbiAgICAgICAgY3BzVFRIZHJTZWxlY3RhYmxlXG4gICAgICAgIGNwc1RUQ29sUmVzaXphYmxlXG4gICAgICAgIFtjcHNUVENvbFJlc2l6YWJsZURpc2FibGVkXT1cIiFyZXNpemFibGVDb2x1bW5zXCI+PC90aD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXJUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIGhlYWRlclRlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbHVtbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoZWFkZXJUZW1wbGF0ZSAmJiBjb2x1bW5zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNvcnRhYmxlXCI+XG4gICAgICAgICAgQGlmIChmaWx0ZXJhYmxlQnlDb2x1bW5zKSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcbiAgICAgICAgICAgICAgW2Nwc1RUQ29sU29ydGFibGVdPVwiY29sW2NvbEZpZWxkTmFtZV1cIlxuICAgICAgICAgICAgICBbY3BzVFRDb2xGaWx0ZXJdPVwiY29sW2NvbEZpZWxkTmFtZV1cIlxuICAgICAgICAgICAgICBbZmlsdGVyVHlwZV09XCJcbiAgICAgICAgICAgICAgICBjb2xbY29sRmlsdGVyVHlwZU5hbWVdID8/XG4gICAgICAgICAgICAgICAgKGF1dG9Db2x1bW5GaWx0ZXJUeXBlXG4gICAgICAgICAgICAgICAgICA/IChkYXRhIHwgY3BzVFREZXRlY3RGaWx0ZXJUeXBlOiBjb2xbY29sRmllbGROYW1lXSlcbiAgICAgICAgICAgICAgICAgIDogJ3RleHQnKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBjcHNUVENvbFJlc2l6YWJsZVxuICAgICAgICAgICAgICBbY3BzVFRDb2xSZXNpemFibGVEaXNhYmxlZF09XCIhcmVzaXphYmxlQ29sdW1uc1wiPlxuICAgICAgICAgICAgICB7eyBjb2xbY29sSGVhZGVyTmFtZV0gfX1cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcbiAgICAgICAgICAgICAgW2Nwc1RUQ29sU29ydGFibGVdPVwiY29sW2NvbEZpZWxkTmFtZV1cIlxuICAgICAgICAgICAgICBjcHNUVENvbFJlc2l6YWJsZVxuICAgICAgICAgICAgICBbY3BzVFRDb2xSZXNpemFibGVEaXNhYmxlZF09XCIhcmVzaXphYmxlQ29sdW1uc1wiPlxuICAgICAgICAgICAgICB7eyBjb2xbY29sSGVhZGVyTmFtZV0gfX1cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgfVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzb3J0YWJsZVwiPlxuICAgICAgICAgIEBpZiAoZmlsdGVyYWJsZUJ5Q29sdW1ucykge1xuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiXG4gICAgICAgICAgICAgIFtjcHNUVENvbEZpbHRlcl09XCJjb2xbY29sRmllbGROYW1lXVwiXG4gICAgICAgICAgICAgIFtmaWx0ZXJUeXBlXT1cIlxuICAgICAgICAgICAgICAgIGNvbFtjb2xGaWx0ZXJUeXBlTmFtZV0gPz9cbiAgICAgICAgICAgICAgICAoYXV0b0NvbHVtbkZpbHRlclR5cGVcbiAgICAgICAgICAgICAgICAgID8gKGRhdGEgfCBjcHNUVERldGVjdEZpbHRlclR5cGU6IGNvbFtjb2xGaWVsZE5hbWVdKVxuICAgICAgICAgICAgICAgICAgOiAndGV4dCcpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIGNwc1RUQ29sUmVzaXphYmxlXG4gICAgICAgICAgICAgIFtjcHNUVENvbFJlc2l6YWJsZURpc2FibGVkXT1cIiFyZXNpemFibGVDb2x1bW5zXCI+XG4gICAgICAgICAgICAgIHt7IGNvbFtjb2xIZWFkZXJOYW1lXSB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxuICAgICAgICAgICAgICBjcHNUVENvbFJlc2l6YWJsZVxuICAgICAgICAgICAgICBbY3BzVFRDb2xSZXNpemFibGVEaXNhYmxlZF09XCIhcmVzaXphYmxlQ29sdW1uc1wiPlxuICAgICAgICAgICAgICB7eyBjb2xbY29sSGVhZGVyTmFtZV0gfX1cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgfVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHRoXG4gICAgICAgIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS1yb3ctbWVudS1jZWxsXCJcbiAgICAgICAgKm5nSWY9XCJzaG93Um93TWVudSAmJiAoc2hvd1Jvd1JlbW92ZUJ1dHRvbiB8fCBzaG93Um93RWRpdEJ1dHRvbilcIlxuICAgICAgICBjcHNUVENvbFJlc2l6YWJsZVxuICAgICAgICBbY3BzVFRDb2xSZXNpemFibGVEaXNhYmxlZF09XCIhcmVzaXphYmxlQ29sdW1uc1wiPjwvdGg+XG4gICAgPC90cj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGVcbiAgICBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICBsZXQtcm93RGF0YT1cInJvd0RhdGFcIlxuICAgIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgbGV0LXJvd05vZGVcbiAgICBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiPlxuICAgIDx0clxuICAgICAgW3R0Um93XT1cInJvd05vZGVcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnY3BzLXRyZWV0YWJsZS1yb3ctc2VsZWN0ZWQnOlxuICAgICAgICAgIHNlbGVjdGFibGUgJiYgcHJpbWVuZ1RyZWVUYWJsZS5pc1NlbGVjdGVkKHJvd05vZGUubm9kZSlcbiAgICAgIH1cIj5cbiAgICAgIDwhLS0gPHRkICpuZ0lmPVwicmVvcmRlcmFibGVSb3dzXCIgY2xhc3M9XCJjcHMtdGFibGUtcm93LWRyYWctaGFuZGxlLWNlbGxcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcHMtdGFibGUtcm93LWRyYWctaGFuZGxlXCIgcFJlb3JkZXJhYmxlUm93SGFuZGxlPuKYsDwvc3Bhbj5cbiAgICAgIDwvdGQ+IC0tPlxuICAgICAgPHRkIFtjcHNUVFJvd1NlbGVjdGFibGVdPVwicm93Tm9kZVwiICpuZ0lmPVwic2VsZWN0YWJsZVwiPjwvdGQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm9keVRlbXBsYXRlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgYm9keVRlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd05vZGUsXG4gICAgICAgICAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgICAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgICAgICAgcm93RGF0YTogcm93RGF0YVxuICAgICAgICAgICAgfVxuICAgICAgICAgIFwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFib2R5VGVtcGxhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbnMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIEBpZiAocmVuZGVyRGF0YUFzSFRNTCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpID09PSAwXCJcbiAgICAgICAgICAgICAgICBbY3BzVFRSb3dUb2dnbGVyXT1cInJvd05vZGVcIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwicm93RGF0YVtjb2xbY29sRmllbGROYW1lXV1cIj48L3RkPlxuICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJpID4gMFwiIFtpbm5lckhUTUxdPVwicm93RGF0YVtjb2xbY29sRmllbGROYW1lXV1cIj48L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJpID09PSAwXCIgW2Nwc1RUUm93VG9nZ2xlcl09XCJyb3dOb2RlXCI+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgIGNvbFtjb2xEYXRlRm9ybWF0TmFtZV1cbiAgICAgICAgICAgICAgICAgICAgPyAocm93RGF0YVtjb2xbY29sRmllbGROYW1lXV1cbiAgICAgICAgICAgICAgICAgICAgICB8IGRhdGU6IGNvbFtjb2xEYXRlRm9ybWF0TmFtZV0pXG4gICAgICAgICAgICAgICAgICAgIDogcm93RGF0YVtjb2xbY29sRmllbGROYW1lXV1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJpID4gMFwiPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICBjb2xbY29sRGF0ZUZvcm1hdE5hbWVdXG4gICAgICAgICAgICAgICAgICAgID8gKHJvd0RhdGFbY29sW2NvbEZpZWxkTmFtZV1dXG4gICAgICAgICAgICAgICAgICAgICAgfCBkYXRlOiBjb2xbY29sRGF0ZUZvcm1hdE5hbWVdKVxuICAgICAgICAgICAgICAgICAgICA6IHJvd0RhdGFbY29sW2NvbEZpZWxkTmFtZV1dXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDx0ZFxuICAgICAgICAqbmdJZj1cInNob3dSb3dNZW51ICYmIChzaG93Um93UmVtb3ZlQnV0dG9uIHx8IHNob3dSb3dFZGl0QnV0dG9uKVwiXG4gICAgICAgIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS1yb3ctbWVudS1jZWxsXCI+XG4gICAgICAgIDx0YWJsZS1yb3ctbWVudVxuICAgICAgICAgIChlZGl0Um93QnRuQ2xpY2tlZCk9XCJvbkVkaXRSb3dDbGlja2VkKHJvd05vZGUubm9kZSlcIlxuICAgICAgICAgIChyZW1vdmVSb3dCdG5DbGlja2VkKT1cIm9uUmVtb3ZlUm93Q2xpY2tlZChyb3dOb2RlLm5vZGUpXCJcbiAgICAgICAgICBbc2hvd1Jvd1JlbW92ZUJ1dHRvbl09XCJzaG93Um93UmVtb3ZlQnV0dG9uXCJcbiAgICAgICAgICBbc2hvd1Jvd0VkaXRCdXR0b25dPVwic2hvd1Jvd0VkaXRCdXR0b25cIlxuICAgICAgICAgIFtjdXN0b21JdGVtc109XCJyb3dNZW51SXRlbXNcIj5cbiAgICAgICAgPC90YWJsZS1yb3ctbWVudT5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgIDx0cj5cbiAgICAgIDx0ZFxuICAgICAgICBjb2xzcGFuPVwiMTAwXCJcbiAgICAgICAgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLWVtcHR5LW1lc3NhZ2UtdGRcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogZW1wdHlCb2R5SGVpZ2h0IH1cIj5cbiAgICAgICAge3sgZW1wdHlNZXNzYWdlIH19XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJsb2FkaW5naWNvblwiPlxuICAgIDxjcHMtbG9hZGVyIFtmdWxsU2NyZWVuXT1cImZhbHNlXCIgb3BhY2l0eT1cIjBcIj48L2Nwcy1sb2FkZXI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJwYWdpbmF0b3JsZWZ0XCI+XG4gICAgPGRpdiBjbGFzcz1cImNwcy10YWJsZS1wYWdpbmF0b3ItaXRtcy1wZXItcGFnZVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcHMtdGFibGUtcGFnaW5hdG9yLWl0ZW1zLXBlci1wYWdlLXRpdGxlXCJcbiAgICAgICAgPlJvd3MgcGVyIHBhZ2U6XG4gICAgICA8L3NwYW4+XG4gICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICBbb3B0aW9uc109XCJyb3dPcHRpb25zXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInJvd3NcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIm9uUm93c1BlclBhZ2VDaGFuZ2VkKClcIlxuICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgb3B0aW9uc0NsYXNzPVwiY3BzLXBhZ2luYXRvci1wYWdlLW9wdGlvbnNcIj5cbiAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicGFnaW5hdG9yZmlyc3RwYWdlbGlua2ljb25cIj5cbiAgICA8QW5nbGVEb3VibGVMZWZ0SWNvbiAvPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicGFnaW5hdG9ycHJldmlvdXNwYWdlbGlua2ljb25cIj5cbiAgICA8QW5nbGVMZWZ0SWNvbiAvPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicGFnaW5hdG9ybmV4dHBhZ2VsaW5raWNvblwiPlxuICAgIDxBbmdsZVJpZ2h0SWNvbiAvPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicGFnaW5hdG9ybGFzdHBhZ2VsaW5raWNvblwiPlxuICAgIDxBbmdsZURvdWJsZVJpZ2h0SWNvbiAvPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLXRyZWVUYWJsZT5cbiJdfQ==