@wemake4u/form-player-se 1.0.23 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/actionsCellRenderer/actionsCellRenderer.component.mjs +69 -0
- package/esm2022/lib/components/deleteRowRenderer/deleteRowRenderer.component.mjs +25 -0
- package/esm2022/lib/components/hostCellRenderer/hostCellRenderer.component.mjs +101 -0
- package/esm2022/lib/components/objectURLRenderer/objectURLRenderer.component.mjs +27 -0
- package/esm2022/lib/components/setFilter/setFilter.component.mjs +111 -0
- package/esm2022/lib/dialog/dialog.component.mjs +15 -7
- package/esm2022/lib/directives/collapse.directive.mjs +20 -12
- package/esm2022/lib/directives/date.directive.mjs +2 -2
- package/esm2022/lib/directives/dialog.directive.mjs +2 -1
- package/esm2022/lib/directives/dropdown.directive.mjs +23 -5
- package/esm2022/lib/directives/formIndex.directive.mjs +25 -0
- package/esm2022/lib/directives/grid.directive.mjs +94 -17
- package/esm2022/lib/directives/readonly.directive.mjs +101 -0
- package/esm2022/lib/directives/updateblur.directive.mjs +10 -3
- package/esm2022/lib/dynamic-fields/dynamic-fields.component.mjs +64 -26
- package/esm2022/lib/dynamic-form/dynamic-form.component.mjs +96 -95
- package/esm2022/lib/dynamic-host/dynamic-host.component.mjs +121 -0
- package/esm2022/lib/locale/locale-de.mjs +3 -2
- package/esm2022/lib/locale/locale-en.mjs +3 -2
- package/esm2022/lib/locale/locale-es.mjs +3 -2
- package/esm2022/lib/locale/locale-fr.mjs +3 -2
- package/esm2022/lib/locale/locale-it.mjs +3 -2
- package/esm2022/lib/locale/locale-pt.mjs +3 -2
- package/esm2022/lib/services/chart.service.mjs +62 -56
- package/esm2022/lib/services/dialog.service.mjs +1 -1
- package/esm2022/lib/services/feel.service.mjs +186 -19
- package/esm2022/lib/services/form.service.mjs +360 -0
- package/esm2022/lib/services/formatter.service.mjs +68 -54
- package/esm2022/lib/services/function.service.mjs +9 -5
- package/esm2022/lib/services/global.service.mjs +42 -0
- package/esm2022/lib/services/grid.service.mjs +189 -53
- package/esm2022/lib/services/metadata.service.mjs +1 -8
- package/esm2022/lib/services/programmability.service.mjs +338 -64
- package/esm2022/lib/services/weak.service.mjs +3 -5
- package/esm2022/lib/utils/feelable.mjs +28 -0
- package/esm2022/lib/utils/groupByRow.mjs +3 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/wemake4u-form-player-se.mjs +1896 -577
- package/fesm2022/wemake4u-form-player-se.mjs.map +1 -1
- package/lib/components/actionsCellRenderer/actionsCellRenderer.component.d.ts +18 -0
- package/lib/components/deleteRowRenderer/deleteRowRenderer.component.d.ts +49 -0
- package/lib/components/hostCellRenderer/hostCellRenderer.component.d.ts +29 -0
- package/lib/components/objectURLRenderer/objectURLRenderer.component.d.ts +50 -0
- package/lib/{utils/setFilter.d.ts → components/setFilter/setFilter.component.d.ts} +1 -0
- package/lib/dialog/dialog.component.d.ts +11 -0
- package/lib/directives/collapse.directive.d.ts +7 -4
- package/lib/directives/dropdown.directive.d.ts +4 -0
- package/lib/directives/formIndex.directive.d.ts +10 -0
- package/lib/directives/grid.directive.d.ts +21 -4
- package/lib/directives/readonly.directive.d.ts +28 -0
- package/lib/dynamic-fields/dynamic-fields.component.d.ts +28 -4
- package/lib/dynamic-form/dynamic-form.component.d.ts +20 -10
- package/lib/dynamic-host/dynamic-host.component.d.ts +27 -0
- package/lib/locale/locale-de.d.ts +1 -0
- package/lib/locale/locale-en.d.ts +1 -0
- package/lib/locale/locale-es.d.ts +1 -0
- package/lib/locale/locale-fr.d.ts +1 -0
- package/lib/locale/locale-it.d.ts +1 -0
- package/lib/locale/locale-pt.d.ts +1 -0
- package/lib/locale/locale.d.ts +7 -0
- package/lib/services/chart.service.d.ts +5 -2
- package/lib/services/dialog.service.d.ts +0 -1
- package/lib/services/feel.service.d.ts +8 -0
- package/lib/services/form.service.d.ts +51 -0
- package/lib/services/formatter.service.d.ts +8 -6
- package/lib/services/function.service.d.ts +1 -1
- package/lib/services/global.service.d.ts +16 -0
- package/lib/services/grid.service.d.ts +16 -4
- package/lib/services/metadata.service.d.ts +0 -3
- package/lib/services/programmability.service.d.ts +33 -5
- package/lib/utils/feelable.d.ts +2 -0
- package/lib/utils/groupByRow.d.ts +2 -0
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
- package/esm2022/lib/directives/disable.directive.mjs +0 -71
- package/esm2022/lib/directives/disableform.directive.mjs +0 -42
- package/esm2022/lib/utils/gridCells.mjs +0 -108
- package/esm2022/lib/utils/patchForm.mjs +0 -75
- package/esm2022/lib/utils/setFilter.mjs +0 -111
- package/lib/directives/disable.directive.d.ts +0 -20
- package/lib/directives/disableform.directive.d.ts +0 -17
- package/lib/utils/gridCells.d.ts +0 -110
- package/lib/utils/patchForm.d.ts +0 -9
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { FormGroup, FormArray, FormControl } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
;
|
|
5
|
+
export class FormService {
|
|
6
|
+
set(control, path, value, pathOptions, patchOptions) {
|
|
7
|
+
const currentControl = this.applyPath(control, path, pathOptions ?? { create: true });
|
|
8
|
+
if (!currentControl)
|
|
9
|
+
return false;
|
|
10
|
+
this.patch(currentControl, value, patchOptions);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
get(control, path, pathOptions) {
|
|
14
|
+
const result = this.getControl(control, path, pathOptions);
|
|
15
|
+
return result?.value;
|
|
16
|
+
}
|
|
17
|
+
getControl(control, path, pathOptions) {
|
|
18
|
+
return this.applyPath(control, path, pathOptions);
|
|
19
|
+
}
|
|
20
|
+
prepend(control, path, value, pathOptions, patchOptions) {
|
|
21
|
+
const formArray = this.applyPath(control, path, pathOptions ?? { expected: "array", create: true });
|
|
22
|
+
if (formArray instanceof FormArray) {
|
|
23
|
+
return this.insertIntoArray(formArray, 0, value, patchOptions);
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
append(control, path, value, pathOptions, patchOptions) {
|
|
28
|
+
const formArray = this.applyPath(control, path, pathOptions ?? { expected: "array", create: true });
|
|
29
|
+
if (formArray instanceof FormArray) {
|
|
30
|
+
return this.insertIntoArray(formArray, formArray.length, value, patchOptions);
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
insert(control, path, index, value, pathOptions, patchOptions) {
|
|
35
|
+
const formArray = this.applyPath(control, path, pathOptions ?? { expected: "array", create: true });
|
|
36
|
+
if (formArray instanceof FormArray) {
|
|
37
|
+
return this.insertIntoArray(formArray, index, value, patchOptions);
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
remove(control, path, index) {
|
|
42
|
+
const formArray = this.applyPath(control, path);
|
|
43
|
+
if (formArray instanceof FormArray) {
|
|
44
|
+
return this.removeFromArray(formArray, index);
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
moveUp(control, path, index) {
|
|
49
|
+
const formArray = this.applyPath(control, path);
|
|
50
|
+
if (formArray instanceof FormArray) {
|
|
51
|
+
if (index <= 0 || index >= formArray.length)
|
|
52
|
+
return false;
|
|
53
|
+
const control = formArray.at(index);
|
|
54
|
+
formArray.removeAt(index);
|
|
55
|
+
formArray.insert(index - 1, control);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
moveDown(control, path, index) {
|
|
61
|
+
const formArray = this.applyPath(control, path);
|
|
62
|
+
if (formArray instanceof FormArray) {
|
|
63
|
+
if (index < 0 || index >= formArray.length - 1)
|
|
64
|
+
return false;
|
|
65
|
+
const control = formArray.at(index);
|
|
66
|
+
formArray.removeAt(index);
|
|
67
|
+
formArray.insert(index + 1, control);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
status(control, path, pathOptions) {
|
|
73
|
+
const result = this.applyPath(control, path, pathOptions);
|
|
74
|
+
return result?.status;
|
|
75
|
+
}
|
|
76
|
+
getInvalidControls(control) {
|
|
77
|
+
const invalid = [];
|
|
78
|
+
if (control.invalid) {
|
|
79
|
+
invalid.push({ path: this.getPath(control).join("."), control });
|
|
80
|
+
}
|
|
81
|
+
if (control instanceof FormGroup || control instanceof FormArray) {
|
|
82
|
+
const children = Object.values(control.controls);
|
|
83
|
+
for (const child of children) {
|
|
84
|
+
invalid.push(...this.getInvalidControls(child));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return invalid;
|
|
88
|
+
}
|
|
89
|
+
patch(control, value, options) {
|
|
90
|
+
const defaultOptions = {
|
|
91
|
+
emitEvent: true,
|
|
92
|
+
validateType: false,
|
|
93
|
+
fallbackValue: null,
|
|
94
|
+
strict: true
|
|
95
|
+
};
|
|
96
|
+
const warn = (message) => {
|
|
97
|
+
if (options?.emitWarn)
|
|
98
|
+
console.warn(`[patchControl] ${message}`);
|
|
99
|
+
};
|
|
100
|
+
const error = (message) => {
|
|
101
|
+
if (options?.emitError)
|
|
102
|
+
throw new Error(message);
|
|
103
|
+
};
|
|
104
|
+
const { emitEvent, validateType, fallbackValue, strict } = { ...defaultOptions, ...options };
|
|
105
|
+
if (control instanceof FormControl) {
|
|
106
|
+
if (validateType && typeof value !== typeof control.value) {
|
|
107
|
+
warn(`Value type mismatch: expected ${typeof control.value}, but received ${typeof value}`);
|
|
108
|
+
if (fallbackValue !== null) {
|
|
109
|
+
control.patchValue(fallbackValue, { emitEvent });
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
error('Invalid value type and no fallback value provided.');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
control.patchValue(value, { emitEvent });
|
|
116
|
+
}
|
|
117
|
+
else if (control instanceof FormGroup) {
|
|
118
|
+
const currentValue = this.asObject(value);
|
|
119
|
+
Object.keys(currentValue).forEach((key) => {
|
|
120
|
+
if (control.controls[key]) {
|
|
121
|
+
this.patch(control.controls[key], value[key], options);
|
|
122
|
+
}
|
|
123
|
+
else if (!strict) {
|
|
124
|
+
const newControl = this.createControlFromValue(value[key]);
|
|
125
|
+
this.setUnknown(newControl);
|
|
126
|
+
control.addControl(key, newControl);
|
|
127
|
+
this.patch(newControl, value[key], options);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
warn(`Key "${key}" not found in the FormGroup.`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
Object.keys(control.controls).forEach((key) => {
|
|
134
|
+
if (!(key in currentValue)) {
|
|
135
|
+
const childControl = control.get(key);
|
|
136
|
+
if (childControl) {
|
|
137
|
+
childControl.reset();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
else if (control instanceof FormArray) {
|
|
143
|
+
const currentValue = this.asArray(value);
|
|
144
|
+
while (control.length < currentValue.length) {
|
|
145
|
+
const anyControl = control;
|
|
146
|
+
const itemToAdd = currentValue[control.length];
|
|
147
|
+
if (typeof (anyControl).addItem === 'function') {
|
|
148
|
+
anyControl.addItem();
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
control.push(this.createControlFromValue(itemToAdd));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
while (control.length > currentValue.length) {
|
|
155
|
+
control.removeAt(control.length - 1);
|
|
156
|
+
}
|
|
157
|
+
currentValue.forEach((item, index) => {
|
|
158
|
+
this.patch(control.at(index), item, options);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
error('Unsupported AbstractControl type.');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
getPath(control) {
|
|
166
|
+
const path = [];
|
|
167
|
+
let current = control;
|
|
168
|
+
while (current?.parent) {
|
|
169
|
+
const parent = current.parent;
|
|
170
|
+
if (parent instanceof FormArray) {
|
|
171
|
+
const index = parent.controls.indexOf(current);
|
|
172
|
+
path.unshift(index);
|
|
173
|
+
}
|
|
174
|
+
else if (parent instanceof FormGroup) {
|
|
175
|
+
const key = Object.keys(parent.controls).find(k => parent.get(k) === current);
|
|
176
|
+
if (key) {
|
|
177
|
+
path.unshift(key);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
current = parent;
|
|
181
|
+
}
|
|
182
|
+
return path;
|
|
183
|
+
}
|
|
184
|
+
getContext(formGroup) {
|
|
185
|
+
if (!(formGroup instanceof FormGroup)) {
|
|
186
|
+
throw new Error("Scope is not a FormGroup");
|
|
187
|
+
}
|
|
188
|
+
const patchOptions = {
|
|
189
|
+
strict: false
|
|
190
|
+
};
|
|
191
|
+
return {
|
|
192
|
+
set: (path, value, pathOptions) => this.set(formGroup, path, value, pathOptions, patchOptions),
|
|
193
|
+
get: (path, pathOptions) => this.get(formGroup, path, pathOptions),
|
|
194
|
+
status: (path, pathOptions) => this.status(formGroup, path, pathOptions),
|
|
195
|
+
prepend: (path, value, pathOptions) => this.prepend(formGroup, path, value, pathOptions, patchOptions),
|
|
196
|
+
append: (path, value, pathOptions) => this.append(formGroup, path, value, pathOptions, patchOptions),
|
|
197
|
+
insert: (path, index, value, pathOptions) => this.insert(formGroup, path, index, value, pathOptions, patchOptions),
|
|
198
|
+
remove: (path, index) => this.remove(formGroup, path, index),
|
|
199
|
+
moveUp: (path, index) => this.moveUp(formGroup, path, index),
|
|
200
|
+
moveDown: (path, index) => this.moveDown(formGroup, path, index)
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
applyPath(control, path, options) {
|
|
204
|
+
const warn = (message) => {
|
|
205
|
+
if (options?.emitWarn)
|
|
206
|
+
console.warn(`[applyPath] ${message}`);
|
|
207
|
+
};
|
|
208
|
+
const error = (message) => {
|
|
209
|
+
if (options?.emitError)
|
|
210
|
+
throw new Error(`[applyPath] ${message}`);
|
|
211
|
+
throw new Error(`[applyPath] ${message}`); // fallback default behavior
|
|
212
|
+
};
|
|
213
|
+
const createControl = (type) => {
|
|
214
|
+
switch (type) {
|
|
215
|
+
case 'array': return new FormArray([]);
|
|
216
|
+
case 'group': return new FormGroup({});
|
|
217
|
+
case 'control':
|
|
218
|
+
default: return new FormControl(null);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const normalizePath = (path) => {
|
|
222
|
+
if (typeof path === 'string') {
|
|
223
|
+
return path.split('.');
|
|
224
|
+
}
|
|
225
|
+
if (Array.isArray(path)) {
|
|
226
|
+
return path.reduce((acc, part) => {
|
|
227
|
+
if (typeof part === 'string') {
|
|
228
|
+
acc.push(...part.split('.'));
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
acc.push(part);
|
|
232
|
+
}
|
|
233
|
+
return acc;
|
|
234
|
+
}, []);
|
|
235
|
+
}
|
|
236
|
+
return [path];
|
|
237
|
+
};
|
|
238
|
+
const segments = normalizePath(path);
|
|
239
|
+
let current = control;
|
|
240
|
+
const createPath = options?.create ?? false;
|
|
241
|
+
for (let i = 0; i < segments.length; i++) {
|
|
242
|
+
const segment = segments[i];
|
|
243
|
+
const isLeaf = i === segments.length - 1;
|
|
244
|
+
const nextType = isLeaf ? (options?.expected ?? 'control')
|
|
245
|
+
: typeof segments[i + 1] === 'number' ? 'array'
|
|
246
|
+
: 'group';
|
|
247
|
+
const getCurrentPath = () => segments.slice(0, i + 1).join('.');
|
|
248
|
+
if (!current) {
|
|
249
|
+
return error(`Control is null at segment "${getCurrentPath()}"`);
|
|
250
|
+
}
|
|
251
|
+
if (!segment) {
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
else if (typeof segment === 'number') {
|
|
255
|
+
if (!(current instanceof FormArray)) {
|
|
256
|
+
return error(`Expected FormArray at segment [${getCurrentPath()}], got ${current.constructor.name}`);
|
|
257
|
+
}
|
|
258
|
+
const index = segment;
|
|
259
|
+
if (index < 0 || index >= current.length) {
|
|
260
|
+
warn(`Index ${index} is out of bounds at path "${getCurrentPath()}" (length = ${current.length})`);
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
current = current.at(index);
|
|
264
|
+
}
|
|
265
|
+
else if (typeof segment === 'string') {
|
|
266
|
+
if (segment === 'parent') {
|
|
267
|
+
current = (current instanceof FormGroup) && current.get(segment)
|
|
268
|
+
? current.get(segment)
|
|
269
|
+
: current.parent;
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
if (segment === 'root') {
|
|
273
|
+
current = (current instanceof FormGroup && current.get(segment))
|
|
274
|
+
? current.get(segment)
|
|
275
|
+
: current.root;
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (!(current instanceof FormGroup)) {
|
|
279
|
+
return error(`Expected FormGroup at segment "${getCurrentPath()}", got ${current.constructor.name}`);
|
|
280
|
+
}
|
|
281
|
+
if (current.get(segment)) {
|
|
282
|
+
current = current.get(segment);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
if (createPath) {
|
|
286
|
+
const newControl = createControl(nextType);
|
|
287
|
+
current.addControl(segment, newControl);
|
|
288
|
+
current = newControl;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
warn(`Control with key "${getCurrentPath()}" not found in FormGroup.`);
|
|
292
|
+
return undefined;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
return error(`Invalid segment type: ${typeof segment}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return current ?? undefined;
|
|
301
|
+
}
|
|
302
|
+
asObject(value) {
|
|
303
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
304
|
+
return value;
|
|
305
|
+
}
|
|
306
|
+
return {};
|
|
307
|
+
}
|
|
308
|
+
asArray(value) {
|
|
309
|
+
if (value && Array.isArray(value)) {
|
|
310
|
+
return value;
|
|
311
|
+
}
|
|
312
|
+
return [];
|
|
313
|
+
}
|
|
314
|
+
insertIntoArray(formArray, index, value, options) {
|
|
315
|
+
const itemToAdd = this.createArrayItem(formArray);
|
|
316
|
+
this.patch(itemToAdd, value, options);
|
|
317
|
+
formArray.insert(index, itemToAdd);
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
removeFromArray(formArray, index) {
|
|
321
|
+
if (index <= 0 || index >= formArray.length)
|
|
322
|
+
false;
|
|
323
|
+
formArray.removeAt(index);
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
createArrayItem(formArray) {
|
|
327
|
+
const anyControl = formArray;
|
|
328
|
+
const formGroup = (typeof (anyControl).createItem === 'function')
|
|
329
|
+
? anyControl.createItem()
|
|
330
|
+
: new FormGroup({});
|
|
331
|
+
return formGroup;
|
|
332
|
+
}
|
|
333
|
+
createControlFromValue(value) {
|
|
334
|
+
if (value === null || typeof value !== 'object') {
|
|
335
|
+
return new FormControl(value);
|
|
336
|
+
}
|
|
337
|
+
if (Array.isArray(value)) {
|
|
338
|
+
return new FormArray(this.createControlFromArray(value));
|
|
339
|
+
}
|
|
340
|
+
return new FormGroup({});
|
|
341
|
+
}
|
|
342
|
+
createControlFromArray(array) {
|
|
343
|
+
return array.map(item => this.createControlFromValue(item));
|
|
344
|
+
}
|
|
345
|
+
setUnknown(control) {
|
|
346
|
+
control._unknown = true;
|
|
347
|
+
}
|
|
348
|
+
isUnknown(control) {
|
|
349
|
+
return control && control._unknown === true;
|
|
350
|
+
}
|
|
351
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
352
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormService, providedIn: 'root' });
|
|
353
|
+
}
|
|
354
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormService, decorators: [{
|
|
355
|
+
type: Injectable,
|
|
356
|
+
args: [{
|
|
357
|
+
providedIn: 'root'
|
|
358
|
+
}]
|
|
359
|
+
}] });
|
|
360
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpcmlvL3NyYy9saWIvc2VydmljZXMvZm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFtQixTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFvQnRHLENBQUM7QUFLRixNQUFNLE9BQU8sV0FBVztJQUV0QixHQUFHLENBQUMsT0FBd0IsRUFBRSxJQUFVLEVBQUUsS0FBVSxFQUFFLFdBQXlCLEVBQUUsWUFBMkI7UUFFMUcsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXRGLElBQUksQ0FBQyxjQUFjO1lBQ2pCLE9BQU8sS0FBSyxDQUFDO1FBRWYsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWhELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEdBQUcsQ0FBQyxPQUF3QixFQUFFLElBQVUsRUFBRSxXQUF5QjtRQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0QsT0FBTyxNQUFNLEVBQUUsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBd0IsRUFBRSxJQUFVLEVBQUUsV0FBeUI7UUFDeEUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUF3QixF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QUFDO0lBRU8sU0FBUyxDQUFDLE9BQVk7UUFDNUIsT0FBTyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7SUFDOUMsQ0FBQzt3R0FyYVUsV0FBVzs0R0FBWCxXQUFXLGNBRlYsTUFBTTs7NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IElFdmFsdWF0b3JQcm92aWRlciB9IGZyb20gJy4vcHJvZ3JhbW1hYmlsaXR5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUNvbnRyb2xTdGF0dXMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5leHBvcnQgdHlwZSBQYXRoID0gc3RyaW5nIHwgbnVtYmVyIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcclxuXHJcbnR5cGUgQ29udHJvbFR5cGUgPSAnYXJyYXknIHwgJ2dyb3VwJyB8ICdjb250cm9sJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hPcHRpb25zIHtcclxuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xyXG4gIGVtaXRFcnJvcj86IGJvb2xlYW47XHJcbiAgZW1pdFdhcm4/OiBib29sZWFuO1xyXG4gIHZhbGlkYXRlVHlwZT86IGJvb2xlYW47XHJcbiAgZmFsbGJhY2tWYWx1ZT86IGFueTtcclxuICBzdHJpY3Q6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGF0aE9wdGlvbnMge1xyXG4gIGVtaXRFcnJvcj86IGJvb2xlYW47XHJcbiAgZW1pdFdhcm4/OiBib29sZWFuO1xyXG4gIGNyZWF0ZT86IGJvb2xlYW47XHJcbiAgZXhwZWN0ZWQ/OiBDb250cm9sVHlwZTtcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1TZXJ2aWNlIGltcGxlbWVudHMgSUV2YWx1YXRvclByb3ZpZGVyIHtcclxuXHJcbiAgc2V0KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGF0aDogUGF0aCwgdmFsdWU6IGFueSwgcGF0aE9wdGlvbnM/OiBQYXRoT3B0aW9ucywgcGF0Y2hPcHRpb25zPzogUGF0Y2hPcHRpb25zKTogYm9vbGVhbiB7XHJcblxyXG4gICAgY29uc3QgY3VycmVudENvbnRyb2wgPSB0aGlzLmFwcGx5UGF0aChjb250cm9sLCBwYXRoLCBwYXRoT3B0aW9ucyA/PyB7IGNyZWF0ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICBpZiAoIWN1cnJlbnRDb250cm9sKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5wYXRjaChjdXJyZW50Q29udHJvbCwgdmFsdWUsIHBhdGNoT3B0aW9ucyk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoOiBQYXRoLCBwYXRoT3B0aW9ucz86IFBhdGhPcHRpb25zKTogYW55IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0Q29udHJvbChjb250cm9sLCBwYXRoLCBwYXRoT3B0aW9ucyk7XHJcbiAgICByZXR1cm4gcmVzdWx0Py52YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldENvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoOiBQYXRoLCBwYXRoT3B0aW9ucz86IFBhdGhPcHRpb25zKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmFwcGx5UGF0aChjb250cm9sLCBwYXRoLCBwYXRoT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwcmVwZW5kKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGF0aDogUGF0aCwgdmFsdWU6IGFueSwgcGF0aE9wdGlvbnM/OiBQYXRoT3B0aW9ucywgcGF0Y2hPcHRpb25zPzogUGF0Y2hPcHRpb25zKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmFwcGx5UGF0aChjb250cm9sLCBwYXRoLCBwYXRoT3B0aW9ucyA/PyB7IGV4cGVjdGVkOiBcImFycmF5XCIsIGNyZWF0ZTogdHJ1ZSB9KTtcclxuICAgIGlmIChmb3JtQXJyYXkgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0SW50b0FycmF5KGZvcm1BcnJheSwgMCwgdmFsdWUsIHBhdGNoT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhcHBlbmQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoOiBQYXRoLCB2YWx1ZTogYW55LCBwYXRoT3B0aW9ucz86IFBhdGhPcHRpb25zLCBwYXRjaE9wdGlvbnM/OiBQYXRjaE9wdGlvbnMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuYXBwbHlQYXRoKGNvbnRyb2wsIHBhdGgsIHBhdGhPcHRpb25zID8/IHsgZXhwZWN0ZWQ6IFwiYXJyYXlcIiwgY3JlYXRlOiB0cnVlIH0pO1xyXG4gICAgaWYgKGZvcm1BcnJheSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnRJbnRvQXJyYXkoZm9ybUFycmF5LCBmb3JtQXJyYXkubGVuZ3RoLCB2YWx1ZSwgcGF0Y2hPcHRpb25zKTsgICAgICBcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGluc2VydChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHBhdGg6IFBhdGgsIGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnksIHBhdGhPcHRpb25zPzogUGF0aE9wdGlvbnMsIHBhdGNoT3B0aW9ucz86IFBhdGNoT3B0aW9ucyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5hcHBseVBhdGgoY29udHJvbCwgcGF0aCwgcGF0aE9wdGlvbnMgPz8geyBleHBlY3RlZDogXCJhcnJheVwiLCBjcmVhdGU6IHRydWUgfSk7XHJcbiAgICBpZiAoZm9ybUFycmF5IGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydEludG9BcnJheShmb3JtQXJyYXksIGluZGV4LCB2YWx1ZSwgcGF0Y2hPcHRpb25zKTsgIFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGF0aDogUGF0aCwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5hcHBseVBhdGgoY29udHJvbCwgcGF0aCk7XHJcbiAgICBpZiAoZm9ybUFycmF5IGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZUZyb21BcnJheShmb3JtQXJyYXksIGluZGV4KTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG1vdmVVcChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHBhdGg6IFBhdGgsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuYXBwbHlQYXRoKGNvbnRyb2wsIHBhdGgpO1xyXG4gICAgaWYgKGZvcm1BcnJheSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICBpZiAoaW5kZXggPD0gMCB8fCBpbmRleCA+PSBmb3JtQXJyYXkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjb25zdCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSBmb3JtQXJyYXkuYXQoaW5kZXgpO1xyXG4gICAgICBmb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgICBmb3JtQXJyYXkuaW5zZXJ0KGluZGV4IC0gMSwgY29udHJvbCk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gICAgXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBtb3ZlRG93bihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHBhdGg6IFBhdGgsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuYXBwbHlQYXRoKGNvbnRyb2wsIHBhdGgpO1xyXG4gICAgaWYgKGZvcm1BcnJheSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZvcm1BcnJheS5sZW5ndGggLSAxKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjb25zdCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSBmb3JtQXJyYXkuYXQoaW5kZXgpO1xyXG4gICAgICBmb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgICBmb3JtQXJyYXkuaW5zZXJ0KGluZGV4ICsgMSwgY29udHJvbCk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHN0YXR1cyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHBhdGg6IFBhdGgsIHBhdGhPcHRpb25zPzogUGF0aE9wdGlvbnMpIDogRm9ybUNvbnRyb2xTdGF0dXMgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVBhdGgoY29udHJvbCwgcGF0aCwgcGF0aE9wdGlvbnMpO1xyXG4gICAgcmV0dXJuIHJlc3VsdD8uc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW52YWxpZENvbnRyb2xzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHsgcGF0aDogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfVtdIHtcclxuICAgIGNvbnN0IGludmFsaWQ6IHsgcGF0aDogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfVtdID0gW107XHJcblxyXG4gICAgaWYgKGNvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICBpbnZhbGlkLnB1c2goeyBwYXRoOiB0aGlzLmdldFBhdGgoY29udHJvbCkuam9pbihcIi5cIiksIGNvbnRyb2wgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IE9iamVjdC52YWx1ZXMoY29udHJvbC5jb250cm9scyk7XHJcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcclxuICAgICAgICBpbnZhbGlkLnB1c2goLi4udGhpcy5nZXRJbnZhbGlkQ29udHJvbHMoY2hpbGQpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2goXHJcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXRjaE9wdGlvbnMpOiB2b2lkIHtcclxuXHJcbiAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcclxuICAgICAgZW1pdEV2ZW50OiB0cnVlLFxyXG4gICAgICB2YWxpZGF0ZVR5cGU6IGZhbHNlLFxyXG4gICAgICBmYWxsYmFja1ZhbHVlOiBudWxsLFxyXG4gICAgICBzdHJpY3Q6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgd2FybiA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKG9wdGlvbnM/LmVtaXRXYXJuKVxyXG4gICAgICAgIGNvbnNvbGUud2FybihgW3BhdGNoQ29udHJvbF0gJHttZXNzYWdlfWApXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGVycm9yID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAob3B0aW9ucz8uZW1pdEVycm9yKVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgeyBlbWl0RXZlbnQsIHZhbGlkYXRlVHlwZSwgZmFsbGJhY2tWYWx1ZSwgc3RyaWN0IH1cclxuICAgICAgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH07XHJcblxyXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xyXG4gICAgICBpZiAodmFsaWRhdGVUeXBlICYmIHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIGNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICB3YXJuKGBWYWx1ZSB0eXBlIG1pc21hdGNoOiBleHBlY3RlZCAke3R5cGVvZiBjb250cm9sLnZhbHVlfSwgYnV0IHJlY2VpdmVkICR7dHlwZW9mIHZhbHVlfWApO1xyXG5cclxuICAgICAgICBpZiAoZmFsbGJhY2tWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKGZhbGxiYWNrVmFsdWUsIHsgZW1pdEV2ZW50IH0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlcnJvcignSW52YWxpZCB2YWx1ZSB0eXBlIGFuZCBubyBmYWxsYmFjayB2YWx1ZSBwcm92aWRlZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudCB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcclxuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5hc09iamVjdCh2YWx1ZSk7XHJcbiAgICAgIE9iamVjdC5rZXlzKGN1cnJlbnRWYWx1ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wuY29udHJvbHNba2V5XSkge1xyXG4gICAgICAgICAgdGhpcy5wYXRjaChjb250cm9sLmNvbnRyb2xzW2tleV0sIHZhbHVlW2tleV0sIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghc3RyaWN0KSB7XHJcbiAgICAgICAgICBjb25zdCBuZXdDb250cm9sID0gdGhpcy5jcmVhdGVDb250cm9sRnJvbVZhbHVlKHZhbHVlW2tleV0pO1xyXG4gICAgICAgICAgdGhpcy5zZXRVbmtub3duKG5ld0NvbnRyb2wpO1xyXG4gICAgICAgICAgY29udHJvbC5hZGRDb250cm9sKGtleSwgbmV3Q29udHJvbCk7XHJcbiAgICAgICAgICB0aGlzLnBhdGNoKG5ld0NvbnRyb2wsIHZhbHVlW2tleV0sIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHdhcm4oYEtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB0aGUgRm9ybUdyb3VwLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIE9iamVjdC5rZXlzKGNvbnRyb2wuY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGlmICghKGtleSBpbiBjdXJyZW50VmFsdWUpKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGlsZENvbnRyb2wgPSBjb250cm9sLmdldChrZXkpO1xyXG4gICAgICAgICAgaWYgKGNoaWxkQ29udHJvbCkge1xyXG4gICAgICAgICAgICBjaGlsZENvbnRyb2wucmVzZXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pOyAgICAgXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuYXNBcnJheSh2YWx1ZSk7XHJcbiAgICAgIHdoaWxlIChjb250cm9sLmxlbmd0aCA8IGN1cnJlbnRWYWx1ZS5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBhbnlDb250cm9sID0gY29udHJvbCBhcyBhbnk7XHJcbiAgICAgICAgY29uc3QgaXRlbVRvQWRkID0gY3VycmVudFZhbHVlW2NvbnRyb2wubGVuZ3RoXTtcclxuICAgICAgICBpZiAodHlwZW9mIChhbnlDb250cm9sKS5hZGRJdGVtID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICBhbnlDb250cm9sLmFkZEl0ZW0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29udHJvbC5wdXNoKHRoaXMuY3JlYXRlQ29udHJvbEZyb21WYWx1ZShpdGVtVG9BZGQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKGNvbnRyb2wubGVuZ3RoID4gY3VycmVudFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnRyb2wucmVtb3ZlQXQoY29udHJvbC5sZW5ndGggLSAxKTtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50VmFsdWUuZm9yRWFjaCgoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wYXRjaChjb250cm9sLmF0KGluZGV4KSwgaXRlbSwgb3B0aW9ucyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGVycm9yKCdVbnN1cHBvcnRlZCBBYnN0cmFjdENvbnRyb2wgdHlwZS4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFBhdGgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogKHN0cmluZyB8IG51bWJlcilbXSB7XHJcbiAgICBjb25zdCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XHJcbiAgICBsZXQgY3VycmVudDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IGNvbnRyb2w7XHJcblxyXG4gICAgd2hpbGUgKGN1cnJlbnQ/LnBhcmVudCkge1xyXG4gICAgICBjb25zdCBwYXJlbnQ6IGFueSA9IGN1cnJlbnQucGFyZW50O1xyXG5cclxuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNvbnRyb2xzLmluZGV4T2YoY3VycmVudCk7XHJcbiAgICAgICAgcGF0aC51bnNoaWZ0KGluZGV4KTtcclxuICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhwYXJlbnQuY29udHJvbHMpLmZpbmQoayA9PiBwYXJlbnQuZ2V0KGspID09PSBjdXJyZW50KTtcclxuICAgICAgICBpZiAoa2V5KSB7XHJcbiAgICAgICAgICBwYXRoLnVuc2hpZnQoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhdGg7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0KGZvcm1Hcm91cDogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBpZiAoIShmb3JtR3JvdXAgaW5zdGFuY2VvZiBGb3JtR3JvdXApKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3BlIGlzIG5vdCBhIEZvcm1Hcm91cFwiKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhdGNoT3B0aW9uczogUGF0Y2hPcHRpb25zID0ge1xyXG4gICAgICBzdHJpY3Q6IGZhbHNlXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNldDogKHBhdGg6IFBhdGgsIHZhbHVlOiBhbnksIHBhdGhPcHRpb25zPzogUGF0aE9wdGlvbnMpOiBib29sZWFuID0+XHJcbiAgICAgICAgdGhpcy5zZXQoZm9ybUdyb3VwLCBwYXRoLCB2YWx1ZSwgcGF0aE9wdGlvbnMsIHBhdGNoT3B0aW9ucyksXHJcblxyXG4gICAgICBnZXQ6IChwYXRoOiBQYXRoLCBwYXRoT3B0aW9ucz86IFBhdGhPcHRpb25zKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkID0+XHJcbiAgICAgICAgdGhpcy5nZXQoZm9ybUdyb3VwLCBwYXRoLCBwYXRoT3B0aW9ucyksXHJcblxyXG4gICAgICBzdGF0dXM6IChwYXRoOiBQYXRoLCBwYXRoT3B0aW9ucz86IFBhdGhPcHRpb25zKTogRm9ybUNvbnRyb2xTdGF0dXMgfCB1bmRlZmluZWQgPT5cclxuICAgICAgICB0aGlzLnN0YXR1cyhmb3JtR3JvdXAsIHBhdGgsIHBhdGhPcHRpb25zKSxcclxuXHJcbiAgICAgIHByZXBlbmQ6IChwYXRoOiBQYXRoLCB2YWx1ZTogYW55LCBwYXRoT3B0aW9ucz86IFBhdGhPcHRpb25zKTogYm9vbGVhbiA9PlxyXG4gICAgICAgIHRoaXMucHJlcGVuZChmb3JtR3JvdXAsIHBhdGgsIHZhbHVlLCBwYXRoT3B0aW9ucywgcGF0Y2hPcHRpb25zKSxcclxuXHJcbiAgICAgIGFwcGVuZDogKHBhdGg6IFBhdGgsIHZhbHVlOiBhbnksIHBhdGhPcHRpb25zPzogUGF0aE9wdGlvbnMpOiBib29sZWFuID0+XHJcbiAgICAgICAgdGhpcy5hcHBlbmQoZm9ybUdyb3VwLCBwYXRoLCB2YWx1ZSwgcGF0aE9wdGlvbnMsIHBhdGNoT3B0aW9ucyksXHJcblxyXG4gICAgICBpbnNlcnQ6IChwYXRoOiBQYXRoLCBpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55LCBwYXRoT3B0aW9ucz86IFBhdGhPcHRpb25zKTogYm9vbGVhbiA9PlxyXG4gICAgICAgIHRoaXMuaW5zZXJ0KGZvcm1Hcm91cCwgcGF0aCwgaW5kZXgsIHZhbHVlLCBwYXRoT3B0aW9ucywgcGF0Y2hPcHRpb25zKSxcclxuXHJcbiAgICAgIHJlbW92ZTogKHBhdGg6IFBhdGgsIGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+XHJcbiAgICAgICAgdGhpcy5yZW1vdmUoZm9ybUdyb3VwLCBwYXRoLCBpbmRleCksXHJcblxyXG4gICAgICBtb3ZlVXA6IChwYXRoOiBQYXRoLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiA9PlxyXG4gICAgICAgIHRoaXMubW92ZVVwKGZvcm1Hcm91cCwgcGF0aCwgaW5kZXgpLFxyXG5cclxuICAgICAgbW92ZURvd246IChwYXRoOiBQYXRoLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiA9PlxyXG4gICAgICAgIHRoaXMubW92ZURvd24oZm9ybUdyb3VwLCBwYXRoLCBpbmRleClcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5UGF0aChcclxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcclxuICAgIHBhdGg6IFBhdGgsXHJcbiAgICBvcHRpb25zPzogUGF0aE9wdGlvbnNcclxuICApOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qgd2FybiA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKG9wdGlvbnM/LmVtaXRXYXJuKSBjb25zb2xlLndhcm4oYFthcHBseVBhdGhdICR7bWVzc2FnZX1gKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZXJyb3IgPSAobWVzc2FnZTogc3RyaW5nKTogbmV2ZXIgPT4ge1xyXG4gICAgICBpZiAob3B0aW9ucz8uZW1pdEVycm9yKSB0aHJvdyBuZXcgRXJyb3IoYFthcHBseVBhdGhdICR7bWVzc2FnZX1gKTtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbYXBwbHlQYXRoXSAke21lc3NhZ2V9YCk7IC8vIGZhbGxiYWNrIGRlZmF1bHQgYmVoYXZpb3JcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY3JlYXRlQ29udHJvbCA9ICh0eXBlOiBDb250cm9sVHlwZSk6IEFic3RyYWN0Q29udHJvbCA9PiB7XHJcbiAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2FycmF5JzogcmV0dXJuIG5ldyBGb3JtQXJyYXkoW10pO1xyXG4gICAgICAgIGNhc2UgJ2dyb3VwJzogcmV0dXJuIG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgIGNhc2UgJ2NvbnRyb2wnOiBkZWZhdWx0OiByZXR1cm4gbmV3IEZvcm1Db250cm9sKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG5vcm1hbGl6ZVBhdGggPSAocGF0aDogUGF0aCk6IChzdHJpbmcgfCBudW1iZXIpW10gPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnJlZHVjZTwoc3RyaW5nIHwgbnVtYmVyKVtdPigoYWNjLCBwYXJ0KSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGFjYy5wdXNoKC4uLnBhcnQuc3BsaXQoJy4nKSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhY2MucHVzaChwYXJ0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgfSwgW10pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBbcGF0aF07XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHNlZ21lbnRzID0gbm9ybWFsaXplUGF0aChwYXRoKTtcclxuICAgIGxldCBjdXJyZW50OiBBYnN0cmFjdENvbnRyb2wgfCBudWxsID0gY29udHJvbDtcclxuICAgIGNvbnN0IGNyZWF0ZVBhdGggPSBvcHRpb25zPy5jcmVhdGUgPz8gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBzZWdtZW50ID0gc2VnbWVudHNbaV07XHJcbiAgICAgIGNvbnN0IGlzTGVhZiA9IGkgPT09IHNlZ21lbnRzLmxlbmd0aCAtIDE7XHJcbiAgICAgIGNvbnN0IG5leHRUeXBlOiBDb250cm9sVHlwZSA9XHJcbiAgICAgICAgaXNMZWFmID8gKG9wdGlvbnM/LmV4cGVjdGVkID8/ICdjb250cm9sJylcclxuICAgICAgICAgIDogdHlwZW9mIHNlZ21lbnRzW2kgKyAxXSA9PT0gJ251bWJlcicgPyAnYXJyYXknXHJcbiAgICAgICAgICAgIDogJ2dyb3VwJztcclxuXHJcbiAgICAgIGNvbnN0IGdldEN1cnJlbnRQYXRoID0gKCkgPT4gc2VnbWVudHMuc2xpY2UoMCwgaSArIDEpLmpvaW4oJy4nKTtcclxuXHJcbiAgICAgIGlmICghY3VycmVudCkge1xyXG4gICAgICAgIHJldHVybiBlcnJvcihgQ29udHJvbCBpcyBudWxsIGF0IHNlZ21lbnQgXCIke2dldEN1cnJlbnRQYXRoKCl9XCJgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFzZWdtZW50KSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodHlwZW9mIHNlZ21lbnQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgaWYgKCEoY3VycmVudCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcclxuICAgICAgICAgIHJldHVybiBlcnJvcihgRXhwZWN0ZWQgRm9ybUFycmF5IGF0IHNlZ21lbnQgWyR7Z2V0Q3VycmVudFBhdGgoKX1dLCBnb3QgJHtjdXJyZW50LmNvbnN0cnVjdG9yLm5hbWV9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpbmRleCA9IHNlZ21lbnQ7XHJcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjdXJyZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgd2FybihgSW5kZXggJHtpbmRleH0gaXMgb3V0IG9mIGJvdW5kcyBhdCBwYXRoIFwiJHtnZXRDdXJyZW50UGF0aCgpfVwiIChsZW5ndGggPSAke2N1cnJlbnQubGVuZ3RofSlgKTtcclxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5hdChpbmRleCk7XHJcblxyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzZWdtZW50ID09PSAnc3RyaW5nJykge1xyXG5cclxuICAgICAgICBpZiAoc2VnbWVudCA9PT0gJ3BhcmVudCcpIHtcclxuICAgICAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkgJiYgY3VycmVudC5nZXQoc2VnbWVudClcclxuICAgICAgICAgICAgPyBjdXJyZW50LmdldChzZWdtZW50KVxyXG4gICAgICAgICAgICA6IGN1cnJlbnQucGFyZW50O1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VnbWVudCA9PT0gJ3Jvb3QnKSB7XHJcbiAgICAgICAgICBjdXJyZW50ID0gKGN1cnJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXAgJiYgY3VycmVudC5nZXQoc2VnbWVudCkpXHJcbiAgICAgICAgICAgID8gY3VycmVudC5nZXQoc2VnbWVudClcclxuICAgICAgICAgICAgOiBjdXJyZW50LnJvb3Q7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGN1cnJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXApKSB7XHJcbiAgICAgICAgICByZXR1cm4gZXJyb3IoYEV4cGVjdGVkIEZvcm1Hcm91cCBhdCBzZWdtZW50IFwiJHtnZXRDdXJyZW50UGF0aCgpfVwiLCBnb3QgJHtjdXJyZW50LmNvbnN0cnVjdG9yLm5hbWV9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY3VycmVudC5nZXQoc2VnbWVudCkpIHtcclxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmdldChzZWdtZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGNyZWF0ZVBhdGgpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q29udHJvbCA9IGNyZWF0ZUNvbnRyb2wobmV4dFR5cGUpO1xyXG4gICAgICAgICAgICBjdXJyZW50LmFkZENvbnRyb2woc2VnbWVudCwgbmV3Q29udHJvbCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBuZXdDb250cm9sO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2FybihgQ29udHJvbCB3aXRoIGtleSBcIiR7Z2V0Q3VycmVudFBhdGgoKX1cIiBub3QgZm91bmQgaW4gRm9ybUdyb3VwLmApO1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0gICAgICBcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGVycm9yKGBJbnZhbGlkIHNlZ21lbnQgdHlwZTogJHt0eXBlb2Ygc2VnbWVudH1gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjdXJyZW50ID8/IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXNPYmplY3QodmFsdWU6IGFueSk6IG9iamVjdCB7XHJcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc0FycmF5KHZhbHVlOiBhbnkpOiBBcnJheTxhbnk+IHtcclxuICAgIGlmICh2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydEludG9BcnJheShmb3JtQXJyYXk6IEZvcm1BcnJheSwgaW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSwgb3B0aW9ucz86IFBhdGNoT3B0aW9ucyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaXRlbVRvQWRkID0gdGhpcy5jcmVhdGVBcnJheUl0ZW0oZm9ybUFycmF5KTtcclxuICAgIHRoaXMucGF0Y2goaXRlbVRvQWRkLCB2YWx1ZSwgb3B0aW9ucyk7XHJcbiAgICBmb3JtQXJyYXkuaW5zZXJ0KGluZGV4LCBpdGVtVG9BZGQpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZUZyb21BcnJheShmb3JtQXJyYXk6IEZvcm1BcnJheSwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGluZGV4IDw9IDAgfHwgaW5kZXggPj0gZm9ybUFycmF5Lmxlbmd0aCkgZmFsc2U7XHJcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUFycmF5SXRlbShmb3JtQXJyYXk6IEZvcm1BcnJheSk6IEZvcm1Hcm91cFxyXG4gIHtcclxuICAgIGNvbnN0IGFueUNvbnRyb2wgPSBmb3JtQXJyYXkgYXMgYW55O1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gKHR5cGVvZiAoYW55Q29udHJvbCkuY3JlYXRlSXRlbSA9PT0gJ2Z1bmN0aW9uJylcclxuICAgICAgPyBhbnlDb250cm9sLmNyZWF0ZUl0ZW0oKVxyXG4gICAgICA6IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgcmV0dXJuIGZvcm1Hcm91cDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ29udHJvbEZyb21WYWx1ZSh2YWx1ZTogYW55KTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2wodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBuZXcgRm9ybUFycmF5KHRoaXMuY3JlYXRlQ29udHJvbEZyb21BcnJheSh2YWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb250cm9sRnJvbUFycmF5KGFycmF5OiBhbnlbXSk6IEFic3RyYWN0Q29udHJvbFtdIHtcclxuICAgIHJldHVybiBhcnJheS5tYXAoaXRlbSA9PiB0aGlzLmNyZWF0ZUNvbnRyb2xGcm9tVmFsdWUoaXRlbSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVbmtub3duKGNvbnRyb2w6IGFueSkge1xyXG4gICAgY29udHJvbC5fdW5rbm93biA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVW5rbm93bihjb250cm9sOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBjb250cm9sICYmIGNvbnRyb2wuX3Vua25vd24gPT09IHRydWU7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
|
|
@@ -1,70 +1,84 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
+
import { ToBoundArrows } from '../utils/functions';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
|
-
//import { FeelService } from '../services/feel.service';
|
|
4
4
|
export class FormatterService {
|
|
5
|
-
//constructor(private feelService: FeelService) { }
|
|
6
5
|
constructor() { }
|
|
7
|
-
|
|
8
|
-
if (
|
|
9
|
-
return
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return result;
|
|
21
|
-
}
|
|
6
|
+
formatDate(isoDate, options, locale = 'it-IT') {
|
|
7
|
+
if (!isoDate)
|
|
8
|
+
return '';
|
|
9
|
+
const date = new Date(isoDate);
|
|
10
|
+
if (isNaN(date.getTime()))
|
|
11
|
+
return '';
|
|
12
|
+
const formatOptions = {
|
|
13
|
+
day: '2-digit',
|
|
14
|
+
month: '2-digit',
|
|
15
|
+
year: 'numeric',
|
|
16
|
+
...options
|
|
17
|
+
};
|
|
18
|
+
return new Intl.DateTimeFormat(locale, formatOptions).format(date);
|
|
22
19
|
}
|
|
23
|
-
|
|
24
|
-
if (!
|
|
20
|
+
formatTime(isoDate, options, locale = 'it-IT') {
|
|
21
|
+
if (!isoDate)
|
|
25
22
|
return '';
|
|
26
|
-
const date = new Date(
|
|
23
|
+
const date = new Date(isoDate);
|
|
27
24
|
if (isNaN(date.getTime()))
|
|
28
25
|
return '';
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
const formatOptions = {
|
|
27
|
+
hour: '2-digit',
|
|
28
|
+
minute: '2-digit',
|
|
29
|
+
second: '2-digit',
|
|
30
|
+
hour12: false,
|
|
31
|
+
...options
|
|
32
|
+
};
|
|
33
|
+
return new Intl.DateTimeFormat(locale, formatOptions).format(date);
|
|
33
34
|
}
|
|
34
|
-
formatDateTime(
|
|
35
|
-
if (!
|
|
35
|
+
formatDateTime(isoDate, options, locale = 'it-IT') {
|
|
36
|
+
if (!isoDate)
|
|
36
37
|
return '';
|
|
37
|
-
const date = new Date(
|
|
38
|
+
const date = new Date(isoDate);
|
|
38
39
|
if (isNaN(date.getTime()))
|
|
39
40
|
return '';
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
41
|
+
const datePart = new Intl.DateTimeFormat(locale, {
|
|
42
|
+
day: '2-digit',
|
|
43
|
+
month: '2-digit',
|
|
44
|
+
year: 'numeric',
|
|
45
|
+
...options
|
|
46
|
+
}).format(date);
|
|
47
|
+
const timePart = new Intl.DateTimeFormat(locale, {
|
|
48
|
+
hour: '2-digit',
|
|
49
|
+
minute: '2-digit',
|
|
50
|
+
second: '2-digit',
|
|
51
|
+
hour12: false,
|
|
52
|
+
...options
|
|
53
|
+
}).format(date);
|
|
54
|
+
return `${datePart} ${timePart}`;
|
|
53
55
|
}
|
|
54
|
-
|
|
55
|
-
if (isNaN(value)
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
56
|
+
formatCurrency(value, currency = 'EUR', locale = 'it-IT') {
|
|
57
|
+
if (isNaN(value))
|
|
58
|
+
return '';
|
|
59
|
+
return new Intl.NumberFormat(locale, {
|
|
60
|
+
style: 'currency',
|
|
61
|
+
currency: currency,
|
|
62
|
+
currencyDisplay: 'symbol' // oppure: 'code' | 'name'
|
|
63
|
+
}).format(value);
|
|
64
|
+
}
|
|
65
|
+
formatNumber(value, decimals = 2, locale = 'it-IT') {
|
|
66
|
+
if (isNaN(value))
|
|
67
|
+
return '';
|
|
68
|
+
return new Intl.NumberFormat(locale, {
|
|
69
|
+
style: 'decimal',
|
|
70
|
+
minimumFractionDigits: decimals,
|
|
71
|
+
maximumFractionDigits: decimals
|
|
72
|
+
}).format(value);
|
|
63
73
|
}
|
|
64
|
-
|
|
65
|
-
return
|
|
66
|
-
|
|
67
|
-
|
|
74
|
+
getContext() {
|
|
75
|
+
return ToBoundArrows(this, [
|
|
76
|
+
'formatDate',
|
|
77
|
+
'formatTime',
|
|
78
|
+
'formatDateTime',
|
|
79
|
+
'formatCurrency',
|
|
80
|
+
'formatNumber'
|
|
81
|
+
]);
|
|
68
82
|
}
|
|
69
83
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormatterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
70
84
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormatterService, providedIn: 'root' });
|
|
@@ -75,4 +89,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
75
89
|
providedIn: 'root'
|
|
76
90
|
}]
|
|
77
91
|
}], ctorParameters: () => [] });
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2lyaW8vc3JjL2xpYi9zZXJ2aWNlcy9mb3JtYXR0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFLbkQsTUFBTSxPQUFPLGdCQUFnQjtJQUUzQixnQkFBZ0IsQ0FBQztJQUVqQixVQUFVLENBQUMsT0FBa0MsRUFDM0MsT0FBb0MsRUFDcEMsU0FBaUIsT0FBTztRQUV4QixJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRXhCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRXJDLE1BQU0sYUFBYSxHQUErQjtZQUNoRCxHQUFHLEVBQUUsU0FBUztZQUNkLEtBQUssRUFBRSxTQUFTO1lBQ2hCLElBQUksRUFBRSxTQUFTO1lBQ2YsR0FBRyxPQUFPO1NBQ1gsQ0FBQztRQUVGLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFrQyxFQUMzQyxPQUFvQyxFQUNwQyxTQUFpQixPQUFPO1FBRXhCLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFckMsTUFBTSxhQUFhLEdBQStCO1lBQ2hELElBQUksRUFBRSxTQUFTO1lBQ2YsTUFBTSxFQUFFLFNBQVM7WUFDakIsTUFBTSxFQUFFLFNBQVM7WUFDakIsTUFBTSxFQUFFLEtBQUs7WUFDYixHQUFHLE9BQU87U0FDWCxDQUFDO1FBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQWtDLEVBQy9DLE9BQW9DLEVBQ3BDLFNBQWlCLE9BQU87UUFDeEIsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUV4QixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO1lBQy9DLEdBQUcsRUFBRSxTQUFTO1lBQ2QsS0FBSyxFQUFFLFNBQVM7WUFDaEIsSUFBSSxFQUFFLFNBQVM7WUFDZixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhCLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUU7WUFDL0MsSUFBSSxFQUFFLFNBQVM7WUFDZixNQUFNLEVBQUUsU0FBUztZQUNqQixNQUFNLEVBQUUsU0FBUztZQUNqQixNQUFNLEVBQUUsS0FBSztZQUNiLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEIsT0FBTyxHQUFHLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsY0FBYyxDQUNaLEtBQWEsRUFDYixXQUFtQixLQUFLLEVBQ3hCLFNBQWlCLE9BQU87UUFFeEIsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFNUIsT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ25DLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGVBQWUsRUFBRSxRQUFRLENBQUMsMEJBQTBCO1NBQ3JELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELFlBQVksQ0FDVixLQUFhLEVBQ2IsV0FBbUIsQ0FBQyxFQUNwQixTQUFpQixPQUFPO1FBRXhCLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTVCLE9BQU8sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNuQyxLQUFLLEVBQUUsU0FBUztZQUNoQixxQkFBcUIsRUFBRSxRQUFRO1lBQy9CLHFCQUFxQixFQUFFLFFBQVE7U0FDaEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sYUFBYSxDQUFDLElBQUksRUFBRTtZQUN6QixZQUFZO1lBQ1osWUFBWTtZQUNaLGdCQUFnQjtZQUNoQixnQkFBZ0I7WUFDaEIsY0FBYztTQUNmLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBekdVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSUV2YWx1YXRvclByb3ZpZGVyIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZ3JhbW1hYmlsaXR5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb0JvdW5kQXJyb3dzIH0gZnJvbSAnLi4vdXRpbHMvZnVuY3Rpb25zJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1hdHRlclNlcnZpY2UgaW1wbGVtZW50cyBJRXZhbHVhdG9yUHJvdmlkZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBmb3JtYXREYXRlKGlzb0RhdGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgICBvcHRpb25zPzogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXHJcbiAgICBsb2NhbGU6IHN0cmluZyA9ICdpdC1JVCdcclxuICApOiBzdHJpbmcge1xyXG4gICAgaWYgKCFpc29EYXRlKSByZXR1cm4gJyc7XHJcblxyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGlzb0RhdGUpO1xyXG4gICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuICcnO1xyXG5cclxuICAgIGNvbnN0IGZvcm1hdE9wdGlvbnM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0ge1xyXG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcclxuICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcclxuICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAuLi5vcHRpb25zXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIGZvcm1hdE9wdGlvbnMpLmZvcm1hdChkYXRlKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdFRpbWUoaXNvRGF0ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICAgIG9wdGlvbnM/OiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyxcclxuICAgIGxvY2FsZTogc3RyaW5nID0gJ2l0LUlUJ1xyXG4gICk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWlzb0RhdGUpIHJldHVybiAnJztcclxuXHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXNvRGF0ZSk7XHJcbiAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XHJcblxyXG4gICAgY29uc3QgZm9ybWF0T3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XHJcbiAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcclxuICAgICAgbWludXRlOiAnMi1kaWdpdCcsXHJcbiAgICAgIHNlY29uZDogJzItZGlnaXQnLFxyXG4gICAgICBob3VyMTI6IGZhbHNlLFxyXG4gICAgICAuLi5vcHRpb25zXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIGZvcm1hdE9wdGlvbnMpLmZvcm1hdChkYXRlKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdERhdGVUaW1lKGlzb0RhdGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgICBvcHRpb25zPzogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXHJcbiAgICBsb2NhbGU6IHN0cmluZyA9ICdpdC1JVCcpIHtcclxuICAgIGlmICghaXNvRGF0ZSkgcmV0dXJuICcnO1xyXG5cclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpc29EYXRlKTtcclxuICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiAnJztcclxuXHJcbiAgICBjb25zdCBkYXRlUGFydCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwge1xyXG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcclxuICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcclxuICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAuLi5vcHRpb25zXHJcbiAgICB9KS5mb3JtYXQoZGF0ZSk7XHJcblxyXG4gICAgY29uc3QgdGltZVBhcnQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIHtcclxuICAgICAgaG91cjogJzItZGlnaXQnLFxyXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcclxuICAgICAgc2Vjb25kOiAnMi1kaWdpdCcsXHJcbiAgICAgIGhvdXIxMjogZmFsc2UsXHJcbiAgICAgIC4uLm9wdGlvbnNcclxuICAgIH0pLmZvcm1hdChkYXRlKTtcclxuXHJcbiAgICByZXR1cm4gYCR7ZGF0ZVBhcnR9ICR7dGltZVBhcnR9YDtcclxuICB9XHJcblxyXG4gIGZvcm1hdEN1cnJlbmN5KFxyXG4gICAgdmFsdWU6IG51bWJlcixcclxuICAgIGN1cnJlbmN5OiBzdHJpbmcgPSAnRVVSJyxcclxuICAgIGxvY2FsZTogc3RyaW5nID0gJ2l0LUlUJ1xyXG4gICk6IHN0cmluZyB7XHJcbiAgICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gJyc7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIHtcclxuICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXHJcbiAgICAgIGN1cnJlbmN5OiBjdXJyZW5jeSxcclxuICAgICAgY3VycmVuY3lEaXNwbGF5OiAnc3ltYm9sJyAvLyBvcHB1cmU6ICdjb2RlJyB8ICduYW1lJ1xyXG4gICAgfSkuZm9ybWF0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdE51bWJlcihcclxuICAgIHZhbHVlOiBudW1iZXIsXHJcbiAgICBkZWNpbWFsczogbnVtYmVyID0gMixcclxuICAgIGxvY2FsZTogc3RyaW5nID0gJ2l0LUlUJyAgICBcclxuICApOiBzdHJpbmcge1xyXG4gICAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuICcnO1xyXG5cclxuICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG9jYWxlLCB7XHJcbiAgICAgIHN0eWxlOiAnZGVjaW1hbCcsXHJcbiAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogZGVjaW1hbHMsXHJcbiAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZGVjaW1hbHNcclxuICAgIH0pLmZvcm1hdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0KCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIFRvQm91bmRBcnJvd3ModGhpcywgW1xyXG4gICAgICAnZm9ybWF0RGF0ZScsXHJcbiAgICAgICdmb3JtYXRUaW1lJyxcclxuICAgICAgJ2Zvcm1hdERhdGVUaW1lJyxcclxuICAgICAgJ2Zvcm1hdEN1cnJlbmN5JyxcclxuICAgICAgJ2Zvcm1hdE51bWJlcidcclxuICAgIF0pO1xyXG4gIH1cclxuICBcclxufVxyXG4iXX0=
|