@paperless/angular 0.1.0-alpha.25 → 0.1.0-alpha.251
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/esm2020/lib/animations/index.mjs +2 -0
- package/esm2020/lib/animations/slide.mjs +20 -0
- package/esm2020/lib/base/index.mjs +2 -1
- package/esm2020/lib/base/upload.component.mjs +57 -0
- package/esm2020/lib/base/value-accessor.mjs +8 -8
- package/esm2020/lib/directives/index.mjs +12 -4
- package/esm2020/lib/directives/p-page-size-select.directive.mjs +42 -0
- package/esm2020/lib/directives/p-pagination.directive.mjs +42 -0
- package/esm2020/lib/directives/p-select.directive.mjs +38 -0
- package/esm2020/lib/modules/index.mjs +6 -0
- package/esm2020/lib/modules/table/base/form.component.mjs +105 -0
- package/esm2020/lib/modules/table/base/index.mjs +3 -0
- package/esm2020/lib/modules/table/base/table.component.mjs +201 -0
- package/esm2020/lib/modules/table/components/index.mjs +8 -0
- package/esm2020/lib/modules/table/components/table/constants.mjs +3 -0
- package/esm2020/lib/modules/table/components/table/table.component.mjs +636 -0
- package/esm2020/lib/modules/table/components/table-cell/table-cell.component.mjs +167 -0
- package/esm2020/lib/modules/table/components/table-column/table-column.component.mjs +37 -0
- package/esm2020/lib/modules/table/directives/index.mjs +18 -0
- package/esm2020/lib/modules/table/directives/p-table-filter-modal.directive.mjs +13 -0
- package/esm2020/lib/modules/table/directives/p-table-footer.directive.mjs +52 -0
- package/esm2020/lib/modules/table/directives/p-table-header.directive.mjs +60 -0
- package/esm2020/lib/modules/table/directives/p-table-ngx.directive.mjs +101 -0
- package/esm2020/lib/modules/table/directives/p-table.directive.mjs +78 -0
- package/esm2020/lib/modules/table/index.mjs +6 -0
- package/esm2020/lib/modules/table/table.module.mjs +28 -0
- package/esm2020/lib/modules/table/utils.mjs +23 -0
- package/esm2020/lib/modules/toast/components/index.mjs +4 -0
- package/esm2020/lib/modules/toast/components/toast-container/toast-container.component.mjs +36 -0
- package/esm2020/lib/modules/toast/directives/index.mjs +4 -0
- package/esm2020/lib/modules/toast/directives/toast.directive.mjs +52 -0
- package/esm2020/lib/modules/toast/index.mjs +6 -0
- package/esm2020/lib/modules/toast/services/index.mjs +4 -0
- package/esm2020/lib/modules/toast/services/toast.service.mjs +47 -0
- package/esm2020/lib/modules/toast/toast.module.mjs +22 -0
- package/esm2020/lib/modules/toast/types.mjs +10 -0
- package/esm2020/lib/paperless.module.mjs +29 -11
- package/esm2020/lib/pipes/currency.pipe.mjs +20 -0
- package/esm2020/lib/pipes/date.pipe.mjs +20 -0
- package/esm2020/lib/pipes/index.mjs +8 -0
- package/esm2020/lib/pipes/safe.pipe.mjs +33 -0
- package/esm2020/lib/stencil/components.mjs +974 -70
- package/esm2020/lib/stencil/index.mjs +37 -1
- package/esm2020/lib/stencil.module.mjs +17 -0
- package/esm2020/public-api.mjs +5 -1
- package/fesm2015/paperless-angular.mjs +2891 -162
- package/fesm2015/paperless-angular.mjs.map +1 -1
- package/fesm2020/paperless-angular.mjs +2905 -162
- package/fesm2020/paperless-angular.mjs.map +1 -1
- package/{paperless-angular.d.ts → index.d.ts} +0 -0
- package/lib/animations/index.d.ts +1 -0
- package/lib/animations/slide.d.ts +2 -0
- package/lib/base/index.d.ts +1 -0
- package/lib/base/upload.component.d.ts +16 -0
- package/lib/base/value-accessor.d.ts +6 -6
- package/lib/directives/index.d.ts +5 -3
- package/lib/directives/p-page-size-select.directive.d.ts +10 -0
- package/lib/directives/{pagination.directive.d.ts → p-pagination.directive.d.ts} +3 -3
- package/lib/directives/p-select.directive.d.ts +9 -0
- package/lib/modules/index.d.ts +4 -0
- package/lib/modules/table/base/form.component.d.ts +15 -0
- package/lib/modules/table/base/index.d.ts +2 -0
- package/lib/modules/table/base/table.component.d.ts +58 -0
- package/lib/modules/table/components/index.d.ts +7 -0
- package/lib/modules/table/components/table/constants.d.ts +2 -0
- package/lib/modules/table/components/table/table.component.d.ts +214 -0
- package/lib/modules/table/components/table-cell/table-cell.component.d.ts +45 -0
- package/lib/modules/table/components/table-column/table-column.component.d.ts +17 -0
- package/lib/modules/table/directives/index.d.ts +11 -0
- package/lib/modules/table/directives/p-table-filter-modal.directive.d.ts +5 -0
- package/lib/modules/table/directives/p-table-footer.directive.d.ts +11 -0
- package/lib/modules/table/directives/p-table-header.directive.d.ts +17 -0
- package/lib/modules/table/directives/p-table-ngx.directive.d.ts +26 -0
- package/lib/modules/table/directives/p-table.directive.d.ts +22 -0
- package/lib/modules/table/index.d.ts +5 -0
- package/lib/modules/table/table.module.d.ts +16 -0
- package/lib/modules/table/utils.d.ts +10 -0
- package/lib/modules/toast/components/index.d.ts +3 -0
- package/lib/modules/toast/components/toast-container/toast-container.component.d.ts +17 -0
- package/lib/modules/toast/directives/index.d.ts +3 -0
- package/lib/modules/toast/directives/toast.directive.d.ts +16 -0
- package/lib/modules/toast/index.d.ts +5 -0
- package/lib/modules/toast/services/index.d.ts +3 -0
- package/lib/modules/toast/services/toast.service.d.ts +12 -0
- package/lib/modules/toast/toast.module.d.ts +10 -0
- package/lib/modules/toast/types.d.ts +30 -0
- package/lib/paperless.module.d.ts +13 -3
- package/lib/pipes/currency.pipe.d.ts +10 -0
- package/lib/pipes/date.pipe.d.ts +10 -0
- package/lib/pipes/index.d.ts +7 -0
- package/lib/pipes/safe.pipe.d.ts +10 -0
- package/lib/stencil/components.d.ts +403 -14
- package/lib/stencil/index.d.ts +1 -1
- package/lib/stencil.module.d.ts +7 -0
- package/package.json +7 -6
- package/public-api.d.ts +4 -0
- package/esm2020/lib/directives/pagination.directive.mjs +0 -42
|
@@ -0,0 +1,636 @@
|
|
|
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.filterModalShow = new EventEmitter();
|
|
145
|
+
this.filterModalSave = new EventEmitter();
|
|
146
|
+
this.filterModalReset = new EventEmitter();
|
|
147
|
+
this.filterModalShowReset$ = new BehaviorSubject(false);
|
|
148
|
+
this.filterModalShowResetMobile$ = new BehaviorSubject(false);
|
|
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
|
+
console.log('ngOnChanges', changes);
|
|
177
|
+
if (changes['activeQuickFilterIdentifier'] ||
|
|
178
|
+
changes['selectedFiltersAmount']) {
|
|
179
|
+
const selectedFiltersAmount = changes['activeQuickFilterIdentifier'].currentValue;
|
|
180
|
+
if (selectedFiltersAmount > 0) {
|
|
181
|
+
console.log('Setting filterModalShowReset to true');
|
|
182
|
+
this.filterModalShowReset$.next(true);
|
|
183
|
+
}
|
|
184
|
+
const activeQuickFilterIdentifier = changes['activeQuickFilterIdentifier'].currentValue;
|
|
185
|
+
const activeQuickFilter = this.quickFilters.find((f) => (f.identifier = activeQuickFilterIdentifier));
|
|
186
|
+
console.log('activeQuickFilter', activeQuickFilter);
|
|
187
|
+
if (selectedFiltersAmount > 0 || !activeQuickFilter?.default) {
|
|
188
|
+
console.log('Setting filterModalShowResetMobile to true');
|
|
189
|
+
this.filterModalShowResetMobile$.next(true);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
console.log('Hiding reset buttonts');
|
|
193
|
+
this.filterModalShowReset$.next(false);
|
|
194
|
+
this.filterModalShowResetMobile$.next(false);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// @HostListener('body:tableDefinitionChanged', { target: 'body' })
|
|
198
|
+
// onTableDefinitionUpdated() {
|
|
199
|
+
// this._generateColumns();
|
|
200
|
+
// }
|
|
201
|
+
keyDown({ key }) {
|
|
202
|
+
if (key !== 'Control' || this._ctrlDown === true) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
this._ctrlDown = true;
|
|
206
|
+
}
|
|
207
|
+
keyUp({ key }) {
|
|
208
|
+
if (key !== 'Control' || this._ctrlDown === false) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
this._ctrlDown = false;
|
|
212
|
+
}
|
|
213
|
+
visibilityChange() {
|
|
214
|
+
if (document.visibilityState !== 'hidden' || this._ctrlDown === false) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
this._ctrlDown = false;
|
|
218
|
+
}
|
|
219
|
+
onQueryChange({ detail }) {
|
|
220
|
+
this.queryChange.emit(detail);
|
|
221
|
+
}
|
|
222
|
+
onQuickFilter({ detail }) {
|
|
223
|
+
this.quickFilter.emit(detail);
|
|
224
|
+
}
|
|
225
|
+
onPageSizeChange({ detail }) {
|
|
226
|
+
this.pageSizeChange.emit(detail);
|
|
227
|
+
}
|
|
228
|
+
onPageChange({ detail }) {
|
|
229
|
+
this.pageChange.emit(detail);
|
|
230
|
+
}
|
|
231
|
+
onFilterModalSave() {
|
|
232
|
+
this.filterModalSave.next();
|
|
233
|
+
this.filterModalShow$.next(false);
|
|
234
|
+
}
|
|
235
|
+
onFilterModalReset(resetQuickFilter = false) {
|
|
236
|
+
this.filterModalReset.next(resetQuickFilter);
|
|
237
|
+
this.filterModalShow$.next(false);
|
|
238
|
+
}
|
|
239
|
+
_parseItems(items) {
|
|
240
|
+
if (!items) {
|
|
241
|
+
this.parsedItems = [];
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (Array.isArray(items)) {
|
|
245
|
+
this.parsedItems = items;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
this.parsedItems = JSON.parse(items);
|
|
249
|
+
}
|
|
250
|
+
_generateColumns() {
|
|
251
|
+
// const definitions =
|
|
252
|
+
// this._el.nativeElement.querySelectorAll('p-table-definition');
|
|
253
|
+
this.columns = Array.from(this._columnDefinitions);
|
|
254
|
+
}
|
|
255
|
+
// private _getHeader() {
|
|
256
|
+
// return (
|
|
257
|
+
// <p-table-row variant="header">
|
|
258
|
+
// {this._columns.map((col: TableDefinition, index) => (
|
|
259
|
+
// <p-table-column
|
|
260
|
+
// definition={col}
|
|
261
|
+
// value={col.name}
|
|
262
|
+
// variant="header"
|
|
263
|
+
// checkbox={this._getCheckbox(index, null, 'header')}
|
|
264
|
+
// index={index}
|
|
265
|
+
// ></p-table-column>
|
|
266
|
+
// ))}
|
|
267
|
+
// </p-table-row>
|
|
268
|
+
// );
|
|
269
|
+
// }
|
|
270
|
+
// private _getRows() {
|
|
271
|
+
// if (this.loading) {
|
|
272
|
+
// return Array.from(
|
|
273
|
+
// {
|
|
274
|
+
// length: this.amountOfLoadingRows,
|
|
275
|
+
// },
|
|
276
|
+
// (_, i) => (
|
|
277
|
+
// <p-table-row
|
|
278
|
+
// enableHover={
|
|
279
|
+
// this.enableRowSelection || this.enableRowClick
|
|
280
|
+
// }
|
|
281
|
+
// >
|
|
282
|
+
// {this._getLoadingColumns(i)}
|
|
283
|
+
// </p-table-row>
|
|
284
|
+
// )
|
|
285
|
+
// );
|
|
286
|
+
// }
|
|
287
|
+
// return this._items.map((item, index) => (
|
|
288
|
+
// <p-table-row
|
|
289
|
+
// enableHover={this.enableRowSelection || this.enableRowClick}
|
|
290
|
+
// onClick={(ev) => this._rowClick(ev, index)}
|
|
291
|
+
// >
|
|
292
|
+
// {this._getRowColumns(item, index)}
|
|
293
|
+
// </p-table-row>
|
|
294
|
+
// ));
|
|
295
|
+
// }
|
|
296
|
+
// private _getRowColumns(item, index) {
|
|
297
|
+
// return this._columns.map((col: TableDefinition, colIndex) => {
|
|
298
|
+
// return (
|
|
299
|
+
// <p-table-column
|
|
300
|
+
// definition={col}
|
|
301
|
+
// item={item}
|
|
302
|
+
// checkbox={this._getCheckbox(colIndex, index)}
|
|
303
|
+
// index={colIndex}
|
|
304
|
+
// rowIndex={index}
|
|
305
|
+
// ></p-table-column>
|
|
306
|
+
// );
|
|
307
|
+
// });
|
|
308
|
+
// }
|
|
309
|
+
// private _getLoadingColumns(index) {
|
|
310
|
+
// return this._columns.map((col: TableDefinition, colIndex) => {
|
|
311
|
+
// return (
|
|
312
|
+
// <p-table-column
|
|
313
|
+
// definition={col}
|
|
314
|
+
// variant="loading"
|
|
315
|
+
// checkbox={this._getCheckbox(colIndex, index, 'loading')}
|
|
316
|
+
// index={colIndex}
|
|
317
|
+
// rowIndex={index}
|
|
318
|
+
// ></p-table-column>
|
|
319
|
+
// );
|
|
320
|
+
// });
|
|
321
|
+
// }
|
|
322
|
+
// private _getCheckbox(
|
|
323
|
+
// index,
|
|
324
|
+
// rowIndex,
|
|
325
|
+
// variant: 'header' | 'default' | 'loading' = 'default'
|
|
326
|
+
// ) {
|
|
327
|
+
// if (!this.enableRowSelection || !this.selectionKey || index !== 0) {
|
|
328
|
+
// return;
|
|
329
|
+
// }
|
|
330
|
+
// if (variant === 'loading') {
|
|
331
|
+
// return <p-loader variant="ghost" class="rounded w-6 h-6" />;
|
|
332
|
+
// }
|
|
333
|
+
// if (variant === 'header') {
|
|
334
|
+
// return (
|
|
335
|
+
// <input
|
|
336
|
+
// class="p-input"
|
|
337
|
+
// type="checkbox"
|
|
338
|
+
// onChange={(ev) => this._selectAllChange(ev)}
|
|
339
|
+
// checked={this._selectionContainsAll()}
|
|
340
|
+
// indeterminate={this._selectionIndeterminate()}
|
|
341
|
+
// />
|
|
342
|
+
// );
|
|
343
|
+
// }
|
|
344
|
+
// const item = this._items[rowIndex];
|
|
345
|
+
// return (
|
|
346
|
+
// <input
|
|
347
|
+
// class="p-input"
|
|
348
|
+
// type="checkbox"
|
|
349
|
+
// onChange={(ev) => this._checkboxChange(ev?.target, rowIndex)}
|
|
350
|
+
// disabled={this.canSelectKey && !item[this.canSelectKey]}
|
|
351
|
+
// checked={this._selectionContains(item, rowIndex)}
|
|
352
|
+
// />
|
|
353
|
+
// );
|
|
354
|
+
// }
|
|
355
|
+
_checkboxDisabled(item) {
|
|
356
|
+
return this.canSelectKey && !item[this.canSelectKey];
|
|
357
|
+
}
|
|
358
|
+
_selectAllChange($event) {
|
|
359
|
+
if (!this.enableRowSelection) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const value = this._getCheckedValue($event.target);
|
|
363
|
+
if (value) {
|
|
364
|
+
const toAdd = [];
|
|
365
|
+
for (let i = 0; i < this.parsedItems.length; i++) {
|
|
366
|
+
const row = this.parsedItems[i];
|
|
367
|
+
if (this.canSelectKey && !row[this.canSelectKey]) {
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
if (this._selectionContains(row, i)) {
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
toAdd.push(row);
|
|
374
|
+
this.rowSelected.emit(row);
|
|
375
|
+
}
|
|
376
|
+
this.selectedRows = [...this.selectedRows, ...toAdd];
|
|
377
|
+
this.selectedRowsChange.emit(this.selectedRows);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
for (let i = 0; i < this.selectedRows.length; i++) {
|
|
381
|
+
const value = this.selectedRows[i];
|
|
382
|
+
const row = this.parsedItems.find((d) => this._getSelectionValue(d, i) ===
|
|
383
|
+
this._getSelectionValue(value, i));
|
|
384
|
+
if (!row) {
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
this.rowDeselected.emit(row);
|
|
388
|
+
}
|
|
389
|
+
this.selectedRows = [];
|
|
390
|
+
this.selectedRowsChange.emit(this.selectedRows);
|
|
391
|
+
}
|
|
392
|
+
_checkboxChange(target, index) {
|
|
393
|
+
if (!this.enableRowSelection) {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
const row = this.parsedItems[index];
|
|
397
|
+
if (this.canSelectKey && !row[this.canSelectKey]) {
|
|
398
|
+
target.checked = false;
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
const value = this._getCheckedValue(target);
|
|
402
|
+
if (value) {
|
|
403
|
+
this.selectedRows = [...this.selectedRows, row];
|
|
404
|
+
this.selectedRowsChange.emit(this.selectedRows);
|
|
405
|
+
this.rowSelected.emit(row);
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
const indexOfToRemove = this._selectionContains(row, index, true);
|
|
409
|
+
// we need to do this, because splice does not trigger the selection setter.
|
|
410
|
+
const selection = [...this.selectedRows];
|
|
411
|
+
selection.splice(indexOfToRemove, 1);
|
|
412
|
+
this.selectedRows = selection;
|
|
413
|
+
this.selectedRowsChange.emit(this.selectedRows);
|
|
414
|
+
this.rowDeselected.emit(row);
|
|
415
|
+
}
|
|
416
|
+
_getCheckedValue(target) {
|
|
417
|
+
return target?.checked;
|
|
418
|
+
}
|
|
419
|
+
_getSelectionValue(row, index) {
|
|
420
|
+
return this.selectionKey ? row?.[this.selectionKey] || index : index;
|
|
421
|
+
}
|
|
422
|
+
_selectionContains(row, index, returnIndex = false) {
|
|
423
|
+
const returnValue = this.selectedRows.findIndex((item) => this._getSelectionValue(row, index) ===
|
|
424
|
+
this._getSelectionValue(item, index));
|
|
425
|
+
return !returnIndex ? returnValue >= 0 : returnValue;
|
|
426
|
+
}
|
|
427
|
+
_selectionContainsAll() {
|
|
428
|
+
let returnValue = true;
|
|
429
|
+
if (!this.parsedItems?.length) {
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
for (let i = 0; i < this.parsedItems?.length; i++) {
|
|
433
|
+
const item = this.parsedItems[i];
|
|
434
|
+
const contains = this._selectionContains(item, i);
|
|
435
|
+
if (!contains) {
|
|
436
|
+
returnValue = false;
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return returnValue;
|
|
441
|
+
}
|
|
442
|
+
_selectionIndeterminate() {
|
|
443
|
+
if (!this.parsedItems?.length || !this.selectedRows?.length) {
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
let containsCount = 0;
|
|
447
|
+
for (let i = 0; i < this.parsedItems?.length; i++) {
|
|
448
|
+
const item = this.parsedItems[i];
|
|
449
|
+
const contains = this._selectionContains(item, i);
|
|
450
|
+
if (contains) {
|
|
451
|
+
containsCount++;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return containsCount > 0 && containsCount !== this.parsedItems.length;
|
|
455
|
+
}
|
|
456
|
+
_rowClick($event, index) {
|
|
457
|
+
const target = $event.target;
|
|
458
|
+
if (target.tagName.toLowerCase() === 'input' ||
|
|
459
|
+
target.type === 'checkbox') {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
const row = this._findRow($event.target);
|
|
463
|
+
if (this.enableRowClick) {
|
|
464
|
+
const action = this._findRowAction($event.target);
|
|
465
|
+
if (action) {
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
const item = this.parsedItems[index];
|
|
469
|
+
this.rowClick.emit({
|
|
470
|
+
item,
|
|
471
|
+
ctrlDown: this._ctrlDown,
|
|
472
|
+
});
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
if (!this.enableRowSelection) {
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
const checkbox = row?.querySelector('input[type="checkbox"]');
|
|
479
|
+
if (!checkbox) {
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
checkbox.checked = !checkbox.checked;
|
|
483
|
+
this._checkboxChange(checkbox, index);
|
|
484
|
+
}
|
|
485
|
+
_findRow(el) {
|
|
486
|
+
if (!el) {
|
|
487
|
+
return el;
|
|
488
|
+
}
|
|
489
|
+
if (el?.tagName?.toLowerCase() === 'p-table-row') {
|
|
490
|
+
return el;
|
|
491
|
+
}
|
|
492
|
+
return this._findRow(el?.parentElement);
|
|
493
|
+
}
|
|
494
|
+
_findRowAction(el) {
|
|
495
|
+
if (!el) {
|
|
496
|
+
return null;
|
|
497
|
+
}
|
|
498
|
+
if (el.getAttribute('data-is-action') !== null &&
|
|
499
|
+
el.getAttribute('data-is-action') !== 'false') {
|
|
500
|
+
return el;
|
|
501
|
+
}
|
|
502
|
+
if (el?.tagName?.toLowerCase() === 'p-table-row') {
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
return this._findRowAction(el?.parentElement);
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
Table.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: Table, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
509
|
+
Table.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", 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" }, 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\n <pre>{{ filterModalShowReset$ | async | json }}</pre>\n <pre>{{ filterModalShowResetMobile$ | async | json }}</pre>\n </div>\n <div slot=\"footer\" class=\"flex justify-between gap-4 w-full\">\n <p-button\n *ngIf=\"filterModalShowReset$ | async\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset()\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n class=\"ml-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: ["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" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
510
|
+
Table = __decorate([
|
|
511
|
+
UntilDestroy({ checkProperties: true })
|
|
512
|
+
], Table);
|
|
513
|
+
export { Table };
|
|
514
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: Table, decorators: [{
|
|
515
|
+
type: Component,
|
|
516
|
+
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\n <pre>{{ filterModalShowReset$ | async | json }}</pre>\n <pre>{{ filterModalShowResetMobile$ | async | json }}</pre>\n </div>\n <div slot=\"footer\" class=\"flex justify-between gap-4 w-full\">\n <p-button\n *ngIf=\"filterModalShowReset$ | async\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset()\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n class=\"ml-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"] }]
|
|
517
|
+
}], ctorParameters: function () { return []; }, propDecorators: { items: [{
|
|
518
|
+
type: Input
|
|
519
|
+
}], loading: [{
|
|
520
|
+
type: Input
|
|
521
|
+
}], amountOfLoadingRows: [{
|
|
522
|
+
type: Input
|
|
523
|
+
}], enableRowSelection: [{
|
|
524
|
+
type: Input
|
|
525
|
+
}], enableRowClick: [{
|
|
526
|
+
type: Input
|
|
527
|
+
}], selectedRows: [{
|
|
528
|
+
type: Input
|
|
529
|
+
}], selectedRowsChange: [{
|
|
530
|
+
type: Output
|
|
531
|
+
}], selectionKey: [{
|
|
532
|
+
type: Input
|
|
533
|
+
}], canSelectKey: [{
|
|
534
|
+
type: Input
|
|
535
|
+
}], rowClick: [{
|
|
536
|
+
type: Output
|
|
537
|
+
}], rowSelected: [{
|
|
538
|
+
type: Output
|
|
539
|
+
}], rowDeselected: [{
|
|
540
|
+
type: Output
|
|
541
|
+
}], quickFilters: [{
|
|
542
|
+
type: Input
|
|
543
|
+
}], activeQuickFilterIdentifier: [{
|
|
544
|
+
type: Input
|
|
545
|
+
}], enableSearch: [{
|
|
546
|
+
type: Input
|
|
547
|
+
}], query: [{
|
|
548
|
+
type: Input
|
|
549
|
+
}], enableFilter: [{
|
|
550
|
+
type: Input
|
|
551
|
+
}], selectedFiltersAmount: [{
|
|
552
|
+
type: Input
|
|
553
|
+
}], filterButtonTemplate: [{
|
|
554
|
+
type: Input
|
|
555
|
+
}], enableEdit: [{
|
|
556
|
+
type: Input
|
|
557
|
+
}], editButtonTemplate: [{
|
|
558
|
+
type: Input
|
|
559
|
+
}], quickFilter: [{
|
|
560
|
+
type: Output
|
|
561
|
+
}], queryChange: [{
|
|
562
|
+
type: Output
|
|
563
|
+
}], filter: [{
|
|
564
|
+
type: Output
|
|
565
|
+
}], edit: [{
|
|
566
|
+
type: Output
|
|
567
|
+
}], enablePageSize: [{
|
|
568
|
+
type: Input
|
|
569
|
+
}], enablePagination: [{
|
|
570
|
+
type: Input
|
|
571
|
+
}], enableExport: [{
|
|
572
|
+
type: Input
|
|
573
|
+
}], page: [{
|
|
574
|
+
type: Input
|
|
575
|
+
}], total: [{
|
|
576
|
+
type: Input
|
|
577
|
+
}], pageChange: [{
|
|
578
|
+
type: Output
|
|
579
|
+
}], pageSize: [{
|
|
580
|
+
type: Input
|
|
581
|
+
}], pageSizeOptions: [{
|
|
582
|
+
type: Input
|
|
583
|
+
}], pageSizeChange: [{
|
|
584
|
+
type: Output
|
|
585
|
+
}], export: [{
|
|
586
|
+
type: Output
|
|
587
|
+
}], hideOnSinglePage: [{
|
|
588
|
+
type: Input
|
|
589
|
+
}], emptyStateType: [{
|
|
590
|
+
type: Input
|
|
591
|
+
}], emptyStateHeader: [{
|
|
592
|
+
type: Input
|
|
593
|
+
}], emptyStateContent: [{
|
|
594
|
+
type: Input
|
|
595
|
+
}], emptyStateAction: [{
|
|
596
|
+
type: Input
|
|
597
|
+
}], emptyStateFilteredHeader: [{
|
|
598
|
+
type: Input
|
|
599
|
+
}], emptyStateFilteredContent: [{
|
|
600
|
+
type: Input
|
|
601
|
+
}], emptyStateActionClick: [{
|
|
602
|
+
type: Output
|
|
603
|
+
}], columnDefinitions: [{
|
|
604
|
+
type: ContentChildren,
|
|
605
|
+
args: [TableColumn]
|
|
606
|
+
}], filterModalTemplate: [{
|
|
607
|
+
type: ContentChild,
|
|
608
|
+
args: [TableFilterModalDirective, {
|
|
609
|
+
read: TemplateRef,
|
|
610
|
+
static: true,
|
|
611
|
+
}]
|
|
612
|
+
}], filterModalHeaderText: [{
|
|
613
|
+
type: Input
|
|
614
|
+
}], filterModalSaveText: [{
|
|
615
|
+
type: Input
|
|
616
|
+
}], filterModalCancelText: [{
|
|
617
|
+
type: Input
|
|
618
|
+
}], filterModalResetText: [{
|
|
619
|
+
type: Input
|
|
620
|
+
}], filterModalShow: [{
|
|
621
|
+
type: Output
|
|
622
|
+
}], filterModalSave: [{
|
|
623
|
+
type: Output
|
|
624
|
+
}], filterModalReset: [{
|
|
625
|
+
type: Output
|
|
626
|
+
}], keyDown: [{
|
|
627
|
+
type: HostListener,
|
|
628
|
+
args: ['document:keydown', ['$event']]
|
|
629
|
+
}], keyUp: [{
|
|
630
|
+
type: HostListener,
|
|
631
|
+
args: ['document:keyup', ['$event']]
|
|
632
|
+
}], visibilityChange: [{
|
|
633
|
+
type: HostListener,
|
|
634
|
+
args: ['document:visibilitychange', ['$event']]
|
|
635
|
+
}] } });
|
|
636
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhcGVybGVzcy9zcmMvbGliL21vZHVsZXMvdGFibGUvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7OztJQVNqRCxLQUFLLFNBQUwsS0FBSztJQWtQZDtRQTVPQTs7V0FFRztRQUNNLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFbEM7O1dBRUc7UUFDTSx3QkFBbUIsR0FBVyxDQUFDLENBQUM7UUFFekM7O1dBRUc7UUFDTSx1QkFBa0IsR0FBWSxJQUFJLENBQUM7UUFFNUM7O1dBRUc7UUFDTSxtQkFBYyxHQUFZLElBQUksQ0FBQztRQUV4Qzs7V0FFRztRQUNNLGlCQUFZLEdBQVUsRUFBRSxDQUFDO1FBRWxDOztXQUVH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QkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFzRVAsT0FBTztzQkFETixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVU1QyxLQUFLO3NCQURKLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVTFDLGdCQUFnQjtzQkFEZixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSwgdW50aWxEZXN0cm95ZWQgfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgUXVpY2tGaWx0ZXIsIFJvd0NsaWNrRXZlbnQgfSBmcm9tICdAcGFwZXJsZXNzL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGFibGVGaWx0ZXJNb2RhbERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcC10YWJsZS1maWx0ZXItbW9kYWwuZGlyZWN0aXZlJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vdGFibGUtY29sdW1uL3RhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGVmYXVsdFNpemUsIGRlZmF1bHRTaXplT3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuQFVudGlsRGVzdHJveSh7IGNoZWNrUHJvcGVydGllczogdHJ1ZSB9KVxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwLXRhYmxlLW5neCcsXG4gICAgdGVtcGxhdGVVcmw6ICd0YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBpdGVtcyB0byBiZSBmZWQgdG8gdGhlIHRhYmxlXG4gICAgICovXG4gICAgQElucHV0KCkgaXRlbXMhOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgZGF0YSBpcyBsb2FkaW5nXG4gICAgICovXG4gICAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBsb2FkaW5nIHJvd3MgdG8gc2hvd1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGFtb3VudE9mTG9hZGluZ1Jvd3M6IG51bWJlciA9IDY7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHNlbGVjdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHJvdyBjbGlja2luZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd0NsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiBpdGVtc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkUm93czogYW55W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkUm93c0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IHRvIGRldGVybWluZSBpZiBhIHJvdyBpcyBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGlvbktleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQSBrZXkgdG8gZGV0ZXJtaW5lIGlmIGEgcm93IGNhbiBiZSBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNhblNlbGVjdEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dDbGljazogRXZlbnRFbWl0dGVyPFJvd0NsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgZGVzZWxlY3RlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dEZXNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKiBTVEFSVCBIRUFERVIgKi9cbiAgICAvKipcbiAgICAgKiBRdWljayBmaWx0ZXJzIHRvIHNob3dcbiAgICAgKi9cbiAgICBASW5wdXQoKSBxdWlja0ZpbHRlcnM6IFF1aWNrRmlsdGVyW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEFjdGl2ZSBxdWljayBmaWx0ZXIgaWRlbnRpZmllclxuICAgICAqL1xuICAgIEBJbnB1dCgpIGFjdGl2ZVF1aWNrRmlsdGVySWRlbnRpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIHNlYXJjaCBpbnB1dFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVNlYXJjaDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgdG8gc2hvdyBpbiB0aGUgc2VhcmNoIGJhclxuICAgICAqL1xuICAgIEBJbnB1dCgpIHF1ZXJ5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gc2hvdyB0aGUgZmlsdGVyIGJ1dHRvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZUZpbHRlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZpbHRlcnMgYmVpbmcgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBzZWxlY3RlZEZpbHRlcnNBbW91bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGZpbHRlciBidXR0b24gdGV4dFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZpbHRlckJ1dHRvblRlbXBsYXRlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gc2hvdyB0aGUgZWRpdCBidXR0b25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVFZGl0OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGVkaXQgYnV0dG9uIHRleHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uVGVtcGxhdGU6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gb25lIG9mIHRoZSBxdWljayBmaWx0ZXJzIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcXVpY2tGaWx0ZXI6IEV2ZW50RW1pdHRlcjxRdWlja0ZpbHRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuIHRoZSBxdWVyeSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHF1ZXJ5Q2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gdGhlIGZpbHRlciBidXR0b24gaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBmaWx0ZXI6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gdGhlIGVkaXQgYnV0dG9uIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZWRpdDogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqIFNUQVJUIEZPT1RFUiAqL1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIGVuYWJsZSBwYWdlIHNpemUgc2VsZWN0XG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlUGFnZVNpemU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIGVuYWJsZSBwYWdpbmF0aW9uXG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlUGFnaW5hdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIGV4cG9ydFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZUV4cG9ydDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBwYWdlXG4gICAgICovXG4gICAgQElucHV0KCkgcGFnZTogbnVtYmVyID0gMTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgaXRlbXNcbiAgICAgKi9cbiAgICBASW5wdXQoKSB0b3RhbCE6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBwYWdlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGl0ZW1zIHBlciBwYWdlXG4gICAgICovXG4gICAgQElucHV0KCkgcGFnZVNpemU6IG51bWJlciA9IGRlZmF1bHRTaXplO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgZm9yIHRoZSBwYWdlIHNpemVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gZGVmYXVsdFNpemVPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgdGhlIHBhZ2UgY2hhbmdlc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIGV4cG9ydDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gaGlkZSB3aGVuIHRoZXJlIGlzIG9ubHkgMSBwYWdlIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGhpZGVPblNpbmdsZVBhZ2U6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyogRW1wdHkgc3RhdGUgc3RhcnQgKi9cbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlVHlwZTogJ25vX2ZpbHRlcicgfCAnZmlsdGVyZWQnID0gJ25vX2ZpbHRlcic7XG5cbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlSGVhZGVyITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVDb250ZW50ITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVBY3Rpb24hOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlRmlsdGVyZWRIZWFkZXIhOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZW1wdHlTdGF0ZUZpbHRlcmVkQ29udGVudCE6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBlbXB0eSBzdGF0ZSBpcyBjbGlja2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIGVtcHR5U3RhdGVBY3Rpb25DbGljazogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyogRW1wdHkgc3RhdGUgZW5kICovXG5cbiAgICBwdWJsaWMgY29sdW1uczogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgcGFyc2VkSXRlbXM6IGFueVtdID0gW107XG4gICAgcHVibGljIGxvYWRpbmdSb3dzID0gQXJyYXkuZnJvbSh7XG4gICAgICAgIGxlbmd0aDogdGhpcy5hbW91bnRPZkxvYWRpbmdSb3dzLFxuICAgIH0pO1xuICAgIHByaXZhdGUgX2N0cmxEb3duID0gZmFsc2U7XG5cbiAgICAvLyBBbmd1bGFyIHN0dWZmXG4gICAgLy8gY29sdW1uIHRlbXBsYXRlc1xuICAgIHByaXZhdGUgX2NvbHVtbkRlZmluaXRpb25zITogUXVlcnlMaXN0PFRhYmxlQ29sdW1uPjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oVGFibGVDb2x1bW4pXG4gICAgc2V0IGNvbHVtbkRlZmluaXRpb25zKHY6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4pIHtcbiAgICAgICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSB2O1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICB9XG4gICAgZ2V0IGNvbHVtbkRlZmluaXRpb25zKCk6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG1vZGFsXG4gICAgQENvbnRlbnRDaGlsZChUYWJsZUZpbHRlck1vZGFsRGlyZWN0aXZlLCB7XG4gICAgICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgICAgICBzdGF0aWM6IHRydWUsXG4gICAgfSlcbiAgICBwdWJsaWMgZmlsdGVyTW9kYWxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBmaWx0ZXJNb2RhbFNob3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbEhlYWRlclRleHQ6IHN0cmluZyA9ICdGaWx0ZXJzJztcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFNhdmVUZXh0OiBzdHJpbmcgPSAnU2F2ZSc7XG4gICAgQElucHV0KCkgZmlsdGVyTW9kYWxDYW5jZWxUZXh0OiBzdHJpbmcgPSAnQ2FuY2VsJztcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFJlc2V0VGV4dDogc3RyaW5nID0gJ1Jlc2V0IGZpbHRlcnMnO1xuXG4gICAgQE91dHB1dCgpIGZpbHRlck1vZGFsU2hvdzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBmaWx0ZXJNb2RhbFNhdmU6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZmlsdGVyTW9kYWxSZXNldDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIGZpbHRlck1vZGFsU2hvd1Jlc2V0JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIHB1YmxpYyBmaWx0ZXJNb2RhbFNob3dSZXNldE1vYmlsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLl9wYXJzZUl0ZW1zKHRoaXMuaXRlbXMpO1xuXG4gICAgICAgIHRoaXMubG9hZGluZ1Jvd3MgPSBBcnJheS5mcm9tKHtcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5hbW91bnRPZkxvYWRpbmdSb3dzLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpbHRlck1vZGFsU2hvdyRcbiAgICAgICAgICAgIC5waXBlKHVudGlsRGVzdHJveWVkKHRoaXMpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMuZmlsdGVyTW9kYWxTaG93Lm5leHQodmFsdWUpKTtcbiAgICAgICAgLy8gdGhpcy5fZ2VuZXJhdGVDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlc1snaXRlbXMnXSkge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VJdGVtcyhjaGFuZ2VzWydpdGVtcyddLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1snYW1vdW50T2ZMb2FkaW5nUm93cyddKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdSb3dzID0gQXJyYXkuZnJvbSh7XG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBjaGFuZ2VzWydhbW91bnRPZkxvYWRpbmdSb3dzJ10uY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbmdPbkNoYW5nZXMnLCBjaGFuZ2VzKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhbmdlc1snYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyJ10gfHxcbiAgICAgICAgICAgIGNoYW5nZXNbJ3NlbGVjdGVkRmlsdGVyc0Ftb3VudCddXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXJzQW1vdW50ID1cbiAgICAgICAgICAgICAgICBjaGFuZ2VzWydhY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXInXS5jdXJyZW50VmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZpbHRlcnNBbW91bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NldHRpbmcgZmlsdGVyTW9kYWxTaG93UmVzZXQgdG8gdHJ1ZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTaG93UmVzZXQkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVF1aWNrRmlsdGVySWRlbnRpZmllciA9XG4gICAgICAgICAgICAgICAgY2hhbmdlc1snYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyJ10uY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlUXVpY2tGaWx0ZXIgPSB0aGlzLnF1aWNrRmlsdGVycy5maW5kKFxuICAgICAgICAgICAgICAgIChmKSA9PiAoZi5pZGVudGlmaWVyID0gYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2FjdGl2ZVF1aWNrRmlsdGVyJywgYWN0aXZlUXVpY2tGaWx0ZXIpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRGaWx0ZXJzQW1vdW50ID4gMCB8fCAhYWN0aXZlUXVpY2tGaWx0ZXI/LmRlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU2V0dGluZyBmaWx0ZXJNb2RhbFNob3dSZXNldE1vYmlsZSB0byB0cnVlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFNob3dSZXNldE1vYmlsZSQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdIaWRpbmcgcmVzZXQgYnV0dG9udHMnKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTaG93UmVzZXQkLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFNob3dSZXNldE1vYmlsZSQubmV4dChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAgQEhvc3RMaXN0ZW5lcignYm9keTp0YWJsZURlZmluaXRpb25DaGFuZ2VkJywgeyB0YXJnZXQ6ICdib2R5JyB9KVxuICAgIC8vICBvblRhYmxlRGVmaW5pdGlvblVwZGF0ZWQoKSB7XG4gICAgLy8gICAgICB0aGlzLl9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICAvLyAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAga2V5RG93bih7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ0NvbnRyb2wnIHx8IHRoaXMuX2N0cmxEb3duID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jdHJsRG93biA9IHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5dXAnLCBbJyRldmVudCddKVxuICAgIGtleVVwKHsga2V5IH06IHsga2V5OiBzdHJpbmcgfSkge1xuICAgICAgICBpZiAoa2V5ICE9PSAnQ29udHJvbCcgfHwgdGhpcy5fY3RybERvd24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jdHJsRG93biA9IGZhbHNlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnZpc2liaWxpdHljaGFuZ2UnLCBbJyRldmVudCddKVxuICAgIHZpc2liaWxpdHlDaGFuZ2UoKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09ICdoaWRkZW4nIHx8IHRoaXMuX2N0cmxEb3duID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3RybERvd24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvblF1ZXJ5Q2hhbmdlKHsgZGV0YWlsIH06IEN1c3RvbUV2ZW50PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5xdWVyeUNoYW5nZS5lbWl0KGRldGFpbCk7XG4gICAgfVxuXG4gICAgb25RdWlja0ZpbHRlcih7IGRldGFpbCB9OiBDdXN0b21FdmVudDxhbnk+KSB7XG4gICAgICAgIHRoaXMucXVpY2tGaWx0ZXIuZW1pdChkZXRhaWwpO1xuICAgIH1cblxuICAgIG9uUGFnZVNpemVDaGFuZ2UoeyBkZXRhaWwgfTogQ3VzdG9tRXZlbnQ8bnVtYmVyPikge1xuICAgICAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlLmVtaXQoZGV0YWlsKTtcbiAgICB9XG5cbiAgICBvblBhZ2VDaGFuZ2UoeyBkZXRhaWwgfTogQ3VzdG9tRXZlbnQ8bnVtYmVyPikge1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdChkZXRhaWwpO1xuICAgIH1cblxuICAgIG9uRmlsdGVyTW9kYWxTYXZlKCkge1xuICAgICAgICB0aGlzLmZpbHRlck1vZGFsU2F2ZS5uZXh0KCk7XG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTaG93JC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBvbkZpbHRlck1vZGFsUmVzZXQocmVzZXRRdWlja0ZpbHRlciA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxSZXNldC5uZXh0KHJlc2V0UXVpY2tGaWx0ZXIpO1xuICAgICAgICB0aGlzLmZpbHRlck1vZGFsU2hvdyQubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VJdGVtcyhpdGVtczogc3RyaW5nKSB7XG4gICAgICAgIGlmICghaXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkSXRlbXMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRJdGVtcyA9IGl0ZW1zO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXJzZWRJdGVtcyA9IEpTT04ucGFyc2UoaXRlbXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dlbmVyYXRlQ29sdW1ucygpIHtcbiAgICAgICAgLy8gY29uc3QgZGVmaW5pdGlvbnMgPVxuICAgICAgICAvLyBcdHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgncC10YWJsZS1kZWZpbml0aW9uJyk7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IEFycmF5LmZyb20odGhpcy5fY29sdW1uRGVmaW5pdGlvbnMpO1xuICAgIH1cblxuICAgIC8vICBwcml2YXRlIF9nZXRIZWFkZXIoKSB7XG4gICAgLy8gICAgICByZXR1cm4gKFxuICAgIC8vICAgICAgICAgIDxwLXRhYmxlLXJvdyB2YXJpYW50PVwiaGVhZGVyXCI+XG4gICAgLy8gICAgICAgICAgICAgIHt0aGlzLl9jb2x1bW5zLm1hcCgoY29sOiBUYWJsZURlZmluaXRpb24sIGluZGV4KSA9PiAoXG4gICAgLy8gICAgICAgICAgICAgICAgICA8cC10YWJsZS1jb2x1bW5cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uPXtjb2x9XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbC5uYW1lfVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJoZWFkZXJcIlxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94PXt0aGlzLl9nZXRDaGVja2JveChpbmRleCwgbnVsbCwgJ2hlYWRlcicpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAvLyAgICAgICAgICAgICAgICAgID48L3AtdGFibGUtY29sdW1uPlxuICAgIC8vICAgICAgICAgICAgICApKX1cbiAgICAvLyAgICAgICAgICA8L3AtdGFibGUtcm93PlxuICAgIC8vICAgICAgKTtcbiAgICAvLyAgfVxuXG4gICAgLy8gIHByaXZhdGUgX2dldFJvd3MoKSB7XG4gICAgLy8gICAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgLy8gICAgICAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgIGxlbmd0aDogdGhpcy5hbW91bnRPZkxvYWRpbmdSb3dzLFxuICAgIC8vICAgICAgICAgICAgICB9LFxuICAgIC8vICAgICAgICAgICAgICAoXywgaSkgPT4gKFxuICAgIC8vICAgICAgICAgICAgICAgICAgPHAtdGFibGUtcm93XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgZW5hYmxlSG92ZXI9e1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbiB8fCB0aGlzLmVuYWJsZVJvd0NsaWNrXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgICAgICAgICAgPlxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLl9nZXRMb2FkaW5nQ29sdW1ucyhpKX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIDwvcC10YWJsZS1yb3c+XG4gICAgLy8gICAgICAgICAgICAgIClcbiAgICAvLyAgICAgICAgICApO1xuICAgIC8vICAgICAgfVxuXG4gICAgLy8gICAgICByZXR1cm4gdGhpcy5faXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgIC8vICAgICAgICAgIDxwLXRhYmxlLXJvd1xuICAgIC8vICAgICAgICAgICAgICBlbmFibGVIb3Zlcj17dGhpcy5lbmFibGVSb3dTZWxlY3Rpb24gfHwgdGhpcy5lbmFibGVSb3dDbGlja31cbiAgICAvLyAgICAgICAgICAgICAgb25DbGljaz17KGV2KSA9PiB0aGlzLl9yb3dDbGljayhldiwgaW5kZXgpfVxuICAgIC8vICAgICAgICAgID5cbiAgICAvLyAgICAgICAgICAgICAge3RoaXMuX2dldFJvd0NvbHVtbnMoaXRlbSwgaW5kZXgpfVxuICAgIC8vICAgICAgICAgIDwvcC10YWJsZS1yb3c+XG4gICAgLy8gICAgICApKTtcbiAgICAvLyAgfVxuXG4gICAgLy8gIHByaXZhdGUgX2dldFJvd0NvbHVtbnMoaXRlbSwgaW5kZXgpIHtcbiAgICAvLyAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLm1hcCgoY29sOiBUYWJsZURlZmluaXRpb24sIGNvbEluZGV4KSA9PiB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuIChcbiAgICAvLyAgICAgICAgICAgICAgPHAtdGFibGUtY29sdW1uXG4gICAgLy8gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uPXtjb2x9XG4gICAgLy8gICAgICAgICAgICAgICAgICBpdGVtPXtpdGVtfVxuICAgIC8vICAgICAgICAgICAgICAgICAgY2hlY2tib3g9e3RoaXMuX2dldENoZWNrYm94KGNvbEluZGV4LCBpbmRleCl9XG4gICAgLy8gICAgICAgICAgICAgICAgICBpbmRleD17Y29sSW5kZXh9XG4gICAgLy8gICAgICAgICAgICAgICAgICByb3dJbmRleD17aW5kZXh9XG4gICAgLy8gICAgICAgICAgICAgID48L3AtdGFibGUtY29sdW1uPlxuICAgIC8vICAgICAgICAgICk7XG4gICAgLy8gICAgICB9KTtcbiAgICAvLyAgfVxuXG4gICAgLy8gIHByaXZhdGUgX2dldExvYWRpbmdDb2x1bW5zKGluZGV4KSB7XG4gICAgLy8gICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5tYXAoKGNvbDogVGFibGVEZWZpbml0aW9uLCBjb2xJbmRleCkgPT4ge1xuICAgIC8vICAgICAgICAgIHJldHVybiAoXG4gICAgLy8gICAgICAgICAgICAgIDxwLXRhYmxlLWNvbHVtblxuICAgIC8vICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbj17Y29sfVxuICAgIC8vICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImxvYWRpbmdcIlxuICAgIC8vICAgICAgICAgICAgICAgICAgY2hlY2tib3g9e3RoaXMuX2dldENoZWNrYm94KGNvbEluZGV4LCBpbmRleCwgJ2xvYWRpbmcnKX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGluZGV4PXtjb2xJbmRleH1cbiAgICAvLyAgICAgICAgICAgICAgICAgIHJvd0luZGV4PXtpbmRleH1cbiAgICAvLyAgICAgICAgICAgICAgPjwvcC10YWJsZS1jb2x1bW4+XG4gICAgLy8gICAgICAgICAgKTtcbiAgICAvLyAgICAgIH0pO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0Q2hlY2tib3goXG4gICAgLy8gICAgICBpbmRleCxcbiAgICAvLyAgICAgIHJvd0luZGV4LFxuICAgIC8vICAgICAgdmFyaWFudDogJ2hlYWRlcicgfCAnZGVmYXVsdCcgfCAnbG9hZGluZycgPSAnZGVmYXVsdCdcbiAgICAvLyAgKSB7XG4gICAgLy8gICAgICBpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uIHx8ICF0aGlzLnNlbGVjdGlvbktleSB8fCBpbmRleCAhPT0gMCkge1xuICAgIC8vICAgICAgICAgIHJldHVybjtcbiAgICAvLyAgICAgIH1cblxuICAgIC8vICAgICAgaWYgKHZhcmlhbnQgPT09ICdsb2FkaW5nJykge1xuICAgIC8vICAgICAgICAgIHJldHVybiA8cC1sb2FkZXIgdmFyaWFudD1cImdob3N0XCIgY2xhc3M9XCJyb3VuZGVkIHctNiBoLTZcIiAvPjtcbiAgICAvLyAgICAgIH1cblxuICAgIC8vICAgICAgaWYgKHZhcmlhbnQgPT09ICdoZWFkZXInKSB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuIChcbiAgICAvLyAgICAgICAgICAgICAgPGlucHV0XG4gICAgLy8gICAgICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRcIlxuICAgIC8vICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAvLyAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXYpID0+IHRoaXMuX3NlbGVjdEFsbENoYW5nZShldil9XG4gICAgLy8gICAgICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLl9zZWxlY3Rpb25Db250YWluc0FsbCgpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZT17dGhpcy5fc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpfVxuICAgIC8vICAgICAgICAgICAgICAvPlxuICAgIC8vICAgICAgICAgICk7XG4gICAgLy8gICAgICB9XG5cbiAgICAvLyAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9pdGVtc1tyb3dJbmRleF07XG5cbiAgICAvLyAgICAgIHJldHVybiAoXG4gICAgLy8gICAgICAgICAgPGlucHV0XG4gICAgLy8gICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dFwiXG4gICAgLy8gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgLy8gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXYpID0+IHRoaXMuX2NoZWNrYm94Q2hhbmdlKGV2Py50YXJnZXQsIHJvd0luZGV4KX1cbiAgICAvLyAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuY2FuU2VsZWN0S2V5ICYmICFpdGVtW3RoaXMuY2FuU2VsZWN0S2V5XX1cbiAgICAvLyAgICAgICAgICAgICAgY2hlY2tlZD17dGhpcy5fc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgcm93SW5kZXgpfVxuICAgIC8vICAgICAgICAgIC8+XG4gICAgLy8gICAgICApO1xuICAgIC8vICB9XG5cbiAgICBwdWJsaWMgX2NoZWNrYm94RGlzYWJsZWQoaXRlbTogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhblNlbGVjdEtleSAmJiAhaXRlbVt0aGlzLmNhblNlbGVjdEtleV07XG4gICAgfVxuXG4gICAgcHVibGljIF9zZWxlY3RBbGxDaGFuZ2UoJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9nZXRDaGVja2VkVmFsdWUoJGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgdG9BZGQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRoaXMucGFyc2VkSXRlbXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuU2VsZWN0S2V5ICYmICFyb3dbdGhpcy5jYW5TZWxlY3RLZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb25Db250YWlucyhyb3csIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2gocm93KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQocm93KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbLi4udGhpcy5zZWxlY3RlZFJvd3MsIC4uLnRvQWRkXTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdGVkUm93c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRoaXMucGFyc2VkSXRlbXMuZmluZChcbiAgICAgICAgICAgICAgICAoZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VsZWN0aW9uVmFsdWUoZCwgaSkgPT09XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKHZhbHVlLCBpKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yb3dEZXNlbGVjdGVkLmVtaXQocm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBfY2hlY2tib3hDaGFuZ2UodGFyZ2V0OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtc1tpbmRleF07XG5cbiAgICAgICAgaWYgKHRoaXMuY2FuU2VsZWN0S2V5ICYmICFyb3dbdGhpcy5jYW5TZWxlY3RLZXldKSB7XG4gICAgICAgICAgICB0YXJnZXQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9nZXRDaGVja2VkVmFsdWUodGFyZ2V0KTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFsuLi50aGlzLnNlbGVjdGVkUm93cywgcm93XTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHJvdyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleE9mVG9SZW1vdmUgPSB0aGlzLl9zZWxlY3Rpb25Db250YWlucyhyb3csIGluZGV4LCB0cnVlKTtcblxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMsIGJlY2F1c2Ugc3BsaWNlIGRvZXMgbm90IHRyaWdnZXIgdGhlIHNlbGVjdGlvbiBzZXR0ZXIuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IFsuLi50aGlzLnNlbGVjdGVkUm93c107XG4gICAgICAgIHNlbGVjdGlvbi5zcGxpY2UoaW5kZXhPZlRvUmVtb3ZlLCAxKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuICAgICAgICB0aGlzLnJvd0Rlc2VsZWN0ZWQuZW1pdChyb3cpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENoZWNrZWRWYWx1ZSh0YXJnZXQ6IGFueSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0Py5jaGVja2VkO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFNlbGVjdGlvblZhbHVlKHJvdzogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbktleSA/IHJvdz8uW3RoaXMuc2VsZWN0aW9uS2V5XSB8fCBpbmRleCA6IGluZGV4O1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2VsZWN0aW9uQ29udGFpbnMoXG4gICAgICAgIHJvdzogYW55LFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICByZXR1cm5JbmRleCA9IGZhbHNlXG4gICAgKTogYW55IHtcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB0aGlzLnNlbGVjdGVkUm93cy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZShyb3csIGluZGV4KSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZShpdGVtLCBpbmRleClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICFyZXR1cm5JbmRleCA/IHJldHVyblZhbHVlID49IDAgOiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NlbGVjdGlvbkNvbnRhaW5zQWxsKCkge1xuICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMucGFyc2VkSXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaV07XG4gICAgICAgICAgICBjb25zdCBjb250YWlucyA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIGkpO1xuXG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NlbGVjdGlvbkluZGV0ZXJtaW5hdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoIHx8ICF0aGlzLnNlbGVjdGVkUm93cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29udGFpbnNDb3VudCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2ldO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbnMgPSB0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCBpKTtcblxuICAgICAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbnNDb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zQ291bnQgPiAwICYmIGNvbnRhaW5zQ291bnQgIT09IHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBfcm93Q2xpY2soJGV2ZW50OiB7IHRhcmdldDogYW55IH0sIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gJGV2ZW50LnRhcmdldDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnIHx8XG4gICAgICAgICAgICB0YXJnZXQudHlwZSA9PT0gJ2NoZWNrYm94J1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuX2ZpbmRSb3coJGV2ZW50LnRhcmdldCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlUm93Q2xpY2spIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuX2ZpbmRSb3dBY3Rpb24oJGV2ZW50LnRhcmdldCk7XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2luZGV4XTtcbiAgICAgICAgICAgIHRoaXMucm93Q2xpY2suZW1pdCh7XG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBjdHJsRG93bjogdGhpcy5fY3RybERvd24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoZWNrYm94ID0gcm93Py5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcblxuICAgICAgICBpZiAoIWNoZWNrYm94KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gIWNoZWNrYm94LmNoZWNrZWQ7XG4gICAgICAgIHRoaXMuX2NoZWNrYm94Q2hhbmdlKGNoZWNrYm94LCBpbmRleCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmluZFJvdyhlbDogSFRNTEVsZW1lbnQgfCBudWxsKTogYW55IHtcbiAgICAgICAgaWYgKCFlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsPy50YWdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAncC10YWJsZS1yb3cnKSB7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZFJvdyhlbD8ucGFyZW50RWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmluZFJvd0FjdGlvbihlbDogSFRNTEVsZW1lbnQgfCBudWxsKTogYW55IHtcbiAgICAgICAgaWYgKCFlbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtYWN0aW9uJykgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pcy1hY3Rpb24nKSAhPT0gJ2ZhbHNlJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbD8udGFnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3AtdGFibGUtcm93Jykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZFJvd0FjdGlvbihlbD8ucGFyZW50RWxlbWVudCk7XG4gICAgfVxufVxuIiwiPHAtdGFibGUtY29udGFpbmVyPlxuICAgIDxwLXRhYmxlLWhlYWRlclxuICAgICAgICBbcXVpY2tGaWx0ZXJzXT1cInF1aWNrRmlsdGVyc1wiXG4gICAgICAgIFthY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXJdPVwiYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyXCJcbiAgICAgICAgKHF1aWNrRmlsdGVyKT1cIihvblF1aWNrRmlsdGVyKVwiXG4gICAgICAgIFtlbmFibGVTZWFyY2hdPVwiZW5hYmxlU2VhcmNoXCJcbiAgICAgICAgW3F1ZXJ5XT1cInF1ZXJ5XCJcbiAgICAgICAgKHF1ZXJ5Q2hhbmdlKT1cIihvblF1ZXJ5Q2hhbmdlKVwiXG4gICAgICAgIFtlbmFibGVGaWx0ZXJdPVwiZmlsdGVyTW9kYWxUZW1wbGF0ZVwiXG4gICAgICAgIFtzZWxlY3RlZEZpbHRlcnNBbW91bnRdPVwic2VsZWN0ZWRGaWx0ZXJzQW1vdW50XCJcbiAgICAgICAgW2ZpbHRlckJ1dHRvblRlbXBsYXRlXT1cImZpbHRlckJ1dHRvblRlbXBsYXRlXCJcbiAgICAgICAgKGZpbHRlcik9XCJmaWx0ZXJNb2RhbFNob3ckLm5leHQodHJ1ZSlcIlxuICAgICAgICBbZW5hYmxlRWRpdF09XCJlbmFibGVFZGl0XCJcbiAgICAgICAgW2NhbkVkaXRdPVwiISFzZWxlY3RlZFJvd3MubGVuZ3RoXCJcbiAgICAgICAgW2VkaXRCdXR0b25UZW1wbGF0ZV09XCJlZGl0QnV0dG9uVGVtcGxhdGVcIlxuICAgICAgICAoZWRpdCk9XCJlZGl0LmVtaXQoKVwiXG4gICAgICAgIFtpdGVtc1NlbGVjdGVkQW1vdW50XT1cInNlbGVjdGVkUm93cy5sZW5ndGhcIlxuICAgID48L3AtdGFibGUtaGVhZGVyPlxuXG4gICAgPHAtdGFibGUtcm93IHZhcmlhbnQ9XCJoZWFkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICA8cC10YWJsZS1jZWxsLW5neFxuICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbaW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjaGVja2JveF09XCJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDAgJiYgZW5hYmxlUm93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNoZWNrYm94VGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L3AtdGFibGUtY2VsbC1uZ3g+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiX3NlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiX3NlbGVjdGlvbkNvbnRhaW5zQWxsKClcIlxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJfc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9wLXRhYmxlLXJvdz5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nOyBlbHNlIGNvbnRlbnRUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPHAtdGFibGUtcm93XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHIgb2YgbG9hZGluZ1Jvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbZW5hYmxlSG92ZXJdPVwiZW5hYmxlUm93U2VsZWN0aW9uIHx8IGVuYWJsZVJvd0NsaWNrXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGUtY2VsbC1uZ3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwibG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDAgJiYgZW5hYmxlUm93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2hlY2tib3hUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICA+PC9wLXRhYmxlLWNlbGwtbmd4PlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1sb2FkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZCB3LTYgaC02XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3AtbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjb250ZW50VGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbXM/Lmxlbmd0aDsgZWxzZSBlbXB0eVN0YXRlVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICA8cC10YWJsZS1yb3dcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2VuYWJsZUhvdmVyXT1cImVuYWJsZVJvd1NlbGVjdGlvbiB8fCBlbmFibGVSb3dDbGlja1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfcm93Q2xpY2soJGV2ZW50LCByb3dJbmRleClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlLWNlbGwtbmd4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID09PSAwICYmIGVuYWJsZVJvd1NlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjaGVja2JveFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2wudGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcC10YWJsZS1jZWxsLW5neD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoZWNrYm94Q2hhbmdlKCRldmVudC50YXJnZXQsIHJvd0luZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiX2NoZWNrYm94RGlzYWJsZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJfc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgcm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPHAtdGFibGUtZm9vdGVyXG4gICAgICAgIFtoaWRlT25TaW5nbGVQYWdlXT1cImhpZGVPblNpbmdsZVBhZ2VcIlxuICAgICAgICBbZW5hYmxlUGFnZVNpemVdPVwiZW5hYmxlUGFnZVNpemVcIlxuICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCIocGFnZVNpemVDaGFuZ2UpXCJcbiAgICAgICAgW2VuYWJsZVBhZ2luYXRpb25dPVwiZW5hYmxlUGFnaW5hdGlvblwiXG4gICAgICAgIFtwYWdlXT1cInBhZ2VcIlxuICAgICAgICBbdG90YWxdPVwidG90YWxcIlxuICAgICAgICAocGFnZUNoYW5nZSk9XCIocGFnZUNoYW5nZSlcIlxuICAgICAgICBbZW5hYmxlRXhwb3J0XT1cImVuYWJsZUV4cG9ydFwiXG4gICAgICAgIChleHBvcnQpPVwiZXhwb3J0LmVtaXQoKVwiXG4gICAgPjwvcC10YWJsZS1mb290ZXI+XG48L3AtdGFibGUtY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyTW9kYWxUZW1wbGF0ZVwiPlxuICAgIDxwLW1vZGFsXG4gICAgICAgIFtoZWFkZXJdPVwiZmlsdGVyTW9kYWxIZWFkZXJUZXh0XCJcbiAgICAgICAgW3Nob3ddPVwiZmlsdGVyTW9kYWxTaG93JCB8IGFzeW5jXCJcbiAgICAgICAgKGNsb3NlKT1cImZpbHRlck1vZGFsU2hvdyQubmV4dChmYWxzZSlcIlxuICAgID5cbiAgICAgICAgPGRpdiBzbG90PVwiY29udGVudFwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyTW9kYWxUZW1wbGF0ZVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxwcmU+e3sgZmlsdGVyTW9kYWxTaG93UmVzZXQkIHwgYXN5bmMgfCBqc29uIH19PC9wcmU+XG4gICAgICAgICAgICA8cHJlPnt7IGZpbHRlck1vZGFsU2hvd1Jlc2V0TW9iaWxlJCB8IGFzeW5jIHwganNvbiB9fTwvcHJlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzbG90PVwiZm9vdGVyXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBnYXAtNCB3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyTW9kYWxTaG93UmVzZXQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uRmlsdGVyTW9kYWxSZXNldCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBmaWx0ZXJNb2RhbFJlc2V0VGV4dCB9fVxuICAgICAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtYXV0b1wiXG4gICAgICAgICAgICAgICAgaWNvbj1cImNoZWNrbWFya1wiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFNhdmUoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgZmlsdGVyTW9kYWxTYXZlVGV4dCB9fVxuICAgICAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9wLW1vZGFsPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTdGF0ZVRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJlbXB0eVN0YXRlVHlwZSA9PT0gJ2ZpbHRlcmVkJzsgZWxzZSBlbXB0eVN0YXRlTm9uRmlsdGVyVGVtcGxhdGVcIlxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgZmxleCBmbGV4LWNvbFxuICAgICAgICAgICAgaXRlbXMtY2VudGVyXG4gICAgICAgICAgICB0ZXh0LWNlbnRlclxuICAgICAgICAgICAgcHktMjRcbiAgICAgICAgICAgIG1heC13LVsyMHJlbV1cbiAgICAgICAgICAgIHNlbGYtY2VudGVyXG4gICAgICAgIFwiXG4gICAgPlxuICAgICAgICA8cC1pbGx1c3RyYXRpb25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJlbXB0eS1zdGF0ZS1zZWFyY2hcIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi02XCJcbiAgICAgICAgPjwvcC1pbGx1c3RyYXRpb24+XG4gICAgICAgIDxwIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXN0b3JtLWRlZmF1bHRcIj5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVGaWx0ZXJlZEhlYWRlciB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LXN0b3JtLW1lZGl1bSBtYi0xNFwiPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUZpbHRlcmVkQ29udGVudCB9fVxuICAgICAgICA8L3A+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5U3RhdGVOb25GaWx0ZXJUZW1wbGF0ZT5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICBmbGV4IGZsZXgtY29sXG4gICAgICAgICAgICBpdGVtcy1jZW50ZXJcbiAgICAgICAgICAgIHRleHQtY2VudGVyXG4gICAgICAgICAgICBweS0yNFxuICAgICAgICAgICAgbWF4LXctWzIwcmVtXVxuICAgICAgICAgICAgc2VsZi1jZW50ZXJcbiAgICAgICAgXCJcbiAgICA+XG4gICAgICAgIDxwLWlsbHVzdHJhdGlvblxuICAgICAgICAgICAgdmFyaWFudD1cImVtcHR5LXN0YXRlLW92ZXJ2aWV3XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbWItNlwiXG4gICAgICAgICAgICAob25DbGljayk9XCJlbXB0eVN0YXRlQWN0aW9uQ2xpY2suZW1pdCgpXCJcbiAgICAgICAgPjwvcC1pbGx1c3RyYXRpb24+XG4gICAgICAgIDxwIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXN0b3JtLWRlZmF1bHRcIj5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVIZWFkZXIgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtc20gdGV4dC1zdG9ybS1tZWRpdW0gbWItNlwiPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUNvbnRlbnQgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgaWNvbj1cInBsdXNcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIChvbkNsaWNrKT1cImVtcHR5U3RhdGVBY3Rpb25DbGljay5lbWl0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyBlbXB0eVN0YXRlQWN0aW9uIH19XG4gICAgICAgIDwvcC1idXR0b24+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|