tuain-ng-forms-lib 15.2.12 → 17.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/classes/forms/action.mjs +104 -0
- package/esm2022/lib/classes/forms/element.mjs +23 -0
- package/esm2022/lib/classes/forms/field.mjs +468 -0
- package/esm2022/lib/classes/forms/form.mjs +581 -0
- package/esm2022/lib/classes/forms/piece-propagate.mjs +39 -0
- package/esm2022/lib/classes/forms/piece.mjs +126 -0
- package/esm2022/lib/classes/forms/section.mjs +151 -0
- package/esm2022/lib/classes/forms/subsection.mjs +99 -0
- package/esm2022/lib/classes/forms/table/action.mjs +38 -0
- package/esm2022/lib/classes/forms/table/column.mjs +74 -0
- package/esm2022/lib/classes/forms/table/row-data.mjs +116 -0
- package/esm2022/lib/classes/forms/table/table.mjs +523 -0
- package/esm2022/lib/components/elements/action.component.mjs +62 -0
- package/esm2022/lib/components/elements/field.component.mjs +99 -0
- package/esm2022/lib/components/elements/layout/element.component.mjs +21 -0
- package/esm2022/lib/components/elements/layout/form-error.component.mjs +23 -0
- package/esm2022/lib/components/elements/layout/form-header.component.mjs +23 -0
- package/esm2022/lib/components/elements/layout/piece.component.mjs +64 -0
- package/esm2022/lib/components/elements/layout/section.component.mjs +48 -0
- package/esm2022/lib/components/elements/layout/sub-section.component.mjs +48 -0
- package/esm2022/lib/components/elements/tables/table-record-action.component.mjs +72 -0
- package/esm2022/lib/components/elements/tables/table-record-field.component.mjs +31 -0
- package/esm2022/lib/components/elements/tables/table.component.mjs +98 -0
- package/esm2022/lib/components/forms/basic-form.mjs +1314 -0
- package/esm2022/lib/services/event-manager.service.mjs +43 -0
- package/esm2022/lib/services/form-manager.service.mjs +81 -0
- package/{esm2020 → esm2022}/lib/tuain-ng-forms-lib.module.mjs +29 -29
- package/{fesm2020 → fesm2022}/tuain-ng-forms-lib.mjs +832 -603
- package/fesm2022/tuain-ng-forms-lib.mjs.map +1 -0
- package/lib/classes/forms/action.d.ts +30 -14
- package/lib/classes/forms/field.d.ts +9 -4
- package/lib/classes/forms/section.d.ts +18 -6
- package/lib/classes/forms/subsection.d.ts +28 -10
- package/lib/classes/forms/table/table.d.ts +63 -21
- package/lib/components/elements/action.component.d.ts +9 -2
- package/lib/components/elements/field.component.d.ts +22 -16
- package/lib/components/elements/layout/element.component.d.ts +1 -1
- package/lib/components/elements/layout/form-error.component.d.ts +1 -1
- package/lib/components/elements/layout/form-header.component.d.ts +1 -1
- package/lib/components/elements/layout/piece.component.d.ts +9 -5
- package/lib/components/elements/layout/section.component.d.ts +2 -1
- package/lib/components/elements/layout/sub-section.component.d.ts +2 -1
- package/lib/components/elements/tables/table-record-action.component.d.ts +2 -1
- package/lib/components/elements/tables/table-record-field.component.d.ts +1 -1
- package/lib/components/elements/tables/table.component.d.ts +12 -5
- package/lib/components/forms/basic-form.d.ts +1 -1
- package/package.json +7 -13
- package/esm2020/lib/classes/forms/action.mjs +0 -72
- package/esm2020/lib/classes/forms/element.mjs +0 -18
- package/esm2020/lib/classes/forms/field.mjs +0 -454
- package/esm2020/lib/classes/forms/form.mjs +0 -574
- package/esm2020/lib/classes/forms/piece-propagate.mjs +0 -38
- package/esm2020/lib/classes/forms/piece.mjs +0 -123
- package/esm2020/lib/classes/forms/section.mjs +0 -138
- package/esm2020/lib/classes/forms/subsection.mjs +0 -81
- package/esm2020/lib/classes/forms/table/action.mjs +0 -30
- package/esm2020/lib/classes/forms/table/column.mjs +0 -74
- package/esm2020/lib/classes/forms/table/row-data.mjs +0 -116
- package/esm2020/lib/classes/forms/table/table.mjs +0 -464
- package/esm2020/lib/components/elements/action.component.mjs +0 -55
- package/esm2020/lib/components/elements/field.component.mjs +0 -99
- package/esm2020/lib/components/elements/layout/element.component.mjs +0 -20
- package/esm2020/lib/components/elements/layout/form-error.component.mjs +0 -20
- package/esm2020/lib/components/elements/layout/form-header.component.mjs +0 -24
- package/esm2020/lib/components/elements/layout/piece.component.mjs +0 -40
- package/esm2020/lib/components/elements/layout/section.component.mjs +0 -39
- package/esm2020/lib/components/elements/layout/sub-section.component.mjs +0 -39
- package/esm2020/lib/components/elements/tables/table-record-action.component.mjs +0 -67
- package/esm2020/lib/components/elements/tables/table-record-field.component.mjs +0 -30
- package/esm2020/lib/components/elements/tables/table.component.mjs +0 -92
- package/esm2020/lib/components/forms/basic-form.mjs +0 -1310
- package/esm2020/lib/services/event-manager.service.mjs +0 -43
- package/esm2020/lib/services/form-manager.service.mjs +0 -80
- package/fesm2015/tuain-ng-forms-lib.mjs +0 -4305
- package/fesm2015/tuain-ng-forms-lib.mjs.map +0 -1
- package/fesm2020/tuain-ng-forms-lib.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/classes/forms/form.constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/file-manager.service.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/tuain-ng-forms-lib.mjs +0 -0
- /package/{tuain-ng-forms-lib.d.ts → index.d.ts} +0 -0
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { elementTypes } from '../form.constants';
|
|
3
|
+
import { FormElement } from '../element';
|
|
4
|
+
import { RecordTableColumn } from './column';
|
|
5
|
+
import { TableAction } from './action';
|
|
6
|
+
import { TableRecordData } from './row-data';
|
|
7
|
+
const TABLE_SORT_ASCENDING = 'asc';
|
|
8
|
+
const TABLE_SORT_DESCENDING = 'desc';
|
|
9
|
+
const attrs = {
|
|
10
|
+
allSelected: { name: 'allSelected', propagate: 'allSelected' },
|
|
11
|
+
tableCode: { name: 'tableCode', propagate: 'code' },
|
|
12
|
+
clientPaging: { name: 'clientPaging', propagate: null },
|
|
13
|
+
globalSearch: { name: 'globalSearch', propagate: 'globalSearch' },
|
|
14
|
+
globalFilterString: { name: 'globalFilterString', propagate: 'globalFilterString' },
|
|
15
|
+
sorting: { name: 'sorting', propagate: null },
|
|
16
|
+
recordsPerPage: { name: 'recordsPerPage', propagate: 'recordsPerPage' },
|
|
17
|
+
layout: { name: 'layout', propagate: 'layout' },
|
|
18
|
+
columns: { name: 'columns', propagate: 'columns' },
|
|
19
|
+
selectedRecords: { name: 'selectedRecords', propagate: 'selectedRecords' },
|
|
20
|
+
currentPage: { name: 'currentPage', propagate: 'currentPage' },
|
|
21
|
+
totalRecordsNumber: { name: 'totalRecordsNumber', propagate: 'totalRecordsNumber' },
|
|
22
|
+
visibleRecords: { name: 'visibleRecords', propagate: 'visibleRecords' },
|
|
23
|
+
};
|
|
24
|
+
export class RecordTable extends FormElement {
|
|
25
|
+
_inlineActionTrigger = new Subject();
|
|
26
|
+
_globalActionTrigger = new Subject();
|
|
27
|
+
_recordSelectionTrigger = new Subject();
|
|
28
|
+
_selectionActionTrigger = new Subject();
|
|
29
|
+
_getDataTrigger = new Subject();
|
|
30
|
+
_tableColumnObj = {};
|
|
31
|
+
_appendPages;
|
|
32
|
+
_actions;
|
|
33
|
+
_actionsObj = {};
|
|
34
|
+
// Mecanismos de filtrado nueva versión
|
|
35
|
+
globalFilterString = '';
|
|
36
|
+
globalFilterStrings = [];
|
|
37
|
+
selectedRecords;
|
|
38
|
+
restrictedId;
|
|
39
|
+
layout = null;
|
|
40
|
+
_globalSearch;
|
|
41
|
+
_tableRecords;
|
|
42
|
+
_tableRecordObj = {};
|
|
43
|
+
_visibleRecords = null;
|
|
44
|
+
_columns;
|
|
45
|
+
_selectable;
|
|
46
|
+
_selectionBackend;
|
|
47
|
+
_selectionField;
|
|
48
|
+
_allSelected = false;
|
|
49
|
+
_tableCode = '';
|
|
50
|
+
_tableTitle;
|
|
51
|
+
_currentPage;
|
|
52
|
+
_totalPages;
|
|
53
|
+
_requestedPage;
|
|
54
|
+
_recordsPerPage = 10;
|
|
55
|
+
_totalRecordsNumber = 0;
|
|
56
|
+
_recordsNumber = 0;
|
|
57
|
+
_sorting;
|
|
58
|
+
_waiting;
|
|
59
|
+
_clientPaging = true;
|
|
60
|
+
_sortable;
|
|
61
|
+
constructor(tableReceived, formConfig) {
|
|
62
|
+
super(tableReceived, formConfig);
|
|
63
|
+
this.propagationCustomAttributes = this._formConfig?.propagationCustomAttributes?.tables ?? [];
|
|
64
|
+
this.elementType = elementTypes.table;
|
|
65
|
+
this._waiting = false;
|
|
66
|
+
this._currentPage = 1;
|
|
67
|
+
this._totalPages = 1;
|
|
68
|
+
this._requestedPage = 1;
|
|
69
|
+
this._columns = [];
|
|
70
|
+
this._tableColumnObj = {};
|
|
71
|
+
this._actions = [];
|
|
72
|
+
this._actionsObj = {};
|
|
73
|
+
this._tableRecords = [];
|
|
74
|
+
this._globalSearch = false;
|
|
75
|
+
this.restrictedId = null;
|
|
76
|
+
this._tableTitle = tableReceived.tableTitle;
|
|
77
|
+
this._appendPages = tableReceived?.append ?? false;
|
|
78
|
+
this._selectable = tableReceived?.selectable ?? false;
|
|
79
|
+
this._selectionBackend = tableReceived?.selectionBackend ?? false;
|
|
80
|
+
this._sortable = tableReceived?.sortable ?? false;
|
|
81
|
+
this.setAttr(attrs.allSelected, false);
|
|
82
|
+
this.setAttr(attrs.tableCode, tableReceived.tableCode);
|
|
83
|
+
this.setAttr(attrs.clientPaging, tableReceived?.clientPaging ?? true);
|
|
84
|
+
this.setAttr(attrs.globalSearch, tableReceived?.simpleFilter ?? false);
|
|
85
|
+
this.setAttr(attrs.globalFilterString, '');
|
|
86
|
+
this.setAttr(attrs.sorting, { columnName: '', direction: '' });
|
|
87
|
+
this.setAttr(attrs.recordsPerPage, formConfig.defaultRecordsPerPage);
|
|
88
|
+
this.setAttr(attrs.layout, '');
|
|
89
|
+
if (tableReceived.fields) {
|
|
90
|
+
const columns = [];
|
|
91
|
+
for (const columnReceived of tableReceived.fields) {
|
|
92
|
+
const columnEnriched = {
|
|
93
|
+
...columnReceived,
|
|
94
|
+
visibleStates: this.visibleStates,
|
|
95
|
+
enabledStates: this.enabledStates
|
|
96
|
+
};
|
|
97
|
+
const columnDefinition = new RecordTableColumn(columnEnriched, this._formConfig);
|
|
98
|
+
columns.push(columnDefinition);
|
|
99
|
+
this._tableColumnObj[columnDefinition.fieldCode] = columnDefinition;
|
|
100
|
+
}
|
|
101
|
+
this.setAttr(attrs.columns, columns);
|
|
102
|
+
}
|
|
103
|
+
if (tableReceived.actions) {
|
|
104
|
+
const tableActions = tableReceived.actions.map(objDef => {
|
|
105
|
+
let visibleStates = objDef.visibleStates;
|
|
106
|
+
let enabledStates = objDef.enabledStates;
|
|
107
|
+
if (!visibleStates) {
|
|
108
|
+
visibleStates = (objDef.actionModes || '').split(',')
|
|
109
|
+
.map(state => state.trim())
|
|
110
|
+
.filter(state => state.length > 0);
|
|
111
|
+
enabledStates = (objDef.actionModes || '').split(',')
|
|
112
|
+
.map(state => state.trim())
|
|
113
|
+
.filter(state => state.length > 0);
|
|
114
|
+
}
|
|
115
|
+
return { ...objDef, visibleStates, enabledStates };
|
|
116
|
+
});
|
|
117
|
+
for (const actionReceived of tableActions) {
|
|
118
|
+
const inlineAction = new TableAction(actionReceived, this._formConfig);
|
|
119
|
+
this._actions.push(inlineAction);
|
|
120
|
+
this._actionsObj[inlineAction.actionCode] = inlineAction;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
this._selectionField = (this._selectable) ? tableReceived?.selectionField : null;
|
|
124
|
+
// Filtros predefinidos en el formulario
|
|
125
|
+
if (tableReceived.filters) {
|
|
126
|
+
for (let index = 0; index < tableReceived.filters.length; index++) {
|
|
127
|
+
this.addFilterDefinition(tableReceived.filters[index].fieldCode, tableReceived.filters[index]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
get columnNames() { return Object.keys(this._tableColumnObj); }
|
|
132
|
+
get inlineActionTrigger() { return this._inlineActionTrigger; }
|
|
133
|
+
get globalActionTrigger() { return this._globalActionTrigger; }
|
|
134
|
+
get selectionActionTrigger() { return this._selectionActionTrigger; }
|
|
135
|
+
get recordSelectionTrigger() { return this._recordSelectionTrigger; }
|
|
136
|
+
get getDataTrigger() { return this._getDataTrigger; }
|
|
137
|
+
get globalSearch() { return this._globalSearch; }
|
|
138
|
+
get tableRecords() { return this._tableRecords; }
|
|
139
|
+
get tableRecordObj() { return this._tableRecordObj; }
|
|
140
|
+
get visibleRecords() { return this._visibleRecords; }
|
|
141
|
+
get columns() { return this._columns; }
|
|
142
|
+
get selectable() { return this._selectable; }
|
|
143
|
+
get selectionBackend() { return this._selectionBackend; }
|
|
144
|
+
get selectionField() { return this._selectionField; }
|
|
145
|
+
get allSelected() { return this._allSelected; }
|
|
146
|
+
get tableCode() { return this._tableCode; }
|
|
147
|
+
get tableTitle() { return this._tableTitle; }
|
|
148
|
+
get currentPage() { return this._currentPage; }
|
|
149
|
+
get totalPages() { return this._totalPages; }
|
|
150
|
+
get requestedPage() { return this._requestedPage; }
|
|
151
|
+
get recordsPerPage() { return this._recordsPerPage; }
|
|
152
|
+
get totalRecordsNumber() { return this._totalRecordsNumber; }
|
|
153
|
+
get recordsNumber() { return this._recordsNumber; }
|
|
154
|
+
get sorting() { return this._sorting; }
|
|
155
|
+
get waiting() { return this._waiting; }
|
|
156
|
+
get clientPaging() { return this._clientPaging; }
|
|
157
|
+
get sortable() { return this._sortable; }
|
|
158
|
+
set globalSearch(globalSearch) { this._globalSearch = globalSearch; }
|
|
159
|
+
set tableRecords(tableRecords) { this._tableRecords = tableRecords; }
|
|
160
|
+
set tableRecordObj(tableRecordObj) { this._tableRecordObj = tableRecordObj; }
|
|
161
|
+
set visibleRecords(visibleRecords) { this._visibleRecords = visibleRecords; }
|
|
162
|
+
set columns(columns) { this._columns = columns; }
|
|
163
|
+
set selectable(selectable) { this._selectable = selectable; }
|
|
164
|
+
set selectionBackend(selectionBackend) { this._selectionBackend = selectionBackend; }
|
|
165
|
+
set selectionField(selectionField) { this._selectionField = selectionField; }
|
|
166
|
+
set allSelected(allSelected) { this._allSelected = allSelected; }
|
|
167
|
+
set tableCode(tableCode) { this._tableCode = tableCode; }
|
|
168
|
+
set tableTitle(tableTitle) { this._tableTitle = tableTitle; }
|
|
169
|
+
set currentPage(currentPage) { this._currentPage = currentPage; }
|
|
170
|
+
set totalPages(totalPages) { this._totalPages = totalPages; }
|
|
171
|
+
set requestedPage(requestedPage) { this._requestedPage = requestedPage; }
|
|
172
|
+
set recordsPerPage(recordsPerPage) { this._recordsPerPage = recordsPerPage; }
|
|
173
|
+
set totalRecordsNumber(totalRecordsNumber) { this._totalRecordsNumber = totalRecordsNumber; }
|
|
174
|
+
set recordsNumber(recordsNumber) { this._recordsNumber = recordsNumber; }
|
|
175
|
+
set sorting(sorting) { this._sorting = sorting; }
|
|
176
|
+
set waiting(waiting) { this._waiting = waiting; }
|
|
177
|
+
set clientPaging(clientPaging) { this._clientPaging = clientPaging; }
|
|
178
|
+
set sortable(sortable) { this._sortable = sortable; }
|
|
179
|
+
getLayout() { return this.layout; }
|
|
180
|
+
setLayout(layout) { this.setAttr(attrs.layout, layout); }
|
|
181
|
+
hasActions() { return (this._actions.length > 0); }
|
|
182
|
+
getSelectedRecords() { return this._tableRecords.filter(rec => rec.selected).map(rec => rec.recordId); }
|
|
183
|
+
activateGlobalSearch() { this._globalSearch = true; }
|
|
184
|
+
inactivateGlobalSearch() { this._globalSearch = false; }
|
|
185
|
+
columnDefinition(fieldCode) { return this._tableColumnObj[fieldCode]; }
|
|
186
|
+
putOnWait() { this._waiting = true; }
|
|
187
|
+
freeWaiting() { this._waiting = false; }
|
|
188
|
+
setWidget(widget) { this.widget = widget; }
|
|
189
|
+
notifyGlobalAction(actionCode) {
|
|
190
|
+
const tableEvent = {
|
|
191
|
+
tableCode: this._tableCode,
|
|
192
|
+
actionCode,
|
|
193
|
+
actionDetail: null
|
|
194
|
+
};
|
|
195
|
+
this._globalActionTrigger.next(tableEvent);
|
|
196
|
+
}
|
|
197
|
+
notifyInlineAction(tableActionEvent) {
|
|
198
|
+
const tableEvent = {
|
|
199
|
+
tableCode: this._tableCode,
|
|
200
|
+
actionCode: tableActionEvent.actionCode,
|
|
201
|
+
actionDetail: {
|
|
202
|
+
recordId: tableActionEvent.recordId,
|
|
203
|
+
recordData: tableActionEvent.recordData
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
this._inlineActionTrigger.next(tableEvent);
|
|
207
|
+
}
|
|
208
|
+
notifyRecordSelection(recordId) {
|
|
209
|
+
const record = this.getTableRecord(recordId);
|
|
210
|
+
if (!record) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
record.toggleSelect();
|
|
214
|
+
this._requestedPage = this._currentPage ?? 1;
|
|
215
|
+
const tableEvent = {
|
|
216
|
+
tableCode: this._tableCode,
|
|
217
|
+
actionCode: null,
|
|
218
|
+
actionDetail: {
|
|
219
|
+
recordId: record.recordId,
|
|
220
|
+
recordData: record.recordData
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
this.recordSelectionTrigger.next(tableEvent);
|
|
224
|
+
}
|
|
225
|
+
notifySelectionAction(actionCode) {
|
|
226
|
+
const tableEvent = {
|
|
227
|
+
tableCode: this._tableCode,
|
|
228
|
+
actionCode,
|
|
229
|
+
actionDetail: {
|
|
230
|
+
selectedRecords: this.selectedRecords
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
this._selectionActionTrigger.next(tableEvent);
|
|
234
|
+
}
|
|
235
|
+
notifyGetDataAction(requestedPage = null) {
|
|
236
|
+
this.updateVisibleRecords();
|
|
237
|
+
this._requestedPage = requestedPage || this._currentPage || 1;
|
|
238
|
+
const tableEvent = {
|
|
239
|
+
tableCode: this._tableCode,
|
|
240
|
+
actionCode: null,
|
|
241
|
+
actionDetail: null,
|
|
242
|
+
};
|
|
243
|
+
this._getDataTrigger.next(tableEvent);
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
clean() {
|
|
247
|
+
this._tableRecords = [];
|
|
248
|
+
this.unSelectAll();
|
|
249
|
+
this._tableRecordObj = {};
|
|
250
|
+
this.updateVisibleRecords();
|
|
251
|
+
}
|
|
252
|
+
selectAll() {
|
|
253
|
+
this.setAttr(attrs.allSelected, true);
|
|
254
|
+
this._tableRecords.forEach(record => record.select());
|
|
255
|
+
this.setAttr(attrs.selectedRecords, this.getSelectedRecords());
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
unSelectAll() {
|
|
259
|
+
this.setAttr(attrs.allSelected, false);
|
|
260
|
+
this._tableRecords.forEach(record => record.unselect());
|
|
261
|
+
this.setAttr(attrs.selectedRecords, this.getSelectedRecords());
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
setTableRecords(tableRecords, append) {
|
|
265
|
+
if (!append) {
|
|
266
|
+
this._tableRecords = [];
|
|
267
|
+
this.setAttr(attrs.allSelected, false);
|
|
268
|
+
this._tableRecords.forEach(record => record.unselect());
|
|
269
|
+
this.setAttr(attrs.selectedRecords, []);
|
|
270
|
+
this._tableRecordObj = {};
|
|
271
|
+
}
|
|
272
|
+
const newRecordsObj = { ...this._tableRecordObj };
|
|
273
|
+
const newRecords = [...this._tableRecords];
|
|
274
|
+
for (const tableRecord of tableRecords) {
|
|
275
|
+
const recordReceived = new TableRecordData(tableRecord, this._columns, this._selectionField);
|
|
276
|
+
const recordIdKey = recordReceived.recordIdKey;
|
|
277
|
+
newRecords.push(recordReceived);
|
|
278
|
+
newRecordsObj[recordIdKey] = recordReceived;
|
|
279
|
+
}
|
|
280
|
+
this._tableRecords = newRecords;
|
|
281
|
+
this.setAttr(attrs.selectedRecords, this.getSelectedRecords());
|
|
282
|
+
this._tableRecordObj = newRecordsObj;
|
|
283
|
+
this.updateVisibleRecords();
|
|
284
|
+
}
|
|
285
|
+
appendRecords(records) { this.setTableRecords(records, true); }
|
|
286
|
+
replaceRecords(records) { this.setTableRecords(records, false); }
|
|
287
|
+
setTableAppend(append) { this._appendPages = append; }
|
|
288
|
+
changePage(requestedPage) {
|
|
289
|
+
if (this._clientPaging) {
|
|
290
|
+
this.setAttr(attrs.currentPage, requestedPage);
|
|
291
|
+
this.updateVisibleRecords();
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
this.notifyGetDataAction(requestedPage);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
updateVisibleRecords() {
|
|
298
|
+
let visibleRecords;
|
|
299
|
+
if (this._clientPaging) {
|
|
300
|
+
let filteredRecords = this.getFilteredRecords();
|
|
301
|
+
this.setAttr(attrs.totalRecordsNumber, filteredRecords.length);
|
|
302
|
+
const sliceNumber1 = (this._currentPage - 1) * this._recordsPerPage;
|
|
303
|
+
const sliceNumber2 = (this._currentPage - 1) * this._recordsPerPage + this._recordsPerPage;
|
|
304
|
+
visibleRecords = filteredRecords.slice(sliceNumber1, sliceNumber2);
|
|
305
|
+
const recordsLastPage = this._totalRecordsNumber % this._recordsPerPage;
|
|
306
|
+
const totalPages = Math.trunc(this._totalRecordsNumber / this._recordsPerPage + (recordsLastPage ? 1 : 0));
|
|
307
|
+
if (this._currentPage > totalPages) {
|
|
308
|
+
this._currentPage = totalPages || 1;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
visibleRecords = this._tableRecords;
|
|
313
|
+
}
|
|
314
|
+
this.setAttr(attrs.visibleRecords, visibleRecords);
|
|
315
|
+
}
|
|
316
|
+
updateFromServer(tableReceived) {
|
|
317
|
+
this._requestedPage = 1;
|
|
318
|
+
const { visible = true, totalPages = 1, recordsNumber, currentPage = 1, recordsPerPage, totalRecordsNumber, sortingColumn, sortingDirection, tableRecords, actions, fields, } = tableReceived;
|
|
319
|
+
this.visible = visible;
|
|
320
|
+
if (actions) {
|
|
321
|
+
Object.keys(actions).forEach(actionCode => {
|
|
322
|
+
const tblAction = this.getAction(actionCode);
|
|
323
|
+
const actionReceived = actions[actionCode];
|
|
324
|
+
if (actionReceived.visible === true || actionReceived.visible === false) {
|
|
325
|
+
(actionReceived.visible === true) && tblAction.show();
|
|
326
|
+
(actionReceived.visible === false) && tblAction.hide();
|
|
327
|
+
}
|
|
328
|
+
if (actionReceived.enabled === true || actionReceived.enabled === false) {
|
|
329
|
+
(actionReceived.enabled === true) && tblAction.enable();
|
|
330
|
+
(actionReceived.enabled === false) && tblAction.disable();
|
|
331
|
+
}
|
|
332
|
+
if (actionReceived.showOnStates) {
|
|
333
|
+
actionReceived.showOnStates?.forEach(newState => {
|
|
334
|
+
tblAction.addVisibleState(newState);
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
if (actionReceived.hideOnStates) {
|
|
338
|
+
actionReceived.hideOnStates?.forEach(newState => {
|
|
339
|
+
tblAction.removeVisibleState(newState);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
if (actionReceived.enableOnStates) {
|
|
343
|
+
actionReceived.enableOnStates?.forEach(newState => {
|
|
344
|
+
tblAction.addEnabledState(newState);
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
if (actionReceived.disableOnStates) {
|
|
348
|
+
actionReceived.disableOnStates?.forEach(newState => {
|
|
349
|
+
tblAction.removeEnabledState(newState);
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
if (fields) {
|
|
355
|
+
Object.keys(fields).forEach(fieldCode => {
|
|
356
|
+
const tblField = this.columnDefinition(fieldCode);
|
|
357
|
+
const fieldReceived = fields[fieldCode];
|
|
358
|
+
if (fieldReceived.visible === true || fieldReceived.visible === false) {
|
|
359
|
+
(fieldReceived.visible === true) && tblField.show();
|
|
360
|
+
(fieldReceived.visible === false) && tblField.hide();
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
if (tableRecords) {
|
|
365
|
+
this._totalPages = totalPages;
|
|
366
|
+
this._recordsNumber = recordsNumber;
|
|
367
|
+
this.setAttr(attrs.currentPage, +currentPage);
|
|
368
|
+
this.setAttr(attrs.recordsPerPage, +recordsPerPage);
|
|
369
|
+
this.setAttr(attrs.totalRecordsNumber, (this._clientPaging) ? tableRecords.length : +totalRecordsNumber);
|
|
370
|
+
this.setAttr(attrs.sorting, {
|
|
371
|
+
columnName: sortingColumn || '',
|
|
372
|
+
direction: sortingDirection || ''
|
|
373
|
+
});
|
|
374
|
+
if (!this._appendPages) {
|
|
375
|
+
this.replaceRecords(tableRecords);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
this.appendRecords(tableRecords);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
this._waiting = false;
|
|
382
|
+
this.updateVisibleRecords();
|
|
383
|
+
}
|
|
384
|
+
getTableRecord(recordId) {
|
|
385
|
+
const recordIdKey = (typeof recordId === 'object') ? JSON.stringify(recordId) : recordId;
|
|
386
|
+
return (this._tableRecordObj && recordId && this._tableRecordObj[recordId])
|
|
387
|
+
? this._tableRecordObj[recordId] : null;
|
|
388
|
+
}
|
|
389
|
+
getAction(actionCode) {
|
|
390
|
+
return (this._actionsObj && actionCode && this._actionsObj[actionCode])
|
|
391
|
+
? this._actionsObj[actionCode] : null;
|
|
392
|
+
}
|
|
393
|
+
getActions(actionClass = this._formConfig.tableActions.inline, actionTypes = null) {
|
|
394
|
+
return this._actions.filter(actionDef => {
|
|
395
|
+
const typeIncluded = (actionTypes) ? actionTypes.includes(actionDef.actionType) : true;
|
|
396
|
+
return actionDef.actionClass === actionClass && typeIncluded;
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
// Filtros
|
|
400
|
+
setFilterById(id) {
|
|
401
|
+
if (this.restrictedId === id) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
this.restrictedId = id;
|
|
405
|
+
this.updateVisibleRecords();
|
|
406
|
+
}
|
|
407
|
+
cleanIdFilter() {
|
|
408
|
+
if (this.restrictedId === null) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
this.restrictedId = null;
|
|
412
|
+
this.updateVisibleRecords();
|
|
413
|
+
}
|
|
414
|
+
setGlobalFilterString(text, notifyComponent = true) {
|
|
415
|
+
this.globalFilterStrings = text.split(' ').filter(t => t && t.trim().length > 0).map(t => t.trim()) ?? [];
|
|
416
|
+
if (this._clientPaging) {
|
|
417
|
+
this.changePage(1);
|
|
418
|
+
}
|
|
419
|
+
if (notifyComponent) {
|
|
420
|
+
this.setAttr(attrs.globalFilterString, text.trim());
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
addFilterDefinition(columnName, filterDefinition) {
|
|
424
|
+
const tableColumn = this.columnDefinition(columnName);
|
|
425
|
+
tableColumn && tableColumn.addFilterDefinition(filterDefinition);
|
|
426
|
+
}
|
|
427
|
+
getFilteredRecords() {
|
|
428
|
+
let filteredRecords = this._tableRecords;
|
|
429
|
+
if (this.restrictedId) {
|
|
430
|
+
filteredRecords = filteredRecords.filter(record => record.recordId === this.restrictedId);
|
|
431
|
+
}
|
|
432
|
+
if (this.globalFilterStrings.length > 0) {
|
|
433
|
+
filteredRecords = filteredRecords.filter(record => record.hasPattern(this.globalFilterStrings, this._tableColumnObj));
|
|
434
|
+
}
|
|
435
|
+
const columnFilters = this._columns.filter(column => column.filter).map(column => column.filter);
|
|
436
|
+
if (columnFilters.length > 0) {
|
|
437
|
+
filteredRecords = filteredRecords.filter(record => record.hasCondition(columnFilters));
|
|
438
|
+
}
|
|
439
|
+
return filteredRecords;
|
|
440
|
+
}
|
|
441
|
+
getColumnFilter(columnName) {
|
|
442
|
+
const tableColumn = this.columnDefinition(columnName);
|
|
443
|
+
return tableColumn?.filter ?? null;
|
|
444
|
+
}
|
|
445
|
+
addColumnFilter(columnName, columnValues, operator = null) {
|
|
446
|
+
const tableColumn = this.columnDefinition(columnName);
|
|
447
|
+
const columnFilterDefinition = tableColumn?.filterDefinition ?? null;
|
|
448
|
+
if (!columnFilterDefinition) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
tableColumn && tableColumn.addFilter(columnValues, operator);
|
|
452
|
+
this.updateVisibleRecords();
|
|
453
|
+
}
|
|
454
|
+
removeColumnFilter(columnName) {
|
|
455
|
+
const tableColumn = this.columnDefinition(columnName);
|
|
456
|
+
tableColumn && tableColumn.removeFilter();
|
|
457
|
+
this.updateVisibleRecords();
|
|
458
|
+
}
|
|
459
|
+
get currentFilter() {
|
|
460
|
+
const compactFilter = {
|
|
461
|
+
simpleFilterWords: this.globalFilterStrings,
|
|
462
|
+
advancedFilter: [],
|
|
463
|
+
};
|
|
464
|
+
const columnFilters = this._columns.filter(column => column.filter).map(column => column.filter);
|
|
465
|
+
for (let index = 0; index < columnFilters.length; index++) {
|
|
466
|
+
const columnFilter = columnFilters[index];
|
|
467
|
+
compactFilter.advancedFilter.push({
|
|
468
|
+
fieldCode: columnFilter?.fieldCode,
|
|
469
|
+
operator: columnFilter?.operator,
|
|
470
|
+
fieldValue1: columnFilter?.values[0],
|
|
471
|
+
fieldValue2: columnFilter?.values[1],
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
return compactFilter;
|
|
475
|
+
}
|
|
476
|
+
// Ordenamiento de registros local
|
|
477
|
+
sort(columnName, direction) {
|
|
478
|
+
this.setRequiredOrder(columnName, direction);
|
|
479
|
+
if (this._clientPaging) {
|
|
480
|
+
this.localSortData();
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
this.notifyGetDataAction();
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
setRequiredOrder(columnField, direction = null) {
|
|
487
|
+
this.setAttr(attrs.sorting, {
|
|
488
|
+
columnName: columnField,
|
|
489
|
+
direction: (direction === 'ascend') ? TABLE_SORT_ASCENDING : TABLE_SORT_DESCENDING,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
localSortData() {
|
|
493
|
+
if (!this._sorting.columnName || !this._sorting.direction) {
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
this._tableRecords.sort((a, b) => this.recordCompare(a, b, this._sorting.columnName, this._sorting.direction));
|
|
497
|
+
//this.unSelectAll();
|
|
498
|
+
this.updateVisibleRecords();
|
|
499
|
+
}
|
|
500
|
+
recordCompare(recordA, recordB, columnCompare, direction) {
|
|
501
|
+
const recordAValue = recordA.getFieldValue(columnCompare);
|
|
502
|
+
const recordBValue = recordB.getFieldValue(columnCompare);
|
|
503
|
+
const recordAColumn = isNaN(recordAValue) ? recordAValue.toLocaleLowerCase() : +recordAValue;
|
|
504
|
+
const recordBColumn = isNaN(recordBValue) ? recordBValue.toLocaleLowerCase() : +recordBValue;
|
|
505
|
+
let result = 0;
|
|
506
|
+
if (recordAColumn < recordBColumn) {
|
|
507
|
+
result = -1;
|
|
508
|
+
}
|
|
509
|
+
else if (recordAColumn > recordBColumn) {
|
|
510
|
+
result = 1;
|
|
511
|
+
}
|
|
512
|
+
return direction === TABLE_SORT_ASCENDING ? result : -result;
|
|
513
|
+
}
|
|
514
|
+
formStateChangeCustomSubscribe(form, formChangeSubject) {
|
|
515
|
+
this._columns?.forEach(column => {
|
|
516
|
+
column?.connectWithParentForm(form, formChangeSubject);
|
|
517
|
+
});
|
|
518
|
+
this._actions?.forEach(action => {
|
|
519
|
+
action?.connectWithParentForm(form, formChangeSubject);
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWFpbi1uZy1mb3Jtcy1saWIvc3JjL2xpYi9jbGFzc2VzL2Zvcm1zL3RhYmxlL3RhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU3QyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUNuQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUVyQyxNQUFNLEtBQUssR0FBRztJQUNaLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRTtJQUM5RCxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7SUFDbkQsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0lBQ3ZELFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRTtJQUNqRSxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUU7SUFDbkYsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0lBQzdDLGNBQWMsRUFBRSxFQUFFLElB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LElBQUksYUFBYSxHQUFHLGFBQWEsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDYixDQUFDO1FBQ0QsT0FBTyxTQUFTLEtBQUssb0JBQW9CLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0QsQ0FBQztJQUVRLDhCQUE4QixDQUFDLElBQUksRUFBRSxpQkFBaUI7UUFDN0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUIsTUFBTSxFQUFFLHFCQUFxQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUIsTUFBTSxFQUFFLHFCQUFxQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZWxlbWVudFR5cGVzIH0gZnJvbSAnLi4vZm9ybS5jb25zdGFudHMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tICcuLi9lbGVtZW50JztcbmltcG9ydCB7IFJlY29yZFRhYmxlQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4nO1xuaW1wb3J0IHsgVGFibGVBY3Rpb24gfSBmcm9tICcuL2FjdGlvbic7XG5pbXBvcnQgeyBUYWJsZVJlY29yZERhdGEgfSBmcm9tICcuL3Jvdy1kYXRhJztcblxuY29uc3QgVEFCTEVfU09SVF9BU0NFTkRJTkcgPSAnYXNjJztcbmNvbnN0IFRBQkxFX1NPUlRfREVTQ0VORElORyA9ICdkZXNjJztcblxuY29uc3QgYXR0cnMgPSB7XG4gIGFsbFNlbGVjdGVkOiB7IG5hbWU6ICdhbGxTZWxlY3RlZCcsIHByb3BhZ2F0ZTogJ2FsbFNlbGVjdGVkJyB9LFxuICB0YWJsZUNvZGU6IHsgbmFtZTogJ3RhYmxlQ29kZScsIHByb3BhZ2F0ZTogJ2NvZGUnIH0sXG4gIGNsaWVudFBhZ2luZzogeyBuYW1lOiAnY2xpZW50UGFnaW5nJywgcHJvcGFnYXRlOiBudWxsIH0sXG4gIGdsb2JhbFNlYXJjaDogeyBuYW1lOiAnZ2xvYmFsU2VhcmNoJywgcHJvcGFnYXRlOiAnZ2xvYmFsU2VhcmNoJyB9LFxuICBnbG9iYWxGaWx0ZXJTdHJpbmc6IHsgbmFtZTogJ2dsb2JhbEZpbHRlclN0cmluZycsIHByb3BhZ2F0ZTogJ2dsb2JhbEZpbHRlclN0cmluZycgfSxcbiAgc29ydGluZzogeyBuYW1lOiAnc29ydGluZycsIHByb3BhZ2F0ZTogbnVsbCB9LFxuICByZWNvcmRzUGVyUGFnZTogeyBuYW1lOiAncmVjb3Jkc1BlclBhZ2UnLCBwcm9wYWdhdGU6ICdyZWNvcmRzUGVyUGFnZScgfSxcbiAgbGF5b3V0OiB7IG5hbWU6ICdsYXlvdXQnLCBwcm9wYWdhdGU6ICdsYXlvdXQnIH0sXG4gIGNvbHVtbnM6IHsgbmFtZTogJ2NvbHVtbnMnLCBwcm9wYWdhdGU6ICdjb2x1bW5zJyB9LFxuICBzZWxlY3RlZFJlY29yZHM6IHsgbmFtZTogJ3NlbGVjdGVkUmVjb3JkcycsIHByb3BhZ2F0ZTogJ3NlbGVjdGVkUmVjb3JkcycgfSxcbiAgY3VycmVudFBhZ2U6IHsgbmFtZTogJ2N1cnJlbnRQYWdlJywgcHJvcGFnYXRlOiAnY3VycmVudFBhZ2UnIH0sXG4gIHRvdGFsUmVjb3Jkc051bWJlcjogeyBuYW1lOiAndG90YWxSZWNvcmRzTnVtYmVyJywgcHJvcGFnYXRlOiAndG90YWxSZWNvcmRzTnVtYmVyJyB9LFxuICB2aXNpYmxlUmVjb3JkczogeyBuYW1lOiAndmlzaWJsZVJlY29yZHMnLCBwcm9wYWdhdGU6ICd2aXNpYmxlUmVjb3JkcycgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVBY3Rpb25FdmVudCB7XG4gIGFjdGlvbkNvZGU6IHN0cmluZztcbiAgcmVjb3JkSWQ6IGFueTtcbiAgcmVjb3JkRGF0YTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRXZlbnQge1xuICB0YWJsZUNvZGU6IHN0cmluZztcbiAgYWN0aW9uQ29kZTogc3RyaW5nIHwgbnVsbDtcbiAgYWN0aW9uRGV0YWlsOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWNvcmRUYWJsZSBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5saW5lQWN0aW9uVHJpZ2dlciA9IG5ldyBTdWJqZWN0PFRhYmxlRXZlbnQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2dsb2JhbEFjdGlvblRyaWdnZXIgPSBuZXcgU3ViamVjdDxUYWJsZUV2ZW50PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZWNvcmRTZWxlY3Rpb25UcmlnZ2VyID0gbmV3IFN1YmplY3Q8VGFibGVFdmVudD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0aW9uQWN0aW9uVHJpZ2dlciA9IG5ldyBTdWJqZWN0PFRhYmxlRXZlbnQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2dldERhdGFUcmlnZ2VyID0gbmV3IFN1YmplY3Q8VGFibGVFdmVudD4oKTtcbiAgcHJpdmF0ZSBfdGFibGVDb2x1bW5PYmogPSB7fTtcbiAgcHJpdmF0ZSBfYXBwZW5kUGFnZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgX2FjdGlvbnM6IFRhYmxlQWN0aW9uW107XG4gIHByaXZhdGUgX2FjdGlvbnNPYmogPSB7fTtcblxuICAvLyBNZWNhbmlzbW9zIGRlIGZpbHRyYWRvIG51ZXZhIHZlcnNpw7NuXG4gIHByaXZhdGUgZ2xvYmFsRmlsdGVyU3RyaW5nOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBnbG9iYWxGaWx0ZXJTdHJpbmdzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHNlbGVjdGVkUmVjb3JkczogYW55O1xuICBwcml2YXRlIHJlc3RyaWN0ZWRJZDogYW55O1xuICBwcml2YXRlIGxheW91dDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgX2dsb2JhbFNlYXJjaDogYm9vbGVhbjtcbiAgX3RhYmxlUmVjb3JkczogVGFibGVSZWNvcmREYXRhW107XG4gIF90YWJsZVJlY29yZE9iaiA9IHt9O1xuICBfdmlzaWJsZVJlY29yZHM6IFRhYmxlUmVjb3JkRGF0YVtdIHwgbnVsbCA9IG51bGw7XG4gIF9jb2x1bW5zOiBSZWNvcmRUYWJsZUNvbHVtbltdO1xuICBfc2VsZWN0YWJsZTogYm9vbGVhbjtcbiAgX3NlbGVjdGlvbkJhY2tlbmQ6IGJvb2xlYW47XG4gIF9zZWxlY3Rpb25GaWVsZDogc3RyaW5nO1xuICBfYWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgX3RhYmxlQ29kZTogc3RyaW5nID0gJyc7XG4gIF90YWJsZVRpdGxlOiBzdHJpbmc7XG4gIF9jdXJyZW50UGFnZTogbnVtYmVyO1xuICBfdG90YWxQYWdlczogbnVtYmVyO1xuICBfcmVxdWVzdGVkUGFnZTogbnVtYmVyO1xuICBfcmVjb3Jkc1BlclBhZ2U6IG51bWJlciA9IDEwO1xuICBfdG90YWxSZWNvcmRzTnVtYmVyOiBudW1iZXIgPSAwO1xuICBfcmVjb3Jkc051bWJlcjogbnVtYmVyID0gMDtcbiAgX3NvcnRpbmc6IGFueTtcbiAgX3dhaXRpbmc6IGJvb2xlYW47XG4gIF9jbGllbnRQYWdpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBfc29ydGFibGU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IodGFibGVSZWNlaXZlZCwgZm9ybUNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlUmVjZWl2ZWQsIGZvcm1Db25maWcpO1xuICAgIHRoaXMucHJvcGFnYXRpb25DdXN0b21BdHRyaWJ1dGVzID0gdGhpcy5fZm9ybUNvbmZpZz8ucHJvcGFnYXRpb25DdXN0b21BdHRyaWJ1dGVzPy50YWJsZXMgPz8gW107XG4gICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlcy50YWJsZTtcbiAgICB0aGlzLl93YWl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMuX3RvdGFsUGFnZXMgPSAxO1xuICAgIHRoaXMuX3JlcXVlc3RlZFBhZ2UgPSAxO1xuICAgIHRoaXMuX2NvbHVtbnMgPSBbXTtcbiAgICB0aGlzLl90YWJsZUNvbHVtbk9iaiA9IHt9O1xuICAgIHRoaXMuX2FjdGlvbnMgPSBbXTtcbiAgICB0aGlzLl9hY3Rpb25zT2JqID0ge307XG4gICAgdGhpcy5fdGFibGVSZWNvcmRzID0gW107XG4gICAgdGhpcy5fZ2xvYmFsU2VhcmNoID0gZmFsc2U7XG4gICAgdGhpcy5yZXN0cmljdGVkSWQgPSBudWxsO1xuXG4gICAgdGhpcy5fdGFibGVUaXRsZSA9IHRhYmxlUmVjZWl2ZWQudGFibGVUaXRsZTtcbiAgICB0aGlzLl9hcHBlbmRQYWdlcyA9IHRhYmxlUmVjZWl2ZWQ/LmFwcGVuZCA/PyBmYWxzZTtcbiAgICB0aGlzLl9zZWxlY3RhYmxlID0gdGFibGVSZWNlaXZlZD8uc2VsZWN0YWJsZSA/PyBmYWxzZTtcbiAgICB0aGlzLl9zZWxlY3Rpb25CYWNrZW5kID0gdGFibGVSZWNlaXZlZD8uc2VsZWN0aW9uQmFja2VuZCA/PyBmYWxzZTtcbiAgICB0aGlzLl9zb3J0YWJsZSA9IHRhYmxlUmVjZWl2ZWQ/LnNvcnRhYmxlID8/IGZhbHNlO1xuXG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLmFsbFNlbGVjdGVkLCBmYWxzZSk7XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLnRhYmxlQ29kZSwgdGFibGVSZWNlaXZlZC50YWJsZUNvZGUpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5jbGllbnRQYWdpbmcsIHRhYmxlUmVjZWl2ZWQ/LmNsaWVudFBhZ2luZyA/PyB0cnVlKTtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMuZ2xvYmFsU2VhcmNoLCB0YWJsZVJlY2VpdmVkPy5zaW1wbGVGaWx0ZXIgPz8gZmFsc2UpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5nbG9iYWxGaWx0ZXJTdHJpbmcsICcnKTtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMuc29ydGluZywgeyBjb2x1bW5OYW1lOiAnJywgZGlyZWN0aW9uOiAnJyB9KTtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMucmVjb3Jkc1BlclBhZ2UsIGZvcm1Db25maWcuZGVmYXVsdFJlY29yZHNQZXJQYWdlKTtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMubGF5b3V0LCAnJyk7XG5cbiAgICBpZiAodGFibGVSZWNlaXZlZC5maWVsZHMpIHtcbiAgICAgIGNvbnN0IGNvbHVtbnM6IFJlY29yZFRhYmxlQ29sdW1uW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uUmVjZWl2ZWQgb2YgdGFibGVSZWNlaXZlZC5maWVsZHMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uRW5yaWNoZWQgPSB7XG4gICAgICAgICAgLi4uY29sdW1uUmVjZWl2ZWQsXG4gICAgICAgICAgdmlzaWJsZVN0YXRlczogdGhpcy52aXNpYmxlU3RhdGVzLFxuICAgICAgICAgIGVuYWJsZWRTdGF0ZXM6IHRoaXMuZW5hYmxlZFN0YXRlc1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjb2x1bW5EZWZpbml0aW9uOiBSZWNvcmRUYWJsZUNvbHVtbiA9IG5ldyBSZWNvcmRUYWJsZUNvbHVtbihjb2x1bW5FbnJpY2hlZCwgdGhpcy5fZm9ybUNvbmZpZyk7XG4gICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW5EZWZpbml0aW9uKTtcbiAgICAgICAgdGhpcy5fdGFibGVDb2x1bW5PYmpbY29sdW1uRGVmaW5pdGlvbi5maWVsZENvZGVdID0gY29sdW1uRGVmaW5pdGlvbjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0QXR0cihhdHRycy5jb2x1bW5zLCBjb2x1bW5zKTtcbiAgICB9XG4gICAgaWYgKHRhYmxlUmVjZWl2ZWQuYWN0aW9ucykge1xuICAgICAgY29uc3QgdGFibGVBY3Rpb25zID0gdGFibGVSZWNlaXZlZC5hY3Rpb25zLm1hcChvYmpEZWYgPT4ge1xuICAgICAgICBsZXQgdmlzaWJsZVN0YXRlcyA9IG9iakRlZi52aXNpYmxlU3RhdGVzO1xuICAgICAgICBsZXQgZW5hYmxlZFN0YXRlcyA9IG9iakRlZi5lbmFibGVkU3RhdGVzO1xuICAgICAgICBpZiAoIXZpc2libGVTdGF0ZXMpIHtcbiAgICAgICAgICB2aXNpYmxlU3RhdGVzID0gKG9iakRlZi5hY3Rpb25Nb2RlcyB8fCAnJykuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcChzdGF0ZSA9PiBzdGF0ZS50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKHN0YXRlID0+IHN0YXRlLmxlbmd0aCA+IDApO1xuICAgICAgICAgIGVuYWJsZWRTdGF0ZXMgPSAob2JqRGVmLmFjdGlvbk1vZGVzIHx8ICcnKS5zcGxpdCgnLCcpXG4gICAgICAgICAgICAubWFwKHN0YXRlID0+IHN0YXRlLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIoc3RhdGUgPT4gc3RhdGUubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqRGVmLCB2aXNpYmxlU3RhdGVzLCBlbmFibGVkU3RhdGVzIH07XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgYWN0aW9uUmVjZWl2ZWQgb2YgdGFibGVBY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IGlubGluZUFjdGlvbiA9IG5ldyBUYWJsZUFjdGlvbihhY3Rpb25SZWNlaXZlZCwgdGhpcy5fZm9ybUNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2FjdGlvbnMucHVzaChpbmxpbmVBY3Rpb24pO1xuICAgICAgICB0aGlzLl9hY3Rpb25zT2JqW2lubGluZUFjdGlvbi5hY3Rpb25Db2RlXSA9IGlubGluZUFjdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc2VsZWN0aW9uRmllbGQgPSAodGhpcy5fc2VsZWN0YWJsZSkgPyB0YWJsZVJlY2VpdmVkPy5zZWxlY3Rpb25GaWVsZCA6IG51bGw7XG4gICAgLy8gRmlsdHJvcyBwcmVkZWZpbmlkb3MgZW4gZWwgZm9ybXVsYXJpb1xuICAgIGlmICh0YWJsZVJlY2VpdmVkLmZpbHRlcnMpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YWJsZVJlY2VpdmVkLmZpbHRlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHRoaXMuYWRkRmlsdGVyRGVmaW5pdGlvbih0YWJsZVJlY2VpdmVkLmZpbHRlcnNbaW5kZXhdLmZpZWxkQ29kZSwgdGFibGVSZWNlaXZlZC5maWx0ZXJzW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbHVtbk5hbWVzKCkgeyByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fdGFibGVDb2x1bW5PYmopOyB9XG4gIGdldCBpbmxpbmVBY3Rpb25UcmlnZ2VyKCkgeyByZXR1cm4gdGhpcy5faW5saW5lQWN0aW9uVHJpZ2dlcjsgfVxuICBnZXQgZ2xvYmFsQWN0aW9uVHJpZ2dlcigpIHsgcmV0dXJuIHRoaXMuX2dsb2JhbEFjdGlvblRyaWdnZXI7IH1cbiAgZ2V0IHNlbGVjdGlvbkFjdGlvblRyaWdnZXIoKSB7IHJldHVybiB0aGlzLl9zZWxlY3Rpb25BY3Rpb25UcmlnZ2VyOyB9XG4gIGdldCByZWNvcmRTZWxlY3Rpb25UcmlnZ2VyKCkgeyByZXR1cm4gdGhpcy5fcmVjb3JkU2VsZWN0aW9uVHJpZ2dlcjsgfVxuICBnZXQgZ2V0RGF0YVRyaWdnZXIoKSB7IHJldHVybiB0aGlzLl9nZXREYXRhVHJpZ2dlcjsgfVxuXG4gIGdldCBnbG9iYWxTZWFyY2goKSB7IHJldHVybiB0aGlzLl9nbG9iYWxTZWFyY2g7IH1cbiAgZ2V0IHRhYmxlUmVjb3JkcygpIHsgcmV0dXJuIHRoaXMuX3RhYmxlUmVjb3JkczsgfVxuICBnZXQgdGFibGVSZWNvcmRPYmooKSB7IHJldHVybiB0aGlzLl90YWJsZVJlY29yZE9iajsgfVxuICBnZXQgdmlzaWJsZVJlY29yZHMoKSB7IHJldHVybiB0aGlzLl92aXNpYmxlUmVjb3JkczsgfVxuICBnZXQgY29sdW1ucygpIHsgcmV0dXJuIHRoaXMuX2NvbHVtbnM7IH1cbiAgZ2V0IHNlbGVjdGFibGUoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RhYmxlOyB9XG4gIGdldCBzZWxlY3Rpb25CYWNrZW5kKCkgeyByZXR1cm4gdGhpcy5fc2VsZWN0aW9uQmFja2VuZDsgfVxuICBnZXQgc2VsZWN0aW9uRmllbGQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3Rpb25GaWVsZDsgfVxuICBnZXQgYWxsU2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9hbGxTZWxlY3RlZDsgfVxuICBnZXQgdGFibGVDb2RlKCkgeyByZXR1cm4gdGhpcy5fdGFibGVDb2RlOyB9XG4gIGdldCB0YWJsZVRpdGxlKCkgeyByZXR1cm4gdGhpcy5fdGFibGVUaXRsZTsgfVxuICBnZXQgY3VycmVudFBhZ2UoKSB7IHJldHVybiB0aGlzLl9jdXJyZW50UGFnZTsgfVxuICBnZXQgdG90YWxQYWdlcygpIHsgcmV0dXJuIHRoaXMuX3RvdGFsUGFnZXM7IH1cbiAgZ2V0IHJlcXVlc3RlZFBhZ2UoKSB7IHJldHVybiB0aGlzLl9yZXF1ZXN0ZWRQYWdlOyB9XG4gIGdldCByZWNvcmRzUGVyUGFnZSgpIHsgcmV0dXJuIHRoaXMuX3JlY29yZHNQZXJQYWdlOyB9XG4gIGdldCB0b3RhbFJlY29yZHNOdW1iZXIoKSB7IHJldHVybiB0aGlzLl90b3RhbFJlY29yZHNOdW1iZXI7IH1cbiAgZ2V0IHJlY29yZHNOdW1iZXIoKSB7IHJldHVybiB0aGlzLl9yZWNvcmRzTnVtYmVyOyB9XG4gIGdldCBzb3J0aW5nKCkgeyByZXR1cm4gdGhpcy5fc29ydGluZzsgfVxuICBnZXQgd2FpdGluZygpIHsgcmV0dXJuIHRoaXMuX3dhaXRpbmc7IH1cbiAgZ2V0IGNsaWVudFBhZ2luZygpIHsgcmV0dXJuIHRoaXMuX2NsaWVudFBhZ2luZzsgfVxuICBnZXQgc29ydGFibGUoKSB7IHJldHVybiB0aGlzLl9zb3J0YWJsZTsgfVxuXG4gIHNldCBnbG9iYWxTZWFyY2goZ2xvYmFsU2VhcmNoKSB7IHRoaXMuX2dsb2JhbFNlYXJjaCA9IGdsb2JhbFNlYXJjaDsgfVxuICBzZXQgdGFibGVSZWNvcmRzKHRhYmxlUmVjb3JkcykgeyB0aGlzLl90YWJsZVJlY29yZHMgPSB0YWJsZVJlY29yZHM7IH1cbiAgc2V0IHRhYmxlUmVjb3JkT2JqKHRhYmxlUmVjb3JkT2JqKSB7IHRoaXMuX3RhYmxlUmVjb3JkT2JqID0gdGFibGVSZWNvcmRPYmo7IH1cbiAgc2V0IHZpc2libGVSZWNvcmRzKHZpc2libGVSZWNvcmRzKSB7IHRoaXMuX3Zpc2libGVSZWNvcmRzID0gdmlzaWJsZVJlY29yZHM7IH1cbiAgc2V0IGNvbHVtbnMoY29sdW1ucykgeyB0aGlzLl9jb2x1bW5zID0gY29sdW1uczsgfVxuICBzZXQgc2VsZWN0YWJsZShzZWxlY3RhYmxlKSB7IHRoaXMuX3NlbGVjdGFibGUgPSBzZWxlY3RhYmxlOyB9XG4gIHNldCBzZWxlY3Rpb25CYWNrZW5kKHNlbGVjdGlvbkJhY2tlbmQpIHsgdGhpcy5fc2VsZWN0aW9uQmFja2VuZCA9IHNlbGVjdGlvbkJhY2tlbmQ7IH1cbiAgc2V0IHNlbGVjdGlvbkZpZWxkKHNlbGVjdGlvbkZpZWxkKSB7IHRoaXMuX3NlbGVjdGlvbkZpZWxkID0gc2VsZWN0aW9uRmllbGQ7IH1cbiAgc2V0IGFsbFNlbGVjdGVkKGFsbFNlbGVjdGVkKSB7IHRoaXMuX2FsbFNlbGVjdGVkID0gYWxsU2VsZWN0ZWQ7IH1cbiAgc2V0IHRhYmxlQ29kZSh0YWJsZUNvZGUpIHsgdGhpcy5fdGFibGVDb2RlID0gdGFibGVDb2RlOyB9XG4gIHNldCB0YWJsZVRpdGxlKHRhYmxlVGl0bGUpIHsgdGhpcy5fdGFibGVUaXRsZSA9IHRhYmxlVGl0bGU7IH1cbiAgc2V0IGN1cnJlbnRQYWdlKGN1cnJlbnRQYWdlKSB7IHRoaXMuX2N1cnJlbnRQYWdlID0gY3VycmVudFBhZ2U7IH1cbiAgc2V0IHRvdGFsUGFnZXModG90YWxQYWdlcykgeyB0aGlzLl90b3RhbFBhZ2VzID0gdG90YWxQYWdlczsgfVxuICBzZXQgcmVxdWVzdGVkUGFnZShyZXF1ZXN0ZWRQYWdlKSB7IHRoaXMuX3JlcXVlc3RlZFBhZ2UgPSByZXF1ZXN0ZWRQYWdlOyB9XG4gIHNldCByZWNvcmRzUGVyUGFnZShyZWNvcmRzUGVyUGFnZSkgeyB0aGlzLl9yZWNvcmRzUGVyUGFnZSA9IHJlY29yZHNQZXJQYWdlOyB9XG4gIHNldCB0b3RhbFJlY29yZHNOdW1iZXIodG90YWxSZWNvcmRzTnVtYmVyKSB7IHRoaXMuX3RvdGFsUmVjb3Jkc051bWJlciA9IHRvdGFsUmVjb3Jkc051bWJlcjsgfVxuICBzZXQgcmVjb3Jkc051bWJlcihyZWNvcmRzTnVtYmVyKSB7IHRoaXMuX3JlY29yZHNOdW1iZXIgPSByZWNvcmRzTnVtYmVyOyB9XG4gIHNldCBzb3J0aW5nKHNvcnRpbmcpIHsgdGhpcy5fc29ydGluZyA9IHNvcnRpbmc7IH1cbiAgc2V0IHdhaXRpbmcod2FpdGluZykgeyB0aGlzLl93YWl0aW5nID0gd2FpdGluZzsgfVxuICBzZXQgY2xpZW50UGFnaW5nKGNsaWVudFBhZ2luZykgeyB0aGlzLl9jbGllbnRQYWdpbmcgPSBjbGllbnRQYWdpbmc7IH1cbiAgc2V0IHNvcnRhYmxlKHNvcnRhYmxlKSB7IHRoaXMuX3NvcnRhYmxlID0gc29ydGFibGU7IH1cblxuICBnZXRMYXlvdXQoKSB7IHJldHVybiB0aGlzLmxheW91dDsgfVxuICBzZXRMYXlvdXQobGF5b3V0KSB7IHRoaXMuc2V0QXR0cihhdHRycy5sYXlvdXQsIGxheW91dCk7IH1cbiAgaGFzQWN0aW9ucygpIHsgcmV0dXJuICh0aGlzLl9hY3Rpb25zLmxlbmd0aCA+IDApOyB9XG4gIGdldFNlbGVjdGVkUmVjb3JkcygpIHsgcmV0dXJuIHRoaXMuX3RhYmxlUmVjb3Jkcy5maWx0ZXIocmVjID0+IHJlYy5zZWxlY3RlZCkubWFwKHJlYyA9PiByZWMucmVjb3JkSWQpOyB9XG4gIGFjdGl2YXRlR2xvYmFsU2VhcmNoKCkgeyB0aGlzLl9nbG9iYWxTZWFyY2ggPSB0cnVlOyB9XG4gIGluYWN0aXZhdGVHbG9iYWxTZWFyY2goKSB7IHRoaXMuX2dsb2JhbFNlYXJjaCA9IGZhbHNlOyB9XG4gIGNvbHVtbkRlZmluaXRpb24oZmllbGRDb2RlKTogUmVjb3JkVGFibGVDb2x1bW4geyByZXR1cm4gdGhpcy5fdGFibGVDb2x1bW5PYmpbZmllbGRDb2RlXTsgfVxuICBwdXRPbldhaXQoKSB7IHRoaXMuX3dhaXRpbmcgPSB0cnVlOyB9XG4gIGZyZWVXYWl0aW5nKCkgeyB0aGlzLl93YWl0aW5nID0gZmFsc2U7IH1cbiAgc2V0V2lkZ2V0KHdpZGdldCkgeyB0aGlzLndpZGdldCA9IHdpZGdldDsgfVxuXG4gIG5vdGlmeUdsb2JhbEFjdGlvbihhY3Rpb25Db2RlKSB7XG4gICAgY29uc3QgdGFibGVFdmVudDogVGFibGVFdmVudCA9IHtcbiAgICAgIHRhYmxlQ29kZTogdGhpcy5fdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICAgIGFjdGlvbkRldGFpbDogbnVsbFxuICAgIH07XG4gICAgdGhpcy5fZ2xvYmFsQWN0aW9uVHJpZ2dlci5uZXh0KHRhYmxlRXZlbnQpO1xuICB9XG5cbiAgbm90aWZ5SW5saW5lQWN0aW9uKHRhYmxlQWN0aW9uRXZlbnQ6IFRhYmxlQWN0aW9uRXZlbnQpIHtcbiAgICBjb25zdCB0YWJsZUV2ZW50OiBUYWJsZUV2ZW50ID0ge1xuICAgICAgdGFibGVDb2RlOiB0aGlzLl90YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlOiB0YWJsZUFjdGlvbkV2ZW50LmFjdGlvbkNvZGUsXG4gICAgICBhY3Rpb25EZXRhaWw6IHtcbiAgICAgICAgcmVjb3JkSWQ6IHRhYmxlQWN0aW9uRXZlbnQucmVjb3JkSWQsXG4gICAgICAgIHJlY29yZERhdGE6IHRhYmxlQWN0aW9uRXZlbnQucmVjb3JkRGF0YVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5faW5saW5lQWN0aW9uVHJpZ2dlci5uZXh0KHRhYmxlRXZlbnQpO1xuICB9XG5cbiAgbm90aWZ5UmVjb3JkU2VsZWN0aW9uKHJlY29yZElkKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5nZXRUYWJsZVJlY29yZChyZWNvcmRJZCk7XG4gICAgaWYgKCFyZWNvcmQpIHsgcmV0dXJuOyB9XG4gICAgcmVjb3JkLnRvZ2dsZVNlbGVjdCgpO1xuICAgIHRoaXMuX3JlcXVlc3RlZFBhZ2UgPSB0aGlzLl9jdXJyZW50UGFnZSA/PyAxO1xuICAgIGNvbnN0IHRhYmxlRXZlbnQ6IFRhYmxlRXZlbnQgPSB7XG4gICAgICB0YWJsZUNvZGU6IHRoaXMuX3RhYmxlQ29kZSxcbiAgICAgIGFjdGlvbkNvZGU6IG51bGwsXG4gICAgICBhY3Rpb25EZXRhaWw6IHtcbiAgICAgICAgcmVjb3JkSWQ6IHJlY29yZC5yZWNvcmRJZCxcbiAgICAgICAgcmVjb3JkRGF0YTogcmVjb3JkLnJlY29yZERhdGFcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMucmVjb3JkU2VsZWN0aW9uVHJpZ2dlci5uZXh0KHRhYmxlRXZlbnQpO1xuICB9XG5cbiAgbm90aWZ5U2VsZWN0aW9uQWN0aW9uKGFjdGlvbkNvZGUpIHtcbiAgICBjb25zdCB0YWJsZUV2ZW50OiBUYWJsZUV2ZW50ID0ge1xuICAgICAgdGFibGVDb2RlOiB0aGlzLl90YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlLFxuICAgICAgYWN0aW9uRGV0YWlsOiB7XG4gICAgICAgIHNlbGVjdGVkUmVjb3JkczogdGhpcy5zZWxlY3RlZFJlY29yZHNcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuX3NlbGVjdGlvbkFjdGlvblRyaWdnZXIubmV4dCh0YWJsZUV2ZW50KTtcbiAgfVxuXG4gIG5vdGlmeUdldERhdGFBY3Rpb24ocmVxdWVzdGVkUGFnZSA9IG51bGwpIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVSZWNvcmRzKCk7XG4gICAgdGhpcy5fcmVxdWVzdGVkUGFnZSA9IHJlcXVlc3RlZFBhZ2UgfHwgdGhpcy5fY3VycmVudFBhZ2UgfHwgMTtcbiAgICBjb25zdCB0YWJsZUV2ZW50OiBUYWJsZUV2ZW50ID0ge1xuICAgICAgdGFibGVDb2RlOiB0aGlzLl90YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlOiBudWxsLFxuICAgICAgYWN0aW9uRGV0YWlsOiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5fZ2V0RGF0YVRyaWdnZXIubmV4dCh0YWJsZUV2ZW50KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIHRoaXMuX3RhYmxlUmVjb3JkcyA9IFtdO1xuICAgIHRoaXMudW5TZWxlY3RBbGwoKTtcbiAgICB0aGlzLl90YWJsZVJlY29yZE9iaiA9IHt9O1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJlY29yZHMoKTtcbiAgfVxuXG4gIHNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMuYWxsU2VsZWN0ZWQsIHRydWUpO1xuICAgIHRoaXMuX3RhYmxlUmVjb3Jkcy5mb3JFYWNoKHJlY29yZCA9PiByZWNvcmQuc2VsZWN0KCkpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5zZWxlY3RlZFJlY29yZHMsIHRoaXMuZ2V0U2VsZWN0ZWRSZWNvcmRzKCkpO1xuICAgIHJldHVybiB0cnVlO1xuXG4gIH1cblxuICB1blNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMuYWxsU2VsZWN0ZWQsIGZhbHNlKTtcbiAgICB0aGlzLl90YWJsZVJlY29yZHMuZm9yRWFjaChyZWNvcmQgPT4gcmVjb3JkLnVuc2VsZWN0KCkpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5zZWxlY3RlZFJlY29yZHMsIHRoaXMuZ2V0U2VsZWN0ZWRSZWNvcmRzKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2V0VGFibGVSZWNvcmRzKHRhYmxlUmVjb3JkcywgYXBwZW5kKSB7XG4gICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgIHRoaXMuX3RhYmxlUmVjb3JkcyA9IFtdO1xuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLmFsbFNlbGVjdGVkLCBmYWxzZSk7XG4gICAgICB0aGlzLl90YWJsZVJlY29yZHMuZm9yRWFjaChyZWNvcmQgPT4gcmVjb3JkLnVuc2VsZWN0KCkpO1xuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLnNlbGVjdGVkUmVjb3JkcywgW10pO1xuICAgICAgdGhpcy5fdGFibGVSZWNvcmRPYmogPSB7fTtcbiAgICB9XG4gICAgY29uc3QgbmV3UmVjb3Jkc09iaiA9IHsgLi4udGhpcy5fdGFibGVSZWNvcmRPYmogfTtcbiAgICBjb25zdCBuZXdSZWNvcmRzID0gWy4uLnRoaXMuX3RhYmxlUmVjb3Jkc107XG4gICAgZm9yIChjb25zdCB0YWJsZVJlY29yZCBvZiB0YWJsZVJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHJlY29yZFJlY2VpdmVkOiBUYWJsZVJlY29yZERhdGEgPSBuZXcgVGFibGVSZWNvcmREYXRhKHRhYmxlUmVjb3JkLCB0aGlzLl9jb2x1bW5zLCB0aGlzLl9zZWxlY3Rpb25GaWVsZCk7XG4gICAgICBjb25zdCByZWNvcmRJZEtleSA9IHJlY29yZFJlY2VpdmVkLnJlY29yZElkS2V5O1xuICAgICAgbmV3UmVjb3Jkcy5wdXNoKHJlY29yZFJlY2VpdmVkKTtcbiAgICAgIG5ld1JlY29yZHNPYmpbcmVjb3JkSWRLZXldID0gcmVjb3JkUmVjZWl2ZWQ7XG4gICAgfVxuICAgIHRoaXMuX3RhYmxlUmVjb3JkcyA9IG5ld1JlY29yZHM7XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLnNlbGVjdGVkUmVjb3JkcywgdGhpcy5nZXRTZWxlY3RlZFJlY29yZHMoKSk7XG4gICAgdGhpcy5fdGFibGVSZWNvcmRPYmogPSBuZXdSZWNvcmRzT2JqO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJlY29yZHMoKTtcbiAgfVxuXG4gIGFwcGVuZFJlY29yZHMocmVjb3JkcykgeyB0aGlzLnNldFRhYmxlUmVjb3JkcyhyZWNvcmRzLCB0cnVlKTsgfVxuICByZXBsYWNlUmVjb3JkcyhyZWNvcmRzKSB7IHRoaXMuc2V0VGFibGVSZWNvcmRzKHJlY29yZHMsIGZhbHNlKTsgfVxuXG4gIHNldFRhYmxlQXBwZW5kKGFwcGVuZDogYm9vbGVhbikgeyB0aGlzLl9hcHBlbmRQYWdlcyA9IGFwcGVuZCB9XG5cbiAgY2hhbmdlUGFnZShyZXF1ZXN0ZWRQYWdlKSB7XG4gICAgaWYgKHRoaXMuX2NsaWVudFBhZ2luZykge1xuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLmN1cnJlbnRQYWdlLCByZXF1ZXN0ZWRQYWdlKTtcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZVJlY29yZHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ub3RpZnlHZXREYXRhQWN0aW9uKHJlcXVlc3RlZFBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVZpc2libGVSZWNvcmRzKCkge1xuICAgIGxldCB2aXNpYmxlUmVjb3JkczogYW55W107XG4gICAgaWYgKHRoaXMuX2NsaWVudFBhZ2luZykge1xuICAgICAgbGV0IGZpbHRlcmVkUmVjb3JkcyA9IHRoaXMuZ2V0RmlsdGVyZWRSZWNvcmRzKCk7XG4gICAgICB0aGlzLnNldEF0dHIoYXR0cnMudG90YWxSZWNvcmRzTnVtYmVyLCBmaWx0ZXJlZFJlY29yZHMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHNsaWNlTnVtYmVyMSA9ICh0aGlzLl9jdXJyZW50UGFnZSAtIDEpICogdGhpcy5fcmVjb3Jkc1BlclBhZ2U7XG4gICAgICBjb25zdCBzbGljZU51bWJlcjIgPSAodGhpcy5fY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMuX3JlY29yZHNQZXJQYWdlICsgdGhpcy5fcmVjb3Jkc1BlclBhZ2VcbiAgICAgIHZpc2libGVSZWNvcmRzID0gZmlsdGVyZWRSZWNvcmRzLnNsaWNlKHNsaWNlTnVtYmVyMSwgc2xpY2VOdW1iZXIyKTtcbiAgICAgIGNvbnN0IHJlY29yZHNMYXN0UGFnZSA9IHRoaXMuX3RvdGFsUmVjb3Jkc051bWJlciAlIHRoaXMuX3JlY29yZHNQZXJQYWdlO1xuICAgICAgY29uc3QgdG90YWxQYWdlcyA9IE1hdGgudHJ1bmModGhpcy5fdG90YWxSZWNvcmRzTnVtYmVyIC8gdGhpcy5fcmVjb3Jkc1BlclBhZ2UgKyAocmVjb3Jkc0xhc3RQYWdlID8gMSA6IDApKTtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50UGFnZSA+IHRvdGFsUGFnZXMpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFBhZ2UgPSB0b3RhbFBhZ2VzIHx8IDE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2libGVSZWNvcmRzID0gdGhpcy5fdGFibGVSZWNvcmRzO1xuICAgIH1cbiAgICB0aGlzLnNldEF0dHIoYXR0cnMudmlzaWJsZVJlY29yZHMsIHZpc2libGVSZWNvcmRzKTtcbiAgfVxuXG4gIHVwZGF0ZUZyb21TZXJ2ZXIodGFibGVSZWNlaXZlZCkge1xuICAgIHRoaXMuX3JlcXVlc3RlZFBhZ2UgPSAxO1xuICAgIGNvbnN0IHsgdmlzaWJsZSA9IHRydWUsIHRvdGFsUGFnZXMgPSAxLCByZWNvcmRzTnVtYmVyLCBjdXJyZW50UGFnZSA9IDEsIHJlY29yZHNQZXJQYWdlLFxuICAgICAgdG90YWxSZWNvcmRzTnVtYmVyLCBzb3J0aW5nQ29sdW1uLCBzb3J0aW5nRGlyZWN0aW9uLCB0YWJsZVJlY29yZHMsXG4gICAgICBhY3Rpb25zLCBmaWVsZHMsXG4gICAgfSA9IHRhYmxlUmVjZWl2ZWQ7XG4gICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZTtcbiAgICBpZiAoYWN0aW9ucykge1xuICAgICAgT2JqZWN0LmtleXMoYWN0aW9ucykuZm9yRWFjaChhY3Rpb25Db2RlID0+IHtcbiAgICAgICAgY29uc3QgdGJsQWN0aW9uID0gdGhpcy5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgICAgIGNvbnN0IGFjdGlvblJlY2VpdmVkID0gYWN0aW9uc1thY3Rpb25Db2RlXTtcbiAgICAgICAgaWYgKGFjdGlvblJlY2VpdmVkLnZpc2libGUgPT09IHRydWUgfHwgYWN0aW9uUmVjZWl2ZWQudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAoYWN0aW9uUmVjZWl2ZWQudmlzaWJsZSA9PT0gdHJ1ZSkgJiYgdGJsQWN0aW9uLnNob3coKTtcbiAgICAgICAgICAoYWN0aW9uUmVjZWl2ZWQudmlzaWJsZSA9PT0gZmFsc2UpICYmIHRibEFjdGlvbi5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvblJlY2VpdmVkLmVuYWJsZWQgPT09IHRydWUgfHwgYWN0aW9uUmVjZWl2ZWQuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAoYWN0aW9uUmVjZWl2ZWQuZW5hYmxlZCA9PT0gdHJ1ZSkgJiYgdGJsQWN0aW9uLmVuYWJsZSgpO1xuICAgICAgICAgIChhY3Rpb25SZWNlaXZlZC5lbmFibGVkID09PSBmYWxzZSkgJiYgdGJsQWN0aW9uLmRpc2FibGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uUmVjZWl2ZWQuc2hvd09uU3RhdGVzKSB7XG4gICAgICAgICAgYWN0aW9uUmVjZWl2ZWQuc2hvd09uU3RhdGVzPy5mb3JFYWNoKG5ld1N0YXRlID0+IHtcbiAgICAgICAgICAgIHRibEFjdGlvbi5hZGRWaXNpYmxlU3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25SZWNlaXZlZC5oaWRlT25TdGF0ZXMpIHtcbiAgICAgICAgICBhY3Rpb25SZWNlaXZlZC5oaWRlT25TdGF0ZXM/LmZvckVhY2gobmV3U3RhdGUgPT4ge1xuICAgICAgICAgICAgdGJsQWN0aW9uLnJlbW92ZVZpc2libGVTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvblJlY2VpdmVkLmVuYWJsZU9uU3RhdGVzKSB7XG4gICAgICAgICAgYWN0aW9uUmVjZWl2ZWQuZW5hYmxlT25TdGF0ZXM/LmZvckVhY2gobmV3U3RhdGUgPT4ge1xuICAgICAgICAgICAgdGJsQWN0aW9uLmFkZEVuYWJsZWRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvblJlY2VpdmVkLmRpc2FibGVPblN0YXRlcykge1xuICAgICAgICAgIGFjdGlvblJlY2VpdmVkLmRpc2FibGVPblN0YXRlcz8uZm9yRWFjaChuZXdTdGF0ZSA9PiB7XG4gICAgICAgICAgICB0YmxBY3Rpb24ucmVtb3ZlRW5hYmxlZFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmaWVsZHMpIHtcbiAgICAgIE9iamVjdC5rZXlzKGZpZWxkcykuZm9yRWFjaChmaWVsZENvZGUgPT4ge1xuICAgICAgICBjb25zdCB0YmxGaWVsZCA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbihmaWVsZENvZGUpO1xuICAgICAgICBjb25zdCBmaWVsZFJlY2VpdmVkID0gZmllbGRzW2ZpZWxkQ29kZV07XG4gICAgICAgIGlmIChmaWVsZFJlY2VpdmVkLnZpc2libGUgPT09IHRydWUgfHwgZmllbGRSZWNlaXZlZC52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgIChmaWVsZFJlY2VpdmVkLnZpc2libGUgPT09IHRydWUpICYmIHRibEZpZWxkLnNob3coKTtcbiAgICAgICAgICAoZmllbGRSZWNlaXZlZC52aXNpYmxlID09PSBmYWxzZSkgJiYgdGJsRmllbGQuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRhYmxlUmVjb3Jkcykge1xuICAgICAgdGhpcy5fdG90YWxQYWdlcyA9IHRvdGFsUGFnZXM7XG4gICAgICB0aGlzLl9yZWNvcmRzTnVtYmVyID0gcmVjb3Jkc051bWJlcjtcbiAgICAgIHRoaXMuc2V0QXR0cihhdHRycy5jdXJyZW50UGFnZSwgK2N1cnJlbnRQYWdlKTtcbiAgICAgIHRoaXMuc2V0QXR0cihhdHRycy5yZWNvcmRzUGVyUGFnZSwgK3JlY29yZHNQZXJQYWdlKTtcbiAgICAgIHRoaXMuc2V0QXR0cihhdHRycy50b3RhbFJlY29yZHNOdW1iZXIsICh0aGlzLl9jbGllbnRQYWdpbmcpID8gdGFibGVSZWNvcmRzLmxlbmd0aCA6ICt0b3RhbFJlY29yZHNOdW1iZXIpO1xuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLnNvcnRpbmcsIHtcbiAgICAgICAgY29sdW1uTmFtZTogc29ydGluZ0NvbHVtbiB8fCAnJyxcbiAgICAgICAgZGlyZWN0aW9uOiBzb3J0aW5nRGlyZWN0aW9uIHx8ICcnXG4gICAgICB9KTtcbiAgICAgIGlmICghdGhpcy5fYXBwZW5kUGFnZXMpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlUmVjb3Jkcyh0YWJsZVJlY29yZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hcHBlbmRSZWNvcmRzKHRhYmxlUmVjb3Jkcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3dhaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVSZWNvcmRzKCk7XG4gIH1cblxuICBnZXRUYWJsZVJlY29yZChyZWNvcmRJZCkge1xuICAgIGNvbnN0IHJlY29yZElkS2V5ID0gKHR5cGVvZiByZWNvcmRJZCA9PT0gJ29iamVjdCcpID8gSlNPTi5zdHJpbmdpZnkocmVjb3JkSWQpIDogcmVjb3JkSWQ7XG4gICAgcmV0dXJuICh0aGlzLl90YWJsZVJlY29yZE9iaiAmJiByZWNvcmRJZCAmJiB0aGlzLl90YWJsZVJlY29yZE9ialtyZWNvcmRJZF0pXG4gICAgICA/IHRoaXMuX3RhYmxlUmVjb3JkT2JqW3JlY29yZElkXSA6IG51bGw7XG4gIH1cblxuICBnZXRBY3Rpb24oYWN0aW9uQ29kZSkge1xuICAgIHJldHVybiAodGhpcy5fYWN0aW9uc09iaiAmJiBhY3Rpb25Db2RlICYmIHRoaXMuX2FjdGlvbnNPYmpbYWN0aW9uQ29kZV0pXG4gICAgICA/IHRoaXMuX2FjdGlvbnNPYmpbYWN0aW9uQ29kZV0gOiBudWxsO1xuICB9XG5cbiAgZ2V0QWN0aW9ucyhhY3Rpb25DbGFzczogc3RyaW5nID0gdGhpcy5fZm9ybUNvbmZpZy50YWJsZUFjdGlvbnMuaW5saW5lLCBhY3Rpb25UeXBlczogc3RyaW5nW10gPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbnMuZmlsdGVyKGFjdGlvbkRlZiA9PiB7XG4gICAgICBjb25zdCB0eXBlSW5jbHVkZWQgPSAoYWN0aW9uVHlwZXMpID8gYWN0aW9uVHlwZXMuaW5jbHVkZXMoYWN0aW9uRGVmLmFjdGlvblR5cGUpIDogdHJ1ZTtcbiAgICAgIHJldHVybiBhY3Rpb25EZWYuYWN0aW9uQ2xhc3MgPT09IGFjdGlvbkNsYXNzICYmIHR5cGVJbmNsdWRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEZpbHRyb3NcblxuICBzZXRGaWx0ZXJCeUlkKGlkKSB7XG4gICAgaWYgKHRoaXMucmVzdHJpY3RlZElkID09PSBpZCkgeyByZXR1cm47IH1cbiAgICB0aGlzLnJlc3RyaWN0ZWRJZCA9IGlkO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJlY29yZHMoKTtcbiAgfVxuXG4gIGNsZWFuSWRGaWx0ZXIoKSB7XG4gICAgaWYgKHRoaXMucmVzdHJpY3RlZElkID09PSBudWxsKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzdHJpY3RlZElkID0gbnVsbDtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVSZWNvcmRzKCk7XG4gIH1cblxuICBzZXRHbG9iYWxGaWx0ZXJTdHJpbmcodGV4dCwgbm90aWZ5Q29tcG9uZW50ID0gdHJ1ZSkge1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVyU3RyaW5ncyA9IHRleHQuc3BsaXQoJyAnKS5maWx0ZXIodCA9PiB0ICYmIHQudHJpbSgpLmxlbmd0aCA+IDApLm1hcCh0ID0+IHQudHJpbSgpKSA/PyBbXTtcbiAgICBpZiAodGhpcy5fY2xpZW50UGFnaW5nKSB7XG4gICAgICB0aGlzLmNoYW5nZVBhZ2UoMSk7XG4gICAgfVxuICAgIGlmIChub3RpZnlDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuc2V0QXR0cihhdHRycy5nbG9iYWxGaWx0ZXJTdHJpbmcsIHRleHQudHJpbSgpKTtcbiAgICB9XG4gIH1cblxuICBhZGRGaWx0ZXJEZWZpbml0aW9uKGNvbHVtbk5hbWUsIGZpbHRlckRlZmluaXRpb24pIHtcbiAgICBjb25zdCB0YWJsZUNvbHVtbiA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbihjb2x1bW5OYW1lKTtcbiAgICB0YWJsZUNvbHVtbiAmJiB0YWJsZUNvbHVtbi5hZGRGaWx0ZXJEZWZpbml0aW9uKGZpbHRlckRlZmluaXRpb24pO1xuICB9XG5cbiAgZ2V0RmlsdGVyZWRSZWNvcmRzKCkge1xuICAgIGxldCBmaWx0ZXJlZFJlY29yZHMgPSB0aGlzLl90YWJsZVJlY29yZHM7XG4gICAgaWYgKHRoaXMucmVzdHJpY3RlZElkKSB7XG4gICAgICBmaWx0ZXJlZFJlY29yZHMgPSBmaWx0ZXJlZFJlY29yZHMuZmlsdGVyKHJlY29yZCA9PiByZWNvcmQucmVjb3JkSWQgPT09IHRoaXMucmVzdHJpY3RlZElkKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2xvYmFsRmlsdGVyU3RyaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWx0ZXJlZFJlY29yZHMgPSBmaWx0ZXJlZFJlY29yZHMuZmlsdGVyKHJlY29yZCA9PiByZWNvcmQuaGFzUGF0dGVybih0aGlzLmdsb2JhbEZpbHRlclN0cmluZ3MsIHRoaXMuX3RhYmxlQ29sdW1uT2JqKSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmZpbHRlcikubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmlsdGVyKTtcbiAgICBpZiAoY29sdW1uRmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWx0ZXJlZFJlY29yZHMgPSBmaWx0ZXJlZFJlY29yZHMuZmlsdGVyKHJlY29yZCA9PiByZWNvcmQuaGFzQ29uZGl0aW9uKGNvbHVtbkZpbHRlcnMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkUmVjb3JkcztcbiAgfVxuXG4gIGdldENvbHVtbkZpbHRlcihjb2x1bW5OYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YWJsZUNvbHVtbiA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbihjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gdGFibGVDb2x1bW4/LmZpbHRlciA/PyBudWxsO1xuICB9XG5cbiAgYWRkQ29sdW1uRmlsdGVyKGNvbHVtbk5hbWU6IHN0cmluZywgY29sdW1uVmFsdWVzOiBhbnkgfCBhbnlbXSwgb3BlcmF0b3I6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmNvbHVtbkRlZmluaXRpb24oY29sdW1uTmFtZSk7XG4gICAgY29uc3QgY29sdW1uRmlsdGVyRGVmaW5pdGlvbiA9IHRhYmxlQ29sdW1uPy5maWx0ZXJEZWZpbml0aW9uID8/IG51bGw7XG4gICAgaWYgKCFjb2x1bW5GaWx0ZXJEZWZpbml0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRhYmxlQ29sdW1uICYmIHRhYmxlQ29sdW1uLmFkZEZpbHRlcihjb2x1bW5WYWx1ZXMsIG9wZXJhdG9yKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVSZWNvcmRzKCk7XG4gIH1cblxuICByZW1vdmVDb2x1bW5GaWx0ZXIoY29sdW1uTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmNvbHVtbkRlZmluaXRpb24oY29sdW1uTmFtZSk7XG4gICAgdGFibGVDb2x1bW4gJiYgdGFibGVDb2x1bW4ucmVtb3ZlRmlsdGVyKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlUmVjb3JkcygpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRGaWx0ZXIoKSB7XG4gICAgY29uc3QgY29tcGFjdEZpbHRlcjogYW55ID0ge1xuICAgICAgc2ltcGxlRmlsdGVyV29yZHM6IHRoaXMuZ2xvYmFsRmlsdGVyU3RyaW5ncyxcbiAgICAgIGFkdmFuY2VkRmlsdGVyOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmZpbHRlcikubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmlsdGVyKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29sdW1uRmlsdGVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNvbHVtbkZpbHRlciA9IGNvbHVtbkZpbHRlcnNbaW5kZXhdO1xuICAgICAgY29tcGFjdEZpbHRlci5hZHZhbmNlZEZpbHRlci5wdXNoKHtcbiAgICAgICAgZmllbGRDb2RlOiBjb2x1bW5GaWx0ZXI/LmZpZWxkQ29kZSxcbiAgICAgICAgb3BlcmF0b3I6IGNvbHVtbkZpbHRlcj8ub3BlcmF0b3IsXG4gICAgICAgIGZpZWxkVmFsdWUxOiBjb2x1bW5GaWx0ZXI/LnZhbHVlc1swXSxcbiAgICAgICAgZmllbGRWYWx1ZTI6IGNvbHVtbkZpbHRlcj8udmFsdWVzWzFdLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjb21wYWN0RmlsdGVyO1xuICB9XG5cbiAgLy8gT3JkZW5hbWllbnRvIGRlIHJlZ2lzdHJvcyBsb2NhbFxuXG4gIHNvcnQoY29sdW1uTmFtZSwgZGlyZWN0aW9uKSB7XG4gICAgdGhpcy5zZXRSZXF1aXJlZE9yZGVyKGNvbHVtbk5hbWUsIGRpcmVjdGlvbik7XG4gICAgaWYgKHRoaXMuX2NsaWVudFBhZ2luZykge1xuICAgICAgdGhpcy5sb2NhbFNvcnREYXRhKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ub3RpZnlHZXREYXRhQWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UmVxdWlyZWRPcmRlcihjb2x1bW5GaWVsZCwgZGlyZWN0aW9uID0gbnVsbCkge1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5zb3J0aW5nLCB7XG4gICAgICBjb2x1bW5OYW1lOiBjb2x1bW5GaWVsZCxcbiAgICAgIGRpcmVjdGlvbjogKGRpcmVjdGlvbiA9PT0gJ2FzY2VuZCcpID8gVEFCTEVfU09SVF9BU0NFTkRJTkcgOiBUQUJMRV9TT1JUX0RFU0NFTkRJTkcsXG4gICAgfSk7XG4gIH1cblxuICBsb2NhbFNvcnREYXRhKCkge1xuICAgIGlmICghdGhpcy5fc29ydGluZy5jb2x1bW5OYW1lIHx8ICF0aGlzLl9zb3J0aW5nLmRpcmVjdGlvbikgeyByZXR1cm47IH1cbiAgICB0aGlzLl90YWJsZVJlY29yZHMuc29ydCgoYSwgYikgPT4gdGhpcy5yZWNvcmRDb21wYXJlKGEsIGIsIHRoaXMuX3NvcnRpbmcuY29sdW1uTmFtZSwgdGhpcy5fc29ydGluZy5kaXJlY3Rpb24pKTtcbiAgICAvL3RoaXMudW5TZWxlY3RBbGwoKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVSZWNvcmRzKCk7XG4gIH1cblxuICByZWNvcmRDb21wYXJlKHJlY29yZEE6IFRhYmxlUmVjb3JkRGF0YSwgcmVjb3JkQjogVGFibGVSZWNvcmREYXRhLCBjb2x1bW5Db21wYXJlLCBkaXJlY3Rpb24pIHtcbiAgICBjb25zdCByZWNvcmRBVmFsdWUgPSByZWNvcmRBLmdldEZpZWxkVmFsdWUoY29sdW1uQ29tcGFyZSk7XG4gICAgY29uc3QgcmVjb3JkQlZhbHVlID0gcmVjb3JkQi5nZXRGaWVsZFZhbHVlKGNvbHVtbkNvbXBhcmUpO1xuICAgIGNvbnN0IHJlY29yZEFDb2x1bW4gPSBpc05hTihyZWNvcmRBVmFsdWUpID8gcmVjb3JkQVZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiArcmVjb3JkQVZhbHVlO1xuICAgIGNvbnN0IHJlY29yZEJDb2x1bW4gPSBpc05hTihyZWNvcmRCVmFsdWUpID8gcmVjb3JkQlZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiArcmVjb3JkQlZhbHVlO1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGlmIChyZWNvcmRBQ29sdW1uIDwgcmVjb3JkQkNvbHVtbikge1xuICAgICAgcmVzdWx0ID0gLTE7XG4gICAgfSBlbHNlIGlmIChyZWNvcmRBQ29sdW1uID4gcmVjb3JkQkNvbHVtbikge1xuICAgICAgcmVzdWx0ID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gVEFCTEVfU09SVF9BU0NFTkRJTkcgPyByZXN1bHQgOiAtcmVzdWx0O1xuICB9XG5cbiAgb3ZlcnJpZGUgZm9ybVN0YXRlQ2hhbmdlQ3VzdG9tU3Vic2NyaWJlKGZvcm0sIGZvcm1DaGFuZ2VTdWJqZWN0KSB7XG4gICAgdGhpcy5fY29sdW1ucz8uZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgY29sdW1uPy5jb25uZWN0V2l0aFBhcmVudEZvcm0oZm9ybSwgZm9ybUNoYW5nZVN1YmplY3QpO1xuICAgIH0pO1xuICAgIHRoaXMuX2FjdGlvbnM/LmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgIGFjdGlvbj8uY29ubmVjdFdpdGhQYXJlbnRGb3JtKGZvcm0sIGZvcm1DaGFuZ2VTdWJqZWN0KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|