@stemy/ngx-dynamic-form 10.2.18 → 10.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -27
- package/bundles/stemy-ngx-dynamic-form.umd.js +1400 -1390
- package/bundles/stemy-ngx-dynamic-form.umd.js.map +1 -1
- package/bundles/stemy-ngx-dynamic-form.umd.min.js +1 -1
- package/bundles/stemy-ngx-dynamic-form.umd.min.js.map +1 -1
- package/esm2015/ngx-dynamic-form/common-types.js +134 -134
- package/esm2015/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.js +91 -91
- package/esm2015/ngx-dynamic-form/components/base/dynamic-base-form.component.js +129 -129
- package/esm2015/ngx-dynamic-form/directives/async-submit.directive.js +100 -100
- package/esm2015/ngx-dynamic-form/ngx-dynamic-form.module.js +82 -82
- package/esm2015/ngx-dynamic-form/services/dynamic-form-validation.service.js +11 -11
- package/esm2015/ngx-dynamic-form/services/dynamic-form.service.js +393 -383
- package/esm2015/ngx-dynamic-form/utils/dynamic-form-array.model.js +8 -8
- package/esm2015/ngx-dynamic-form/utils/form-subject.js +18 -18
- package/esm2015/ngx-dynamic-form/utils/validators.js +28 -28
- package/esm2015/public_api.js +9 -9
- package/esm2015/stemy-ngx-dynamic-form.js +6 -6
- package/fesm2015/stemy-ngx-dynamic-form.js +936 -926
- package/fesm2015/stemy-ngx-dynamic-form.js.map +1 -1
- package/ngx-dynamic-form/common-types.d.ts +148 -148
- package/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.d.ts +37 -37
- package/ngx-dynamic-form/components/base/dynamic-base-form.component.d.ts +37 -37
- package/ngx-dynamic-form/directives/async-submit.directive.d.ts +27 -27
- package/ngx-dynamic-form/ngx-dynamic-form.module.d.ts +10 -10
- package/ngx-dynamic-form/services/dynamic-form-validation.service.d.ts +5 -5
- package/ngx-dynamic-form/services/dynamic-form.service.d.ts +40 -40
- package/ngx-dynamic-form/utils/dynamic-form-array.model.d.ts +12 -12
- package/ngx-dynamic-form/utils/form-subject.d.ts +8 -8
- package/ngx-dynamic-form/utils/validators.d.ts +4 -4
- package/package.json +12 -12
- package/public_api.d.ts +8 -8
- package/stemy-ngx-dynamic-form.d.ts +6 -6
|
@@ -1,383 +1,393 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { EventEmitter, Injectable } from "@angular/core";
|
|
3
|
-
import { FormArray, FormGroup } from "@angular/forms";
|
|
4
|
-
import { Subject } from "rxjs";
|
|
5
|
-
import { DynamicCheckboxModel, DynamicFileUploadModel, DynamicFormComponentService, DynamicFormGroupModel, DynamicFormService as Base, DynamicFormValidationService, DynamicInputModel, DynamicSelectModel, DynamicTextAreaModel, DynamicFormArrayModel as DynamicFormArrayModelBase } from "@ng-dynamic-forms/core";
|
|
6
|
-
import { ObjectUtils, OpenApiService, StringUtils } from "@stemy/ngx-utils";
|
|
7
|
-
import { FormSubject } from "../utils/form-subject";
|
|
8
|
-
import { DynamicFormArrayModel } from "../utils/dynamic-form-array.model";
|
|
9
|
-
export class DynamicFormService extends Base {
|
|
10
|
-
constructor(cs, vs, openApi) {
|
|
11
|
-
super(cs, vs);
|
|
12
|
-
this.openApi = openApi;
|
|
13
|
-
this.onDetectChanges = new EventEmitter();
|
|
14
|
-
}
|
|
15
|
-
get api() {
|
|
16
|
-
return this.openApi.api;
|
|
17
|
-
}
|
|
18
|
-
get language() {
|
|
19
|
-
return this.api.language;
|
|
20
|
-
}
|
|
21
|
-
patchGroup(value, formModel, formGroup) {
|
|
22
|
-
this.patchValueRecursive(value, formModel, formGroup);
|
|
23
|
-
this.detectChanges();
|
|
24
|
-
formGroup.patchValue(ObjectUtils.copy(value));
|
|
25
|
-
}
|
|
26
|
-
patchForm(value, component) {
|
|
27
|
-
this.patchValueRecursive(value, component.model, component.group);
|
|
28
|
-
this.detectChanges(component);
|
|
29
|
-
component.group.patchValue(value);
|
|
30
|
-
}
|
|
31
|
-
serialize(formModel, formGroup) {
|
|
32
|
-
return this.serializeRecursive(formModel, formGroup);
|
|
33
|
-
}
|
|
34
|
-
notifyChanges(formModel, formGroup) {
|
|
35
|
-
this.notifyChangesRecursive(formModel, formGroup);
|
|
36
|
-
}
|
|
37
|
-
updateSelectOptions(formControlModel, formControl) {
|
|
38
|
-
if (formControlModel instanceof DynamicSelectModel) {
|
|
39
|
-
let options = formControlModel.options$;
|
|
40
|
-
if (options instanceof FormSubject) {
|
|
41
|
-
options.notify(formControlModel, formControl);
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
while (options instanceof Subject && options.source) {
|
|
45
|
-
options = options.source;
|
|
46
|
-
if (options instanceof FormSubject) {
|
|
47
|
-
options.notify(formControlModel, formControl);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
showErrors(form) {
|
|
53
|
-
this.showErrorsForGroup(form.group);
|
|
54
|
-
this.detectChanges(form);
|
|
55
|
-
}
|
|
56
|
-
detectChanges(formComponent) {
|
|
57
|
-
super.detectChanges(formComponent);
|
|
58
|
-
this.onDetectChanges.emit(formComponent);
|
|
59
|
-
}
|
|
60
|
-
patchValueRecursive(value, formModel, formGroup) {
|
|
61
|
-
Object.keys(value).forEach(key => {
|
|
62
|
-
const subModel = this.findModelById(key, formModel);
|
|
63
|
-
const subValue = value[key];
|
|
64
|
-
if (!subModel)
|
|
65
|
-
return;
|
|
66
|
-
const subControl = this.findControlByModel(subModel, formGroup);
|
|
67
|
-
if (subModel instanceof DynamicSelectModel && ObjectUtils.isObject(subValue)) {
|
|
68
|
-
value[key] = subValue.id || subValue._id || subValue;
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (subModel instanceof DynamicFormArrayModelBase) {
|
|
72
|
-
const length = Array.isArray(subValue) ? subValue.length : 0;
|
|
73
|
-
const subArray = subControl;
|
|
74
|
-
while (subModel.size > length) {
|
|
75
|
-
this.removeFormArrayGroup(0, subArray, subModel);
|
|
76
|
-
}
|
|
77
|
-
while (subModel.size < length) {
|
|
78
|
-
this.insertFormArrayGroup(subModel.size, subArray, subModel);
|
|
79
|
-
}
|
|
80
|
-
for (let i = 0; i < length; i++) {
|
|
81
|
-
const itemModel = subModel.get(i);
|
|
82
|
-
this.patchValueRecursive(subValue[i], itemModel.group, subArray.at(i));
|
|
83
|
-
}
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
if (subModel instanceof DynamicFormGroupModel) {
|
|
87
|
-
this.patchValueRecursive(subValue, subModel.group, subControl);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
serializeRecursive(formModel, formGroup) {
|
|
92
|
-
var _a;
|
|
93
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
-
const result = {};
|
|
95
|
-
if (!formModel || !formGroup || !formGroup.value)
|
|
96
|
-
return result;
|
|
97
|
-
for (const i in formModel) {
|
|
98
|
-
const subModel = formModel[i];
|
|
99
|
-
const subControl = this.findControlByModel(subModel, formGroup);
|
|
100
|
-
const serializer = (_a = subModel.additional) === null || _a === void 0 ? void 0 : _a.serializer;
|
|
101
|
-
if (ObjectUtils.isFunction(serializer)) {
|
|
102
|
-
result[subModel.id] = yield serializer(subModel, subControl);
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
if (subModel instanceof DynamicFormArrayModelBase) {
|
|
106
|
-
const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
|
|
107
|
-
const subArray = subControl;
|
|
108
|
-
const resArray = [];
|
|
109
|
-
for (let i = 0; i < length; i++) {
|
|
110
|
-
const itemModel = subModel.get(i);
|
|
111
|
-
resArray.push(yield this.serializeRecursive(itemModel.group, subArray.at(i)));
|
|
112
|
-
}
|
|
113
|
-
result[subModel.id] = resArray;
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
if (subModel instanceof DynamicFormGroupModel) {
|
|
117
|
-
result[subModel.id] = yield this.serializeRecursive(subModel.group, subControl);
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
case "
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LWR5bmFtaWMtZm9ybS9zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFrQixTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQ0gsb0JBQW9CLEVBRXBCLHNCQUFzQixFQUd0QiwyQkFBMkIsRUFFM0IscUJBQXFCLEVBSXJCLGtCQUFrQixJQUFJLElBQUksRUFDMUIsNEJBQTRCLEVBRzVCLGlCQUFpQixFQUVqQixrQkFBa0IsRUFFbEIsb0JBQW9CLEVBR3BCLHFCQUFxQixJQUFJLHlCQUF5QixFQUNyRCxNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFNSCxXQUFXLEVBQ1gsY0FBYyxFQUNkLFdBQVcsRUFDZCxNQUFNLGtCQUFrQixDQUFDO0FBSTFCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMscUJBQXFCLEVBQThCLE1BQU0sbUNBQW1DLENBQUM7QUFHckcsTUFBTSxPQUFPLGtCQUFtQixTQUFRLElBQUk7SUFheEMsWUFBWSxFQUErQixFQUFFLEVBQWdDLEVBQVcsT0FBdUI7UUFDM0csS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQURzRSxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUUzRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO0lBQ3BFLENBQUM7SUFkRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFD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LENBQUM7UUFDL0MsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ3BCLFVBQVUsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztTQUM3QztRQUNELElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNwQixVQUFVLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7U0FDN0M7UUFDRCxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDZCxVQUFVLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7U0FDakM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDZCxVQUFVLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7U0FDakM7UUFDRCxRQUFRLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDckIsS0FBSyxPQUFPO2dCQUNSLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixNQUFNO1NBQ2I7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDOzs7WUF4WUosVUFBVTs7O1lBbkNQLDJCQUEyQjtZQU8zQiw0QkFBNEI7WUFtQjVCLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1xuICAgIER5bmFtaWNDaGVja2JveE1vZGVsLFxuICAgIER5bmFtaWNDaGVja2JveE1vZGVsQ29uZmlnLFxuICAgIER5bmFtaWNGaWxlVXBsb2FkTW9kZWwsXG4gICAgRHluYW1pY0ZpbGVVcGxvYWRNb2RlbENvbmZpZyxcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudCxcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXG4gICAgRHluYW1pY0Zvcm1Db250cm9sTW9kZWwsXG4gICAgRHluYW1pY0Zvcm1Hcm91cE1vZGVsLFxuICAgIER5bmFtaWNGb3JtR3JvdXBNb2RlbENvbmZpZyxcbiAgICBEeW5hbWljRm9ybU1vZGVsLFxuICAgIER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnLFxuICAgIER5bmFtaWNGb3JtU2VydmljZSBhcyBCYXNlLFxuICAgIER5bmFtaWNGb3JtVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbCxcbiAgICBEeW5hbWljRm9ybVZhbHVlQ29udHJvbE1vZGVsQ29uZmlnLFxuICAgIER5bmFtaWNJbnB1dE1vZGVsLFxuICAgIER5bmFtaWNJbnB1dE1vZGVsQ29uZmlnLFxuICAgIER5bmFtaWNTZWxlY3RNb2RlbCxcbiAgICBEeW5hbWljU2VsZWN0TW9kZWxDb25maWcsXG4gICAgRHluYW1pY1RleHRBcmVhTW9kZWwsXG4gICAgRHluYW1pY1RleHRBcmVhTW9kZWxDb25maWcsXG4gICAgRHluYW1pY1ZhbGlkYXRvcnNDb25maWcsXG4gICAgRHluYW1pY0Zvcm1BcnJheU1vZGVsIGFzIER5bmFtaWNGb3JtQXJyYXlNb2RlbEJhc2Vcbn0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcbmltcG9ydCB7XG4gICAgSUFwaVNlcnZpY2UsXG4gICAgSUxhbmd1YWdlU2VydmljZSxcbiAgICBJT3BlbkFwaVNjaGVtYSxcbiAgICBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LFxuICAgIElPcGVuQXBpU2NoZW1hcyxcbiAgICBPYmplY3RVdGlscyxcbiAgICBPcGVuQXBpU2VydmljZSxcbiAgICBTdHJpbmdVdGlsc1xufSBmcm9tIFwiQHN0ZW15L25neC11dGlsc1wiO1xuXG5pbXBvcnQge0lGb3JtQ29udHJvbFNlcmlhbGl6ZXJ9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcblxuaW1wb3J0IHtGb3JtU3ViamVjdH0gZnJvbSBcIi4uL3V0aWxzL2Zvcm0tc3ViamVjdFwiO1xuaW1wb3J0IHtEeW5hbWljRm9ybUFycmF5TW9kZWwsIER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZ30gZnJvbSBcIi4uL3V0aWxzL2R5bmFtaWMtZm9ybS1hcnJheS5tb2RlbFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1TZXJ2aWNlIGV4dGVuZHMgQmFzZSB7XG5cbiAgICBnZXQgYXBpKCk6IElBcGlTZXJ2aWNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFwaS5hcGk7XG4gICAgfVxuXG4gICAgZ2V0IGxhbmd1YWdlKCk6IElMYW5ndWFnZVNlcnZpY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5hcGkubGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgcmVhZG9ubHkgb25EZXRlY3RDaGFuZ2VzOiBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db21wb25lbnQ+O1xuICAgIHByb3RlY3RlZCBzY2hlbWFzOiBJT3BlbkFwaVNjaGVtYXM7XG5cbiAgICBjb25zdHJ1Y3RvcihjczogRHluYW1pY0Zvcm1Db21wb25lbnRTZXJ2aWNlLCB2czogRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSwgcmVhZG9ubHkgb3BlbkFwaTogT3BlbkFwaVNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoY3MsIHZzKTtcbiAgICAgICAgdGhpcy5vbkRldGVjdENoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29tcG9uZW50PigpO1xuICAgIH1cblxuICAgIHBhdGNoR3JvdXAodmFsdWU6IGFueSwgZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoVmFsdWVSZWN1cnNpdmUodmFsdWUsIGZvcm1Nb2RlbCwgZm9ybUdyb3VwKTtcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGZvcm1Hcm91cC5wYXRjaFZhbHVlKE9iamVjdFV0aWxzLmNvcHkodmFsdWUpKTtcbiAgICB9XG5cbiAgICBwYXRjaEZvcm0odmFsdWU6IGFueSwgY29tcG9uZW50OiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhdGNoVmFsdWVSZWN1cnNpdmUodmFsdWUsIGNvbXBvbmVudC5tb2RlbCwgY29tcG9uZW50Lmdyb3VwKTtcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKGNvbXBvbmVudCk7XG4gICAgICAgIGNvbXBvbmVudC5ncm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZVJlY3Vyc2l2ZShmb3JtTW9kZWwsIGZvcm1Hcm91cCk7XG4gICAgfVxuXG4gICAgbm90aWZ5Q2hhbmdlcyhmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShmb3JtTW9kZWwsIGZvcm1Hcm91cCk7XG4gICAgfVxuXG4gICAgdXBkYXRlU2VsZWN0T3B0aW9ucyhmb3JtQ29udHJvbE1vZGVsOiBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCwgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHZvaWQge1xuICAgICAgICBpZiAoZm9ybUNvbnRyb2xNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNTZWxlY3RNb2RlbCkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBmb3JtQ29udHJvbE1vZGVsLm9wdGlvbnMkO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGb3JtU3ViamVjdCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubm90aWZ5KGZvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAob3B0aW9ucyBpbnN0YW5jZW9mIFN1YmplY3QgJiYgb3B0aW9ucy5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGb3JtU3ViamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vdGlmeShmb3JtQ29udHJvbE1vZGVsLCBmb3JtQ29udHJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd0Vycm9ycyhmb3JtOiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JHcm91cChmb3JtLmdyb3VwKTtcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKGZvcm0pO1xuICAgIH1cblxuICAgIGRldGVjdENoYW5nZXMoZm9ybUNvbXBvbmVudD86IER5bmFtaWNGb3JtQ29tcG9uZW50KSB7XG4gICAgICAgIHN1cGVyLmRldGVjdENoYW5nZXMoZm9ybUNvbXBvbmVudCk7XG4gICAgICAgIHRoaXMub25EZXRlY3RDaGFuZ2VzLmVtaXQoZm9ybUNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHBhdGNoVmFsdWVSZWN1cnNpdmUodmFsdWU6IGFueSwgZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSB0aGlzLmZpbmRNb2RlbEJ5SWQoa2V5LCBmb3JtTW9kZWwpO1xuICAgICAgICAgICAgY29uc3Qgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICAgICAgaWYgKCFzdWJNb2RlbCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY1NlbGVjdE1vZGVsICYmIE9iamVjdFV0aWxzLmlzT2JqZWN0KHN1YlZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlW2tleV0gPSBzdWJWYWx1ZS5pZCB8fCBzdWJWYWx1ZS5faWQgfHwgc3ViVmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsQmFzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViVmFsdWUpID8gc3ViVmFsdWUubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJBcnJheSA9IHN1YkNvbnRyb2wgYXMgRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgIHdoaWxlIChzdWJNb2RlbC5zaXplID4gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9ybUFycmF5R3JvdXAoMCwgc3ViQXJyYXksIHN1Yk1vZGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN1Yk1vZGVsLnNpemUgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRGb3JtQXJyYXlHcm91cChzdWJNb2RlbC5zaXplLCBzdWJBcnJheSwgc3ViTW9kZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Nb2RlbCA9IHN1Yk1vZGVsLmdldChpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRjaFZhbHVlUmVjdXJzaXZlKHN1YlZhbHVlW2ldLCBpdGVtTW9kZWwuZ3JvdXAsIHN1YkFycmF5LmF0KGkpIGFzIEZvcm1Hcm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZShzdWJWYWx1ZSwgc3ViTW9kZWwuZ3JvdXAsIHN1YkNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHNlcmlhbGl6ZVJlY3Vyc2l2ZShmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIGlmICghZm9ybU1vZGVsIHx8ICFmb3JtR3JvdXAgfHwgIWZvcm1Hcm91cC52YWx1ZSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGZvcm1Nb2RlbCkge1xuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBmb3JtTW9kZWxbaV0gYXMgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbDxhbnk+O1xuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplciA9IHN1Yk1vZGVsLmFkZGl0aW9uYWw/LnNlcmlhbGl6ZXIgYXMgSUZvcm1Db250cm9sU2VyaWFsaXplcjtcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc0Z1bmN0aW9uKHNlcmlhbGl6ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IGF3YWl0IHNlcmlhbGl6ZXIoc3ViTW9kZWwsIHN1YkNvbnRyb2wpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsQmFzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViQ29udHJvbC52YWx1ZSkgPyBzdWJDb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQXJyYXkgPSBzdWJDb250cm9sIGFzIEZvcm1BcnJheTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNBcnJheSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbU1vZGVsID0gc3ViTW9kZWwuZ2V0KGkpO1xuICAgICAgICAgICAgICAgICAgICByZXNBcnJheS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJpYWxpemVSZWN1cnNpdmUoaXRlbU1vZGVsLmdyb3VwLCBzdWJBcnJheS5hdChpKSBhcyBGb3JtR3JvdXApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSByZXNBcnJheTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZVJlY3Vyc2l2ZShzdWJNb2RlbC5ncm91cCwgc3ViQ29udHJvbCBhcyBGb3JtR3JvdXApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IHN1YkNvbnRyb2wudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgICAgIGlmICghZm9ybU1vZGVsIHx8ICFmb3JtR3JvdXApIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGZvcm1Nb2RlbCkge1xuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBmb3JtTW9kZWxbaV0gYXMgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbDxhbnk+O1xuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheU1vZGVsQmFzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViQ29udHJvbC52YWx1ZSkgPyBzdWJDb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQXJyYXkgPSBzdWJDb250cm9sIGFzIEZvcm1BcnJheTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Nb2RlbCA9IHN1Yk1vZGVsLmdldChpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzUmVjdXJzaXZlKGl0ZW1Nb2RlbC5ncm91cCwgc3ViQXJyYXkuYXQoaSkgYXMgRm9ybUdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoc3ViTW9kZWwuZ3JvdXAsIHN1YkNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0T3B0aW9ucyhzdWJNb2RlbCwgc3ViQ29udHJvbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2hvd0Vycm9yc0Zvckdyb3VwKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgICAgIGlmICghZm9ybUdyb3VwKSByZXR1cm47XG4gICAgICAgIGZvcm1Hcm91cC5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICBjb25zdCBjb250cm9scyA9IE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykubWFwKGlkID0+IGZvcm1Hcm91cC5jb250cm9sc1tpZF0pO1xuICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9scyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9sczogQWJzdHJhY3RDb250cm9sW10pOiB2b2lkIHtcbiAgICAgICAgY29udHJvbHMuZm9yRWFjaChjb250cm9sID0+IHtcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JzRm9yR3JvdXAoY29udHJvbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9sLmNvbnRyb2xzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hKG5hbWU6IHN0cmluZyk6IFByb21pc2U8RHluYW1pY0Zvcm1Nb2RlbD4ge1xuICAgICAgICB0aGlzLmFwaS5jYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLnNjaGVtYXMgPSBhd2FpdCB0aGlzLm9wZW5BcGkuZ2V0U2NoZW1hcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGb3JtTW9kZWxGb3JTY2hlbWFEZWYodGhpcy5zY2hlbWFzW25hbWVdKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hRGVmKHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljRm9ybU1vZGVsIHtcbiAgICAgICAgaWYgKCFzY2hlbWEpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyB8fCB7fSkubWFwKHAgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBzY2hlbWEucHJvcGVydGllc1twXTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZvcm1Db250cm9sTW9kZWwocHJvcGVydHksIHNjaGVtYSk7XG4gICAgICAgIH0pLmZpbHRlcih0ID0+IG51bGwgIT09IHQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbE1vZGVsKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0Zvcm1Db250cm9sTW9kZWwge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eS5lbnVtKSB8fCBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5vcHRpb25zUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY1NlbGVjdE1vZGVsPGFueT4odGhpcy5nZXRGb3JtU2VsZWN0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNJbnB1dE1vZGVsKHRoaXMuZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY1RleHRBcmVhTW9kZWwodGhpcy5nZXRGb3JtVGV4dGFyZWFDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xuICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNDaGVja2JveE1vZGVsKHRoaXMuZ2V0Rm9ybUNoZWNrYm94Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljU2VsZWN0TW9kZWw8YW55Pih0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xuICAgICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lml0ZW1zPy4kcmVmIHx8IHByb3BlcnR5LiRyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljRm9ybUFycmF5TW9kZWwodGhpcy5nZXRGb3JtQXJyYXlDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaXRlbXM/LmVudW0gfHwgcHJvcGVydHkuZW51bSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNTZWxlY3RNb2RlbDxhbnk+KHRoaXMuZ2V0Rm9ybVNlbGVjdENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljSW5wdXRNb2RlbCh0aGlzLmdldEZvcm1JbnB1dENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNGaWxlVXBsb2FkTW9kZWwodGhpcy5nZXRGb3JtVXBsb2FkQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHkuJHJlZikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljRm9ybUdyb3VwTW9kZWwodGhpcy5nZXRGb3JtR3JvdXBDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWxDb25maWc8YW55PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLmdldFZhbGlkYXRvcnMocHJvcGVydHksIHNjaGVtYSk7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBPYmplY3Qua2V5cyh2YWxpZGF0b3JzKS5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XG4gICAgICAgICAgICByZXNba2V5XSA9IGBlcnJvci4ke2tleX1gO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSwge30pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHByb3BlcnR5LmlkLFxuICAgICAgICAgICAgbGFiZWw6IE9iamVjdFV0aWxzLmlzU3RyaW5nKHByb3BlcnR5LmxhYmVsKSA/IHByb3BlcnR5LmxhYmVsIDogcHJvcGVydHkuaWQsXG4gICAgICAgICAgICBoaWRkZW46IHByb3BlcnR5LmhpZGRlbixcbiAgICAgICAgICAgIGRpc2FibGVkOiBwcm9wZXJ0eS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHZhbGlkYXRvcnMsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VzLFxuICAgICAgICAgICAgYWRkaXRpb25hbDogT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydHkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZvcm1BcnJheUNvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZyB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5Lml0ZW1zPy4kcmVmIHx8IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgc3ViU2NoZW1hID0gdGhpcy5zY2hlbWFzW3JlZi5zcGxpdChcIi9cIikucG9wKCldO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLCB7Z3JvdXBGYWN0b3J5OiAoKSA9PiB0aGlzLmdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzdWJTY2hlbWEpfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZvcm1Hcm91cENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtR3JvdXBNb2RlbENvbmZpZyB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgc3ViU2NoZW1hID0gdGhpcy5zY2hlbWFzW3JlZi5zcGxpdChcIi9cIikucG9wKCldO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLCB7Z3JvdXA6IHRoaXMuZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hRGVmKHN1YlNjaGVtYSl9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0lucHV0TW9kZWxDb25maWcge1xuICAgICAgICBsZXQgaW5wdXRUeXBlID0gU3RyaW5nVXRpbHMuaGFzKHByb3BlcnR5LmlkLCBcInBhc3N3b3JkXCIsIFwiUGFzc3dvcmRcIikgPyBcInBhc3N3b3JkXCIgOiAocHJvcGVydHkuaXRlbXM/LnR5cGUgfHwgcHJvcGVydHkudHlwZSk7XG4gICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IFwidGV4dGFyZWFcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlLFxuICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZTogcHJvcGVydHkuYXV0b0NvbXBsZXRlIHx8IFwib2ZmXCIsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGU6IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgIGFjY2VwdDogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkuYWNjZXB0KSA/IHByb3BlcnR5LmFjY2VwdCA6IG51bGwsXG4gICAgICAgICAgICAgICAgbWFzazogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkubWFzaykgPyBwcm9wZXJ0eS5tYXNrIDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5wYXR0ZXJuKSA/IHByb3BlcnR5LnBhdHRlcm4gOiBudWxsLFxuICAgICAgICAgICAgICAgIHN0ZXA6IGlzTmFOKHByb3BlcnR5LnN0ZXApID8gMSA6IHByb3BlcnR5LnN0ZXAsXG4gICAgICAgICAgICAgICAgbWluOiBpc05hTihwcm9wZXJ0eS5taW4pID8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgOiBwcm9wZXJ0eS5taW4sXG4gICAgICAgICAgICAgICAgbWF4OiBpc05hTihwcm9wZXJ0eS5tYXgpID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBwcm9wZXJ0eS5tYXgsXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZvcm1UZXh0YXJlYUNvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNUZXh0QXJlYU1vZGVsQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbHM6IHByb3BlcnR5LmNvbHMgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICByb3dzOiBwcm9wZXJ0eS5yb3dzIHx8IDEwLFxuICAgICAgICAgICAgICAgIHdyYXA6IHByb3BlcnR5LndyYXAgfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlOiBwcm9wZXJ0eS5hdXRvQ29tcGxldGUgfHwgXCJvZmZcIixcbiAgICAgICAgICAgICAgICBtdWx0aXBsZTogcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVNlbGVjdENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNTZWxlY3RNb2RlbENvbmZpZzxhbnk+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0Rm9ybVNlbGVjdE9wdGlvbnMocHJvcGVydHksIHNjaGVtYSksXG4gICAgICAgICAgICAgICAgbXVsdGlwbGU6IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZvcm1DaGVja2JveENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNDaGVja2JveE1vZGVsQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IHByb3BlcnR5LmluZGV0ZXJtaW5hdGUgPT09IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zOiBEeW5hbWljRm9ybU9wdGlvbkNvbmZpZzxhbnk+W10pOiBQcm9taXNlPER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnPGFueT5bXT4ge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHJldHVybiBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9uLmxhYmVsID0gYXdhaXQgdGhpcy5sYW5ndWFnZS5nZXRUcmFuc2xhdGlvbihvcHRpb24ubGFiZWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRGb3JtU2VsZWN0T3B0aW9ucyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSkge1xuICAgICAgICBjb25zdCAkZW51bSA9IHByb3BlcnR5Lml0ZW1zPy5lbnVtIHx8IHByb3BlcnR5LmVudW07XG4gICAgICAgIGlmIChwcm9wZXJ0eS5vcHRpb25zUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtU3ViamVjdCgoZm9ybU1vZGVsLCBjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwcm9wZXJ0eS5vcHRpb25zUGF0aDtcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gY29udHJvbDtcbiAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiJHJvb3RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKDUpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGFyZ2V0LnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAocGF0aC5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gT2JqZWN0VXRpbHMuZ2V0VmFsdWUodGFyZ2V0LnZhbHVlLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKCFPYmplY3RVdGlscy5pc0FycmF5KHZhbHVlKSA/IFtdOiB2YWx1ZSkubWFwKHZhbHVlID0+ICh7dmFsdWUsIGxhYmVsOiB2YWx1ZX0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzQXJyYXkoJGVudW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1TdWJqZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gJGVudW0ubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBwcm9wZXJ0eS50cmFuc2xhdGFibGUgPyBgJHtwcm9wZXJ0eS5pZH0uJHt2YWx1ZX1gIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWUsIGxhYmVsfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtU3ViamVjdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwaS5jYWNoZVtwcm9wZXJ0eS5lbmRwb2ludF0gPSB0aGlzLmFwaS5jYWNoZVtwcm9wZXJ0eS5lbmRwb2ludF0gfHwgdGhpcy5hcGkubGlzdChwcm9wZXJ0eS5lbmRwb2ludCwgdGhpcy5hcGkubWFrZUxpc3RQYXJhbXMoMSwgLTEpKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVtcy5tYXAoaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IGkuaWQgfHwgaS5faWQsIGxhYmVsOiBpW3Byb3BlcnR5LmxhYmVsRmllbGRdIHx8IGkubGFiZWwgfHwgaS5pZCB8fCBpLl9pZH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXdhaXQgdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdKS5tYXAodCA9PiBPYmplY3QuYXNzaWduKHt9LCB0KSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVVwbG9hZENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGaWxlVXBsb2FkTW9kZWxDb25maWcge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmFwaS51cmwocHJvcGVydHkudXJsIHx8IFwiYXNzZXRzXCIpO1xuICAgICAgICBjb25zdCB7YWNjZXB0LCBhdXRvVXBsb2FkLCBtYXhTaXplLCBtaW5TaXplLCByZW1vdmVVcmwsIHNob3dGaWxlTGlzdH0gPSBwcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgYWNjZXB0LFxuICAgICAgICAgICAgYXV0b1VwbG9hZCxcbiAgICAgICAgICAgIG1heFNpemUsXG4gICAgICAgICAgICBtaW5TaXplLFxuICAgICAgICAgICAgcmVtb3ZlVXJsLFxuICAgICAgICAgICAgc2hvd0ZpbGVMaXN0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRWYWxpZGF0b3JzKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY1ZhbGlkYXRvcnNDb25maWcge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZyA9IHt9O1xuICAgICAgICBpZiAoc2NoZW1hLnJlcXVpcmVkLmluZGV4T2YocHJvcGVydHkuaWQpID49IDApIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucmVxdWlyZWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWluTGVuZ3RoID0gcHJvcGVydHkubWluTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWF4TGVuZ3RoID0gcHJvcGVydHkubWF4TGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5taW4pIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWluID0gcHJvcGVydHkubWluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5tYXgpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWF4ID0gcHJvcGVydHkubWF4O1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkuZm9ybWF0KSB7XG4gICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLmVtYWlsID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgICB9XG59XG4iXX0=
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { EventEmitter, Injectable } from "@angular/core";
|
|
3
|
+
import { FormArray, FormGroup } from "@angular/forms";
|
|
4
|
+
import { Subject } from "rxjs";
|
|
5
|
+
import { DynamicCheckboxModel, DynamicFileUploadModel, DynamicFormComponentService, DynamicFormGroupModel, DynamicFormService as Base, DynamicFormValidationService, DynamicInputModel, DynamicSelectModel, DynamicTextAreaModel, DynamicFormArrayModel as DynamicFormArrayModelBase } from "@ng-dynamic-forms/core";
|
|
6
|
+
import { ObjectUtils, OpenApiService, StringUtils } from "@stemy/ngx-utils";
|
|
7
|
+
import { FormSubject } from "../utils/form-subject";
|
|
8
|
+
import { DynamicFormArrayModel } from "../utils/dynamic-form-array.model";
|
|
9
|
+
export class DynamicFormService extends Base {
|
|
10
|
+
constructor(cs, vs, openApi) {
|
|
11
|
+
super(cs, vs);
|
|
12
|
+
this.openApi = openApi;
|
|
13
|
+
this.onDetectChanges = new EventEmitter();
|
|
14
|
+
}
|
|
15
|
+
get api() {
|
|
16
|
+
return this.openApi.api;
|
|
17
|
+
}
|
|
18
|
+
get language() {
|
|
19
|
+
return this.api.language;
|
|
20
|
+
}
|
|
21
|
+
patchGroup(value, formModel, formGroup) {
|
|
22
|
+
this.patchValueRecursive(value, formModel, formGroup);
|
|
23
|
+
this.detectChanges();
|
|
24
|
+
formGroup.patchValue(ObjectUtils.copy(value));
|
|
25
|
+
}
|
|
26
|
+
patchForm(value, component) {
|
|
27
|
+
this.patchValueRecursive(value, component.model, component.group);
|
|
28
|
+
this.detectChanges(component);
|
|
29
|
+
component.group.patchValue(value);
|
|
30
|
+
}
|
|
31
|
+
serialize(formModel, formGroup) {
|
|
32
|
+
return this.serializeRecursive(formModel, formGroup);
|
|
33
|
+
}
|
|
34
|
+
notifyChanges(formModel, formGroup) {
|
|
35
|
+
this.notifyChangesRecursive(formModel, formGroup);
|
|
36
|
+
}
|
|
37
|
+
updateSelectOptions(formControlModel, formControl) {
|
|
38
|
+
if (formControlModel instanceof DynamicSelectModel) {
|
|
39
|
+
let options = formControlModel.options$;
|
|
40
|
+
if (options instanceof FormSubject) {
|
|
41
|
+
options.notify(formControlModel, formControl);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
while (options instanceof Subject && options.source) {
|
|
45
|
+
options = options.source;
|
|
46
|
+
if (options instanceof FormSubject) {
|
|
47
|
+
options.notify(formControlModel, formControl);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
showErrors(form) {
|
|
53
|
+
this.showErrorsForGroup(form.group);
|
|
54
|
+
this.detectChanges(form);
|
|
55
|
+
}
|
|
56
|
+
detectChanges(formComponent) {
|
|
57
|
+
super.detectChanges(formComponent);
|
|
58
|
+
this.onDetectChanges.emit(formComponent);
|
|
59
|
+
}
|
|
60
|
+
patchValueRecursive(value, formModel, formGroup) {
|
|
61
|
+
Object.keys(value).forEach(key => {
|
|
62
|
+
const subModel = this.findModelById(key, formModel);
|
|
63
|
+
const subValue = value[key];
|
|
64
|
+
if (!subModel)
|
|
65
|
+
return;
|
|
66
|
+
const subControl = this.findControlByModel(subModel, formGroup);
|
|
67
|
+
if (subModel instanceof DynamicSelectModel && ObjectUtils.isObject(subValue)) {
|
|
68
|
+
value[key] = subValue.id || subValue._id || subValue;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (subModel instanceof DynamicFormArrayModelBase) {
|
|
72
|
+
const length = Array.isArray(subValue) ? subValue.length : 0;
|
|
73
|
+
const subArray = subControl;
|
|
74
|
+
while (subModel.size > length) {
|
|
75
|
+
this.removeFormArrayGroup(0, subArray, subModel);
|
|
76
|
+
}
|
|
77
|
+
while (subModel.size < length) {
|
|
78
|
+
this.insertFormArrayGroup(subModel.size, subArray, subModel);
|
|
79
|
+
}
|
|
80
|
+
for (let i = 0; i < length; i++) {
|
|
81
|
+
const itemModel = subModel.get(i);
|
|
82
|
+
this.patchValueRecursive(subValue[i], itemModel.group, subArray.at(i));
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (subModel instanceof DynamicFormGroupModel) {
|
|
87
|
+
this.patchValueRecursive(subValue, subModel.group, subControl);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
serializeRecursive(formModel, formGroup) {
|
|
92
|
+
var _a;
|
|
93
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
+
const result = {};
|
|
95
|
+
if (!formModel || !formGroup || !formGroup.value)
|
|
96
|
+
return result;
|
|
97
|
+
for (const i in formModel) {
|
|
98
|
+
const subModel = formModel[i];
|
|
99
|
+
const subControl = this.findControlByModel(subModel, formGroup);
|
|
100
|
+
const serializer = (_a = subModel.additional) === null || _a === void 0 ? void 0 : _a.serializer;
|
|
101
|
+
if (ObjectUtils.isFunction(serializer)) {
|
|
102
|
+
result[subModel.id] = yield serializer(subModel, subControl);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (subModel instanceof DynamicFormArrayModelBase) {
|
|
106
|
+
const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
|
|
107
|
+
const subArray = subControl;
|
|
108
|
+
const resArray = [];
|
|
109
|
+
for (let i = 0; i < length; i++) {
|
|
110
|
+
const itemModel = subModel.get(i);
|
|
111
|
+
resArray.push(yield this.serializeRecursive(itemModel.group, subArray.at(i)));
|
|
112
|
+
}
|
|
113
|
+
result[subModel.id] = resArray;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (subModel instanceof DynamicFormGroupModel) {
|
|
117
|
+
result[subModel.id] = yield this.serializeRecursive(subModel.group, subControl);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (subModel instanceof DynamicInputModel && !ObjectUtils.isNullOrUndefined(subControl.value)) {
|
|
121
|
+
result[subModel.id] = subModel.inputType == "number"
|
|
122
|
+
? parseFloat((`${subControl.value}` || "0").replace(/,/gi, ".")) || null
|
|
123
|
+
: subControl.value;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
result[subModel.id] = subControl.value;
|
|
127
|
+
}
|
|
128
|
+
return result;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
notifyChangesRecursive(formModel, formGroup) {
|
|
132
|
+
if (!formModel || !formGroup)
|
|
133
|
+
return;
|
|
134
|
+
for (const i in formModel) {
|
|
135
|
+
const subModel = formModel[i];
|
|
136
|
+
const subControl = this.findControlByModel(subModel, formGroup);
|
|
137
|
+
if (subModel instanceof DynamicFormArrayModelBase) {
|
|
138
|
+
const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
|
|
139
|
+
const subArray = subControl;
|
|
140
|
+
for (let i = 0; i < length; i++) {
|
|
141
|
+
const itemModel = subModel.get(i);
|
|
142
|
+
this.notifyChangesRecursive(itemModel.group, subArray.at(i));
|
|
143
|
+
}
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (subModel instanceof DynamicFormGroupModel) {
|
|
147
|
+
this.notifyChangesRecursive(subModel.group, subControl);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
this.updateSelectOptions(subModel, subControl);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
showErrorsForGroup(formGroup) {
|
|
154
|
+
if (!formGroup)
|
|
155
|
+
return;
|
|
156
|
+
formGroup.markAsTouched({ onlySelf: true });
|
|
157
|
+
const controls = Object.keys(formGroup.controls).map(id => formGroup.controls[id]);
|
|
158
|
+
this.showErrorsForControls(controls);
|
|
159
|
+
}
|
|
160
|
+
showErrorsForControls(controls) {
|
|
161
|
+
controls.forEach(control => {
|
|
162
|
+
if (control instanceof FormGroup) {
|
|
163
|
+
this.showErrorsForGroup(control);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
control.markAsTouched({ onlySelf: true });
|
|
167
|
+
if (control instanceof FormArray) {
|
|
168
|
+
this.showErrorsForControls(control.controls);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
getFormModelForSchema(name) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
174
|
+
this.api.cache = {};
|
|
175
|
+
this.schemas = yield this.openApi.getSchemas();
|
|
176
|
+
return this.getFormModelForSchemaDef(this.schemas[name]);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
getFormModelForSchemaDef(schema) {
|
|
180
|
+
if (!schema)
|
|
181
|
+
return [];
|
|
182
|
+
return Object.keys(schema.properties || {}).map(p => {
|
|
183
|
+
const property = schema.properties[p];
|
|
184
|
+
return this.getFormControlModel(property, schema);
|
|
185
|
+
}).filter(t => null !== t);
|
|
186
|
+
}
|
|
187
|
+
getFormControlModel(property, schema) {
|
|
188
|
+
var _a, _b;
|
|
189
|
+
if (Array.isArray(property.enum) || ObjectUtils.isString(property.optionsPath)) {
|
|
190
|
+
return new DynamicSelectModel(this.getFormSelectConfig(property, schema));
|
|
191
|
+
}
|
|
192
|
+
switch (property.type) {
|
|
193
|
+
case "string":
|
|
194
|
+
case "number":
|
|
195
|
+
case "integer":
|
|
196
|
+
return new DynamicInputModel(this.getFormInputConfig(property, schema));
|
|
197
|
+
case "textarea":
|
|
198
|
+
return new DynamicTextAreaModel(this.getFormTextareaConfig(property, schema));
|
|
199
|
+
case "boolean":
|
|
200
|
+
return new DynamicCheckboxModel(this.getFormCheckboxConfig(property, schema));
|
|
201
|
+
case "list":
|
|
202
|
+
return new DynamicSelectModel(this.getFormSelectConfig(property, schema));
|
|
203
|
+
case "array":
|
|
204
|
+
if (((_a = property.items) === null || _a === void 0 ? void 0 : _a.$ref) || property.$ref) {
|
|
205
|
+
return new DynamicFormArrayModel(this.getFormArrayConfig(property, schema));
|
|
206
|
+
}
|
|
207
|
+
else if (((_b = property.items) === null || _b === void 0 ? void 0 : _b.enum) || property.enum) {
|
|
208
|
+
return new DynamicSelectModel(this.getFormSelectConfig(property, schema));
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
return new DynamicInputModel(this.getFormInputConfig(property, schema));
|
|
212
|
+
}
|
|
213
|
+
case "file":
|
|
214
|
+
return new DynamicFileUploadModel(this.getFormUploadConfig(property, schema));
|
|
215
|
+
}
|
|
216
|
+
if (property.$ref) {
|
|
217
|
+
return new DynamicFormGroupModel(this.getFormGroupConfig(property, schema));
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
getFormControlConfig(property, schema) {
|
|
222
|
+
const validators = this.getValidators(property, schema);
|
|
223
|
+
const errorMessages = Object.keys(validators).reduce((res, key) => {
|
|
224
|
+
res[key] = `error.${key}`;
|
|
225
|
+
return res;
|
|
226
|
+
}, {});
|
|
227
|
+
return {
|
|
228
|
+
id: property.id,
|
|
229
|
+
label: ObjectUtils.isString(property.label) ? property.label : property.id,
|
|
230
|
+
hidden: property.hidden,
|
|
231
|
+
disabled: property.disabled,
|
|
232
|
+
validators,
|
|
233
|
+
errorMessages,
|
|
234
|
+
additional: Object.assign({}, property)
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
getFormArrayConfig(property, schema) {
|
|
238
|
+
var _a;
|
|
239
|
+
const ref = ((_a = property.items) === null || _a === void 0 ? void 0 : _a.$ref) || property.$ref || "";
|
|
240
|
+
const subSchema = this.schemas[ref.split("/").pop()];
|
|
241
|
+
return Object.assign(this.getFormControlConfig(property, schema), { groupFactory: () => this.getFormModelForSchemaDef(subSchema) });
|
|
242
|
+
}
|
|
243
|
+
getFormGroupConfig(property, schema) {
|
|
244
|
+
const ref = property.$ref || "";
|
|
245
|
+
const subSchema = this.schemas[ref.split("/").pop()];
|
|
246
|
+
return Object.assign(this.getFormControlConfig(property, schema), { group: this.getFormModelForSchemaDef(subSchema) });
|
|
247
|
+
}
|
|
248
|
+
getFormInputConfig(property, schema) {
|
|
249
|
+
var _a;
|
|
250
|
+
let inputType = StringUtils.has(property.id, "password", "Password") ? "password" : (((_a = property.items) === null || _a === void 0 ? void 0 : _a.type) || property.type);
|
|
251
|
+
switch (inputType) {
|
|
252
|
+
case "boolean":
|
|
253
|
+
inputType = "checkbox";
|
|
254
|
+
break;
|
|
255
|
+
case "textarea":
|
|
256
|
+
inputType = "textarea";
|
|
257
|
+
break;
|
|
258
|
+
case "integer":
|
|
259
|
+
inputType = "number";
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
263
|
+
inputType,
|
|
264
|
+
autoComplete: property.autoComplete || "off",
|
|
265
|
+
multiple: property.type == "array",
|
|
266
|
+
accept: ObjectUtils.isString(property.accept) ? property.accept : null,
|
|
267
|
+
mask: ObjectUtils.isString(property.mask) ? property.mask : null,
|
|
268
|
+
pattern: ObjectUtils.isString(property.pattern) ? property.pattern : null,
|
|
269
|
+
step: isNaN(property.step) ? 1 : property.step,
|
|
270
|
+
min: isNaN(property.min) ? Number.MIN_SAFE_INTEGER : property.min,
|
|
271
|
+
max: isNaN(property.max) ? Number.MAX_SAFE_INTEGER : property.max,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
getFormTextareaConfig(property, schema) {
|
|
275
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
276
|
+
cols: property.cols || null,
|
|
277
|
+
rows: property.rows || 10,
|
|
278
|
+
wrap: property.wrap || false,
|
|
279
|
+
autoComplete: property.autoComplete || "off",
|
|
280
|
+
multiple: property.type == "array"
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
getFormSelectConfig(property, schema) {
|
|
284
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
285
|
+
options: this.getFormSelectOptions(property, schema),
|
|
286
|
+
multiple: property.type == "array"
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
getFormCheckboxConfig(property, schema) {
|
|
290
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
291
|
+
indeterminate: property.indeterminate === true
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
translateOptions(options) {
|
|
295
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
296
|
+
if (!options)
|
|
297
|
+
return [];
|
|
298
|
+
for (const option of options) {
|
|
299
|
+
option.label = yield this.language.getTranslation(option.label);
|
|
300
|
+
}
|
|
301
|
+
return options;
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
getFormSelectOptions(property, schema) {
|
|
305
|
+
var _a;
|
|
306
|
+
const $enum = ((_a = property.items) === null || _a === void 0 ? void 0 : _a.enum) || property.enum;
|
|
307
|
+
if (property.optionsPath) {
|
|
308
|
+
return new FormSubject((formModel, control) => {
|
|
309
|
+
let path = property.optionsPath;
|
|
310
|
+
let target = control;
|
|
311
|
+
if (path.startsWith("$root")) {
|
|
312
|
+
path = path.substr(5);
|
|
313
|
+
while (target.parent) {
|
|
314
|
+
target = target.parent;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
while (path.startsWith(".")) {
|
|
318
|
+
path = path.substr(1);
|
|
319
|
+
if (target.parent) {
|
|
320
|
+
target = target.parent;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
const value = ObjectUtils.getValue(target.value, path);
|
|
324
|
+
const options = (!ObjectUtils.isArray(value) ? [] : value).map(value => ({ value, label: value }));
|
|
325
|
+
return this.translateOptions(options);
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
if (ObjectUtils.isArray($enum)) {
|
|
329
|
+
return new FormSubject(() => {
|
|
330
|
+
const options = $enum.map(value => {
|
|
331
|
+
const label = property.translatable ? `${property.id}.${value}` : value;
|
|
332
|
+
return { value, label };
|
|
333
|
+
});
|
|
334
|
+
return this.translateOptions(options);
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return new FormSubject(() => __awaiter(this, void 0, void 0, function* () {
|
|
338
|
+
this.api.cache[property.endpoint] = this.api.cache[property.endpoint] || this.api.list(property.endpoint, this.api.makeListParams(1, -1)).then(result => {
|
|
339
|
+
return result.items.map(i => {
|
|
340
|
+
return { value: i.id || i._id, label: i[property.labelField] || i.label || i.id || i._id };
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
const options = (yield this.api.cache[property.endpoint]).map(t => Object.assign({}, t));
|
|
344
|
+
return this.translateOptions(options);
|
|
345
|
+
}));
|
|
346
|
+
}
|
|
347
|
+
getFormUploadConfig(property, schema) {
|
|
348
|
+
const url = this.api.url(property.url || "assets");
|
|
349
|
+
const { accept, autoUpload, maxSize, minSize, removeUrl, showFileList } = property;
|
|
350
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
351
|
+
url,
|
|
352
|
+
accept,
|
|
353
|
+
autoUpload,
|
|
354
|
+
maxSize,
|
|
355
|
+
minSize,
|
|
356
|
+
removeUrl,
|
|
357
|
+
showFileList
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
getValidators(property, schema) {
|
|
361
|
+
const validators = {};
|
|
362
|
+
if (ObjectUtils.isArray(schema.required) && schema.required.indexOf(property.id) >= 0) {
|
|
363
|
+
validators.required = null;
|
|
364
|
+
}
|
|
365
|
+
if (property.minLength) {
|
|
366
|
+
validators.minLength = property.minLength;
|
|
367
|
+
}
|
|
368
|
+
if (property.maxLength) {
|
|
369
|
+
validators.maxLength = property.maxLength;
|
|
370
|
+
}
|
|
371
|
+
if (property.min) {
|
|
372
|
+
validators.min = property.min;
|
|
373
|
+
}
|
|
374
|
+
if (property.max) {
|
|
375
|
+
validators.max = property.max;
|
|
376
|
+
}
|
|
377
|
+
switch (property.format) {
|
|
378
|
+
case "email":
|
|
379
|
+
validators.email = null;
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
return validators;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
DynamicFormService.decorators = [
|
|
386
|
+
{ type: Injectable }
|
|
387
|
+
];
|
|
388
|
+
DynamicFormService.ctorParameters = () => [
|
|
389
|
+
{ type: DynamicFormComponentService },
|
|
390
|
+
{ type: DynamicFormValidationService },
|
|
391
|
+
{ type: OpenApiService }
|
|
392
|
+
];
|
|
393
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LWR5bmFtaWMtZm9ybS9zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFrQixTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQ0gsb0JBQW9CLEVBRXBCLHNCQUFzQixFQUd0QiwyQkFBMkIsRUFFM0IscUJBQXFCLEVBSXJCLGtCQUFrQixJQUFJLElBQUksRUFDMUIsNEJBQTRCLEVBRzVCLGlCQUFpQixFQUVqQixrQkFBa0IsRUFFbEIsb0JBQW9CLEVBR3BCLHFCQUFxQixJQUFJLHlCQUF5QixFQUNyRCxNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFNSCxXQUFXLEVBQ1gsY0FBYyxFQUNkLFdBQVcsRUFDZCxNQUFNLGtCQUFrQixDQUFDO0FBSTFCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMscUJBQXFCLEVBQThCLE1BQU0sbUNBQW1DLENBQUM7QUFHckcsTUFBTSxPQUFPLGtCQUFtQixTQUFRLElBQUk7SUFheEMsWUFBWSxFQUErQixFQUFFLEVBQWdDLEVBQVcsT0FBdUI7UUFDM0csS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQURzRSxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUUzRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO0lBQ3BFLENBQUM7SUFkRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFD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RCxRQUFRLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDckIsS0FBSyxPQUFPO2dCQUNSLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixNQUFNO1NBQ2I7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDOzs7WUFsWkosVUFBVTs7O1lBbkNQLDJCQUEyQjtZQU8zQiw0QkFBNEI7WUFtQjVCLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1xyXG4gICAgRHluYW1pY0NoZWNrYm94TW9kZWwsXHJcbiAgICBEeW5hbWljQ2hlY2tib3hNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNGaWxlVXBsb2FkTW9kZWwsXHJcbiAgICBEeW5hbWljRmlsZVVwbG9hZE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY0Zvcm1Db21wb25lbnQsXHJcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCxcclxuICAgIER5bmFtaWNGb3JtR3JvdXBNb2RlbCxcclxuICAgIER5bmFtaWNGb3JtR3JvdXBNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNGb3JtTW9kZWwsXHJcbiAgICBEeW5hbWljRm9ybU9wdGlvbkNvbmZpZyxcclxuICAgIER5bmFtaWNGb3JtU2VydmljZSBhcyBCYXNlLFxyXG4gICAgRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSxcclxuICAgIER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWwsXHJcbiAgICBEeW5hbWljRm9ybVZhbHVlQ29udHJvbE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY0lucHV0TW9kZWwsXHJcbiAgICBEeW5hbWljSW5wdXRNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNTZWxlY3RNb2RlbCxcclxuICAgIER5bmFtaWNTZWxlY3RNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNUZXh0QXJlYU1vZGVsLFxyXG4gICAgRHluYW1pY1RleHRBcmVhTW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZyxcclxuICAgIER5bmFtaWNGb3JtQXJyYXlNb2RlbCBhcyBEeW5hbWljRm9ybUFycmF5TW9kZWxCYXNlXHJcbn0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICAgIElBcGlTZXJ2aWNlLFxyXG4gICAgSUxhbmd1YWdlU2VydmljZSxcclxuICAgIElPcGVuQXBpU2NoZW1hLFxyXG4gICAgSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSxcclxuICAgIElPcGVuQXBpU2NoZW1hcyxcclxuICAgIE9iamVjdFV0aWxzLFxyXG4gICAgT3BlbkFwaVNlcnZpY2UsXHJcbiAgICBTdHJpbmdVdGlsc1xyXG59IGZyb20gXCJAc3RlbXkvbmd4LXV0aWxzXCI7XHJcblxyXG5pbXBvcnQge0lGb3JtQ29udHJvbFNlcmlhbGl6ZXJ9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbmltcG9ydCB7Rm9ybVN1YmplY3R9IGZyb20gXCIuLi91dGlscy9mb3JtLXN1YmplY3RcIjtcclxuaW1wb3J0IHtEeW5hbWljRm9ybUFycmF5TW9kZWwsIER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZ30gZnJvbSBcIi4uL3V0aWxzL2R5bmFtaWMtZm9ybS1hcnJheS5tb2RlbFwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1TZXJ2aWNlIGV4dGVuZHMgQmFzZSB7XHJcblxyXG4gICAgZ2V0IGFwaSgpOiBJQXBpU2VydmljZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFwaS5hcGk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhbmd1YWdlKCk6IElMYW5ndWFnZVNlcnZpY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5sYW5ndWFnZTtcclxuICAgIH1cclxuXHJcbiAgICByZWFkb25seSBvbkRldGVjdENoYW5nZXM6IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbXBvbmVudD47XHJcbiAgICBwcm90ZWN0ZWQgc2NoZW1hczogSU9wZW5BcGlTY2hlbWFzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNzOiBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsIHZzOiBEeW5hbWljRm9ybVZhbGlkYXRpb25TZXJ2aWNlLCByZWFkb25seSBvcGVuQXBpOiBPcGVuQXBpU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKGNzLCB2cyk7XHJcbiAgICAgICAgdGhpcy5vbkRldGVjdENoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29tcG9uZW50PigpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoR3JvdXAodmFsdWU6IGFueSwgZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZSwgZm9ybU1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIGZvcm1Hcm91cC5wYXRjaFZhbHVlKE9iamVjdFV0aWxzLmNvcHkodmFsdWUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaEZvcm0odmFsdWU6IGFueSwgY29tcG9uZW50OiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZSwgY29tcG9uZW50Lm1vZGVsLCBjb21wb25lbnQuZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcyhjb21wb25lbnQpO1xyXG4gICAgICAgIGNvbXBvbmVudC5ncm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXJpYWxpemUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplUmVjdXJzaXZlKGZvcm1Nb2RlbCwgZm9ybUdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICBub3RpZnlDaGFuZ2VzKGZvcm1Nb2RlbDogRHluYW1pY0Zvcm1Nb2RlbCwgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoZm9ybU1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVNlbGVjdE9wdGlvbnMoZm9ybUNvbnRyb2xNb2RlbDogRHluYW1pY0Zvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZm9ybUNvbnRyb2xNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNTZWxlY3RNb2RlbCkge1xyXG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IGZvcm1Db250cm9sTW9kZWwub3B0aW9ucyQ7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgRm9ybVN1YmplY3QpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMubm90aWZ5KGZvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZSAob3B0aW9ucyBpbnN0YW5jZW9mIFN1YmplY3QgJiYgb3B0aW9ucy5zb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLnNvdXJjZTtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgRm9ybVN1YmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vdGlmeShmb3JtQ29udHJvbE1vZGVsLCBmb3JtQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Vycm9ycyhmb3JtOiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2hvd0Vycm9yc0Zvckdyb3VwKGZvcm0uZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcyhmb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRlY3RDaGFuZ2VzKGZvcm1Db21wb25lbnQ/OiBEeW5hbWljRm9ybUNvbXBvbmVudCkge1xyXG4gICAgICAgIHN1cGVyLmRldGVjdENoYW5nZXMoZm9ybUNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5vbkRldGVjdENoYW5nZXMuZW1pdChmb3JtQ29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZTogYW55LCBmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSB0aGlzLmZpbmRNb2RlbEJ5SWQoa2V5LCBmb3JtTW9kZWwpO1xyXG4gICAgICAgICAgICBjb25zdCBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgICAgIGlmICghc3ViTW9kZWwpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljU2VsZWN0TW9kZWwgJiYgT2JqZWN0VXRpbHMuaXNPYmplY3Qoc3ViVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZVtrZXldID0gc3ViVmFsdWUuaWQgfHwgc3ViVmFsdWUuX2lkIHx8IHN1YlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQXJyYXlNb2RlbEJhc2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViVmFsdWUpID8gc3ViVmFsdWUubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFycmF5ID0gc3ViQ29udHJvbCBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3ViTW9kZWwuc2l6ZSA+IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9ybUFycmF5R3JvdXAoMCwgc3ViQXJyYXksIHN1Yk1vZGVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlIChzdWJNb2RlbC5zaXplIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRGb3JtQXJyYXlHcm91cChzdWJNb2RlbC5zaXplLCBzdWJBcnJheSwgc3ViTW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Nb2RlbCA9IHN1Yk1vZGVsLmdldChpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGNoVmFsdWVSZWN1cnNpdmUoc3ViVmFsdWVbaV0sIGl0ZW1Nb2RlbC5ncm91cCwgc3ViQXJyYXkuYXQoaSkgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZShzdWJWYWx1ZSwgc3ViTW9kZWwuZ3JvdXAsIHN1YkNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyBzZXJpYWxpemVSZWN1cnNpdmUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XHJcbiAgICAgICAgaWYgKCFmb3JtTW9kZWwgfHwgIWZvcm1Hcm91cCB8fCAhZm9ybUdyb3VwLnZhbHVlKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBmb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBmb3JtTW9kZWxbaV0gYXMgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbDxhbnk+O1xyXG4gICAgICAgICAgICBjb25zdCBzdWJDb250cm9sID0gdGhpcy5maW5kQ29udHJvbEJ5TW9kZWwoc3ViTW9kZWwsIGZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBzdWJNb2RlbC5hZGRpdGlvbmFsPy5zZXJpYWxpemVyIGFzIElGb3JtQ29udHJvbFNlcmlhbGl6ZXI7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc0Z1bmN0aW9uKHNlcmlhbGl6ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gYXdhaXQgc2VyaWFsaXplcihzdWJNb2RlbCwgc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUFycmF5TW9kZWxCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBBcnJheS5pc0FycmF5KHN1YkNvbnRyb2wudmFsdWUpID8gc3ViQ29udHJvbC52YWx1ZS5sZW5ndGggOiAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQXJyYXkgPSBzdWJDb250cm9sIGFzIEZvcm1BcnJheTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc0FycmF5ID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbU1vZGVsID0gc3ViTW9kZWwuZ2V0KGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc0FycmF5LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VyaWFsaXplUmVjdXJzaXZlKGl0ZW1Nb2RlbC5ncm91cCwgc3ViQXJyYXkuYXQoaSkgYXMgRm9ybUdyb3VwKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gcmVzQXJyYXk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZVJlY3Vyc2l2ZShzdWJNb2RlbC5ncm91cCwgc3ViQ29udHJvbCBhcyBGb3JtR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0lucHV0TW9kZWwgJiYgIU9iamVjdFV0aWxzLmlzTnVsbE9yVW5kZWZpbmVkKHN1YkNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gc3ViTW9kZWwuaW5wdXRUeXBlID09IFwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlRmxvYXQoKGAke3N1YkNvbnRyb2wudmFsdWV9YCB8fCBcIjBcIikucmVwbGFjZSgvLC9naSwgXCIuXCIpKSB8fCBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgOiBzdWJDb250cm9sLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IHN1YkNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZm9ybU1vZGVsIHx8ICFmb3JtR3JvdXApIHJldHVybjtcclxuICAgICAgICBmb3IgKGNvbnN0IGkgaW4gZm9ybU1vZGVsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1Yk1vZGVsID0gZm9ybU1vZGVsW2ldIGFzIER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWw8YW55PjtcclxuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUFycmF5TW9kZWxCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBBcnJheS5pc0FycmF5KHN1YkNvbnRyb2wudmFsdWUpID8gc3ViQ29udHJvbC52YWx1ZS5sZW5ndGggOiAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViQXJyYXkgPSBzdWJDb250cm9sIGFzIEZvcm1BcnJheTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtTW9kZWwgPSBzdWJNb2RlbC5nZXQoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzUmVjdXJzaXZlKGl0ZW1Nb2RlbC5ncm91cCwgc3ViQXJyYXkuYXQoaSkgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzUmVjdXJzaXZlKHN1Yk1vZGVsLmdyb3VwLCBzdWJDb250cm9sIGFzIEZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdE9wdGlvbnMoc3ViTW9kZWwsIHN1YkNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2hvd0Vycm9yc0Zvckdyb3VwKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFmb3JtR3JvdXApIHJldHVybjtcclxuICAgICAgICBmb3JtR3JvdXAubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcclxuICAgICAgICBjb25zdCBjb250cm9scyA9IE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykubWFwKGlkID0+IGZvcm1Hcm91cC5jb250cm9sc1tpZF0pO1xyXG4gICAgICAgIHRoaXMuc2hvd0Vycm9yc0ZvckNvbnRyb2xzKGNvbnRyb2xzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2hvd0Vycm9yc0ZvckNvbnRyb2xzKGNvbnRyb2xzOiBBYnN0cmFjdENvbnRyb2xbXSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JHcm91cChjb250cm9sKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmOiB0cnVlfSk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9sLmNvbnRyb2xzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEZvcm1Nb2RlbEZvclNjaGVtYShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPER5bmFtaWNGb3JtTW9kZWw+IHtcclxuICAgICAgICB0aGlzLmFwaS5jYWNoZSA9IHt9O1xyXG4gICAgICAgIHRoaXMuc2NoZW1hcyA9IGF3YWl0IHRoaXMub3BlbkFwaS5nZXRTY2hlbWFzKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hRGVmKHRoaXMuc2NoZW1hc1tuYW1lXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0Zvcm1Nb2RlbCB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMgfHwge30pLm1hcChwID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBzY2hlbWEucHJvcGVydGllc1twXTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUNvbnRyb2xNb2RlbChwcm9wZXJ0eSwgc2NoZW1hKTtcclxuICAgICAgICB9KS5maWx0ZXIodCA9PiBudWxsICE9PSB0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybUNvbnRyb2xNb2RlbChwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eS5lbnVtKSB8fCBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5vcHRpb25zUGF0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljU2VsZWN0TW9kZWw8YW55Pih0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNJbnB1dE1vZGVsKHRoaXMuZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgY2FzZSBcInRleHRhcmVhXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNUZXh0QXJlYU1vZGVsKHRoaXMuZ2V0Rm9ybVRleHRhcmVhQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY0NoZWNrYm94TW9kZWwodGhpcy5nZXRGb3JtQ2hlY2tib3hDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwibGlzdFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljU2VsZWN0TW9kZWw8YW55Pih0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcclxuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pdGVtcz8uJHJlZiB8fCBwcm9wZXJ0eS4kcmVmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljRm9ybUFycmF5TW9kZWwodGhpcy5nZXRGb3JtQXJyYXlDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5pdGVtcz8uZW51bSB8fCBwcm9wZXJ0eS5lbnVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljU2VsZWN0TW9kZWw8YW55Pih0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNJbnB1dE1vZGVsKHRoaXMuZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY0ZpbGVVcGxvYWRNb2RlbCh0aGlzLmdldEZvcm1VcGxvYWRDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvcGVydHkuJHJlZikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNGb3JtR3JvdXBNb2RlbCh0aGlzLmdldEZvcm1Hcm91cENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWxDb25maWc8YW55PiB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuZ2V0VmFsaWRhdG9ycyhwcm9wZXJ0eSwgc2NoZW1hKTtcclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gT2JqZWN0LmtleXModmFsaWRhdG9ycykucmVkdWNlKChyZXMsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICByZXNba2V5XSA9IGBlcnJvci4ke2tleX1gO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpZDogcHJvcGVydHkuaWQsXHJcbiAgICAgICAgICAgIGxhYmVsOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5sYWJlbCkgPyBwcm9wZXJ0eS5sYWJlbCA6IHByb3BlcnR5LmlkLFxyXG4gICAgICAgICAgICBoaWRkZW46IHByb3BlcnR5LmhpZGRlbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IHByb3BlcnR5LmRpc2FibGVkLFxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLFxyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsOiBPYmplY3QuYXNzaWduKHt9LCBwcm9wZXJ0eSlcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtQXJyYXlDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljRm9ybUFycmF5TW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5Lml0ZW1zPy4kcmVmIHx8IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcclxuICAgICAgICBjb25zdCBzdWJTY2hlbWEgPSB0aGlzLnNjaGVtYXNbcmVmLnNwbGl0KFwiL1wiKS5wb3AoKV07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge2dyb3VwRmFjdG9yeTogKCkgPT4gdGhpcy5nZXRGb3JtTW9kZWxGb3JTY2hlbWFEZWYoc3ViU2NoZW1hKX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtR3JvdXBDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljRm9ybUdyb3VwTW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcclxuICAgICAgICBjb25zdCBzdWJTY2hlbWEgPSB0aGlzLnNjaGVtYXNbcmVmLnNwbGl0KFwiL1wiKS5wb3AoKV07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge2dyb3VwOiB0aGlzLmdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzdWJTY2hlbWEpfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1JbnB1dENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNJbnB1dE1vZGVsQ29uZmlnIHtcclxuICAgICAgICBsZXQgaW5wdXRUeXBlID0gU3RyaW5nVXRpbHMuaGFzKHByb3BlcnR5LmlkLCBcInBhc3N3b3JkXCIsIFwiUGFzc3dvcmRcIikgPyBcInBhc3N3b3JkXCIgOiAocHJvcGVydHkuaXRlbXM/LnR5cGUgfHwgcHJvcGVydHkudHlwZSk7XHJcbiAgICAgICAgc3dpdGNoIChpbnB1dFR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcclxuICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IFwiY2hlY2tib3hcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcclxuICAgICAgICAgICAgICAgIGlucHV0VHlwZSA9IFwidGV4dGFyZWFcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiaW50ZWdlclwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlLFxyXG4gICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlOiBwcm9wZXJ0eS5hdXRvQ29tcGxldGUgfHwgXCJvZmZcIixcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlOiBwcm9wZXJ0eS50eXBlID09IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgICAgIGFjY2VwdDogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkuYWNjZXB0KSA/IHByb3BlcnR5LmFjY2VwdCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBtYXNrOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5tYXNrKSA/IHByb3BlcnR5Lm1hc2sgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcGF0dGVybjogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkucGF0dGVybikgPyBwcm9wZXJ0eS5wYXR0ZXJuIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0ZXA6IGlzTmFOKHByb3BlcnR5LnN0ZXApID8gMSA6IHByb3BlcnR5LnN0ZXAsXHJcbiAgICAgICAgICAgICAgICBtaW46IGlzTmFOKHByb3BlcnR5Lm1pbikgPyBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiA6IHByb3BlcnR5Lm1pbixcclxuICAgICAgICAgICAgICAgIG1heDogaXNOYU4ocHJvcGVydHkubWF4KSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogcHJvcGVydHkubWF4LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVRleHRhcmVhQ29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY1RleHRBcmVhTW9kZWxDb25maWcge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb2xzOiBwcm9wZXJ0eS5jb2xzIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICByb3dzOiBwcm9wZXJ0eS5yb3dzIHx8IDEwLFxyXG4gICAgICAgICAgICAgICAgd3JhcDogcHJvcGVydHkud3JhcCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZTogcHJvcGVydHkuYXV0b0NvbXBsZXRlIHx8IFwib2ZmXCIsXHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZTogcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljU2VsZWN0TW9kZWxDb25maWc8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0Rm9ybVNlbGVjdE9wdGlvbnMocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZTogcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEZvcm1DaGVja2JveENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNDaGVja2JveE1vZGVsQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogcHJvcGVydHkuaW5kZXRlcm1pbmF0ZSA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYXN5bmMgdHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zOiBEeW5hbWljRm9ybU9wdGlvbkNvbmZpZzxhbnk+W10pOiBQcm9taXNlPER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnPGFueT5bXT4ge1xyXG4gICAgICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgb3B0aW9uLmxhYmVsID0gYXdhaXQgdGhpcy5sYW5ndWFnZS5nZXRUcmFuc2xhdGlvbihvcHRpb24ubGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVNlbGVjdE9wdGlvbnMocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpIHtcclxuICAgICAgICBjb25zdCAkZW51bSA9IHByb3BlcnR5Lml0ZW1zPy5lbnVtIHx8IHByb3BlcnR5LmVudW07XHJcbiAgICAgICAgaWYgKHByb3BlcnR5Lm9wdGlvbnNQYXRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybVN1YmplY3QoKGZvcm1Nb2RlbCwgY29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwcm9wZXJ0eS5vcHRpb25zUGF0aDtcclxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBjb250cm9sO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIiRyb290XCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKDUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXQucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhdGguc3RhcnRzV2l0aChcIi5cIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE9iamVjdFV0aWxzLmdldFZhbHVlKHRhcmdldC52YWx1ZSwgcGF0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKCFPYmplY3RVdGlscy5pc0FycmF5KHZhbHVlKSA/IFtdOiB2YWx1ZSkubWFwKHZhbHVlID0+ICh7dmFsdWUsIGxhYmVsOiB2YWx1ZX0pKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNBcnJheSgkZW51bSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtU3ViamVjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gJGVudW0ubWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHByb3BlcnR5LnRyYW5zbGF0YWJsZSA/IGAke3Byb3BlcnR5LmlkfS4ke3ZhbHVlfWAgOiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3ZhbHVlLCBsYWJlbH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IEZvcm1TdWJqZWN0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdID0gdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdIHx8IHRoaXMuYXBpLmxpc3QocHJvcGVydHkuZW5kcG9pbnQsIHRoaXMuYXBpLm1ha2VMaXN0UGFyYW1zKDEsIC0xKSkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVtcy5tYXAoaSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogaS5pZCB8fCBpLl9pZCwgbGFiZWw6IGlbcHJvcGVydHkubGFiZWxGaWVsZF0gfHwgaS5sYWJlbCB8fCBpLmlkIHx8IGkuX2lkfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChhd2FpdCB0aGlzLmFwaS5jYWNoZVtwcm9wZXJ0eS5lbmRwb2ludF0pLm1hcCh0ID0+IE9iamVjdC5hc3NpZ24oe30sIHQpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVVwbG9hZENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGaWxlVXBsb2FkTW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuYXBpLnVybChwcm9wZXJ0eS51cmwgfHwgXCJhc3NldHNcIik7XHJcbiAgICAgICAgY29uc3Qge2FjY2VwdCwgYXV0b1VwbG9hZCwgbWF4U2l6ZSwgbWluU2l6ZSwgcmVtb3ZlVXJsLCBzaG93RmlsZUxpc3R9ID0gcHJvcGVydHk7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge1xyXG4gICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgIGFjY2VwdCxcclxuICAgICAgICAgICAgYXV0b1VwbG9hZCxcclxuICAgICAgICAgICAgbWF4U2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgcmVtb3ZlVXJsLFxyXG4gICAgICAgICAgICBzaG93RmlsZUxpc3RcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0VmFsaWRhdG9ycyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZyA9IHt9O1xyXG4gICAgICAgIGlmIChPYmplY3RVdGlscy5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkgJiYgc2NoZW1hLnJlcXVpcmVkLmluZGV4T2YocHJvcGVydHkuaWQpID49IDApIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5yZXF1aXJlZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5taW5MZW5ndGgpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5taW5MZW5ndGggPSBwcm9wZXJ0eS5taW5MZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5tYXhMZW5ndGgpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5tYXhMZW5ndGggPSBwcm9wZXJ0eS5tYXhMZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5taW4pIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5taW4gPSBwcm9wZXJ0eS5taW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5tYXgpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5tYXggPSBwcm9wZXJ0eS5tYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkuZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5lbWFpbCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgICB9XHJcbn1cclxuIl19
|