tuain-ng-forms-lib 14.0.0 → 14.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/.browserslistrc +16 -0
  2. package/.yarn/cache/nanoid-npm-4.0.0-924f5c6312-7d5946df5c.zip +0 -0
  3. package/.yarn/cache/tslib-npm-2.4.0-9cb6dc5030-8c4aa6a3c5.zip +0 -0
  4. package/.yarn/cache/yn-npm-5.0.0-b001dab23c-f0ec7710d3.zip +0 -0
  5. package/.yarn/install-state.gz +0 -0
  6. package/karma.conf.js +44 -0
  7. package/ng-package.json +11 -0
  8. package/package.json +2 -22
  9. package/src/lib/classes/forms/action.ts +55 -0
  10. package/src/lib/classes/forms/element.ts +98 -0
  11. package/src/lib/classes/forms/field.ts +408 -0
  12. package/src/lib/classes/forms/form.constants.ts +28 -0
  13. package/src/lib/classes/forms/form.ts +495 -0
  14. package/src/lib/classes/forms/section.ts +154 -0
  15. package/src/lib/classes/forms/subsection.ts +91 -0
  16. package/src/lib/classes/forms/table/action.ts +41 -0
  17. package/src/lib/classes/forms/table/column.ts +91 -0
  18. package/src/lib/classes/forms/table/row-data.ts +118 -0
  19. package/src/lib/classes/forms/table/table.ts +438 -0
  20. package/src/lib/components/elements/action.component.ts +53 -0
  21. package/src/lib/components/elements/field.component.ts +118 -0
  22. package/src/lib/components/elements/layout/element.component.ts +28 -0
  23. package/src/lib/components/elements/layout/form-error.component.ts +11 -0
  24. package/src/lib/components/elements/layout/form-header.component.ts +17 -0
  25. package/src/lib/components/elements/layout/section.component.ts +16 -0
  26. package/src/lib/components/elements/layout/sub-section.component.ts +17 -0
  27. package/src/lib/components/elements/tables/table-record-action.component.ts +37 -0
  28. package/src/lib/components/elements/tables/table-record-field.component.ts +19 -0
  29. package/src/lib/components/elements/tables/table.component.ts +102 -0
  30. package/src/lib/components/forms/basic-form.ts +1496 -0
  31. package/src/lib/services/event-manager.service.ts +21 -0
  32. package/src/lib/services/file-manager.service.ts +6 -0
  33. package/src/lib/services/form-manager.service.ts +89 -0
  34. package/src/lib/services/icon-dictionary.service.ts +159 -0
  35. package/src/lib/tuain-ng-forms-lib.module.ts +40 -0
  36. package/{public-api.d.ts → src/public-api.ts} +5 -0
  37. package/src/test.ts +27 -0
  38. package/tsconfig.lib.json +15 -0
  39. package/tsconfig.lib.prod.json +10 -0
  40. package/tsconfig.spec.json +17 -0
  41. package/esm2020/lib/classes/forms/action.mjs +0 -35
  42. package/esm2020/lib/classes/forms/element.mjs +0 -76
  43. package/esm2020/lib/classes/forms/field.mjs +0 -321
  44. package/esm2020/lib/classes/forms/form.constants.mjs +0 -26
  45. package/esm2020/lib/classes/forms/form.mjs +0 -422
  46. package/esm2020/lib/classes/forms/section.mjs +0 -132
  47. package/esm2020/lib/classes/forms/subsection.mjs +0 -70
  48. package/esm2020/lib/classes/forms/table/action.mjs +0 -22
  49. package/esm2020/lib/classes/forms/table/column.mjs +0 -61
  50. package/esm2020/lib/classes/forms/table/row-data.mjs +0 -111
  51. package/esm2020/lib/classes/forms/table/table.mjs +0 -372
  52. package/esm2020/lib/components/elements/action.component.mjs +0 -58
  53. package/esm2020/lib/components/elements/field.component.mjs +0 -90
  54. package/esm2020/lib/components/elements/layout/element.component.mjs +0 -31
  55. package/esm2020/lib/components/elements/layout/form-error.component.mjs +0 -20
  56. package/esm2020/lib/components/elements/layout/form-header.component.mjs +0 -30
  57. package/esm2020/lib/components/elements/layout/section.component.mjs +0 -22
  58. package/esm2020/lib/components/elements/layout/sub-section.component.mjs +0 -24
  59. package/esm2020/lib/components/elements/tables/table-record-action.component.mjs +0 -40
  60. package/esm2020/lib/components/elements/tables/table-record-field.component.mjs +0 -25
  61. package/esm2020/lib/components/elements/tables/table.component.mjs +0 -95
  62. package/esm2020/lib/components/forms/basic-form.mjs +0 -1425
  63. package/esm2020/lib/services/event-manager.service.mjs +0 -18
  64. package/esm2020/lib/services/file-manager.service.mjs +0 -6
  65. package/esm2020/lib/services/form-manager.service.mjs +0 -80
  66. package/esm2020/lib/tuain-ng-forms-lib.module.mjs +0 -71
  67. package/esm2020/public-api.mjs +0 -19
  68. package/esm2020/tuain-ng-forms-lib.mjs +0 -5
  69. package/fesm2015/tuain-ng-forms-lib.mjs +0 -3803
  70. package/fesm2015/tuain-ng-forms-lib.mjs.map +0 -1
  71. package/fesm2020/tuain-ng-forms-lib.mjs +0 -3634
  72. package/fesm2020/tuain-ng-forms-lib.mjs.map +0 -1
  73. package/lib/classes/forms/action.d.ts +0 -22
  74. package/lib/classes/forms/element.d.ts +0 -41
  75. package/lib/classes/forms/field.d.ts +0 -109
  76. package/lib/classes/forms/form.constants.d.ts +0 -25
  77. package/lib/classes/forms/form.d.ts +0 -134
  78. package/lib/classes/forms/section.d.ts +0 -39
  79. package/lib/classes/forms/subsection.d.ts +0 -26
  80. package/lib/classes/forms/table/action.d.ts +0 -20
  81. package/lib/classes/forms/table/column.d.ts +0 -33
  82. package/lib/classes/forms/table/row-data.d.ts +0 -14
  83. package/lib/classes/forms/table/table.d.ts +0 -100
  84. package/lib/components/elements/action.component.d.ts +0 -21
  85. package/lib/components/elements/field.component.d.ts +0 -43
  86. package/lib/components/elements/layout/element.component.d.ts +0 -14
  87. package/lib/components/elements/layout/form-error.component.d.ts +0 -8
  88. package/lib/components/elements/layout/form-header.component.d.ts +0 -12
  89. package/lib/components/elements/layout/section.component.d.ts +0 -10
  90. package/lib/components/elements/layout/sub-section.component.d.ts +0 -11
  91. package/lib/components/elements/tables/table-record-action.component.d.ts +0 -15
  92. package/lib/components/elements/tables/table-record-field.component.d.ts +0 -11
  93. package/lib/components/elements/tables/table.component.d.ts +0 -47
  94. package/lib/components/forms/basic-form.d.ts +0 -307
  95. package/lib/services/event-manager.service.d.ts +0 -9
  96. package/lib/services/file-manager.service.d.ts +0 -5
  97. package/lib/services/form-manager.service.d.ts +0 -28
  98. package/lib/tuain-ng-forms-lib.module.d.ts +0 -20
  99. package/tuain-ng-forms-lib.d.ts +0 -5
@@ -1,422 +0,0 @@
1
- import { FormAction } from './action';
2
- import { FieldDescriptor } from './field';
3
- import { RecordTable } from './table/table';
4
- import { RecordFormSection } from './section';
5
- import { NO_ERROR } from './form.constants';
6
- const ACTIVE = 'active';
7
- const SHOW = 'show';
8
- const HIDE = 'hide';
9
- const ENABLE = 'enable';
10
- const DISABLE = 'disable';
11
- const CLEAN = 'clean';
12
- export class FormStructureAndData {
13
- constructor(definitionReceived, formConfig) {
14
- this._name = '';
15
- this._title = '';
16
- this._fields = {};
17
- this._actions = {};
18
- this._tables = {};
19
- this._sections = {};
20
- this._immutableData = {};
21
- this._extraInfo = {};
22
- this._exclusiveSectionsByAttr = {};
23
- this._formConfig = formConfig;
24
- this.state = '';
25
- this._actionArray = [];
26
- this._fieldArray = [];
27
- this._tableArray = [];
28
- this._sectionArray = [];
29
- this._stateFlow = {
30
- defaultState: '',
31
- states: [],
32
- transitions: [],
33
- };
34
- if (!definitionReceived) {
35
- return;
36
- }
37
- this._name = (definitionReceived.form && definitionReceived.form.formCode)
38
- ? definitionReceived.form.formCode : this._name;
39
- this._title = (definitionReceived.form && definitionReceived.form.formTitle)
40
- ? definitionReceived.form.formTitle : '';
41
- this.setStateFlow(definitionReceived?.states, definitionReceived?.transitions, definitionReceived?.defaultState);
42
- this.immutableData = definitionReceived.immutableData;
43
- this.extraInfo = definitionReceived.extraInfo;
44
- if (definitionReceived.actions) {
45
- const formActions = definitionReceived.actions.map(objDef => {
46
- let visibleStates = objDef.visibleStates;
47
- let enabledStates = objDef.enabledStates;
48
- if (!visibleStates) {
49
- visibleStates = (objDef.actionModes || '').split(',')
50
- .map(state => state.trim())
51
- .filter(state => state.length > 0) || [];
52
- enabledStates = [...visibleStates];
53
- }
54
- return { ...objDef, visibleStates, enabledStates };
55
- });
56
- for (const actionReceived of formActions) {
57
- const globalAction = new FormAction(actionReceived, this._formConfig);
58
- const globalActionCode = globalAction.actionCode;
59
- if (globalActionCode) {
60
- this._actionArray.push(globalAction);
61
- this._actions[globalActionCode] = globalAction;
62
- }
63
- }
64
- }
65
- if (definitionReceived.fields) {
66
- const formFields = definitionReceived.fields.map(objDef => {
67
- let visibleStates = objDef.visibleStates;
68
- let enabledStates = objDef.enabledStates || objDef.editableStates;
69
- if (!visibleStates) {
70
- visibleStates = (objDef.fieldModes || '').split(',')
71
- .map(state => state.trim())
72
- .filter(state => state.length > 0) || [];
73
- enabledStates = [...visibleStates];
74
- }
75
- return { ...objDef, visibleStates, enabledStates };
76
- });
77
- for (const fieldReceived of formFields) {
78
- const fieldToAdd = new FieldDescriptor(fieldReceived, this._formConfig);
79
- const fieldCode = fieldToAdd.fieldCode;
80
- if (fieldCode) {
81
- this._fieldArray.push(fieldToAdd);
82
- this._fields[fieldCode] = fieldToAdd;
83
- }
84
- }
85
- }
86
- if (definitionReceived.tables) {
87
- const tables = definitionReceived.tables.map(objDef => {
88
- let visibleStates = objDef.visibleStates;
89
- let enabledStates = objDef.enabledStates || objDef.editableStates;
90
- if (!visibleStates) {
91
- visibleStates = (objDef.tableModes || '').split(',')
92
- .map(state => state.trim())
93
- .filter(state => state.length > 0) || [];
94
- enabledStates = [...visibleStates];
95
- }
96
- if (!visibleStates || visibleStates.length === 0) {
97
- visibleStates = this._formConfig.defaultStateFlow.states;
98
- }
99
- return { ...objDef, visibleStates, enabledStates };
100
- });
101
- for (const tableReceived of tables) {
102
- const tableToAdd = new RecordTable(tableReceived, this._formConfig);
103
- const tableCode = tableToAdd.tableCode;
104
- if (tableCode) {
105
- this._tableArray.push(tableToAdd);
106
- this._tables[tableCode] = tableToAdd;
107
- }
108
- }
109
- }
110
- if (definitionReceived.sections) {
111
- const formSections = definitionReceived.sections.map(objDef => {
112
- let visibleStates = objDef.visibleStates;
113
- if (!visibleStates) {
114
- visibleStates = (objDef.sectionModes || '').split(',')
115
- .map(state => state.trim())
116
- .filter(state => state.length > 0) || [];
117
- }
118
- return { ...objDef, visibleStates };
119
- });
120
- for (const sectionReceived of formSections) {
121
- const sectionToAdd = new RecordFormSection(sectionReceived, this);
122
- const sectionCode = sectionToAdd.sectionCode;
123
- if (sectionCode) {
124
- this._sectionArray.push(sectionToAdd);
125
- this._sections[sectionCode] = sectionToAdd;
126
- }
127
- }
128
- }
129
- }
130
- getTitle() { return this._title; }
131
- setTitle(title) { this._title = title; }
132
- get name() { return this._name; }
133
- set name(name) { this._name = name; }
134
- // Estados
135
- get defaultState() { return this._stateFlow.defaultState; }
136
- supportState(state) { return this._stateFlow.states?.includes(state); }
137
- supportMode(state) { return this.supportState(state); }
138
- get states() { return this._stateFlow.states; }
139
- getCurrentState() { return this.state; }
140
- changeState(newState) {
141
- if (!newState || !this.supportState(newState)) {
142
- return false;
143
- }
144
- if (!this.state) {
145
- this.state = newState;
146
- }
147
- else {
148
- const transitionToChange = this._stateFlow.transitions.find(trns => trns.source === this.state && trns.destination === newState);
149
- if (transitionToChange) {
150
- this.state = newState;
151
- }
152
- }
153
- return (this.state === newState);
154
- }
155
- setStateFlow(states, transitions, defaultState) {
156
- if (!states || !transitions) {
157
- this._stateFlow = JSON.parse(JSON.stringify(this._formConfig.defaultStateFlow));
158
- return;
159
- }
160
- this._stateFlow.states = states;
161
- this._stateFlow.defaultState = defaultState || this._stateFlow.states[0];
162
- this._stateFlow.transitions = transitions.map(transition => {
163
- const name = transition.name;
164
- const source = (this._stateFlow.states.includes(transition.source)) ? transition.source : '';
165
- const destination = (this._stateFlow.states.includes(transition.destination)) ? transition.destination : '';
166
- return { name, source, destination };
167
- }).filter(item => item.name && item.source && item.destination);
168
- }
169
- // immutable Data
170
- getImmutableElement(name) { return this._immutableData?.[name]?.value ?? null; }
171
- set immutableData(immutableData) { Object.assign(this._immutableData, immutableData); }
172
- get immutableData() { return JSON.parse(JSON.stringify(this._immutableData)); }
173
- // extra Info
174
- getExtraInfo(name) { return this._extraInfo?.[name]?.value ?? null; }
175
- set extraInfo(extraInfo) { Object.assign(this._extraInfo, extraInfo); }
176
- get extraInfo() { return JSON.parse(JSON.stringify(this._extraInfo)); }
177
- // Fields
178
- get fields() { return this._fields; }
179
- get fieldNames() { return this.getFieldNames(); }
180
- getFields() { return this._fieldArray; }
181
- getFieldNames() { return this._fieldArray.map(field => field.fieldCode); }
182
- getField(code) { return (code && this._fields?.[code]) ? this._fields[code] : null; }
183
- enableField(code) { this.getField(code)?.enable(); }
184
- disableField(code) { this.getField(code)?.disable(); }
185
- getFieldValue(code) { return this.getField(code)?.getValue(); }
186
- getFieldOptionText(code) { return this.getField(code)?.getOptionText(); }
187
- getFieldOptions(code) { return this.getField(code)?.getFieldOptions() ?? null; }
188
- setFieldValue(code, value) { this.getField(code)?.setValue(value); }
189
- setFieldError(code, errorCode, message, type = 'error') { this.getField(code)?.setError(errorCode, message, type); }
190
- setFieldIntrinsicErrorMessage(code, message) { this.getField(code)?.setIntrinsicErrorMessage(message); }
191
- setFieldRequired(code, required) { this.getField(code)?.setRequired(required); }
192
- setFieldErrorMessage(code, message) { this.getField(code)?.setErrorMessage(message); }
193
- setFieldOptions(code, optionsArray, idAttribute, nameAttribute) {
194
- const field = this.getField(code);
195
- if (field && optionsArray?.length > 0) {
196
- const fieldOptions = optionsArray.map(item => ({
197
- fieldOptionId: item[idAttribute],
198
- fieldOptionValue: item[nameAttribute]
199
- }));
200
- field.setFieldOptions(fieldOptions);
201
- }
202
- }
203
- getFieldSet(filter, inputCodes, secCode, subCode) {
204
- let codes = [];
205
- if (typeof inputCodes === 'string' && inputCodes) {
206
- codes = [inputCodes];
207
- }
208
- else if (Array.isArray(inputCodes) && inputCodes.length > 0) {
209
- codes = inputCodes ?? [];
210
- }
211
- else if (secCode && !subCode) {
212
- codes = this.getSection(secCode)?.getFieldNames() ?? [];
213
- }
214
- else if (secCode && subCode) {
215
- codes = this.getSubSection(secCode, subCode)?.getFieldNames() ?? [];
216
- }
217
- else {
218
- codes = this.getFieldNames() ?? [];
219
- }
220
- return (filter) ? codes.filter(fld => filter(this.getField(fld))) : codes;
221
- }
222
- applyOnFields(processFunc, inputCodes, secCode, subCode) {
223
- if (!processFunc) {
224
- return 0;
225
- }
226
- const codes = this.getFieldSet(null, inputCodes ?? null, secCode, subCode);
227
- let processedFields = 0;
228
- for (const code of codes) {
229
- const field = this.getField(code);
230
- if (field) {
231
- try {
232
- processFunc(field);
233
- processedFields += 1;
234
- }
235
- catch (e) {
236
- console.log(`Error procesando funcion en campo ${field}: ${e}`);
237
- }
238
- }
239
- }
240
- return processedFields;
241
- }
242
- enableFields(codes, secCode, subCode) {
243
- return this.applyOnFields(fld => fld.enable(), codes, secCode, subCode);
244
- }
245
- showFields(codes, secCode, subCode) {
246
- return this.applyOnFields(fld => fld.show(), codes, secCode, subCode);
247
- }
248
- hideFields(codes, secCode, subCode) {
249
- return this.applyOnFields(fld => fld.hide(), codes, secCode, subCode);
250
- }
251
- showLabelFields(codes, secCode, subCode) {
252
- return this.applyOnFields(fld => fld.showLablel(), codes, secCode, subCode);
253
- }
254
- hideLabelFields(codes, secCode, subCode) {
255
- return this.applyOnFields(fld => fld.hideLabel(), codes, secCode, subCode);
256
- }
257
- disableFields(codes, secCode, subCode) {
258
- return this.applyOnFields(fld => fld.disable(), codes, secCode, subCode);
259
- }
260
- cleanFields(codes, secCode, subCode) {
261
- return this.applyOnFields(fld => fld.clean(), codes, secCode, subCode);
262
- }
263
- tagFieldsWithError(message, codes, secCode, subCode) {
264
- return this.applyOnFields(fld => fld.setErrorMessage(message), codes, secCode, subCode);
265
- }
266
- cleanErrorFields(codes, secCode, subCode) {
267
- return this.tagFieldsWithError('', codes, secCode, subCode);
268
- }
269
- tagEmptyRequiredFields(message, codes = null, secCode, subCode) {
270
- return this.tagFieldsWithError(message, this.getRequiredEmptyFields(codes, secCode, subCode)) > 0;
271
- }
272
- getRequiredFields(codes, secCode, subCode) {
273
- return this.getFieldSet(fld => fld.required, codes ?? null, secCode, subCode);
274
- }
275
- getRequiredEmptyFields(codes, secCode, subCode) {
276
- return this.getFieldSet(fld => fld.required && fld.empty, codes ?? null, secCode, subCode);
277
- }
278
- getChangedFields(codes, secCode, subCode) {
279
- return this.getFieldSet(fld => !fld.outputOnly && fld.hasChanged(), codes ?? null, secCode, subCode);
280
- }
281
- getFieldsWithValidationIssues(codes, secCode, subCode) {
282
- return this.getFieldSet(fld => fld.errorCode !== NO_ERROR, codes ?? null, secCode, subCode);
283
- }
284
- getFieldsValues(inputCodes, secCode, subCode) {
285
- const codes = this.getFieldSet(null, inputCodes ?? null, secCode, subCode);
286
- const resultObject = {};
287
- for (let index = 0; index < codes.length; index++) {
288
- const code = codes[index];
289
- if (code) {
290
- resultObject[code] = this._fields?.[code]?.getValue() ?? null;
291
- }
292
- }
293
- return resultObject;
294
- }
295
- // Acciones
296
- get actions() { return this._actions; }
297
- getActionsByAttribute(name, value) { return this._actionArray.filter(actionItem => actionItem.matchAttribute(name, value)); }
298
- getActions() { return this._actionArray; }
299
- getAction(code) { return (code && this._actions?.[code]) ? this._actions[code] : null; }
300
- showActions(codes) { return this.execOnActions(codes, SHOW); }
301
- hideActions(codes) { return this.execOnActions(codes, HIDE); }
302
- enableActions(codes) { return this.execOnActions(codes, ENABLE); }
303
- disableActions(codes) { return this.execOnActions(codes, DISABLE); }
304
- execOnActions(codes, functionName) {
305
- const actionCodes = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
306
- if (!functionName || actionCodes.length === 0) {
307
- return;
308
- }
309
- actionCodes.forEach(code => {
310
- const action = this.getAction(code);
311
- action?.[functionName]?.();
312
- });
313
- }
314
- // Tablas
315
- get tables() { return this.tables; }
316
- getTables() { return this._tableArray; }
317
- getTable(code) { return (code && this._tables?.[code]) ? this._tables[code] : null; }
318
- getTableRecord(code, id) { return this.getTable(code)?.getTableRecord(id); }
319
- enableTables(codes) { return this.execOnTables(codes, ENABLE); }
320
- disableTables(codes) { return this.execOnTables(codes, DISABLE); }
321
- showTables(codes) { return this.execOnTables(codes, SHOW); }
322
- hideTables(codes) { return this.execOnTables(codes, HIDE); }
323
- cleanTables(codes) { return this.execOnTables(codes, CLEAN); }
324
- execOnTables(codes, functionName) {
325
- const tableCodes = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
326
- if (!functionName || tableCodes.length === 0) {
327
- return;
328
- }
329
- tableCodes.forEach(code => {
330
- const table = this.getTable(code);
331
- table?.[functionName]?.();
332
- });
333
- }
334
- // Secciones
335
- get sections() { return this._sections; }
336
- getSections() { return this._sectionArray; }
337
- getSectionsByAttribute(name, value) { return this._sectionArray.filter(item => item.matchAttribute(name, value)); }
338
- get sectionTitles() { return this._sectionArray.map(formSection => formSection.sectionTitle); }
339
- get visibleSections() { return this._sectionArray.filter(sec => sec.visible); }
340
- getSection(code) { return (code && this._sections?.[code]) ? this._sections[code] : null; }
341
- showSections(codes) { this.execOnSections(codes, SHOW); }
342
- hideSections(codes) { this.execOnSections(codes, HIDE); }
343
- activeSection() { return this._exclusiveSectionsByAttr[ACTIVE]; }
344
- getSubSection(code, subCode) { return this.getSection(code)?.getSubsection(subCode) ?? null; }
345
- showSubSections(code, subCodes) { return this.execOnSubSections(code, subCodes, SHOW); }
346
- hideSubSections(code, subCodes) { return this.execOnSubSections(code, subCodes, HIDE); }
347
- getSectionActions(code) { return this.getSection(code)?.getActions() ?? null; }
348
- getSectionActionNames(code) { return this.getSection(code)?.getActionNames() ?? null; }
349
- activateSection(code) {
350
- if (code === this._exclusiveSectionsByAttr[ACTIVE]) {
351
- return;
352
- }
353
- this.getSection(this.activeSection())?.inactivate();
354
- this.getSection(code)?.activate();
355
- this._exclusiveSectionsByAttr[ACTIVE] = code;
356
- }
357
- execOnSections(codes, functionName) {
358
- const sectionCodes = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
359
- if (!functionName || sectionCodes.length === 0) {
360
- return;
361
- }
362
- sectionCodes.forEach(code => {
363
- const section = this.getSection(code);
364
- section?.[functionName]?.();
365
- });
366
- }
367
- execOnSubSections(code, subNames, functionName) {
368
- const subCodes = (Array.isArray(subNames)) ? subNames : (subNames ? [subNames] : []);
369
- const section = this.getSection(code);
370
- if (!functionName || !section || subCodes.length === 0) {
371
- return;
372
- }
373
- for (const subCode of subCodes) {
374
- const subSection = this.getSubSection(code, subCode);
375
- subSection?.[functionName]?.();
376
- }
377
- }
378
- /**
379
- * Métodos propios de gestión del formulario
380
- */
381
- cleanData() {
382
- for (const field of this._fieldArray) {
383
- field.setValue(field.defaultValue);
384
- }
385
- for (const table of this._tableArray) {
386
- table.clean();
387
- }
388
- }
389
- getPayload() {
390
- const formData = {
391
- fields: [],
392
- tables: [],
393
- };
394
- formData.fields = this.getFields().filter(fld => !fld.outputOnly)
395
- .map(fld => {
396
- const fieldPayload = {
397
- fieldCode: fld.fieldCode,
398
- fieldValue: fld.getValue(),
399
- editable: !fld.disabled,
400
- visible: fld.visible,
401
- required: fld.required,
402
- fieldOptions: '',
403
- };
404
- return fieldPayload;
405
- });
406
- formData.tables = this.getTables().map(tbl => {
407
- const tablePayload = {
408
- tableCode: tbl.tableCode,
409
- visible: tbl.visible,
410
- currentPage: tbl.currentPage,
411
- requestedPage: tbl.requestedPage,
412
- recordsPerPage: tbl.recordsPerPage,
413
- currentFilter: tbl.currentFilter,
414
- sortingColumn: tbl.sorting.columnName,
415
- sortingDirection: tbl.sorting.direction,
416
- };
417
- return tablePayload;
418
- });
419
- return formData;
420
- }
421
- }
422
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NsYXNzZXMvZm9ybXMvZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQWUsTUFBTSxTQUFTLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFOUMsT0FBTyxFQUFFLFFBQVEsRUFBVSxNQUFNLGtCQUFrQixDQUFDO0FBR3BELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUN4QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7QUFDcEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQ3BCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUN4QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBc0N0QixNQUFNLE9BQU8sb0JBQW9CO0lBa0IvQixZQUFZLGtCQUFrQixFQUFFLFVBQVU7UUFoQjFDLFVBQUssR0FBVyxFQUFFLENBQUM7UUFFWCxXQUFNLEdBQVcsRUFBRSxDQUFDO1FBR3BCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFFYixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWQsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLDZCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUdwQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLFlBQVksRUFBRSxFQUFFO1lBQ2hCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztRQUNGLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNwQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDeEUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUMzRSxrQkFBa0IsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQztRQUU5QyxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRTtZQUM5QixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUMxRCxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUN6QyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUNsQixhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7eUJBQ2xELEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzt5QkFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzNDLGFBQWEsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7aUJBQ3BDO2dCQUNELE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFLLE1BQU0sY0FBYyxJQUFJLFdBQVcsRUFBRTtnQkFDeEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxVQUFVLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUNqRCxJQUFJLGdCQUFnQixFQUFFO29CQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFlBQVksQ0FBQztpQkFDaEQ7YUFDRjtTQUNGO1FBRUQsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7WUFDN0IsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDeEQsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDekMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUNsRSxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUNsQixhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7eUJBQ2pELEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzt5QkFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzNDLGFBQWEsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7aUJBQ3BDO2dCQUNELE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFLLE1BQU0sYUFBYSxJQUFJLFVBQVUsRUFBRTtnQkFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDdkMsSUFBSSxTQUFTLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDO2lCQUN0QzthQUNGO1NBQ0Y7UUFFRCxJQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtZQUM3QixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNwRCxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUN6QyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxhQUFhLEVBQUU7b0JBQ2xCLGFBQWEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzt5QkFDakQsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO3lCQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDM0MsYUFBYSxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQztpQkFDcEM7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDaEQsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO2lCQUMxRDtnQkFDRCxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxNQUFNLGFBQWEsSUFBSSxNQUFNLEVBQUU7Z0JBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BFLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3ZDLElBQUksU0FBUyxFQUFFO29CQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztpQkFDdEM7YUFDRjtTQUNGO1FBRUQsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUU7WUFDL0IsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDNUQsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDekMsSUFBSSxDQUFDLGFBQWEsRUFBRTtvQkFDbEIsYUFBYSxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO3lCQUNuRCxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7eUJBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM1QztnQkFDRCxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFLLE1BQU0sZUFBZSxJQUFJLFlBQVksRUFBRTtnQkFDMUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2xFLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7Z0JBQzdDLElBQUksV0FBVyxFQUFFO29CQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQztpQkFDNUM7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELFFBQVEsS0FBYSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzFDLFFBQVEsQ0FBQyxLQUFhLElBQVUsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RELElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUVyQyxVQUFVO0lBQ1YsSUFBSSxZQUFZLEtBQWEsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDbkUsWUFBWSxDQUFDLEtBQWEsSUFBYSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEYsV0FBVyxDQUFDLEtBQWEsSUFBYSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksTUFBTSxLQUFZLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRXRELGVBQWUsS0FBYSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRWhELFdBQVcsQ0FBQyxRQUFnQjtRQUMxQixJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM3QyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztTQUN2QjthQUFNO1lBQ0wsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDakUsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDL0QsSUFBSSxrQkFBa0IsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7YUFDdkI7U0FDRjtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBTyxFQUFFLFdBQVksRUFBRSxZQUFxQjtRQUN2RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN6RCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQzdCLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0YsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsbUJBQW1CLENBQUMsSUFBWSxJQUFTLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdGLElBQUksYUFBYSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLElBQUksYUFBYSxLQUFVLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVwRixhQUFhO0lBQ2IsWUFBWSxDQUFDLElBQVksSUFBUyxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRixJQUFJLFNBQVMsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxJQUFJLFNBQVMsS0FBVSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFNUUsU0FBUztJQUNULElBQUksTUFBTSxLQUFVLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUMsSUFBSSxVQUFVLEtBQWUsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNELFNBQVMsS0FBd0IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMzRCxhQUFhLEtBQWUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEYsUUFBUSxDQUFDLElBQVksSUFBcUIsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5RyxXQUFXLENBQUMsSUFBWSxJQUFVLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLFlBQVksQ0FBQyxJQUFZLElBQVUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsYUFBYSxDQUFDLElBQVksSUFBUyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVFLGtCQUFrQixDQUFDLElBQVksSUFBUyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLGVBQWUsQ0FBQyxJQUFZLElBQW1CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZHLGFBQWEsQ0FBQyxJQUFZLEVBQUUsS0FBVSxJQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RixhQUFhLENBQUMsSUFBWSxFQUFFLFNBQWlCLEVBQUUsT0FBZSxFQUFFLE9BQWUsT0FBTyxJQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pKLDZCQUE2QixDQUFDLElBQVksRUFBRSxPQUFlLElBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0gsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLFFBQWlCLElBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RHLG9CQUFvQixDQUFDLElBQVksRUFBRSxPQUFlLElBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTNHLGVBQWUsQ0FBQyxJQUFZLEVBQUUsWUFBbUIsRUFBRSxXQUFtQixFQUFFLGFBQXFCO1FBQzNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUNoQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQ3RDLENBQUMsQ0FBQyxDQUFDO1lBQ0osS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQW9DLEVBQUUsT0FBdUIsRUFBRSxPQUF1QjtRQUN4RyxJQUFJLEtBQUssR0FBVSxFQUFFLENBQUM7UUFDdEIsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxFQUFFO1lBQ2hELEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdELEtBQUssR0FBRyxVQUFVLElBQUksRUFBRSxDQUFDO1NBQzFCO2FBQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDOUIsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3pEO2FBQU0sSUFBSSxPQUFPLElBQUksT0FBTyxFQUFFO1lBQzdCLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDckU7YUFBTTtZQUNMLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDNUUsQ0FBQztJQUVELGFBQWEsQ0FBQyxXQUFXLEVBQUUsVUFBcUMsRUFBRSxPQUFnQixFQUFFLE9BQWdCO1FBQ2xHLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPLENBQUMsQ0FBQztTQUFFO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNFLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztRQUN4QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUk7b0JBQ0YsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNuQixlQUFlLElBQUksQ0FBQyxDQUFDO2lCQUN0QjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDVixPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDakU7YUFDRjtTQUNGO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDL0UsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDN0UsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDN0UsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDbEYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDbEYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDaEYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDOUUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGtCQUFrQixDQUFDLE9BQWUsRUFBRSxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDdEcsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDbkYsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELHNCQUFzQixDQUFDLE9BQWUsRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDdEYsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFnQyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0I7UUFDcEYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsc0JBQXNCLENBQUMsS0FBZ0MsRUFBRSxPQUFnQixFQUFFLE9BQWdCO1FBQ3pGLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBZ0MsRUFBRSxPQUFnQixFQUFFLE9BQWdCO1FBQ25GLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkcsQ0FBQztJQUVELDZCQUE2QixDQUFDLEtBQWdDLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQjtRQUNoRyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsZUFBZSxDQUFDLFVBQXFDLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQjtRQUN2RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRSxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDeEIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDakQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksSUFBSSxFQUFFO2dCQUNSLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDO2FBQy9EO1NBQ0Y7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztJQUNYLElBQUksT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFdkMscUJBQXFCLENBQUMsSUFBWSxFQUFFLEtBQUssSUFBa0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25KLFVBQVUsS0FBbUIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN4RCxTQUFTLENBQUMsSUFBWSxJQUFnQixPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVHLFdBQVcsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLFdBQVcsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLGFBQWEsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNGLGNBQWMsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdGLGFBQWEsQ0FBQyxLQUErQixFQUFFLFlBQW9CO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsWUFBWSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzFELFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUztJQUNULElBQUksTUFBTSxLQUFVLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDekMsU0FBUyxLQUFvQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELFFBQVEsQ0FBQyxJQUFZLElBQWlCLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUcsY0FBYyxDQUFDLElBQVksRUFBRSxFQUFVLElBQXFCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRTVHLFlBQVksQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLGFBQWEsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNGLFVBQVUsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLFVBQVUsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLFdBQVcsQ0FBQyxLQUF3QixJQUFVLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXZGLFlBQVksQ0FBQyxLQUErQixFQUFFLFlBQW9CO1FBQ2hFLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsWUFBWSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3pELFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWTtJQUNaLElBQUksUUFBUSxLQUFVLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsV0FBVyxLQUEwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLElBQXlCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4SSxJQUFJLGFBQWEsS0FBZSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RyxJQUFJLGVBQWUsS0FBMEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEcsVUFBVSxDQUFDLElBQVksSUFBdUIsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0SCxZQUFZLENBQUMsS0FBd0IsSUFBVSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEYsWUFBWSxDQUFDLEtBQXdCLElBQVUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLGFBQWEsS0FBYSxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsYUFBYSxDQUFDLElBQVksRUFBRSxPQUFPLElBQTBCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1SCxlQUFlLENBQUMsSUFBWSxFQUFFLFFBQTJCLElBQVUsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekgsZUFBZSxDQUFDLElBQVksRUFBRSxRQUEyQixJQUFVLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pILGlCQUFpQixDQUFDLElBQUksSUFBa0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0YscUJBQXFCLENBQUMsSUFBSSxJQUFjLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRWpHLGVBQWUsQ0FBQyxJQUFZO1FBQzFCLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQStCLEVBQUUsWUFBb0I7UUFDbEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDM0QsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsUUFBa0MsRUFBRSxZQUFvQjtRQUN0RixNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ25FLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1lBQzlCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUVILFNBQVM7UUFDUCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEM7UUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLE1BQU0sUUFBUSxHQUFnQjtZQUM1QixNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUNGLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQzthQUM5RCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDVCxNQUFNLFlBQVksR0FBaUI7Z0JBQ2pDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztnQkFDeEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Z0JBQzFCLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRO2dCQUN2QixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87Z0JBQ3BCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtnQkFDdEIsWUFBWSxFQUFFLEVBQUU7YUFDakIsQ0FBQTtZQUNELE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUwsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzNDLE1BQU0sWUFBWSxHQUFpQjtnQkFDakMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO2dCQUN4QixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87Z0JBQ3BCLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztnQkFDNUIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhO2dCQUNoQyxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7Z0JBQ2xDLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYTtnQkFDaEMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVTtnQkFDckMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTO2FBQ3hDLENBQUM7WUFDRixPQUFPLFlBQVksQ0FBQTtRQUNyQixDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1BY3Rpb24gfSBmcm9tICcuL2FjdGlvbic7XG5pbXBvcnQgeyBGaWVsZERlc2NyaXB0b3IsIEZpZWxkT3B0aW9uIH0gZnJvbSAnLi9maWVsZCc7XG5pbXBvcnQgeyBSZWNvcmRUYWJsZSB9IGZyb20gJy4vdGFibGUvdGFibGUnO1xuaW1wb3J0IHsgUmVjb3JkRm9ybVNlY3Rpb24gfSBmcm9tICcuL3NlY3Rpb24nO1xuaW1wb3J0IHsgUmVjb3JkRm9ybVN1YlNlY3Rpb24gfSBmcm9tICcuL3N1YnNlY3Rpb24nO1xuaW1wb3J0IHsgTk9fRVJST1IsIEhFQURFUiB9IGZyb20gJy4vZm9ybS5jb25zdGFudHMnO1xuaW1wb3J0IHsgVGFibGVSZWNvcmREYXRhIH0gZnJvbSAnLi90YWJsZS9yb3ctZGF0YSc7XG5cbmNvbnN0IEFDVElWRSA9ICdhY3RpdmUnO1xuY29uc3QgU0hPVyA9ICdzaG93JztcbmNvbnN0IEhJREUgPSAnaGlkZSc7XG5jb25zdCBFTkFCTEUgPSAnZW5hYmxlJztcbmNvbnN0IERJU0FCTEUgPSAnZGlzYWJsZSc7XG5jb25zdCBDTEVBTiA9ICdjbGVhbic7XG5pbnRlcmZhY2UgVHJhbnNpdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG4gIGRlc3RpbmF0aW9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdGF0ZUZsb3cge1xuICBkZWZhdWx0U3RhdGU6IHN0cmluZztcbiAgc3RhdGVzOiBzdHJpbmdbXTtcbiAgdHJhbnNpdGlvbnM6IFRyYW5zaXRpb25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFBheWxvYWQge1xuICBmaWVsZENvZGU6IHN0cmluZztcbiAgZmllbGRWYWx1ZTogYW55O1xuICBlZGl0YWJsZTogYm9vbGVhbjtcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIGZpZWxkT3B0aW9uczogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlUGF5bG9hZCB7XG4gIHRhYmxlQ29kZTogc3RyaW5nO1xuICB2aXNpYmxlOiBib29sZWFuO1xuICBjdXJyZW50UGFnZTogbnVtYmVyO1xuICByZXF1ZXN0ZWRQYWdlOiBudW1iZXI7XG4gIHJlY29yZHNQZXJQYWdlOiBudW1iZXI7XG4gIGN1cnJlbnRGaWx0ZXI6IGFueSxcbiAgc29ydGluZ0NvbHVtbjogc3RyaW5nO1xuICBzb3J0aW5nRGlyZWN0aW9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBGb3JtUGF5bG9hZCB7XG4gIGZpZWxkczogRmllbGRQYXlsb2FkW10sXG4gIHRhYmxlczogVGFibGVQYXlsb2FkW10sXG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3RydWN0dXJlQW5kRGF0YSB7XG4gIHN0YXRlOiBzdHJpbmc7XG4gIF9uYW1lOiBzdHJpbmcgPSAnJztcbiAgX2Zvcm1Db25maWc6IGFueTtcbiAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9zdGF0ZUZsb3c6IFN0YXRlRmxvdztcbiAgcHJpdmF0ZSBfZmllbGRBcnJheTogRmllbGREZXNjcmlwdG9yW107XG4gIHByaXZhdGUgX2ZpZWxkcyA9IHt9O1xuICBwcml2YXRlIF9hY3Rpb25BcnJheTogRm9ybUFjdGlvbltdO1xuICBwcml2YXRlIF9hY3Rpb25zID0ge307XG4gIHByaXZhdGUgX3RhYmxlQXJyYXk6IFJlY29yZFRhYmxlW107XG4gIHByaXZhdGUgX3RhYmxlcyA9IHt9O1xuICBwcml2YXRlIF9zZWN0aW9uQXJyYXk6IFJlY29yZEZvcm1TZWN0aW9uW107XG4gIHByaXZhdGUgX3NlY3Rpb25zID0ge307XG4gIHByaXZhdGUgX2ltbXV0YWJsZURhdGEgPSB7fTtcbiAgcHJpdmF0ZSBfZXh0cmFJbmZvID0ge307XG4gIHByaXZhdGUgX2V4Y2x1c2l2ZVNlY3Rpb25zQnlBdHRyID0ge307XG5cbiAgY29uc3RydWN0b3IoZGVmaW5pdGlvblJlY2VpdmVkLCBmb3JtQ29uZmlnKSB7XG4gICAgdGhpcy5fZm9ybUNvbmZpZyA9IGZvcm1Db25maWc7XG4gICAgdGhpcy5zdGF0ZSA9ICcnO1xuICAgIHRoaXMuX2FjdGlvbkFycmF5ID0gW107XG4gICAgdGhpcy5fZmllbGRBcnJheSA9IFtdO1xuICAgIHRoaXMuX3RhYmxlQXJyYXkgPSBbXTtcbiAgICB0aGlzLl9zZWN0aW9uQXJyYXkgPSBbXTtcbiAgICB0aGlzLl9zdGF0ZUZsb3cgPSB7XG4gICAgICBkZWZhdWx0U3RhdGU6ICcnLFxuICAgICAgc3RhdGVzOiBbXSxcbiAgICAgIHRyYW5zaXRpb25zOiBbXSxcbiAgICB9O1xuICAgIGlmICghZGVmaW5pdGlvblJlY2VpdmVkKSB7IHJldHVybjsgfVxuICAgIHRoaXMuX25hbWUgPSAoZGVmaW5pdGlvblJlY2VpdmVkLmZvcm0gJiYgZGVmaW5pdGlvblJlY2VpdmVkLmZvcm0uZm9ybUNvZGUpXG4gICAgICA/IGRlZmluaXRpb25SZWNlaXZlZC5mb3JtLmZvcm1Db2RlIDogdGhpcy5fbmFtZTtcbiAgICB0aGlzLl90aXRsZSA9IChkZWZpbml0aW9uUmVjZWl2ZWQuZm9ybSAmJiBkZWZpbml0aW9uUmVjZWl2ZWQuZm9ybS5mb3JtVGl0bGUpXG4gICAgICA/IGRlZmluaXRpb25SZWNlaXZlZC5mb3JtLmZvcm1UaXRsZSA6ICcnO1xuICAgIHRoaXMuc2V0U3RhdGVGbG93KGRlZmluaXRpb25SZWNlaXZlZD8uc3RhdGVzLCBkZWZpbml0aW9uUmVjZWl2ZWQ/LnRyYW5zaXRpb25zLFxuICAgICAgZGVmaW5pdGlvblJlY2VpdmVkPy5kZWZhdWx0U3RhdGUpO1xuICAgIHRoaXMuaW1tdXRhYmxlRGF0YSA9IGRlZmluaXRpb25SZWNlaXZlZC5pbW11dGFibGVEYXRhO1xuICAgIHRoaXMuZXh0cmFJbmZvID0gZGVmaW5pdGlvblJlY2VpdmVkLmV4dHJhSW5mbztcblxuICAgIGlmIChkZWZpbml0aW9uUmVjZWl2ZWQuYWN0aW9ucykge1xuICAgICAgY29uc3QgZm9ybUFjdGlvbnMgPSBkZWZpbml0aW9uUmVjZWl2ZWQuYWN0aW9ucy5tYXAob2JqRGVmID0+IHtcbiAgICAgICAgbGV0IHZpc2libGVTdGF0ZXMgPSBvYmpEZWYudmlzaWJsZVN0YXRlcztcbiAgICAgICAgbGV0IGVuYWJsZWRTdGF0ZXMgPSBvYmpEZWYuZW5hYmxlZFN0YXRlcztcbiAgICAgICAgaWYgKCF2aXNpYmxlU3RhdGVzKSB7XG4gICAgICAgICAgdmlzaWJsZVN0YXRlcyA9IChvYmpEZWYuYWN0aW9uTW9kZXMgfHwgJycpLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoc3RhdGUgPT4gc3RhdGUudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihzdGF0ZSA9PiBzdGF0ZS5sZW5ndGggPiAwKSB8fCBbXTtcbiAgICAgICAgICBlbmFibGVkU3RhdGVzID0gWy4uLnZpc2libGVTdGF0ZXNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLm9iakRlZiwgdmlzaWJsZVN0YXRlcywgZW5hYmxlZFN0YXRlcyB9O1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGFjdGlvblJlY2VpdmVkIG9mIGZvcm1BY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IGdsb2JhbEFjdGlvbiA9IG5ldyBGb3JtQWN0aW9uKGFjdGlvblJlY2VpdmVkLCB0aGlzLl9mb3JtQ29uZmlnKTtcbiAgICAgICAgY29uc3QgZ2xvYmFsQWN0aW9uQ29kZSA9IGdsb2JhbEFjdGlvbi5hY3Rpb25Db2RlO1xuICAgICAgICBpZiAoZ2xvYmFsQWN0aW9uQ29kZSkge1xuICAgICAgICAgIHRoaXMuX2FjdGlvbkFycmF5LnB1c2goZ2xvYmFsQWN0aW9uKTtcbiAgICAgICAgICB0aGlzLl9hY3Rpb25zW2dsb2JhbEFjdGlvbkNvZGVdID0gZ2xvYmFsQWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmluaXRpb25SZWNlaXZlZC5maWVsZHMpIHtcbiAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSBkZWZpbml0aW9uUmVjZWl2ZWQuZmllbGRzLm1hcChvYmpEZWYgPT4ge1xuICAgICAgICBsZXQgdmlzaWJsZVN0YXRlcyA9IG9iakRlZi52aXNpYmxlU3RhdGVzO1xuICAgICAgICBsZXQgZW5hYmxlZFN0YXRlcyA9IG9iakRlZi5lbmFibGVkU3RhdGVzIHx8IG9iakRlZi5lZGl0YWJsZVN0YXRlcztcbiAgICAgICAgaWYgKCF2aXNpYmxlU3RhdGVzKSB7XG4gICAgICAgICAgdmlzaWJsZVN0YXRlcyA9IChvYmpEZWYuZmllbGRNb2RlcyB8fCAnJykuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcChzdGF0ZSA9PiBzdGF0ZS50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKHN0YXRlID0+IHN0YXRlLmxlbmd0aCA+IDApIHx8IFtdO1xuICAgICAgICAgIGVuYWJsZWRTdGF0ZXMgPSBbLi4udmlzaWJsZVN0YXRlc107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqRGVmLCB2aXNpYmxlU3RhdGVzLCBlbmFibGVkU3RhdGVzIH07XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgZmllbGRSZWNlaXZlZCBvZiBmb3JtRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkVG9BZGQgPSBuZXcgRmllbGREZXNjcmlwdG9yKGZpZWxkUmVjZWl2ZWQsIHRoaXMuX2Zvcm1Db25maWcpO1xuICAgICAgICBjb25zdCBmaWVsZENvZGUgPSBmaWVsZFRvQWRkLmZpZWxkQ29kZTtcbiAgICAgICAgaWYgKGZpZWxkQ29kZSkge1xuICAgICAgICAgIHRoaXMuX2ZpZWxkQXJyYXkucHVzaChmaWVsZFRvQWRkKTtcbiAgICAgICAgICB0aGlzLl9maWVsZHNbZmllbGRDb2RlXSA9IGZpZWxkVG9BZGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmaW5pdGlvblJlY2VpdmVkLnRhYmxlcykge1xuICAgICAgY29uc3QgdGFibGVzID0gZGVmaW5pdGlvblJlY2VpdmVkLnRhYmxlcy5tYXAob2JqRGVmID0+IHtcbiAgICAgICAgbGV0IHZpc2libGVTdGF0ZXMgPSBvYmpEZWYudmlzaWJsZVN0YXRlcztcbiAgICAgICAgbGV0IGVuYWJsZWRTdGF0ZXMgPSBvYmpEZWYuZW5hYmxlZFN0YXRlcyB8fCBvYmpEZWYuZWRpdGFibGVTdGF0ZXM7XG4gICAgICAgIGlmICghdmlzaWJsZVN0YXRlcykge1xuICAgICAgICAgIHZpc2libGVTdGF0ZXMgPSAob2JqRGVmLnRhYmxlTW9kZXMgfHwgJycpLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoc3RhdGUgPT4gc3RhdGUudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihzdGF0ZSA9PiBzdGF0ZS5sZW5ndGggPiAwKSB8fCBbXTtcbiAgICAgICAgICBlbmFibGVkU3RhdGVzID0gWy4uLnZpc2libGVTdGF0ZXNdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmlzaWJsZVN0YXRlcyB8fCB2aXNpYmxlU3RhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHZpc2libGVTdGF0ZXMgPSB0aGlzLl9mb3JtQ29uZmlnLmRlZmF1bHRTdGF0ZUZsb3cuc3RhdGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLm9iakRlZiwgdmlzaWJsZVN0YXRlcywgZW5hYmxlZFN0YXRlcyB9O1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlUmVjZWl2ZWQgb2YgdGFibGVzKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlVG9BZGQgPSBuZXcgUmVjb3JkVGFibGUodGFibGVSZWNlaXZlZCwgdGhpcy5fZm9ybUNvbmZpZyk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29kZSA9IHRhYmxlVG9BZGQudGFibGVDb2RlO1xuICAgICAgICBpZiAodGFibGVDb2RlKSB7XG4gICAgICAgICAgdGhpcy5fdGFibGVBcnJheS5wdXNoKHRhYmxlVG9BZGQpO1xuICAgICAgICAgIHRoaXMuX3RhYmxlc1t0YWJsZUNvZGVdID0gdGFibGVUb0FkZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZpbml0aW9uUmVjZWl2ZWQuc2VjdGlvbnMpIHtcbiAgICAgIGNvbnN0IGZvcm1TZWN0aW9ucyA9IGRlZmluaXRpb25SZWNlaXZlZC5zZWN0aW9ucy5tYXAob2JqRGVmID0+IHtcbiAgICAgICAgbGV0IHZpc2libGVTdGF0ZXMgPSBvYmpEZWYudmlzaWJsZVN0YXRlcztcbiAgICAgICAgaWYgKCF2aXNpYmxlU3RhdGVzKSB7XG4gICAgICAgICAgdmlzaWJsZVN0YXRlcyA9IChvYmpEZWYuc2VjdGlvbk1vZGVzIHx8ICcnKS5zcGxpdCgnLCcpXG4gICAgICAgICAgICAubWFwKHN0YXRlID0+IHN0YXRlLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIoc3RhdGUgPT4gc3RhdGUubGVuZ3RoID4gMCkgfHwgW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqRGVmLCB2aXNpYmxlU3RhdGVzIH07XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3Qgc2VjdGlvblJlY2VpdmVkIG9mIGZvcm1TZWN0aW9ucykge1xuICAgICAgICBjb25zdCBzZWN0aW9uVG9BZGQgPSBuZXcgUmVjb3JkRm9ybVNlY3Rpb24oc2VjdGlvblJlY2VpdmVkLCB0aGlzKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbkNvZGUgPSBzZWN0aW9uVG9BZGQuc2VjdGlvbkNvZGU7XG4gICAgICAgIGlmIChzZWN0aW9uQ29kZSkge1xuICAgICAgICAgIHRoaXMuX3NlY3Rpb25BcnJheS5wdXNoKHNlY3Rpb25Ub0FkZCk7XG4gICAgICAgICAgdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkNvZGVdID0gc2VjdGlvblRvQWRkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0VGl0bGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3RpdGxlOyB9XG4gIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5fdGl0bGUgPSB0aXRsZTsgfVxuICBnZXQgbmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbmFtZTsgfVxuICBzZXQgbmFtZShuYW1lKSB7IHRoaXMuX25hbWUgPSBuYW1lOyB9XG5cbiAgLy8gRXN0YWRvc1xuICBnZXQgZGVmYXVsdFN0YXRlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9zdGF0ZUZsb3cuZGVmYXVsdFN0YXRlOyB9XG4gIHN1cHBvcnRTdGF0ZShzdGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zdGF0ZUZsb3cuc3RhdGVzPy5pbmNsdWRlcyhzdGF0ZSk7IH1cbiAgc3VwcG9ydE1vZGUoc3RhdGU6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zdXBwb3J0U3RhdGUoc3RhdGUpOyB9XG4gIGdldCBzdGF0ZXMoKTogYW55W10geyByZXR1cm4gdGhpcy5fc3RhdGVGbG93LnN0YXRlczsgfVxuXG4gIGdldEN1cnJlbnRTdGF0ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5zdGF0ZTsgfVxuXG4gIGNoYW5nZVN0YXRlKG5ld1N0YXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIW5ld1N0YXRlIHx8ICF0aGlzLnN1cHBvcnRTdGF0ZShuZXdTdGF0ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN0YXRlKSB7XG4gICAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRyYW5zaXRpb25Ub0NoYW5nZSA9IHRoaXMuX3N0YXRlRmxvdy50cmFuc2l0aW9ucy5maW5kKHRybnMgPT5cbiAgICAgICAgdHJucy5zb3VyY2UgPT09IHRoaXMuc3RhdGUgJiYgdHJucy5kZXN0aW5hdGlvbiA9PT0gbmV3U3RhdGUpO1xuICAgICAgaWYgKHRyYW5zaXRpb25Ub0NoYW5nZSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5zdGF0ZSA9PT0gbmV3U3RhdGUpO1xuICB9XG5cbiAgc2V0U3RhdGVGbG93KHN0YXRlcz8sIHRyYW5zaXRpb25zPywgZGVmYXVsdFN0YXRlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFzdGF0ZXMgfHwgIXRyYW5zaXRpb25zKSB7XG4gICAgICB0aGlzLl9zdGF0ZUZsb3cgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuX2Zvcm1Db25maWcuZGVmYXVsdFN0YXRlRmxvdykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZUZsb3cuc3RhdGVzID0gc3RhdGVzO1xuICAgIHRoaXMuX3N0YXRlRmxvdy5kZWZhdWx0U3RhdGUgPSBkZWZhdWx0U3RhdGUgfHwgdGhpcy5fc3RhdGVGbG93LnN0YXRlc1swXTtcbiAgICB0aGlzLl9zdGF0ZUZsb3cudHJhbnNpdGlvbnMgPSB0cmFuc2l0aW9ucy5tYXAodHJhbnNpdGlvbiA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gdHJhbnNpdGlvbi5uYW1lO1xuICAgICAgY29uc3Qgc291cmNlID0gKHRoaXMuX3N0YXRlRmxvdy5zdGF0ZXMuaW5jbHVkZXModHJhbnNpdGlvbi5zb3VyY2UpKSA/IHRyYW5zaXRpb24uc291cmNlIDogJyc7XG4gICAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICh0aGlzLl9zdGF0ZUZsb3cuc3RhdGVzLmluY2x1ZGVzKHRyYW5zaXRpb24uZGVzdGluYXRpb24pKSA/IHRyYW5zaXRpb24uZGVzdGluYXRpb24gOiAnJztcbiAgICAgIHJldHVybiB7IG5hbWUsIHNvdXJjZSwgZGVzdGluYXRpb24gfTtcbiAgICB9KS5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUgJiYgaXRlbS5zb3VyY2UgJiYgaXRlbS5kZXN0aW5hdGlvbik7XG4gIH1cblxuICAvLyBpbW11dGFibGUgRGF0YVxuICBnZXRJbW11dGFibGVFbGVtZW50KG5hbWU6IHN0cmluZyk6IGFueSB7IHJldHVybiB0aGlzLl9pbW11dGFibGVEYXRhPy5bbmFtZV0/LnZhbHVlID8/IG51bGw7IH1cbiAgc2V0IGltbXV0YWJsZURhdGEoaW1tdXRhYmxlRGF0YSkgeyBPYmplY3QuYXNzaWduKHRoaXMuX2ltbXV0YWJsZURhdGEsIGltbXV0YWJsZURhdGEpOyB9XG4gIGdldCBpbW11dGFibGVEYXRhKCk6IGFueSB7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuX2ltbXV0YWJsZURhdGEpKTsgfVxuXG4gIC8vIGV4dHJhIEluZm9cbiAgZ2V0RXh0cmFJbmZvKG5hbWU6IHN0cmluZyk6IGFueSB7IHJldHVybiB0aGlzLl9leHRyYUluZm8/LltuYW1lXT8udmFsdWUgPz8gbnVsbDsgfVxuICBzZXQgZXh0cmFJbmZvKGV4dHJhSW5mbykgeyBPYmplY3QuYXNzaWduKHRoaXMuX2V4dHJhSW5mbywgZXh0cmFJbmZvKTsgfVxuICBnZXQgZXh0cmFJbmZvKCk6IGFueSB7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuX2V4dHJhSW5mbykpOyB9XG5cbiAgLy8gRmllbGRzXG4gIGdldCBmaWVsZHMoKTogYW55IHsgcmV0dXJuIHRoaXMuX2ZpZWxkczsgfVxuICBnZXQgZmllbGROYW1lcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmdldEZpZWxkTmFtZXMoKTsgfVxuICBnZXRGaWVsZHMoKTogRmllbGREZXNjcmlwdG9yW10geyByZXR1cm4gdGhpcy5fZmllbGRBcnJheTsgfVxuICBnZXRGaWVsZE5hbWVzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuX2ZpZWxkQXJyYXkubWFwKGZpZWxkID0+IGZpZWxkLmZpZWxkQ29kZSk7IH1cbiAgZ2V0RmllbGQoY29kZTogc3RyaW5nKTogRmllbGREZXNjcmlwdG9yIHsgcmV0dXJuIChjb2RlICYmIHRoaXMuX2ZpZWxkcz8uW2NvZGVdKSA/IHRoaXMuX2ZpZWxkc1tjb2RlXSA6IG51bGw7IH1cbiAgZW5hYmxlRmllbGQoY29kZTogc3RyaW5nKTogdm9pZCB7IHRoaXMuZ2V0RmllbGQoY29kZSk/LmVuYWJsZSgpOyB9XG4gIGRpc2FibGVGaWVsZChjb2RlOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5nZXRGaWVsZChjb2RlKT8uZGlzYWJsZSgpOyB9XG4gIGdldEZpZWxkVmFsdWUoY29kZTogc3RyaW5nKTogYW55IHsgcmV0dXJuIHRoaXMuZ2V0RmllbGQoY29kZSk/LmdldFZhbHVlKCk7IH1cbiAgZ2V0RmllbGRPcHRpb25UZXh0KGNvZGU6IHN0cmluZyk6IGFueSB7IHJldHVybiB0aGlzLmdldEZpZWxkKGNvZGUpPy5nZXRPcHRpb25UZXh0KCk7IH1cbiAgZ2V0RmllbGRPcHRpb25zKGNvZGU6IHN0cmluZyk6IEZpZWxkT3B0aW9uW10geyByZXR1cm4gdGhpcy5nZXRGaWVsZChjb2RlKT8uZ2V0RmllbGRPcHRpb25zKCkgPz8gbnVsbDsgfVxuICBzZXRGaWVsZFZhbHVlKGNvZGU6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueSB7IHRoaXMuZ2V0RmllbGQoY29kZSk/LnNldFZhbHVlKHZhbHVlKTsgfVxuICBzZXRGaWVsZEVycm9yKGNvZGU6IHN0cmluZywgZXJyb3JDb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgdHlwZTogc3RyaW5nID0gJ2Vycm9yJyk6IGFueSB7IHRoaXMuZ2V0RmllbGQoY29kZSk/LnNldEVycm9yKGVycm9yQ29kZSwgbWVzc2FnZSwgdHlwZSk7IH1cbiAgc2V0RmllbGRJbnRyaW5zaWNFcnJvck1lc3NhZ2UoY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBhbnkgeyB0aGlzLmdldEZpZWxkKGNvZGUpPy5zZXRJbnRyaW5zaWNFcnJvck1lc3NhZ2UobWVzc2FnZSk7IH1cbiAgc2V0RmllbGRSZXF1aXJlZChjb2RlOiBzdHJpbmcsIHJlcXVpcmVkOiBib29sZWFuKTogYW55IHsgdGhpcy5nZXRGaWVsZChjb2RlKT8uc2V0UmVxdWlyZWQocmVxdWlyZWQpOyB9XG4gIHNldEZpZWxkRXJyb3JNZXNzYWdlKGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogYW55IHsgdGhpcy5nZXRGaWVsZChjb2RlKT8uc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOyB9XG5cbiAgc2V0RmllbGRPcHRpb25zKGNvZGU6IHN0cmluZywgb3B0aW9uc0FycmF5OiBhbnlbXSwgaWRBdHRyaWJ1dGU6IHN0cmluZywgbmFtZUF0dHJpYnV0ZTogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2V0RmllbGQoY29kZSk7XG4gICAgaWYgKGZpZWxkICYmIG9wdGlvbnNBcnJheT8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmllbGRPcHRpb25zID0gb3B0aW9uc0FycmF5Lm1hcChpdGVtID0+ICh7XG4gICAgICAgIGZpZWxkT3B0aW9uSWQ6IGl0ZW1baWRBdHRyaWJ1dGVdLFxuICAgICAgICBmaWVsZE9wdGlvblZhbHVlOiBpdGVtW25hbWVBdHRyaWJ1dGVdXG4gICAgICB9KSk7XG4gICAgICBmaWVsZC5zZXRGaWVsZE9wdGlvbnMoZmllbGRPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBnZXRGaWVsZFNldChmaWx0ZXIsIGlucHV0Q29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZyB8IG51bGwsIHN1YkNvZGU/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nW10ge1xuICAgIGxldCBjb2RlczogYW55W10gPSBbXTtcbiAgICBpZiAodHlwZW9mIGlucHV0Q29kZXMgPT09ICdzdHJpbmcnICYmIGlucHV0Q29kZXMpIHtcbiAgICAgIGNvZGVzID0gW2lucHV0Q29kZXNdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dENvZGVzKSAmJiBpbnB1dENvZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGVzID0gaW5wdXRDb2RlcyA/PyBbXTtcbiAgICB9IGVsc2UgaWYgKHNlY0NvZGUgJiYgIXN1YkNvZGUpIHtcbiAgICAgIGNvZGVzID0gdGhpcy5nZXRTZWN0aW9uKHNlY0NvZGUpPy5nZXRGaWVsZE5hbWVzKCkgPz8gW107XG4gICAgfSBlbHNlIGlmIChzZWNDb2RlICYmIHN1YkNvZGUpIHtcbiAgICAgIGNvZGVzID0gdGhpcy5nZXRTdWJTZWN0aW9uKHNlY0NvZGUsIHN1YkNvZGUpPy5nZXRGaWVsZE5hbWVzKCkgPz8gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGVzID0gdGhpcy5nZXRGaWVsZE5hbWVzKCkgPz8gW107XG4gICAgfVxuICAgIHJldHVybiAoZmlsdGVyKSA/IGNvZGVzLmZpbHRlcihmbGQgPT4gZmlsdGVyKHRoaXMuZ2V0RmllbGQoZmxkKSkpIDogY29kZXM7XG4gIH1cblxuICBhcHBseU9uRmllbGRzKHByb2Nlc3NGdW5jLCBpbnB1dENvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXByb2Nlc3NGdW5jKSB7IHJldHVybiAwOyB9XG4gICAgY29uc3QgY29kZXMgPSB0aGlzLmdldEZpZWxkU2V0KG51bGwsIGlucHV0Q29kZXMgPz8gbnVsbCwgc2VjQ29kZSwgc3ViQ29kZSk7XG4gICAgbGV0IHByb2Nlc3NlZEZpZWxkcyA9IDA7XG4gICAgZm9yIChjb25zdCBjb2RlIG9mIGNvZGVzKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2V0RmllbGQoY29kZSk7XG4gICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwcm9jZXNzRnVuYyhmaWVsZCk7XG4gICAgICAgICAgcHJvY2Vzc2VkRmllbGRzICs9IDE7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcHJvY2VzYW5kbyBmdW5jaW9uIGVuIGNhbXBvICR7ZmllbGR9OiAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZEZpZWxkcztcbiAgfVxuXG4gIGVuYWJsZUZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlPbkZpZWxkcyhmbGQgPT4gZmxkLmVuYWJsZSgpLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBzaG93RmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseU9uRmllbGRzKGZsZCA9PiBmbGQuc2hvdygpLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBoaWRlRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseU9uRmllbGRzKGZsZCA9PiBmbGQuaGlkZSgpLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBzaG93TGFiZWxGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFwcGx5T25GaWVsZHMoZmxkID0+IGZsZC5zaG93TGFibGVsKCksIGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuXG4gIGhpZGVMYWJlbEZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlPbkZpZWxkcyhmbGQgPT4gZmxkLmhpZGVMYWJlbCgpLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBkaXNhYmxlRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseU9uRmllbGRzKGZsZCA9PiBmbGQuZGlzYWJsZSgpLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBjbGVhbkZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlPbkZpZWxkcyhmbGQgPT4gZmxkLmNsZWFuKCksIGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuXG4gIHRhZ0ZpZWxkc1dpdGhFcnJvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseU9uRmllbGRzKGZsZCA9PiBmbGQuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBjbGVhbkVycm9yRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IoJycsIGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuXG4gIHRhZ0VtcHR5UmVxdWlyZWRGaWVsZHMobWVzc2FnZTogc3RyaW5nLCBjb2RlcyA9IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IobWVzc2FnZSwgdGhpcy5nZXRSZXF1aXJlZEVtcHR5RmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKSkgPiAwO1xuICB9XG5cbiAgZ2V0UmVxdWlyZWRGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRTZXQoZmxkID0+IGZsZC5yZXF1aXJlZCwgY29kZXMgPz8gbnVsbCwgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBnZXRSZXF1aXJlZEVtcHR5RmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldEZpZWxkU2V0KGZsZCA9PiBmbGQucmVxdWlyZWQgJiYgZmxkLmVtcHR5LCBjb2RlcyA/PyBudWxsLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuXG4gIGdldENoYW5nZWRGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRTZXQoZmxkID0+ICFmbGQub3V0cHV0T25seSAmJiBmbGQuaGFzQ2hhbmdlZCgpLCBjb2RlcyA/PyBudWxsLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuXG4gIGdldEZpZWxkc1dpdGhWYWxpZGF0aW9uSXNzdWVzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldEZpZWxkU2V0KGZsZCA9PiBmbGQuZXJyb3JDb2RlICE9PSBOT19FUlJPUiwgY29kZXMgPz8gbnVsbCwgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBnZXRGaWVsZHNWYWx1ZXMoaW5wdXRDb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgY29kZXMgPSB0aGlzLmdldEZpZWxkU2V0KG51bGwsIGlucHV0Q29kZXMgPz8gbnVsbCwgc2VjQ29kZSwgc3ViQ29kZSk7XG4gICAgY29uc3QgcmVzdWx0T2JqZWN0ID0ge307XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvZGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgY29kZSA9IGNvZGVzW2luZGV4XTtcbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIHJlc3VsdE9iamVjdFtjb2RlXSA9IHRoaXMuX2ZpZWxkcz8uW2NvZGVdPy5nZXRWYWx1ZSgpID8/IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRPYmplY3Q7XG4gIH1cblxuICAvLyBBY2Npb25lc1xuICBnZXQgYWN0aW9ucygpIHsgcmV0dXJuIHRoaXMuX2FjdGlvbnM7IH1cblxuICBnZXRBY3Rpb25zQnlBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZSk6IEZvcm1BY3Rpb25bXSB7IHJldHVybiB0aGlzLl9hY3Rpb25BcnJheS5maWx0ZXIoYWN0aW9uSXRlbSA9PiBhY3Rpb25JdGVtLm1hdGNoQXR0cmlidXRlKG5hbWUsIHZhbHVlKSk7IH1cbiAgZ2V0QWN0aW9ucygpOiBGb3JtQWN0aW9uW10geyByZXR1cm4gdGhpcy5fYWN0aW9uQXJyYXk7IH1cbiAgZ2V0QWN0aW9uKGNvZGU6IHN0cmluZyk6IEZvcm1BY3Rpb24geyByZXR1cm4gKGNvZGUgJiYgdGhpcy5fYWN0aW9ucz8uW2NvZGVdKSA/IHRoaXMuX2FjdGlvbnNbY29kZV0gOiBudWxsOyB9XG4gIHNob3dBY3Rpb25zKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5leGVjT25BY3Rpb25zKGNvZGVzLCBTSE9XKTsgfVxuICBoaWRlQWN0aW9ucyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZXhlY09uQWN0aW9ucyhjb2RlcywgSElERSk7IH1cbiAgZW5hYmxlQWN0aW9ucyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZXhlY09uQWN0aW9ucyhjb2RlcywgRU5BQkxFKTsgfVxuICBkaXNhYmxlQWN0aW9ucyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZXhlY09uQWN0aW9ucyhjb2RlcywgRElTQUJMRSk7IH1cblxuICBleGVjT25BY3Rpb25zKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGZ1bmN0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aW9uQ29kZXMgPSAoQXJyYXkuaXNBcnJheShjb2RlcykpID8gY29kZXMgOiAoY29kZXMgPyBbY29kZXNdIDogW10pO1xuICAgIGlmICghZnVuY3Rpb25OYW1lIHx8IGFjdGlvbkNvZGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICBhY3Rpb25Db2Rlcy5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5nZXRBY3Rpb24oY29kZSk7XG4gICAgICBhY3Rpb24/LltmdW5jdGlvbk5hbWVdPy4oKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRhYmxhc1xuICBnZXQgdGFibGVzKCk6IGFueSB7IHJldHVybiB0aGlzLnRhYmxlczsgfVxuICBnZXRUYWJsZXMoKTogUmVjb3JkVGFibGVbXSB7IHJldHVybiB0aGlzLl90YWJsZUFycmF5OyB9XG4gIGdldFRhYmxlKGNvZGU6IHN0cmluZyk6IFJlY29yZFRhYmxlIHsgcmV0dXJuIChjb2RlICYmIHRoaXMuX3RhYmxlcz8uW2NvZGVdKSA/IHRoaXMuX3RhYmxlc1tjb2RlXSA6IG51bGw7IH1cbiAgZ2V0VGFibGVSZWNvcmQoY29kZTogc3RyaW5nLCBpZDogc3RyaW5nKTogVGFibGVSZWNvcmREYXRhIHsgcmV0dXJuIHRoaXMuZ2V0VGFibGUoY29kZSk/LmdldFRhYmxlUmVjb3JkKGlkKSB9XG5cbiAgZW5hYmxlVGFibGVzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5leGVjT25UYWJsZXMoY29kZXMsIEVOQUJMRSk7IH1cbiAgZGlzYWJsZVRhYmxlcyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZXhlY09uVGFibGVzKGNvZGVzLCBESVNBQkxFKTsgfVxuICBzaG93VGFibGVzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5leGVjT25UYWJsZXMoY29kZXMsIFNIT1cpOyB9XG4gIGhpZGVUYWJsZXMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLmV4ZWNPblRhYmxlcyhjb2RlcywgSElERSk7IH1cbiAgY2xlYW5UYWJsZXMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLmV4ZWNPblRhYmxlcyhjb2RlcywgQ0xFQU4pOyB9XG5cbiAgZXhlY09uVGFibGVzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGZ1bmN0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFibGVDb2RlcyA9IChBcnJheS5pc0FycmF5KGNvZGVzKSkgPyBjb2RlcyA6IChjb2RlcyA/IFtjb2Rlc10gOiBbXSk7XG4gICAgaWYgKCFmdW5jdGlvbk5hbWUgfHwgdGFibGVDb2Rlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgdGFibGVDb2Rlcy5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgICAgdGFibGU/LltmdW5jdGlvbk5hbWVdPy4oKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNlY2Npb25lc1xuICBnZXQgc2VjdGlvbnMoKTogYW55IHsgcmV0dXJuIHRoaXMuX3NlY3Rpb25zOyB9XG4gIGdldFNlY3Rpb25zKCk6IFJlY29yZEZvcm1TZWN0aW9uW10geyByZXR1cm4gdGhpcy5fc2VjdGlvbkFycmF5OyB9XG4gIGdldFNlY3Rpb25zQnlBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOiBSZWNvcmRGb3JtU2VjdGlvbltdIHsgcmV0dXJuIHRoaXMuX3NlY3Rpb25BcnJheS5maWx0ZXIoaXRlbSA9PiBpdGVtLm1hdGNoQXR0cmlidXRlKG5hbWUsIHZhbHVlKSk7IH1cbiAgZ2V0IHNlY3Rpb25UaXRsZXMoKTogc3RyaW5nW10geyByZXR1cm4gdGhpcy5fc2VjdGlvbkFycmF5Lm1hcChmb3JtU2VjdGlvbiA9PiBmb3JtU2VjdGlvbi5zZWN0aW9uVGl0bGUpOyB9XG4gIGdldCB2aXNpYmxlU2VjdGlvbnMoKTogUmVjb3JkRm9ybVNlY3Rpb25bXSB7IHJldHVybiB0aGlzLl9zZWN0aW9uQXJyYXkuZmlsdGVyKHNlYyA9PiBzZWMudmlzaWJsZSk7IH1cbiAgZ2V0U2VjdGlvbihjb2RlOiBzdHJpbmcpOiBSZWNvcmRGb3JtU2VjdGlvbiB7IHJldHVybiAoY29kZSAmJiB0aGlzLl9zZWN0aW9ucz8uW2NvZGVdKSA/IHRoaXMuX3NlY3Rpb25zW2NvZGVdIDogbnVsbDsgfVxuICBzaG93U2VjdGlvbnMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHRoaXMuZXhlY09uU2VjdGlvbnMoY29kZXMsIFNIT1cpOyB9XG4gIGhpZGVTZWN0aW9ucyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgdGhpcy5leGVjT25TZWN0aW9ucyhjb2RlcywgSElERSk7IH1cbiAgYWN0aXZlU2VjdGlvbigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZXhjbHVzaXZlU2VjdGlvbnNCeUF0dHJbQUNUSVZFXTsgfVxuICBnZXRTdWJTZWN0aW9uKGNvZGU6IHN0cmluZywgc3ViQ29kZSk6IFJlY29yZEZvcm1TdWJTZWN0aW9uIHsgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvbihjb2RlKT8uZ2V0U3Vic2VjdGlvbihzdWJDb2RlKSA/PyBudWxsOyB9XG4gIHNob3dTdWJTZWN0aW9ucyhjb2RlOiBzdHJpbmcsIHN1YkNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5leGVjT25TdWJTZWN0aW9ucyhjb2RlLCBzdWJDb2RlcywgU0hPVyk7IH1cbiAgaGlkZVN1YlNlY3Rpb25zKGNvZGU6IHN0cmluZywgc3ViQ29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLmV4ZWNPblN1YlNlY3Rpb25zKGNvZGUsIHN1YkNvZGVzLCBISURFKTsgfVxuICBnZXRTZWN0aW9uQWN0aW9ucyhjb2RlKTogRm9ybUFjdGlvbltdIHsgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvbihjb2RlKT8uZ2V0QWN0aW9ucygpID8/IG51bGw7IH1cbiAgZ2V0U2VjdGlvbkFjdGlvbk5hbWVzKGNvZGUpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmdldFNlY3Rpb24oY29kZSk/LmdldEFjdGlvbk5hbWVzKCkgPz8gbnVsbDsgfVxuXG4gIGFjdGl2YXRlU2VjdGlvbihjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoY29kZSA9PT0gdGhpcy5fZXhjbHVzaXZlU2VjdGlvbnNCeUF0dHJbQUNUSVZFXSkgeyByZXR1cm47IH1cbiAgICB0aGlzLmdldFNlY3Rpb24odGhpcy5hY3RpdmVTZWN0aW9uKCkpPy5pbmFjdGl2YXRlKCk7XG4gICAgdGhpcy5nZXRTZWN0aW9uKGNvZGUpPy5hY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2V4Y2x1c2l2ZVNlY3Rpb25zQnlBdHRyW0FDVElWRV0gPSBjb2RlO1xuICB9XG5cbiAgZXhlY09uU2VjdGlvbnMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgZnVuY3Rpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZWN0aW9uQ29kZXMgPSAoQXJyYXkuaXNBcnJheShjb2RlcykpID8gY29kZXMgOiAoY29kZXMgPyBbY29kZXNdIDogW10pO1xuICAgIGlmICghZnVuY3Rpb25OYW1lIHx8IHNlY3Rpb25Db2Rlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgc2VjdGlvbkNvZGVzLmZvckVhY2goY29kZSA9PiB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5nZXRTZWN0aW9uKGNvZGUpO1xuICAgICAgc2VjdGlvbj8uW2Z1bmN0aW9uTmFtZV0/LigpO1xuICAgIH0pO1xuICB9XG5cbiAgZXhlY09uU3ViU2VjdGlvbnMoY29kZTogc3RyaW5nLCBzdWJOYW1lczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBmdW5jdGlvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHN1YkNvZGVzID0gKEFycmF5LmlzQXJyYXkoc3ViTmFtZXMpKSA/IHN1Yk5hbWVzIDogKHN1Yk5hbWVzID8gW3N1Yk5hbWVzXSA6IFtdKTtcbiAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5nZXRTZWN0aW9uKGNvZGUpO1xuICAgIGlmICghZnVuY3Rpb25OYW1lIHx8ICFzZWN0aW9uIHx8IHN1YkNvZGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICBmb3IgKGNvbnN0IHN1YkNvZGUgb2Ygc3ViQ29kZXMpIHtcbiAgICAgIGNvbnN0IHN1YlNlY3Rpb24gPSB0aGlzLmdldFN1YlNlY3Rpb24oY29kZSwgc3ViQ29kZSk7XG4gICAgICBzdWJTZWN0aW9uPy5bZnVuY3Rpb25OYW1lXT8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG9zIHByb3Bpb3MgZGUgZ2VzdGnDs24gZGVsIGZvcm11bGFyaW9cbiAgICovXG5cbiAgY2xlYW5EYXRhKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5fZmllbGRBcnJheSkge1xuICAgICAgZmllbGQuc2V0VmFsdWUoZmllbGQuZGVmYXVsdFZhbHVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0YWJsZSBvZiB0aGlzLl90YWJsZUFycmF5KSB7XG4gICAgICB0YWJsZS5jbGVhbigpO1xuICAgIH1cbiAgfVxuXG4gIGdldFBheWxvYWQoKTogYW55IHtcbiAgICBjb25zdCBmb3JtRGF0YTogRm9ybVBheWxvYWQgPSB7XG4gICAgICBmaWVsZHM6IFtdLFxuICAgICAgdGFibGVzOiBbXSxcbiAgICB9O1xuICAgIGZvcm1EYXRhLmZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKCkuZmlsdGVyKGZsZCA9PiAhZmxkLm91dHB1dE9ubHkpXG4gICAgICAubWFwKGZsZCA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkUGF5bG9hZDogRmllbGRQYXlsb2FkID0ge1xuICAgICAgICAgIGZpZWxkQ29kZTogZmxkLmZpZWxkQ29kZSxcbiAgICAgICAgICBmaWVsZFZhbHVlOiBmbGQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICBlZGl0YWJsZTogIWZsZC5kaXNhYmxlZCxcbiAgICAgICAgICB2aXNpYmxlOiBmbGQudmlzaWJsZSxcbiAgICAgICAgICByZXF1aXJlZDogZmxkLnJlcXVpcmVkLFxuICAgICAgICAgIGZpZWxkT3B0aW9uczogJycsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkUGF5bG9hZDtcbiAgICAgIH0pO1xuXG4gICAgZm9ybURhdGEudGFibGVzID0gdGhpcy5nZXRUYWJsZXMoKS5tYXAodGJsID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlUGF5bG9hZDogVGFibGVQYXlsb2FkID0ge1xuICAgICAgICB0YWJsZUNvZGU6IHRibC50YWJsZUNvZGUsXG4gICAgICAgIHZpc2libGU6IHRibC52aXNpYmxlLFxuICAgICAgICBjdXJyZW50UGFnZTogdGJsLmN1cnJlbnRQYWdlLFxuICAgICAgICByZXF1ZXN0ZWRQYWdlOiB0YmwucmVxdWVzdGVkUGFnZSxcbiAgICAgICAgcmVjb3Jkc1BlclBhZ2U6IHRibC5yZWNvcmRzUGVyUGFnZSxcbiAgICAgICAgY3VycmVudEZpbHRlcjogdGJsLmN1cnJlbnRGaWx0ZXIsXG4gICAgICAgIHNvcnRpbmdDb2x1bW46IHRibC5zb3J0aW5nLmNvbHVtbk5hbWUsXG4gICAgICAgIHNvcnRpbmdEaXJlY3Rpb246IHRibC5zb3J0aW5nLmRpcmVjdGlvbixcbiAgICAgIH07XG4gICAgICByZXR1cm4gdGFibGVQYXlsb2FkXG4gICAgfSlcbiAgICByZXR1cm4gZm9ybURhdGE7XG4gIH1cbn1cbiJdfQ==