@stemy/ngx-dynamic-form 12.0.0 → 13.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.
- package/esm2020/ngx-dynamic-form/common-types.mjs +97 -0
- package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-array.component.mjs +85 -0
- package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.mjs +109 -0
- package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-group.component.mjs +74 -0
- package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form.component.mjs +158 -0
- package/esm2020/ngx-dynamic-form/directives/async-submit.directive.mjs +111 -0
- package/esm2020/ngx-dynamic-form/ngx-dynamic-form.imports.mjs +22 -0
- package/esm2020/ngx-dynamic-form/ngx-dynamic-form.module.mjs +115 -0
- package/esm2020/ngx-dynamic-form/services/dynamic-form.service.mjs +451 -0
- package/esm2020/ngx-dynamic-form/utils/dynamic-form-array.model.mjs +16 -0
- package/esm2020/ngx-dynamic-form/utils/form-select-subject.mjs +23 -0
- package/esm2020/ngx-dynamic-form/utils/form-subject.mjs +29 -0
- package/esm2020/ngx-dynamic-form/utils/misc.mjs +20 -0
- package/esm2020/ngx-dynamic-form/utils/validators.mjs +56 -0
- package/esm2020/public_api.mjs +14 -0
- package/esm2020/stemy-ngx-dynamic-form.mjs +5 -0
- package/fesm2015/stemy-ngx-dynamic-form.mjs +1341 -0
- package/fesm2015/stemy-ngx-dynamic-form.mjs.map +1 -0
- package/fesm2020/stemy-ngx-dynamic-form.mjs +1313 -0
- package/fesm2020/stemy-ngx-dynamic-form.mjs.map +1 -0
- package/ngx-dynamic-form/common-types.d.ts +42 -262
- package/ngx-dynamic-form/components/base/dynamic-base-form-array.component.d.ts +29 -0
- package/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.d.ts +41 -0
- package/ngx-dynamic-form/components/base/dynamic-base-form-group.component.d.ts +24 -0
- package/ngx-dynamic-form/components/base/dynamic-base-form.component.d.ts +41 -0
- package/ngx-dynamic-form/directives/async-submit.directive.d.ts +10 -3
- package/ngx-dynamic-form/ngx-dynamic-form.imports.d.ts +10 -0
- package/ngx-dynamic-form/ngx-dynamic-form.module.d.ts +14 -17
- package/ngx-dynamic-form/services/dynamic-form.service.d.ts +47 -10
- package/ngx-dynamic-form/utils/dynamic-form-array.model.d.ts +22 -0
- package/ngx-dynamic-form/utils/form-select-subject.d.ts +6 -0
- package/ngx-dynamic-form/utils/form-subject.d.ts +10 -0
- package/ngx-dynamic-form/utils/misc.d.ts +5 -0
- package/ngx-dynamic-form/utils/validators.d.ts +8 -0
- package/package.json +42 -22
- package/public_api.d.ts +10 -14
- package/stemy-ngx-dynamic-form.d.ts +1 -3
- package/bundles/stemy-ngx-dynamic-form.umd.js +0 -2344
- package/bundles/stemy-ngx-dynamic-form.umd.js.map +0 -1
- package/esm2015/ngx-dynamic-form/common-types.js +0 -590
- package/esm2015/ngx-dynamic-form/components/base/dynamic-form-base.component.js +0 -87
- package/esm2015/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.js +0 -91
- package/esm2015/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.js +0 -112
- package/esm2015/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.js +0 -19
- package/esm2015/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.js +0 -69
- package/esm2015/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.js +0 -23
- package/esm2015/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.js +0 -73
- package/esm2015/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.js +0 -20
- package/esm2015/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.js +0 -134
- package/esm2015/ngx-dynamic-form/directives/async-submit.directive.js +0 -89
- package/esm2015/ngx-dynamic-form/directives/dynamic-form-control.directive.js +0 -32
- package/esm2015/ngx-dynamic-form/directives/dynamic-form-group.directive.js +0 -40
- package/esm2015/ngx-dynamic-form/directives/dynamic-form-template.directive.js +0 -38
- package/esm2015/ngx-dynamic-form/ngx-dynamic-form.module.js +0 -83
- package/esm2015/ngx-dynamic-form/services/dynamic-form.service.js +0 -48
- package/esm2015/ngx-dynamic-form/services/form-utilities.js +0 -108
- package/esm2015/ngx-dynamic-form/services/open-api.service.js +0 -130
- package/esm2015/public_api.js +0 -18
- package/esm2015/stemy-ngx-dynamic-form.js +0 -8
- package/fesm2015/stemy-ngx-dynamic-form.js +0 -1731
- package/fesm2015/stemy-ngx-dynamic-form.js.map +0 -1
- package/ngx-dynamic-form/components/base/dynamic-form-base.component.d.ts +0 -44
- package/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.d.ts +0 -21
- package/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.d.ts +0 -16
- package/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.d.ts +0 -6
- package/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.d.ts +0 -12
- package/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.d.ts +0 -6
- package/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.d.ts +0 -9
- package/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.d.ts +0 -5
- package/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.d.ts +0 -26
- package/ngx-dynamic-form/directives/dynamic-form-control.directive.d.ts +0 -12
- package/ngx-dynamic-form/directives/dynamic-form-group.directive.d.ts +0 -14
- package/ngx-dynamic-form/directives/dynamic-form-template.directive.d.ts +0 -16
- package/ngx-dynamic-form/services/form-utilities.d.ts +0 -19
- package/ngx-dynamic-form/services/open-api.service.d.ts +0 -37
- package/stemy-ngx-dynamic-form.metadata.json +0 -1
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import { EventEmitter, Inject, Injectable, Injector } from "@angular/core";
|
|
2
|
+
import { FormArray, FormGroup } from "@angular/forms";
|
|
3
|
+
import { Subject } from "rxjs";
|
|
4
|
+
import { DynamicCheckboxModel, DynamicFileUploadModel, DynamicFormArrayModel as DynamicFormArrayModelBase, DynamicFormGroupModel, DynamicFormService as Base, DynamicInputModel, DynamicSelectModel, DynamicTextAreaModel } from "@ng-dynamic-forms/core";
|
|
5
|
+
import { ObjectUtils, OpenApiService, StringUtils } from "@stemy/ngx-utils";
|
|
6
|
+
import { isStringWithVal, MAX_INPUT_NUM, MIN_INPUT_NUM } from "../utils/misc";
|
|
7
|
+
import { FormSelectSubject } from "../utils/form-select-subject";
|
|
8
|
+
import { FormSubject } from "../utils/form-subject";
|
|
9
|
+
import { DynamicFormArrayModel } from "../utils/dynamic-form-array.model";
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@ng-dynamic-forms/core";
|
|
12
|
+
import * as i2 from "@stemy/ngx-utils";
|
|
13
|
+
export class DynamicFormService extends Base {
|
|
14
|
+
constructor(cs, vs, openApi, injector) {
|
|
15
|
+
super(cs, vs);
|
|
16
|
+
this.openApi = openApi;
|
|
17
|
+
this.injector = injector;
|
|
18
|
+
this.onDetectChanges = new EventEmitter();
|
|
19
|
+
}
|
|
20
|
+
get api() {
|
|
21
|
+
return this.openApi.api;
|
|
22
|
+
}
|
|
23
|
+
get language() {
|
|
24
|
+
return this.api.language;
|
|
25
|
+
}
|
|
26
|
+
patchGroup(value, formModel, formGroup) {
|
|
27
|
+
this.patchValueRecursive(value, formModel, formGroup);
|
|
28
|
+
this.detectChanges();
|
|
29
|
+
formGroup.patchValue(ObjectUtils.copy(value));
|
|
30
|
+
}
|
|
31
|
+
patchForm(value, component) {
|
|
32
|
+
this.patchValueRecursive(value, component.model, component.group);
|
|
33
|
+
this.detectChanges(component);
|
|
34
|
+
component.group.patchValue(value);
|
|
35
|
+
}
|
|
36
|
+
serialize(formModel, formGroup) {
|
|
37
|
+
return this.serializeRecursive(formModel, formGroup);
|
|
38
|
+
}
|
|
39
|
+
notifyChanges(formModel, formGroup, root) {
|
|
40
|
+
this.notifyChangesRecursive(formModel, formGroup, root);
|
|
41
|
+
}
|
|
42
|
+
updateSelectOptions(formControlModel, formControl, root) {
|
|
43
|
+
if (formControlModel instanceof DynamicSelectModel) {
|
|
44
|
+
let options = formControlModel.options$;
|
|
45
|
+
if (options instanceof FormSubject) {
|
|
46
|
+
options.notify(formControlModel, formControl, root);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
while (options instanceof Subject && options.source) {
|
|
50
|
+
options = options.source;
|
|
51
|
+
if (options instanceof FormSubject) {
|
|
52
|
+
options.notify(formControlModel, formControl, root);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
showErrors(form) {
|
|
58
|
+
this.showErrorsForGroup(form.group);
|
|
59
|
+
this.detectChanges(form);
|
|
60
|
+
}
|
|
61
|
+
detectChanges(formComponent) {
|
|
62
|
+
super.detectChanges(formComponent);
|
|
63
|
+
this.onDetectChanges.emit(formComponent);
|
|
64
|
+
}
|
|
65
|
+
patchValueRecursive(value, formModel, formGroup) {
|
|
66
|
+
Object.keys(value).forEach(key => {
|
|
67
|
+
const subModel = this.findModelById(key, formModel);
|
|
68
|
+
const subValue = value[key];
|
|
69
|
+
if (!subModel)
|
|
70
|
+
return;
|
|
71
|
+
const subControl = this.findControlByModel(subModel, formGroup);
|
|
72
|
+
if (subModel instanceof DynamicSelectModel && ObjectUtils.isObject(subValue)) {
|
|
73
|
+
value[key] = subValue.id || subValue._id || subValue;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (subModel instanceof DynamicFormArrayModelBase) {
|
|
77
|
+
const length = Array.isArray(subValue) ? subValue.length : 0;
|
|
78
|
+
const subArray = subControl;
|
|
79
|
+
while (subModel.size > length) {
|
|
80
|
+
this.removeFormArrayGroup(0, subArray, subModel);
|
|
81
|
+
}
|
|
82
|
+
while (subModel.size < length) {
|
|
83
|
+
this.insertFormArrayGroup(subModel.size, subArray, subModel);
|
|
84
|
+
}
|
|
85
|
+
for (let i = 0; i < length; i++) {
|
|
86
|
+
const itemModel = subModel.get(i);
|
|
87
|
+
this.patchValueRecursive(subValue[i], itemModel.group, subArray.at(i));
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (subModel instanceof DynamicFormGroupModel) {
|
|
92
|
+
this.patchValueRecursive(subValue, subModel.group, subControl);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async serializeRecursive(formModel, formGroup) {
|
|
97
|
+
const result = {};
|
|
98
|
+
if (!formModel || !formGroup || !formGroup.value)
|
|
99
|
+
return result;
|
|
100
|
+
for (const i in formModel) {
|
|
101
|
+
const subModel = formModel[i];
|
|
102
|
+
const subControl = this.findControlByModel(subModel, formGroup);
|
|
103
|
+
const serializer = subModel.additional?.serializer;
|
|
104
|
+
if (ObjectUtils.isFunction(serializer)) {
|
|
105
|
+
result[subModel.id] = await serializer(subModel, subControl);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (subModel instanceof DynamicFormArrayModelBase) {
|
|
109
|
+
const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
|
|
110
|
+
const subArray = subControl;
|
|
111
|
+
const resArray = [];
|
|
112
|
+
for (let i = 0; i < length; i++) {
|
|
113
|
+
const itemModel = subModel.get(i);
|
|
114
|
+
resArray.push(await this.serializeRecursive(itemModel.group, subArray.at(i)));
|
|
115
|
+
}
|
|
116
|
+
result[subModel.id] = resArray;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (subModel instanceof DynamicFormGroupModel) {
|
|
120
|
+
result[subModel.id] = await this.serializeRecursive(subModel.group, subControl);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (subModel instanceof DynamicInputModel && !ObjectUtils.isNullOrUndefined(subControl.value)) {
|
|
124
|
+
result[subModel.id] = subModel.inputType == "number"
|
|
125
|
+
? parseFloat((`${subControl.value}` || "0").replace(/,/gi, ".")) ?? null
|
|
126
|
+
: subControl.value;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
result[subModel.id] = subControl.value;
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
notifyChangesRecursive(formModel, formGroup, root) {
|
|
134
|
+
if (!formModel || !formGroup)
|
|
135
|
+
return;
|
|
136
|
+
for (const i in formModel) {
|
|
137
|
+
const subModel = formModel[i];
|
|
138
|
+
const subControl = this.findControlByModel(subModel, formGroup);
|
|
139
|
+
if (subModel instanceof DynamicFormArrayModelBase) {
|
|
140
|
+
const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
|
|
141
|
+
const subArray = subControl;
|
|
142
|
+
for (let i = 0; i < length; i++) {
|
|
143
|
+
const itemModel = subModel.get(i);
|
|
144
|
+
this.notifyChangesRecursive(itemModel.group, subArray.at(i), root);
|
|
145
|
+
}
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (subModel instanceof DynamicFormGroupModel) {
|
|
149
|
+
this.notifyChangesRecursive(subModel.group, subControl, root);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
this.updateSelectOptions(subModel, subControl, root);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
showErrorsForGroup(formGroup) {
|
|
156
|
+
if (!formGroup)
|
|
157
|
+
return;
|
|
158
|
+
formGroup.markAsTouched({ onlySelf: true });
|
|
159
|
+
const controls = Object.keys(formGroup.controls).map(id => formGroup.controls[id]);
|
|
160
|
+
this.showErrorsForControls(controls);
|
|
161
|
+
}
|
|
162
|
+
showErrorsForControls(controls) {
|
|
163
|
+
controls.forEach(control => {
|
|
164
|
+
if (control instanceof FormGroup) {
|
|
165
|
+
this.showErrorsForGroup(control);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
control.markAsTouched({ onlySelf: true });
|
|
169
|
+
if (control instanceof FormArray) {
|
|
170
|
+
this.showErrorsForControls(control.controls);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
async getFormModelForSchema(name, customizeModel) {
|
|
175
|
+
this.api.cache = {};
|
|
176
|
+
this.schemas = await this.openApi.getSchemas();
|
|
177
|
+
const customizeModels = (property, schema, modelType, config) => {
|
|
178
|
+
const model = new modelType(config);
|
|
179
|
+
if (!ObjectUtils.isFunction(customizeModel))
|
|
180
|
+
return [model];
|
|
181
|
+
const res = customizeModel(property, schema, model, config, this.injector);
|
|
182
|
+
return Array.isArray(res) ? res : [res];
|
|
183
|
+
};
|
|
184
|
+
return this.getFormModelForSchemaDef(this.schemas[name], customizeModels);
|
|
185
|
+
}
|
|
186
|
+
getFormModelForSchemaDef(schema, customizeModels) {
|
|
187
|
+
if (!schema)
|
|
188
|
+
return [];
|
|
189
|
+
const keys = Object.keys(schema.properties || {});
|
|
190
|
+
const controls = [];
|
|
191
|
+
for (const p of keys) {
|
|
192
|
+
const property = schema.properties[p];
|
|
193
|
+
controls.push(...this.getFormControlModels(property, schema, customizeModels));
|
|
194
|
+
}
|
|
195
|
+
return controls.filter(t => null !== t);
|
|
196
|
+
}
|
|
197
|
+
getFormControlModels(property, schema, customizeModels) {
|
|
198
|
+
const $enum = property.items?.enum || property.enum;
|
|
199
|
+
if (Array.isArray($enum) || isStringWithVal(property.optionsPath) || isStringWithVal(property.endpoint)) {
|
|
200
|
+
return customizeModels(property, schema, DynamicSelectModel, this.getFormSelectConfig(property, schema));
|
|
201
|
+
}
|
|
202
|
+
switch (property.type) {
|
|
203
|
+
case "string":
|
|
204
|
+
case "number":
|
|
205
|
+
case "integer":
|
|
206
|
+
return customizeModels(property, schema, DynamicInputModel, this.getFormInputConfig(property, schema));
|
|
207
|
+
case "textarea":
|
|
208
|
+
return customizeModels(property, schema, DynamicTextAreaModel, this.getFormTextareaConfig(property, schema));
|
|
209
|
+
case "boolean":
|
|
210
|
+
return customizeModels(property, schema, DynamicCheckboxModel, this.getFormCheckboxConfig(property, schema));
|
|
211
|
+
case "array":
|
|
212
|
+
if (property.items?.$ref || property.$ref) {
|
|
213
|
+
return customizeModels(property, schema, DynamicFormArrayModel, this.getFormArrayConfig(property, schema, customizeModels));
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
return customizeModels(property, schema, DynamicInputModel, this.getFormInputConfig(property, schema));
|
|
217
|
+
}
|
|
218
|
+
case "file":
|
|
219
|
+
return customizeModels(property, schema, DynamicFileUploadModel, this.getFormUploadConfig(property, schema));
|
|
220
|
+
}
|
|
221
|
+
if (property.$ref) {
|
|
222
|
+
return customizeModels(property, schema, DynamicFormGroupModel, this.getFormGroupConfig(property, schema, customizeModels));
|
|
223
|
+
}
|
|
224
|
+
return [];
|
|
225
|
+
}
|
|
226
|
+
findModelByPath(parent, path) {
|
|
227
|
+
if (path.length == 0)
|
|
228
|
+
return parent;
|
|
229
|
+
const next = path.shift();
|
|
230
|
+
if (Array.isArray(parent)) {
|
|
231
|
+
return this.findModelByPath(parent.find(t => t.id == next), path);
|
|
232
|
+
}
|
|
233
|
+
if (parent instanceof DynamicFormGroupModel) {
|
|
234
|
+
return this.findModelByPath(parent.group.find(t => t.id == next), path);
|
|
235
|
+
}
|
|
236
|
+
if (parent instanceof DynamicFormArrayModel) {
|
|
237
|
+
return this.findModelByPath(parent.groups.find(t => t.index == next), path);
|
|
238
|
+
}
|
|
239
|
+
return parent;
|
|
240
|
+
}
|
|
241
|
+
getFormControlConfig(property, schema) {
|
|
242
|
+
const validators = this.getValidators(property, schema);
|
|
243
|
+
const errorMessages = Object.keys(validators).reduce((res, key) => {
|
|
244
|
+
res[key] = `error.${key}`;
|
|
245
|
+
return res;
|
|
246
|
+
}, {});
|
|
247
|
+
return {
|
|
248
|
+
id: property.id,
|
|
249
|
+
label: ObjectUtils.isString(property.label) ? property.label : property.id,
|
|
250
|
+
hidden: property.hidden,
|
|
251
|
+
disabled: property.disabled,
|
|
252
|
+
validators,
|
|
253
|
+
errorMessages,
|
|
254
|
+
additional: Object.assign({}, property)
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
getFormArrayConfig(property, schema, customizeModels) {
|
|
258
|
+
const ref = property.items?.$ref || property.$ref || "";
|
|
259
|
+
const subSchema = this.schemas[ref.split("/").pop()];
|
|
260
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
261
|
+
groupFactory: () => this.getFormModelForSchemaDef(subSchema, customizeModels),
|
|
262
|
+
useTabs: property.useTabs || false
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
getFormGroupConfig(property, schema, customizeModels) {
|
|
266
|
+
const ref = property.$ref || "";
|
|
267
|
+
const subSchema = this.schemas[ref.split("/").pop()];
|
|
268
|
+
return Object.assign(this.getFormControlConfig(property, schema), { group: this.getFormModelForSchemaDef(subSchema, customizeModels) });
|
|
269
|
+
}
|
|
270
|
+
getFormInputConfig(property, schema) {
|
|
271
|
+
let inputType = StringUtils.has(property.id, "password", "Password") ? "password" : (property.format || property.items?.type || property.type);
|
|
272
|
+
switch (inputType) {
|
|
273
|
+
case "boolean":
|
|
274
|
+
inputType = "checkbox";
|
|
275
|
+
break;
|
|
276
|
+
case "textarea":
|
|
277
|
+
inputType = "textarea";
|
|
278
|
+
break;
|
|
279
|
+
case "integer":
|
|
280
|
+
inputType = "number";
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
const sub = property.type == "array" ? property.items || property : property;
|
|
284
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
285
|
+
inputType,
|
|
286
|
+
autoComplete: property.autoComplete || "off",
|
|
287
|
+
multiple: property.type == "array",
|
|
288
|
+
accept: ObjectUtils.isString(property.accept) ? property.accept : null,
|
|
289
|
+
mask: ObjectUtils.isString(property.mask) ? property.mask : null,
|
|
290
|
+
pattern: ObjectUtils.isString(property.pattern) ? property.pattern : null,
|
|
291
|
+
step: isNaN(sub.step) ? (isNaN(property.step) ? 1 : property.step) : sub.step,
|
|
292
|
+
min: isNaN(sub.minimum) ? MIN_INPUT_NUM : sub.minimum,
|
|
293
|
+
max: isNaN(sub.maximum) ? MAX_INPUT_NUM : sub.maximum,
|
|
294
|
+
minLength: isNaN(sub.minLength) ? MIN_INPUT_NUM : sub.minLength,
|
|
295
|
+
maxLength: isNaN(sub.maxLength) ? MAX_INPUT_NUM : sub.maxLength,
|
|
296
|
+
placeholder: property.placeholder || ""
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
getFormTextareaConfig(property, schema) {
|
|
300
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
301
|
+
cols: property.cols || null,
|
|
302
|
+
rows: property.rows || 10,
|
|
303
|
+
wrap: property.wrap || false,
|
|
304
|
+
autoComplete: property.autoComplete || "off",
|
|
305
|
+
multiple: property.type == "array"
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
getFormSelectConfig(property, schema) {
|
|
309
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
310
|
+
options: this.getFormSelectOptions(property, schema),
|
|
311
|
+
multiple: property.type == "array"
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
getFormCheckboxConfig(property, schema) {
|
|
315
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
316
|
+
indeterminate: property.indeterminate === true
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
async translateOptions(options) {
|
|
320
|
+
if (!options)
|
|
321
|
+
return [];
|
|
322
|
+
for (const option of options) {
|
|
323
|
+
option.label = await this.language.getTranslation(option.label);
|
|
324
|
+
}
|
|
325
|
+
return options;
|
|
326
|
+
}
|
|
327
|
+
getFormSelectOptions(property, schema) {
|
|
328
|
+
const $enum = property.items?.enum || property.enum;
|
|
329
|
+
if (Array.isArray($enum)) {
|
|
330
|
+
return new FormSelectSubject(() => {
|
|
331
|
+
const options = $enum.map(value => {
|
|
332
|
+
const label = property.translatable ? `${property.id}.${value}` : `${value}`;
|
|
333
|
+
return { value, label };
|
|
334
|
+
});
|
|
335
|
+
return this.translateOptions(options);
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
if (isStringWithVal(property.optionsPath)) {
|
|
339
|
+
return new FormSelectSubject((formModel, control, root, indexes) => {
|
|
340
|
+
let path = property.optionsPath;
|
|
341
|
+
let target = control;
|
|
342
|
+
let model = formModel;
|
|
343
|
+
if (path.startsWith("$root")) {
|
|
344
|
+
path = path.substr(5);
|
|
345
|
+
while (target.parent) {
|
|
346
|
+
target = target.parent;
|
|
347
|
+
}
|
|
348
|
+
model = root;
|
|
349
|
+
}
|
|
350
|
+
while (path.startsWith(".")) {
|
|
351
|
+
path = path.substr(1);
|
|
352
|
+
if (target.parent) {
|
|
353
|
+
target = target.parent;
|
|
354
|
+
}
|
|
355
|
+
model = model.parent || root;
|
|
356
|
+
}
|
|
357
|
+
Object.keys(indexes).forEach(key => {
|
|
358
|
+
path = path.replace(key, indexes[key]);
|
|
359
|
+
});
|
|
360
|
+
model = this.findModelByPath(model, path.split("."));
|
|
361
|
+
const modelOptions = (model instanceof DynamicSelectModel ? model.options : []);
|
|
362
|
+
const value = ObjectUtils.getValue(target.value, path);
|
|
363
|
+
const options = (!ObjectUtils.isArray(value) ? [] : value).map(value => {
|
|
364
|
+
const modelOption = modelOptions.find(t => t.value == value);
|
|
365
|
+
return { value, label: modelOption?.label || value };
|
|
366
|
+
});
|
|
367
|
+
return this.translateOptions(options);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
return new FormSelectSubject(async () => {
|
|
371
|
+
this.api.cache[property.endpoint] = this.api.cache[property.endpoint] || this.api.list(property.endpoint, this.api.makeListParams(1, -1)).then(result => {
|
|
372
|
+
return result.items.map(i => {
|
|
373
|
+
return { value: i.id || i._id, label: i[property.labelField] || i.label || i.id || i._id };
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
const options = (await this.api.cache[property.endpoint]).map(t => Object.assign({}, t));
|
|
377
|
+
return this.translateOptions(options);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
getFormUploadConfig(property, schema) {
|
|
381
|
+
const url = this.api.url(property.url || "assets");
|
|
382
|
+
const { accept, autoUpload, maxSize, minSize, removeUrl, showFileList } = property;
|
|
383
|
+
return Object.assign(this.getFormControlConfig(property, schema), {
|
|
384
|
+
url,
|
|
385
|
+
accept,
|
|
386
|
+
autoUpload,
|
|
387
|
+
maxSize,
|
|
388
|
+
minSize,
|
|
389
|
+
removeUrl,
|
|
390
|
+
showFileList
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
getValidators(property, schema) {
|
|
394
|
+
const validators = {};
|
|
395
|
+
if (ObjectUtils.isArray(schema.required) && schema.required.indexOf(property.id) >= 0) {
|
|
396
|
+
validators.required = null;
|
|
397
|
+
}
|
|
398
|
+
this.addPropertyValidators(validators, property);
|
|
399
|
+
this.addItemsValidators(validators, property.items);
|
|
400
|
+
return validators;
|
|
401
|
+
}
|
|
402
|
+
addPropertyValidators(validators, property) {
|
|
403
|
+
if (!property)
|
|
404
|
+
return;
|
|
405
|
+
if (!isNaN(property.minLength)) {
|
|
406
|
+
validators.minLength = property.minLength;
|
|
407
|
+
}
|
|
408
|
+
if (!isNaN(property.maxLength)) {
|
|
409
|
+
validators.maxLength = property.maxLength;
|
|
410
|
+
}
|
|
411
|
+
if (!isNaN(property.minimum)) {
|
|
412
|
+
validators.min = property.minimum;
|
|
413
|
+
}
|
|
414
|
+
if (!isNaN(property.maximum)) {
|
|
415
|
+
validators.max = property.maximum;
|
|
416
|
+
}
|
|
417
|
+
switch (property.format) {
|
|
418
|
+
case "email":
|
|
419
|
+
validators.email = null;
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
addItemsValidators(validators, items) {
|
|
424
|
+
if (!items)
|
|
425
|
+
return;
|
|
426
|
+
if (!isNaN(items.minLength)) {
|
|
427
|
+
validators.itemsMinLength = items.minLength;
|
|
428
|
+
}
|
|
429
|
+
if (!isNaN(items.maxLength)) {
|
|
430
|
+
validators.itemsMaxLength = items.maxLength;
|
|
431
|
+
}
|
|
432
|
+
if (!isNaN(items.minimum)) {
|
|
433
|
+
validators.itemsMinValue = items.minimum;
|
|
434
|
+
}
|
|
435
|
+
if (!isNaN(items.maximum)) {
|
|
436
|
+
validators.itemsMaxValue = items.maximum;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
DynamicFormService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicFormService, deps: [{ token: i1.DynamicFormComponentService }, { token: i1.DynamicFormValidationService }, { token: OpenApiService }, { token: Injector }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
441
|
+
DynamicFormService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicFormService });
|
|
442
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicFormService, decorators: [{
|
|
443
|
+
type: Injectable
|
|
444
|
+
}], ctorParameters: function () { return [{ type: i1.DynamicFormComponentService }, { type: i1.DynamicFormValidationService }, { type: i2.OpenApiService, decorators: [{
|
|
445
|
+
type: Inject,
|
|
446
|
+
args: [OpenApiService]
|
|
447
|
+
}] }, { type: i0.Injector, decorators: [{
|
|
448
|
+
type: Inject,
|
|
449
|
+
args: [Injector]
|
|
450
|
+
}] }]; } });
|
|
451
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LWR5bmFtaWMtZm9ybS9zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBa0IsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUNILG9CQUFvQixFQUVwQixzQkFBc0IsRUFFdEIscUJBQXFCLElBQUkseUJBQXlCLEVBS2xELHFCQUFxQixFQUlyQixrQkFBa0IsSUFBSSxJQUFJLEVBSTFCLGlCQUFpQixFQUVqQixrQkFBa0IsRUFFbEIsb0JBQW9CLEVBR3ZCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQU1ILFdBQVcsRUFDWCxjQUFjLEVBQ2QsV0FBVyxFQUNkLE1BQU0sa0JBQWtCLENBQUM7QUFJMUIsT0FBTyxFQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMscUJBQXFCLEVBQThCLE1BQU0sbUNBQW1DLENBQUM7Ozs7QUFJckcsTUFBTSxPQUFPLGtCQUFtQixTQUFRLElBQUk7SUFheEMsWUFBWSxFQUErQixFQUMvQixFQUFnQyxFQUNDLE9BQXVCLEVBQzdCLFFBQWtCO1FBQ3JELEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFGMkIsWUFBTyxHQUFQLE9BQU8sQ0FB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QUFVOzswQkFnQk0sTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3J9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7U3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtcclxuICAgIER5bmFtaWNDaGVja2JveE1vZGVsLFxyXG4gICAgRHluYW1pY0NoZWNrYm94TW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljRmlsZVVwbG9hZE1vZGVsLFxyXG4gICAgRHluYW1pY0ZpbGVVcGxvYWRNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNGb3JtQXJyYXlNb2RlbCBhcyBEeW5hbWljRm9ybUFycmF5TW9kZWxCYXNlLFxyXG4gICAgRHluYW1pY0Zvcm1Db21wb25lbnQsXHJcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCxcclxuICAgIER5bmFtaWNGb3JtQ29udHJvbE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY0Zvcm1Hcm91cE1vZGVsLFxyXG4gICAgRHluYW1pY0Zvcm1Hcm91cE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY0Zvcm1Nb2RlbCwgRHluYW1pY0Zvcm1PcHRpb24sXHJcbiAgICBEeW5hbWljRm9ybU9wdGlvbkNvbmZpZyxcclxuICAgIER5bmFtaWNGb3JtU2VydmljZSBhcyBCYXNlLFxyXG4gICAgRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSxcclxuICAgIER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWwsXHJcbiAgICBEeW5hbWljRm9ybVZhbHVlQ29udHJvbE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY0lucHV0TW9kZWwsXHJcbiAgICBEeW5hbWljSW5wdXRNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNTZWxlY3RNb2RlbCxcclxuICAgIER5bmFtaWNTZWxlY3RNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNUZXh0QXJlYU1vZGVsLFxyXG4gICAgRHluYW1pY1RleHRBcmVhTW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZ1xyXG59IGZyb20gXCJAbmctZHluYW1pYy1mb3Jtcy9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgICBJQXBpU2VydmljZSxcclxuICAgIElMYW5ndWFnZVNlcnZpY2UsXHJcbiAgICBJT3BlbkFwaVNjaGVtYSxcclxuICAgIElPcGVuQXBpU2NoZW1hUHJvcGVydHksXHJcbiAgICBJT3BlbkFwaVNjaGVtYXMsXHJcbiAgICBPYmplY3RVdGlscyxcclxuICAgIE9wZW5BcGlTZXJ2aWNlLFxyXG4gICAgU3RyaW5nVXRpbHNcclxufSBmcm9tIFwiQHN0ZW15L25neC11dGlsc1wiO1xyXG5cclxuaW1wb3J0IHtGb3JtQ29udHJvbFNlcmlhbGl6ZXIsIEZvcm1Nb2RlbEN1c3RvbWl6ZXIsIEZvcm1Nb2RlbEN1c3RvbWl6ZXJXcmFwLCBNb2RlbFR5cGV9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbmltcG9ydCB7aXNTdHJpbmdXaXRoVmFsLCBNQVhfSU5QVVRfTlVNLCBNSU5fSU5QVVRfTlVNfSBmcm9tIFwiLi4vdXRpbHMvbWlzY1wiO1xyXG5pbXBvcnQge0Zvcm1TZWxlY3RTdWJqZWN0fSBmcm9tIFwiLi4vdXRpbHMvZm9ybS1zZWxlY3Qtc3ViamVjdFwiO1xyXG5pbXBvcnQge0Zvcm1TdWJqZWN0fSBmcm9tIFwiLi4vdXRpbHMvZm9ybS1zdWJqZWN0XCI7XHJcbmltcG9ydCB7RHluYW1pY0Zvcm1BcnJheU1vZGVsLCBEeW5hbWljRm9ybUFycmF5TW9kZWxDb25maWd9IGZyb20gXCIuLi91dGlscy9keW5hbWljLWZvcm0tYXJyYXkubW9kZWxcIjtcclxuaW1wb3J0IHtEeW5hbWljUGF0aGFibGV9IGZyb20gXCJAbmctZHluYW1pYy1mb3Jtcy9jb3JlL2xpYi9tb2RlbC9taXNjL2R5bmFtaWMtZm9ybS1jb250cm9sLXBhdGgubW9kZWxcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtU2VydmljZSBleHRlbmRzIEJhc2Uge1xyXG5cclxuICAgIGdldCBhcGkoKTogSUFwaVNlcnZpY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5BcGkuYXBpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsYW5ndWFnZSgpOiBJTGFuZ3VhZ2VTZXJ2aWNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcGkubGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmVhZG9ubHkgb25EZXRlY3RDaGFuZ2VzOiBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db21wb25lbnQ+O1xyXG4gICAgcHJvdGVjdGVkIHNjaGVtYXM6IElPcGVuQXBpU2NoZW1hcztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihjczogRHluYW1pY0Zvcm1Db21wb25lbnRTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgdnM6IER5bmFtaWNGb3JtVmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KE9wZW5BcGlTZXJ2aWNlKSByZWFkb25seSBvcGVuQXBpOiBPcGVuQXBpU2VydmljZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoSW5qZWN0b3IpIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGNzLCB2cyk7XHJcbiAgICAgICAgdGhpcy5vbkRldGVjdENoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29tcG9uZW50PigpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoR3JvdXAodmFsdWU6IGFueSwgZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZSwgZm9ybU1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIGZvcm1Hcm91cC5wYXRjaFZhbHVlKE9iamVjdFV0aWxzLmNvcHkodmFsdWUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaEZvcm0odmFsdWU6IGFueSwgY29tcG9uZW50OiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZSwgY29tcG9uZW50Lm1vZGVsLCBjb21wb25lbnQuZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcyhjb21wb25lbnQpO1xyXG4gICAgICAgIGNvbXBvbmVudC5ncm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXJpYWxpemUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplUmVjdXJzaXZlKGZvcm1Nb2RlbCwgZm9ybUdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICBub3RpZnlDaGFuZ2VzKGZvcm1Nb2RlbDogRHluYW1pY0Zvcm1Nb2RlbCwgZm9ybUdyb3VwOiBGb3JtR3JvdXAsIHJvb3Q6IER5bmFtaWNGb3JtTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoZm9ybU1vZGVsLCBmb3JtR3JvdXAsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVNlbGVjdE9wdGlvbnMoZm9ybUNvbnRyb2xNb2RlbDogRHluYW1pY0Zvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHJvb3Q6IER5bmFtaWNGb3JtTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZm9ybUNvbnRyb2xNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNTZWxlY3RNb2RlbCkge1xyXG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IGZvcm1Db250cm9sTW9kZWwub3B0aW9ucyQ7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgRm9ybVN1YmplY3QpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMubm90aWZ5KGZvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sLCByb290KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZSAob3B0aW9ucyBpbnN0YW5jZW9mIFN1YmplY3QgJiYgb3B0aW9ucy5zb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLnNvdXJjZTtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgRm9ybVN1YmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vdGlmeShmb3JtQ29udHJvbE1vZGVsLCBmb3JtQ29udHJvbCwgcm9vdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Vycm9ycyhmb3JtOiBEeW5hbWljRm9ybUNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2hvd0Vycm9yc0Zvckdyb3VwKGZvcm0uZ3JvdXApO1xyXG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcyhmb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRlY3RDaGFuZ2VzKGZvcm1Db21wb25lbnQ/OiBEeW5hbWljRm9ybUNvbXBvbmVudCkge1xyXG4gICAgICAgIHN1cGVyLmRldGVjdENoYW5nZXMoZm9ybUNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5vbkRldGVjdENoYW5nZXMuZW1pdChmb3JtQ29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZTogYW55LCBmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSB0aGlzLmZpbmRNb2RlbEJ5SWQoa2V5LCBmb3JtTW9kZWwpO1xyXG4gICAgICAgICAgICBjb25zdCBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgICAgIGlmICghc3ViTW9kZWwpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljU2VsZWN0TW9kZWwgJiYgT2JqZWN0VXRpbHMuaXNPYmplY3Qoc3ViVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZVtrZXldID0gc3ViVmFsdWUuaWQgfHwgc3ViVmFsdWUuX2lkIHx8IHN1YlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQXJyYXlNb2RlbEJhc2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViVmFsdWUpID8gc3ViVmFsdWUubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFycmF5ID0gc3ViQ29udHJvbCBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3ViTW9kZWwuc2l6ZSA+IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9ybUFycmF5R3JvdXAoMCwgc3ViQXJyYXksIHN1Yk1vZGVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlIChzdWJNb2RlbC5zaXplIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRGb3JtQXJyYXlHcm91cChzdWJNb2RlbC5zaXplLCBzdWJBcnJheSwgc3ViTW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Nb2RlbCA9IHN1Yk1vZGVsLmdldChpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGNoVmFsdWVSZWN1cnNpdmUoc3ViVmFsdWVbaV0sIGl0ZW1Nb2RlbC5ncm91cCwgc3ViQXJyYXkuYXQoaSkgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZShzdWJWYWx1ZSwgc3ViTW9kZWwuZ3JvdXAsIHN1YkNvbnRyb2wgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyBzZXJpYWxpemVSZWN1cnNpdmUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XHJcbiAgICAgICAgaWYgKCFmb3JtTW9kZWwgfHwgIWZvcm1Hcm91cCB8fCAhZm9ybUdyb3VwLnZhbHVlKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBmb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBmb3JtTW9kZWxbaV0gYXMgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbDxhbnk+O1xyXG4gICAgICAgICAgICBjb25zdCBzdWJDb250cm9sID0gdGhpcy5maW5kQ29udHJvbEJ5TW9kZWwoc3ViTW9kZWwsIGZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBzdWJNb2RlbC5hZGRpdGlvbmFsPy5zZXJpYWxpemVyIGFzIEZvcm1Db250cm9sU2VyaWFsaXplcjtcclxuICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzRnVuY3Rpb24oc2VyaWFsaXplcikpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSBhd2FpdCBzZXJpYWxpemVyKHN1Yk1vZGVsLCBzdWJDb250cm9sKTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQXJyYXlNb2RlbEJhc2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViQ29udHJvbC52YWx1ZSkgPyBzdWJDb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJBcnJheSA9IHN1YkNvbnRyb2wgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzQXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtTW9kZWwgPSBzdWJNb2RlbC5nZXQoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzQXJyYXkucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJpYWxpemVSZWN1cnNpdmUoaXRlbU1vZGVsLmdyb3VwLCBzdWJBcnJheS5hdChpKSBhcyBGb3JtR3JvdXApXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSByZXNBcnJheTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IGF3YWl0IHRoaXMuc2VyaWFsaXplUmVjdXJzaXZlKHN1Yk1vZGVsLmdyb3VwLCBzdWJDb250cm9sIGFzIEZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljSW5wdXRNb2RlbCAmJiAhT2JqZWN0VXRpbHMuaXNOdWxsT3JVbmRlZmluZWQoc3ViQ29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSBzdWJNb2RlbC5pbnB1dFR5cGUgPT0gXCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VGbG9hdCgoYCR7c3ViQ29udHJvbC52YWx1ZX1gIHx8IFwiMFwiKS5yZXBsYWNlKC8sL2dpLCBcIi5cIikpID8/IG51bGxcclxuICAgICAgICAgICAgICAgICAgICA6IHN1YkNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gc3ViQ29udHJvbC52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwLCByb290OiBEeW5hbWljRm9ybU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFmb3JtTW9kZWwgfHwgIWZvcm1Hcm91cCkgcmV0dXJuO1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBmb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBmb3JtTW9kZWxbaV0gYXMgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbDxhbnk+O1xyXG4gICAgICAgICAgICBjb25zdCBzdWJDb250cm9sID0gdGhpcy5maW5kQ29udHJvbEJ5TW9kZWwoc3ViTW9kZWwsIGZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQXJyYXlNb2RlbEJhc2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViQ29udHJvbC52YWx1ZSkgPyBzdWJDb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJBcnJheSA9IHN1YkNvbnRyb2wgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Nb2RlbCA9IHN1Yk1vZGVsLmdldChpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoaXRlbU1vZGVsLmdyb3VwLCBzdWJBcnJheS5hdChpKSBhcyBGb3JtR3JvdXAsIHJvb3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Hcm91cE1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoc3ViTW9kZWwuZ3JvdXAsIHN1YkNvbnRyb2wgYXMgRm9ybUdyb3VwLCByb290KTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0T3B0aW9ucyhzdWJNb2RlbCwgc3ViQ29udHJvbCwgcm9vdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzaG93RXJyb3JzRm9yR3JvdXAoZm9ybUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWZvcm1Hcm91cCkgcmV0dXJuO1xyXG4gICAgICAgIGZvcm1Hcm91cC5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xzID0gT2JqZWN0LmtleXMoZm9ybUdyb3VwLmNvbnRyb2xzKS5tYXAoaWQgPT4gZm9ybUdyb3VwLmNvbnRyb2xzW2lkXSk7XHJcbiAgICAgICAgdGhpcy5zaG93RXJyb3JzRm9yQ29udHJvbHMoY29udHJvbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzaG93RXJyb3JzRm9yQ29udHJvbHMoY29udHJvbHM6IEFic3RyYWN0Q29udHJvbFtdKTogdm9pZCB7XHJcbiAgICAgICAgY29udHJvbHMuZm9yRWFjaChjb250cm9sID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yc0Zvckdyb3VwKGNvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yc0ZvckNvbnRyb2xzKGNvbnRyb2wuY29udHJvbHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hKG5hbWU6IHN0cmluZywgY3VzdG9taXplTW9kZWw/OiBGb3JtTW9kZWxDdXN0b21pemVyKTogUHJvbWlzZTxEeW5hbWljRm9ybU1vZGVsPiB7XHJcbiAgICAgICAgdGhpcy5hcGkuY2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLnNjaGVtYXMgPSBhd2FpdCB0aGlzLm9wZW5BcGkuZ2V0U2NoZW1hcygpO1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbWl6ZU1vZGVsczogRm9ybU1vZGVsQ3VzdG9taXplcldyYXAgPSAoXHJcbiAgICAgICAgICAgIHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hLFxyXG4gICAgICAgICAgICBtb2RlbFR5cGU6IE1vZGVsVHlwZSwgY29uZmlnOiBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbENvbmZpZykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IG5ldyBtb2RlbFR5cGUoY29uZmlnKTtcclxuICAgICAgICAgICAgaWYgKCFPYmplY3RVdGlscy5pc0Z1bmN0aW9uKGN1c3RvbWl6ZU1vZGVsKSkgcmV0dXJuIFttb2RlbF07XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGN1c3RvbWl6ZU1vZGVsKHByb3BlcnR5LCBzY2hlbWEsIG1vZGVsLCBjb25maWcsIHRoaXMuaW5qZWN0b3IpO1xyXG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyZXMpID8gcmVzIDogW3Jlc107XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRGb3JtTW9kZWxGb3JTY2hlbWFEZWYodGhpcy5zY2hlbWFzW25hbWVdLCBjdXN0b21pemVNb2RlbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtTW9kZWxGb3JTY2hlbWFEZWYoc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSwgY3VzdG9taXplTW9kZWxzOiBGb3JtTW9kZWxDdXN0b21pemVyV3JhcCk6IER5bmFtaWNGb3JtTW9kZWwge1xyXG4gICAgICAgIGlmICghc2NoZW1hKVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzIHx8IHt9KTtcclxuICAgICAgICBjb25zdCBjb250cm9sczogRHluYW1pY0Zvcm1Nb2RlbCA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBrZXlzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gc2NoZW1hLnByb3BlcnRpZXNbcF07XHJcbiAgICAgICAgICAgIGNvbnRyb2xzLnB1c2goLi4udGhpcy5nZXRGb3JtQ29udHJvbE1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBjdXN0b21pemVNb2RlbHMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xzLmZpbHRlcih0ID0+IG51bGwgIT09IHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbE1vZGVscyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSwgY3VzdG9taXplTW9kZWxzOiBGb3JtTW9kZWxDdXN0b21pemVyV3JhcCk6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsW10ge1xyXG4gICAgICAgIGNvbnN0ICRlbnVtID0gcHJvcGVydHkuaXRlbXM/LmVudW0gfHwgcHJvcGVydHkuZW51bTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSgkZW51bSkgfHwgaXNTdHJpbmdXaXRoVmFsKHByb3BlcnR5Lm9wdGlvbnNQYXRoKSB8fCBpc1N0cmluZ1dpdGhWYWwocHJvcGVydHkuZW5kcG9pbnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjdXN0b21pemVNb2RlbHMocHJvcGVydHksIHNjaGVtYSwgRHluYW1pY1NlbGVjdE1vZGVsLCB0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNJbnB1dE1vZGVsLCB0aGlzLmdldEZvcm1JbnB1dENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZU1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBEeW5hbWljVGV4dEFyZWFNb2RlbCwgdGhpcy5nZXRGb3JtVGV4dGFyZWFDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZU1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBEeW5hbWljQ2hlY2tib3hNb2RlbCwgdGhpcy5nZXRGb3JtQ2hlY2tib3hDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcclxuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pdGVtcz8uJHJlZiB8fCBwcm9wZXJ0eS4kcmVmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZU1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBEeW5hbWljRm9ybUFycmF5TW9kZWwsIHRoaXMuZ2V0Rm9ybUFycmF5Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEsIGN1c3RvbWl6ZU1vZGVscykpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNJbnB1dE1vZGVsLCB0aGlzLmdldEZvcm1JbnB1dENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJmaWxlXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNGaWxlVXBsb2FkTW9kZWwsIHRoaXMuZ2V0Rm9ybVVwbG9hZENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wZXJ0eS4kcmVmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjdXN0b21pemVNb2RlbHMocHJvcGVydHksIHNjaGVtYSwgRHluYW1pY0Zvcm1Hcm91cE1vZGVsLCB0aGlzLmdldEZvcm1Hcm91cENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hLCBjdXN0b21pemVNb2RlbHMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRNb2RlbEJ5UGF0aChwYXJlbnQ6IER5bmFtaWNQYXRoYWJsZSB8IER5bmFtaWNGb3JtTW9kZWwsIHBhdGg6IHN0cmluZ1tdKTogRHluYW1pY1BhdGhhYmxlIHtcclxuICAgICAgICBpZiAocGF0aC5sZW5ndGggPT0gMCkgcmV0dXJuIHBhcmVudCBhcyBEeW5hbWljUGF0aGFibGU7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IHBhdGguc2hpZnQoKSBhcyBhbnk7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kTW9kZWxCeVBhdGgocGFyZW50LmZpbmQodCA9PiB0LmlkID09IG5leHQpLCBwYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kTW9kZWxCeVBhdGgocGFyZW50Lmdyb3VwLmZpbmQodCA9PiB0LmlkID09IG5leHQpLCBwYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQXJyYXlNb2RlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kTW9kZWxCeVBhdGgocGFyZW50Lmdyb3Vwcy5maW5kKHQgPT4gdC5pbmRleCA9PSBuZXh0KSwgcGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljRm9ybVZhbHVlQ29udHJvbE1vZGVsQ29uZmlnPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLmdldFZhbGlkYXRvcnMocHJvcGVydHksIHNjaGVtYSk7XHJcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IE9iamVjdC5rZXlzKHZhbGlkYXRvcnMpLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgcmVzW2tleV0gPSBgZXJyb3IuJHtrZXl9YDtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9LCB7fSk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IHByb3BlcnR5LmlkLFxyXG4gICAgICAgICAgICBsYWJlbDogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkubGFiZWwpID8gcHJvcGVydHkubGFiZWwgOiBwcm9wZXJ0eS5pZCxcclxuICAgICAgICAgICAgaGlkZGVuOiBwcm9wZXJ0eS5oaWRkZW4sXHJcbiAgICAgICAgICAgIGRpc2FibGVkOiBwcm9wZXJ0eS5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdmFsaWRhdG9ycyxcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlcyxcclxuICAgICAgICAgICAgYWRkaXRpb25hbDogT2JqZWN0LmFzc2lnbih7fSwgcHJvcGVydHkpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JtQXJyYXlDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEsIGN1c3RvbWl6ZU1vZGVsczogRm9ybU1vZGVsQ3VzdG9taXplcldyYXApOiBEeW5hbWljRm9ybUFycmF5TW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5Lml0ZW1zPy4kcmVmIHx8IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcclxuICAgICAgICBjb25zdCBzdWJTY2hlbWEgPSB0aGlzLnNjaGVtYXNbcmVmLnNwbGl0KFwiL1wiKS5wb3AoKV07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwRmFjdG9yeTogKCkgPT4gdGhpcy5nZXRGb3JtTW9kZWxGb3JTY2hlbWFEZWYoc3ViU2NoZW1hLCBjdXN0b21pemVNb2RlbHMpLFxyXG4gICAgICAgICAgICAgICAgdXNlVGFiczogcHJvcGVydHkudXNlVGFicyB8fCBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JtR3JvdXBDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEsIGN1c3RvbWl6ZU1vZGVsczogRm9ybU1vZGVsQ3VzdG9taXplcldyYXApOiBEeW5hbWljRm9ybUdyb3VwTW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHByb3BlcnR5LiRyZWYgfHwgXCJcIjtcclxuICAgICAgICBjb25zdCBzdWJTY2hlbWEgPSB0aGlzLnNjaGVtYXNbcmVmLnNwbGl0KFwiL1wiKS5wb3AoKV07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge2dyb3VwOiB0aGlzLmdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzdWJTY2hlbWEsIGN1c3RvbWl6ZU1vZGVscyl9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JtSW5wdXRDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljSW5wdXRNb2RlbENvbmZpZyB7XHJcbiAgICAgICAgbGV0IGlucHV0VHlwZSA9IFN0cmluZ1V0aWxzLmhhcyhwcm9wZXJ0eS5pZCwgXCJwYXNzd29yZFwiLCBcIlBhc3N3b3JkXCIpID8gXCJwYXNzd29yZFwiIDogKHByb3BlcnR5LmZvcm1hdCB8fCBwcm9wZXJ0eS5pdGVtcz8udHlwZSB8fCBwcm9wZXJ0eS50eXBlKTtcclxuICAgICAgICBzd2l0Y2ggKGlucHV0VHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJjaGVja2JveFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJ0ZXh0YXJlYVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dFR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1YiA9IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiID8gcHJvcGVydHkuaXRlbXMgfHwgcHJvcGVydHkgOiBwcm9wZXJ0eTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlLFxyXG4gICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlOiBwcm9wZXJ0eS5hdXRvQ29tcGxldGUgfHwgXCJvZmZcIixcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlOiBwcm9wZXJ0eS50eXBlID09IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgICAgIGFjY2VwdDogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkuYWNjZXB0KSA/IHByb3BlcnR5LmFjY2VwdCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBtYXNrOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5tYXNrKSA/IHByb3BlcnR5Lm1hc2sgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcGF0dGVybjogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkucGF0dGVybikgPyBwcm9wZXJ0eS5wYXR0ZXJuIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0ZXA6IGlzTmFOKHN1Yi5zdGVwKSA/IChpc05hTihwcm9wZXJ0eS5zdGVwKSA/IDEgOiBwcm9wZXJ0eS5zdGVwKSA6IHN1Yi5zdGVwLFxyXG4gICAgICAgICAgICAgICAgbWluOiBpc05hTihzdWIubWluaW11bSkgPyBNSU5fSU5QVVRfTlVNIDogc3ViLm1pbmltdW0sXHJcbiAgICAgICAgICAgICAgICBtYXg6IGlzTmFOKHN1Yi5tYXhpbXVtKSA/IE1BWF9JTlBVVF9OVU0gOiBzdWIubWF4aW11bSxcclxuICAgICAgICAgICAgICAgIG1pbkxlbmd0aDogaXNOYU4oc3ViLm1pbkxlbmd0aCkgPyBNSU5fSU5QVVRfTlVNIDogc3ViLm1pbkxlbmd0aCxcclxuICAgICAgICAgICAgICAgIG1heExlbmd0aDogaXNOYU4oc3ViLm1heExlbmd0aCkgPyBNQVhfSU5QVVRfTlVNIDogc3ViLm1heExlbmd0aCxcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwcm9wZXJ0eS5wbGFjZWhvbGRlciB8fCBcIlwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1UZXh0YXJlYUNvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNUZXh0QXJlYU1vZGVsQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29sczogcHJvcGVydHkuY29scyB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgcm93czogcHJvcGVydHkucm93cyB8fCAxMCxcclxuICAgICAgICAgICAgICAgIHdyYXA6IHByb3BlcnR5LndyYXAgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBhdXRvQ29tcGxldGU6IHByb3BlcnR5LmF1dG9Db21wbGV0ZSB8fCBcIm9mZlwiLFxyXG4gICAgICAgICAgICAgICAgbXVsdGlwbGU6IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljU2VsZWN0TW9kZWxDb25maWc8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZ2V0Rm9ybVNlbGVjdE9wdGlvbnMocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZTogcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9ybUNoZWNrYm94Q29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0NoZWNrYm94TW9kZWxDb25maWcge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlOiBwcm9wZXJ0eS5pbmRldGVybWluYXRlID09PSB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyB0cmFuc2xhdGVPcHRpb25zKG9wdGlvbnM6IER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnPGFueT5bXSk6IFByb21pc2U8RHluYW1pY0Zvcm1PcHRpb25Db25maWc8YW55PltdPiB7XHJcbiAgICAgICAgaWYgKCFvcHRpb25zKSByZXR1cm4gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xyXG4gICAgICAgICAgICBvcHRpb24ubGFiZWwgPSBhd2FpdCB0aGlzLmxhbmd1YWdlLmdldFRyYW5zbGF0aW9uKG9wdGlvbi5sYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRGb3JtU2VsZWN0T3B0aW9ucyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSkge1xyXG4gICAgICAgIGNvbnN0ICRlbnVtID0gcHJvcGVydHkuaXRlbXM/LmVudW0gfHwgcHJvcGVydHkuZW51bTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSgkZW51bSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtU2VsZWN0U3ViamVjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gJGVudW0ubWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHByb3BlcnR5LnRyYW5zbGF0YWJsZSA/IGAke3Byb3BlcnR5LmlkfS4ke3ZhbHVlfWAgOiBgJHt2YWx1ZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWUsIGxhYmVsfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc1N0cmluZ1dpdGhWYWwocHJvcGVydHkub3B0aW9uc1BhdGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybVNlbGVjdFN1YmplY3QoKGZvcm1Nb2RlbCwgY29udHJvbCwgcm9vdCwgaW5kZXhlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwcm9wZXJ0eS5vcHRpb25zUGF0aCBhcyBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gY29udHJvbDtcclxuICAgICAgICAgICAgICAgIGxldCBtb2RlbDogRHluYW1pY1BhdGhhYmxlIHwgRHluYW1pY0Zvcm1Nb2RlbCA9IGZvcm1Nb2RlbDtcclxuICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIkcm9vdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cig1KTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGFyZ2V0LnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IHJvb3Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocGF0aC5zdGFydHNXaXRoKFwiLlwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigxKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IChtb2RlbCBhcyBEeW5hbWljUGF0aGFibGUpLnBhcmVudCB8fCByb290O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaW5kZXhlcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2Uoa2V5LCBpbmRleGVzW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBtb2RlbCA9IHRoaXMuZmluZE1vZGVsQnlQYXRoKG1vZGVsLCBwYXRoLnNwbGl0KFwiLlwiKSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbE9wdGlvbnMgPSAobW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljU2VsZWN0TW9kZWwgPyBtb2RlbC5vcHRpb25zIDogW10pIGFzIER5bmFtaWNGb3JtT3B0aW9uPGFueT5bXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gT2JqZWN0VXRpbHMuZ2V0VmFsdWUodGFyZ2V0LnZhbHVlLCBwYXRoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoIU9iamVjdFV0aWxzLmlzQXJyYXkodmFsdWUpID8gW10gOiB2YWx1ZSkubWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbE9wdGlvbiA9IG1vZGVsT3B0aW9ucy5maW5kKHQgPT4gdC52YWx1ZSA9PSB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZSwgbGFiZWw6IG1vZGVsT3B0aW9uPy5sYWJlbCB8fCB2YWx1ZX07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IEZvcm1TZWxlY3RTdWJqZWN0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdID0gdGhpcy5hcGkuY2FjaGVbcHJvcGVydHkuZW5kcG9pbnRdIHx8IHRoaXMuYXBpLmxpc3QocHJvcGVydHkuZW5kcG9pbnQsIHRoaXMuYXBpLm1ha2VMaXN0UGFyYW1zKDEsIC0xKSkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVtcy5tYXAoaSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogaS5pZCB8fCBpLl9pZCwgbGFiZWw6IGlbcHJvcGVydHkubGFiZWxGaWVsZF0gfHwgaS5sYWJlbCB8fCBpLmlkIHx8IGkuX2lkfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChhd2FpdCB0aGlzLmFwaS5jYWNoZVtwcm9wZXJ0eS5lbmRwb2ludF0pLm1hcCh0ID0+IE9iamVjdC5hc3NpZ24oe30sIHQpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlT3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybVVwbG9hZENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNGaWxlVXBsb2FkTW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuYXBpLnVybChwcm9wZXJ0eS51cmwgfHwgXCJhc3NldHNcIik7XHJcbiAgICAgICAgY29uc3Qge2FjY2VwdCwgYXV0b1VwbG9hZCwgbWF4U2l6ZSwgbWluU2l6ZSwgcmVtb3ZlVXJsLCBzaG93RmlsZUxpc3R9ID0gcHJvcGVydHk7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSwge1xyXG4gICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgIGFjY2VwdCxcclxuICAgICAgICAgICAgYXV0b1VwbG9hZCxcclxuICAgICAgICAgICAgbWF4U2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgcmVtb3ZlVXJsLFxyXG4gICAgICAgICAgICBzaG93RmlsZUxpc3RcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0VmFsaWRhdG9ycyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZyA9IHt9O1xyXG4gICAgICAgIGlmIChPYmplY3RVdGlscy5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkgJiYgc2NoZW1hLnJlcXVpcmVkLmluZGV4T2YocHJvcGVydHkuaWQpID49IDApIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5yZXF1aXJlZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkUHJvcGVydHlWYWxpZGF0b3JzKHZhbGlkYXRvcnMsIHByb3BlcnR5KTtcclxuICAgICAgICB0aGlzLmFkZEl0ZW1zVmFsaWRhdG9ycyh2YWxpZGF0b3JzLCBwcm9wZXJ0eS5pdGVtcyk7XHJcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFkZFByb3BlcnR5VmFsaWRhdG9ycyh2YWxpZGF0b3JzOiBEeW5hbWljVmFsaWRhdG9yc0NvbmZpZywgcHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHkpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXByb3BlcnR5KSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFpc05hTihwcm9wZXJ0eS5taW5MZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWluTGVuZ3RoID0gcHJvcGVydHkubWluTGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWlzTmFOKHByb3BlcnR5Lm1heExlbmd0aCkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5tYXhMZW5ndGggPSBwcm9wZXJ0eS5tYXhMZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXNOYU4ocHJvcGVydHkubWluaW11bSkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5taW4gPSBwcm9wZXJ0eS5taW5pbXVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWlzTmFOKHByb3BlcnR5Lm1heGltdW0pKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWF4ID0gcHJvcGVydHkubWF4aW11bTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoIChwcm9wZXJ0eS5mb3JtYXQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLmVtYWlsID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWRkSXRlbXNWYWxpZGF0b3JzKHZhbGlkYXRvcnM6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnLCBpdGVtczogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghaXRlbXMpIHJldHVybjtcclxuICAgICAgICBpZiAoIWlzTmFOKGl0ZW1zLm1pbkxlbmd0aCkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5pdGVtc01pbkxlbmd0aCA9IGl0ZW1zLm1pbkxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc05hTihpdGVtcy5tYXhMZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMuaXRlbXNNYXhMZW5ndGggPSBpdGVtcy5tYXhMZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXNOYU4oaXRlbXMubWluaW11bSkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5pdGVtc01pblZhbHVlID0gaXRlbXMubWluaW11bTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc05hTihpdGVtcy5tYXhpbXVtKSkge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLml0ZW1zTWF4VmFsdWUgPSBpdGVtcy5tYXhpbXVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DynamicFormArrayModel as Base } from "@ng-dynamic-forms/core";
|
|
2
|
+
import { ObjectUtils } from "@stemy/ngx-utils";
|
|
3
|
+
export class DynamicFormArrayModel extends Base {
|
|
4
|
+
constructor(config, layout) {
|
|
5
|
+
super(config, layout);
|
|
6
|
+
this.useTabs = config.useTabs || false;
|
|
7
|
+
this.saveTab = ObjectUtils.isFunction(config.saveTab) ? config.saveTab : ((index, model) => {
|
|
8
|
+
model.tabIndex = index;
|
|
9
|
+
});
|
|
10
|
+
this.restoreTab = ObjectUtils.isFunction(config.restoreTab) ? config.restoreTab : ((model) => {
|
|
11
|
+
return model.tabIndex;
|
|
12
|
+
});
|
|
13
|
+
this.additional = config.additional || {};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLWFycmF5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC1keW5hbWljLWZvcm0vdXRpbHMvZHluYW1pYy1mb3JtLWFycmF5Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDSCxxQkFBcUIsSUFBSSxJQUFJLEVBR2hDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBWTdDLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxJQUFJO0lBUzNDLFlBQVksTUFBbUMsRUFBRSxNQUFpQztRQUM5RSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN2RixLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN6RixPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO0lBQzlDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0b3J9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgICBEeW5hbWljRm9ybUFycmF5TW9kZWwgYXMgQmFzZSxcclxuICAgIER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZyBhcyBDb25maWdCYXNlLFxyXG4gICAgRHluYW1pY0Zvcm1Db250cm9sTGF5b3V0XHJcbn0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIkBzdGVteS9uZ3gtdXRpbHNcIjtcclxuXHJcbmV4cG9ydCB0eXBlIFNhdmVUYWJGdW5jID0gKGluZGV4OiBudW1iZXIsIG1vZGVsOiBEeW5hbWljRm9ybUFycmF5TW9kZWwsIGluamVjdG9yOiBJbmplY3RvcikgPT4gdm9pZDtcclxuZXhwb3J0IHR5cGUgUmVzdG9yZVRhYkZ1bmMgPSAobW9kZWw6IER5bmFtaWNGb3JtQXJyYXlNb2RlbCwgaW5qZWN0b3I6IEluamVjdG9yKSA9PiBudW1iZXI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNGb3JtQXJyYXlNb2RlbENvbmZpZyBleHRlbmRzIENvbmZpZ0Jhc2Uge1xyXG4gICAgdXNlVGFicz86IGJvb2xlYW47XHJcbiAgICBzYXZlVGFiPzogU2F2ZVRhYkZ1bmM7XHJcbiAgICByZXN0b3JlVGFiPzogUmVzdG9yZVRhYkZ1bmM7XHJcbiAgICBhZGRpdGlvbmFsPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtQXJyYXlNb2RlbCBleHRlbmRzIEJhc2Uge1xyXG5cclxuICAgIHJlYWRvbmx5IHVzZVRhYnM6IGJvb2xlYW47XHJcbiAgICByZWFkb25seSBzYXZlVGFiOiBTYXZlVGFiRnVuYztcclxuICAgIHJlYWRvbmx5IHJlc3RvcmVUYWI6IFJlc3RvcmVUYWJGdW5jO1xyXG4gICAgcmVhZG9ubHkgYWRkaXRpb25hbDogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcclxuXHJcbiAgICB0YWJJbmRleDogbnVtYmVyXHJcblxyXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBEeW5hbWljRm9ybUFycmF5TW9kZWxDb25maWcsIGxheW91dD86IER5bmFtaWNGb3JtQ29udHJvbExheW91dCkge1xyXG4gICAgICAgIHN1cGVyKGNvbmZpZywgbGF5b3V0KTtcclxuICAgICAgICB0aGlzLnVzZVRhYnMgPSBjb25maWcudXNlVGFicyB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLnNhdmVUYWIgPSBPYmplY3RVdGlscy5pc0Z1bmN0aW9uKGNvbmZpZy5zYXZlVGFiKSA/IGNvbmZpZy5zYXZlVGFiIDogKChpbmRleCwgbW9kZWwpID0+IHtcclxuICAgICAgICAgICAgbW9kZWwudGFiSW5kZXggPSBpbmRleDtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlc3RvcmVUYWIgPSBPYmplY3RVdGlscy5pc0Z1bmN0aW9uKGNvbmZpZy5yZXN0b3JlVGFiKSA/IGNvbmZpZy5yZXN0b3JlVGFiIDogKChtb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kZWwudGFiSW5kZXg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsID0gY29uZmlnLmFkZGl0aW9uYWwgfHwge307XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { FormSubject } from "./form-subject";
|
|
2
|
+
export class FormSelectSubject extends FormSubject {
|
|
3
|
+
handleNotifiedValue(controlModel, control, val) {
|
|
4
|
+
val.then(options => {
|
|
5
|
+
this.next(options);
|
|
6
|
+
if (options.length == 0)
|
|
7
|
+
return;
|
|
8
|
+
const currentVal = control.value;
|
|
9
|
+
if (controlModel.multiple) {
|
|
10
|
+
const correctVal = (currentVal || []).filter(t => options.findIndex(o => o.value == t) >= 0);
|
|
11
|
+
if (correctVal.length !== currentVal?.length) {
|
|
12
|
+
control.setValue(correctVal, { onlySelf: true, emitEvent: false });
|
|
13
|
+
}
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const option = options.find(t => t.value == currentVal);
|
|
17
|
+
if (!option) {
|
|
18
|
+
control.setValue(options[0]?.value ?? null, { onlySelf: true, emitEvent: false });
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zZWxlY3Qtc3ViamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtZHluYW1pYy1mb3JtL3V0aWxzL2Zvcm0tc2VsZWN0LXN1YmplY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE1BQU0sT0FBTyxpQkFBNEQsU0FBUSxXQUFjO0lBRWpGLG1CQUFtQixDQUFDLFlBQXFDLEVBQUUsT0FBd0IsRUFBRSxHQUFlO1FBQzFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25CLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDO2dCQUFFLE9BQU87WUFDaEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNqQyxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZCLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM3RixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLE1BQU0sRUFBRTtvQkFDMUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO2lCQUNwRTtnQkFDRCxPQUFPO2FBQ1Y7WUFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNULE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO2FBQ25GO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Fic3RyYWN0Q29udHJvbH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7RHluYW1pY0Zvcm1PcHRpb25Db25maWcsIER5bmFtaWNTZWxlY3RNb2RlbH0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcclxuaW1wb3J0IHtGb3JtU3ViamVjdH0gZnJvbSBcIi4vZm9ybS1zdWJqZWN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRm9ybVNlbGVjdFN1YmplY3Q8VCBleHRlbmRzIER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnPGFueT5bXT4gZXh0ZW5kcyBGb3JtU3ViamVjdDxUPiB7XHJcblxyXG4gICAgcHJvdGVjdGVkIGhhbmRsZU5vdGlmaWVkVmFsdWUoY29udHJvbE1vZGVsOiBEeW5hbWljU2VsZWN0TW9kZWw8YW55PiwgY29udHJvbDogQWJzdHJhY3RDb250cm9sLCB2YWw6IFByb21pc2U8VD4pIHtcclxuICAgICAgICB2YWwudGhlbihvcHRpb25zID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uZXh0KG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsID0gY29udHJvbC52YWx1ZTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xNb2RlbC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29ycmVjdFZhbCA9IChjdXJyZW50VmFsIHx8IFtdKS5maWx0ZXIodCA9PiBvcHRpb25zLmZpbmRJbmRleChvID0+IG8udmFsdWUgPT0gdCkgPj0gMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29ycmVjdFZhbC5sZW5ndGggIT09IGN1cnJlbnRWYWw/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoY29ycmVjdFZhbCwge29ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKHQgPT4gdC52YWx1ZSA9PSBjdXJyZW50VmFsKTtcclxuICAgICAgICAgICAgaWYgKCFvcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUob3B0aW9uc1swXT8udmFsdWUgPz8gbnVsbCwge29ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXX0=
|