@dynamic-field-kit/angular 1.3.3 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +50 -3
- package/dist/README.md +50 -3
- package/dist/components/BaseInput.d.ts +5 -11
- package/dist/components/DynamicInput.d.ts +6 -2
- package/dist/components/FieldInput.d.ts +6 -2
- package/dist/components/MultiFieldInput.d.ts +10 -1
- package/dist/esm2022/components/BaseInput.mjs +8 -17
- package/dist/esm2022/components/DynamicInput.mjs +67 -14
- package/dist/esm2022/components/FieldInput.mjs +39 -20
- package/dist/esm2022/components/MultiFieldInput.mjs +87 -13
- package/dist/esm2022/fieldRegistryToken.mjs +12 -0
- package/dist/esm2022/public-api.mjs +6 -2
- package/dist/esm2022/types/layout.mjs +1 -1
- package/dist/fesm2022/dynamic-field-kit-angular.mjs +208 -61
- package/dist/fesm2022/dynamic-field-kit-angular.mjs.map +1 -1
- package/dist/fieldRegistryToken.d.ts +3 -0
- package/dist/public-api.d.ts +4 -1
- package/dist/types/layout.d.ts +4 -25
- package/package.json +14 -16
- package/src/components/BaseInput.ts +7 -10
- package/src/components/DynamicInput.ts +67 -11
- package/src/components/FieldInput.ts +23 -16
- package/src/components/MultiFieldInput.ts +101 -8
- package/src/fieldRegistryToken.ts +15 -0
- package/src/public-api.ts +40 -24
- package/src/types/layout.ts +14 -36
- package/test/DynamicInput.spec.ts +217 -17
- package/test/FieldInput.spec.ts +131 -29
- package/test/MultiFieldInput.spec.ts +256 -0
- package/test/helpers/renderers.ts +89 -0
- package/test/layout.spec.ts +119 -0
- package/test/publicApi.spec.ts +64 -0
- package/{test.ts → test/setup.ts} +2 -2
- package/test/smoke.spec.ts +27 -0
- package/tsconfig.json +13 -13
- package/tsconfig.spec.json +4 -16
- package/vitest.config.ts +30 -0
- package/angular.json +0 -27
- package/karma.conf.js +0 -37
- package/test/angular.spec.ts +0 -102
- package/test/integration.spec.ts +0 -57
- package/test/layouts.spec.ts +0 -26
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NgClass, NgFor, NgIf } from '@angular/common';
|
|
2
2
|
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, } from '@angular/core';
|
|
3
|
-
import { applyComputedValues, canAddGroupItem, canRemoveGroupItem, createGroupItem, } from '@dynamic-field-kit/core';
|
|
3
|
+
import { applyComputedValues, canAddGroupItem, canRemoveGroupItem, createGroupItem, resolveDisabled, resolveOptions, resolveReadOnly, validateField, validateFields, } from '@dynamic-field-kit/core';
|
|
4
4
|
import { FieldInput } from './FieldInput';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
const DEFAULT_BREAKPOINT = 768;
|
|
@@ -9,7 +9,12 @@ export class MultiFieldInput {
|
|
|
9
9
|
fieldDescriptions = [];
|
|
10
10
|
properties;
|
|
11
11
|
onChange = new EventEmitter();
|
|
12
|
+
validityChange = new EventEmitter();
|
|
12
13
|
layout = 'column';
|
|
14
|
+
// Top-level form data, threaded down through repeatable groups so a nested
|
|
15
|
+
// field's appearCondition/computeValue can read the root form. Omitted at
|
|
16
|
+
// the top level, where the form's own data is the root.
|
|
17
|
+
rootData;
|
|
13
18
|
data = {};
|
|
14
19
|
visibleFields = [];
|
|
15
20
|
isMobile = false;
|
|
@@ -53,6 +58,18 @@ export class MultiFieldInput {
|
|
|
53
58
|
trackByIndex(index) {
|
|
54
59
|
return index;
|
|
55
60
|
}
|
|
61
|
+
groupTrackByCache = new WeakMap();
|
|
62
|
+
// Returns a stable trackBy per group field: item[keyField] when configured,
|
|
63
|
+
// else the index. Cached by field reference so the template hands Angular the
|
|
64
|
+
// same function each change-detection pass.
|
|
65
|
+
groupTrackBy(field) {
|
|
66
|
+
let fn = this.groupTrackByCache.get(field);
|
|
67
|
+
if (!fn) {
|
|
68
|
+
fn = (index, item) => field.keyField ? item[field.keyField] ?? index : index;
|
|
69
|
+
this.groupTrackByCache.set(field, fn);
|
|
70
|
+
}
|
|
71
|
+
return fn;
|
|
72
|
+
}
|
|
56
73
|
ngOnInit() {
|
|
57
74
|
this.updateIsMobile();
|
|
58
75
|
this.init();
|
|
@@ -64,19 +81,25 @@ export class MultiFieldInput {
|
|
|
64
81
|
const breakpoint = typeof this.layout === 'object' && this.layout.type === 'responsive'
|
|
65
82
|
? this.layout.breakpoint ?? DEFAULT_BREAKPOINT
|
|
66
83
|
: DEFAULT_BREAKPOINT;
|
|
67
|
-
|
|
68
|
-
typeof window
|
|
84
|
+
if (typeof window !== 'undefined' &&
|
|
85
|
+
typeof window.matchMedia === 'function') {
|
|
86
|
+
this.isMobile = window.matchMedia(`(max-width: ${breakpoint - 1}px)`).matches;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.isMobile =
|
|
90
|
+
typeof window !== 'undefined' && window.innerWidth < breakpoint;
|
|
91
|
+
}
|
|
69
92
|
}
|
|
70
93
|
init() {
|
|
71
94
|
if (this.properties) {
|
|
72
|
-
this.data = applyComputedValues(this.fieldDescriptions, {
|
|
73
|
-
...this.properties,
|
|
74
|
-
});
|
|
95
|
+
this.data = applyComputedValues(this.fieldDescriptions, { ...this.properties }, this.rootData);
|
|
75
96
|
}
|
|
76
97
|
this.updateVisibleFields();
|
|
98
|
+
this.validityChange.emit(validateFields(this.fieldDescriptions, this.data, this.rootData));
|
|
77
99
|
}
|
|
78
100
|
updateVisibleFields() {
|
|
79
|
-
|
|
101
|
+
const root = this.rootData ?? this.data;
|
|
102
|
+
this.visibleFields = this.fieldDescriptions.filter((f) => !f.appearCondition || f.appearCondition(this.data, root));
|
|
80
103
|
}
|
|
81
104
|
onFieldChange(event) {
|
|
82
105
|
this.commitData({ ...this.data, [event.key]: event.value });
|
|
@@ -85,6 +108,22 @@ export class MultiFieldInput {
|
|
|
85
108
|
const value = this.data[field.name];
|
|
86
109
|
return Array.isArray(value) ? value : [];
|
|
87
110
|
}
|
|
111
|
+
getResolvedOptions(field) {
|
|
112
|
+
return resolveOptions(field, this.data, this.rootData);
|
|
113
|
+
}
|
|
114
|
+
getDisabled(field) {
|
|
115
|
+
return resolveDisabled(field, this.data, this.rootData);
|
|
116
|
+
}
|
|
117
|
+
getReadOnly(field) {
|
|
118
|
+
return resolveReadOnly(field, this.data, this.rootData);
|
|
119
|
+
}
|
|
120
|
+
getError(field) {
|
|
121
|
+
if (this.getDisabled(field)) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
const errors = validateField(field, this.data[field.name], this.data, this.rootData);
|
|
125
|
+
return errors.length > 0 ? errors : undefined;
|
|
126
|
+
}
|
|
88
127
|
canAddItem(field) {
|
|
89
128
|
return canAddGroupItem(field, this.getItems(field));
|
|
90
129
|
}
|
|
@@ -114,13 +153,14 @@ export class MultiFieldInput {
|
|
|
114
153
|
this.commitData({ ...this.data, [field.name]: items });
|
|
115
154
|
}
|
|
116
155
|
commitData(nextData) {
|
|
117
|
-
this.data = applyComputedValues(this.fieldDescriptions, nextData);
|
|
156
|
+
this.data = applyComputedValues(this.fieldDescriptions, nextData, this.rootData);
|
|
118
157
|
this.updateVisibleFields();
|
|
119
158
|
this.onChange.emit(this.data);
|
|
159
|
+
this.validityChange.emit(validateFields(this.fieldDescriptions, this.data, this.rootData));
|
|
120
160
|
this.cdr.markForCheck();
|
|
121
161
|
}
|
|
122
162
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MultiFieldInput, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
123
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MultiFieldInput, isStandalone: true, selector: "dfk-multi-field-input", inputs: { fieldDescriptions: "fieldDescriptions", properties: "properties", layout: "layout" }, outputs: { onChange: "onChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, usesOnChanges: true, ngImport: i0, template: `
|
|
163
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: MultiFieldInput, isStandalone: true, selector: "dfk-multi-field-input", inputs: { fieldDescriptions: "fieldDescriptions", properties: "properties", layout: "layout", rootData: "rootData" }, outputs: { onChange: "onChange", validityChange: "validityChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, usesOnChanges: true, ngImport: i0, template: `
|
|
124
164
|
<div
|
|
125
165
|
class="p-4 border rounded-lg bg-gray-50"
|
|
126
166
|
[ngClass]="{
|
|
@@ -138,6 +178,10 @@ export class MultiFieldInput {
|
|
|
138
178
|
*ngIf="!field.fields"
|
|
139
179
|
[fieldDescription]="field"
|
|
140
180
|
[value]="data[field.name]"
|
|
181
|
+
[options]="getResolvedOptions(field)"
|
|
182
|
+
[disabled]="getDisabled(field)"
|
|
183
|
+
[readOnly]="getReadOnly(field)"
|
|
184
|
+
[error]="getError(field)"
|
|
141
185
|
(onValueChangeField)="onFieldChange($event)"
|
|
142
186
|
></dfk-field-input>
|
|
143
187
|
|
|
@@ -147,7 +191,7 @@ export class MultiFieldInput {
|
|
|
147
191
|
*ngFor="
|
|
148
192
|
let item of getItems(field);
|
|
149
193
|
let i = index;
|
|
150
|
-
trackBy:
|
|
194
|
+
trackBy: groupTrackBy(field)
|
|
151
195
|
"
|
|
152
196
|
style="display: flex; align-items: flex-start; gap: 8px;"
|
|
153
197
|
>
|
|
@@ -155,11 +199,19 @@ export class MultiFieldInput {
|
|
|
155
199
|
<dfk-multi-field-input
|
|
156
200
|
[fieldDescriptions]="field.fields"
|
|
157
201
|
[properties]="item"
|
|
202
|
+
[rootData]="rootData ?? data"
|
|
158
203
|
(onChange)="onGroupItemChange(field, i, $event)"
|
|
159
204
|
></dfk-multi-field-input>
|
|
160
205
|
</div>
|
|
161
206
|
<button
|
|
162
207
|
type="button"
|
|
208
|
+
[attr.aria-label]="
|
|
209
|
+
(field.removeLabel || 'Remove') +
|
|
210
|
+
' ' +
|
|
211
|
+
(field.label || field.name) +
|
|
212
|
+
' ' +
|
|
213
|
+
(i + 1)
|
|
214
|
+
"
|
|
163
215
|
(click)="onGroupItemRemove(field, i)"
|
|
164
216
|
[disabled]="!canRemoveItem(field)"
|
|
165
217
|
>
|
|
@@ -168,6 +220,9 @@ export class MultiFieldInput {
|
|
|
168
220
|
</div>
|
|
169
221
|
<button
|
|
170
222
|
type="button"
|
|
223
|
+
[attr.aria-label]="
|
|
224
|
+
(field.addLabel || 'Add') + ' ' + (field.label || field.name)
|
|
225
|
+
"
|
|
171
226
|
(click)="onGroupItemAdd(field)"
|
|
172
227
|
[disabled]="!canAddItem(field)"
|
|
173
228
|
>
|
|
@@ -176,7 +231,7 @@ export class MultiFieldInput {
|
|
|
176
231
|
</div>
|
|
177
232
|
</ng-container>
|
|
178
233
|
</div>
|
|
179
|
-
`, isInline: true, dependencies: [{ kind: "component", type: MultiFieldInput, selector: "dfk-multi-field-input", inputs: ["fieldDescriptions", "properties", "layout"], outputs: ["onChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FieldInput, selector: "dfk-field-input", inputs: ["fieldDescription", "value"], outputs: ["onValueChangeField"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
234
|
+
`, isInline: true, dependencies: [{ kind: "component", type: MultiFieldInput, selector: "dfk-multi-field-input", inputs: ["fieldDescriptions", "properties", "layout", "rootData"], outputs: ["onChange", "validityChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FieldInput, selector: "dfk-field-input", inputs: ["fieldDescription", "value", "options", "disabled", "readOnly", "error"], outputs: ["onValueChangeField"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
180
235
|
}
|
|
181
236
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: MultiFieldInput, decorators: [{
|
|
182
237
|
type: Component,
|
|
@@ -209,6 +264,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
|
|
|
209
264
|
*ngIf="!field.fields"
|
|
210
265
|
[fieldDescription]="field"
|
|
211
266
|
[value]="data[field.name]"
|
|
267
|
+
[options]="getResolvedOptions(field)"
|
|
268
|
+
[disabled]="getDisabled(field)"
|
|
269
|
+
[readOnly]="getReadOnly(field)"
|
|
270
|
+
[error]="getError(field)"
|
|
212
271
|
(onValueChangeField)="onFieldChange($event)"
|
|
213
272
|
></dfk-field-input>
|
|
214
273
|
|
|
@@ -218,7 +277,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
|
|
|
218
277
|
*ngFor="
|
|
219
278
|
let item of getItems(field);
|
|
220
279
|
let i = index;
|
|
221
|
-
trackBy:
|
|
280
|
+
trackBy: groupTrackBy(field)
|
|
222
281
|
"
|
|
223
282
|
style="display: flex; align-items: flex-start; gap: 8px;"
|
|
224
283
|
>
|
|
@@ -226,11 +285,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
|
|
|
226
285
|
<dfk-multi-field-input
|
|
227
286
|
[fieldDescriptions]="field.fields"
|
|
228
287
|
[properties]="item"
|
|
288
|
+
[rootData]="rootData ?? data"
|
|
229
289
|
(onChange)="onGroupItemChange(field, i, $event)"
|
|
230
290
|
></dfk-multi-field-input>
|
|
231
291
|
</div>
|
|
232
292
|
<button
|
|
233
293
|
type="button"
|
|
294
|
+
[attr.aria-label]="
|
|
295
|
+
(field.removeLabel || 'Remove') +
|
|
296
|
+
' ' +
|
|
297
|
+
(field.label || field.name) +
|
|
298
|
+
' ' +
|
|
299
|
+
(i + 1)
|
|
300
|
+
"
|
|
234
301
|
(click)="onGroupItemRemove(field, i)"
|
|
235
302
|
[disabled]="!canRemoveItem(field)"
|
|
236
303
|
>
|
|
@@ -239,6 +306,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
|
|
|
239
306
|
</div>
|
|
240
307
|
<button
|
|
241
308
|
type="button"
|
|
309
|
+
[attr.aria-label]="
|
|
310
|
+
(field.addLabel || 'Add') + ' ' + (field.label || field.name)
|
|
311
|
+
"
|
|
242
312
|
(click)="onGroupItemAdd(field)"
|
|
243
313
|
[disabled]="!canAddItem(field)"
|
|
244
314
|
>
|
|
@@ -255,10 +325,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
|
|
|
255
325
|
type: Input
|
|
256
326
|
}], onChange: [{
|
|
257
327
|
type: Output
|
|
328
|
+
}], validityChange: [{
|
|
329
|
+
type: Output
|
|
258
330
|
}], layout: [{
|
|
259
331
|
type: Input
|
|
332
|
+
}], rootData: [{
|
|
333
|
+
type: Input
|
|
260
334
|
}], onWindowResize: [{
|
|
261
335
|
type: HostListener,
|
|
262
336
|
args: ['window:resize']
|
|
263
337
|
}] } });
|
|
264
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlGaWVsZElucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvTXVsdGlGaWVsZElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsZUFBZSxHQUdoQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRTFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBdUUvQixNQUFNLE9BQU8sZUFBZTtJQVVOO0lBVFgsaUJBQWlCLEdBQXVCLEVBQUUsQ0FBQztJQUMzQyxVQUFVLENBQWM7SUFDdkIsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFDM0MsTUFBTSxHQUFpQixRQUFRLENBQUM7SUFFekMsSUFBSSxHQUFlLEVBQUUsQ0FBQztJQUN0QixhQUFhLEdBQXVCLEVBQUUsQ0FBQztJQUMvQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRXpCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQztJQUc5QyxjQUFjO1FBQ1osTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNI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LE9BQU8sb0ZBQUUsS0FBSyxtSEFBRSxJQUFJLDZGQUFFLFVBQVU7OzRGQTREL0IsZUFBZTtrQkFyRTNCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLDJFQUEyRTtvQkFDM0UsMEVBQTBFO29CQUMxRSx3RUFBd0U7b0JBQ3hFLHlFQUF5RTtvQkFDekUsMEVBQTBFO29CQUMxRSx3RUFBd0U7b0JBQ3hFLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsa0JBQWtCO29CQUM1RCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdEVDtpQkFDRjtzRkFFVSxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNFLE1BQU07c0JBQWQsS0FBSztnQkFTTixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MsIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgYXBwbHlDb21wdXRlZFZhbHVlcyxcbiAgY2FuQWRkR3JvdXBJdGVtLFxuICBjYW5SZW1vdmVHcm91cEl0ZW0sXG4gIGNyZWF0ZUdyb3VwSXRlbSxcbiAgRmllbGREZXNjcmlwdGlvbixcbiAgUHJvcGVydGllcyxcbn0gZnJvbSAnQGR5bmFtaWMtZmllbGQta2l0L2NvcmUnO1xuaW1wb3J0IHsgQmFzZUxheW91dENvbmZpZywgTGF5b3V0Q29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvbGF5b3V0JztcbmltcG9ydCB7IEZpZWxkSW5wdXQgfSBmcm9tICcuL0ZpZWxkSW5wdXQnO1xuXG5jb25zdCBERUZBVUxUX0JSRUFLUE9JTlQgPSA3Njg7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rmay1tdWx0aS1maWVsZC1pbnB1dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIFJlcGVhdGFibGUgZmllbGQgZ3JvdXBzIHJlbmRlciBhIG5lc3RlZCA8ZGZrLW11bHRpLWZpZWxkLWlucHV0PiBwZXIgaXRlbVxuICAvLyAoc2VlIHRoZSAjZ3JvdXBUcGwgYmVsb3cpLCBzbyB0aGlzIGNvbXBvbmVudCBpbXBvcnRzIGl0c2VsZi4gVGhhdCdzIHRoZVxuICAvLyBzdXBwb3J0ZWQgd2F5IHRvIGdpdmUgYSBzdGFuZGFsb25lIGNvbXBvbmVudCByZWN1cnNpdmUgdGVtcGxhdGUgdXNhZ2VcbiAgLy8gd2l0aG91dCBhIGNyb3NzLWZpbGUgY2lyY3VsYXIgaW1wb3J0IGJldHdlZW4gRmllbGRJbnB1dCBhbmQgYSBzZXBhcmF0ZVxuICAvLyBncm91cCBjb21wb25lbnQgKHdob3NlIGBpbXBvcnRzYCBhcnJheXMgYXJlIGV2YWx1YXRlZCBlYWdlcmx5IGF0IG1vZHVsZVxuICAvLyBsb2FkIHRpbWUgYW5kIHdvdWxkIGRlYWRsb2NrIG9uIGFuIGFjdHVhbCBjaXJjdWxhciBtb2R1bGUgcmVmZXJlbmNlKS5cbiAgaW1wb3J0czogW05nQ2xhc3MsIE5nRm9yLCBOZ0lmLCBGaWVsZElucHV0LCBNdWx0aUZpZWxkSW5wdXRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInAtNCBib3JkZXIgcm91bmRlZC1sZyBiZy1ncmF5LTUwXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ2ZsZXggZmxleC1jb2wnOiByZXNvbHZlZExheW91dFR5cGUgPT09ICdjb2x1bW4nLFxuICAgICAgICAnZmxleCBmbGV4LXJvdyc6IHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ3JvdycsXG4gICAgICAgIGdyaWQ6IHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ2dyaWQnXG4gICAgICB9XCJcbiAgICAgIFtzdHlsZS5nYXAucHhdPVwiZ2FwXCJcbiAgICAgIFtzdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zXT1cIlxuICAgICAgICByZXNvbHZlZExheW91dFR5cGUgPT09ICdncmlkJyA/ICdyZXBlYXQoJyArIGNvbHVtbnMgKyAnLCAxZnIpJyA6IG51bGxcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgdmlzaWJsZUZpZWxkczsgdHJhY2tCeTogdHJhY2tCeUZuXCI+XG4gICAgICAgIDxkZmstZmllbGQtaW5wdXRcbiAgICAgICAgICAqbmdJZj1cIiFmaWVsZC5maWVsZHNcIlxuICAgICAgICAgIFtmaWVsZERlc2NyaXB0aW9uXT1cImZpZWxkXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZGF0YVtmaWVsZC5uYW1lXVwiXG4gICAgICAgICAgKG9uVmFsdWVDaGFuZ2VGaWVsZCk9XCJvbkZpZWxkQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9kZmstZmllbGQtaW5wdXQ+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLmZpZWxkc1wiIFtjbGFzc109XCJmaWVsZC5jbGFzc05hbWVcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQubGFiZWxcIj57eyBmaWVsZC5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgaXRlbSBvZiBnZXRJdGVtcyhmaWVsZCk7XG4gICAgICAgICAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlJbmRleFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogOHB4O1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDFcIj5cbiAgICAgICAgICAgICAgPGRmay1tdWx0aS1maWVsZC1pbnB1dFxuICAgICAgICAgICAgICAgIFtmaWVsZERlc2NyaXB0aW9uc109XCJmaWVsZC5maWVsZHNcIlxuICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkdyb3VwSXRlbUNoYW5nZShmaWVsZCwgaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2Rmay1tdWx0aS1maWVsZC1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uR3JvdXBJdGVtUmVtb3ZlKGZpZWxkLCBpKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUmVtb3ZlSXRlbShmaWVsZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBmaWVsZC5yZW1vdmVMYWJlbCB8fCAnUmVtb3ZlJyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEl0ZW1BZGQoZmllbGQpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkSXRlbShmaWVsZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGZpZWxkLmFkZExhYmVsIHx8ICdBZGQnIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpRmllbGRJbnB1dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZmllbGREZXNjcmlwdGlvbnM6IEZpZWxkRGVzY3JpcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKSBwcm9wZXJ0aWVzPzogUHJvcGVydGllcztcbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9wZXJ0aWVzPigpO1xuICBASW5wdXQoKSBsYXlvdXQ6IExheW91dENvbmZpZyA9ICdjb2x1bW4nO1xuXG4gIGRhdGE6IFByb3BlcnRpZXMgPSB7fTtcbiAgdmlzaWJsZUZpZWxkczogRmllbGREZXNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgaXNNb2JpbGUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIGNvbnN0IHdhc01vYmlsZSA9IHRoaXMuaXNNb2JpbGU7XG4gICAgdGhpcy51cGRhdGVJc01vYmlsZSgpO1xuICAgIGlmICh3YXNNb2JpbGUgIT09IHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCByZXNvbHZlZExheW91dCgpOiBCYXNlTGF5b3V0Q29uZmlnIHtcbiAgICBpZiAodHlwZW9mIHRoaXMubGF5b3V0ID09PSAnb2JqZWN0JyAmJiB0aGlzLmxheW91dC50eXBlID09PSAncmVzcG9uc2l2ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzTW9iaWxlID8gdGhpcy5sYXlvdXQubW9iaWxlIDogdGhpcy5sYXlvdXQuZGVza3RvcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0IGFzIEJhc2VMYXlvdXRDb25maWc7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRMYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVkTGF5b3V0O1xuICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnID8gcmVzb2x2ZWQgOiByZXNvbHZlZC50eXBlO1xuICB9XG5cbiAgZ2V0IGdhcCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlZExheW91dDtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnb2JqZWN0JyAmJiByZXNvbHZlZC5nYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVkLmdhcDtcbiAgICB9XG4gICAgcmV0dXJuIDEyO1xuICB9XG5cbiAgZ2V0IGNvbHVtbnMoKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZWRMYXlvdXQ7XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gJ29iamVjdCcgJiYgcmVzb2x2ZWQudHlwZSA9PT0gJ2dyaWQnKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQuY29sdW1ucyA/PyAyO1xuICAgIH1cbiAgICByZXR1cm4gMjtcbiAgfVxuXG4gIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCBmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIGZpZWxkLm5hbWUgfHwgaW5kZXg7XG4gIH1cblxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVJc01vYmlsZSgpO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSXNNb2JpbGUoKTogdm9pZCB7XG4gICAgY29uc3QgYnJlYWtwb2ludCA9XG4gICAgICB0eXBlb2YgdGhpcy5sYXlvdXQgPT09ICdvYmplY3QnICYmIHRoaXMubGF5b3V0LnR5cGUgPT09ICdyZXNwb25zaXZlJ1xuICAgICAgICA/IHRoaXMubGF5b3V0LmJyZWFrcG9pbnQgPz8gREVGQVVMVF9CUkVBS1BPSU5UXG4gICAgICAgIDogREVGQVVMVF9CUkVBS1BPSU5UO1xuICAgIHRoaXMuaXNNb2JpbGUgPVxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmlubmVyV2lkdGggPCBicmVha3BvaW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCkge1xuICAgIGlmICh0aGlzLnByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGFwcGx5Q29tcHV0ZWRWYWx1ZXModGhpcy5maWVsZERlc2NyaXB0aW9ucywge1xuICAgICAgICAuLi50aGlzLnByb3BlcnRpZXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlRmllbGRzKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZpc2libGVGaWVsZHMoKSB7XG4gICAgdGhpcy52aXNpYmxlRmllbGRzID0gdGhpcy5maWVsZERlc2NyaXB0aW9ucy5maWx0ZXIoXG4gICAgICAoZikgPT4gIWYuYXBwZWFyQ29uZGl0aW9uIHx8IGYuYXBwZWFyQ29uZGl0aW9uKHRoaXMuZGF0YSlcbiAgICApO1xuICB9XG5cbiAgb25GaWVsZENoYW5nZShldmVudDogeyB2YWx1ZTogdW5rbm93bjsga2V5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2V2ZW50LmtleV06IGV2ZW50LnZhbHVlIH0pO1xuICB9XG5cbiAgZ2V0SXRlbXMoZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBQcm9wZXJ0aWVzW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhW2ZpZWxkLm5hbWVdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICh2YWx1ZSBhcyBQcm9wZXJ0aWVzW10pIDogW107XG4gIH1cblxuICBjYW5BZGRJdGVtKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNhbkFkZEdyb3VwSXRlbShmaWVsZCwgdGhpcy5nZXRJdGVtcyhmaWVsZCkpO1xuICB9XG5cbiAgY2FuUmVtb3ZlSXRlbShmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjYW5SZW1vdmVHcm91cEl0ZW0oZmllbGQsIHRoaXMuZ2V0SXRlbXMoZmllbGQpKTtcbiAgfVxuXG4gIG9uR3JvdXBJdGVtQWRkKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZEl0ZW0oZmllbGQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhmaWVsZCk7XG4gICAgdGhpcy5jb21taXREYXRhKHtcbiAgICAgIC4uLnRoaXMuZGF0YSxcbiAgICAgIFtmaWVsZC5uYW1lXTogWy4uLml0ZW1zLCBjcmVhdGVHcm91cEl0ZW0oZmllbGQpXSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uR3JvdXBJdGVtUmVtb3ZlKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblJlbW92ZUl0ZW0oZmllbGQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhmaWVsZCkuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgdGhpcy5jb21taXREYXRhKHsgLi4udGhpcy5kYXRhLCBbZmllbGQubmFtZV06IGl0ZW1zIH0pO1xuICB9XG5cbiAgb25Hcm91cEl0ZW1DaGFuZ2UoXG4gICAgZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBuZXh0OiBQcm9wZXJ0aWVzXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcyhmaWVsZCkuc2xpY2UoKTtcbiAgICBpdGVtc1tpbmRleF0gPSBuZXh0O1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2ZpZWxkLm5hbWVdOiBpdGVtcyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbWl0RGF0YShuZXh0RGF0YTogUHJvcGVydGllcyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YSA9IGFwcGx5Q29tcHV0ZWRWYWx1ZXModGhpcy5maWVsZERlc2NyaXB0aW9ucywgbmV4dERhdGEpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUZpZWxkcygpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLmRhdGEpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
|
|
338
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlGaWVsZElucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvTXVsdGlGaWVsZElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGVBQWUsRUFDZixjQUFjLEVBQ2QsZUFBZSxFQUNmLGFBQWEsRUFDYixjQUFjLEdBR2YsTUFBTSx5QkFBeUIsQ0FBQztBQUdqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUUxQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQXNGL0IsTUFBTSxPQUFPLGVBQWU7SUFlTjtJQWRYLGlCQUFpQixHQUF1QixFQUFFLENBQUM7SUFDM0MsVUFBVSxDQUFjO0lBQ3ZCLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0lBQzFDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztJQUN2RCxNQUFNLEdBQWlCLFFBQVEsQ0FBQztJQUN6QywyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHdEQUF3RDtJQUMvQyxRQUFRLENBQWM7SUFFL0IsSUFBSSxHQUFlLEVBQUUsQ0FBQztJQUN0QixhQUFhLEdBQXVCLEVBQUUsQ0FBQztJQUMvQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRXpCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQztJQUc5QyxjQUFjO1FBQ1osTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFB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OEtBM0VoQixPQUFPLG9GQUFFLEtBQUssbUhBQUUsSUFBSSw2RkFBRSxVQUFVOzs0RkEyRS9CLGVBQWU7a0JBcEYzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFVBQVUsRUFBRSxJQUFJO29CQUNoQiwyRUFBMkU7b0JBQzNFLDBFQUEwRTtvQkFDMUUsd0VBQXdFO29CQUN4RSx5RUFBeUU7b0JBQ3pFLDBFQUEwRTtvQkFDMUUsd0VBQXdFO29CQUN4RSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLGtCQUFrQjtvQkFDNUQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RVQ7aUJBQ0Y7c0ZBRVUsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNFLE1BQU07c0JBQWQsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQVNOLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcywgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBhcHBseUNvbXB1dGVkVmFsdWVzLFxuICBjYW5BZGRHcm91cEl0ZW0sXG4gIGNhblJlbW92ZUdyb3VwSXRlbSxcbiAgY3JlYXRlR3JvdXBJdGVtLFxuICByZXNvbHZlRGlzYWJsZWQsXG4gIHJlc29sdmVPcHRpb25zLFxuICByZXNvbHZlUmVhZE9ubHksXG4gIHZhbGlkYXRlRmllbGQsXG4gIHZhbGlkYXRlRmllbGRzLFxuICBGaWVsZERlc2NyaXB0aW9uLFxuICBQcm9wZXJ0aWVzLFxufSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5pbXBvcnQgeyBCYXNlTGF5b3V0Q29uZmlnLCBMYXlvdXRDb25maWcgfSBmcm9tICcuLi90eXBlcy9sYXlvdXQnO1xuaW1wb3J0IHsgRmllbGRJbnB1dCB9IGZyb20gJy4vRmllbGRJbnB1dCc7XG5cbmNvbnN0IERFRkFVTFRfQlJFQUtQT0lOVCA9IDc2ODtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGZrLW11bHRpLWZpZWxkLWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgLy8gUmVwZWF0YWJsZSBmaWVsZCBncm91cHMgcmVuZGVyIGEgbmVzdGVkIDxkZmstbXVsdGktZmllbGQtaW5wdXQ+IHBlciBpdGVtXG4gIC8vIChzZWUgdGhlICNncm91cFRwbCBiZWxvdyksIHNvIHRoaXMgY29tcG9uZW50IGltcG9ydHMgaXRzZWxmLiBUaGF0J3MgdGhlXG4gIC8vIHN1cHBvcnRlZCB3YXkgdG8gZ2l2ZSBhIHN0YW5kYWxvbmUgY29tcG9uZW50IHJlY3Vyc2l2ZSB0ZW1wbGF0ZSB1c2FnZVxuICAvLyB3aXRob3V0IGEgY3Jvc3MtZmlsZSBjaXJjdWxhciBpbXBvcnQgYmV0d2VlbiBGaWVsZElucHV0IGFuZCBhIHNlcGFyYXRlXG4gIC8vIGdyb3VwIGNvbXBvbmVudCAod2hvc2UgYGltcG9ydHNgIGFycmF5cyBhcmUgZXZhbHVhdGVkIGVhZ2VybHkgYXQgbW9kdWxlXG4gIC8vIGxvYWQgdGltZSBhbmQgd291bGQgZGVhZGxvY2sgb24gYW4gYWN0dWFsIGNpcmN1bGFyIG1vZHVsZSByZWZlcmVuY2UpLlxuICBpbXBvcnRzOiBbTmdDbGFzcywgTmdGb3IsIE5nSWYsIEZpZWxkSW5wdXQsIE11bHRpRmllbGRJbnB1dF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicC00IGJvcmRlciByb3VuZGVkLWxnIGJnLWdyYXktNTBcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnZmxleCBmbGV4LWNvbCc6IHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ2NvbHVtbicsXG4gICAgICAgICdmbGV4IGZsZXgtcm93JzogcmVzb2x2ZWRMYXlvdXRUeXBlID09PSAncm93JyxcbiAgICAgICAgZ3JpZDogcmVzb2x2ZWRMYXlvdXRUeXBlID09PSAnZ3JpZCdcbiAgICAgIH1cIlxuICAgICAgW3N0eWxlLmdhcC5weF09XCJnYXBcIlxuICAgICAgW3N0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnNdPVwiXG4gICAgICAgIHJlc29sdmVkTGF5b3V0VHlwZSA9PT0gJ2dyaWQnID8gJ3JlcGVhdCgnICsgY29sdW1ucyArICcsIDFmciknIDogbnVsbFxuICAgICAgXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiB2aXNpYmxlRmllbGRzOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgPGRmay1maWVsZC1pbnB1dFxuICAgICAgICAgICpuZ0lmPVwiIWZpZWxkLmZpZWxkc1wiXG4gICAgICAgICAgW2ZpZWxkRGVzY3JpcHRpb25dPVwiZmllbGRcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkYXRhW2ZpZWxkLm5hbWVdXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJnZXRSZXNvbHZlZE9wdGlvbnMoZmllbGQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0RGlzYWJsZWQoZmllbGQpXCJcbiAgICAgICAgICBbcmVhZE9ubHldPVwiZ2V0UmVhZE9ubHkoZmllbGQpXCJcbiAgICAgICAgICBbZXJyb3JdPVwiZ2V0RXJyb3IoZmllbGQpXCJcbiAgICAgICAgICAob25WYWx1ZUNoYW5nZUZpZWxkKT1cIm9uRmllbGRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L2Rmay1maWVsZC1pbnB1dD5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQuZmllbGRzXCIgW2NsYXNzXT1cImZpZWxkLmNsYXNzTmFtZVwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC5sYWJlbFwiPnt7IGZpZWxkLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBpdGVtIG9mIGdldEl0ZW1zKGZpZWxkKTtcbiAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgICAgICAgICAgdHJhY2tCeTogZ3JvdXBUcmFja0J5KGZpZWxkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGdhcDogOHB4O1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDFcIj5cbiAgICAgICAgICAgICAgPGRmay1tdWx0aS1maWVsZC1pbnB1dFxuICAgICAgICAgICAgICAgIFtmaWVsZERlc2NyaXB0aW9uc109XCJmaWVsZC5maWVsZHNcIlxuICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgIFtyb290RGF0YV09XCJyb290RGF0YSA/PyBkYXRhXCJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25Hcm91cEl0ZW1DaGFuZ2UoZmllbGQsIGksICRldmVudClcIlxuICAgICAgICAgICAgICA+PC9kZmstbXVsdGktZmllbGQtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgKGZpZWxkLnJlbW92ZUxhYmVsIHx8ICdSZW1vdmUnKSArXG4gICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAoZmllbGQubGFiZWwgfHwgZmllbGQubmFtZSkgK1xuICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgKGkgKyAxKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEl0ZW1SZW1vdmUoZmllbGQsIGkpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5SZW1vdmVJdGVtKGZpZWxkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGZpZWxkLnJlbW92ZUxhYmVsIHx8ICdSZW1vdmUnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgIChmaWVsZC5hZGRMYWJlbCB8fCAnQWRkJykgKyAnICcgKyAoZmllbGQubGFiZWwgfHwgZmllbGQubmFtZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEl0ZW1BZGQoZmllbGQpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkSXRlbShmaWVsZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGZpZWxkLmFkZExhYmVsIHx8ICdBZGQnIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpRmllbGRJbnB1dCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZmllbGREZXNjcmlwdGlvbnM6IEZpZWxkRGVzY3JpcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKSBwcm9wZXJ0aWVzPzogUHJvcGVydGllcztcbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9wZXJ0aWVzPigpO1xuICBAT3V0cHV0KCkgdmFsaWRpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFZhbGlkYXRpb25SZXN1bHQ+KCk7XG4gIEBJbnB1dCgpIGxheW91dDogTGF5b3V0Q29uZmlnID0gJ2NvbHVtbic7XG4gIC8vIFRvcC1sZXZlbCBmb3JtIGRhdGEsIHRocmVhZGVkIGRvd24gdGhyb3VnaCByZXBlYXRhYmxlIGdyb3VwcyBzbyBhIG5lc3RlZFxuICAvLyBmaWVsZCdzIGFwcGVhckNvbmRpdGlvbi9jb21wdXRlVmFsdWUgY2FuIHJlYWQgdGhlIHJvb3QgZm9ybS4gT21pdHRlZCBhdFxuICAvLyB0aGUgdG9wIGxldmVsLCB3aGVyZSB0aGUgZm9ybSdzIG93biBkYXRhIGlzIHRoZSByb290LlxuICBASW5wdXQoKSByb290RGF0YT86IFByb3BlcnRpZXM7XG5cbiAgZGF0YTogUHJvcGVydGllcyA9IHt9O1xuICB2aXNpYmxlRmllbGRzOiBGaWVsZERlc2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBpc01vYmlsZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzTW9iaWxlID0gdGhpcy5pc01vYmlsZTtcbiAgICB0aGlzLnVwZGF0ZUlzTW9iaWxlKCk7XG4gICAgaWYgKHdhc01vYmlsZSAhPT0gdGhpcy5pc01vYmlsZSkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlc29sdmVkTGF5b3V0KCk6IEJhc2VMYXlvdXRDb25maWcge1xuICAgIGlmICh0eXBlb2YgdGhpcy5sYXlvdXQgPT09ICdvYmplY3QnICYmIHRoaXMubGF5b3V0LnR5cGUgPT09ICdyZXNwb25zaXZlJykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNNb2JpbGUgPyB0aGlzLmxheW91dC5tb2JpbGUgOiB0aGlzLmxheW91dC5kZXNrdG9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sYXlvdXQgYXMgQmFzZUxheW91dENvbmZpZztcbiAgfVxuXG4gIGdldCByZXNvbHZlZExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZWRMYXlvdXQ7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZlZCA9PT0gJ3N0cmluZycgPyByZXNvbHZlZCA6IHJlc29sdmVkLnR5cGU7XG4gIH1cblxuICBnZXQgZ2FwKCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVkTGF5b3V0O1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdvYmplY3QnICYmIHJlc29sdmVkLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQuZ2FwO1xuICAgIH1cbiAgICByZXR1cm4gMTI7XG4gIH1cblxuICBnZXQgY29sdW1ucygpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlZExheW91dDtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnb2JqZWN0JyAmJiByZXNvbHZlZC50eXBlID09PSAnZ3JpZCcpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZC5jb2x1bW5zID8/IDI7XG4gICAgfVxuICAgIHJldHVybiAyO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gZmllbGQubmFtZSB8fCBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBwcml2YXRlIGdyb3VwVHJhY2tCeUNhY2hlID0gbmV3IFdlYWtNYXA8XG4gICAgRmllbGREZXNjcmlwdGlvbixcbiAgICAoaW5kZXg6IG51bWJlciwgaXRlbTogUHJvcGVydGllcykgPT4gdW5rbm93blxuICA+KCk7XG5cbiAgLy8gUmV0dXJucyBhIHN0YWJsZSB0cmFja0J5IHBlciBncm91cCBmaWVsZDogaXRlbVtrZXlGaWVsZF0gd2hlbiBjb25maWd1cmVkLFxuICAvLyBlbHNlIHRoZSBpbmRleC4gQ2FjaGVkIGJ5IGZpZWxkIHJlZmVyZW5jZSBzbyB0aGUgdGVtcGxhdGUgaGFuZHMgQW5ndWxhciB0aGVcbiAgLy8gc2FtZSBmdW5jdGlvbiBlYWNoIGNoYW5nZS1kZXRlY3Rpb24gcGFzcy5cbiAgZ3JvdXBUcmFja0J5KFxuICAgIGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uXG4gICk6IChpbmRleDogbnVtYmVyLCBpdGVtOiBQcm9wZXJ0aWVzKSA9PiB1bmtub3duIHtcbiAgICBsZXQgZm4gPSB0aGlzLmdyb3VwVHJhY2tCeUNhY2hlLmdldChmaWVsZCk7XG4gICAgaWYgKCFmbikge1xuICAgICAgZm4gPSAoaW5kZXg6IG51bWJlciwgaXRlbTogUHJvcGVydGllcykgPT5cbiAgICAgICAgZmllbGQua2V5RmllbGQgPyBpdGVtW2ZpZWxkLmtleUZpZWxkXSA/PyBpbmRleCA6IGluZGV4O1xuICAgICAgdGhpcy5ncm91cFRyYWNrQnlDYWNoZS5zZXQoZmllbGQsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVJc01vYmlsZSgpO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSXNNb2JpbGUoKTogdm9pZCB7XG4gICAgY29uc3QgYnJlYWtwb2ludCA9XG4gICAgICB0eXBlb2YgdGhpcy5sYXlvdXQgPT09ICdvYmplY3QnICYmIHRoaXMubGF5b3V0LnR5cGUgPT09ICdyZXNwb25zaXZlJ1xuICAgICAgICA/IHRoaXMubGF5b3V0LmJyZWFrcG9pbnQgPz8gREVGQVVMVF9CUkVBS1BPSU5UXG4gICAgICAgIDogREVGQVVMVF9CUkVBS1BPSU5UO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRoaXMuaXNNb2JpbGUgPSB3aW5kb3cubWF0Y2hNZWRpYShcbiAgICAgICAgYChtYXgtd2lkdGg6ICR7YnJlYWtwb2ludCAtIDF9cHgpYFxuICAgICAgKS5tYXRjaGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTW9iaWxlID1cbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmlubmVyV2lkdGggPCBicmVha3BvaW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdCgpIHtcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzLmRhdGEgPSBhcHBseUNvbXB1dGVkVmFsdWVzKFxuICAgICAgICB0aGlzLmZpZWxkRGVzY3JpcHRpb25zLFxuICAgICAgICB7IC4uLnRoaXMucHJvcGVydGllcyB9LFxuICAgICAgICB0aGlzLnJvb3REYXRhXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZpc2libGVGaWVsZHMoKTtcbiAgICB0aGlzLnZhbGlkaXR5Q2hhbmdlLmVtaXQoXG4gICAgICB2YWxpZGF0ZUZpZWxkcyh0aGlzLmZpZWxkRGVzY3JpcHRpb25zLCB0aGlzLmRhdGEsIHRoaXMucm9vdERhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUZpZWxkcygpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5yb290RGF0YSA/PyB0aGlzLmRhdGE7XG4gICAgdGhpcy52aXNpYmxlRmllbGRzID0gdGhpcy5maWVsZERlc2NyaXB0aW9ucy5maWx0ZXIoXG4gICAgICAoZikgPT4gIWYuYXBwZWFyQ29uZGl0aW9uIHx8IGYuYXBwZWFyQ29uZGl0aW9uKHRoaXMuZGF0YSwgcm9vdClcbiAgICApO1xuICB9XG5cbiAgb25GaWVsZENoYW5nZShldmVudDogeyB2YWx1ZTogdW5rbm93bjsga2V5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2V2ZW50LmtleV06IGV2ZW50LnZhbHVlIH0pO1xuICB9XG5cbiAgZ2V0SXRlbXMoZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBQcm9wZXJ0aWVzW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhW2ZpZWxkLm5hbWVdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICh2YWx1ZSBhcyBQcm9wZXJ0aWVzW10pIDogW107XG4gIH1cblxuICBnZXRSZXNvbHZlZE9wdGlvbnMoZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBQcm9wZXJ0aWVzW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiByZXNvbHZlT3B0aW9ucyhmaWVsZCwgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKTtcbiAgfVxuXG4gIGdldERpc2FibGVkKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVEaXNhYmxlZChmaWVsZCwgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKTtcbiAgfVxuXG4gIGdldFJlYWRPbmx5KGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVSZWFkT25seShmaWVsZCwgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKTtcbiAgfVxuXG4gIGdldEVycm9yKGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmdldERpc2FibGVkKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVGaWVsZChcbiAgICAgIGZpZWxkLFxuICAgICAgdGhpcy5kYXRhW2ZpZWxkLm5hbWVdLFxuICAgICAgdGhpcy5kYXRhLFxuICAgICAgdGhpcy5yb290RGF0YVxuICAgICk7XG4gICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPiAwID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgY2FuQWRkSXRlbShmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjYW5BZGRHcm91cEl0ZW0oZmllbGQsIHRoaXMuZ2V0SXRlbXMoZmllbGQpKTtcbiAgfVxuXG4gIGNhblJlbW92ZUl0ZW0oZmllbGQ6IEZpZWxkRGVzY3JpcHRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2FuUmVtb3ZlR3JvdXBJdGVtKGZpZWxkLCB0aGlzLmdldEl0ZW1zKGZpZWxkKSk7XG4gIH1cblxuICBvbkdyb3VwSXRlbUFkZChmaWVsZDogRmllbGREZXNjcmlwdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5BZGRJdGVtKGZpZWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoZmllbGQpO1xuICAgIHRoaXMuY29tbWl0RGF0YSh7XG4gICAgICAuLi50aGlzLmRhdGEsXG4gICAgICBbZmllbGQubmFtZV06IFsuLi5pdGVtcywgY3JlYXRlR3JvdXBJdGVtKGZpZWxkKV0sXG4gICAgfSk7XG4gIH1cblxuICBvbkdyb3VwSXRlbVJlbW92ZShmaWVsZDogRmllbGREZXNjcmlwdGlvbiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5SZW1vdmVJdGVtKGZpZWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoZmllbGQpLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgIHRoaXMuY29tbWl0RGF0YSh7IC4uLnRoaXMuZGF0YSwgW2ZpZWxkLm5hbWVdOiBpdGVtcyB9KTtcbiAgfVxuXG4gIG9uR3JvdXBJdGVtQ2hhbmdlKFxuICAgIGZpZWxkOiBGaWVsZERlc2NyaXB0aW9uLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgbmV4dDogUHJvcGVydGllc1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoZmllbGQpLnNsaWNlKCk7XG4gICAgaXRlbXNbaW5kZXhdID0gbmV4dDtcbiAgICB0aGlzLmNvbW1pdERhdGEoeyAuLi50aGlzLmRhdGEsIFtmaWVsZC5uYW1lXTogaXRlbXMgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1pdERhdGEobmV4dERhdGE6IFByb3BlcnRpZXMpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEgPSBhcHBseUNvbXB1dGVkVmFsdWVzKFxuICAgICAgdGhpcy5maWVsZERlc2NyaXB0aW9ucyxcbiAgICAgIG5leHREYXRhLFxuICAgICAgdGhpcy5yb290RGF0YVxuICAgICk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlRmllbGRzKCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuZGF0YSk7XG4gICAgdGhpcy52YWxpZGl0eUNoYW5nZS5lbWl0KFxuICAgICAgdmFsaWRhdGVGaWVsZHModGhpcy5maWVsZERlc2NyaXB0aW9ucywgdGhpcy5kYXRhLCB0aGlzLnJvb3REYXRhKVxuICAgICk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { fieldRegistry } from '@dynamic-field-kit/core';
|
|
3
|
+
// Injecting this token yields the process-wide singleton by default, so code
|
|
4
|
+
// that never provides it keeps working. Provide it on a component/route to give
|
|
5
|
+
// that subtree an isolated set of renderers:
|
|
6
|
+
//
|
|
7
|
+
// providers: [{ provide: FIELD_REGISTRY, useValue: myScopedRegistry }]
|
|
8
|
+
export const FIELD_REGISTRY = new InjectionToken('dfk.FieldRegistry', {
|
|
9
|
+
providedIn: 'root',
|
|
10
|
+
factory: () => fieldRegistry,
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRSZWdpc3RyeVRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpZWxkUmVnaXN0cnlUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBaUIsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkUsNkVBQTZFO0FBQzdFLGdGQUFnRjtBQUNoRiw2Q0FBNkM7QUFDN0MsRUFBRTtBQUNGLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQzlDLG1CQUFtQixFQUNuQjtJQUNFLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhO0NBQzdCLENBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWVsZFJlZ2lzdHJ5LCBmaWVsZFJlZ2lzdHJ5IH0gZnJvbSAnQGR5bmFtaWMtZmllbGQta2l0L2NvcmUnO1xuXG4vLyBJbmplY3RpbmcgdGhpcyB0b2tlbiB5aWVsZHMgdGhlIHByb2Nlc3Mtd2lkZSBzaW5nbGV0b24gYnkgZGVmYXVsdCwgc28gY29kZVxuLy8gdGhhdCBuZXZlciBwcm92aWRlcyBpdCBrZWVwcyB3b3JraW5nLiBQcm92aWRlIGl0IG9uIGEgY29tcG9uZW50L3JvdXRlIHRvIGdpdmVcbi8vIHRoYXQgc3VidHJlZSBhbiBpc29sYXRlZCBzZXQgb2YgcmVuZGVyZXJzOlxuLy9cbi8vICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBGSUVMRF9SRUdJU1RSWSwgdXNlVmFsdWU6IG15U2NvcGVkUmVnaXN0cnkgfV1cbmV4cG9ydCBjb25zdCBGSUVMRF9SRUdJU1RSWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxGaWVsZFJlZ2lzdHJ5PihcbiAgJ2Rmay5GaWVsZFJlZ2lzdHJ5JyxcbiAge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiAoKSA9PiBmaWVsZFJlZ2lzdHJ5LFxuICB9XG4pO1xuIl19
|
|
@@ -10,5 +10,9 @@ export * from './types/layout';
|
|
|
10
10
|
// Module
|
|
11
11
|
export * from './lib/dynamic-field-kit.module';
|
|
12
12
|
// Optional: expose registry for advanced use cases, but not required for basic usage
|
|
13
|
-
export { fieldRegistry } from '@dynamic-field-kit/core';
|
|
14
|
-
|
|
13
|
+
export { fieldRegistry, FieldRegistry } from '@dynamic-field-kit/core';
|
|
14
|
+
export { validateField, validateFieldAsync, validateFields, validateFieldsAsync, resolveDisabled, resolveReadOnly, resolveOptions, validators, } from '@dynamic-field-kit/core';
|
|
15
|
+
// Scoped registry: provide FIELD_REGISTRY on a component/route to give that
|
|
16
|
+
// subtree an isolated set of renderers.
|
|
17
|
+
export { FIELD_REGISTRY } from './fieldRegistryToken';
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQjtBQUVoQixhQUFhO0FBQ2IsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxTQUFTO0FBQ1QsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxnQkFBZ0IsQ0FBQztBQUUvQixTQUFTO0FBQ1QsY0FBYyxnQ0FBZ0MsQ0FBQztBQVMvQyxxRkFBcUY7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixlQUFlLEVBQ2YsY0FBYyxFQUNkLFVBQVUsR0FDWCxNQUFNLHlCQUF5QixDQUFDO0FBR2pDLDRFQUE0RTtBQUM1RSx3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcHVibGljLWFwaS50c1xuXG4vLyBDb21wb25lbnRzXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvQmFzZUlucHV0JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9EeW5hbWljSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL0ZpZWxkSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL011bHRpRmllbGRJbnB1dCc7XG5cbi8vIExheW91dFxuZXhwb3J0ICogZnJvbSAnLi9sYXlvdXQnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy9sYXlvdXQnO1xuXG4vLyBNb2R1bGVcbmV4cG9ydCAqIGZyb20gJy4vbGliL2R5bmFtaWMtZmllbGQta2l0Lm1vZHVsZSc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIGNvcmUgKG9ubHkgdHlwZSwgbm90IGV4cG9ydCAqIClcbmV4cG9ydCB0eXBlIHtcbiAgRmllbGREZXNjcmlwdGlvbixcbiAgRmllbGRSZW5kZXJlclByb3BzLFxuICBGaWVsZFR5cGVLZXksXG59IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcblxuLy8gT3B0aW9uYWw6IGV4cG9zZSByZWdpc3RyeSBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzLCBidXQgbm90IHJlcXVpcmVkIGZvciBiYXNpYyB1c2FnZVxuZXhwb3J0IHsgZmllbGRSZWdpc3RyeSwgRmllbGRSZWdpc3RyeSB9IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcblxuZXhwb3J0IHtcbiAgdmFsaWRhdGVGaWVsZCxcbiAgdmFsaWRhdGVGaWVsZEFzeW5jLFxuICB2YWxpZGF0ZUZpZWxkcyxcbiAgdmFsaWRhdGVGaWVsZHNBc3luYyxcbiAgcmVzb2x2ZURpc2FibGVkLFxuICByZXNvbHZlUmVhZE9ubHksXG4gIHJlc29sdmVPcHRpb25zLFxuICB2YWxpZGF0b3JzLFxufSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5leHBvcnQgdHlwZSB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XG5cbi8vIFNjb3BlZCByZWdpc3RyeTogcHJvdmlkZSBGSUVMRF9SRUdJU1RSWSBvbiBhIGNvbXBvbmVudC9yb3V0ZSB0byBnaXZlIHRoYXRcbi8vIHN1YnRyZWUgYW4gaXNvbGF0ZWQgc2V0IG9mIHJlbmRlcmVycy5cbmV4cG9ydCB7IEZJRUxEX1JFR0lTVFJZIH0gZnJvbSAnLi9maWVsZFJlZ2lzdHJ5VG9rZW4nO1xuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3R5cGVzL2xheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTGF5b3V0IGNvbmZpZyB0eXBlcyBsaXZlIGluIEBkeW5hbWljLWZpZWxkLWtpdC9jb3JlIHNvIHRoZSBjb250cmFjdCBzdGF5c1xuLy8gaWRlbnRpY2FsIGFjcm9zcyBldmVyeSBmcmFtZXdvcmsgYWRhcHRlci4gUmUtZXhwb3J0ZWQgaGVyZSAod2l0aCB0aGVcbi8vIGhpc3RvcmljYWwgQW5ndWxhciAuLi5Db25maWcgYWxpYXNlcykgdG8gcHJlc2VydmUgZXhpc3RpbmcgaW1wb3J0IHBhdGhzLlxuaW1wb3J0IHR5cGUgeyBCYXNlTGF5b3V0LCBSZXNwb25zaXZlTGF5b3V0IH0gZnJvbSAnQGR5bmFtaWMtZmllbGQta2l0L2NvcmUnO1xuXG5leHBvcnQgdHlwZSB7XG4gIENvbHVtbkxheW91dENvbmZpZyxcbiAgUm93TGF5b3V0Q29uZmlnLFxuICBHcmlkTGF5b3V0Q29uZmlnLFxuICBMYXlvdXRDb25maWcsXG59IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcblxuZXhwb3J0IHR5cGUgQmFzZUxheW91dENvbmZpZyA9IEJhc2VMYXlvdXQ7XG5leHBvcnQgdHlwZSBSZXNwb25zaXZlTGF5b3V0Q29uZmlnID0gUmVzcG9uc2l2ZUxheW91dDtcbiJdfQ==
|