@decaf-ts/for-angular 0.0.23 → 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.
Files changed (35) hide show
  1. package/components/component-renderer/component-renderer.component.d.ts +3 -2
  2. package/components/crud-field/crud-field.component.d.ts +4 -2
  3. package/components/fieldset/fieldset.component.d.ts +10 -1
  4. package/components/for-angular-components.module.d.ts +3 -2
  5. package/components/index.d.ts +1 -0
  6. package/components/layout/layout.component.d.ts +1 -24
  7. package/components/model-renderer/model-renderer.component.d.ts +6 -1
  8. package/components/steped-form/steped-form.component.d.ts +243 -0
  9. package/engine/NgxBaseComponent.d.ts +2 -2
  10. package/engine/NgxCrudFormField.d.ts +1 -0
  11. package/engine/NgxFormService.d.ts +381 -48
  12. package/engine/NgxRenderingEngine.d.ts +4 -2
  13. package/engine/interfaces.d.ts +1 -1
  14. package/engine/types.d.ts +4 -3
  15. package/esm2022/components/component-renderer/component-renderer.component.mjs +10 -4
  16. package/esm2022/components/crud-field/crud-field.component.mjs +14 -3
  17. package/esm2022/components/crud-form/crud-form.component.mjs +3 -3
  18. package/esm2022/components/empty-state/empty-state.component.mjs +2 -2
  19. package/esm2022/components/fieldset/fieldset.component.mjs +5 -3
  20. package/esm2022/components/for-angular-components.module.mjs +10 -5
  21. package/esm2022/components/index.mjs +2 -1
  22. package/esm2022/components/layout/layout.component.mjs +4 -29
  23. package/esm2022/components/list/list.component.mjs +3 -3
  24. package/esm2022/components/model-renderer/model-renderer.component.mjs +10 -3
  25. package/esm2022/components/steped-form/steped-form.component.mjs +291 -0
  26. package/esm2022/engine/NgxBaseComponent.mjs +10 -4
  27. package/esm2022/engine/NgxCrudFormField.mjs +19 -17
  28. package/esm2022/engine/NgxFormService.mjs +438 -57
  29. package/esm2022/engine/NgxRenderingEngine.mjs +21 -10
  30. package/esm2022/engine/ValidatorFactory.mjs +4 -4
  31. package/esm2022/engine/interfaces.mjs +1 -1
  32. package/esm2022/engine/types.mjs +1 -1
  33. package/fesm2022/decaf-ts-for-angular.mjs +818 -136
  34. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  35. package/package.json +1 -1
@@ -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==