@paperless/angular 0.1.0-alpha.438 → 0.1.0-alpha.439
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/esm2020/lib/base/form.component.mjs +105 -0
- package/esm2020/lib/base/upload.component.mjs +57 -0
- package/esm2020/lib/base/value-accessor.mjs +42 -0
- package/esm2020/lib/directives/p-datepicker.directive.mjs +37 -0
- 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 +37 -0
- package/{esm2022 → esm2020}/lib/modules/overlay/overlay.module.mjs +14 -14
- package/esm2020/lib/modules/overlay/overlay.ref.mjs +12 -0
- package/esm2020/lib/modules/overlay/services/overlay.service.mjs +74 -0
- package/esm2020/lib/modules/table/base/table.component.mjs +201 -0
- package/esm2020/lib/modules/table/components/table/table.component.mjs +679 -0
- package/esm2020/lib/modules/table/components/table-cell/table-cell.component.mjs +197 -0
- package/esm2020/lib/modules/table/components/table-column/table-column.component.mjs +37 -0
- package/{esm2022 → esm2020}/lib/modules/table/directives/p-table-custom-filter.directive.mjs +3 -3
- package/{esm2022 → esm2020}/lib/modules/table/directives/p-table-filter-modal.directive.mjs +3 -3
- 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 +121 -0
- package/esm2020/lib/modules/table/directives/p-table.directive.mjs +78 -0
- package/{esm2022 → esm2020}/lib/modules/table/table.module.mjs +4 -4
- package/esm2020/lib/modules/toast/components/toast-container/toast-container.component.mjs +36 -0
- package/esm2020/lib/modules/toast/directives/toast.directive.mjs +51 -0
- package/esm2020/lib/modules/toast/services/toast.service.mjs +53 -0
- package/{esm2022 → esm2020}/lib/modules/toast/toast.module.mjs +4 -4
- package/{esm2022 → esm2020}/lib/paperless.module.mjs +4 -4
- package/esm2020/lib/pipes/currency.pipe.mjs +20 -0
- package/esm2020/lib/pipes/date.pipe.mjs +20 -0
- package/esm2020/lib/pipes/safe.pipe.mjs +33 -0
- package/esm2020/lib/stencil/components.mjs +1440 -0
- package/esm2020/lib/stencil.module.mjs +17 -0
- package/fesm2015/paperless-angular.mjs +3703 -0
- package/fesm2015/paperless-angular.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/paperless-angular.mjs +484 -683
- package/{fesm2022 → fesm2020}/paperless-angular.mjs.map +1 -1
- package/package.json +12 -6
- package/esm2022/lib/base/form.component.mjs +0 -103
- package/esm2022/lib/base/upload.component.mjs +0 -58
- package/esm2022/lib/base/value-accessor.mjs +0 -44
- package/esm2022/lib/directives/p-datepicker.directive.mjs +0 -37
- package/esm2022/lib/directives/p-page-size-select.directive.mjs +0 -42
- package/esm2022/lib/directives/p-pagination.directive.mjs +0 -42
- package/esm2022/lib/directives/p-select.directive.mjs +0 -37
- package/esm2022/lib/modules/overlay/overlay.ref.mjs +0 -14
- package/esm2022/lib/modules/overlay/services/overlay.service.mjs +0 -77
- package/esm2022/lib/modules/table/base/table.component.mjs +0 -203
- package/esm2022/lib/modules/table/components/table/table.component.mjs +0 -730
- package/esm2022/lib/modules/table/components/table-cell/table-cell.component.mjs +0 -215
- package/esm2022/lib/modules/table/components/table-column/table-column.component.mjs +0 -40
- package/esm2022/lib/modules/table/directives/p-table-footer.directive.mjs +0 -52
- package/esm2022/lib/modules/table/directives/p-table-header.directive.mjs +0 -60
- package/esm2022/lib/modules/table/directives/p-table-ngx.directive.mjs +0 -122
- package/esm2022/lib/modules/table/directives/p-table.directive.mjs +0 -78
- package/esm2022/lib/modules/toast/components/toast-container/toast-container.component.mjs +0 -39
- package/esm2022/lib/modules/toast/directives/toast.directive.mjs +0 -51
- package/esm2022/lib/modules/toast/services/toast.service.mjs +0 -51
- package/esm2022/lib/pipes/currency.pipe.mjs +0 -21
- package/esm2022/lib/pipes/date.pipe.mjs +0 -21
- package/esm2022/lib/pipes/safe.pipe.mjs +0 -34
- package/esm2022/lib/stencil/components.mjs +0 -1554
- package/esm2022/lib/stencil.module.mjs +0 -17
- /package/{esm2022 → esm2020}/lib/animations/fade.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/animations/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/animations/slide.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/base/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/directives/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/overlay/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/overlay/services/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/table/base/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/table/components/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/table/components/table/constants.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/table/directives/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/table/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/table/utils.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/toast/components/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/toast/directives/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/toast/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/toast/services/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/modules/toast/types.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/pipes/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/stencil/angular-component-lib/utils.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/stencil/index.mjs +0 -0
- /package/{esm2022 → esm2020}/paperless-angular.mjs +0 -0
- /package/{esm2022 → esm2020}/public-api.mjs +0 -0
|
@@ -1,730 +0,0 @@
|
|
|
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 { TableCustomFilterDirective, TableFilterModalDirective, } from '../../directives';
|
|
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
|
-
/**
|
|
16
|
-
* The items to be fed to the table
|
|
17
|
-
*/
|
|
18
|
-
items;
|
|
19
|
-
/**
|
|
20
|
-
* Wether data is loading
|
|
21
|
-
*/
|
|
22
|
-
loading = false;
|
|
23
|
-
/**
|
|
24
|
-
* Wether the header should show loading state
|
|
25
|
-
*/
|
|
26
|
-
headerLoading = false;
|
|
27
|
-
/**
|
|
28
|
-
* Wether the footer should show loading state
|
|
29
|
-
*/
|
|
30
|
-
footerLoading = false;
|
|
31
|
-
/**
|
|
32
|
-
* The amount of loading rows to show
|
|
33
|
-
*/
|
|
34
|
-
amountOfLoadingRows = 6;
|
|
35
|
-
/**
|
|
36
|
-
* Wether to enable selection
|
|
37
|
-
*/
|
|
38
|
-
enableRowSelection = true;
|
|
39
|
-
/**
|
|
40
|
-
* Wether to enable row clicking
|
|
41
|
-
*/
|
|
42
|
-
enableRowClick = true;
|
|
43
|
-
/**
|
|
44
|
-
* The current selection of items
|
|
45
|
-
*/
|
|
46
|
-
selectedRows = [];
|
|
47
|
-
/**
|
|
48
|
-
* Event whenever the current selection changes
|
|
49
|
-
*/
|
|
50
|
-
selectedRowsChange = new EventEmitter();
|
|
51
|
-
/**
|
|
52
|
-
* The key to determine if a row is selected
|
|
53
|
-
*/
|
|
54
|
-
selectionKey;
|
|
55
|
-
/**
|
|
56
|
-
* A key to determine if a row can be selected
|
|
57
|
-
*/
|
|
58
|
-
canSelectKey;
|
|
59
|
-
/**
|
|
60
|
-
* Event whenever a row is clicked
|
|
61
|
-
*/
|
|
62
|
-
rowClick = new EventEmitter();
|
|
63
|
-
/**
|
|
64
|
-
* Event whenever a row is selected
|
|
65
|
-
*/
|
|
66
|
-
rowSelected = new EventEmitter();
|
|
67
|
-
/**
|
|
68
|
-
* Event whenever a row is deselected
|
|
69
|
-
*/
|
|
70
|
-
rowDeselected = new EventEmitter();
|
|
71
|
-
/** START HEADER */
|
|
72
|
-
/**
|
|
73
|
-
* Wether to show the header
|
|
74
|
-
*/
|
|
75
|
-
enableHeader = true;
|
|
76
|
-
/**
|
|
77
|
-
* Quick filters to show
|
|
78
|
-
*/
|
|
79
|
-
quickFilters = [];
|
|
80
|
-
/**
|
|
81
|
-
* Active quick filter identifier
|
|
82
|
-
*/
|
|
83
|
-
activeQuickFilterIdentifier;
|
|
84
|
-
/**
|
|
85
|
-
* Wether to show the search input
|
|
86
|
-
*/
|
|
87
|
-
enableSearch = true;
|
|
88
|
-
/**
|
|
89
|
-
* The query to show in the search bar
|
|
90
|
-
*/
|
|
91
|
-
query;
|
|
92
|
-
/**
|
|
93
|
-
* Wether to show the filter button
|
|
94
|
-
*/
|
|
95
|
-
enableFilter = true;
|
|
96
|
-
/**
|
|
97
|
-
* The amount of filters being selected
|
|
98
|
-
*/
|
|
99
|
-
selectedFiltersAmount;
|
|
100
|
-
/**
|
|
101
|
-
* The template for the filter button text
|
|
102
|
-
*/
|
|
103
|
-
filterButtonTemplate;
|
|
104
|
-
/**
|
|
105
|
-
* Wether to show the edit button
|
|
106
|
-
*/
|
|
107
|
-
enableEdit = true;
|
|
108
|
-
/**
|
|
109
|
-
* Wether the edit button is loading
|
|
110
|
-
*/
|
|
111
|
-
editButtonLoading = false;
|
|
112
|
-
/**
|
|
113
|
-
* The edit button icon
|
|
114
|
-
*/
|
|
115
|
-
editButtonIcon = 'pencil';
|
|
116
|
-
/**
|
|
117
|
-
* The edit button text if changed
|
|
118
|
-
*/
|
|
119
|
-
editButtonText;
|
|
120
|
-
/**
|
|
121
|
-
* The template for the edit button text
|
|
122
|
-
*/
|
|
123
|
-
editButtonTemplate;
|
|
124
|
-
/**
|
|
125
|
-
* Event when one of the quick filters is clicked
|
|
126
|
-
*/
|
|
127
|
-
quickFilter = new EventEmitter();
|
|
128
|
-
/**
|
|
129
|
-
* Event when the query changes
|
|
130
|
-
*/
|
|
131
|
-
queryChange = new EventEmitter();
|
|
132
|
-
/**
|
|
133
|
-
* Event when the filter button is clicked
|
|
134
|
-
*/
|
|
135
|
-
filter = new EventEmitter();
|
|
136
|
-
/**
|
|
137
|
-
* Event when the edit button is clicked
|
|
138
|
-
*/
|
|
139
|
-
edit = new EventEmitter();
|
|
140
|
-
/** START FOOTER */
|
|
141
|
-
/**
|
|
142
|
-
* Wether to show the footer
|
|
143
|
-
*/
|
|
144
|
-
enableFooter = true;
|
|
145
|
-
/**
|
|
146
|
-
* Wether to enable page size select
|
|
147
|
-
*/
|
|
148
|
-
enablePageSize = true;
|
|
149
|
-
/**
|
|
150
|
-
* Wether to enable pagination
|
|
151
|
-
*/
|
|
152
|
-
enablePagination = true;
|
|
153
|
-
/**
|
|
154
|
-
* Wether to enable export
|
|
155
|
-
*/
|
|
156
|
-
enableExport = true;
|
|
157
|
-
/**
|
|
158
|
-
* The current page
|
|
159
|
-
*/
|
|
160
|
-
page = 1;
|
|
161
|
-
/**
|
|
162
|
-
* The total amount of items
|
|
163
|
-
*/
|
|
164
|
-
total;
|
|
165
|
-
/**
|
|
166
|
-
* Event whenever the page changes
|
|
167
|
-
*/
|
|
168
|
-
pageChange = new EventEmitter();
|
|
169
|
-
/**
|
|
170
|
-
* The amount of items per page
|
|
171
|
-
*/
|
|
172
|
-
pageSize = defaultSize;
|
|
173
|
-
/**
|
|
174
|
-
* The options for the page size
|
|
175
|
-
*/
|
|
176
|
-
pageSizeOptions = defaultSizeOptions;
|
|
177
|
-
/**
|
|
178
|
-
* Event whenever the page changes
|
|
179
|
-
*/
|
|
180
|
-
pageSizeChange = new EventEmitter();
|
|
181
|
-
/**
|
|
182
|
-
* Event whenever the page changes
|
|
183
|
-
*/
|
|
184
|
-
export = new EventEmitter();
|
|
185
|
-
/**
|
|
186
|
-
* Wether to hide when there is only 1 page available
|
|
187
|
-
*/
|
|
188
|
-
hideOnSinglePage = true;
|
|
189
|
-
/* Empty state start */
|
|
190
|
-
emptyStateType = 'no_filter';
|
|
191
|
-
emptyStateIllustration = 'empty-state-add';
|
|
192
|
-
emptyStateHeader;
|
|
193
|
-
emptyStateContent;
|
|
194
|
-
emptyStateAction;
|
|
195
|
-
enableEmptyStateAction = true;
|
|
196
|
-
emptyStateFilteredIllustration = 'empty-state-search';
|
|
197
|
-
emptyStateFilteredHeader;
|
|
198
|
-
emptyStateFilteredContent;
|
|
199
|
-
/**
|
|
200
|
-
* Event whenever the empty state is clicked
|
|
201
|
-
*/
|
|
202
|
-
emptyStateActionClick = new EventEmitter();
|
|
203
|
-
/* Empty state end */
|
|
204
|
-
columns = [];
|
|
205
|
-
parsedItems = [];
|
|
206
|
-
loadingRows = Array.from({
|
|
207
|
-
length: this.amountOfLoadingRows,
|
|
208
|
-
});
|
|
209
|
-
_ctrlDown = false;
|
|
210
|
-
// Angular stuff
|
|
211
|
-
// custom filter template
|
|
212
|
-
headerCustomFilterTemplate;
|
|
213
|
-
// column templates
|
|
214
|
-
_columnDefinitions;
|
|
215
|
-
set columnDefinitions(v) {
|
|
216
|
-
this._columnDefinitions = v;
|
|
217
|
-
this._generateColumns();
|
|
218
|
-
}
|
|
219
|
-
get columnDefinitions() {
|
|
220
|
-
return this._columnDefinitions;
|
|
221
|
-
}
|
|
222
|
-
// filter modal
|
|
223
|
-
filterModalTemplate;
|
|
224
|
-
filterModalShow$ = new BehaviorSubject(false);
|
|
225
|
-
filterModalHeaderText = 'Filters';
|
|
226
|
-
filterModalSaveText = 'Save';
|
|
227
|
-
filterModalCancelText = 'Cancel';
|
|
228
|
-
filterModalResetText = 'Reset filters';
|
|
229
|
-
filterModalShowReset = false;
|
|
230
|
-
filterModalShowResetMobile = false;
|
|
231
|
-
filterModalShow = new EventEmitter();
|
|
232
|
-
filterModalSave = new EventEmitter();
|
|
233
|
-
filterModalReset = new EventEmitter();
|
|
234
|
-
constructor() { }
|
|
235
|
-
ngOnInit() {
|
|
236
|
-
this._parseItems(this.items);
|
|
237
|
-
this.loadingRows = Array.from({
|
|
238
|
-
length: this.amountOfLoadingRows,
|
|
239
|
-
});
|
|
240
|
-
this.filterModalShow$
|
|
241
|
-
.pipe(untilDestroyed(this), distinctUntilChanged())
|
|
242
|
-
.subscribe((value) => this.filterModalShow.next(value));
|
|
243
|
-
// this._generateColumns();
|
|
244
|
-
}
|
|
245
|
-
ngOnChanges(changes) {
|
|
246
|
-
if (changes['items']) {
|
|
247
|
-
this._parseItems(changes['items'].currentValue);
|
|
248
|
-
}
|
|
249
|
-
if (changes['amountOfLoadingRows']) {
|
|
250
|
-
this.loadingRows = Array.from({
|
|
251
|
-
length: changes['amountOfLoadingRows'].currentValue,
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
// @HostListener('body:tableDefinitionChanged', { target: 'body' })
|
|
256
|
-
// onTableDefinitionUpdated() {
|
|
257
|
-
// this._generateColumns();
|
|
258
|
-
// }
|
|
259
|
-
keyDown({ key }) {
|
|
260
|
-
if (key !== 'Control' || this._ctrlDown === true) {
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
this._ctrlDown = true;
|
|
264
|
-
}
|
|
265
|
-
keyUp({ key }) {
|
|
266
|
-
if (key !== 'Control' || this._ctrlDown === false) {
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
this._ctrlDown = false;
|
|
270
|
-
}
|
|
271
|
-
visibilityChange() {
|
|
272
|
-
if (document.visibilityState !== 'hidden' || this._ctrlDown === false) {
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
this._ctrlDown = false;
|
|
276
|
-
}
|
|
277
|
-
onQueryChange({ detail }) {
|
|
278
|
-
this.queryChange.emit(detail);
|
|
279
|
-
}
|
|
280
|
-
onQuickFilter({ detail }) {
|
|
281
|
-
this.quickFilter.emit(detail);
|
|
282
|
-
}
|
|
283
|
-
onPageSizeChange({ detail }) {
|
|
284
|
-
this.pageSizeChange.emit(detail);
|
|
285
|
-
}
|
|
286
|
-
onPageChange({ detail }) {
|
|
287
|
-
this.pageChange.emit(detail);
|
|
288
|
-
}
|
|
289
|
-
onFilterModalSave() {
|
|
290
|
-
this.filterModalSave.next();
|
|
291
|
-
this.filterModalShow$.next(false);
|
|
292
|
-
}
|
|
293
|
-
onFilterModalReset(resetQuickFilter = false) {
|
|
294
|
-
this.filterModalReset.next(resetQuickFilter);
|
|
295
|
-
this.filterModalShow$.next(false);
|
|
296
|
-
}
|
|
297
|
-
emptyStateClicked() {
|
|
298
|
-
if (!this.enableEmptyStateAction) {
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
this.emptyStateActionClick.emit();
|
|
302
|
-
}
|
|
303
|
-
_parseItems(items) {
|
|
304
|
-
if (!items) {
|
|
305
|
-
this.parsedItems = [];
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
if (Array.isArray(items)) {
|
|
309
|
-
this.parsedItems = items;
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
this.parsedItems = JSON.parse(items);
|
|
313
|
-
}
|
|
314
|
-
_generateColumns() {
|
|
315
|
-
// const definitions =
|
|
316
|
-
// this._el.nativeElement.querySelectorAll('p-table-definition');
|
|
317
|
-
this.columns = Array.from(this._columnDefinitions);
|
|
318
|
-
}
|
|
319
|
-
// private _getHeader() {
|
|
320
|
-
// return (
|
|
321
|
-
// <p-table-row variant="header">
|
|
322
|
-
// {this._columns.map((col: TableDefinition, index) => (
|
|
323
|
-
// <p-table-column
|
|
324
|
-
// definition={col}
|
|
325
|
-
// value={col.name}
|
|
326
|
-
// variant="header"
|
|
327
|
-
// checkbox={this._getCheckbox(index, null, 'header')}
|
|
328
|
-
// index={index}
|
|
329
|
-
// ></p-table-column>
|
|
330
|
-
// ))}
|
|
331
|
-
// </p-table-row>
|
|
332
|
-
// );
|
|
333
|
-
// }
|
|
334
|
-
// private _getRows() {
|
|
335
|
-
// if (this.loading) {
|
|
336
|
-
// return Array.from(
|
|
337
|
-
// {
|
|
338
|
-
// length: this.amountOfLoadingRows,
|
|
339
|
-
// },
|
|
340
|
-
// (_, i) => (
|
|
341
|
-
// <p-table-row
|
|
342
|
-
// enableHover={
|
|
343
|
-
// this.enableRowSelection || this.enableRowClick
|
|
344
|
-
// }
|
|
345
|
-
// >
|
|
346
|
-
// {this._getLoadingColumns(i)}
|
|
347
|
-
// </p-table-row>
|
|
348
|
-
// )
|
|
349
|
-
// );
|
|
350
|
-
// }
|
|
351
|
-
// return this._items.map((item, index) => (
|
|
352
|
-
// <p-table-row
|
|
353
|
-
// enableHover={this.enableRowSelection || this.enableRowClick}
|
|
354
|
-
// onClick={(ev) => this._rowClick(ev, index)}
|
|
355
|
-
// >
|
|
356
|
-
// {this._getRowColumns(item, index)}
|
|
357
|
-
// </p-table-row>
|
|
358
|
-
// ));
|
|
359
|
-
// }
|
|
360
|
-
// private _getRowColumns(item, index) {
|
|
361
|
-
// return this._columns.map((col: TableDefinition, colIndex) => {
|
|
362
|
-
// return (
|
|
363
|
-
// <p-table-column
|
|
364
|
-
// definition={col}
|
|
365
|
-
// item={item}
|
|
366
|
-
// checkbox={this._getCheckbox(colIndex, index)}
|
|
367
|
-
// index={colIndex}
|
|
368
|
-
// rowIndex={index}
|
|
369
|
-
// ></p-table-column>
|
|
370
|
-
// );
|
|
371
|
-
// });
|
|
372
|
-
// }
|
|
373
|
-
// private _getLoadingColumns(index) {
|
|
374
|
-
// return this._columns.map((col: TableDefinition, colIndex) => {
|
|
375
|
-
// return (
|
|
376
|
-
// <p-table-column
|
|
377
|
-
// definition={col}
|
|
378
|
-
// variant="loading"
|
|
379
|
-
// checkbox={this._getCheckbox(colIndex, index, 'loading')}
|
|
380
|
-
// index={colIndex}
|
|
381
|
-
// rowIndex={index}
|
|
382
|
-
// ></p-table-column>
|
|
383
|
-
// );
|
|
384
|
-
// });
|
|
385
|
-
// }
|
|
386
|
-
// private _getCheckbox(
|
|
387
|
-
// index,
|
|
388
|
-
// rowIndex,
|
|
389
|
-
// variant: 'header' | 'default' | 'loading' = 'default'
|
|
390
|
-
// ) {
|
|
391
|
-
// if (!this.enableRowSelection || !this.selectionKey || index !== 0) {
|
|
392
|
-
// return;
|
|
393
|
-
// }
|
|
394
|
-
// if (variant === 'loading') {
|
|
395
|
-
// return <p-loader variant="ghost" class="rounded w-6 h-6" />;
|
|
396
|
-
// }
|
|
397
|
-
// if (variant === 'header') {
|
|
398
|
-
// return (
|
|
399
|
-
// <input
|
|
400
|
-
// class="p-input"
|
|
401
|
-
// type="checkbox"
|
|
402
|
-
// onChange={(ev) => this._selectAllChange(ev)}
|
|
403
|
-
// checked={this._selectionContainsAll()}
|
|
404
|
-
// indeterminate={this._selectionIndeterminate()}
|
|
405
|
-
// />
|
|
406
|
-
// );
|
|
407
|
-
// }
|
|
408
|
-
// const item = this._items[rowIndex];
|
|
409
|
-
// return (
|
|
410
|
-
// <input
|
|
411
|
-
// class="p-input"
|
|
412
|
-
// type="checkbox"
|
|
413
|
-
// onChange={(ev) => this._checkboxChange(ev?.target, rowIndex)}
|
|
414
|
-
// disabled={this.canSelectKey && !item[this.canSelectKey]}
|
|
415
|
-
// checked={this._selectionContains(item, rowIndex)}
|
|
416
|
-
// />
|
|
417
|
-
// );
|
|
418
|
-
// }
|
|
419
|
-
_checkboxDisabled(item) {
|
|
420
|
-
return this.canSelectKey && !item[this.canSelectKey];
|
|
421
|
-
}
|
|
422
|
-
_selectAllChange($event) {
|
|
423
|
-
if (!this.enableRowSelection) {
|
|
424
|
-
return;
|
|
425
|
-
}
|
|
426
|
-
const value = this._getCheckedValue($event.target);
|
|
427
|
-
if (value) {
|
|
428
|
-
const toAdd = [];
|
|
429
|
-
for (let i = 0; i < this.parsedItems.length; i++) {
|
|
430
|
-
const row = this.parsedItems[i];
|
|
431
|
-
if (this.canSelectKey && !row[this.canSelectKey]) {
|
|
432
|
-
continue;
|
|
433
|
-
}
|
|
434
|
-
if (this._selectionContains(row, i)) {
|
|
435
|
-
continue;
|
|
436
|
-
}
|
|
437
|
-
toAdd.push(row);
|
|
438
|
-
this.rowSelected.emit(row);
|
|
439
|
-
}
|
|
440
|
-
this.selectedRows = [...this.selectedRows, ...toAdd];
|
|
441
|
-
this.selectedRowsChange.emit(this.selectedRows);
|
|
442
|
-
return;
|
|
443
|
-
}
|
|
444
|
-
for (let i = 0; i < this.selectedRows.length; i++) {
|
|
445
|
-
const value = this.selectedRows[i];
|
|
446
|
-
const row = this.parsedItems.find((d) => this._getSelectionValue(d, i) ===
|
|
447
|
-
this._getSelectionValue(value, i));
|
|
448
|
-
if (!row) {
|
|
449
|
-
continue;
|
|
450
|
-
}
|
|
451
|
-
this.rowDeselected.emit(row);
|
|
452
|
-
}
|
|
453
|
-
this.selectedRows = [];
|
|
454
|
-
this.selectedRowsChange.emit(this.selectedRows);
|
|
455
|
-
}
|
|
456
|
-
_checkboxChange(target, index) {
|
|
457
|
-
if (!this.enableRowSelection) {
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
const row = this.parsedItems[index];
|
|
461
|
-
if (this.canSelectKey && !row[this.canSelectKey]) {
|
|
462
|
-
target.checked = false;
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
465
|
-
const value = this._getCheckedValue(target);
|
|
466
|
-
if (value) {
|
|
467
|
-
this.selectedRows = [...this.selectedRows, row];
|
|
468
|
-
this.selectedRowsChange.emit(this.selectedRows);
|
|
469
|
-
this.rowSelected.emit(row);
|
|
470
|
-
return;
|
|
471
|
-
}
|
|
472
|
-
const indexOfToRemove = this._selectionContains(row, index, true);
|
|
473
|
-
// we need to do this, because splice does not trigger the selection setter.
|
|
474
|
-
const selection = [...this.selectedRows];
|
|
475
|
-
selection.splice(indexOfToRemove, 1);
|
|
476
|
-
this.selectedRows = selection;
|
|
477
|
-
this.selectedRowsChange.emit(this.selectedRows);
|
|
478
|
-
this.rowDeselected.emit(row);
|
|
479
|
-
}
|
|
480
|
-
_getCheckedValue(target) {
|
|
481
|
-
return target?.checked;
|
|
482
|
-
}
|
|
483
|
-
_getSelectionValue(row, index) {
|
|
484
|
-
return this.selectionKey ? row?.[this.selectionKey] || index : index;
|
|
485
|
-
}
|
|
486
|
-
_selectionContains(row, index, returnIndex = false) {
|
|
487
|
-
const returnValue = this.selectedRows.findIndex((item) => this._getSelectionValue(row, index) ===
|
|
488
|
-
this._getSelectionValue(item, index));
|
|
489
|
-
return !returnIndex ? returnValue >= 0 : returnValue;
|
|
490
|
-
}
|
|
491
|
-
_selectionContainsAll() {
|
|
492
|
-
let returnValue = true;
|
|
493
|
-
if (!this.parsedItems?.length) {
|
|
494
|
-
return false;
|
|
495
|
-
}
|
|
496
|
-
for (let i = 0; i < this.parsedItems?.length; i++) {
|
|
497
|
-
const item = this.parsedItems[i];
|
|
498
|
-
const contains = this._selectionContains(item, i);
|
|
499
|
-
if (!contains) {
|
|
500
|
-
returnValue = false;
|
|
501
|
-
break;
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
return returnValue;
|
|
505
|
-
}
|
|
506
|
-
_selectionIndeterminate() {
|
|
507
|
-
if (!this.parsedItems?.length || !this.selectedRows?.length) {
|
|
508
|
-
return false;
|
|
509
|
-
}
|
|
510
|
-
let containsCount = 0;
|
|
511
|
-
for (let i = 0; i < this.parsedItems?.length; i++) {
|
|
512
|
-
const item = this.parsedItems[i];
|
|
513
|
-
const contains = this._selectionContains(item, i);
|
|
514
|
-
if (contains) {
|
|
515
|
-
containsCount++;
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
return containsCount > 0 && containsCount !== this.parsedItems.length;
|
|
519
|
-
}
|
|
520
|
-
_rowClick($event, index) {
|
|
521
|
-
const target = $event.target;
|
|
522
|
-
if (target.tagName.toLowerCase() === 'input' ||
|
|
523
|
-
target.type === 'checkbox') {
|
|
524
|
-
return;
|
|
525
|
-
}
|
|
526
|
-
const row = this._findRow($event.target);
|
|
527
|
-
if (this.enableRowClick) {
|
|
528
|
-
const action = this._findRowAction($event.target);
|
|
529
|
-
if (action) {
|
|
530
|
-
return;
|
|
531
|
-
}
|
|
532
|
-
const item = this.parsedItems[index];
|
|
533
|
-
this.rowClick.emit({
|
|
534
|
-
item,
|
|
535
|
-
ctrlDown: this._ctrlDown,
|
|
536
|
-
});
|
|
537
|
-
return;
|
|
538
|
-
}
|
|
539
|
-
if (!this.enableRowSelection) {
|
|
540
|
-
return;
|
|
541
|
-
}
|
|
542
|
-
const checkbox = row?.querySelector('input[type="checkbox"]');
|
|
543
|
-
if (!checkbox) {
|
|
544
|
-
return;
|
|
545
|
-
}
|
|
546
|
-
checkbox.checked = !checkbox.checked;
|
|
547
|
-
this._checkboxChange(checkbox, index);
|
|
548
|
-
}
|
|
549
|
-
_findRow(el) {
|
|
550
|
-
if (!el) {
|
|
551
|
-
return el;
|
|
552
|
-
}
|
|
553
|
-
if (el?.tagName?.toLowerCase() === 'p-table-row') {
|
|
554
|
-
return el;
|
|
555
|
-
}
|
|
556
|
-
return this._findRow(el?.parentElement);
|
|
557
|
-
}
|
|
558
|
-
_findRowAction(el) {
|
|
559
|
-
if (!el) {
|
|
560
|
-
return null;
|
|
561
|
-
}
|
|
562
|
-
if (el.getAttribute('data-is-action') !== null &&
|
|
563
|
-
el.getAttribute('data-is-action') !== 'false') {
|
|
564
|
-
return el;
|
|
565
|
-
}
|
|
566
|
-
if (el?.tagName?.toLowerCase() === 'p-table-row') {
|
|
567
|
-
return null;
|
|
568
|
-
}
|
|
569
|
-
return this._findRowAction(el?.parentElement);
|
|
570
|
-
}
|
|
571
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: Table, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
572
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: Table, selector: "p-table-ngx", inputs: { items: "items", loading: "loading", headerLoading: "headerLoading", footerLoading: "footerLoading", amountOfLoadingRows: "amountOfLoadingRows", enableRowSelection: "enableRowSelection", enableRowClick: "enableRowClick", selectedRows: "selectedRows", selectionKey: "selectionKey", canSelectKey: "canSelectKey", enableHeader: "enableHeader", quickFilters: "quickFilters", activeQuickFilterIdentifier: "activeQuickFilterIdentifier", enableSearch: "enableSearch", query: "query", enableFilter: "enableFilter", selectedFiltersAmount: "selectedFiltersAmount", filterButtonTemplate: "filterButtonTemplate", enableEdit: "enableEdit", editButtonLoading: "editButtonLoading", editButtonIcon: "editButtonIcon", editButtonText: "editButtonText", editButtonTemplate: "editButtonTemplate", enableFooter: "enableFooter", enablePageSize: "enablePageSize", enablePagination: "enablePagination", enableExport: "enableExport", page: "page", total: "total", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hideOnSinglePage: "hideOnSinglePage", emptyStateType: "emptyStateType", emptyStateIllustration: "emptyStateIllustration", emptyStateHeader: "emptyStateHeader", emptyStateContent: "emptyStateContent", emptyStateAction: "emptyStateAction", enableEmptyStateAction: "enableEmptyStateAction", emptyStateFilteredIllustration: "emptyStateFilteredIllustration", 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: "headerCustomFilterTemplate", first: true, predicate: TableCustomFilterDirective, descendants: true, read: TemplateRef, static: true }, { 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 *ngIf=\"enableHeader\"\n [quickFilters]=\"quickFilters\"\n [activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n (quickFilter)=\"(onQuickFilter)\"\n [enableSearch]=\"enableSearch\"\n [query]=\"query\"\n (queryChange)=\"(onQueryChange)\"\n [enableFilter]=\"enableFilter\"\n [selectedFiltersAmount]=\"selectedFiltersAmount\"\n [filterButtonTemplate]=\"filterButtonTemplate\"\n (filter)=\"filterModalShow$.next(true)\"\n [enableEdit]=\"enableEdit\"\n [canEdit]=\"!!selectedRows.length\"\n [editButtonTemplate]=\"editButtonTemplate\"\n [editLoading]=\"editButtonLoading\"\n [editText]=\"editButtonText\"\n [editIcon]=\"editButtonIcon\"\n (edit)=\"edit.emit()\"\n [itemsSelectedAmount]=\"selectedRows.length\"\n [loading]=\"headerLoading\"\n >\n <ng-container *ngIf=\"headerCustomFilterTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerCustomFilterTemplate\"\n ></ng-container>\n </ng-container>\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=\"h-6 w-6 rounded\"\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 *ngIf=\"enableFooter\"\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 [loading]=\"footerLoading\"\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 (closed)=\"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 w-full justify-between gap-4\">\n <p-button\n *ngIf=\"filterModalShowResetMobile\"\n class=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset(true)\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n *ngIf=\"filterModalShowReset\"\n class=\"hidden w-full tablet:w-auto desktop-xs:flex\"\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\n max-w-[20rem]\n flex-col\n items-center\n self-center\n py-24\n text-center\n \"\n >\n <p-illustration\n [variant]=\"emptyStateFilteredIllustration\"\n class=\"mb-6\"\n ></p-illustration>\n <p class=\"text-storm-default font-semibold\">\n {{ emptyStateFilteredHeader }}\n </p>\n <p class=\"mb-14 text-sm text-storm-medium\">\n {{ emptyStateFilteredContent }}\n </p>\n </div>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n <div\n class=\"\n flex\n max-w-[20rem]\n flex-col\n items-center\n self-center\n py-24\n text-center\n \"\n [class.cursor-pointer]=\"enableEmptyStateAction\"\n (click)=\"emptyStateClicked()\"\n >\n <p-illustration\n [variant]=\"emptyStateIllustration\"\n class=\"mb-6\"\n ></p-illustration>\n <p class=\"text-storm-default font-semibold\">\n {{ emptyStateHeader }}\n </p>\n <p class=\"mb-6 text-sm text-storm-medium\">\n {{ emptyStateContent }}\n </p>\n <p-button\n *ngIf=\"enableEmptyStateAction\"\n variant=\"secondary\"\n icon=\"plus\"\n size=\"small\"\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", "scrollLock", "show", "showClose", "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", "loading", "page", "pageSize", "pageSizeOptions", "total"] }, { kind: "component", type: i2.PTableHeader, selector: "p-table-header", inputs: ["activeQuickFilterIdentifier", "canEdit", "editButtonTemplate", "editIcon", "editLoading", "editText", "enableEdit", "enableFilter", "enableSearch", "filterButtonTemplate", "itemsSelectedAmount", "loading", "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 });
|
|
573
|
-
};
|
|
574
|
-
Table = __decorate([
|
|
575
|
-
UntilDestroy({ checkProperties: true })
|
|
576
|
-
], Table);
|
|
577
|
-
export { Table };
|
|
578
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: Table, decorators: [{
|
|
579
|
-
type: Component,
|
|
580
|
-
args: [{ selector: 'p-table-ngx', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-table-container>\n <p-table-header\n *ngIf=\"enableHeader\"\n [quickFilters]=\"quickFilters\"\n [activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n (quickFilter)=\"(onQuickFilter)\"\n [enableSearch]=\"enableSearch\"\n [query]=\"query\"\n (queryChange)=\"(onQueryChange)\"\n [enableFilter]=\"enableFilter\"\n [selectedFiltersAmount]=\"selectedFiltersAmount\"\n [filterButtonTemplate]=\"filterButtonTemplate\"\n (filter)=\"filterModalShow$.next(true)\"\n [enableEdit]=\"enableEdit\"\n [canEdit]=\"!!selectedRows.length\"\n [editButtonTemplate]=\"editButtonTemplate\"\n [editLoading]=\"editButtonLoading\"\n [editText]=\"editButtonText\"\n [editIcon]=\"editButtonIcon\"\n (edit)=\"edit.emit()\"\n [itemsSelectedAmount]=\"selectedRows.length\"\n [loading]=\"headerLoading\"\n >\n <ng-container *ngIf=\"headerCustomFilterTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerCustomFilterTemplate\"\n ></ng-container>\n </ng-container>\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=\"h-6 w-6 rounded\"\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 *ngIf=\"enableFooter\"\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 [loading]=\"footerLoading\"\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 (closed)=\"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 w-full justify-between gap-4\">\n <p-button\n *ngIf=\"filterModalShowResetMobile\"\n class=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset(true)\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n *ngIf=\"filterModalShowReset\"\n class=\"hidden w-full tablet:w-auto desktop-xs:flex\"\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\n max-w-[20rem]\n flex-col\n items-center\n self-center\n py-24\n text-center\n \"\n >\n <p-illustration\n [variant]=\"emptyStateFilteredIllustration\"\n class=\"mb-6\"\n ></p-illustration>\n <p class=\"text-storm-default font-semibold\">\n {{ emptyStateFilteredHeader }}\n </p>\n <p class=\"mb-14 text-sm text-storm-medium\">\n {{ emptyStateFilteredContent }}\n </p>\n </div>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n <div\n class=\"\n flex\n max-w-[20rem]\n flex-col\n items-center\n self-center\n py-24\n text-center\n \"\n [class.cursor-pointer]=\"enableEmptyStateAction\"\n (click)=\"emptyStateClicked()\"\n >\n <p-illustration\n [variant]=\"emptyStateIllustration\"\n class=\"mb-6\"\n ></p-illustration>\n <p class=\"text-storm-default font-semibold\">\n {{ emptyStateHeader }}\n </p>\n <p class=\"mb-6 text-sm text-storm-medium\">\n {{ emptyStateContent }}\n </p>\n <p-button\n *ngIf=\"enableEmptyStateAction\"\n variant=\"secondary\"\n icon=\"plus\"\n size=\"small\"\n >\n {{ emptyStateAction }}\n </p-button>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}\n"] }]
|
|
581
|
-
}], ctorParameters: function () { return []; }, propDecorators: { items: [{
|
|
582
|
-
type: Input
|
|
583
|
-
}], loading: [{
|
|
584
|
-
type: Input
|
|
585
|
-
}], headerLoading: [{
|
|
586
|
-
type: Input
|
|
587
|
-
}], footerLoading: [{
|
|
588
|
-
type: Input
|
|
589
|
-
}], amountOfLoadingRows: [{
|
|
590
|
-
type: Input
|
|
591
|
-
}], enableRowSelection: [{
|
|
592
|
-
type: Input
|
|
593
|
-
}], enableRowClick: [{
|
|
594
|
-
type: Input
|
|
595
|
-
}], selectedRows: [{
|
|
596
|
-
type: Input
|
|
597
|
-
}], selectedRowsChange: [{
|
|
598
|
-
type: Output
|
|
599
|
-
}], selectionKey: [{
|
|
600
|
-
type: Input
|
|
601
|
-
}], canSelectKey: [{
|
|
602
|
-
type: Input
|
|
603
|
-
}], rowClick: [{
|
|
604
|
-
type: Output
|
|
605
|
-
}], rowSelected: [{
|
|
606
|
-
type: Output
|
|
607
|
-
}], rowDeselected: [{
|
|
608
|
-
type: Output
|
|
609
|
-
}], enableHeader: [{
|
|
610
|
-
type: Input
|
|
611
|
-
}], quickFilters: [{
|
|
612
|
-
type: Input
|
|
613
|
-
}], activeQuickFilterIdentifier: [{
|
|
614
|
-
type: Input
|
|
615
|
-
}], enableSearch: [{
|
|
616
|
-
type: Input
|
|
617
|
-
}], query: [{
|
|
618
|
-
type: Input
|
|
619
|
-
}], enableFilter: [{
|
|
620
|
-
type: Input
|
|
621
|
-
}], selectedFiltersAmount: [{
|
|
622
|
-
type: Input
|
|
623
|
-
}], filterButtonTemplate: [{
|
|
624
|
-
type: Input
|
|
625
|
-
}], enableEdit: [{
|
|
626
|
-
type: Input
|
|
627
|
-
}], editButtonLoading: [{
|
|
628
|
-
type: Input
|
|
629
|
-
}], editButtonIcon: [{
|
|
630
|
-
type: Input
|
|
631
|
-
}], editButtonText: [{
|
|
632
|
-
type: Input
|
|
633
|
-
}], editButtonTemplate: [{
|
|
634
|
-
type: Input
|
|
635
|
-
}], quickFilter: [{
|
|
636
|
-
type: Output
|
|
637
|
-
}], queryChange: [{
|
|
638
|
-
type: Output
|
|
639
|
-
}], filter: [{
|
|
640
|
-
type: Output
|
|
641
|
-
}], edit: [{
|
|
642
|
-
type: Output
|
|
643
|
-
}], enableFooter: [{
|
|
644
|
-
type: Input
|
|
645
|
-
}], enablePageSize: [{
|
|
646
|
-
type: Input
|
|
647
|
-
}], enablePagination: [{
|
|
648
|
-
type: Input
|
|
649
|
-
}], enableExport: [{
|
|
650
|
-
type: Input
|
|
651
|
-
}], page: [{
|
|
652
|
-
type: Input
|
|
653
|
-
}], total: [{
|
|
654
|
-
type: Input
|
|
655
|
-
}], pageChange: [{
|
|
656
|
-
type: Output
|
|
657
|
-
}], pageSize: [{
|
|
658
|
-
type: Input
|
|
659
|
-
}], pageSizeOptions: [{
|
|
660
|
-
type: Input
|
|
661
|
-
}], pageSizeChange: [{
|
|
662
|
-
type: Output
|
|
663
|
-
}], export: [{
|
|
664
|
-
type: Output
|
|
665
|
-
}], hideOnSinglePage: [{
|
|
666
|
-
type: Input
|
|
667
|
-
}], emptyStateType: [{
|
|
668
|
-
type: Input
|
|
669
|
-
}], emptyStateIllustration: [{
|
|
670
|
-
type: Input
|
|
671
|
-
}], emptyStateHeader: [{
|
|
672
|
-
type: Input
|
|
673
|
-
}], emptyStateContent: [{
|
|
674
|
-
type: Input
|
|
675
|
-
}], emptyStateAction: [{
|
|
676
|
-
type: Input
|
|
677
|
-
}], enableEmptyStateAction: [{
|
|
678
|
-
type: Input
|
|
679
|
-
}], emptyStateFilteredIllustration: [{
|
|
680
|
-
type: Input
|
|
681
|
-
}], emptyStateFilteredHeader: [{
|
|
682
|
-
type: Input
|
|
683
|
-
}], emptyStateFilteredContent: [{
|
|
684
|
-
type: Input
|
|
685
|
-
}], emptyStateActionClick: [{
|
|
686
|
-
type: Output
|
|
687
|
-
}], headerCustomFilterTemplate: [{
|
|
688
|
-
type: ContentChild,
|
|
689
|
-
args: [TableCustomFilterDirective, {
|
|
690
|
-
read: TemplateRef,
|
|
691
|
-
static: true,
|
|
692
|
-
}]
|
|
693
|
-
}], columnDefinitions: [{
|
|
694
|
-
type: ContentChildren,
|
|
695
|
-
args: [TableColumn]
|
|
696
|
-
}], filterModalTemplate: [{
|
|
697
|
-
type: ContentChild,
|
|
698
|
-
args: [TableFilterModalDirective, {
|
|
699
|
-
read: TemplateRef,
|
|
700
|
-
static: true,
|
|
701
|
-
}]
|
|
702
|
-
}], filterModalHeaderText: [{
|
|
703
|
-
type: Input
|
|
704
|
-
}], filterModalSaveText: [{
|
|
705
|
-
type: Input
|
|
706
|
-
}], filterModalCancelText: [{
|
|
707
|
-
type: Input
|
|
708
|
-
}], filterModalResetText: [{
|
|
709
|
-
type: Input
|
|
710
|
-
}], filterModalShowReset: [{
|
|
711
|
-
type: Input
|
|
712
|
-
}], filterModalShowResetMobile: [{
|
|
713
|
-
type: Input
|
|
714
|
-
}], filterModalShow: [{
|
|
715
|
-
type: Output
|
|
716
|
-
}], filterModalSave: [{
|
|
717
|
-
type: Output
|
|
718
|
-
}], filterModalReset: [{
|
|
719
|
-
type: Output
|
|
720
|
-
}], keyDown: [{
|
|
721
|
-
type: HostListener,
|
|
722
|
-
args: ['document:keydown', ['$event']]
|
|
723
|
-
}], keyUp: [{
|
|
724
|
-
type: HostListener,
|
|
725
|
-
args: ['document:keyup', ['$event']]
|
|
726
|
-
}], visibilityChange: [{
|
|
727
|
-
type: HostListener,
|
|
728
|
-
args: ['document:visibilitychange', ['$event']]
|
|
729
|
-
}] } });
|
|
730
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhcGVybGVzcy9zcmMvbGliL21vZHVsZXMvdGFibGUvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFNckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQ0gsMEJBQTBCLEVBQzFCLHlCQUF5QixHQUM1QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7O0FBU3ZELElBQU0sS0FBSyxHQUFYLE1BQU0sS0FBSztJQUNkOztPQUVHO0lBQ00sS0FBSyxDQUFVO0lBRXhCOztPQUVHO0lBQ00sT0FBTyxHQUFZLEtBQUssQ0FBQztJQUVsQzs7T0FFRztJQUNNLGFBQWEsR0FBWSxLQUFLLENBQUM7SUFFeEM7O09BRUc7SUFDTSxhQUFhLEdBQVksS0FBSyxDQUFDO0lBRXhDOztPQUVHO0lBQ00sbUJBQW1CLEdBQVcsQ0FBQyxDQUFDO0lBRXpDOztP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LEtBQUs7Z0JBRUcsOEJBQThCO3NCQUF0QyxLQUFLO2dCQUVHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBS0kscUJBQXFCO3NCQUE5QixNQUFNO2dCQWlCQSwwQkFBMEI7c0JBSmhDLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUU7d0JBQ3RDLElBQUksRUFBRSxXQUFXO3dCQUNqQixNQUFNLEVBQUUsSUFBSTtxQkFDZjtnQkFPRyxpQkFBaUI7c0JBRHBCLGVBQWU7dUJBQUMsV0FBVztnQkFjckIsbUJBQW1CO3NCQUp6QixZQUFZO3VCQUFDLHlCQUF5QixFQUFFO3dCQUNyQyxJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLElBQUk7cUJBQ2Y7Z0JBS1EscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFtQ1AsT0FBTztzQkFETixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVU1QyxLQUFLO3NCQURKLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVTFDLGdCQUFnQjtzQkFEZixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSwgdW50aWxEZXN0cm95ZWQgfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgUXVpY2tGaWx0ZXIsIFJvd0NsaWNrRXZlbnQgfSBmcm9tICdAcGFwZXJsZXNzL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBJY29uVmFyaWFudCxcbiAgICBJbGx1c3RyYXRpb25WYXJpYW50LFxufSBmcm9tICdAcGFwZXJsZXNzL2NvcmUvZGlzdC90eXBlcy9jb21wb25lbnRzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gICAgVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsXG4gICAgVGFibGVGaWx0ZXJNb2RhbERpcmVjdGl2ZSxcbn0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtbiB9IGZyb20gJy4uL3RhYmxlLWNvbHVtbi90YWJsZS1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IGRlZmF1bHRTaXplLCBkZWZhdWx0U2l6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbkBVbnRpbERlc3Ryb3koeyBjaGVja1Byb3BlcnRpZXM6IHRydWUgfSlcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncC10YWJsZS1uZ3gnLFxuICAgIHRlbXBsYXRlVXJsOiAndGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWyd0YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbXMgdG8gYmUgZmVkIHRvIHRoZSB0YWJsZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGl0ZW1zITogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIGRhdGEgaXMgbG9hZGluZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0aGUgaGVhZGVyIHNob3VsZCBzaG93IGxvYWRpbmcgc3RhdGVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBoZWFkZXJMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdGhlIGZvb3RlciBzaG91bGQgc2hvdyBsb2FkaW5nIHN0YXRlXG4gICAgICovXG4gICAgQElucHV0KCkgZm9vdGVyTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBsb2FkaW5nIHJvd3MgdG8gc2hvd1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGFtb3VudE9mTG9hZGluZ1Jvd3M6IG51bWJlciA9IDY7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHNlbGVjdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHJvdyBjbGlja2luZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd0NsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiBpdGVtc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkUm93czogYW55W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkUm93c0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IHRvIGRldGVybWluZSBpZiBhIHJvdyBpcyBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGlvbktleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQSBrZXkgdG8gZGV0ZXJtaW5lIGlmIGEgcm93IGNhbiBiZSBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNhblNlbGVjdEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dDbGljazogRXZlbnRFbWl0dGVyPFJvd0NsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgZGVzZWxlY3RlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dEZXNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKiBTVEFSVCBIRUFERVIgKi9cblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBzaG93IHRoZSBoZWFkZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogUXVpY2sgZmlsdGVycyB0byBzaG93XG4gICAgICovXG4gICAgQElucHV0KCkgcXVpY2tGaWx0ZXJzOiBRdWlja0ZpbHRlcltdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBBY3RpdmUgcXVpY2sgZmlsdGVyIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBhY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBzaG93IHRoZSBzZWFyY2ggaW5wdXRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXJ5IHRvIHNob3cgaW4gdGhlIHNlYXJjaCBiYXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBxdWVyeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIGZpbHRlciBidXR0b25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmaWx0ZXJzIGJlaW5nIHNlbGVjdGVkXG4gICAgICovXG4gICAgQElucHV0KCkgc2VsZWN0ZWRGaWx0ZXJzQW1vdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBmaWx0ZXIgYnV0dG9uIHRleHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBmaWx0ZXJCdXR0b25UZW1wbGF0ZTogYW55O1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIGVkaXQgYnV0dG9uXG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlRWRpdDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdGhlIGVkaXQgYnV0dG9uIGlzIGxvYWRpbmdcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXQgYnV0dG9uIGljb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uSWNvbjogSWNvblZhcmlhbnQgPSAncGVuY2lsJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0IGJ1dHRvbiB0ZXh0IGlmIGNoYW5nZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uVGV4dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGVkaXQgYnV0dG9uIHRleHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uVGVtcGxhdGU6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gb25lIG9mIHRoZSBxdWljayBmaWx0ZXJzIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcXVpY2tGaWx0ZXI6IEV2ZW50RW1pdHRlcjxRdWlja0ZpbHRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuIHRoZSBxdWVyeSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHF1ZXJ5Q2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gdGhlIGZpbHRlciBidXR0b24gaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBmaWx0ZXI6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gdGhlIGVkaXQgYnV0dG9uIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZWRpdDogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqIFNUQVJUIEZPT1RFUiAqL1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIGZvb3RlclxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZUZvb3RlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHBhZ2Ugc2l6ZSBzZWxlY3RcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVQYWdlU2l6ZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHBhZ2luYXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBlbmFibGUgZXhwb3J0XG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlRXhwb3J0OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHBhZ2VcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwYWdlOiBudW1iZXIgPSAxO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBpdGVtc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHRvdGFsITogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgdGhlIHBhZ2UgY2hhbmdlc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwYWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgaXRlbXMgcGVyIHBhZ2VcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gZGVmYXVsdFNpemU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3B0aW9ucyBmb3IgdGhlIHBhZ2Ugc2l6ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBkZWZhdWx0U2l6ZU9wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHBhZ2VTaXplQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBwYWdlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZXhwb3J0OiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBoaWRlIHdoZW4gdGhlcmUgaXMgb25seSAxIHBhZ2UgYXZhaWxhYmxlXG4gICAgICovXG4gICAgQElucHV0KCkgaGlkZU9uU2luZ2xlUGFnZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiBFbXB0eSBzdGF0ZSBzdGFydCAqL1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVUeXBlOiAnbm9fZmlsdGVyJyB8ICdmaWx0ZXJlZCcgPSAnbm9fZmlsdGVyJztcblxuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVJbGx1c3RyYXRpb246IElsbHVzdHJhdGlvblZhcmlhbnQgPSAnZW1wdHktc3RhdGUtYWRkJztcbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlSGVhZGVyITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVDb250ZW50ITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVBY3Rpb24hOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKSBlbmFibGVFbXB0eVN0YXRlQWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVGaWx0ZXJlZElsbHVzdHJhdGlvbjogSWxsdXN0cmF0aW9uVmFyaWFudCA9XG4gICAgICAgICdlbXB0eS1zdGF0ZS1zZWFyY2gnO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVGaWx0ZXJlZEhlYWRlciE6IHN0cmluZztcbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlRmlsdGVyZWRDb250ZW50ITogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgdGhlIGVtcHR5IHN0YXRlIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZW1wdHlTdGF0ZUFjdGlvbkNsaWNrOiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiBFbXB0eSBzdGF0ZSBlbmQgKi9cblxuICAgIHB1YmxpYyBjb2x1bW5zOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyBwYXJzZWRJdGVtczogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgbG9hZGluZ1Jvd3MgPSBBcnJheS5mcm9tKHtcbiAgICAgICAgbGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG4gICAgfSk7XG4gICAgcHJpdmF0ZSBfY3RybERvd24gPSBmYWxzZTtcblxuICAgIC8vIEFuZ3VsYXIgc3R1ZmZcbiAgICAvLyBjdXN0b20gZmlsdGVyIHRlbXBsYXRlXG4gICAgQENvbnRlbnRDaGlsZChUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSwge1xuICAgICAgICByZWFkOiBUZW1wbGF0ZVJlZixcbiAgICAgICAgc3RhdGljOiB0cnVlLFxuICAgIH0pXG4gICAgcHVibGljIGhlYWRlckN1c3RvbUZpbHRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gY29sdW1uIHRlbXBsYXRlc1xuICAgIHByaXZhdGUgX2NvbHVtbkRlZmluaXRpb25zITogUXVlcnlMaXN0PFRhYmxlQ29sdW1uPjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oVGFibGVDb2x1bW4pXG4gICAgc2V0IGNvbHVtbkRlZmluaXRpb25zKHY6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4pIHtcbiAgICAgICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSB2O1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICB9XG4gICAgZ2V0IGNvbHVtbkRlZmluaXRpb25zKCk6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG1vZGFsXG4gICAgQENvbnRlbnRDaGlsZChUYWJsZUZpbHRlck1vZGFsRGlyZWN0aXZlLCB7XG4gICAgICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgICAgICBzdGF0aWM6IHRydWUsXG4gICAgfSlcbiAgICBwdWJsaWMgZmlsdGVyTW9kYWxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBmaWx0ZXJNb2RhbFNob3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbEhlYWRlclRleHQ6IHN0cmluZyA9ICdGaWx0ZXJzJztcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFNhdmVUZXh0OiBzdHJpbmcgPSAnU2F2ZSc7XG4gICAgQElucHV0KCkgZmlsdGVyTW9kYWxDYW5jZWxUZXh0OiBzdHJpbmcgPSAnQ2FuY2VsJztcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFJlc2V0VGV4dDogc3RyaW5nID0gJ1Jlc2V0IGZpbHRlcnMnO1xuXG4gICAgQElucHV0KCkgZmlsdGVyTW9kYWxTaG93UmVzZXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFNob3dSZXNldE1vYmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpIGZpbHRlck1vZGFsU2hvdzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBmaWx0ZXJNb2RhbFNhdmU6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZmlsdGVyTW9kYWxSZXNldDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX3BhcnNlSXRlbXModGhpcy5pdGVtcyk7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nUm93cyA9IEFycmF5LmZyb20oe1xuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTaG93JFxuICAgICAgICAgICAgLnBpcGUodW50aWxEZXN0cm95ZWQodGhpcyksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5maWx0ZXJNb2RhbFNob3cubmV4dCh2YWx1ZSkpO1xuICAgICAgICAvLyB0aGlzLl9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydpdGVtcyddKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZUl0ZW1zKGNoYW5nZXNbJ2l0ZW1zJ10uY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWydhbW91bnRPZkxvYWRpbmdSb3dzJ10pIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1Jvd3MgPSBBcnJheS5mcm9tKHtcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGNoYW5nZXNbJ2Ftb3VudE9mTG9hZGluZ1Jvd3MnXS5jdXJyZW50VmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICBASG9zdExpc3RlbmVyKCdib2R5OnRhYmxlRGVmaW5pdGlvbkNoYW5nZWQnLCB7IHRhcmdldDogJ2JvZHknIH0pXG4gICAgLy8gIG9uVGFibGVEZWZpbml0aW9uVXBkYXRlZCgpIHtcbiAgICAvLyAgICAgIHRoaXMuX2dlbmVyYXRlQ29sdW1ucygpO1xuICAgIC8vICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBrZXlEb3duKHsga2V5IH06IHsga2V5OiBzdHJpbmcgfSkge1xuICAgICAgICBpZiAoa2V5ICE9PSAnQ29udHJvbCcgfHwgdGhpcy5fY3RybERvd24gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N0cmxEb3duID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gICAga2V5VXAoeyBrZXkgfTogeyBrZXk6IHN0cmluZyB9KSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdDb250cm9sJyB8fCB0aGlzLl9jdHJsRG93biA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N0cmxEb3duID0gZmFsc2U7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dmlzaWJpbGl0eWNoYW5nZScsIFsnJGV2ZW50J10pXG4gICAgdmlzaWJpbGl0eUNoYW5nZSgpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAhPT0gJ2hpZGRlbicgfHwgdGhpcy5fY3RybERvd24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jdHJsRG93biA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uUXVlcnlDaGFuZ2UoeyBkZXRhaWwgfTogQ3VzdG9tRXZlbnQ8c3RyaW5nPikge1xuICAgICAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQoZGV0YWlsKTtcbiAgICB9XG5cbiAgICBvblF1aWNrRmlsdGVyKHsgZGV0YWlsIH06IEN1c3RvbUV2ZW50PGFueT4pIHtcbiAgICAgICAgdGhpcy5xdWlja0ZpbHRlci5lbWl0KGRldGFpbCk7XG4gICAgfVxuXG4gICAgb25QYWdlU2l6ZUNoYW5nZSh7IGRldGFpbCB9OiBDdXN0b21FdmVudDxudW1iZXI+KSB7XG4gICAgICAgIHRoaXMucGFnZVNpemVDaGFuZ2UuZW1pdChkZXRhaWwpO1xuICAgIH1cblxuICAgIG9uUGFnZUNoYW5nZSh7IGRldGFpbCB9OiBDdXN0b21FdmVudDxudW1iZXI+KSB7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KGRldGFpbCk7XG4gICAgfVxuXG4gICAgb25GaWx0ZXJNb2RhbFNhdmUoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTYXZlLm5leHQoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIG9uRmlsdGVyTW9kYWxSZXNldChyZXNldFF1aWNrRmlsdGVyID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFJlc2V0Lm5leHQocmVzZXRRdWlja0ZpbHRlcik7XG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTaG93JC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBlbXB0eVN0YXRlQ2xpY2tlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZUVtcHR5U3RhdGVBY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1wdHlTdGF0ZUFjdGlvbkNsaWNrLmVtaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUl0ZW1zKGl0ZW1zOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpdGVtcykge1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRJdGVtcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gaXRlbXM7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gSlNPTi5wYXJzZShpdGVtcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2VuZXJhdGVDb2x1bW5zKCkge1xuICAgICAgICAvLyBjb25zdCBkZWZpbml0aW9ucyA9XG4gICAgICAgIC8vIFx0dGhpcy5fZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdwLXRhYmxlLWRlZmluaXRpb24nKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gQXJyYXkuZnJvbSh0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gIHByaXZhdGUgX2dldEhlYWRlcigpIHtcbiAgICAvLyAgICAgIHJldHVybiAoXG4gICAgLy8gICAgICAgICAgPHAtdGFibGUtcm93IHZhcmlhbnQ9XCJoZWFkZXJcIj5cbiAgICAvLyAgICAgICAgICAgICAge3RoaXMuX2NvbHVtbnMubWFwKChjb2w6IFRhYmxlRGVmaW5pdGlvbiwgaW5kZXgpID0+IChcbiAgICAvLyAgICAgICAgICAgICAgICAgIDxwLXRhYmxlLWNvbHVtblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb249e2NvbH1cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29sLm5hbWV9XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImhlYWRlclwiXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3g9e3RoaXMuX2dldENoZWNrYm94KGluZGV4LCBudWxsLCAnaGVhZGVyJyl9XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgIC8vICAgICAgICAgICAgICAgICAgPjwvcC10YWJsZS1jb2x1bW4+XG4gICAgLy8gICAgICAgICAgICAgICkpfVxuICAgIC8vICAgICAgICAgIDwvcC10YWJsZS1yb3c+XG4gICAgLy8gICAgICApO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0Um93cygpIHtcbiAgICAvLyAgICAgIGlmICh0aGlzLmxvYWRpbmcpIHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAvLyAgICAgICAgICAgICAge1xuICAgIC8vICAgICAgICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG4gICAgLy8gICAgICAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICAgICAgIChfLCBpKSA9PiAoXG4gICAgLy8gICAgICAgICAgICAgICAgICA8cC10YWJsZS1yb3dcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBlbmFibGVIb3Zlcj17XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlUm93U2VsZWN0aW9uIHx8IHRoaXMuZW5hYmxlUm93Q2xpY2tcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgICAgICA+XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAge3RoaXMuX2dldExvYWRpbmdDb2x1bW5zKGkpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAvLyAgICAgICAgICAgICAgKVxuICAgIC8vICAgICAgICAgICk7XG4gICAgLy8gICAgICB9XG5cbiAgICAvLyAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgLy8gICAgICAgICAgPHAtdGFibGUtcm93XG4gICAgLy8gICAgICAgICAgICAgIGVuYWJsZUhvdmVyPXt0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbiB8fCB0aGlzLmVuYWJsZVJvd0NsaWNrfVxuICAgIC8vICAgICAgICAgICAgICBvbkNsaWNrPXsoZXYpID0+IHRoaXMuX3Jvd0NsaWNrKGV2LCBpbmRleCl9XG4gICAgLy8gICAgICAgICAgPlxuICAgIC8vICAgICAgICAgICAgICB7dGhpcy5fZ2V0Um93Q29sdW1ucyhpdGVtLCBpbmRleCl9XG4gICAgLy8gICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAvLyAgICAgICkpO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0Um93Q29sdW1ucyhpdGVtLCBpbmRleCkge1xuICAgIC8vICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMubWFwKChjb2w6IFRhYmxlRGVmaW5pdGlvbiwgY29sSW5kZXgpID0+IHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gKFxuICAgIC8vICAgICAgICAgICAgICA8cC10YWJsZS1jb2x1bW5cbiAgICAvLyAgICAgICAgICAgICAgICAgIGRlZmluaXRpb249e2NvbH1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGl0ZW09e2l0ZW19XG4gICAgLy8gICAgICAgICAgICAgICAgICBjaGVja2JveD17dGhpcy5fZ2V0Q2hlY2tib3goY29sSW5kZXgsIGluZGV4KX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGluZGV4PXtjb2xJbmRleH1cbiAgICAvLyAgICAgICAgICAgICAgICAgIHJvd0luZGV4PXtpbmRleH1cbiAgICAvLyAgICAgICAgICAgICAgPjwvcC10YWJsZS1jb2x1bW4+XG4gICAgLy8gICAgICAgICAgKTtcbiAgICAvLyAgICAgIH0pO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0TG9hZGluZ0NvbHVtbnMoaW5kZXgpIHtcbiAgICAvLyAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLm1hcCgoY29sOiBUYWJsZURlZmluaXRpb24sIGNvbEluZGV4KSA9PiB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuIChcbiAgICAvLyAgICAgICAgICAgICAgPHAtdGFibGUtY29sdW1uXG4gICAgLy8gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uPXtjb2x9XG4gICAgLy8gICAgICAgICAgICAgICAgICB2YXJpYW50PVwibG9hZGluZ1wiXG4gICAgLy8gICAgICAgICAgICAgICAgICBjaGVja2JveD17dGhpcy5fZ2V0Q2hlY2tib3goY29sSW5kZXgsIGluZGV4LCAnbG9hZGluZycpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgaW5kZXg9e2NvbEluZGV4fVxuICAgIC8vICAgICAgICAgICAgICAgICAgcm93SW5kZXg9e2luZGV4fVxuICAgIC8vICAgICAgICAgICAgICA+PC9wLXRhYmxlLWNvbHVtbj5cbiAgICAvLyAgICAgICAgICApO1xuICAgIC8vICAgICAgfSk7XG4gICAgLy8gIH1cblxuICAgIC8vICBwcml2YXRlIF9nZXRDaGVja2JveChcbiAgICAvLyAgICAgIGluZGV4LFxuICAgIC8vICAgICAgcm93SW5kZXgsXG4gICAgLy8gICAgICB2YXJpYW50OiAnaGVhZGVyJyB8ICdkZWZhdWx0JyB8ICdsb2FkaW5nJyA9ICdkZWZhdWx0J1xuICAgIC8vICApIHtcbiAgICAvLyAgICAgIGlmICghdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24gfHwgIXRoaXMuc2VsZWN0aW9uS2V5IHx8IGluZGV4ICE9PSAwKSB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICAgfVxuXG4gICAgLy8gICAgICBpZiAodmFyaWFudCA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuIDxwLWxvYWRlciB2YXJpYW50PVwiZ2hvc3RcIiBjbGFzcz1cInJvdW5kZWQgdy02IGgtNlwiIC8+O1xuICAgIC8vICAgICAgfVxuXG4gICAgLy8gICAgICBpZiAodmFyaWFudCA9PT0gJ2hlYWRlcicpIHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gKFxuICAgIC8vICAgICAgICAgICAgICA8aW5wdXRcbiAgICAvLyAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dFwiXG4gICAgLy8gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgIC8vICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldikgPT4gdGhpcy5fc2VsZWN0QWxsQ2hhbmdlKGV2KX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3RoaXMuX3NlbGVjdGlvbkNvbnRhaW5zQWxsKCl9XG4gICAgLy8gICAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlPXt0aGlzLl9zZWxlY3Rpb25JbmRldGVybWluYXRlKCl9XG4gICAgLy8gICAgICAgICAgICAgIC8+XG4gICAgLy8gICAgICAgICAgKTtcbiAgICAvLyAgICAgIH1cblxuICAgIC8vICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2l0ZW1zW3Jvd0luZGV4XTtcblxuICAgIC8vICAgICAgcmV0dXJuIChcbiAgICAvLyAgICAgICAgICA8aW5wdXRcbiAgICAvLyAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0XCJcbiAgICAvLyAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAvLyAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldikgPT4gdGhpcy5fY2hlY2tib3hDaGFuZ2UoZXY/LnRhcmdldCwgcm93SW5kZXgpfVxuICAgIC8vICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5jYW5TZWxlY3RLZXkgJiYgIWl0ZW1bdGhpcy5jYW5TZWxlY3RLZXldfVxuICAgIC8vICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCByb3dJbmRleCl9XG4gICAgLy8gICAgICAgICAgLz5cbiAgICAvLyAgICAgICk7XG4gICAgLy8gIH1cblxuICAgIHB1YmxpYyBfY2hlY2tib3hEaXNhYmxlZChpdGVtOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuU2VsZWN0S2V5ICYmICFpdGVtW3RoaXMuY2FuU2VsZWN0S2V5XTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NlbGVjdEFsbENoYW5nZSgkZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2dldENoZWNrZWRWYWx1ZSgkZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB0b0FkZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5TZWxlY3RLZXkgJiYgIXJvd1t0aGlzLmNhblNlbGVjdEtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKHJvdywgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChyb3cpO1xuICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChyb3cpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFsuLi50aGlzLnNlbGVjdGVkUm93cywgLi4udG9BZGRdO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRSb3dzW2ldO1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtcy5maW5kKFxuICAgICAgICAgICAgICAgIChkKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZShkLCBpKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VsZWN0aW9uVmFsdWUodmFsdWUsIGkpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd0Rlc2VsZWN0ZWQuZW1pdChyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgfVxuXG4gICAgcHVibGljIF9jaGVja2JveENoYW5nZSh0YXJnZXQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3cgPSB0aGlzLnBhcnNlZEl0ZW1zW2luZGV4XTtcblxuICAgICAgICBpZiAodGhpcy5jYW5TZWxlY3RLZXkgJiYgIXJvd1t0aGlzLmNhblNlbGVjdEtleV0pIHtcbiAgICAgICAgICAgIHRhcmdldC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2dldENoZWNrZWRWYWx1ZSh0YXJnZXQpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gWy4uLnRoaXMuc2VsZWN0ZWRSb3dzLCByb3ddO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQocm93KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4T2ZUb1JlbW92ZSA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKHJvdywgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZG8gdGhpcywgYmVjYXVzZSBzcGxpY2UgZG9lcyBub3QgdHJpZ2dlciB0aGUgc2VsZWN0aW9uIHNldHRlci5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gWy4uLnRoaXMuc2VsZWN0ZWRSb3dzXTtcbiAgICAgICAgc2VsZWN0aW9uLnNwbGljZShpbmRleE9mVG9SZW1vdmUsIDEpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgICAgIHRoaXMucm93RGVzZWxlY3RlZC5lbWl0KHJvdyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q2hlY2tlZFZhbHVlKHRhcmdldDogYW55KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ/LmNoZWNrZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2VsZWN0aW9uVmFsdWUocm93OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uS2V5ID8gcm93Py5bdGhpcy5zZWxlY3Rpb25LZXldIHx8IGluZGV4IDogaW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIF9zZWxlY3Rpb25Db250YWlucyhcbiAgICAgICAgcm93OiBhbnksXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHJldHVybkluZGV4ID0gZmFsc2VcbiAgICApOiBhbnkge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHRoaXMuc2VsZWN0ZWRSb3dzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKHJvdywgaW5kZXgpID09PVxuICAgICAgICAgICAgICAgIHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKGl0ZW0sIGluZGV4KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gIXJldHVybkluZGV4ID8gcmV0dXJuVmFsdWUgPj0gMCA6IHJldHVyblZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2VsZWN0aW9uQ29udGFpbnNBbGwoKSB7XG4gICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFyc2VkSXRlbXM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5zID0gdGhpcy5fc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgaSk7XG5cbiAgICAgICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGggfHwgIXRoaXMuc2VsZWN0ZWRSb3dzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb250YWluc0NvdW50ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaV07XG4gICAgICAgICAgICBjb25zdCBjb250YWlucyA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIGkpO1xuXG4gICAgICAgICAgICBpZiAoY29udGFpbnMpIHtcbiAgICAgICAgICAgICAgICBjb250YWluc0NvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbnNDb3VudCA+IDAgJiYgY29udGFpbnNDb3VudCAhPT0gdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIF9yb3dDbGljaygkZXZlbnQ6IHsgdGFyZ2V0OiBhbnkgfSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgfHxcbiAgICAgICAgICAgIHRhcmdldC50eXBlID09PSAnY2hlY2tib3gnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5fZmluZFJvdygkZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICBpZiAodGhpcy5lbmFibGVSb3dDbGljaykge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5fZmluZFJvd0FjdGlvbigkZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5yb3dDbGljay5lbWl0KHtcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIGN0cmxEb3duOiB0aGlzLl9jdHJsRG93bixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hlY2tib3ggPSByb3c/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuXG4gICAgICAgIGlmICghY2hlY2tib3gpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSAhY2hlY2tib3guY2hlY2tlZDtcbiAgICAgICAgdGhpcy5fY2hlY2tib3hDaGFuZ2UoY2hlY2tib3gsIGluZGV4KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9maW5kUm93KGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuICAgICAgICBpZiAoIWVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWw/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdwLXRhYmxlLXJvdycpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kUm93KGVsPy5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9maW5kUm93QWN0aW9uKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuICAgICAgICBpZiAoIWVsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pcy1hY3Rpb24nKSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWlzLWFjdGlvbicpICE9PSAnZmFsc2UnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsPy50YWdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAncC10YWJsZS1yb3cnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kUm93QWN0aW9uKGVsPy5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG59XG4iLCI8cC10YWJsZS1jb250YWluZXI+XG4gICAgPHAtdGFibGUtaGVhZGVyXG4gICAgICAgICpuZ0lmPVwiZW5hYmxlSGVhZGVyXCJcbiAgICAgICAgW3F1aWNrRmlsdGVyc109XCJxdWlja0ZpbHRlcnNcIlxuICAgICAgICBbYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyXT1cImFjdGl2ZVF1aWNrRmlsdGVySWRlbnRpZmllclwiXG4gICAgICAgIChxdWlja0ZpbHRlcik9XCIob25RdWlja0ZpbHRlcilcIlxuICAgICAgICBbZW5hYmxlU2VhcmNoXT1cImVuYWJsZVNlYXJjaFwiXG4gICAgICAgIFtxdWVyeV09XCJxdWVyeVwiXG4gICAgICAgIChxdWVyeUNoYW5nZSk9XCIob25RdWVyeUNoYW5nZSlcIlxuICAgICAgICBbZW5hYmxlRmlsdGVyXT1cImVuYWJsZUZpbHRlclwiXG4gICAgICAgIFtzZWxlY3RlZEZpbHRlcnNBbW91bnRdPVwic2VsZWN0ZWRGaWx0ZXJzQW1vdW50XCJcbiAgICAgICAgW2ZpbHRlckJ1dHRvblRlbXBsYXRlXT1cImZpbHRlckJ1dHRvblRlbXBsYXRlXCJcbiAgICAgICAgKGZpbHRlcik9XCJmaWx0ZXJNb2RhbFNob3ckLm5leHQodHJ1ZSlcIlxuICAgICAgICBbZW5hYmxlRWRpdF09XCJlbmFibGVFZGl0XCJcbiAgICAgICAgW2NhbkVkaXRdPVwiISFzZWxlY3RlZFJvd3MubGVuZ3RoXCJcbiAgICAgICAgW2VkaXRCdXR0b25UZW1wbGF0ZV09XCJlZGl0QnV0dG9uVGVtcGxhdGVcIlxuICAgICAgICBbZWRpdExvYWRpbmddPVwiZWRpdEJ1dHRvbkxvYWRpbmdcIlxuICAgICAgICBbZWRpdFRleHRdPVwiZWRpdEJ1dHRvblRleHRcIlxuICAgICAgICBbZWRpdEljb25dPVwiZWRpdEJ1dHRvbkljb25cIlxuICAgICAgICAoZWRpdCk9XCJlZGl0LmVtaXQoKVwiXG4gICAgICAgIFtpdGVtc1NlbGVjdGVkQW1vdW50XT1cInNlbGVjdGVkUm93cy5sZW5ndGhcIlxuICAgICAgICBbbG9hZGluZ109XCJoZWFkZXJMb2FkaW5nXCJcbiAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXJDdXN0b21GaWx0ZXJUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyQ3VzdG9tRmlsdGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3AtdGFibGUtaGVhZGVyPlxuXG4gICAgPHAtdGFibGUtcm93IHZhcmlhbnQ9XCJoZWFkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICA8cC10YWJsZS1jZWxsLW5neFxuICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbaW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjaGVja2JveF09XCJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDAgJiYgZW5hYmxlUm93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNoZWNrYm94VGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L3AtdGFibGUtY2VsbC1uZ3g+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiX3NlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiX3NlbGVjdGlvbkNvbnRhaW5zQWxsKClcIlxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJfc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9wLXRhYmxlLXJvdz5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nOyBlbHNlIGNvbnRlbnRUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPHAtdGFibGUtcm93XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHIgb2YgbG9hZGluZ1Jvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbZW5hYmxlSG92ZXJdPVwiZW5hYmxlUm93U2VsZWN0aW9uIHx8IGVuYWJsZVJvd0NsaWNrXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGUtY2VsbC1uZ3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwibG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDAgJiYgZW5hYmxlUm93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2hlY2tib3hUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICA+PC9wLXRhYmxlLWNlbGwtbmd4PlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1sb2FkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC02IHctNiByb3VuZGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3AtbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjb250ZW50VGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbXM/Lmxlbmd0aDsgZWxzZSBlbXB0eVN0YXRlVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICA8cC10YWJsZS1yb3dcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2VuYWJsZUhvdmVyXT1cImVuYWJsZVJvd1NlbGVjdGlvbiB8fCBlbmFibGVSb3dDbGlja1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfcm93Q2xpY2soJGV2ZW50LCByb3dJbmRleClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlLWNlbGwtbmd4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID09PSAwICYmIGVuYWJsZVJvd1NlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjaGVja2JveFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2wudGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcC10YWJsZS1jZWxsLW5neD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoZWNrYm94Q2hhbmdlKCRldmVudC50YXJnZXQsIHJvd0luZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiX2NoZWNrYm94RGlzYWJsZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJfc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgcm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPHAtdGFibGUtZm9vdGVyXG4gICAgICAgICpuZ0lmPVwiZW5hYmxlRm9vdGVyXCJcbiAgICAgICAgW2hpZGVPblNpbmdsZVBhZ2VdPVwiaGlkZU9uU2luZ2xlUGFnZVwiXG4gICAgICAgIFtlbmFibGVQYWdlU2l6ZV09XCJlbmFibGVQYWdlU2l6ZVwiXG4gICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIihwYWdlU2l6ZUNoYW5nZSlcIlxuICAgICAgICBbZW5hYmxlUGFnaW5hdGlvbl09XCJlbmFibGVQYWdpbmF0aW9uXCJcbiAgICAgICAgW3BhZ2VdPVwicGFnZVwiXG4gICAgICAgIFt0b3RhbF09XCJ0b3RhbFwiXG4gICAgICAgIChwYWdlQ2hhbmdlKT1cIihwYWdlQ2hhbmdlKVwiXG4gICAgICAgIFtlbmFibGVFeHBvcnRdPVwiZW5hYmxlRXhwb3J0XCJcbiAgICAgICAgKGV4cG9ydCk9XCJleHBvcnQuZW1pdCgpXCJcbiAgICAgICAgW2xvYWRpbmddPVwiZm9vdGVyTG9hZGluZ1wiXG4gICAgPjwvcC10YWJsZS1mb290ZXI+XG48L3AtdGFibGUtY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyTW9kYWxUZW1wbGF0ZVwiPlxuICAgIDxwLW1vZGFsXG4gICAgICAgIFtoZWFkZXJdPVwiZmlsdGVyTW9kYWxIZWFkZXJUZXh0XCJcbiAgICAgICAgW3Nob3ddPVwiZmlsdGVyTW9kYWxTaG93JCB8IGFzeW5jXCJcbiAgICAgICAgKGNsb3NlZCk9XCJmaWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpXCJcbiAgICA+XG4gICAgICAgIDxkaXYgc2xvdD1cImNvbnRlbnRcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTZcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlck1vZGFsVGVtcGxhdGVcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzbG90PVwiZm9vdGVyXCIgY2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyTW9kYWxTaG93UmVzZXRNb2JpbGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgdGFibGV0OnctYXV0byBkZXNrdG9wLXhzOmhpZGRlblwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFJlc2V0KHRydWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBmaWx0ZXJNb2RhbFJlc2V0VGV4dCB9fVxuICAgICAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyTW9kYWxTaG93UmVzZXRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuIHctZnVsbCB0YWJsZXQ6dy1hdXRvIGRlc2t0b3AteHM6ZmxleFwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFJlc2V0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGZpbHRlck1vZGFsUmVzZXRUZXh0IH19XG4gICAgICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtbC1hdXRvIHctZnVsbCB0YWJsZXQ6dy1hdXRvXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiY2hlY2ttYXJrXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkZpbHRlck1vZGFsU2F2ZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBmaWx0ZXJNb2RhbFNhdmVUZXh0IH19XG4gICAgICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3AtbW9kYWw+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVN0YXRlVGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgICAqbmdJZj1cImVtcHR5U3RhdGVUeXBlID09PSAnZmlsdGVyZWQnOyBlbHNlIGVtcHR5U3RhdGVOb25GaWx0ZXJUZW1wbGF0ZVwiXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICBmbGV4XG4gICAgICAgICAgICBtYXgtdy1bMjByZW1dXG4gICAgICAgICAgICBmbGV4LWNvbFxuICAgICAgICAgICAgaXRlbXMtY2VudGVyXG4gICAgICAgICAgICBzZWxmLWNlbnRlclxuICAgICAgICAgICAgcHktMjRcbiAgICAgICAgICAgIHRleHQtY2VudGVyXG4gICAgICAgIFwiXG4gICAgPlxuICAgICAgICA8cC1pbGx1c3RyYXRpb25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cImVtcHR5U3RhdGVGaWx0ZXJlZElsbHVzdHJhdGlvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1iLTZcIlxuICAgICAgICA+PC9wLWlsbHVzdHJhdGlvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXN0b3JtLWRlZmF1bHQgZm9udC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUZpbHRlcmVkSGVhZGVyIH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJtYi0xNCB0ZXh0LXNtIHRleHQtc3Rvcm0tbWVkaXVtXCI+XG4gICAgICAgICAgICB7eyBlbXB0eVN0YXRlRmlsdGVyZWRDb250ZW50IH19XG4gICAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTdGF0ZU5vbkZpbHRlclRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgIGZsZXhcbiAgICAgICAgICAgIG1heC13LVsyMHJlbV1cbiAgICAgICAgICAgIGZsZXgtY29sXG4gICAgICAgICAgICBpdGVtcy1jZW50ZXJcbiAgICAgICAgICAgIHNlbGYtY2VudGVyXG4gICAgICAgICAgICBweS0yNFxuICAgICAgICAgICAgdGV4dC1jZW50ZXJcbiAgICAgICAgXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cImVuYWJsZUVtcHR5U3RhdGVBY3Rpb25cIlxuICAgICAgICAoY2xpY2spPVwiZW1wdHlTdGF0ZUNsaWNrZWQoKVwiXG4gICAgPlxuICAgICAgICA8cC1pbGx1c3RyYXRpb25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cImVtcHR5U3RhdGVJbGx1c3RyYXRpb25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi02XCJcbiAgICAgICAgPjwvcC1pbGx1c3RyYXRpb24+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1zdG9ybS1kZWZhdWx0IGZvbnQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVIZWFkZXIgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cIm1iLTYgdGV4dC1zbSB0ZXh0LXN0b3JtLW1lZGl1bVwiPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUNvbnRlbnQgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlRW1wdHlTdGF0ZUFjdGlvblwiXG4gICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIGljb249XCJwbHVzXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVBY3Rpb24gfX1cbiAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|