@paperless/angular 0.1.0-alpha.28 → 0.1.0-alpha.280

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 (99) hide show
  1. package/README.md +9 -1
  2. package/esm2020/lib/animations/index.mjs +2 -0
  3. package/esm2020/lib/animations/slide.mjs +20 -0
  4. package/esm2020/lib/base/index.mjs +2 -1
  5. package/esm2020/lib/base/upload.component.mjs +57 -0
  6. package/esm2020/lib/base/value-accessor.mjs +8 -8
  7. package/esm2020/lib/directives/index.mjs +12 -4
  8. package/esm2020/lib/directives/p-page-size-select.directive.mjs +42 -0
  9. package/esm2020/lib/directives/p-pagination.directive.mjs +42 -0
  10. package/esm2020/lib/directives/p-select.directive.mjs +37 -0
  11. package/esm2020/lib/modules/index.mjs +6 -0
  12. package/esm2020/lib/modules/table/base/form.component.mjs +105 -0
  13. package/esm2020/lib/modules/table/base/index.mjs +3 -0
  14. package/esm2020/lib/modules/table/base/table.component.mjs +201 -0
  15. package/esm2020/lib/modules/table/components/index.mjs +8 -0
  16. package/esm2020/lib/modules/table/components/table/constants.mjs +3 -0
  17. package/esm2020/lib/modules/table/components/table/table.component.mjs +620 -0
  18. package/esm2020/lib/modules/table/components/table-cell/table-cell.component.mjs +167 -0
  19. package/esm2020/lib/modules/table/components/table-column/table-column.component.mjs +37 -0
  20. package/esm2020/lib/modules/table/directives/index.mjs +18 -0
  21. package/esm2020/lib/modules/table/directives/p-table-filter-modal.directive.mjs +13 -0
  22. package/esm2020/lib/modules/table/directives/p-table-footer.directive.mjs +52 -0
  23. package/esm2020/lib/modules/table/directives/p-table-header.directive.mjs +60 -0
  24. package/esm2020/lib/modules/table/directives/p-table-ngx.directive.mjs +121 -0
  25. package/esm2020/lib/modules/table/directives/p-table.directive.mjs +78 -0
  26. package/esm2020/lib/modules/table/index.mjs +6 -0
  27. package/esm2020/lib/modules/table/table.module.mjs +28 -0
  28. package/esm2020/lib/modules/table/utils.mjs +23 -0
  29. package/esm2020/lib/modules/toast/components/index.mjs +4 -0
  30. package/esm2020/lib/modules/toast/components/toast-container/toast-container.component.mjs +36 -0
  31. package/esm2020/lib/modules/toast/directives/index.mjs +4 -0
  32. package/esm2020/lib/modules/toast/directives/toast.directive.mjs +52 -0
  33. package/esm2020/lib/modules/toast/index.mjs +6 -0
  34. package/esm2020/lib/modules/toast/services/index.mjs +4 -0
  35. package/esm2020/lib/modules/toast/services/toast.service.mjs +47 -0
  36. package/esm2020/lib/modules/toast/toast.module.mjs +22 -0
  37. package/esm2020/lib/modules/toast/types.mjs +10 -0
  38. package/esm2020/lib/paperless.module.mjs +29 -11
  39. package/esm2020/lib/pipes/currency.pipe.mjs +20 -0
  40. package/esm2020/lib/pipes/date.pipe.mjs +20 -0
  41. package/esm2020/lib/pipes/index.mjs +8 -0
  42. package/esm2020/lib/pipes/safe.pipe.mjs +33 -0
  43. package/esm2020/lib/stencil/components.mjs +1019 -86
  44. package/esm2020/lib/stencil/index.mjs +38 -1
  45. package/esm2020/lib/stencil.module.mjs +17 -0
  46. package/esm2020/public-api.mjs +5 -1
  47. package/fesm2015/paperless-angular.mjs +2953 -192
  48. package/fesm2015/paperless-angular.mjs.map +1 -1
  49. package/fesm2020/paperless-angular.mjs +2966 -191
  50. package/fesm2020/paperless-angular.mjs.map +1 -1
  51. package/{paperless-angular.d.ts → index.d.ts} +0 -0
  52. package/lib/animations/index.d.ts +1 -0
  53. package/lib/animations/slide.d.ts +2 -0
  54. package/lib/base/index.d.ts +1 -0
  55. package/lib/base/upload.component.d.ts +16 -0
  56. package/lib/base/value-accessor.d.ts +6 -6
  57. package/lib/directives/index.d.ts +5 -3
  58. package/lib/directives/p-page-size-select.directive.d.ts +10 -0
  59. package/lib/directives/{pagination.directive.d.ts → p-pagination.directive.d.ts} +3 -3
  60. package/lib/directives/p-select.directive.d.ts +9 -0
  61. package/lib/modules/index.d.ts +4 -0
  62. package/lib/modules/table/base/form.component.d.ts +15 -0
  63. package/lib/modules/table/base/index.d.ts +2 -0
  64. package/lib/modules/table/base/table.component.d.ts +58 -0
  65. package/lib/modules/table/components/index.d.ts +7 -0
  66. package/lib/modules/table/components/table/constants.d.ts +2 -0
  67. package/lib/modules/table/components/table/table.component.d.ts +214 -0
  68. package/lib/modules/table/components/table-cell/table-cell.component.d.ts +45 -0
  69. package/lib/modules/table/components/table-column/table-column.component.d.ts +17 -0
  70. package/lib/modules/table/directives/index.d.ts +11 -0
  71. package/lib/modules/table/directives/p-table-filter-modal.directive.d.ts +5 -0
  72. package/lib/modules/table/directives/p-table-footer.directive.d.ts +11 -0
  73. package/lib/modules/table/directives/p-table-header.directive.d.ts +17 -0
  74. package/lib/modules/table/directives/p-table-ngx.directive.d.ts +27 -0
  75. package/lib/modules/table/directives/p-table.directive.d.ts +22 -0
  76. package/lib/modules/table/index.d.ts +5 -0
  77. package/lib/modules/table/table.module.d.ts +16 -0
  78. package/lib/modules/table/utils.d.ts +10 -0
  79. package/lib/modules/toast/components/index.d.ts +3 -0
  80. package/lib/modules/toast/components/toast-container/toast-container.component.d.ts +17 -0
  81. package/lib/modules/toast/directives/index.d.ts +3 -0
  82. package/lib/modules/toast/directives/toast.directive.d.ts +16 -0
  83. package/lib/modules/toast/index.d.ts +5 -0
  84. package/lib/modules/toast/services/index.d.ts +3 -0
  85. package/lib/modules/toast/services/toast.service.d.ts +12 -0
  86. package/lib/modules/toast/toast.module.d.ts +10 -0
  87. package/lib/modules/toast/types.d.ts +30 -0
  88. package/lib/paperless.module.d.ts +13 -3
  89. package/lib/pipes/currency.pipe.d.ts +10 -0
  90. package/lib/pipes/date.pipe.d.ts +10 -0
  91. package/lib/pipes/index.d.ts +7 -0
  92. package/lib/pipes/safe.pipe.d.ts +10 -0
  93. package/lib/stencil/components.d.ts +423 -17
  94. package/lib/stencil/index.d.ts +1 -1
  95. package/lib/stencil.module.d.ts +7 -0
  96. package/package.json +7 -6
  97. package/paperless.css +432 -0
  98. package/public-api.d.ts +4 -0
  99. package/esm2020/lib/directives/pagination.directive.mjs +0 -42
@@ -0,0 +1,620 @@
1
+ import { __decorate } from "tslib";
2
+ import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, EventEmitter, HostListener, Input, Output, TemplateRef, } from '@angular/core';
3
+ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
4
+ import { BehaviorSubject, distinctUntilChanged } from 'rxjs';
5
+ import { TableFilterModalDirective } from '../../directives/p-table-filter-modal.directive';
6
+ import { TableColumn } from '../table-column/table-column.component';
7
+ import { defaultSize, defaultSizeOptions } from './constants';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "../../../../stencil/components";
11
+ import * as i3 from "../table-cell/table-cell.component";
12
+ import * as i4 from "../../directives/p-table-footer.directive";
13
+ import * as i5 from "../../directives/p-table-header.directive";
14
+ let Table = class Table {
15
+ constructor() {
16
+ /**
17
+ * Wether data is loading
18
+ */
19
+ this.loading = false;
20
+ /**
21
+ * The amount of loading rows to show
22
+ */
23
+ this.amountOfLoadingRows = 6;
24
+ /**
25
+ * Wether to enable selection
26
+ */
27
+ this.enableRowSelection = true;
28
+ /**
29
+ * Wether to enable row clicking
30
+ */
31
+ this.enableRowClick = true;
32
+ /**
33
+ * The current selection of items
34
+ */
35
+ this.selectedRows = [];
36
+ /**
37
+ * Event whenever the current selection changes
38
+ */
39
+ this.selectedRowsChange = new EventEmitter();
40
+ /**
41
+ * Event whenever a row is clicked
42
+ */
43
+ this.rowClick = new EventEmitter();
44
+ /**
45
+ * Event whenever a row is selected
46
+ */
47
+ this.rowSelected = new EventEmitter();
48
+ /**
49
+ * Event whenever a row is deselected
50
+ */
51
+ this.rowDeselected = new EventEmitter();
52
+ /** START HEADER */
53
+ /**
54
+ * Quick filters to show
55
+ */
56
+ this.quickFilters = [];
57
+ /**
58
+ * Wether to show the search input
59
+ */
60
+ this.enableSearch = true;
61
+ /**
62
+ * Wether to show the filter button
63
+ */
64
+ this.enableFilter = true;
65
+ /**
66
+ * Wether to show the edit button
67
+ */
68
+ this.enableEdit = true;
69
+ /**
70
+ * Event when one of the quick filters is clicked
71
+ */
72
+ this.quickFilter = new EventEmitter();
73
+ /**
74
+ * Event when the query changes
75
+ */
76
+ this.queryChange = new EventEmitter();
77
+ /**
78
+ * Event when the filter button is clicked
79
+ */
80
+ this.filter = new EventEmitter();
81
+ /**
82
+ * Event when the edit button is clicked
83
+ */
84
+ this.edit = new EventEmitter();
85
+ /** START FOOTER */
86
+ /**
87
+ * Wether to enable page size select
88
+ */
89
+ this.enablePageSize = true;
90
+ /**
91
+ * Wether to enable pagination
92
+ */
93
+ this.enablePagination = true;
94
+ /**
95
+ * Wether to enable export
96
+ */
97
+ this.enableExport = true;
98
+ /**
99
+ * The current page
100
+ */
101
+ this.page = 1;
102
+ /**
103
+ * Event whenever the page changes
104
+ */
105
+ this.pageChange = new EventEmitter();
106
+ /**
107
+ * The amount of items per page
108
+ */
109
+ this.pageSize = defaultSize;
110
+ /**
111
+ * The options for the page size
112
+ */
113
+ this.pageSizeOptions = defaultSizeOptions;
114
+ /**
115
+ * Event whenever the page changes
116
+ */
117
+ this.pageSizeChange = new EventEmitter();
118
+ /**
119
+ * Event whenever the page changes
120
+ */
121
+ this.export = new EventEmitter();
122
+ /**
123
+ * Wether to hide when there is only 1 page available
124
+ */
125
+ this.hideOnSinglePage = true;
126
+ /* Empty state start */
127
+ this.emptyStateType = 'no_filter';
128
+ /**
129
+ * Event whenever the empty state is clicked
130
+ */
131
+ this.emptyStateActionClick = new EventEmitter();
132
+ /* Empty state end */
133
+ this.columns = [];
134
+ this.parsedItems = [];
135
+ this.loadingRows = Array.from({
136
+ length: this.amountOfLoadingRows,
137
+ });
138
+ this._ctrlDown = false;
139
+ this.filterModalShow$ = new BehaviorSubject(false);
140
+ this.filterModalHeaderText = 'Filters';
141
+ this.filterModalSaveText = 'Save';
142
+ this.filterModalCancelText = 'Cancel';
143
+ this.filterModalResetText = 'Reset filters';
144
+ this.filterModalShowReset = false;
145
+ this.filterModalShowResetMobile = false;
146
+ this.filterModalShow = new EventEmitter();
147
+ this.filterModalSave = new EventEmitter();
148
+ this.filterModalReset = new EventEmitter();
149
+ }
150
+ set columnDefinitions(v) {
151
+ this._columnDefinitions = v;
152
+ this._generateColumns();
153
+ }
154
+ get columnDefinitions() {
155
+ return this._columnDefinitions;
156
+ }
157
+ ngOnInit() {
158
+ this._parseItems(this.items);
159
+ this.loadingRows = Array.from({
160
+ length: this.amountOfLoadingRows,
161
+ });
162
+ this.filterModalShow$
163
+ .pipe(untilDestroyed(this), distinctUntilChanged())
164
+ .subscribe((value) => this.filterModalShow.next(value));
165
+ // this._generateColumns();
166
+ }
167
+ ngOnChanges(changes) {
168
+ if (changes['items']) {
169
+ this._parseItems(changes['items'].currentValue);
170
+ }
171
+ if (changes['amountOfLoadingRows']) {
172
+ this.loadingRows = Array.from({
173
+ length: changes['amountOfLoadingRows'].currentValue,
174
+ });
175
+ }
176
+ }
177
+ // @HostListener('body:tableDefinitionChanged', { target: 'body' })
178
+ // onTableDefinitionUpdated() {
179
+ // this._generateColumns();
180
+ // }
181
+ keyDown({ key }) {
182
+ if (key !== 'Control' || this._ctrlDown === true) {
183
+ return;
184
+ }
185
+ this._ctrlDown = true;
186
+ }
187
+ keyUp({ key }) {
188
+ if (key !== 'Control' || this._ctrlDown === false) {
189
+ return;
190
+ }
191
+ this._ctrlDown = false;
192
+ }
193
+ visibilityChange() {
194
+ if (document.visibilityState !== 'hidden' || this._ctrlDown === false) {
195
+ return;
196
+ }
197
+ this._ctrlDown = false;
198
+ }
199
+ onQueryChange({ detail }) {
200
+ this.queryChange.emit(detail);
201
+ }
202
+ onQuickFilter({ detail }) {
203
+ this.quickFilter.emit(detail);
204
+ }
205
+ onPageSizeChange({ detail }) {
206
+ this.pageSizeChange.emit(detail);
207
+ }
208
+ onPageChange({ detail }) {
209
+ this.pageChange.emit(detail);
210
+ }
211
+ onFilterModalSave() {
212
+ this.filterModalSave.next();
213
+ this.filterModalShow$.next(false);
214
+ }
215
+ onFilterModalReset(resetQuickFilter = false) {
216
+ this.filterModalReset.next(resetQuickFilter);
217
+ this.filterModalShow$.next(false);
218
+ }
219
+ _parseItems(items) {
220
+ if (!items) {
221
+ this.parsedItems = [];
222
+ return;
223
+ }
224
+ if (Array.isArray(items)) {
225
+ this.parsedItems = items;
226
+ return;
227
+ }
228
+ this.parsedItems = JSON.parse(items);
229
+ }
230
+ _generateColumns() {
231
+ // const definitions =
232
+ // this._el.nativeElement.querySelectorAll('p-table-definition');
233
+ this.columns = Array.from(this._columnDefinitions);
234
+ }
235
+ // private _getHeader() {
236
+ // return (
237
+ // <p-table-row variant="header">
238
+ // {this._columns.map((col: TableDefinition, index) => (
239
+ // <p-table-column
240
+ // definition={col}
241
+ // value={col.name}
242
+ // variant="header"
243
+ // checkbox={this._getCheckbox(index, null, 'header')}
244
+ // index={index}
245
+ // ></p-table-column>
246
+ // ))}
247
+ // </p-table-row>
248
+ // );
249
+ // }
250
+ // private _getRows() {
251
+ // if (this.loading) {
252
+ // return Array.from(
253
+ // {
254
+ // length: this.amountOfLoadingRows,
255
+ // },
256
+ // (_, i) => (
257
+ // <p-table-row
258
+ // enableHover={
259
+ // this.enableRowSelection || this.enableRowClick
260
+ // }
261
+ // >
262
+ // {this._getLoadingColumns(i)}
263
+ // </p-table-row>
264
+ // )
265
+ // );
266
+ // }
267
+ // return this._items.map((item, index) => (
268
+ // <p-table-row
269
+ // enableHover={this.enableRowSelection || this.enableRowClick}
270
+ // onClick={(ev) => this._rowClick(ev, index)}
271
+ // >
272
+ // {this._getRowColumns(item, index)}
273
+ // </p-table-row>
274
+ // ));
275
+ // }
276
+ // private _getRowColumns(item, index) {
277
+ // return this._columns.map((col: TableDefinition, colIndex) => {
278
+ // return (
279
+ // <p-table-column
280
+ // definition={col}
281
+ // item={item}
282
+ // checkbox={this._getCheckbox(colIndex, index)}
283
+ // index={colIndex}
284
+ // rowIndex={index}
285
+ // ></p-table-column>
286
+ // );
287
+ // });
288
+ // }
289
+ // private _getLoadingColumns(index) {
290
+ // return this._columns.map((col: TableDefinition, colIndex) => {
291
+ // return (
292
+ // <p-table-column
293
+ // definition={col}
294
+ // variant="loading"
295
+ // checkbox={this._getCheckbox(colIndex, index, 'loading')}
296
+ // index={colIndex}
297
+ // rowIndex={index}
298
+ // ></p-table-column>
299
+ // );
300
+ // });
301
+ // }
302
+ // private _getCheckbox(
303
+ // index,
304
+ // rowIndex,
305
+ // variant: 'header' | 'default' | 'loading' = 'default'
306
+ // ) {
307
+ // if (!this.enableRowSelection || !this.selectionKey || index !== 0) {
308
+ // return;
309
+ // }
310
+ // if (variant === 'loading') {
311
+ // return <p-loader variant="ghost" class="rounded w-6 h-6" />;
312
+ // }
313
+ // if (variant === 'header') {
314
+ // return (
315
+ // <input
316
+ // class="p-input"
317
+ // type="checkbox"
318
+ // onChange={(ev) => this._selectAllChange(ev)}
319
+ // checked={this._selectionContainsAll()}
320
+ // indeterminate={this._selectionIndeterminate()}
321
+ // />
322
+ // );
323
+ // }
324
+ // const item = this._items[rowIndex];
325
+ // return (
326
+ // <input
327
+ // class="p-input"
328
+ // type="checkbox"
329
+ // onChange={(ev) => this._checkboxChange(ev?.target, rowIndex)}
330
+ // disabled={this.canSelectKey && !item[this.canSelectKey]}
331
+ // checked={this._selectionContains(item, rowIndex)}
332
+ // />
333
+ // );
334
+ // }
335
+ _checkboxDisabled(item) {
336
+ return this.canSelectKey && !item[this.canSelectKey];
337
+ }
338
+ _selectAllChange($event) {
339
+ if (!this.enableRowSelection) {
340
+ return;
341
+ }
342
+ const value = this._getCheckedValue($event.target);
343
+ if (value) {
344
+ const toAdd = [];
345
+ for (let i = 0; i < this.parsedItems.length; i++) {
346
+ const row = this.parsedItems[i];
347
+ if (this.canSelectKey && !row[this.canSelectKey]) {
348
+ continue;
349
+ }
350
+ if (this._selectionContains(row, i)) {
351
+ continue;
352
+ }
353
+ toAdd.push(row);
354
+ this.rowSelected.emit(row);
355
+ }
356
+ this.selectedRows = [...this.selectedRows, ...toAdd];
357
+ this.selectedRowsChange.emit(this.selectedRows);
358
+ return;
359
+ }
360
+ for (let i = 0; i < this.selectedRows.length; i++) {
361
+ const value = this.selectedRows[i];
362
+ const row = this.parsedItems.find((d) => this._getSelectionValue(d, i) ===
363
+ this._getSelectionValue(value, i));
364
+ if (!row) {
365
+ continue;
366
+ }
367
+ this.rowDeselected.emit(row);
368
+ }
369
+ this.selectedRows = [];
370
+ this.selectedRowsChange.emit(this.selectedRows);
371
+ }
372
+ _checkboxChange(target, index) {
373
+ if (!this.enableRowSelection) {
374
+ return;
375
+ }
376
+ const row = this.parsedItems[index];
377
+ if (this.canSelectKey && !row[this.canSelectKey]) {
378
+ target.checked = false;
379
+ return;
380
+ }
381
+ const value = this._getCheckedValue(target);
382
+ if (value) {
383
+ this.selectedRows = [...this.selectedRows, row];
384
+ this.selectedRowsChange.emit(this.selectedRows);
385
+ this.rowSelected.emit(row);
386
+ return;
387
+ }
388
+ const indexOfToRemove = this._selectionContains(row, index, true);
389
+ // we need to do this, because splice does not trigger the selection setter.
390
+ const selection = [...this.selectedRows];
391
+ selection.splice(indexOfToRemove, 1);
392
+ this.selectedRows = selection;
393
+ this.selectedRowsChange.emit(this.selectedRows);
394
+ this.rowDeselected.emit(row);
395
+ }
396
+ _getCheckedValue(target) {
397
+ return target?.checked;
398
+ }
399
+ _getSelectionValue(row, index) {
400
+ return this.selectionKey ? row?.[this.selectionKey] || index : index;
401
+ }
402
+ _selectionContains(row, index, returnIndex = false) {
403
+ const returnValue = this.selectedRows.findIndex((item) => this._getSelectionValue(row, index) ===
404
+ this._getSelectionValue(item, index));
405
+ return !returnIndex ? returnValue >= 0 : returnValue;
406
+ }
407
+ _selectionContainsAll() {
408
+ let returnValue = true;
409
+ if (!this.parsedItems?.length) {
410
+ return false;
411
+ }
412
+ for (let i = 0; i < this.parsedItems?.length; i++) {
413
+ const item = this.parsedItems[i];
414
+ const contains = this._selectionContains(item, i);
415
+ if (!contains) {
416
+ returnValue = false;
417
+ break;
418
+ }
419
+ }
420
+ return returnValue;
421
+ }
422
+ _selectionIndeterminate() {
423
+ if (!this.parsedItems?.length || !this.selectedRows?.length) {
424
+ return false;
425
+ }
426
+ let containsCount = 0;
427
+ for (let i = 0; i < this.parsedItems?.length; i++) {
428
+ const item = this.parsedItems[i];
429
+ const contains = this._selectionContains(item, i);
430
+ if (contains) {
431
+ containsCount++;
432
+ }
433
+ }
434
+ return containsCount > 0 && containsCount !== this.parsedItems.length;
435
+ }
436
+ _rowClick($event, index) {
437
+ const target = $event.target;
438
+ if (target.tagName.toLowerCase() === 'input' ||
439
+ target.type === 'checkbox') {
440
+ return;
441
+ }
442
+ const row = this._findRow($event.target);
443
+ if (this.enableRowClick) {
444
+ const action = this._findRowAction($event.target);
445
+ if (action) {
446
+ return;
447
+ }
448
+ const item = this.parsedItems[index];
449
+ this.rowClick.emit({
450
+ item,
451
+ ctrlDown: this._ctrlDown,
452
+ });
453
+ return;
454
+ }
455
+ if (!this.enableRowSelection) {
456
+ return;
457
+ }
458
+ const checkbox = row?.querySelector('input[type="checkbox"]');
459
+ if (!checkbox) {
460
+ return;
461
+ }
462
+ checkbox.checked = !checkbox.checked;
463
+ this._checkboxChange(checkbox, index);
464
+ }
465
+ _findRow(el) {
466
+ if (!el) {
467
+ return el;
468
+ }
469
+ if (el?.tagName?.toLowerCase() === 'p-table-row') {
470
+ return el;
471
+ }
472
+ return this._findRow(el?.parentElement);
473
+ }
474
+ _findRowAction(el) {
475
+ if (!el) {
476
+ return null;
477
+ }
478
+ if (el.getAttribute('data-is-action') !== null &&
479
+ el.getAttribute('data-is-action') !== 'false') {
480
+ return el;
481
+ }
482
+ if (el?.tagName?.toLowerCase() === 'p-table-row') {
483
+ return null;
484
+ }
485
+ return this._findRowAction(el?.parentElement);
486
+ }
487
+ };
488
+ Table.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: Table, deps: [], target: i0.ɵɵFactoryTarget.Component });
489
+ Table.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.1", type: Table, selector: "p-table-ngx", inputs: { items: "items", loading: "loading", amountOfLoadingRows: "amountOfLoadingRows", enableRowSelection: "enableRowSelection", enableRowClick: "enableRowClick", selectedRows: "selectedRows", selectionKey: "selectionKey", canSelectKey: "canSelectKey", quickFilters: "quickFilters", activeQuickFilterIdentifier: "activeQuickFilterIdentifier", enableSearch: "enableSearch", query: "query", enableFilter: "enableFilter", selectedFiltersAmount: "selectedFiltersAmount", filterButtonTemplate: "filterButtonTemplate", enableEdit: "enableEdit", editButtonTemplate: "editButtonTemplate", enablePageSize: "enablePageSize", enablePagination: "enablePagination", enableExport: "enableExport", page: "page", total: "total", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hideOnSinglePage: "hideOnSinglePage", emptyStateType: "emptyStateType", emptyStateHeader: "emptyStateHeader", emptyStateContent: "emptyStateContent", emptyStateAction: "emptyStateAction", emptyStateFilteredHeader: "emptyStateFilteredHeader", emptyStateFilteredContent: "emptyStateFilteredContent", filterModalHeaderText: "filterModalHeaderText", filterModalSaveText: "filterModalSaveText", filterModalCancelText: "filterModalCancelText", filterModalResetText: "filterModalResetText", filterModalShowReset: "filterModalShowReset", filterModalShowResetMobile: "filterModalShowResetMobile" }, outputs: { selectedRowsChange: "selectedRowsChange", rowClick: "rowClick", rowSelected: "rowSelected", rowDeselected: "rowDeselected", quickFilter: "quickFilter", queryChange: "queryChange", filter: "filter", edit: "edit", pageChange: "pageChange", pageSizeChange: "pageSizeChange", export: "export", emptyStateActionClick: "emptyStateActionClick", filterModalShow: "filterModalShow", filterModalSave: "filterModalSave", filterModalReset: "filterModalReset" }, host: { listeners: { "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:visibilitychange": "visibilityChange($event)" } }, queries: [{ propertyName: "filterModalTemplate", first: true, predicate: TableFilterModalDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "columnDefinitions", predicate: TableColumn }], usesOnChanges: true, ngImport: i0, template: "<p-table-container>\n <p-table-header\n [quickFilters]=\"quickFilters\"\n [activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n (quickFilter)=\"(onQuickFilter)\"\n [enableSearch]=\"enableSearch\"\n [query]=\"query\"\n (queryChange)=\"(onQueryChange)\"\n [enableFilter]=\"filterModalTemplate\"\n [selectedFiltersAmount]=\"selectedFiltersAmount\"\n [filterButtonTemplate]=\"filterButtonTemplate\"\n (filter)=\"filterModalShow$.next(true)\"\n [enableEdit]=\"enableEdit\"\n [canEdit]=\"!!selectedRows.length\"\n [editButtonTemplate]=\"editButtonTemplate\"\n (edit)=\"edit.emit()\"\n [itemsSelectedAmount]=\"selectedRows.length\"\n ></p-table-header>\n\n <p-table-row variant=\"header\">\n <ng-container *ngFor=\"let col of columns; let index = index\">\n <p-table-cell-ngx\n [definition]=\"col\"\n [value]=\"col.name\"\n variant=\"header\"\n [index]=\"index\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n ></p-table-cell-ngx>\n <ng-template #checkboxTemplate>\n <input\n class=\"p-input\"\n type=\"checkbox\"\n (change)=\"_selectAllChange($event)\"\n [checked]=\"_selectionContainsAll()\"\n [indeterminate]=\"_selectionIndeterminate()\"\n />\n </ng-template>\n </ng-container>\n </p-table-row>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"loading; else contentTemplate\">\n <p-table-row\n *ngFor=\"let r of loadingRows; let rowIndex = index\"\n [enableHover]=\"enableRowSelection || enableRowClick\"\n >\n <ng-container *ngFor=\"let col of columns; let index = index\">\n <p-table-cell-ngx\n [definition]=\"col\"\n variant=\"loading\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n [index]=\"index\"\n [rowIndex]=\"rowIndex\"\n ></p-table-cell-ngx>\n <ng-template #checkboxTemplate>\n <p-loader\n variant=\"ghost\"\n class=\"rounded w-6 h-6\"\n ></p-loader>\n </ng-template>\n </ng-container>\n </p-table-row>\n </ng-container>\n\n <ng-template #contentTemplate>\n <ng-container *ngIf=\"items?.length; else emptyStateTemplate\">\n <p-table-row\n *ngFor=\"let item of items; let rowIndex = index\"\n [enableHover]=\"enableRowSelection || enableRowClick\"\n (click)=\"_rowClick($event, rowIndex)\"\n >\n <ng-container\n *ngFor=\"let col of columns; let index = index\"\n >\n <p-table-cell-ngx\n [definition]=\"col\"\n [item]=\"item\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n [index]=\"index\"\n [rowIndex]=\"rowIndex\"\n [template]=\"col.template\"\n ></p-table-cell-ngx>\n\n <ng-template #checkboxTemplate>\n <input\n class=\"p-input\"\n type=\"checkbox\"\n (change)=\"\n _checkboxChange($event.target, rowIndex)\n \"\n [disabled]=\"_checkboxDisabled(item)\"\n [checked]=\"_selectionContains(item, rowIndex)\"\n />\n </ng-template>\n </ng-container>\n </p-table-row>\n </ng-container>\n </ng-template>\n </div>\n\n <p-table-footer\n [hideOnSinglePage]=\"hideOnSinglePage\"\n [enablePageSize]=\"enablePageSize\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (pageSizeChange)=\"(pageSizeChange)\"\n [enablePagination]=\"enablePagination\"\n [page]=\"page\"\n [total]=\"total\"\n (pageChange)=\"(pageChange)\"\n [enableExport]=\"enableExport\"\n (export)=\"export.emit()\"\n ></p-table-footer>\n</p-table-container>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n <p-modal\n [header]=\"filterModalHeaderText\"\n [show]=\"filterModalShow$ | async\"\n (close)=\"filterModalShow$.next(false)\"\n >\n <div slot=\"content\" class=\"flex flex-col gap-6\">\n <ng-container\n *ngTemplateOutlet=\"filterModalTemplate\"\n ></ng-container>\n </div>\n <div slot=\"footer\" class=\"flex justify-between gap-4 w-full\">\n <p-button\n *ngIf=\"filterModalShowResetMobile\"\n class=\"flex desktop-xs:hidden w-full tablet:w-auto\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset(true)\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n *ngIf=\"filterModalShowReset\"\n class=\"hidden desktop-xs:flex w-full tablet:w-auto\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset()\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n class=\"ml-auto w-full tablet:w-auto\"\n icon=\"checkmark\"\n (onClick)=\"onFilterModalSave()\"\n >\n {{ filterModalSaveText }}\n </p-button>\n </div>\n </p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n <div\n *ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n class=\"\n flex flex-col\n items-center\n text-center\n py-24\n max-w-[20rem]\n self-center\n \"\n >\n <p-illustration\n variant=\"empty-state-search\"\n class=\"mb-6\"\n ></p-illustration>\n <p class=\"font-semibold text-storm-default\">\n {{ emptyStateFilteredHeader }}\n </p>\n <p class=\"text-sm text-storm-medium mb-14\">\n {{ emptyStateFilteredContent }}\n </p>\n </div>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n <div\n class=\"\n flex flex-col\n items-center\n text-center\n py-24\n max-w-[20rem]\n self-center\n \"\n >\n <p-illustration\n variant=\"empty-state-overview\"\n class=\"cursor-pointer mb-6\"\n (onClick)=\"emptyStateActionClick.emit()\"\n ></p-illustration>\n <p class=\"font-semibold text-storm-default\">\n {{ emptyStateHeader }}\n </p>\n <p class=\"text-sm text-storm-medium mb-6\">\n {{ emptyStateContent }}\n </p>\n <p-button\n variant=\"secondary\"\n icon=\"plus\"\n size=\"small\"\n (onClick)=\"emptyStateActionClick.emit()\"\n >\n {{ emptyStateAction }}\n </p-button>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.PButton, selector: "p-button", inputs: ["chevron", "chevronPosition", "disabled", "href", "icon", "iconFlip", "iconOnly", "iconPosition", "iconRotate", "inheritText", "loading", "size", "target", "variant"] }, { kind: "component", type: i2.PIllustration, selector: "p-illustration", inputs: ["variant"] }, { kind: "component", type: i2.PLoader, selector: "p-loader", inputs: ["color", "modalDescription", "modalTitle", "show", "variant"] }, { kind: "component", type: i2.PModal, selector: "p-modal", inputs: ["applyBlur", "backdropClickClose", "header", "show", "showMobileClose", "showMobileFooter", "size", "variant"] }, { kind: "component", type: i2.PTableContainer, selector: "p-table-container" }, { kind: "component", type: i2.PTableFooter, selector: "p-table-footer", inputs: ["enableExport", "enablePageSize", "enablePagination", "hideOnSinglePage", "page", "pageSize", "pageSizeOptions", "total"] }, { kind: "component", type: i2.PTableHeader, selector: "p-table-header", inputs: ["activeQuickFilterIdentifier", "canEdit", "editButtonTemplate", "enableEdit", "enableFilter", "enableSearch", "filterButtonTemplate", "itemsSelectedAmount", "query", "quickFilters", "selectedFiltersAmount"] }, { kind: "component", type: i2.PTableRow, selector: "p-table-row", inputs: ["enableHover", "variant"] }, { kind: "component", type: i3.TableCell, selector: "p-table-cell-ngx", inputs: ["variant", "index", "rowIndex", "definition", "item", "value", "checkbox", "template"] }, { kind: "directive", type: i4.TableFooterDirective, selector: "p-table-footer" }, { kind: "directive", type: i5.TableHeaderDirective, selector: "p-table-header" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
490
+ Table = __decorate([
491
+ UntilDestroy({ checkProperties: true })
492
+ ], Table);
493
+ export { Table };
494
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: Table, decorators: [{
495
+ type: Component,
496
+ args: [{ selector: 'p-table-ngx', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-table-container>\n <p-table-header\n [quickFilters]=\"quickFilters\"\n [activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n (quickFilter)=\"(onQuickFilter)\"\n [enableSearch]=\"enableSearch\"\n [query]=\"query\"\n (queryChange)=\"(onQueryChange)\"\n [enableFilter]=\"filterModalTemplate\"\n [selectedFiltersAmount]=\"selectedFiltersAmount\"\n [filterButtonTemplate]=\"filterButtonTemplate\"\n (filter)=\"filterModalShow$.next(true)\"\n [enableEdit]=\"enableEdit\"\n [canEdit]=\"!!selectedRows.length\"\n [editButtonTemplate]=\"editButtonTemplate\"\n (edit)=\"edit.emit()\"\n [itemsSelectedAmount]=\"selectedRows.length\"\n ></p-table-header>\n\n <p-table-row variant=\"header\">\n <ng-container *ngFor=\"let col of columns; let index = index\">\n <p-table-cell-ngx\n [definition]=\"col\"\n [value]=\"col.name\"\n variant=\"header\"\n [index]=\"index\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n ></p-table-cell-ngx>\n <ng-template #checkboxTemplate>\n <input\n class=\"p-input\"\n type=\"checkbox\"\n (change)=\"_selectAllChange($event)\"\n [checked]=\"_selectionContainsAll()\"\n [indeterminate]=\"_selectionIndeterminate()\"\n />\n </ng-template>\n </ng-container>\n </p-table-row>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"loading; else contentTemplate\">\n <p-table-row\n *ngFor=\"let r of loadingRows; let rowIndex = index\"\n [enableHover]=\"enableRowSelection || enableRowClick\"\n >\n <ng-container *ngFor=\"let col of columns; let index = index\">\n <p-table-cell-ngx\n [definition]=\"col\"\n variant=\"loading\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n [index]=\"index\"\n [rowIndex]=\"rowIndex\"\n ></p-table-cell-ngx>\n <ng-template #checkboxTemplate>\n <p-loader\n variant=\"ghost\"\n class=\"rounded w-6 h-6\"\n ></p-loader>\n </ng-template>\n </ng-container>\n </p-table-row>\n </ng-container>\n\n <ng-template #contentTemplate>\n <ng-container *ngIf=\"items?.length; else emptyStateTemplate\">\n <p-table-row\n *ngFor=\"let item of items; let rowIndex = index\"\n [enableHover]=\"enableRowSelection || enableRowClick\"\n (click)=\"_rowClick($event, rowIndex)\"\n >\n <ng-container\n *ngFor=\"let col of columns; let index = index\"\n >\n <p-table-cell-ngx\n [definition]=\"col\"\n [item]=\"item\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n [index]=\"index\"\n [rowIndex]=\"rowIndex\"\n [template]=\"col.template\"\n ></p-table-cell-ngx>\n\n <ng-template #checkboxTemplate>\n <input\n class=\"p-input\"\n type=\"checkbox\"\n (change)=\"\n _checkboxChange($event.target, rowIndex)\n \"\n [disabled]=\"_checkboxDisabled(item)\"\n [checked]=\"_selectionContains(item, rowIndex)\"\n />\n </ng-template>\n </ng-container>\n </p-table-row>\n </ng-container>\n </ng-template>\n </div>\n\n <p-table-footer\n [hideOnSinglePage]=\"hideOnSinglePage\"\n [enablePageSize]=\"enablePageSize\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (pageSizeChange)=\"(pageSizeChange)\"\n [enablePagination]=\"enablePagination\"\n [page]=\"page\"\n [total]=\"total\"\n (pageChange)=\"(pageChange)\"\n [enableExport]=\"enableExport\"\n (export)=\"export.emit()\"\n ></p-table-footer>\n</p-table-container>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n <p-modal\n [header]=\"filterModalHeaderText\"\n [show]=\"filterModalShow$ | async\"\n (close)=\"filterModalShow$.next(false)\"\n >\n <div slot=\"content\" class=\"flex flex-col gap-6\">\n <ng-container\n *ngTemplateOutlet=\"filterModalTemplate\"\n ></ng-container>\n </div>\n <div slot=\"footer\" class=\"flex justify-between gap-4 w-full\">\n <p-button\n *ngIf=\"filterModalShowResetMobile\"\n class=\"flex desktop-xs:hidden w-full tablet:w-auto\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset(true)\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n *ngIf=\"filterModalShowReset\"\n class=\"hidden desktop-xs:flex w-full tablet:w-auto\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset()\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n class=\"ml-auto w-full tablet:w-auto\"\n icon=\"checkmark\"\n (onClick)=\"onFilterModalSave()\"\n >\n {{ filterModalSaveText }}\n </p-button>\n </div>\n </p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n <div\n *ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n class=\"\n flex flex-col\n items-center\n text-center\n py-24\n max-w-[20rem]\n self-center\n \"\n >\n <p-illustration\n variant=\"empty-state-search\"\n class=\"mb-6\"\n ></p-illustration>\n <p class=\"font-semibold text-storm-default\">\n {{ emptyStateFilteredHeader }}\n </p>\n <p class=\"text-sm text-storm-medium mb-14\">\n {{ emptyStateFilteredContent }}\n </p>\n </div>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n <div\n class=\"\n flex flex-col\n items-center\n text-center\n py-24\n max-w-[20rem]\n self-center\n \"\n >\n <p-illustration\n variant=\"empty-state-overview\"\n class=\"cursor-pointer mb-6\"\n (onClick)=\"emptyStateActionClick.emit()\"\n ></p-illustration>\n <p class=\"font-semibold text-storm-default\">\n {{ emptyStateHeader }}\n </p>\n <p class=\"text-sm text-storm-medium mb-6\">\n {{ emptyStateContent }}\n </p>\n <p-button\n variant=\"secondary\"\n icon=\"plus\"\n size=\"small\"\n (onClick)=\"emptyStateActionClick.emit()\"\n >\n {{ emptyStateAction }}\n </p-button>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}\n"] }]
497
+ }], ctorParameters: function () { return []; }, propDecorators: { items: [{
498
+ type: Input
499
+ }], loading: [{
500
+ type: Input
501
+ }], amountOfLoadingRows: [{
502
+ type: Input
503
+ }], enableRowSelection: [{
504
+ type: Input
505
+ }], enableRowClick: [{
506
+ type: Input
507
+ }], selectedRows: [{
508
+ type: Input
509
+ }], selectedRowsChange: [{
510
+ type: Output
511
+ }], selectionKey: [{
512
+ type: Input
513
+ }], canSelectKey: [{
514
+ type: Input
515
+ }], rowClick: [{
516
+ type: Output
517
+ }], rowSelected: [{
518
+ type: Output
519
+ }], rowDeselected: [{
520
+ type: Output
521
+ }], quickFilters: [{
522
+ type: Input
523
+ }], activeQuickFilterIdentifier: [{
524
+ type: Input
525
+ }], enableSearch: [{
526
+ type: Input
527
+ }], query: [{
528
+ type: Input
529
+ }], enableFilter: [{
530
+ type: Input
531
+ }], selectedFiltersAmount: [{
532
+ type: Input
533
+ }], filterButtonTemplate: [{
534
+ type: Input
535
+ }], enableEdit: [{
536
+ type: Input
537
+ }], editButtonTemplate: [{
538
+ type: Input
539
+ }], quickFilter: [{
540
+ type: Output
541
+ }], queryChange: [{
542
+ type: Output
543
+ }], filter: [{
544
+ type: Output
545
+ }], edit: [{
546
+ type: Output
547
+ }], enablePageSize: [{
548
+ type: Input
549
+ }], enablePagination: [{
550
+ type: Input
551
+ }], enableExport: [{
552
+ type: Input
553
+ }], page: [{
554
+ type: Input
555
+ }], total: [{
556
+ type: Input
557
+ }], pageChange: [{
558
+ type: Output
559
+ }], pageSize: [{
560
+ type: Input
561
+ }], pageSizeOptions: [{
562
+ type: Input
563
+ }], pageSizeChange: [{
564
+ type: Output
565
+ }], export: [{
566
+ type: Output
567
+ }], hideOnSinglePage: [{
568
+ type: Input
569
+ }], emptyStateType: [{
570
+ type: Input
571
+ }], emptyStateHeader: [{
572
+ type: Input
573
+ }], emptyStateContent: [{
574
+ type: Input
575
+ }], emptyStateAction: [{
576
+ type: Input
577
+ }], emptyStateFilteredHeader: [{
578
+ type: Input
579
+ }], emptyStateFilteredContent: [{
580
+ type: Input
581
+ }], emptyStateActionClick: [{
582
+ type: Output
583
+ }], columnDefinitions: [{
584
+ type: ContentChildren,
585
+ args: [TableColumn]
586
+ }], filterModalTemplate: [{
587
+ type: ContentChild,
588
+ args: [TableFilterModalDirective, {
589
+ read: TemplateRef,
590
+ static: true,
591
+ }]
592
+ }], filterModalHeaderText: [{
593
+ type: Input
594
+ }], filterModalSaveText: [{
595
+ type: Input
596
+ }], filterModalCancelText: [{
597
+ type: Input
598
+ }], filterModalResetText: [{
599
+ type: Input
600
+ }], filterModalShowReset: [{
601
+ type: Input
602
+ }], filterModalShowResetMobile: [{
603
+ type: Input
604
+ }], filterModalShow: [{
605
+ type: Output
606
+ }], filterModalSave: [{
607
+ type: Output
608
+ }], filterModalReset: [{
609
+ type: Output
610
+ }], keyDown: [{
611
+ type: HostListener,
612
+ args: ['document:keydown', ['$event']]
613
+ }], keyUp: [{
614
+ type: HostListener,
615
+ args: ['document:keyup', ['$event']]
616
+ }], visibilityChange: [{
617
+ type: HostListener,
618
+ args: ['document:visibilitychange', ['$event']]
619
+ }] } });
620
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhcGVybGVzcy9zcmMvbGliL21vZHVsZXMvdGFibGUvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7OztBQVN2RCxJQUFNLEtBQUssR0FBWCxNQUFNLEtBQUs7SUFrUGQ7UUE1T0E7O1dBRUc7UUFDTSxZQUFPLEdBQVksS0FBSyxDQUFDO1FBRWxDOztXQUVHO1FBQ00sd0JBQW1CLEdBQVcsQ0FBQyxDQUFDO1FBRXpDOztXQUVHO1FBQ00sdUJBQWtCLEdBQVksSUFBSSxDQUFDO1FBRTVDOztXQUVHO1FBQ00sbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFFeEM7O1dBRUc7UUFDTSxpQkFBWSxHQUFVLEVBQUUsQ0FBQztR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LG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFtQ1AsT0FBTztzQkFETixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVU1QyxLQUFLO3NCQURKLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVTFDLGdCQUFnQjtzQkFEZixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSwgdW50aWxEZXN0cm95ZWQgfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgUXVpY2tGaWx0ZXIsIFJvd0NsaWNrRXZlbnQgfSBmcm9tICdAcGFwZXJsZXNzL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGFibGVGaWx0ZXJNb2RhbERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcC10YWJsZS1maWx0ZXItbW9kYWwuZGlyZWN0aXZlJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vdGFibGUtY29sdW1uL3RhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGVmYXVsdFNpemUsIGRlZmF1bHRTaXplT3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuQFVudGlsRGVzdHJveSh7IGNoZWNrUHJvcGVydGllczogdHJ1ZSB9KVxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwLXRhYmxlLW5neCcsXG4gICAgdGVtcGxhdGVVcmw6ICd0YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBpdGVtcyB0byBiZSBmZWQgdG8gdGhlIHRhYmxlXG4gICAgICovXG4gICAgQElucHV0KCkgaXRlbXMhOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgZGF0YSBpcyBsb2FkaW5nXG4gICAgICovXG4gICAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBsb2FkaW5nIHJvd3MgdG8gc2hvd1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGFtb3VudE9mTG9hZGluZ1Jvd3M6IG51bWJlciA9IDY7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHNlbGVjdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHJvdyBjbGlja2luZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd0NsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiBpdGVtc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkUm93czogYW55W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkUm93c0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IHRvIGRldGVybWluZSBpZiBhIHJvdyBpcyBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGlvbktleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQSBrZXkgdG8gZGV0ZXJtaW5lIGlmIGEgcm93IGNhbiBiZSBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNhblNlbGVjdEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dDbGljazogRXZlbnRFbWl0dGVyPFJvd0NsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgZGVzZWxlY3RlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dEZXNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKiBTVEFSVCBIRUFERVIgKi9cbiAgICAvKipcbiAgICAgKiBRdWljayBmaWx0ZXJzIHRvIHNob3dcbiAgICAgKi9cbiAgICBASW5wdXQoKSBxdWlja0ZpbHRlcnM6IFF1aWNrRmlsdGVyW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEFjdGl2ZSBxdWljayBmaWx0ZXIgaWRlbnRpZmllclxuICAgICAqL1xuICAgIEBJbnB1dCgpIGFjdGl2ZVF1aWNrRmlsdGVySWRlbnRpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIHNlYXJjaCBpbnB1dFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVNlYXJjaDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgdG8gc2hvdyBpbiB0aGUgc2VhcmNoIGJhclxuICAgICAqL1xuICAgIEBJbnB1dCgpIHF1ZXJ5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gc2hvdyB0aGUgZmlsdGVyIGJ1dHRvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZUZpbHRlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZpbHRlcnMgYmVpbmcgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBzZWxlY3RlZEZpbHRlcnNBbW91bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGZpbHRlciBidXR0b24gdGV4dFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZpbHRlckJ1dHRvblRlbXBsYXRlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gc2hvdyB0aGUgZWRpdCBidXR0b25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVFZGl0OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGVkaXQgYnV0dG9uIHRleHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uVGVtcGxhdGU6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gb25lIG9mIHRoZSBxdWljayBmaWx0ZXJzIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcXVpY2tGaWx0ZXI6IEV2ZW50RW1pdHRlcjxRdWlja0ZpbHRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuIHRoZSBxdWVyeSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHF1ZXJ5Q2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gdGhlIGZpbHRlciBidXR0b24gaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBmaWx0ZXI6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gdGhlIGVkaXQgYnV0dG9uIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZWRpdDogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqIFNUQVJUIEZPT1RFUiAqL1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIGVuYWJsZSBwYWdlIHNpemUgc2VsZWN0XG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlUGFnZVNpemU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIGVuYWJsZSBwYWdpbmF0aW9uXG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlUGFnaW5hdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIGV4cG9ydFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZUV4cG9ydDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBwYWdlXG4gICAgICovXG4gICAgQElucHV0KCkgcGFnZTogbnVtYmVyID0gMTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgaXRlbXNcbiAgICAgKi9cbiAgICBASW5wdXQoKSB0b3RhbCE6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBwYWdlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGl0ZW1zIHBlciBwYWdlXG4gICAgICovXG4gICAgQElucHV0KCkgcGFnZVNpemU6IG51bWJlciA9IGRlZmF1bHRTaXplO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgZm9yIHRoZSBwYWdlIHNpemVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gZGVmYXVsdFNpemVPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgdGhlIHBhZ2UgY2hhbmdlc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIGV4cG9ydDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gaGlkZSB3aGVuIHRoZXJlIGlzIG9ubHkgMSBwYWdlIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGhpZGVPblNpbmdsZVBhZ2U6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyogRW1wdHkgc3RhdGUgc3RhcnQgKi9cbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlVHlwZTogJ25vX2ZpbHRlcicgfCAnZmlsdGVyZWQnID0gJ25vX2ZpbHRlcic7XG5cbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlSGVhZGVyITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVDb250ZW50ITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVBY3Rpb24hOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlRmlsdGVyZWRIZWFkZXIhOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZW1wdHlTdGF0ZUZpbHRlcmVkQ29udGVudCE6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBlbXB0eSBzdGF0ZSBpcyBjbGlja2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIGVtcHR5U3RhdGVBY3Rpb25DbGljazogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyogRW1wdHkgc3RhdGUgZW5kICovXG5cbiAgICBwdWJsaWMgY29sdW1uczogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgcGFyc2VkSXRlbXM6IGFueVtdID0gW107XG4gICAgcHVibGljIGxvYWRpbmdSb3dzID0gQXJyYXkuZnJvbSh7XG4gICAgICAgIGxlbmd0aDogdGhpcy5hbW91bnRPZkxvYWRpbmdSb3dzLFxuICAgIH0pO1xuICAgIHByaXZhdGUgX2N0cmxEb3duID0gZmFsc2U7XG5cbiAgICAvLyBBbmd1bGFyIHN0dWZmXG4gICAgLy8gY29sdW1uIHRlbXBsYXRlc1xuICAgIHByaXZhdGUgX2NvbHVtbkRlZmluaXRpb25zITogUXVlcnlMaXN0PFRhYmxlQ29sdW1uPjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oVGFibGVDb2x1bW4pXG4gICAgc2V0IGNvbHVtbkRlZmluaXRpb25zKHY6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4pIHtcbiAgICAgICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSB2O1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICB9XG4gICAgZ2V0IGNvbHVtbkRlZmluaXRpb25zKCk6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG1vZGFsXG4gICAgQENvbnRlbnRDaGlsZChUYWJsZUZpbHRlck1vZGFsRGlyZWN0aXZlLCB7XG4gICAgICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgICAgICBzdGF0aWM6IHRydWUsXG4gICAgfSlcbiAgICBwdWJsaWMgZmlsdGVyTW9kYWxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBmaWx0ZXJNb2RhbFNob3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbEhlYWRlclRleHQ6IHN0cmluZyA9ICdGaWx0ZXJzJztcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFNhdmVUZXh0OiBzdHJpbmcgPSAnU2F2ZSc7XG4gICAgQElucHV0KCkgZmlsdGVyTW9kYWxDYW5jZWxUZXh0OiBzdHJpbmcgPSAnQ2FuY2VsJztcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFJlc2V0VGV4dDogc3RyaW5nID0gJ1Jlc2V0IGZpbHRlcnMnO1xuXG4gICAgQElucHV0KCkgZmlsdGVyTW9kYWxTaG93UmVzZXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFNob3dSZXNldE1vYmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpIGZpbHRlck1vZGFsU2hvdzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBmaWx0ZXJNb2RhbFNhdmU6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZmlsdGVyTW9kYWxSZXNldDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX3BhcnNlSXRlbXModGhpcy5pdGVtcyk7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nUm93cyA9IEFycmF5LmZyb20oe1xuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTaG93JFxuICAgICAgICAgICAgLnBpcGUodW50aWxEZXN0cm95ZWQodGhpcyksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5maWx0ZXJNb2RhbFNob3cubmV4dCh2YWx1ZSkpO1xuICAgICAgICAvLyB0aGlzLl9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydpdGVtcyddKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZUl0ZW1zKGNoYW5nZXNbJ2l0ZW1zJ10uY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWydhbW91bnRPZkxvYWRpbmdSb3dzJ10pIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1Jvd3MgPSBBcnJheS5mcm9tKHtcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGNoYW5nZXNbJ2Ftb3VudE9mTG9hZGluZ1Jvd3MnXS5jdXJyZW50VmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICBASG9zdExpc3RlbmVyKCdib2R5OnRhYmxlRGVmaW5pdGlvbkNoYW5nZWQnLCB7IHRhcmdldDogJ2JvZHknIH0pXG4gICAgLy8gIG9uVGFibGVEZWZpbml0aW9uVXBkYXRlZCgpIHtcbiAgICAvLyAgICAgIHRoaXMuX2dlbmVyYXRlQ29sdW1ucygpO1xuICAgIC8vICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBrZXlEb3duKHsga2V5IH06IHsga2V5OiBzdHJpbmcgfSkge1xuICAgICAgICBpZiAoa2V5ICE9PSAnQ29udHJvbCcgfHwgdGhpcy5fY3RybERvd24gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N0cmxEb3duID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gICAga2V5VXAoeyBrZXkgfTogeyBrZXk6IHN0cmluZyB9KSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdDb250cm9sJyB8fCB0aGlzLl9jdHJsRG93biA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N0cmxEb3duID0gZmFsc2U7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dmlzaWJpbGl0eWNoYW5nZScsIFsnJGV2ZW50J10pXG4gICAgdmlzaWJpbGl0eUNoYW5nZSgpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAhPT0gJ2hpZGRlbicgfHwgdGhpcy5fY3RybERvd24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jdHJsRG93biA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uUXVlcnlDaGFuZ2UoeyBkZXRhaWwgfTogQ3VzdG9tRXZlbnQ8c3RyaW5nPikge1xuICAgICAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQoZGV0YWlsKTtcbiAgICB9XG5cbiAgICBvblF1aWNrRmlsdGVyKHsgZGV0YWlsIH06IEN1c3RvbUV2ZW50PGFueT4pIHtcbiAgICAgICAgdGhpcy5xdWlja0ZpbHRlci5lbWl0KGRldGFpbCk7XG4gICAgfVxuXG4gICAgb25QYWdlU2l6ZUNoYW5nZSh7IGRldGFpbCB9OiBDdXN0b21FdmVudDxudW1iZXI+KSB7XG4gICAgICAgIHRoaXMucGFnZVNpemVDaGFuZ2UuZW1pdChkZXRhaWwpO1xuICAgIH1cblxuICAgIG9uUGFnZUNoYW5nZSh7IGRldGFpbCB9OiBDdXN0b21FdmVudDxudW1iZXI+KSB7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KGRldGFpbCk7XG4gICAgfVxuXG4gICAgb25GaWx0ZXJNb2RhbFNhdmUoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTYXZlLm5leHQoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIG9uRmlsdGVyTW9kYWxSZXNldChyZXNldFF1aWNrRmlsdGVyID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFJlc2V0Lm5leHQocmVzZXRRdWlja0ZpbHRlcik7XG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTaG93JC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUl0ZW1zKGl0ZW1zOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpdGVtcykge1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRJdGVtcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gaXRlbXM7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gSlNPTi5wYXJzZShpdGVtcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2VuZXJhdGVDb2x1bW5zKCkge1xuICAgICAgICAvLyBjb25zdCBkZWZpbml0aW9ucyA9XG4gICAgICAgIC8vIFx0dGhpcy5fZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdwLXRhYmxlLWRlZmluaXRpb24nKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gQXJyYXkuZnJvbSh0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gIHByaXZhdGUgX2dldEhlYWRlcigpIHtcbiAgICAvLyAgICAgIHJldHVybiAoXG4gICAgLy8gICAgICAgICAgPHAtdGFibGUtcm93IHZhcmlhbnQ9XCJoZWFkZXJcIj5cbiAgICAvLyAgICAgICAgICAgICAge3RoaXMuX2NvbHVtbnMubWFwKChjb2w6IFRhYmxlRGVmaW5pdGlvbiwgaW5kZXgpID0+IChcbiAgICAvLyAgICAgICAgICAgICAgICAgIDxwLXRhYmxlLWNvbHVtblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb249e2NvbH1cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29sLm5hbWV9XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImhlYWRlclwiXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3g9e3RoaXMuX2dldENoZWNrYm94KGluZGV4LCBudWxsLCAnaGVhZGVyJyl9XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgIC8vICAgICAgICAgICAgICAgICAgPjwvcC10YWJsZS1jb2x1bW4+XG4gICAgLy8gICAgICAgICAgICAgICkpfVxuICAgIC8vICAgICAgICAgIDwvcC10YWJsZS1yb3c+XG4gICAgLy8gICAgICApO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0Um93cygpIHtcbiAgICAvLyAgICAgIGlmICh0aGlzLmxvYWRpbmcpIHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAvLyAgICAgICAgICAgICAge1xuICAgIC8vICAgICAgICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG4gICAgLy8gICAgICAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICAgICAgIChfLCBpKSA9PiAoXG4gICAgLy8gICAgICAgICAgICAgICAgICA8cC10YWJsZS1yb3dcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBlbmFibGVIb3Zlcj17XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlUm93U2VsZWN0aW9uIHx8IHRoaXMuZW5hYmxlUm93Q2xpY2tcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgICAgICA+XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAge3RoaXMuX2dldExvYWRpbmdDb2x1bW5zKGkpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAvLyAgICAgICAgICAgICAgKVxuICAgIC8vICAgICAgICAgICk7XG4gICAgLy8gICAgICB9XG5cbiAgICAvLyAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgLy8gICAgICAgICAgPHAtdGFibGUtcm93XG4gICAgLy8gICAgICAgICAgICAgIGVuYWJsZUhvdmVyPXt0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbiB8fCB0aGlzLmVuYWJsZVJvd0NsaWNrfVxuICAgIC8vICAgICAgICAgICAgICBvbkNsaWNrPXsoZXYpID0+IHRoaXMuX3Jvd0NsaWNrKGV2LCBpbmRleCl9XG4gICAgLy8gICAgICAgICAgPlxuICAgIC8vICAgICAgICAgICAgICB7dGhpcy5fZ2V0Um93Q29sdW1ucyhpdGVtLCBpbmRleCl9XG4gICAgLy8gICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAvLyAgICAgICkpO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0Um93Q29sdW1ucyhpdGVtLCBpbmRleCkge1xuICAgIC8vICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMubWFwKChjb2w6IFRhYmxlRGVmaW5pdGlvbiwgY29sSW5kZXgpID0+IHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gKFxuICAgIC8vICAgICAgICAgICAgICA8cC10YWJsZS1jb2x1bW5cbiAgICAvLyAgICAgICAgICAgICAgICAgIGRlZmluaXRpb249e2NvbH1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGl0ZW09e2l0ZW19XG4gICAgLy8gICAgICAgICAgICAgICAgICBjaGVja2JveD17dGhpcy5fZ2V0Q2hlY2tib3goY29sSW5kZXgsIGluZGV4KX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGluZGV4PXtjb2xJbmRleH1cbiAgICAvLyAgICAgICAgICAgICAgICAgIHJvd0luZGV4PXtpbmRleH1cbiAgICAvLyAgICAgICAgICAgICAgPjwvcC10YWJsZS1jb2x1bW4+XG4gICAgLy8gICAgICAgICAgKTtcbiAgICAvLyAgICAgIH0pO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0TG9hZGluZ0NvbHVtbnMoaW5kZXgpIHtcbiAgICAvLyAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLm1hcCgoY29sOiBUYWJsZURlZmluaXRpb24sIGNvbEluZGV4KSA9PiB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuIChcbiAgICAvLyAgICAgICAgICAgICAgPHAtdGFibGUtY29sdW1uXG4gICAgLy8gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uPXtjb2x9XG4gICAgLy8gICAgICAgICAgICAgICAgICB2YXJpYW50PVwibG9hZGluZ1wiXG4gICAgLy8gICAgICAgICAgICAgICAgICBjaGVja2JveD17dGhpcy5fZ2V0Q2hlY2tib3goY29sSW5kZXgsIGluZGV4LCAnbG9hZGluZycpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgaW5kZXg9e2NvbEluZGV4fVxuICAgIC8vICAgICAgICAgICAgICAgICAgcm93SW5kZXg9e2luZGV4fVxuICAgIC8vICAgICAgICAgICAgICA+PC9wLXRhYmxlLWNvbHVtbj5cbiAgICAvLyAgICAgICAgICApO1xuICAgIC8vICAgICAgfSk7XG4gICAgLy8gIH1cblxuICAgIC8vICBwcml2YXRlIF9nZXRDaGVja2JveChcbiAgICAvLyAgICAgIGluZGV4LFxuICAgIC8vICAgICAgcm93SW5kZXgsXG4gICAgLy8gICAgICB2YXJpYW50OiAnaGVhZGVyJyB8ICdkZWZhdWx0JyB8ICdsb2FkaW5nJyA9ICdkZWZhdWx0J1xuICAgIC8vICApIHtcbiAgICAvLyAgICAgIGlmICghdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24gfHwgIXRoaXMuc2VsZWN0aW9uS2V5IHx8IGluZGV4ICE9PSAwKSB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICAgfVxuXG4gICAgLy8gICAgICBpZiAodmFyaWFudCA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuIDxwLWxvYWRlciB2YXJpYW50PVwiZ2hvc3RcIiBjbGFzcz1cInJvdW5kZWQgdy02IGgtNlwiIC8+O1xuICAgIC8vICAgICAgfVxuXG4gICAgLy8gICAgICBpZiAodmFyaWFudCA9PT0gJ2hlYWRlcicpIHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gKFxuICAgIC8vICAgICAgICAgICAgICA8aW5wdXRcbiAgICAvLyAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dFwiXG4gICAgLy8gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgIC8vICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldikgPT4gdGhpcy5fc2VsZWN0QWxsQ2hhbmdlKGV2KX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3RoaXMuX3NlbGVjdGlvbkNvbnRhaW5zQWxsKCl9XG4gICAgLy8gICAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlPXt0aGlzLl9zZWxlY3Rpb25JbmRldGVybWluYXRlKCl9XG4gICAgLy8gICAgICAgICAgICAgIC8+XG4gICAgLy8gICAgICAgICAgKTtcbiAgICAvLyAgICAgIH1cblxuICAgIC8vICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2l0ZW1zW3Jvd0luZGV4XTtcblxuICAgIC8vICAgICAgcmV0dXJuIChcbiAgICAvLyAgICAgICAgICA8aW5wdXRcbiAgICAvLyAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0XCJcbiAgICAvLyAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAvLyAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldikgPT4gdGhpcy5fY2hlY2tib3hDaGFuZ2UoZXY/LnRhcmdldCwgcm93SW5kZXgpfVxuICAgIC8vICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5jYW5TZWxlY3RLZXkgJiYgIWl0ZW1bdGhpcy5jYW5TZWxlY3RLZXldfVxuICAgIC8vICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCByb3dJbmRleCl9XG4gICAgLy8gICAgICAgICAgLz5cbiAgICAvLyAgICAgICk7XG4gICAgLy8gIH1cblxuICAgIHB1YmxpYyBfY2hlY2tib3hEaXNhYmxlZChpdGVtOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuU2VsZWN0S2V5ICYmICFpdGVtW3RoaXMuY2FuU2VsZWN0S2V5XTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NlbGVjdEFsbENoYW5nZSgkZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2dldENoZWNrZWRWYWx1ZSgkZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB0b0FkZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5TZWxlY3RLZXkgJiYgIXJvd1t0aGlzLmNhblNlbGVjdEtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKHJvdywgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChyb3cpO1xuICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChyb3cpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFsuLi50aGlzLnNlbGVjdGVkUm93cywgLi4udG9BZGRdO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRSb3dzW2ldO1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtcy5maW5kKFxuICAgICAgICAgICAgICAgIChkKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZShkLCBpKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VsZWN0aW9uVmFsdWUodmFsdWUsIGkpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd0Rlc2VsZWN0ZWQuZW1pdChyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgfVxuXG4gICAgcHVibGljIF9jaGVja2JveENoYW5nZSh0YXJnZXQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3cgPSB0aGlzLnBhcnNlZEl0ZW1zW2luZGV4XTtcblxuICAgICAgICBpZiAodGhpcy5jYW5TZWxlY3RLZXkgJiYgIXJvd1t0aGlzLmNhblNlbGVjdEtleV0pIHtcbiAgICAgICAgICAgIHRhcmdldC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2dldENoZWNrZWRWYWx1ZSh0YXJnZXQpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gWy4uLnRoaXMuc2VsZWN0ZWRSb3dzLCByb3ddO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQocm93KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4T2ZUb1JlbW92ZSA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKHJvdywgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZG8gdGhpcywgYmVjYXVzZSBzcGxpY2UgZG9lcyBub3QgdHJpZ2dlciB0aGUgc2VsZWN0aW9uIHNldHRlci5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gWy4uLnRoaXMuc2VsZWN0ZWRSb3dzXTtcbiAgICAgICAgc2VsZWN0aW9uLnNwbGljZShpbmRleE9mVG9SZW1vdmUsIDEpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgICAgIHRoaXMucm93RGVzZWxlY3RlZC5lbWl0KHJvdyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q2hlY2tlZFZhbHVlKHRhcmdldDogYW55KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ/LmNoZWNrZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2VsZWN0aW9uVmFsdWUocm93OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uS2V5ID8gcm93Py5bdGhpcy5zZWxlY3Rpb25LZXldIHx8IGluZGV4IDogaW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIF9zZWxlY3Rpb25Db250YWlucyhcbiAgICAgICAgcm93OiBhbnksXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHJldHVybkluZGV4ID0gZmFsc2VcbiAgICApOiBhbnkge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHRoaXMuc2VsZWN0ZWRSb3dzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKHJvdywgaW5kZXgpID09PVxuICAgICAgICAgICAgICAgIHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKGl0ZW0sIGluZGV4KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gIXJldHVybkluZGV4ID8gcmV0dXJuVmFsdWUgPj0gMCA6IHJldHVyblZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2VsZWN0aW9uQ29udGFpbnNBbGwoKSB7XG4gICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFyc2VkSXRlbXM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5zID0gdGhpcy5fc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgaSk7XG5cbiAgICAgICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGggfHwgIXRoaXMuc2VsZWN0ZWRSb3dzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb250YWluc0NvdW50ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaV07XG4gICAgICAgICAgICBjb25zdCBjb250YWlucyA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIGkpO1xuXG4gICAgICAgICAgICBpZiAoY29udGFpbnMpIHtcbiAgICAgICAgICAgICAgICBjb250YWluc0NvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbnNDb3VudCA+IDAgJiYgY29udGFpbnNDb3VudCAhPT0gdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIF9yb3dDbGljaygkZXZlbnQ6IHsgdGFyZ2V0OiBhbnkgfSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgfHxcbiAgICAgICAgICAgIHRhcmdldC50eXBlID09PSAnY2hlY2tib3gnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5fZmluZFJvdygkZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICBpZiAodGhpcy5lbmFibGVSb3dDbGljaykge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5fZmluZFJvd0FjdGlvbigkZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5yb3dDbGljay5lbWl0KHtcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIGN0cmxEb3duOiB0aGlzLl9jdHJsRG93bixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hlY2tib3ggPSByb3c/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuXG4gICAgICAgIGlmICghY2hlY2tib3gpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSAhY2hlY2tib3guY2hlY2tlZDtcbiAgICAgICAgdGhpcy5fY2hlY2tib3hDaGFuZ2UoY2hlY2tib3gsIGluZGV4KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9maW5kUm93KGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuICAgICAgICBpZiAoIWVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWw/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdwLXRhYmxlLXJvdycpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kUm93KGVsPy5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9maW5kUm93QWN0aW9uKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuICAgICAgICBpZiAoIWVsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pcy1hY3Rpb24nKSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWlzLWFjdGlvbicpICE9PSAnZmFsc2UnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsPy50YWdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAncC10YWJsZS1yb3cnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kUm93QWN0aW9uKGVsPy5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG59XG4iLCI8cC10YWJsZS1jb250YWluZXI+XG4gICAgPHAtdGFibGUtaGVhZGVyXG4gICAgICAgIFtxdWlja0ZpbHRlcnNdPVwicXVpY2tGaWx0ZXJzXCJcbiAgICAgICAgW2FjdGl2ZVF1aWNrRmlsdGVySWRlbnRpZmllcl09XCJhY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXJcIlxuICAgICAgICAocXVpY2tGaWx0ZXIpPVwiKG9uUXVpY2tGaWx0ZXIpXCJcbiAgICAgICAgW2VuYWJsZVNlYXJjaF09XCJlbmFibGVTZWFyY2hcIlxuICAgICAgICBbcXVlcnldPVwicXVlcnlcIlxuICAgICAgICAocXVlcnlDaGFuZ2UpPVwiKG9uUXVlcnlDaGFuZ2UpXCJcbiAgICAgICAgW2VuYWJsZUZpbHRlcl09XCJmaWx0ZXJNb2RhbFRlbXBsYXRlXCJcbiAgICAgICAgW3NlbGVjdGVkRmlsdGVyc0Ftb3VudF09XCJzZWxlY3RlZEZpbHRlcnNBbW91bnRcIlxuICAgICAgICBbZmlsdGVyQnV0dG9uVGVtcGxhdGVdPVwiZmlsdGVyQnV0dG9uVGVtcGxhdGVcIlxuICAgICAgICAoZmlsdGVyKT1cImZpbHRlck1vZGFsU2hvdyQubmV4dCh0cnVlKVwiXG4gICAgICAgIFtlbmFibGVFZGl0XT1cImVuYWJsZUVkaXRcIlxuICAgICAgICBbY2FuRWRpdF09XCIhIXNlbGVjdGVkUm93cy5sZW5ndGhcIlxuICAgICAgICBbZWRpdEJ1dHRvblRlbXBsYXRlXT1cImVkaXRCdXR0b25UZW1wbGF0ZVwiXG4gICAgICAgIChlZGl0KT1cImVkaXQuZW1pdCgpXCJcbiAgICAgICAgW2l0ZW1zU2VsZWN0ZWRBbW91bnRdPVwic2VsZWN0ZWRSb3dzLmxlbmd0aFwiXG4gICAgPjwvcC10YWJsZS1oZWFkZXI+XG5cbiAgICA8cC10YWJsZS1yb3cgdmFyaWFudD1cImhlYWRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxwLXRhYmxlLWNlbGwtbmd4XG4gICAgICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiY29sXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29sLm5hbWVcIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJoZWFkZXJcIlxuICAgICAgICAgICAgICAgIFtpbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrYm94XT1cIlxuICAgICAgICAgICAgICAgICAgICBpbmRleCA9PT0gMCAmJiBlbmFibGVSb3dTZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gY2hlY2tib3hUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvcC10YWJsZS1jZWxsLW5neD5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tib3hUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJfc2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJfc2VsZWN0aW9uQ29udGFpbnNBbGwoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIl9zZWxlY3Rpb25JbmRldGVybWluYXRlKClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3AtdGFibGUtcm93PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmc7IGVsc2UgY29udGVudFRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8cC10YWJsZS1yb3dcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBsb2FkaW5nUm93czsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtlbmFibGVIb3Zlcl09XCJlbmFibGVSb3dTZWxlY3Rpb24gfHwgZW5hYmxlUm93Q2xpY2tcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZS1jZWxsLW5neFxuICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJsb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2JveF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9PT0gMCAmJiBlbmFibGVSb3dTZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjaGVja2JveFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dJbmRleF09XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID48L3AtdGFibGUtY2VsbC1uZ3g+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tib3hUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkIHctNiBoLTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcC1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3AtdGFibGUtcm93PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtcz8ubGVuZ3RoOyBlbHNlIGVtcHR5U3RhdGVUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxwLXRhYmxlLXJvd1xuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbZW5hYmxlSG92ZXJdPVwiZW5hYmxlUm93U2VsZWN0aW9uIHx8IGVuYWJsZVJvd0NsaWNrXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9yb3dDbGljaygkZXZlbnQsIHJvd0luZGV4KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtdGFibGUtY2VsbC1uZ3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmaW5pdGlvbl09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2JveF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDAgJiYgZW5hYmxlUm93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNoZWNrYm94VGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dJbmRleF09XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbC50ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9wLXRhYmxlLWNlbGwtbmd4PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hlY2tib3hDaGFuZ2UoJGV2ZW50LnRhcmdldCwgcm93SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJfY2hlY2tib3hEaXNhYmxlZChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCByb3dJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3AtdGFibGUtcm93PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG5cbiAgICA8cC10YWJsZS1mb290ZXJcbiAgICAgICAgW2hpZGVPblNpbmdsZVBhZ2VdPVwiaGlkZU9uU2luZ2xlUGFnZVwiXG4gICAgICAgIFtlbmFibGVQYWdlU2l6ZV09XCJlbmFibGVQYWdlU2l6ZVwiXG4gICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIihwYWdlU2l6ZUNoYW5nZSlcIlxuICAgICAgICBbZW5hYmxlUGFnaW5hdGlvbl09XCJlbmFibGVQYWdpbmF0aW9uXCJcbiAgICAgICAgW3BhZ2VdPVwicGFnZVwiXG4gICAgICAgIFt0b3RhbF09XCJ0b3RhbFwiXG4gICAgICAgIChwYWdlQ2hhbmdlKT1cIihwYWdlQ2hhbmdlKVwiXG4gICAgICAgIFtlbmFibGVFeHBvcnRdPVwiZW5hYmxlRXhwb3J0XCJcbiAgICAgICAgKGV4cG9ydCk9XCJleHBvcnQuZW1pdCgpXCJcbiAgICA+PC9wLXRhYmxlLWZvb3Rlcj5cbjwvcC10YWJsZS1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJNb2RhbFRlbXBsYXRlXCI+XG4gICAgPHAtbW9kYWxcbiAgICAgICAgW2hlYWRlcl09XCJmaWx0ZXJNb2RhbEhlYWRlclRleHRcIlxuICAgICAgICBbc2hvd109XCJmaWx0ZXJNb2RhbFNob3ckIHwgYXN5bmNcIlxuICAgICAgICAoY2xvc2UpPVwiZmlsdGVyTW9kYWxTaG93JC5uZXh0KGZhbHNlKVwiXG4gICAgPlxuICAgICAgICA8ZGl2IHNsb3Q9XCJjb250ZW50XCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWx0ZXJNb2RhbFRlbXBsYXRlXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc2xvdD1cImZvb3RlclwiIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgdy1mdWxsXCI+XG4gICAgICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlck1vZGFsU2hvd1Jlc2V0TW9iaWxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZGVza3RvcC14czpoaWRkZW4gdy1mdWxsIHRhYmxldDp3LWF1dG9cIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uRmlsdGVyTW9kYWxSZXNldCh0cnVlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgZmlsdGVyTW9kYWxSZXNldFRleHQgfX1cbiAgICAgICAgICAgIDwvcC1idXR0b24+XG4gICAgICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlck1vZGFsU2hvd1Jlc2V0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlbiBkZXNrdG9wLXhzOmZsZXggdy1mdWxsIHRhYmxldDp3LWF1dG9cIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uRmlsdGVyTW9kYWxSZXNldCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBmaWx0ZXJNb2RhbFJlc2V0VGV4dCB9fVxuICAgICAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtYXV0byB3LWZ1bGwgdGFibGV0OnctYXV0b1wiXG4gICAgICAgICAgICAgICAgaWNvbj1cImNoZWNrbWFya1wiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFNhdmUoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgZmlsdGVyTW9kYWxTYXZlVGV4dCB9fVxuICAgICAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9wLW1vZGFsPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTdGF0ZVRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJlbXB0eVN0YXRlVHlwZSA9PT0gJ2ZpbHRlcmVkJzsgZWxzZSBlbXB0eVN0YXRlTm9uRmlsdGVyVGVtcGxhdGVcIlxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgZmxleCBmbGV4LWNvbFxuICAgICAgICAgICAgaXRlbXMtY2VudGVyXG4gICAgICAgICAgICB0ZXh0LWNlbnRlclxuICAgICAgICAgICAgcHktMjRcbiAgICAgICAgICAgIG1heC13LVsyMHJlbV1cbiAgICAgICAgICAgIHNlbGYtY2VudGVyXG4gICAgICAgIFwiXG4gICAgPlxuICAgICAgICA8cC1pbGx1c3RyYXRpb25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJlbXB0eS1zdGF0ZS1zZWFyY2hcIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi02XCJcbiAgICAgICAgPjwvcC1pbGx1c3RyYXRpb24+XG4gICAgICAgIDxwIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXN0b3JtLWRlZmF1bHRcIj5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVGaWx0ZXJlZEhlYWRlciB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LXN0b3JtLW1lZGl1bSBtYi0xNFwiPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUZpbHRlcmVkQ29udGVudCB9fVxuICAgICAgICA8L3A+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5U3RhdGVOb25GaWx0ZXJUZW1wbGF0ZT5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICBmbGV4IGZsZXgtY29sXG4gICAgICAgICAgICBpdGVtcy1jZW50ZXJcbiAgICAgICAgICAgIHRleHQtY2VudGVyXG4gICAgICAgICAgICBweS0yNFxuICAgICAgICAgICAgbWF4LXctWzIwcmVtXVxuICAgICAgICAgICAgc2VsZi1jZW50ZXJcbiAgICAgICAgXCJcbiAgICA+XG4gICAgICAgIDxwLWlsbHVzdHJhdGlvblxuICAgICAgICAgICAgdmFyaWFudD1cImVtcHR5LXN0YXRlLW92ZXJ2aWV3XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbWItNlwiXG4gICAgICAgICAgICAob25DbGljayk9XCJlbXB0eVN0YXRlQWN0aW9uQ2xpY2suZW1pdCgpXCJcbiAgICAgICAgPjwvcC1pbGx1c3RyYXRpb24+XG4gICAgICAgIDxwIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXN0b3JtLWRlZmF1bHRcIj5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVIZWFkZXIgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtc20gdGV4dC1zdG9ybS1tZWRpdW0gbWItNlwiPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUNvbnRlbnQgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgaWNvbj1cInBsdXNcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIChvbkNsaWNrKT1cImVtcHR5U3RhdGVBY3Rpb25DbGljay5lbWl0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyBlbXB0eVN0YXRlQWN0aW9uIH19XG4gICAgICAgIDwvcC1idXR0b24+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19