@decaf-ts/for-angular 0.0.22 → 0.0.24
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/components/component-renderer/component-renderer.component.d.ts +3 -2
- package/components/crud-field/crud-field.component.d.ts +4 -2
- package/components/fieldset/fieldset.component.d.ts +10 -1
- package/components/for-angular-components.module.d.ts +3 -2
- package/components/index.d.ts +1 -1
- package/components/layout/layout.component.d.ts +1 -24
- package/components/list/list.component.d.ts +1 -2
- package/components/model-renderer/model-renderer.component.d.ts +6 -1
- package/components/steped-form/steped-form.component.d.ts +243 -0
- package/engine/NgxBaseComponent.d.ts +3 -3
- package/engine/NgxCrudFormField.d.ts +1 -0
- package/engine/NgxFormService.d.ts +381 -48
- package/engine/NgxRenderingEngine.d.ts +4 -2
- package/engine/constants.d.ts +12 -0
- package/engine/interfaces.d.ts +1 -1
- package/engine/types.d.ts +17 -3
- package/esm2022/components/component-renderer/component-renderer.component.mjs +10 -4
- package/esm2022/components/crud-field/crud-field.component.mjs +14 -3
- package/esm2022/components/crud-form/crud-form.component.mjs +3 -3
- package/esm2022/components/empty-state/empty-state.component.mjs +2 -2
- package/esm2022/components/fieldset/fieldset.component.mjs +6 -4
- package/esm2022/components/for-angular-components.module.mjs +10 -5
- package/esm2022/components/index.mjs +2 -2
- package/esm2022/components/layout/layout.component.mjs +4 -29
- package/esm2022/components/list/list.component.mjs +5 -4
- package/esm2022/components/model-renderer/model-renderer.component.mjs +10 -3
- package/esm2022/components/steped-form/steped-form.component.mjs +291 -0
- package/esm2022/engine/NgxBaseComponent.mjs +12 -12
- package/esm2022/engine/NgxCrudFormField.mjs +19 -17
- package/esm2022/engine/NgxFormService.mjs +438 -57
- package/esm2022/engine/NgxRenderingEngine.mjs +21 -10
- package/esm2022/engine/ValidatorFactory.mjs +4 -4
- package/esm2022/engine/constants.mjs +6 -1
- package/esm2022/engine/interfaces.mjs +1 -1
- package/esm2022/engine/types.mjs +1 -1
- package/esm2022/for-angular-common.module.mjs +4 -2
- package/esm2022/i18n/Loader.mjs +4 -4
- package/fesm2022/decaf-ts-for-angular.mjs +830 -153
- package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
- package/for-angular-common.module.d.ts +8 -2
- package/i18n/Loader.d.ts +2 -7
- package/package.json +9 -9
- package/assets/i18n/en.json +0 -80
- package/assets/i18n/pt.json +0 -80
- package/components/list/constants.d.ts +0 -25
- package/esm2022/components/list/constants.mjs +0 -6
|
@@ -38,6 +38,11 @@ export class ModelRendererComponent {
|
|
|
38
38
|
* @description Global variables to be passed to the rendered component
|
|
39
39
|
*/
|
|
40
40
|
this.globals = {};
|
|
41
|
+
/**
|
|
42
|
+
* @description Set if render content projection is allowed
|
|
43
|
+
* @default true
|
|
44
|
+
*/
|
|
45
|
+
this.projectable = true;
|
|
41
46
|
/**
|
|
42
47
|
* @description Event emitter for custom events from the rendered component
|
|
43
48
|
*/
|
|
@@ -55,7 +60,7 @@ export class ModelRendererComponent {
|
|
|
55
60
|
typeof model === 'string'
|
|
56
61
|
? Model.build({}, model)
|
|
57
62
|
: model;
|
|
58
|
-
this.output = model.render(this.globals || {}, this.vcr, this.injector, this.inner);
|
|
63
|
+
this.output = model.render(this.globals || {}, this.vcr, this.injector, this.inner, this.projectable);
|
|
59
64
|
if (this.output?.inputs)
|
|
60
65
|
this.rendererId = sf(AngularEngineKeys.RENDERED_ID, this.output.inputs['rendererId']);
|
|
61
66
|
this.instance = this.output?.instance;
|
|
@@ -113,7 +118,7 @@ export class ModelRendererComponent {
|
|
|
113
118
|
}
|
|
114
119
|
}
|
|
115
120
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModelRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
116
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ModelRendererComponent, isStandalone: true, selector: "ngx-decaf-model-renderer", inputs: { model: "model", globals: "globals", rendererId: "rendererId" }, outputs: { listenEvent: "listenEvent" }, host: { properties: { "attr.id": "rendererId" } }, viewQueries: [{ propertyName: "inner", first: true, predicate: ["inner"], descendants: true, read: TemplateRef, static: true }, { propertyName: "vcr", first: true, predicate: ["componentOuter"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: " <!-- Keep to avoid id conflicts -->\n <div [id]=\"rendererId\"></div>\n\n <ng-template #componentOuter></ng-template>\n <ng-template #inner>\n <div [id]=\"rendererId || null\">\n @for (child of output?.children; track child) {\n @if(child?.children?.length) {\n <ngx-decaf-component-renderer [parent]=\"child\" />\n } @else {\n <ng-container\n #childComponents\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n }\n }\n </div>\n </ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }] }); }
|
|
121
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ModelRendererComponent, isStandalone: true, selector: "ngx-decaf-model-renderer", inputs: { model: "model", globals: "globals", projectable: "projectable", rendererId: "rendererId" }, outputs: { listenEvent: "listenEvent" }, host: { properties: { "attr.id": "rendererId" } }, viewQueries: [{ propertyName: "inner", first: true, predicate: ["inner"], descendants: true, read: TemplateRef, static: true }, { propertyName: "vcr", first: true, predicate: ["componentOuter"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: " <!-- Keep to avoid id conflicts -->\n <div [id]=\"rendererId\"></div>\n\n <ng-template #componentOuter></ng-template>\n <ng-template #inner>\n <div [id]=\"rendererId || null\">\n @for (child of output?.children; track child) {\n @if(child?.children?.length) {\n <ngx-decaf-component-renderer [parent]=\"child\" />\n } @else {\n <ng-container\n #childComponents\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n }\n }\n </div>\n </ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "children", "model", "parent"], outputs: ["listenEvent"] }] }); }
|
|
117
122
|
}
|
|
118
123
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModelRendererComponent, decorators: [{
|
|
119
124
|
type: Component,
|
|
@@ -123,6 +128,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
123
128
|
args: [{ required: true }]
|
|
124
129
|
}], globals: [{
|
|
125
130
|
type: Input
|
|
131
|
+
}], projectable: [{
|
|
132
|
+
type: Input
|
|
126
133
|
}], inner: [{
|
|
127
134
|
type: ViewChild,
|
|
128
135
|
args: ['inner', { read: TemplateRef, static: true }]
|
|
@@ -134,4 +141,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
134
141
|
}], listenEvent: [{
|
|
135
142
|
type: Output
|
|
136
143
|
}] } });
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vZGVsLXJlbmRlcmVyL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2RlbC1yZW5kZXJlci9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUVsQixrQkFBa0IsR0FFbkIsTUFBTSxjQUFjLENBQUM7QUFHdEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7O0FBRWhHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFTSCxNQUFNLE9BQU8sc0JBQXNCO0lBUm5DO1FBa0JFOztXQUVHO1FBRUgsWUFBTyxHQUE0QixFQUFFLENBQUM7UUF5QnRDOztXQUVHO1FBRUgsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQU85QyxhQUFRLEdBQWEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBbUYzQixTQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ2hDO0lBbEZDLG1CQUFtQjtJQUVuQjs7O09BR0c7SUFDSyxPQUFPLENBQUMsS0FBaUI7UUFDL0IsS0FBSztZQUNILE9BQU8sS0FBSyxL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bUdBQXRCLHNCQUFzQixxVUFtQkwsV0FBVyw4R0FpQlksZ0JBQWdCLGdFQ3BHckUsNHFCQXVCQSwwRERtQ2EsaUJBQWlCLG9QQUFFLDBCQUEwQjs7NEZBTTdDLHNCQUFzQjtrQkFSbEMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBRSxpQkFBaUIsRUFBRSwwQkFBMEIsQ0FBQyxZQUMvQywwQkFBMEIsUUFHOUIsRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFDOzhCQVVqQyxLQUFLO3NCQURKLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQU96QixPQUFPO3NCQUROLEtBQUs7Z0JBT04sS0FBSztzQkFESixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFZdkQsVUFBVTtzQkFEVCxLQUFLO2dCQU9OLEdBQUc7c0JBREYsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQU9yRSxXQUFXO3NCQURWLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kZWwsIHNmIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcbmltcG9ydCB7IE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFuZ3VsYXJEeW5hbWljT3V0cHV0LFxuICBBbmd1bGFyRW5naW5lS2V5cyxcbiAgQmFzZUNvbXBvbmVudFByb3BzLFxuICBCYXNlQ3VzdG9tRXZlbnQsXG4gIE5neFJlbmRlcmluZ0VuZ2luZSxcbiAgUmVuZGVyZWRNb2RlbCxcbn0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEtleVZhbHVlLCBSZW5kZXJlckN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL3R5cGVzJztcbmltcG9ydCB7IFJlbmRlcmFibGUgfSBmcm9tICdAZGVjYWYtdHMvdWktZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1yZW5kZXJlci9jb21wb25lbnQtcmVuZGVyZXIuY29tcG9uZW50JztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGZvciByZW5kZXJpbmcgZHluYW1pYyBtb2RlbHNcbiAqIEBzdW1tYXJ5IFRoaXMgY29tcG9uZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkeW5hbWljYWxseSByZW5kZXJpbmcgbW9kZWxzLFxuICogaGFuZGxpbmcgbW9kZWwgY2hhbmdlcywgYW5kIG1hbmFnaW5nIGV2ZW50IHN1YnNjcmlwdGlvbnMgZm9yIHRoZSByZW5kZXJlZCBjb21wb25lbnRzLlxuICogSXQgdXNlcyB0aGUgTmd4UmVuZGVyaW5nRW5naW5lIHRvIHJlbmRlciB0aGUgbW9kZWxzIGFuZCBzdXBwb3J0cyBib3RoIHN0cmluZyBhbmQgTW9kZWwgaW5wdXRzLlxuICogQGNsYXNzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0luamVjdG9yfSBpbmplY3RvciAtIEFuZ3VsYXIgSW5qZWN0b3IgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogPG5neC1kZWNhZi1tb2RlbC1yZW5kZXJlclxuICogICBbbW9kZWxdPVwibXlNb2RlbFwiXG4gKiAgIFtnbG9iYWxzXT1cImdsb2JhbFZhcmlhYmxlc1wiXG4gKiAgIChsaXN0ZW5FdmVudCk9XCJoYW5kbGVFdmVudCgkZXZlbnQpXCI+XG4gKiA8L25neC1kZWNhZi1tb2RlbC1yZW5kZXJlcj5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsUmVuZGVyZXJcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+Pk1vZGVsUmVuZGVyZXI6IElucHV0IG1vZGVsXG4gKiAgIE1vZGVsUmVuZGVyZXItPj5Nb2RlbDogUGFyc2UgaWYgc3RyaW5nXG4gKiAgIE1vZGVsLS0+Pk1vZGVsUmVuZGVyZXI6IFBhcnNlZCBtb2RlbFxuICogICBNb2RlbFJlbmRlcmVyLT4+UmVuZGVyaW5nRW5naW5lOiBSZW5kZXIgbW9kZWxcbiAqICAgUmVuZGVyaW5nRW5naW5lLS0+Pk1vZGVsUmVuZGVyZXI6IFJlbmRlcmVkIG91dHB1dFxuICogICBNb2RlbFJlbmRlcmVyLT4+TW9kZWxSZW5kZXJlcjogU3Vic2NyaWJlIHRvIGV2ZW50c1xuICogICBNb2RlbFJlbmRlcmVyLS0+PkFwcDogRW1pdCBldmVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFsgTmdDb21wb25lbnRPdXRsZXQsIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XSxcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtbW9kZWwtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LnNjc3MnLFxuICBob3N0OiB7J1thdHRyLmlkXSc6ICdyZW5kZXJlcklkJ30sXG59KVxuZXhwb3J0IGNsYXNzIE1vZGVsUmVuZGVyZXJDb21wb25lbnQ8TSBleHRlbmRzIE1vZGVsPlxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBSZW5kZXJlZE1vZGVsIHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIElucHV0IG1vZGVsIHRvIGJlIHJlbmRlcmVkXG4gICAqIEBzdW1tYXJ5IENhbiBiZSBhIE1vZGVsIGluc3RhbmNlIG9yIGEgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtb2RlbFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgbW9kZWwhOiBNIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2xvYmFsIHZhcmlhYmxlcyB0byBiZSBwYXNzZWQgdG8gdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2xvYmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgaW5uZXIgY29udGVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnaW5uZXInLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgaW5uZXI/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE91dHB1dCBvZiB0aGUgcmVuZGVyZWQgbW9kZWxcbiAgICovXG4gIG91dHB1dD86IEFuZ3VsYXJEeW5hbWljT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZW5kZXJlclxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZpZXcgY29udGFpbmVyIHJlZmVyZW5jZSBmb3IgZHluYW1pYyBjb21wb25lbnQgcmVuZGVyaW5nXG4gICAqL1xuICBAVmlld0NoaWxkKCdjb21wb25lbnRPdXRlcicsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHZjciE6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBjdXN0b20gZXZlbnRzIGZyb20gdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGxpc3RlbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5zdGFuY2Ugb2YgdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YW5jZSE6IEtleVZhbHVlIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAvLyBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgdGhlIHJlbmRlcmVkIG1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgTX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWRcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaChtb2RlbDogc3RyaW5nIHwgTSkge1xuICAgIG1vZGVsID1cbiAgICAgIHR5cGVvZiBtb2RlbCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyAoTW9kZWwuYnVpbGQoe30sIG1vZGVsKSBhcyBNKVxuICAgICAgICA6IG1vZGVsO1xuICAgIHRoaXMub3V0cHV0ID0gKG1vZGVsIGFzIHVua25vd24gYXMgUmVuZGVyYWJsZSkucmVuZGVyPEFuZ3VsYXJEeW5hbWljT3V0cHV0PihcbiAgICAgIHRoaXMuZ2xvYmFscyB8fCB7fSxcbiAgICAgIHRoaXMudmNyLFxuICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgIHRoaXMuaW5uZXIsXG4gICAgKTtcbiAgICBpZiAodGhpcy5vdXRwdXQ/LmlucHV0cylcbiAgICAgIHRoaXMucmVuZGVyZXJJZCA9IHNmKFxuICAgICAgICBBbmd1bGFyRW5naW5lS2V5cy5SRU5ERVJFRF9JRCxcbiAgICAgICAgKHRoaXMub3V0cHV0LmlucHV0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ3JlbmRlcmVySWQnXSBhcyBzdHJpbmcsXG4gICAgICApO1xuICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLm91dHB1dD8uaW5zdGFuY2U7XG4gICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgb2YgYSBkaXJlY3RpdmUgY2hhbmdlXG4gICAqIEBwYXJhbSB7U2ltcGxlQ2hhbmdlc30gY2hhbmdlcyAtIE9iamVjdCBjb250YWluaW5nIGNoYW5nZXNcbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdO1xuICAgICAgdGhpcy5yZWZyZXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgZGlyZWN0aXZlLCBwaXBlLCBvciBzZXJ2aWNlIGlzIGRlc3Ryb3llZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgbmdPbkRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICAgIGF3YWl0IE5neFJlbmRlcmluZ0VuZ2luZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcz8ub3V0cHV0Py5jb21wb25lbnQ7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBjb21wb25lbnRLZXlzID0gT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21wb25lbnRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnN0YW5jZVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpXG4gICAgICAgICAgKHRoaXMuaW5zdGFuY2UgYXMgS2V5VmFsdWUpW2tleV0uc3Vic2NyaWJlKChldmVudDogUGFydGlhbDxCYXNlQ3VzdG9tRXZlbnQ+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudC5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgfSBhcyBSZW5kZXJlckN1c3RvbUV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuc3Vic2NyaWJlcyBmcm9tIGV2ZW50cyBlbWl0dGVkIGJ5IHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbXBvbmVudEtleXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmluc3RhbmNlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcilcbiAgICAgICAgICB0aGlzLmluc3RhbmNlW2tleV0udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgSlNPTiA9IEpTT047XG59XG4iLCIgIDwhLS0gS2VlcCB0byBhdm9pZCBpZCBjb25mbGljdHMgLS0+XG4gIDxkaXYgW2lkXT1cInJlbmRlcmVySWRcIj48L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI2NvbXBvbmVudE91dGVyPjwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjaW5uZXI+XG4gICAgPGRpdiAgW2lkXT1cInJlbmRlcmVySWQgfHwgbnVsbFwiPlxuICAgICAgQGZvciAoY2hpbGQgb2Ygb3V0cHV0Py5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgQGlmKGNoaWxkPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgPG5neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXIgW3BhcmVudF09XCJjaGlsZFwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICNjaGlsZENvbXBvbmVudHNcbiAgICAgICAgICAgICpuZ0NvbXBvbmVudE91dGxldD1cIlxuICAgICAgICAgICAgICBjaGlsZC5jb21wb25lbnQ7XG4gICAgICAgICAgICAgIGluamVjdG9yOiBjaGlsZC5pbmplY3RvcjtcbiAgICAgICAgICAgICAgaW5wdXRzOiBjaGlsZC5pbnB1dHM7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6Y2hpbGQuY29udGVudDtcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuIl19
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vZGVsLXJlbmRlcmVyL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2RlbC1yZW5kZXJlci9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUVsQixrQkFBa0IsR0FFbkIsTUFBTSxjQUFjLENBQUM7QUFHdEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7O0FBRWhHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFTSCxNQUFNLE9BQU8sc0JBQXNCO0lBUm5DO1FBa0JFOztXQUVHO1FBRUgsWUFBTyxHQUE0QixFQUFFLENBQUM7UUFFdEM7OztXQUdHO1FBRUgsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUF5QjVCOztXQUVHO1FBRUgsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQU85QyxhQUFRLEdBQWEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBb0YzQixTQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ2hDO0lBbkZDLG1CQUFtQjtJQUVuQjs7O09BR0c7SUFDSyxPQUFP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V0FBVyxFQUFFLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOytHQTNJVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixpV0EwQkwsV0FBVyw4R0FpQlksZ0JBQWdCLGdFQzNHckUsNHFCQXVCQSwwRERtQ2EsaUJBQWlCLG9QQUFFLDBCQUEwQjs7NEZBTTdDLHNCQUFzQjtrQkFSbEMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBRSxpQkFBaUIsRUFBRSwwQkFBMEIsQ0FBQyxZQUMvQywwQkFBMEIsUUFHOUIsRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFDOzhCQVVqQyxLQUFLO3NCQURKLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQU96QixPQUFPO3NCQUROLEtBQUs7Z0JBUU4sV0FBVztzQkFEVixLQUFLO2dCQU9OLEtBQUs7c0JBREosU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBWXZELFVBQVU7c0JBRFQsS0FBSztnQkFPTixHQUFHO3NCQURGLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFPckUsV0FBVztzQkFEVixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGVsLCBzZiB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBOZ0NvbXBvbmVudE91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBbmd1bGFyRHluYW1pY091dHB1dCxcbiAgQW5ndWxhckVuZ2luZUtleXMsXG4gIEJhc2VDb21wb25lbnRQcm9wcyxcbiAgQmFzZUN1c3RvbUV2ZW50LFxuICBOZ3hSZW5kZXJpbmdFbmdpbmUsXG4gIFJlbmRlcmVkTW9kZWwsXG59IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBLZXlWYWx1ZSwgUmVuZGVyZXJDdXN0b21FdmVudCB9IGZyb20gJy4uLy4uL2VuZ2luZS90eXBlcyc7XG5pbXBvcnQgeyBSZW5kZXJhYmxlIH0gZnJvbSAnQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBmb3IgcmVuZGVyaW5nIGR5bmFtaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBpcyByZXNwb25zaWJsZSBmb3IgZHluYW1pY2FsbHkgcmVuZGVyaW5nIG1vZGVscyxcbiAqIGhhbmRsaW5nIG1vZGVsIGNoYW5nZXMsIGFuZCBtYW5hZ2luZyBldmVudCBzdWJzY3JpcHRpb25zIGZvciB0aGUgcmVuZGVyZWQgY29tcG9uZW50cy5cbiAqIEl0IHVzZXMgdGhlIE5neFJlbmRlcmluZ0VuZ2luZSB0byByZW5kZXIgdGhlIG1vZGVscyBhbmQgc3VwcG9ydHMgYm90aCBzdHJpbmcgYW5kIE1vZGVsIGlucHV0cy5cbiAqIEBjbGFzc1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtJbmplY3Rvcn0gaW5qZWN0b3IgLSBBbmd1bGFyIEluamVjdG9yIGZvciBkZXBlbmRlbmN5IGluamVjdGlvblxuICogQGV4YW1wbGVcbiAqIDxuZ3gtZGVjYWYtbW9kZWwtcmVuZGVyZXJcbiAqICAgW21vZGVsXT1cIm15TW9kZWxcIlxuICogICBbZ2xvYmFsc109XCJnbG9iYWxWYXJpYWJsZXNcIlxuICogICAobGlzdGVuRXZlbnQpPVwiaGFuZGxlRXZlbnQoJGV2ZW50KVwiPlxuICogPC9uZ3gtZGVjYWYtbW9kZWwtcmVuZGVyZXI+XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBNb2RlbFJlbmRlcmVyXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBBcHAtPj5Nb2RlbFJlbmRlcmVyOiBJbnB1dCBtb2RlbFxuICogICBNb2RlbFJlbmRlcmVyLT4+TW9kZWw6IFBhcnNlIGlmIHN0cmluZ1xuICogICBNb2RlbC0tPj5Nb2RlbFJlbmRlcmVyOiBQYXJzZWQgbW9kZWxcbiAqICAgTW9kZWxSZW5kZXJlci0+PlJlbmRlcmluZ0VuZ2luZTogUmVuZGVyIG1vZGVsXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0tPj5Nb2RlbFJlbmRlcmVyOiBSZW5kZXJlZCBvdXRwdXRcbiAqICAgTW9kZWxSZW5kZXJlci0+Pk1vZGVsUmVuZGVyZXI6IFN1YnNjcmliZSB0byBldmVudHNcbiAqICAgTW9kZWxSZW5kZXJlci0tPj5BcHA6IEVtaXQgZXZlbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbIE5nQ29tcG9uZW50T3V0bGV0LCBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudF0sXG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLW1vZGVsLXJlbmRlcmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC5zY3NzJyxcbiAgaG9zdDogeydbYXR0ci5pZF0nOiAncmVuZGVyZXJJZCd9LFxufSlcbmV4cG9ydCBjbGFzcyBNb2RlbFJlbmRlcmVyQ29tcG9uZW50PE0gZXh0ZW5kcyBNb2RlbD5cbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgUmVuZGVyZWRNb2RlbCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnB1dCBtb2RlbCB0byBiZSByZW5kZXJlZFxuICAgKiBAc3VtbWFyeSBDYW4gYmUgYSBNb2RlbCBpbnN0YW5jZSBvciBhIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kZWxcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG1vZGVsITogTSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdsb2JhbCB2YXJpYWJsZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdsb2JhbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgaWYgcmVuZGVyIGNvbnRlbnQgcHJvamVjdGlvbiBpcyBhbGxvd2VkXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHByb2plY3RhYmxlOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgaW5uZXIgY29udGVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnaW5uZXInLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgaW5uZXI/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE91dHB1dCBvZiB0aGUgcmVuZGVyZWQgbW9kZWxcbiAgICovXG4gIG91dHB1dD86IEFuZ3VsYXJEeW5hbWljT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZW5kZXJlclxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZpZXcgY29udGFpbmVyIHJlZmVyZW5jZSBmb3IgZHluYW1pYyBjb21wb25lbnQgcmVuZGVyaW5nXG4gICAqL1xuICBAVmlld0NoaWxkKCdjb21wb25lbnRPdXRlcicsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHZjciE6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBjdXN0b20gZXZlbnRzIGZyb20gdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGxpc3RlbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5zdGFuY2Ugb2YgdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YW5jZSE6IEtleVZhbHVlIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAvLyBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgdGhlIHJlbmRlcmVkIG1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgTX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWRcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaChtb2RlbDogc3RyaW5nIHwgTSkge1xuICAgIG1vZGVsID1cbiAgICAgIHR5cGVvZiBtb2RlbCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyAoTW9kZWwuYnVpbGQoe30sIG1vZGVsKSBhcyBNKVxuICAgICAgICA6IG1vZGVsO1xuICAgIHRoaXMub3V0cHV0ID0gKG1vZGVsIGFzIHVua25vd24gYXMgUmVuZGVyYWJsZSkucmVuZGVyPEFuZ3VsYXJEeW5hbWljT3V0cHV0PihcbiAgICAgIHRoaXMuZ2xvYmFscyB8fCB7fSxcbiAgICAgIHRoaXMudmNyLFxuICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgIHRoaXMuaW5uZXIsXG4gICAgICB0aGlzLnByb2plY3RhYmxlXG4gICAgKTtcbiAgICBpZiAodGhpcy5vdXRwdXQ/LmlucHV0cylcbiAgICAgIHRoaXMucmVuZGVyZXJJZCA9IHNmKFxuICAgICAgICBBbmd1bGFyRW5naW5lS2V5cy5SRU5ERVJFRF9JRCxcbiAgICAgICAgKHRoaXMub3V0cHV0LmlucHV0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ3JlbmRlcmVySWQnXSBhcyBzdHJpbmcsXG4gICAgICApO1xuICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLm91dHB1dD8uaW5zdGFuY2U7XG4gICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgb2YgYSBkaXJlY3RpdmUgY2hhbmdlXG4gICAqIEBwYXJhbSB7U2ltcGxlQ2hhbmdlc30gY2hhbmdlcyAtIE9iamVjdCBjb250YWluaW5nIGNoYW5nZXNcbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdO1xuICAgICAgdGhpcy5yZWZyZXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgZGlyZWN0aXZlLCBwaXBlLCBvciBzZXJ2aWNlIGlzIGRlc3Ryb3llZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgbmdPbkRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICAgIGF3YWl0IE5neFJlbmRlcmluZ0VuZ2luZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcz8ub3V0cHV0Py5jb21wb25lbnQ7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBjb21wb25lbnRLZXlzID0gT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21wb25lbnRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnN0YW5jZVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpXG4gICAgICAgICAgKHRoaXMuaW5zdGFuY2UgYXMgS2V5VmFsdWUpW2tleV0uc3Vic2NyaWJlKChldmVudDogUGFydGlhbDxCYXNlQ3VzdG9tRXZlbnQ+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudC5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgfSBhcyBSZW5kZXJlckN1c3RvbUV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuc3Vic2NyaWJlcyBmcm9tIGV2ZW50cyBlbWl0dGVkIGJ5IHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbXBvbmVudEtleXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmluc3RhbmNlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcilcbiAgICAgICAgICB0aGlzLmluc3RhbmNlW2tleV0udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgSlNPTiA9IEpTT047XG59XG4iLCIgIDwhLS0gS2VlcCB0byBhdm9pZCBpZCBjb25mbGljdHMgLS0+XG4gIDxkaXYgW2lkXT1cInJlbmRlcmVySWRcIj48L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI2NvbXBvbmVudE91dGVyPjwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjaW5uZXI+XG4gICAgPGRpdiAgW2lkXT1cInJlbmRlcmVySWQgfHwgbnVsbFwiPlxuICAgICAgQGZvciAoY2hpbGQgb2Ygb3V0cHV0Py5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgQGlmKGNoaWxkPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgPG5neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXIgW3BhcmVudF09XCJjaGlsZFwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICNjaGlsZENvbXBvbmVudHNcbiAgICAgICAgICAgICpuZ0NvbXBvbmVudE91dGxldD1cIlxuICAgICAgICAgICAgICBjaGlsZC5jb21wb25lbnQ7XG4gICAgICAgICAgICAgIGluamVjdG9yOiBjaGlsZC5pbmplY3RvcjtcbiAgICAgICAgICAgICAgaW5wdXRzOiBjaGlsZC5pbnB1dHM7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6Y2hpbGQuY29udGVudDtcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
3
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
4
|
+
import { IonButton, IonIcon, IonSkeletonText, IonText } from '@ionic/angular/standalone';
|
|
5
|
+
import { arrowForwardOutline, arrowBackOutline } from 'ionicons/icons';
|
|
6
|
+
import { addIcons } from 'ionicons';
|
|
7
|
+
import { OperationKeys } from '@decaf-ts/db-decorators';
|
|
8
|
+
import { Dynamic, EventConstants, NgxFormService } from '../../engine';
|
|
9
|
+
import { ComponentRendererComponent } from '../component-renderer/component-renderer.component';
|
|
10
|
+
import { ModelRendererComponent } from '../model-renderer/model-renderer.component';
|
|
11
|
+
import { timer } from 'rxjs';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@angular/forms";
|
|
14
|
+
let StepedFormComponent = class StepedFormComponent {
|
|
15
|
+
/**
|
|
16
|
+
* @description Creates an instance of StepedFormComponent.
|
|
17
|
+
* @summary Initializes a new StepedFormComponent instance and registers the required
|
|
18
|
+
* Ionic icons for navigation buttons (forward and back arrows).
|
|
19
|
+
*
|
|
20
|
+
* @memberOf StepedFormComponent
|
|
21
|
+
*/
|
|
22
|
+
constructor() {
|
|
23
|
+
/**
|
|
24
|
+
* @description Number of pages in the stepped form.
|
|
25
|
+
* @summary Represents the total number of steps/pages in the multi-step form.
|
|
26
|
+
* This value is automatically calculated based on the page properties of the children
|
|
27
|
+
* or can be explicitly set. Each page represents a logical group of form fields.
|
|
28
|
+
*
|
|
29
|
+
* @type {number}
|
|
30
|
+
* @default 1
|
|
31
|
+
* @memberOf StepedFormComponent
|
|
32
|
+
*/
|
|
33
|
+
this.pages = 1;
|
|
34
|
+
/**
|
|
35
|
+
* @description The CRUD operation type for this form.
|
|
36
|
+
* @summary Defines the type of operation being performed (CREATE, READ, UPDATE, DELETE).
|
|
37
|
+
* This affects form behavior, validation rules, and field accessibility. For example,
|
|
38
|
+
* READ operations might disable form fields, while CREATE operations enable all fields.
|
|
39
|
+
*
|
|
40
|
+
* @type {CrudOperations}
|
|
41
|
+
* @default OperationKeys.CREATE
|
|
42
|
+
* @memberOf StepedFormComponent
|
|
43
|
+
*/
|
|
44
|
+
this.operation = OperationKeys.CREATE;
|
|
45
|
+
/**
|
|
46
|
+
* @description The initial page to display when the form loads.
|
|
47
|
+
* @summary Specifies which page of the multi-step form should be shown first.
|
|
48
|
+
* This allows starting the form at any step, useful for scenarios like editing
|
|
49
|
+
* existing data where you might want to jump to a specific section.
|
|
50
|
+
*
|
|
51
|
+
* @type {number}
|
|
52
|
+
* @default 1
|
|
53
|
+
* @memberOf StepedFormComponent
|
|
54
|
+
*/
|
|
55
|
+
this.startPage = 1;
|
|
56
|
+
/**
|
|
57
|
+
* @description Array of UI model metadata for the currently active page.
|
|
58
|
+
* @summary Contains only the UI model metadata for fields that should be displayed
|
|
59
|
+
* on the currently active page. This is a filtered subset of the children array,
|
|
60
|
+
* updated whenever the user navigates between pages.
|
|
61
|
+
*
|
|
62
|
+
* @type {UIModelMetadata[] | undefined}
|
|
63
|
+
* @memberOf StepedFormComponent
|
|
64
|
+
*/
|
|
65
|
+
this.activeChildren = undefined;
|
|
66
|
+
/**
|
|
67
|
+
* @description FormGroup for the currently active page.
|
|
68
|
+
* @summary The FormGroup instance that manages form controls and validation
|
|
69
|
+
* for the current page only. This is extracted from the main formGroup
|
|
70
|
+
* when using FormArray structure.
|
|
71
|
+
*
|
|
72
|
+
* @type {FormGroup | undefined}
|
|
73
|
+
* @memberOf StepedFormComponent
|
|
74
|
+
*/
|
|
75
|
+
this.activeFormGroup = undefined;
|
|
76
|
+
/**
|
|
77
|
+
* @description The currently active page number.
|
|
78
|
+
* @summary Tracks which page of the multi-step form is currently being displayed.
|
|
79
|
+
* This property is updated as users navigate through the form steps using
|
|
80
|
+
* the next/back buttons or programmatic navigation.
|
|
81
|
+
*
|
|
82
|
+
* @type {number}
|
|
83
|
+
* @memberOf StepedFormComponent
|
|
84
|
+
*/
|
|
85
|
+
this.activePage = 1;
|
|
86
|
+
/**
|
|
87
|
+
* @description Array representing the structure of pages.
|
|
88
|
+
* @summary Contains metadata about each page, including page numbers and indices.
|
|
89
|
+
* This array is built during initialization to organize the form fields into
|
|
90
|
+
* logical pages and provide navigation structure.
|
|
91
|
+
*
|
|
92
|
+
* @type {UIModelMetadata[]}
|
|
93
|
+
* @memberOf StepedFormComponent
|
|
94
|
+
*/
|
|
95
|
+
this.pagesArray = [];
|
|
96
|
+
/**
|
|
97
|
+
* @description Event emitter for form submission.
|
|
98
|
+
* @summary Emits events when the form is submitted, typically on the last page
|
|
99
|
+
* when all validation passes. The emitted event contains the form data and
|
|
100
|
+
* event type information for parent components to handle.
|
|
101
|
+
*
|
|
102
|
+
* @type {EventEmitter<BaseCustomEvent>}
|
|
103
|
+
* @memberOf StepedFormComponent
|
|
104
|
+
*/
|
|
105
|
+
this.submitEvent = new EventEmitter();
|
|
106
|
+
addIcons({ arrowForwardOutline, arrowBackOutline });
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @description Initializes the component after Angular first displays the data-bound properties.
|
|
110
|
+
* @summary Sets up the stepped form by organizing children into pages, calculating the total
|
|
111
|
+
* number of pages, and initializing the active page. This method processes the UI model metadata
|
|
112
|
+
* to create a logical page structure and ensures proper page assignments for all form fields.
|
|
113
|
+
*
|
|
114
|
+
* @mermaid
|
|
115
|
+
* sequenceDiagram
|
|
116
|
+
* participant A as Angular Lifecycle
|
|
117
|
+
* participant S as StepedFormComponent
|
|
118
|
+
* participant F as Form Service
|
|
119
|
+
*
|
|
120
|
+
* A->>S: ngOnInit()
|
|
121
|
+
* S->>S: Set activePage = startPage
|
|
122
|
+
* S->>S: Process children into pagesArray
|
|
123
|
+
* S->>S: Calculate total pages
|
|
124
|
+
* S->>S: Assign page props to children
|
|
125
|
+
* S->>S: getCurrentFormGroup(activePage)
|
|
126
|
+
* S->>F: Extract FormGroup for active page
|
|
127
|
+
* F-->>S: Return activeFormGroup
|
|
128
|
+
*
|
|
129
|
+
* @memberOf StepedFormComponent
|
|
130
|
+
*/
|
|
131
|
+
ngOnInit() {
|
|
132
|
+
this.activePage = this.startPage;
|
|
133
|
+
this.pagesArray = this.children.reduce((acc, curr, index) => {
|
|
134
|
+
const page = curr.props?.['page'] || index + 1;
|
|
135
|
+
if (!acc[page])
|
|
136
|
+
acc[page] = [];
|
|
137
|
+
acc[page].push({ index: page });
|
|
138
|
+
return acc;
|
|
139
|
+
}, []).filter(Boolean);
|
|
140
|
+
this.pages = this.pagesArray.length;
|
|
141
|
+
this.children = [...this.children.map((c) => {
|
|
142
|
+
if (!c.props)
|
|
143
|
+
c.props = {};
|
|
144
|
+
const page = c.props['page'] || 1;
|
|
145
|
+
// prevent page overflow
|
|
146
|
+
c.props['page'] = page > this.pages ? this.pages : page;
|
|
147
|
+
return c;
|
|
148
|
+
})];
|
|
149
|
+
this.getCurrentFormGroup(this.activePage);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* @description Cleanup method called when the component is destroyed.
|
|
153
|
+
* @summary Unsubscribes from any active timer subscriptions to prevent memory leaks.
|
|
154
|
+
* This is part of Angular's component lifecycle and ensures proper resource cleanup.
|
|
155
|
+
*
|
|
156
|
+
* @memberOf StepedFormComponent
|
|
157
|
+
*/
|
|
158
|
+
ngOnDestroy() {
|
|
159
|
+
if (this.timerSubscription)
|
|
160
|
+
this.timerSubscription.unsubscribe();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* @description Handles navigation to the next page or form submission.
|
|
164
|
+
* @summary Validates the current page's form fields and either navigates to the next page
|
|
165
|
+
* or submits the entire form if on the last page. Form validation must pass before
|
|
166
|
+
* proceeding. On successful submission, emits a submit event with form data.
|
|
167
|
+
*
|
|
168
|
+
* @param {boolean} lastPage - Whether this is the last page of the form
|
|
169
|
+
* @return {void}
|
|
170
|
+
*
|
|
171
|
+
* @mermaid
|
|
172
|
+
* sequenceDiagram
|
|
173
|
+
* participant U as User
|
|
174
|
+
* participant S as StepedFormComponent
|
|
175
|
+
* participant F as Form Service
|
|
176
|
+
* participant P as Parent Component
|
|
177
|
+
*
|
|
178
|
+
* U->>S: Click Next/Submit
|
|
179
|
+
* S->>F: validateFields(activeFormGroup)
|
|
180
|
+
* F-->>S: Return validation result
|
|
181
|
+
* alt Not last page and valid
|
|
182
|
+
* S->>S: activePage++
|
|
183
|
+
* S->>S: getCurrentFormGroup(activePage)
|
|
184
|
+
* else Last page and valid
|
|
185
|
+
* S->>F: getFormData(formGroup)
|
|
186
|
+
* F-->>S: Return form data
|
|
187
|
+
* S->>P: submitEvent.emit({data, name: SUBMIT})
|
|
188
|
+
* end
|
|
189
|
+
*
|
|
190
|
+
* @memberOf StepedFormComponent
|
|
191
|
+
*/
|
|
192
|
+
handleNext(lastPage = false) {
|
|
193
|
+
const isValid = NgxFormService.validateFields(this.activeFormGroup);
|
|
194
|
+
if (!lastPage) {
|
|
195
|
+
if (isValid) {
|
|
196
|
+
this.activePage = this.activePage + 1;
|
|
197
|
+
this.getCurrentFormGroup(this.activePage);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
if (isValid) {
|
|
202
|
+
const data = Object.assign({}, ...Object.values(NgxFormService.getFormData(this.formGroup)));
|
|
203
|
+
this.submitEvent.emit({
|
|
204
|
+
data,
|
|
205
|
+
name: EventConstants.SUBMIT,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* @description Handles navigation to the previous page.
|
|
212
|
+
* @summary Moves the user back to the previous page in the stepped form.
|
|
213
|
+
* This method decrements the active page number and updates the form
|
|
214
|
+
* group and children to display the previous page's content.
|
|
215
|
+
*
|
|
216
|
+
* @return {void}
|
|
217
|
+
*
|
|
218
|
+
* @mermaid
|
|
219
|
+
* sequenceDiagram
|
|
220
|
+
* participant U as User
|
|
221
|
+
* participant S as StepedFormComponent
|
|
222
|
+
*
|
|
223
|
+
* U->>S: Click Back
|
|
224
|
+
* S->>S: activePage--
|
|
225
|
+
* S->>S: getCurrentFormGroup(activePage)
|
|
226
|
+
* Note over S: Update active form and children
|
|
227
|
+
*
|
|
228
|
+
* @memberOf StepedFormComponent
|
|
229
|
+
*/
|
|
230
|
+
handleBack() {
|
|
231
|
+
this.activePage = this.activePage - 1;
|
|
232
|
+
this.getCurrentFormGroup(this.activePage);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* @description Updates the active form group and children for the specified page.
|
|
236
|
+
* @summary Extracts the FormGroup for the given page from the FormArray and filters
|
|
237
|
+
* the children to show only fields belonging to that page. Uses a timer to ensure
|
|
238
|
+
* proper Angular change detection when updating the activeChildren.
|
|
239
|
+
*
|
|
240
|
+
* @param {number} page - The page number to activate
|
|
241
|
+
* @return {void}
|
|
242
|
+
*
|
|
243
|
+
* @private
|
|
244
|
+
* @mermaid
|
|
245
|
+
* sequenceDiagram
|
|
246
|
+
* participant S as StepedFormComponent
|
|
247
|
+
* participant F as FormArray
|
|
248
|
+
* participant T as Timer
|
|
249
|
+
*
|
|
250
|
+
* S->>F: Extract FormGroup at index (page - 1)
|
|
251
|
+
* F-->>S: Return page FormGroup
|
|
252
|
+
* S->>S: Set activeChildren = undefined
|
|
253
|
+
* S->>T: timer(10).subscribe()
|
|
254
|
+
* T-->>S: Filter children for active page
|
|
255
|
+
* S->>S: Set activeChildren
|
|
256
|
+
*
|
|
257
|
+
* @memberOf StepedFormComponent
|
|
258
|
+
*/
|
|
259
|
+
getCurrentFormGroup(page) {
|
|
260
|
+
this.activeFormGroup = this.formGroup.at(page - 1);
|
|
261
|
+
this.activeChildren = undefined;
|
|
262
|
+
this.timerSubscription = timer(10).subscribe(() => {
|
|
263
|
+
this.activeChildren = this.children.filter(c => c.props?.['page'] === page);
|
|
264
|
+
console.log(this.activeChildren);
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StepedFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
268
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: StepedFormComponent, isStandalone: true, selector: "ngx-decaf-steped-form", inputs: { pages: "pages", operation: "operation", startPage: "startPage", children: "children", formGroup: "formGroup" }, outputs: { submitEvent: "submitEvent" }, ngImport: i0, template: " <!-- @for(child of children; track trackItemFn($index, child)) {\n {{child.tag }}\n <ngx-decaf-component-renderer\n [tag]=\"child.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{props: child.props}'>\n </ngx-decaf-component-renderer>\n } -->\n <form class=\"dcf-steped-form\" novalidate>\n <div class=\"dcf-page-steps\">\n <div>\n @for(page of pagesArray; track $index;) {\n <div [class.dcf-active]=\"activePage === $index + 1\" [class.dcf-passed]=\"($index + 1) < activePage\">{{ $index + 1 }}</div>\n }\n </div>\n </div>\n @if(formGroup) {\n @for(child of activeChildren; track $index) {\n <ngx-decaf-component-renderer\n [tag]=\"child?.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [children]=\"child?.children || []\"\n [globals]=\"{props: child.props}\"\n />\n }\n } @else {\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n <br />\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n }\n\n <div class=\"dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div class=\"dcf-width-1-2@s\">\n <ion-button fill=\"clear\" (click)=\"handleBack()\" [disabled]=\"activePage <= 1\">\n <ion-icon aria-hidden=\"true\" name=\"arrow-back-outline\"></ion-icon>\n Previous\n </ion-button>\n </div>\n\n <div class=\"dcf-width-1-2@s\">\n <ion-button [fill]=\"activePage === pages ? 'solid' : 'outline'\" (click)=\"handleNext(activePage === pages ? true : false)\">\n @if(activePage === pages) {\n Submit\n } @else {\n Next\n <ion-icon aria-hidden=\"true\" name=\"arrow-forward-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n </div>\n </form>\n", styles: [".dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 639px){.dcf-buttons-container.dcf-flex div:nth-child(2){display:flex;justify-content:flex-end}}@media (max-width: 638px){.dcf-buttons-container.dcf-flex div{width:100%}.dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}.dcf-steped-form{padding:2rem 1rem}.dcf-page-steps{display:flex;justify-content:center;margin-bottom:2rem}.dcf-page-steps>div{justify-content:center;min-width:200px;max-width:200px;column-gap:.25em;display:flex}.dcf-page-steps>div>div{width:30px;text-align:center;border-bottom:solid var(--dcf-color-gray-3);box-sizing:border-box;border-width:3px;font-size:0px;font-weight:600}.dcf-page-steps>div>div.dcf-active{border-width:5px;font-size:1rem;color:var(--ion-color-gray-7);border-color:var(--ion-color-primary);line-height:1rem}.dcf-page-steps>div>div.dcf-passed{border-width:4px;font-size:.5rem;line-height:1.2rem;border-color:var(--dcf-color-gray-5);color:var(--ion-color-primary)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "children", "model", "parent"], outputs: ["listenEvent"] }] }); }
|
|
269
|
+
};
|
|
270
|
+
StepedFormComponent = __decorate([
|
|
271
|
+
Dynamic(),
|
|
272
|
+
__metadata("design:paramtypes", [])
|
|
273
|
+
], StepedFormComponent);
|
|
274
|
+
export { StepedFormComponent };
|
|
275
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StepedFormComponent, decorators: [{
|
|
276
|
+
type: Component,
|
|
277
|
+
args: [{ selector: 'ngx-decaf-steped-form', imports: [ReactiveFormsModule, IonSkeletonText, IonText, IonButton, IonIcon, ModelRendererComponent, ComponentRendererComponent], standalone: true, template: " <!-- @for(child of children; track trackItemFn($index, child)) {\n {{child.tag }}\n <ngx-decaf-component-renderer\n [tag]=\"child.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{props: child.props}'>\n </ngx-decaf-component-renderer>\n } -->\n <form class=\"dcf-steped-form\" novalidate>\n <div class=\"dcf-page-steps\">\n <div>\n @for(page of pagesArray; track $index;) {\n <div [class.dcf-active]=\"activePage === $index + 1\" [class.dcf-passed]=\"($index + 1) < activePage\">{{ $index + 1 }}</div>\n }\n </div>\n </div>\n @if(formGroup) {\n @for(child of activeChildren; track $index) {\n <ngx-decaf-component-renderer\n [tag]=\"child?.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [children]=\"child?.children || []\"\n [globals]=\"{props: child.props}\"\n />\n }\n } @else {\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n <br />\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n }\n\n <div class=\"dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div class=\"dcf-width-1-2@s\">\n <ion-button fill=\"clear\" (click)=\"handleBack()\" [disabled]=\"activePage <= 1\">\n <ion-icon aria-hidden=\"true\" name=\"arrow-back-outline\"></ion-icon>\n Previous\n </ion-button>\n </div>\n\n <div class=\"dcf-width-1-2@s\">\n <ion-button [fill]=\"activePage === pages ? 'solid' : 'outline'\" (click)=\"handleNext(activePage === pages ? true : false)\">\n @if(activePage === pages) {\n Submit\n } @else {\n Next\n <ion-icon aria-hidden=\"true\" name=\"arrow-forward-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n </div>\n </form>\n", styles: [".dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 639px){.dcf-buttons-container.dcf-flex div:nth-child(2){display:flex;justify-content:flex-end}}@media (max-width: 638px){.dcf-buttons-container.dcf-flex div{width:100%}.dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}.dcf-steped-form{padding:2rem 1rem}.dcf-page-steps{display:flex;justify-content:center;margin-bottom:2rem}.dcf-page-steps>div{justify-content:center;min-width:200px;max-width:200px;column-gap:.25em;display:flex}.dcf-page-steps>div>div{width:30px;text-align:center;border-bottom:solid var(--dcf-color-gray-3);box-sizing:border-box;border-width:3px;font-size:0px;font-weight:600}.dcf-page-steps>div>div.dcf-active{border-width:5px;font-size:1rem;color:var(--ion-color-gray-7);border-color:var(--ion-color-primary);line-height:1rem}.dcf-page-steps>div>div.dcf-passed{border-width:4px;font-size:.5rem;line-height:1.2rem;border-color:var(--dcf-color-gray-5);color:var(--ion-color-primary)}\n"] }]
|
|
278
|
+
}], ctorParameters: () => [], propDecorators: { pages: [{
|
|
279
|
+
type: Input
|
|
280
|
+
}], operation: [{
|
|
281
|
+
type: Input
|
|
282
|
+
}], startPage: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}], children: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}], formGroup: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], submitEvent: [{
|
|
289
|
+
type: Output
|
|
290
|
+
}] } });
|
|
291
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcGVkLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3N0ZXBlZC1mb3JtL3N0ZXBlZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zdGVwZWQtZm9ybS9zdGVwZWQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxZQUFZLEVBQUcsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUF3QixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE9BQU8sRUFBa0IsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUFtQixPQUFPLEVBQUUsY0FBYyxFQUFZLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNoRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBV3BDLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW1CO0lBc0k5Qjs7Ozs7O09BTUc7SUFDSDtRQTNJQTs7Ozs7Ozs7O1dBU0c7UUFFSCxVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBRWxCOzs7Ozs7Ozs7V0FTRztRQUVI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bkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQXBUVSxtQkFBbUI7bUdBQW5CLG1CQUFtQixvUENyQmhDLG9yRUFxREEscWlDRG5DWSxtQkFBbUIsb1NBQUUsZUFBZSxvRkFBRSxPQUFPLGdGQUFFLFNBQVMsb1BBQUUsT0FBTywySkFBMEIsMEJBQTBCOztBQUdwSCxtQkFBbUI7SUFSL0IsT0FBTyxFQUFFOztHQVFHLG1CQUFtQixDQXNUL0I7OzRGQXRUWSxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0UsdUJBQXVCLFdBR3hCLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDBCQUEwQixDQUFDLGNBQ3BILElBQUk7d0RBZWhCLEtBQUs7c0JBREosS0FBSztnQkFjTixTQUFTO3NCQURSLEtBQUs7Z0JBY04sU0FBUztzQkFEUixLQUFLO2dCQWNOLFFBQVE7c0JBRFAsS0FBSztnQkFhTixTQUFTO3NCQURSLEtBQUs7Z0JBcUVOLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciAgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uLCBJb25Ta2VsZXRvblRleHQsIElvblRleHQgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFycm93Rm9yd2FyZE91dGxpbmUsIGFycm93QmFja091dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IFVJTW9kZWxNZXRhZGF0YX0gZnJvbSAnQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBCYXNlQ3VzdG9tRXZlbnQsIER5bmFtaWMsIEV2ZW50Q29uc3RhbnRzLCBLZXlWYWx1ZSwgTmd4Rm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNb2RlbFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vbW9kZWwtcmVuZGVyZXIvbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcblxuXG5ARHluYW1pYygpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtc3RlcGVkLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcGVkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGVwZWQtZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZSwgSW9uU2tlbGV0b25UZXh0LCBJb25UZXh0LCBJb25CdXR0b24sIElvbkljb24sIE1vZGVsUmVuZGVyZXJDb21wb25lbnQsIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU3RlcGVkRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE51bWJlciBvZiBwYWdlcyBpbiB0aGUgc3RlcHBlZCBmb3JtLlxuICAgKiBAc3VtbWFyeSBSZXByZXNlbnRzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3RlcHMvcGFnZXMgaW4gdGhlIG11bHRpLXN0ZXAgZm9ybS5cbiAgICogVGhpcyB2YWx1ZSBpcyBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHBhZ2UgcHJvcGVydGllcyBvZiB0aGUgY2hpbGRyZW5cbiAgICogb3IgY2FuIGJlIGV4cGxpY2l0bHkgc2V0LiBFYWNoIHBhZ2UgcmVwcmVzZW50cyBhIGxvZ2ljYWwgZ3JvdXAgb2YgZm9ybSBmaWVsZHMuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQG1lbWJlck9mIFN0ZXBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHBhZ2VzOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIENSVUQgb3BlcmF0aW9uIHR5cGUgZm9yIHRoaXMgZm9ybS5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChDUkVBVEUsIFJFQUQsIFVQREFURSwgREVMRVRFKS5cbiAgICogVGhpcyBhZmZlY3RzIGZvcm0gYmVoYXZpb3IsIHZhbGlkYXRpb24gcnVsZXMsIGFuZCBmaWVsZCBhY2Nlc3NpYmlsaXR5LiBGb3IgZXhhbXBsZSxcbiAgICogUkVBRCBvcGVyYXRpb25zIG1pZ2h0IGRpc2FibGUgZm9ybSBmaWVsZHMsIHdoaWxlIENSRUFURSBvcGVyYXRpb25zIGVuYWJsZSBhbGwgZmllbGRzLlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZE9wZXJhdGlvbnN9XG4gICAqIEBkZWZhdWx0IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAqIEBtZW1iZXJPZiBTdGVwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcGVyYXRpb246IENydWRPcGVyYXRpb25zID0gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaW5pdGlhbCBwYWdlIHRvIGRpc3BsYXkgd2hlbiB0aGUgZm9ybSBsb2Fkcy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIHBhZ2Ugb2YgdGhlIG11bHRpLXN0ZXAgZm9ybSBzaG91bGQgYmUgc2hvd24gZmlyc3QuXG4gICAqIFRoaXMgYWxsb3dzIHN0YXJ0aW5nIHRoZSBmb3JtIGF0IGFueSBzdGVwLCB1c2VmdWwgZm9yIHNjZW5hcmlvcyBsaWtlIGVkaXRpbmdcbiAgICogZXhpc3RpbmcgZGF0YSB3aGVyZSB5b3UgbWlnaHQgd2FudCB0byBqdW1wIHRvIGEgc3BlY2lmaWMgc2VjdGlvbi5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgU3RlcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc3RhcnRQYWdlOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgVUkgbW9kZWwgbWV0YWRhdGEgZm9yIGFsbCBmb3JtIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgdGhlIGNvbXBsZXRlIGNvbGxlY3Rpb24gb2YgVUkgbW9kZWwgbWV0YWRhdGEgdGhhdCBkZWZpbmVzXG4gICAqIHRoZSBzdHJ1Y3R1cmUsIHZhbGlkYXRpb24sIGFuZCBwcmVzZW50YXRpb24gb2YgZm9ybSBmaWVsZHMgYWNyb3NzIGFsbCBwYWdlcy5cbiAgICogRWFjaCBtZXRhZGF0YSBvYmplY3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZmllbGQgdHlwZSwgdmFsaWRhdGlvbiBydWxlcyxcbiAgICogcGFnZSBhc3NpZ25tZW50LCBhbmQgZGlzcGxheSBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAdHlwZSB7VUlNb2RlbE1ldGFkYXRhW119XG4gICAqIEBtZW1iZXJPZiBTdGVwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjaGlsZHJlbiE6IFVJTW9kZWxNZXRhZGF0YVtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciByZWFjdGl2ZSBGb3JtR3JvdXAgb3IgRm9ybUFycmF5IGZvciBmb3JtIHN0YXRlIG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IFRoZSBmb3JtIGluc3RhbmNlIHRoYXQgbWFuYWdlcyBhbGwgZm9ybSBjb250cm9scywgdmFsaWRhdGlvbiwgYW5kIGZvcm0gc3RhdGUuXG4gICAqIFdoZW4gdXNpbmcgRm9ybUFycmF5LCBlYWNoIGFycmF5IGVsZW1lbnQgcmVwcmVzZW50cyBhIHBhZ2UncyBGb3JtR3JvdXAuIFdoZW4gdXNpbmdcbiAgICogRm9ybUdyb3VwLCBpdCBjb250YWlucyBhbGwgZm9ybSBjb250cm9scyBmb3IgdGhlIGVudGlyZSBzdGVwcGVkIGZvcm0uXG4gICAqXG4gICAqIEB0eXBlIHtGb3JtR3JvdXAgfCBGb3JtQXJyYXkgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBTdGVwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBmb3JtR3JvdXAhOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBVSSBtb2RlbCBtZXRhZGF0YSBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZS5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgb25seSB0aGUgVUkgbW9kZWwgbWV0YWRhdGEgZm9yIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAgICogb24gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZS4gVGhpcyBpcyBhIGZpbHRlcmVkIHN1YnNldCBvZiB0aGUgY2hpbGRyZW4gYXJyYXksXG4gICAqIHVwZGF0ZWQgd2hlbmV2ZXIgdGhlIHVzZXIgbmF2aWdhdGVzIGJldHdlZW4gcGFnZXMuXG4gICAqXG4gICAqIEB0eXBlIHtVSU1vZGVsTWV0YWRhdGFbXSB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIFN0ZXBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIGFjdGl2ZUNoaWxkcmVuOiBVSU1vZGVsTWV0YWRhdGFbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm1Hcm91cCBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZS5cbiAgICogQHN1bW1hcnkgVGhlIEZvcm1Hcm91cCBpbnN0YW5jZSB0aGF0IG1hbmFnZXMgZm9ybSBjb250cm9scyBhbmQgdmFsaWRhdGlvblxuICAgKiBmb3IgdGhlIGN1cnJlbnQgcGFnZSBvbmx5LiBUaGlzIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBtYWluIGZvcm1Hcm91cFxuICAgKiB3aGVuIHVzaW5nIEZvcm1BcnJheSBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEB0eXBlIHtGb3JtR3JvdXAgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBTdGVwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBhY3RpdmVGb3JtR3JvdXA6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50bHkgYWN0aXZlIHBhZ2UgbnVtYmVyLlxuICAgKiBAc3VtbWFyeSBUcmFja3Mgd2hpY2ggcGFnZSBvZiB0aGUgbXVsdGktc3RlcCBmb3JtIGlzIGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXBkYXRlZCBhcyB1c2VycyBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBmb3JtIHN0ZXBzIHVzaW5nXG4gICAqIHRoZSBuZXh0L2JhY2sgYnV0dG9ucyBvciBwcm9ncmFtbWF0aWMgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQG1lbWJlck9mIFN0ZXBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIGFjdGl2ZVBhZ2U6IG51bWJlciA9IDE7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSBvZiBwYWdlcy5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgbWV0YWRhdGEgYWJvdXQgZWFjaCBwYWdlLCBpbmNsdWRpbmcgcGFnZSBudW1iZXJzIGFuZCBpbmRpY2VzLlxuICAgKiBUaGlzIGFycmF5IGlzIGJ1aWx0IGR1cmluZyBpbml0aWFsaXphdGlvbiB0byBvcmdhbml6ZSB0aGUgZm9ybSBmaWVsZHMgaW50b1xuICAgKiBsb2dpY2FsIHBhZ2VzIGFuZCBwcm92aWRlIG5hdmlnYXRpb24gc3RydWN0dXJlLlxuICAgKlxuICAgKiBAdHlwZSB7VUlNb2RlbE1ldGFkYXRhW119XG4gICAqIEBtZW1iZXJPZiBTdGVwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBwYWdlc0FycmF5OiBVSU1vZGVsTWV0YWRhdGFbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3Vic2NyaXB0aW9uIGZvciB0aW1lci1iYXNlZCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBNYW5hZ2VzIHRoZSB0aW1lciBzdWJzY3JpcHRpb24gdXNlZCBmb3IgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnNcbiAgICogbGlrZSB1cGRhdGluZyBhY3RpdmUgY2hpbGRyZW4gYWZ0ZXIgcGFnZSB0cmFuc2l0aW9ucy4gVGhpcyBzdWJzY3JpcHRpb25cbiAgICogaXMgY2xlYW5lZCB1cCBpbiBuZ09uRGVzdHJveSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1N1YnNjcmlwdGlvbn1cbiAgICogQG1lbWJlck9mIFN0ZXBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdGltZXJTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBmb3JtIHN1Ym1pc3Npb24uXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGV2ZW50cyB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZCwgdHlwaWNhbGx5IG9uIHRoZSBsYXN0IHBhZ2VcbiAgICogd2hlbiBhbGwgdmFsaWRhdGlvbiBwYXNzZXMuIFRoZSBlbWl0dGVkIGV2ZW50IGNvbnRhaW5zIHRoZSBmb3JtIGRhdGEgYW5kXG4gICAqIGV2ZW50IHR5cGUgaW5mb3JtYXRpb24gZm9yIHBhcmVudCBjb21wb25lbnRzIHRvIGhhbmRsZS5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxCYXNlQ3VzdG9tRXZlbnQ+fVxuICAgKiBAbWVtYmVyT2YgU3RlcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHN1Ym1pdEV2ZW50OiBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTdGVwZWRGb3JtQ29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBTdGVwZWRGb3JtQ29tcG9uZW50IGluc3RhbmNlIGFuZCByZWdpc3RlcnMgdGhlIHJlcXVpcmVkXG4gICAqIElvbmljIGljb25zIGZvciBuYXZpZ2F0aW9uIGJ1dHRvbnMgKGZvcndhcmQgYW5kIGJhY2sgYXJyb3dzKS5cbiAgICpcbiAgICogQG1lbWJlck9mIFN0ZXBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGFkZEljb25zKHthcnJvd0ZvcndhcmRPdXRsaW5lLCBhcnJvd0JhY2tPdXRsaW5lfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBmaXJzdCBkaXNwbGF5cyB0aGUgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBzdGVwcGVkIGZvcm0gYnkgb3JnYW5pemluZyBjaGlsZHJlbiBpbnRvIHBhZ2VzLCBjYWxjdWxhdGluZyB0aGUgdG90YWxcbiAgICogbnVtYmVyIG9mIHBhZ2VzLCBhbmQgaW5pdGlhbGl6aW5nIHRoZSBhY3RpdmUgcGFnZS4gVGhpcyBtZXRob2QgcHJvY2Vzc2VzIHRoZSBVSSBtb2RlbCBtZXRhZGF0YVxuICAgKiB0byBjcmVhdGUgYSBsb2dpY2FsIHBhZ2Ugc3RydWN0dXJlIGFuZCBlbnN1cmVzIHByb3BlciBwYWdlIGFzc2lnbm1lbnRzIGZvciBhbGwgZm9ybSBmaWVsZHMuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIFN0ZXBlZEZvcm1Db21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBGIGFzIEZvcm0gU2VydmljZVxuICAgKlxuICAgKiAgIEEtPj5TOiBuZ09uSW5pdCgpXG4gICAqICAgUy0+PlM6IFNldCBhY3RpdmVQYWdlID0gc3RhcnRQYWdlXG4gICAqICAgUy0+PlM6IFByb2Nlc3MgY2hpbGRyZW4gaW50byBwYWdlc0FycmF5XG4gICAqICAgUy0+PlM6IENhbGN1bGF0ZSB0b3RhbCBwYWdlc1xuICAgKiAgIFMtPj5TOiBBc3NpZ24gcGFnZSBwcm9wcyB0byBjaGlsZHJlblxuICAgKiAgIFMtPj5TOiBnZXRDdXJyZW50Rm9ybUdyb3VwKGFjdGl2ZVBhZ2UpXG4gICAqICAgUy0+PkY6IEV4dHJhY3QgRm9ybUdyb3VwIGZvciBhY3RpdmUgcGFnZVxuICAgKiAgIEYtLT4+UzogUmV0dXJuIGFjdGl2ZUZvcm1Hcm91cFxuICAgKlxuICAgKiBAbWVtYmVyT2YgU3RlcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCAge1xuICAgIHRoaXMuYWN0aXZlUGFnZSA9IHRoaXMuc3RhcnRQYWdlO1xuXG4gICAgdGhpcy5wYWdlc0FycmF5ID0gKHRoaXMuY2hpbGRyZW4ucmVkdWNlKChhY2MsIGN1cnIsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYWdlID0gY3Vyci5wcm9wcz8uWydwYWdlJ10gfHwgaW5kZXggKyAxO1xuICAgICAgaWYoIWFjY1twYWdlXSlcbiAgICAgICAgYWNjW3BhZ2VdID0gW107XG4gICAgICBhY2NbcGFnZV0ucHVzaCh7aW5kZXg6IHBhZ2V9KTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10gYXMgS2V5VmFsdWUpIGFzIFtdKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICB0aGlzLnBhZ2VzID0gdGhpcy5wYWdlc0FycmF5Lmxlbmd0aDtcbiAgICB0aGlzLmNoaWxkcmVuID0gWy4uLiB0aGlzLmNoaWxkcmVuLm1hcCgoYykgPT4ge1xuICAgICAgaWYoIWMucHJvcHMpXG4gICAgICAgIGMucHJvcHMgPSB7fTtcbiAgICAgIGNvbnN0IHBhZ2UgPSBjLnByb3BzWydwYWdlJ10gfHwgMTtcbiAgICAgIC8vIHByZXZlbnQgcGFnZSBvdmVyZmxvd1xuICAgICAgYy5wcm9wc1sncGFnZSddID0gcGFnZSA+IHRoaXMucGFnZXMgPyB0aGlzLnBhZ2VzIDogcGFnZTtcbiAgICAgIHJldHVybiBjO1xuICAgIH0pXTtcbiAgICB0aGlzLmdldEN1cnJlbnRGb3JtR3JvdXAodGhpcy5hY3RpdmVQYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYW51cCBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXG4gICAqIEBzdW1tYXJ5IFVuc3Vic2NyaWJlcyBmcm9tIGFueSBhY3RpdmUgdGltZXIgc3Vic2NyaXB0aW9ucyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICogVGhpcyBpcyBwYXJ0IG9mIEFuZ3VsYXIncyBjb21wb25lbnQgbGlmZWN5Y2xlIGFuZCBlbnN1cmVzIHByb3BlciByZXNvdXJjZSBjbGVhbnVwLlxuICAgKlxuICAgKiBAbWVtYmVyT2YgU3RlcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYodGhpcy50aW1lclN1YnNjcmlwdGlvbilcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBuYXZpZ2F0aW9uIHRvIHRoZSBuZXh0IHBhZ2Ugb3IgZm9ybSBzdWJtaXNzaW9uLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIGN1cnJlbnQgcGFnZSdzIGZvcm0gZmllbGRzIGFuZCBlaXRoZXIgbmF2aWdhdGVzIHRvIHRoZSBuZXh0IHBhZ2VcbiAgICogb3Igc3VibWl0cyB0aGUgZW50aXJlIGZvcm0gaWYgb24gdGhlIGxhc3QgcGFnZS4gRm9ybSB2YWxpZGF0aW9uIG11c3QgcGFzcyBiZWZvcmVcbiAgICogcHJvY2VlZGluZy4gT24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uLCBlbWl0cyBhIHN1Ym1pdCBldmVudCB3aXRoIGZvcm0gZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBsYXN0UGFnZSAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBwYWdlIG9mIHRoZSBmb3JtXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgU3RlcGVkRm9ybUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgRm9ybSBTZXJ2aWNlXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBQYXJlbnQgQ29tcG9uZW50XG4gICAqXG4gICAqICAgVS0+PlM6IENsaWNrIE5leHQvU3VibWl0XG4gICAqICAgUy0+PkY6IHZhbGlkYXRlRmllbGRzKGFjdGl2ZUZvcm1Hcm91cClcbiAgICogICBGLS0+PlM6IFJldHVybiB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKiAgIGFsdCBOb3QgbGFzdCBwYWdlIGFuZCB2YWxpZFxuICAgKiAgICAgUy0+PlM6IGFjdGl2ZVBhZ2UrK1xuICAgKiAgICAgUy0+PlM6IGdldEN1cnJlbnRGb3JtR3JvdXAoYWN0aXZlUGFnZSlcbiAgICogICBlbHNlIExhc3QgcGFnZSBhbmQgdmFsaWRcbiAgICogICAgIFMtPj5GOiBnZXRGb3JtRGF0YShmb3JtR3JvdXApXG4gICAqICAgICBGLS0+PlM6IFJldHVybiBmb3JtIGRhdGFcbiAgICogICAgIFMtPj5QOiBzdWJtaXRFdmVudC5lbWl0KHtkYXRhLCBuYW1lOiBTVUJNSVR9KVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAbWVtYmVyT2YgU3RlcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlTmV4dChsYXN0UGFnZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgaXNWYWxpZCA9IE5neEZvcm1TZXJ2aWNlLnZhbGlkYXRlRmllbGRzKHRoaXMuYWN0aXZlRm9ybUdyb3VwIGFzIEZvcm1Hcm91cCk7XG4gICAgaWYgKCFsYXN0UGFnZSkge1xuICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYWdlID0gdGhpcy5hY3RpdmVQYWdlICsgMTtcbiAgICAgICAgdGhpcy5nZXRDdXJyZW50Rm9ybUdyb3VwKHRoaXMuYWN0aXZlUGFnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5PYmplY3QudmFsdWVzKE5neEZvcm1TZXJ2aWNlLmdldEZvcm1EYXRhKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCkpKTtcbiAgICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdCh7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIG5hbWU6IEV2ZW50Q29uc3RhbnRzLlNVQk1JVCxcbiAgICAgIH0pO1xuICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG5hdmlnYXRpb24gdG8gdGhlIHByZXZpb3VzIHBhZ2UuXG4gICAqIEBzdW1tYXJ5IE1vdmVzIHRoZSB1c2VyIGJhY2sgdG8gdGhlIHByZXZpb3VzIHBhZ2UgaW4gdGhlIHN0ZXBwZWQgZm9ybS5cbiAgICogVGhpcyBtZXRob2QgZGVjcmVtZW50cyB0aGUgYWN0aXZlIHBhZ2UgbnVtYmVyIGFuZCB1cGRhdGVzIHRoZSBmb3JtXG4gICAqIGdyb3VwIGFuZCBjaGlsZHJlbiB0byBkaXNwbGF5IHRoZSBwcmV2aW91cyBwYWdlJ3MgY29udGVudC5cbiAgICpcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBTdGVwZWRGb3JtQ29tcG9uZW50XG4gICAqXG4gICAqICAgVS0+PlM6IENsaWNrIEJhY2tcbiAgICogICBTLT4+UzogYWN0aXZlUGFnZS0tXG4gICAqICAgUy0+PlM6IGdldEN1cnJlbnRGb3JtR3JvdXAoYWN0aXZlUGFnZSlcbiAgICogICBOb3RlIG92ZXIgUzogVXBkYXRlIGFjdGl2ZSBmb3JtIGFuZCBjaGlsZHJlblxuICAgKlxuICAgKiBAbWVtYmVyT2YgU3RlcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVBhZ2UgPSB0aGlzLmFjdGl2ZVBhZ2UgLSAxO1xuICAgIHRoaXMuZ2V0Q3VycmVudEZvcm1Hcm91cCh0aGlzLmFjdGl2ZVBhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHRoZSBhY3RpdmUgZm9ybSBncm91cCBhbmQgY2hpbGRyZW4gZm9yIHRoZSBzcGVjaWZpZWQgcGFnZS5cbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgdGhlIEZvcm1Hcm91cCBmb3IgdGhlIGdpdmVuIHBhZ2UgZnJvbSB0aGUgRm9ybUFycmF5IGFuZCBmaWx0ZXJzXG4gICAqIHRoZSBjaGlsZHJlbiB0byBzaG93IG9ubHkgZmllbGRzIGJlbG9uZ2luZyB0byB0aGF0IHBhZ2UuIFVzZXMgYSB0aW1lciB0byBlbnN1cmVcbiAgICogcHJvcGVyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiB3aGVuIHVwZGF0aW5nIHRoZSBhY3RpdmVDaGlsZHJlbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgLSBUaGUgcGFnZSBudW1iZXIgdG8gYWN0aXZhdGVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBTdGVwZWRGb3JtQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgRiBhcyBGb3JtQXJyYXlcbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIFRpbWVyXG4gICAqXG4gICAqICAgUy0+PkY6IEV4dHJhY3QgRm9ybUdyb3VwIGF0IGluZGV4IChwYWdlIC0gMSlcbiAgICogICBGLS0+PlM6IFJldHVybiBwYWdlIEZvcm1Hcm91cFxuICAgKiAgIFMtPj5TOiBTZXQgYWN0aXZlQ2hpbGRyZW4gPSB1bmRlZmluZWRcbiAgICogICBTLT4+VDogdGltZXIoMTApLnN1YnNjcmliZSgpXG4gICAqICAgVC0tPj5TOiBGaWx0ZXIgY2hpbGRyZW4gZm9yIGFjdGl2ZSBwYWdlXG4gICAqICAgUy0+PlM6IFNldCBhY3RpdmVDaGlsZHJlblxuICAgKlxuICAgKiBAbWVtYmVyT2YgU3RlcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50Rm9ybUdyb3VwKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlRm9ybUdyb3VwID0gKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1BcnJheSkuYXQocGFnZSAtIDEpIGFzIEZvcm1Hcm91cDtcbiAgICB0aGlzLmFjdGl2ZUNoaWxkcmVuID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSB0aW1lcigxMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuYWN0aXZlQ2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLmZpbHRlcihjID0+IGMucHJvcHM/LlsncGFnZSddID09PSBwYWdlKTtcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuYWN0aXZlQ2hpbGRyZW4pO1xuICAgIH0pO1xuICB9XG5cbn1cbiIsIiA8IS0tIEBmb3IoY2hpbGQgb2YgY2hpbGRyZW47IHRyYWNrIHRyYWNrSXRlbUZuKCRpbmRleCwgY2hpbGQpKSB7XG4gICAge3tjaGlsZC50YWcgfX1cbiAgICA8bmd4LWRlY2FmLWNvbXBvbmVudC1yZW5kZXJlclxuICAgICAgW3RhZ109XCJjaGlsZC50YWdcIlxuICAgICAgKGxpc3RlbkV2ZW50KT1cImhhbmRsZUV2ZW50KCRldmVudClcIlxuICAgICAgW2dsb2JhbHNdPSd7cHJvcHM6IGNoaWxkLnByb3BzfSc+XG4gICAgICA8L25neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXI+XG4gICAgfSAtLT5cbiAgICA8Zm9ybSBjbGFzcz1cImRjZi1zdGVwZWQtZm9ybVwiIG5vdmFsaWRhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGNmLXBhZ2Utc3RlcHNcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgQGZvcihwYWdlIG9mIHBhZ2VzQXJyYXk7IHRyYWNrICRpbmRleDspIHtcbiAgICAgICAgICAgIDxkaXYgW2NsYXNzLmRjZi1hY3RpdmVdPVwiYWN0aXZlUGFnZSA9PT0gJGluZGV4ICsgMVwiIFtjbGFzcy5kY2YtcGFzc2VkXT1cIigkaW5kZXggKyAxKSA8IGFjdGl2ZVBhZ2VcIj57eyAkaW5kZXggKyAxIH19PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmKGZvcm1Hcm91cCkge1xuICAgICAgICBAZm9yKGNoaWxkIG9mIGFjdGl2ZUNoaWxkcmVuOyAgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgPG5neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXJcbiAgICAgICAgICAgIFt0YWddPVwiY2hpbGQ/LnRhZ1wiXG4gICAgICAgICAgICAobGlzdGVuRXZlbnQpPVwiaGFuZGxlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbY2hpbGRyZW5dPVwiY2hpbGQ/LmNoaWxkcmVuIHx8IFtdXCJcbiAgICAgICAgICAgIFtnbG9iYWxzXT1cIntwcm9wczogY2hpbGQucHJvcHN9XCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiZGF0ZVwiIHN0eWxlPVwid2lkdGg6IDIwJTtcIj48aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PjwvaW9uLXRleHQ+XG4gICAgICAgIDxiciAvPlxuICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJkYXRlXCIgc3R5bGU9XCJ3aWR0aDogMjAlO1wiPjxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+PC9pb24tdGV4dD5cbiAgICAgIH1cblxuICAgICAgPGRpdiBjbGFzcz1cImRjZi1idXR0b25zLWNvbnRhaW5lciBkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2YtZmxleCBkY2YtZmxleC1sZWZ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytd2lkdGgtMS0yQHNcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiAoY2xpY2spPVwiaGFuZGxlQmFjaygpXCIgW2Rpc2FibGVkXT1cImFjdGl2ZVBhZ2UgPD0gMVwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIG5hbWU9XCJhcnJvdy1iYWNrLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgUHJldmlvdXNcbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytd2lkdGgtMS0yQHNcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBbZmlsbF09XCJhY3RpdmVQYWdlID09PSBwYWdlcyA/ICdzb2xpZCcgOiAnb3V0bGluZSdcIiAgKGNsaWNrKT1cImhhbmRsZU5leHQoYWN0aXZlUGFnZSA9PT0gcGFnZXMgPyB0cnVlIDogZmFsc2UpXCI+XG4gICAgICAgICAgICBAaWYoYWN0aXZlUGFnZSA9PT0gcGFnZXMpIHtcbiAgICAgICAgICAgICAgU3VibWl0XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgTmV4dFxuICAgICAgICAgICAgICA8aW9uLWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCIgbmFtZT1cImFycm93LWZvcndhcmQtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiJdfQ==
|