fx-form-builder-wrapper 0.0.11 → 0.0.13

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 (59) hide show
  1. package/esm2022/fx-form-builder-wrapper.mjs +5 -0
  2. package/esm2022/lib/components/dynamic-table/dynamic-table.component.mjs +184 -0
  3. package/esm2022/lib/components/fx-form-component/fx-form-component.component.mjs +85 -0
  4. package/esm2022/lib/components/toggle/toggle.component.mjs +33 -0
  5. package/esm2022/lib/components/toggle-button/toggle-button.component.mjs +38 -0
  6. package/esm2022/lib/components/uploader/uploader.component.mjs +58 -0
  7. package/esm2022/lib/custom-controls/dispatch-to-clinic/dispatch-to-clinic.component.mjs +42 -0
  8. package/esm2022/lib/fx-builder-wrapper.component.mjs +76 -0
  9. package/esm2022/lib/fx-builder-wrapper.service.mjs +40 -0
  10. package/esm2022/lib/panel/configuration-panel/configuration-panel.component.mjs +89 -0
  11. package/esm2022/lib/panel/settings-panel/settings-panel.component.mjs +24 -0
  12. package/esm2022/public-api.mjs +7 -0
  13. package/fesm2022/fx-form-builder-wrapper.mjs +615 -0
  14. package/fesm2022/fx-form-builder-wrapper.mjs.map +1 -0
  15. package/index.d.ts +5 -0
  16. package/lib/components/dynamic-table/dynamic-table.component.d.ts +51 -0
  17. package/lib/components/fx-form-component/fx-form-component.component.d.ts +18 -0
  18. package/lib/components/toggle/toggle.component.d.ts +13 -0
  19. package/lib/components/toggle-button/toggle-button.component.d.ts +15 -0
  20. package/lib/components/uploader/uploader.component.d.ts +16 -0
  21. package/lib/custom-controls/dispatch-to-clinic/dispatch-to-clinic.component.d.ts +17 -0
  22. package/lib/fx-builder-wrapper.component.d.ts +18 -0
  23. package/lib/fx-builder-wrapper.service.d.ts +13 -0
  24. package/lib/panel/configuration-panel/configuration-panel.component.d.ts +25 -0
  25. package/lib/panel/settings-panel/settings-panel.component.d.ts +10 -0
  26. package/package.json +18 -5
  27. package/public-api.d.ts +3 -0
  28. package/ng-package.json +0 -7
  29. package/src/lib/components/button/button.component.css +0 -0
  30. package/src/lib/components/button/button.component.html +0 -1
  31. package/src/lib/components/button/button.component.ts +0 -24
  32. package/src/lib/components/dynamic-table/dynamic-table.component.css +0 -0
  33. package/src/lib/components/dynamic-table/dynamic-table.component.html +0 -69
  34. package/src/lib/components/dynamic-table/dynamic-table.component.ts +0 -201
  35. package/src/lib/components/fx-form-component/fx-form-component.component.ts +0 -64
  36. package/src/lib/components/toggle/toggle.component.css +0 -51
  37. package/src/lib/components/toggle/toggle.component.html +0 -12
  38. package/src/lib/components/toggle/toggle.component.ts +0 -33
  39. package/src/lib/components/toggle-button/toggle-button.component.css +0 -22
  40. package/src/lib/components/toggle-button/toggle-button.component.html +0 -10
  41. package/src/lib/components/toggle-button/toggle-button.component.ts +0 -40
  42. package/src/lib/components/uploader/uploader.component.css +0 -49
  43. package/src/lib/components/uploader/uploader.component.html +0 -23
  44. package/src/lib/components/uploader/uploader.component.ts +0 -59
  45. package/src/lib/custom-controls/dispatch-to-clinic/dispatch-to-clinic.component.html +0 -78
  46. package/src/lib/custom-controls/dispatch-to-clinic/dispatch-to-clinic.component.ts +0 -44
  47. package/src/lib/fx-builder-wrapper.component.ts +0 -64
  48. package/src/lib/fx-builder-wrapper.service.ts +0 -34
  49. package/src/lib/panel/configuration-panel/configuration-panel.component.css +0 -65
  50. package/src/lib/panel/configuration-panel/configuration-panel.component.html +0 -96
  51. package/src/lib/panel/configuration-panel/configuration-panel.component.ts +0 -90
  52. package/src/lib/panel/settings-panel/settings-panel.component.css +0 -30
  53. package/src/lib/panel/settings-panel/settings-panel.component.html +0 -28
  54. package/src/lib/panel/settings-panel/settings-panel.component.ts +0 -23
  55. package/src/public-api.ts +0 -7
  56. package/src/styles/styles.css +0 -22
  57. package/tsconfig.lib.json +0 -15
  58. package/tsconfig.lib.prod.json +0 -11
  59. package/tsconfig.spec.json +0 -15
@@ -0,0 +1,42 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, inject } from '@angular/core';
3
+ import { ReactiveFormsModule, Validators, FormBuilder, FormsModule } from '@angular/forms';
4
+ import { FxBaseComponent, FxComponent, FxStringSetting, FxValidatorService } from '@instantsys-labs/fx';
5
+ import { BehaviorSubject } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/forms";
9
+ export class DispatchToClinicComponent extends FxBaseComponent {
10
+ cdr;
11
+ fb = inject(FormBuilder);
12
+ clinicAddress$ = new BehaviorSubject({});
13
+ dispatchForm = this.fb.group({
14
+ courierName: ['', Validators.required],
15
+ trackingNumber: ['', Validators.required],
16
+ trackingUrl: ['', [Validators.required, Validators.pattern('https?://.+')]],
17
+ notes: ['', Validators.required]
18
+ });
19
+ constructor(cdr) {
20
+ super(cdr);
21
+ this.cdr = cdr;
22
+ this.onInit.subscribe(() => {
23
+ this._register(this.dispatchForm);
24
+ });
25
+ }
26
+ settings() {
27
+ return [new FxStringSetting({ key: 'heading-text', $title: 'Heading Text', value: 'My Default Value' })];
28
+ }
29
+ validations() {
30
+ return [FxValidatorService.required];
31
+ }
32
+ copyToClipboard(address) {
33
+ navigator.clipboard.writeText(address);
34
+ }
35
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DispatchToClinicComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
36
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DispatchToClinicComponent, isStandalone: true, selector: "lib-dispatch-to-clinic", usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\">\r\n <section\r\n class=\"justify-content-around lg:justify-content-between w-full white-color border-1 border-solid stroke_light_grey p-3 mb-3 mt-3\">\r\n <form [formGroup]=\"dispatchForm\">\r\n <div class=\"grid\">\r\n <!-- Courier Name -->\r\n <div class=\"col-12 sm:col-6 md:col-3 input-container\">\r\n <label for=\"courierName\" class=\"input-title\">Courier Name</label>\r\n <input autocomplete=\"off\" formControlName=\"courierName\" type=\"text\" id=\"courierName\"\r\n name=\"courierName\" class=\"p-inputtext p-component p-element input-field border-1 w-full\"\r\n placeholder=\"enter courier name\" />\r\n\r\n <!-- validation -->\r\n <small *ngIf=\"dispatchForm.get('courierName')?.invalid && dispatchForm.get('courierName')?.touched\"\r\n class=\"text-danger-color block mt-1\">\r\n Courier Name is required.\r\n </small>\r\n <!-- validation -->\r\n </div>\r\n <!-- Courier Name -->\r\n\r\n <!-- Tracking Number -->\r\n <div class=\"col-12 sm:col-6 md:col-3 input-container\">\r\n <label for=\"trackingNumber\" class=\"input-title\">Tracking Number</label>\r\n <input autocomplete=\"off\" formControlName=\"trackingNumber\" type=\"text\" id=\"trackingNumber\"\r\n name=\"trackingNumber\" class=\"p-inputtext p-component p-element input-field border-1 w-full\"\r\n placeholder=\"enter tracking number\" />\r\n <small\r\n *ngIf=\"dispatchForm.get('trackingNumber')?.invalid && dispatchForm.get('trackingNumber')?.touched\"\r\n class=\"text-danger-color block mt-1\">\r\n Tracking Number is required.\r\n </small>\r\n </div>\r\n <!-- Tracking Number -->\r\n\r\n <!-- Tracking URL -->\r\n <div class=\"col-12 sm:col-6 md:col-3 input-container\">\r\n <label for=\"trackingUrl\" class=\"input-title\">Tracking URL</label>\r\n <input autocomplete=\"off\" formControlName=\"trackingUrl\" type=\"text\" id=\"trackingUrl\"\r\n name=\"trackingUrl\" class=\"p-inputtext p-component p-element input-field border-1 w-full\"\r\n placeholder=\"enter tracking url\" />\r\n <small *ngIf=\"dispatchForm.get('trackingUrl')?.invalid && dispatchForm.get('trackingUrl')?.touched\"\r\n class=\"text-danger-color block mt-1\">\r\n <span *ngIf=\"dispatchForm.get('trackingUrl')?.errors?.['required']\">Tracking URL is\r\n required.</span>\r\n <span *ngIf=\"dispatchForm.get('trackingUrl')?.errors?.['pattern']\">Invalid URL format.</span>\r\n </small>\r\n </div>\r\n <!-- Tracking URL -->\r\n\r\n <!-- Notes -->\r\n <div class=\"col-12 md:col-6 input-container\">\r\n <label for=\"notes\" class=\"input-title\">Notes</label>\r\n <textarea autocomplete=\"off\" formControlName=\"notes\" rows=\"5\" id=\"notes\" name=\"notes\"\r\n class=\"p-inputtext p-component p-element input-field border-1 w-full\"\r\n placeholder=\"enter notes\"></textarea>\r\n <small *ngIf=\"dispatchForm.get('notes')?.invalid && dispatchForm.get('notes')?.touched\"\r\n class=\"text-danger-color block mt-1\">\r\n Notes are required.\r\n </small>\r\n </div>\r\n <!-- Notes -->\r\n\r\n <!-- Address with Copy Icon -->\r\n <div class=\"col-12 md:col-6 pt-0\">\r\n <div class=\"mb-1\">Address</div>\r\n <ng-container *ngIf=\"(clinicAddress$ | async) as address\">\r\n <address #completeAddress>{{address?.street}}, {{address?.state}}, {{address?.postalCode}}\r\n <i class=\"pi pi-copy cursor-pointer text-xl text-secondary-color\"\r\n (click)=\"copyToClipboard(completeAddress.textContent)\"></i>\r\n </address>\r\n </ng-container>\r\n </div>\r\n <!-- Address with Copy Icon -->\r\n </div>\r\n </form>\r\n </section>\r\n</fx-component>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }] });
37
+ }
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DispatchToClinicComponent, decorators: [{
39
+ type: Component,
40
+ args: [{ selector: 'lib-dispatch-to-clinic', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule, FxComponent], template: "<fx-component [fxData]=\"fxData\">\r\n <section\r\n class=\"justify-content-around lg:justify-content-between w-full white-color border-1 border-solid stroke_light_grey p-3 mb-3 mt-3\">\r\n <form [formGroup]=\"dispatchForm\">\r\n <div class=\"grid\">\r\n <!-- Courier Name -->\r\n <div class=\"col-12 sm:col-6 md:col-3 input-container\">\r\n <label for=\"courierName\" class=\"input-title\">Courier Name</label>\r\n <input autocomplete=\"off\" formControlName=\"courierName\" type=\"text\" id=\"courierName\"\r\n name=\"courierName\" class=\"p-inputtext p-component p-element input-field border-1 w-full\"\r\n placeholder=\"enter courier name\" />\r\n\r\n <!-- validation -->\r\n <small *ngIf=\"dispatchForm.get('courierName')?.invalid && dispatchForm.get('courierName')?.touched\"\r\n class=\"text-danger-color block mt-1\">\r\n Courier Name is required.\r\n </small>\r\n <!-- validation -->\r\n </div>\r\n <!-- Courier Name -->\r\n\r\n <!-- Tracking Number -->\r\n <div class=\"col-12 sm:col-6 md:col-3 input-container\">\r\n <label for=\"trackingNumber\" class=\"input-title\">Tracking Number</label>\r\n <input autocomplete=\"off\" formControlName=\"trackingNumber\" type=\"text\" id=\"trackingNumber\"\r\n name=\"trackingNumber\" class=\"p-inputtext p-component p-element input-field border-1 w-full\"\r\n placeholder=\"enter tracking number\" />\r\n <small\r\n *ngIf=\"dispatchForm.get('trackingNumber')?.invalid && dispatchForm.get('trackingNumber')?.touched\"\r\n class=\"text-danger-color block mt-1\">\r\n Tracking Number is required.\r\n </small>\r\n </div>\r\n <!-- Tracking Number -->\r\n\r\n <!-- Tracking URL -->\r\n <div class=\"col-12 sm:col-6 md:col-3 input-container\">\r\n <label for=\"trackingUrl\" class=\"input-title\">Tracking URL</label>\r\n <input autocomplete=\"off\" formControlName=\"trackingUrl\" type=\"text\" id=\"trackingUrl\"\r\n name=\"trackingUrl\" class=\"p-inputtext p-component p-element input-field border-1 w-full\"\r\n placeholder=\"enter tracking url\" />\r\n <small *ngIf=\"dispatchForm.get('trackingUrl')?.invalid && dispatchForm.get('trackingUrl')?.touched\"\r\n class=\"text-danger-color block mt-1\">\r\n <span *ngIf=\"dispatchForm.get('trackingUrl')?.errors?.['required']\">Tracking URL is\r\n required.</span>\r\n <span *ngIf=\"dispatchForm.get('trackingUrl')?.errors?.['pattern']\">Invalid URL format.</span>\r\n </small>\r\n </div>\r\n <!-- Tracking URL -->\r\n\r\n <!-- Notes -->\r\n <div class=\"col-12 md:col-6 input-container\">\r\n <label for=\"notes\" class=\"input-title\">Notes</label>\r\n <textarea autocomplete=\"off\" formControlName=\"notes\" rows=\"5\" id=\"notes\" name=\"notes\"\r\n class=\"p-inputtext p-component p-element input-field border-1 w-full\"\r\n placeholder=\"enter notes\"></textarea>\r\n <small *ngIf=\"dispatchForm.get('notes')?.invalid && dispatchForm.get('notes')?.touched\"\r\n class=\"text-danger-color block mt-1\">\r\n Notes are required.\r\n </small>\r\n </div>\r\n <!-- Notes -->\r\n\r\n <!-- Address with Copy Icon -->\r\n <div class=\"col-12 md:col-6 pt-0\">\r\n <div class=\"mb-1\">Address</div>\r\n <ng-container *ngIf=\"(clinicAddress$ | async) as address\">\r\n <address #completeAddress>{{address?.street}}, {{address?.state}}, {{address?.postalCode}}\r\n <i class=\"pi pi-copy cursor-pointer text-xl text-secondary-color\"\r\n (click)=\"copyToClipboard(completeAddress.textContent)\"></i>\r\n </address>\r\n </ng-container>\r\n </div>\r\n <!-- Address with Copy Icon -->\r\n </div>\r\n </form>\r\n </section>\r\n</fx-component>" }]
41
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGF0Y2gtdG8tY2xpbmljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z4LWJ1aWxkZXItd3JhcHBlci9zcmMvbGliL2N1c3RvbS1jb250cm9scy9kaXNwYXRjaC10by1jbGluaWMvZGlzcGF0Y2gtdG8tY2xpbmljLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z4LWJ1aWxkZXItd3JhcHBlci9zcmMvbGliL2N1c3RvbS1jb250cm9scy9kaXNwYXRjaC10by1jbGluaWMvZGlzcGF0Y2gtdG8tY2xpbmljLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXFCLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFhLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQWEsZUFBZSxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pJLE9BQU8sRUFBRSxlQUFlLEVBQVEsTUFBTSxNQUFNLENBQUM7Ozs7QUFRN0MsTUFBTSxPQUFPLHlCQUEwQixTQUFRLGVBQWU7SUFZeEM7SUFYWixFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTFCLGNBQWMsR0FBeUIsSUFBSSxlQUFlLENBQU0sRUFBRSxDQUFDLENBQUM7SUFFcEUsWUFBWSxHQUFjLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQzdDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ3RDLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ3pDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzNFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO0tBQ2pDLENBQUMsQ0FBQTtJQUVGLFlBQW9CLEdBQXNCO1FBQ3hDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURPLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBR3hDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxRQUFRO1FBQ2hCLE9BQU8sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUVTLFdBQVc7UUFDbkIsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxlQUFlLENBQUMsT0FBWTtRQUNqQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO3dHQTlCVSx5QkFBeUI7NEZBQXpCLHlCQUF5Qix5R0NadEMscXRKQTZFZSwyQ0RwRUgsWUFBWSx1TEFBRSxtQkFBbUIsNDhCQUFFLFdBQVcsK0JBQUUsV0FBVzs7NEZBRzFELHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzLCBGb3JtQnVpbGRlciwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZ4QmFzZUNvbXBvbmVudCwgRnhDb21wb25lbnQsIEZ4U2V0dGluZywgRnhTdHJpbmdTZXR0aW5nLCBGeFZhbGlkYXRpb24sIEZ4VmFsaWRhdG9yU2VydmljZSB9IGZyb20gJ0BpbnN0YW50c3lzLWxhYnMvZngnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIHRha2UgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWRpc3BhdGNoLXRvLWNsaW5pYycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZSwgRnhDb21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kaXNwYXRjaC10by1jbGluaWMuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEaXNwYXRjaFRvQ2xpbmljQ29tcG9uZW50IGV4dGVuZHMgRnhCYXNlQ29tcG9uZW50IHtcclxuICBwcml2YXRlIGZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcclxuXHJcbiAgcHVibGljIGNsaW5pY0FkZHJlc3MkOiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7fSk7XHJcblxyXG4gIHB1YmxpYyBkaXNwYXRjaEZvcm06IEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgY291cmllck5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICB0cmFja2luZ051bWJlcjogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIHRyYWNraW5nVXJsOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oJ2h0dHBzPzovLy4rJyldXSxcclxuICAgIG5vdGVzOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgfSlcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICBzdXBlcihjZHIpO1xyXG5cclxuICAgIHRoaXMub25Jbml0LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMuZGlzcGF0Y2hGb3JtKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHNldHRpbmdzKCk6IEZ4U2V0dGluZ1tdIHtcclxuICAgIHJldHVybiBbbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2hlYWRpbmctdGV4dCcsICR0aXRsZTogJ0hlYWRpbmcgVGV4dCcsIHZhbHVlOiAnTXkgRGVmYXVsdCBWYWx1ZScgfSldO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRpb25zKCk6IEZ4VmFsaWRhdGlvbltdIHtcclxuICAgIHJldHVybiBbRnhWYWxpZGF0b3JTZXJ2aWNlLnJlcXVpcmVkXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb3B5VG9DbGlwYm9hcmQoYWRkcmVzczogYW55KTogdm9pZCB7XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChhZGRyZXNzKTtcclxuICB9XHJcbn1cclxuIiwiPGZ4LWNvbXBvbmVudCBbZnhEYXRhXT1cImZ4RGF0YVwiPlxyXG4gICAgPHNlY3Rpb25cclxuICAgICAgICBjbGFzcz1cImp1c3RpZnktY29udGVudC1hcm91bmQgbGc6anVzdGlmeS1jb250ZW50LWJldHdlZW4gdy1mdWxsIHdoaXRlLWNvbG9yIGJvcmRlci0xIGJvcmRlci1zb2xpZCBzdHJva2VfbGlnaHRfZ3JleSBwLTMgbWItMyBtdC0zXCI+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJkaXNwYXRjaEZvcm1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWRcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gQ291cmllciBOYW1lIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBzbTpjb2wtNiBtZDpjb2wtMyBpbnB1dC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY291cmllck5hbWVcIiBjbGFzcz1cImlucHV0LXRpdGxlXCI+Q291cmllciBOYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgZm9ybUNvbnRyb2xOYW1lPVwiY291cmllck5hbWVcIiB0eXBlPVwidGV4dFwiIGlkPVwiY291cmllck5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY291cmllck5hbWVcIiBjbGFzcz1cInAtaW5wdXR0ZXh0IHAtY29tcG9uZW50IHAtZWxlbWVudCBpbnB1dC1maWVsZCBib3JkZXItMSB3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImVudGVyIGNvdXJpZXIgbmFtZVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gdmFsaWRhdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJkaXNwYXRjaEZvcm0uZ2V0KCdjb3VyaWVyTmFtZScpPy5pbnZhbGlkICYmIGRpc3BhdGNoRm9ybS5nZXQoJ2NvdXJpZXJOYW1lJyk/LnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbG9yIGJsb2NrIG10LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQ291cmllciBOYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSB2YWxpZGF0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIENvdXJpZXIgTmFtZSAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRyYWNraW5nIE51bWJlciAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgc206Y29sLTYgbWQ6Y29sLTMgaW5wdXQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInRyYWNraW5nTnVtYmVyXCIgY2xhc3M9XCJpbnB1dC10aXRsZVwiPlRyYWNraW5nIE51bWJlcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiIGZvcm1Db250cm9sTmFtZT1cInRyYWNraW5nTnVtYmVyXCIgdHlwZT1cInRleHRcIiBpZD1cInRyYWNraW5nTnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInRyYWNraW5nTnVtYmVyXCIgY2xhc3M9XCJwLWlucHV0dGV4dCBwLWNvbXBvbmVudCBwLWVsZW1lbnQgaW5wdXQtZmllbGQgYm9yZGVyLTEgdy1mdWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlbnRlciB0cmFja2luZyBudW1iZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRpc3BhdGNoRm9ybS5nZXQoJ3RyYWNraW5nTnVtYmVyJyk/LmludmFsaWQgJiYgZGlzcGF0Y2hGb3JtLmdldCgndHJhY2tpbmdOdW1iZXInKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXItY29sb3IgYmxvY2sgbXQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFja2luZyBOdW1iZXIgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSBUcmFja2luZyBOdW1iZXIgLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUcmFja2luZyBVUkwgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIHNtOmNvbC02IG1kOmNvbC0zIGlucHV0LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0cmFja2luZ1VybFwiIGNsYXNzPVwiaW5wdXQtdGl0bGVcIj5UcmFja2luZyBVUkw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiBmb3JtQ29udHJvbE5hbWU9XCJ0cmFja2luZ1VybFwiIHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ0cmFja2luZ1VybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ0cmFja2luZ1VybFwiIGNsYXNzPVwicC1pbnB1dHRleHQgcC1jb21wb25lbnQgcC1lbGVtZW50IGlucHV0LWZpZWxkIGJvcmRlci0xIHctZnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZW50ZXIgdHJhY2tpbmcgdXJsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJkaXNwYXRjaEZvcm0uZ2V0KCd0cmFja2luZ1VybCcpPy5pbnZhbGlkICYmIGRpc3BhdGNoRm9ybS5nZXQoJ3RyYWNraW5nVXJsJyk/LnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbG9yIGJsb2NrIG10LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkaXNwYXRjaEZvcm0uZ2V0KCd0cmFja2luZ1VybCcpPy5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPlRyYWNraW5nIFVSTCBpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRpc3BhdGNoRm9ybS5nZXQoJ3RyYWNraW5nVXJsJyk/LmVycm9ycz8uWydwYXR0ZXJuJ11cIj5JbnZhbGlkIFVSTCBmb3JtYXQuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHJhY2tpbmcgVVJMIC0tPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gTm90ZXMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1kOmNvbC02IGlucHV0LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJub3Rlc1wiIGNsYXNzPVwiaW5wdXQtdGl0bGVcIj5Ob3RlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGZvcm1Db250cm9sTmFtZT1cIm5vdGVzXCIgcm93cz1cIjVcIiBpZD1cIm5vdGVzXCIgbmFtZT1cIm5vdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0dGV4dCBwLWNvbXBvbmVudCBwLWVsZW1lbnQgaW5wdXQtZmllbGQgYm9yZGVyLTEgdy1mdWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlbnRlciBub3Rlc1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiZGlzcGF0Y2hGb3JtLmdldCgnbm90ZXMnKT8uaW52YWxpZCAmJiBkaXNwYXRjaEZvcm0uZ2V0KCdub3RlcycpPy50b3VjaGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb2xvciBibG9jayBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vdGVzIGFyZSByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIE5vdGVzIC0tPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gQWRkcmVzcyB3aXRoIENvcHkgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWQ6Y29sLTYgcHQtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xXCI+QWRkcmVzczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoY2xpbmljQWRkcmVzcyQgfCBhc3luYykgYXMgYWRkcmVzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YWRkcmVzcyAjY29tcGxldGVBZGRyZXNzPnt7YWRkcmVzcz8uc3RyZWV0fX0sIHt7YWRkcmVzcz8uc3RhdGV9fSwge3thZGRyZXNzPy5wb3N0YWxDb2RlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY29weSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhsIHRleHQtc2Vjb25kYXJ5LWNvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weVRvQ2xpcGJvYXJkKGNvbXBsZXRlQWRkcmVzcy50ZXh0Q29udGVudClcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYWRkcmVzcz5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSBBZGRyZXNzIHdpdGggQ29weSBJY29uIC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICA8L3NlY3Rpb24+XHJcbjwvZngtY29tcG9uZW50PiJdfQ==
@@ -0,0 +1,76 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, Input, ViewChild } from '@angular/core';
3
+ import { FxComponentBuilder, FxMode, FxScope, FxUtils } from '@instantsys-labs/fx';
4
+ import { DispatchToClinicComponent } from './custom-controls/dispatch-to-clinic/dispatch-to-clinic.component';
5
+ import { DynamicTableComponent } from './components/dynamic-table/dynamic-table.component';
6
+ import { ToggleButtonComponent } from './components/toggle-button/toggle-button.component';
7
+ import { UploaderComponent } from './components/uploader/uploader.component';
8
+ import { ToggleComponent } from './components/toggle/toggle.component';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "./fx-builder-wrapper.service";
11
+ export class FxBuilderWrapperComponent {
12
+ fxWrapperService;
13
+ componentBuilder;
14
+ fxForm = FxUtils.createNewForm();
15
+ fxMode = FxMode.EDIT;
16
+ fxConfiguration = {
17
+ settings: true,
18
+ logics: true,
19
+ customControls: true,
20
+ };
21
+ FxScope = FxScope;
22
+ FxMode = FxMode;
23
+ constructor(fxWrapperService) {
24
+ this.fxWrapperService = fxWrapperService;
25
+ }
26
+ ngOnInit() {
27
+ if (!Boolean(this.fxWrapperService.getComponent('dispatch-to-clinic'))) {
28
+ this.fxWrapperService.registerCustomComponent('Dispatch To Clinic', 'dispatch-to-clinic', DispatchToClinicComponent);
29
+ }
30
+ if (!Boolean(this.fxWrapperService.getComponent('dynamic-table'))) {
31
+ this.fxWrapperService.registerCustomComponent('Dynamic Table', 'dynamic-table', DynamicTableComponent);
32
+ }
33
+ if (!Boolean(this.fxWrapperService.getComponent('toggle-button'))) {
34
+ this.fxWrapperService.registerCustomComponent('Toggle Button', 'toggle-button', ToggleButtonComponent);
35
+ }
36
+ if (!Boolean(this.fxWrapperService.getComponent('uploader'))) {
37
+ this.fxWrapperService.registerCustomComponent('Uploader', 'uploader', UploaderComponent);
38
+ }
39
+ if (!Boolean(this.fxWrapperService.getComponent('toggle'))) {
40
+ this.fxWrapperService.registerCustomComponent('Toggle', 'toggle', ToggleComponent);
41
+ }
42
+ }
43
+ ;
44
+ getParsedForm() {
45
+ return this.componentBuilder.getParsedForm();
46
+ }
47
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FxBuilderWrapperComponent, deps: [{ token: i1.FxBuilderWrapperService }], target: i0.ɵɵFactoryTarget.Component });
48
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FxBuilderWrapperComponent, isStandalone: true, selector: "fx-builder-wrapper", inputs: { fxForm: ["fx-form", "fxForm"] }, viewQueries: [{ propertyName: "componentBuilder", first: true, predicate: ["componentBuilder"], descendants: true }], ngImport: i0, template: `
49
+ <fx-component-builder
50
+ #componentBuilder
51
+ [fx-form]="fxForm"
52
+ [configuration]="fxConfiguration"
53
+ [scope]="FxScope.BUILDER"
54
+ >
55
+ </fx-component-builder>
56
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: FxComponentBuilder, selector: "fx-component-builder", inputs: ["fx-form", "scope", "configuration"] }] });
57
+ }
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FxBuilderWrapperComponent, decorators: [{
59
+ type: Component,
60
+ args: [{ selector: 'fx-builder-wrapper', standalone: true, imports: [CommonModule, FxComponentBuilder], template: `
61
+ <fx-component-builder
62
+ #componentBuilder
63
+ [fx-form]="fxForm"
64
+ [configuration]="fxConfiguration"
65
+ [scope]="FxScope.BUILDER"
66
+ >
67
+ </fx-component-builder>
68
+ ` }]
69
+ }], ctorParameters: () => [{ type: i1.FxBuilderWrapperService }], propDecorators: { componentBuilder: [{
70
+ type: ViewChild,
71
+ args: ['componentBuilder']
72
+ }], fxForm: [{
73
+ type: Input,
74
+ args: [{ alias: 'fx-form', required: true }]
75
+ }] } });
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZngtYnVpbGRlci13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Z4LWJ1aWxkZXItd3JhcHBlci9zcmMvbGliL2Z4LWJ1aWxkZXItd3JhcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQTBCLGtCQUFrQixFQUFVLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUVBQW1FLENBQUM7QUFFOUcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDM0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7QUFpQnZFLE1BQU0sT0FBTyx5QkFBeUI7SUFhaEI7SUFaVyxnQkFBZ0IsQ0FBc0I7SUFDeEIsTUFBTSxHQUFXLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvRSxNQUFNLEdBQVcsTUFBTSxDQUFDLElBQUksQ0FBQztJQUM3QixlQUFlLEdBQTJCO1FBQy9DLFFBQVEsRUFBRSxJQUFJO1FBQ2QsTUFBTSxFQUFFLElBQUk7UUFDWixjQUFjLEVBQUUsSUFBSTtLQUNyQixDQUFBO0lBRWtCLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDbEIsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUVuQyxZQUFvQixnQkFBeUM7UUFBekMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtJQUFJLENBQUM7SUFFM0QsUUFBUTtRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUN2SCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDekcsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUMzRixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNyRixDQUFDO0lBQ0gsQ0FBQztJQUFBLENBQUM7SUFFSyxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9DLENBQUM7d0dBbkNVLHlCQUF5Qjs0RkFBekIseUJBQXlCLCtPQVgxQjs7Ozs7Ozs7R0FRVCx5RUFUUyxZQUFZLCtCQUFFLGtCQUFrQjs7NEZBWS9CLHlCQUF5QjtrQkFmckMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLFlBQ2pDOzs7Ozs7OztHQVFUOzRGQUk4QixnQkFBZ0I7c0JBQTlDLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUNnQixNQUFNO3NCQUFsRCxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRnhCdWlsZGVyQ29uZmlndXJhdGlvbiwgRnhDb21wb25lbnRCdWlsZGVyLCBGeEZvcm0sIEZ4TW9kZSwgRnhTY29wZSwgRnhVdGlscyB9IGZyb20gJ0BpbnN0YW50c3lzLWxhYnMvZngnO1xyXG5pbXBvcnQgeyBEaXNwYXRjaFRvQ2xpbmljQ29tcG9uZW50IH0gZnJvbSAnLi9jdXN0b20tY29udHJvbHMvZGlzcGF0Y2gtdG8tY2xpbmljL2Rpc3BhdGNoLXRvLWNsaW5pYy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSB9IGZyb20gJy4vZngtYnVpbGRlci13cmFwcGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEeW5hbWljVGFibGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZHluYW1pYy10YWJsZS9keW5hbWljLXRhYmxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRvZ2dsZUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90b2dnbGUtYnV0dG9uL3RvZ2dsZS1idXR0b24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgVXBsb2FkZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdXBsb2FkZXIvdXBsb2FkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVG9nZ2xlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RvZ2dsZS90b2dnbGUuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZngtYnVpbGRlci13cmFwcGVyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZ4Q29tcG9uZW50QnVpbGRlcl0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxmeC1jb21wb25lbnQtYnVpbGRlciBcclxuICAgICAgICAjY29tcG9uZW50QnVpbGRlciBcclxuICAgICAgICBbZngtZm9ybV09XCJmeEZvcm1cIiBcclxuICAgICAgICBbY29uZmlndXJhdGlvbl09XCJmeENvbmZpZ3VyYXRpb25cIiBcclxuICAgICAgICBbc2NvcGVdPVwiRnhTY29wZS5CVUlMREVSXCJcclxuICAgICAgICA+XHJcbiAgICA8L2Z4LWNvbXBvbmVudC1idWlsZGVyPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBgYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRnhCdWlsZGVyV3JhcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnY29tcG9uZW50QnVpbGRlcicpIGNvbXBvbmVudEJ1aWxkZXIhOiBGeENvbXBvbmVudEJ1aWxkZXI7XHJcbiAgQElucHV0KHsgYWxpYXM6ICdmeC1mb3JtJywgcmVxdWlyZWQ6IHRydWUgfSkgZnhGb3JtOiBGeEZvcm0gPSBGeFV0aWxzLmNyZWF0ZU5ld0Zvcm0oKTtcclxuICBwdWJsaWMgZnhNb2RlOiBGeE1vZGUgPSBGeE1vZGUuRURJVDtcclxuICBwdWJsaWMgZnhDb25maWd1cmF0aW9uOiBGeEJ1aWxkZXJDb25maWd1cmF0aW9uID0ge1xyXG4gICAgc2V0dGluZ3M6IHRydWUsXHJcbiAgICBsb2dpY3M6IHRydWUsXHJcbiAgICBjdXN0b21Db250cm9sczogdHJ1ZSxcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWFkb25seSBGeFNjb3BlID0gRnhTY29wZTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRnhNb2RlID0gRnhNb2RlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZ4V3JhcHBlclNlcnZpY2U6IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlKSB7IH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCFCb29sZWFuKHRoaXMuZnhXcmFwcGVyU2VydmljZS5nZXRDb21wb25lbnQoJ2Rpc3BhdGNoLXRvLWNsaW5pYycpKSkge1xyXG4gICAgICB0aGlzLmZ4V3JhcHBlclNlcnZpY2UucmVnaXN0ZXJDdXN0b21Db21wb25lbnQoJ0Rpc3BhdGNoIFRvIENsaW5pYycsICdkaXNwYXRjaC10by1jbGluaWMnLCBEaXNwYXRjaFRvQ2xpbmljQ29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIGlmICghQm9vbGVhbih0aGlzLmZ4V3JhcHBlclNlcnZpY2UuZ2V0Q29tcG9uZW50KCdkeW5hbWljLXRhYmxlJykpKSB7XHJcbiAgICAgIHRoaXMuZnhXcmFwcGVyU2VydmljZS5yZWdpc3RlckN1c3RvbUNvbXBvbmVudCgnRHluYW1pYyBUYWJsZScsICdkeW5hbWljLXRhYmxlJywgRHluYW1pY1RhYmxlQ29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIGlmICghQm9vbGVhbih0aGlzLmZ4V3JhcHBlclNlcnZpY2UuZ2V0Q29tcG9uZW50KCd0b2dnbGUtYnV0dG9uJykpKSB7XHJcbiAgICAgIHRoaXMuZnhXcmFwcGVyU2VydmljZS5yZWdpc3RlckN1c3RvbUNvbXBvbmVudCgnVG9nZ2xlIEJ1dHRvbicsICd0b2dnbGUtYnV0dG9uJywgVG9nZ2xlQnV0dG9uQ29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIGlmICghQm9vbGVhbih0aGlzLmZ4V3JhcHBlclNlcnZpY2UuZ2V0Q29tcG9uZW50KCd1cGxvYWRlcicpKSkge1xyXG4gICAgICB0aGlzLmZ4V3JhcHBlclNlcnZpY2UucmVnaXN0ZXJDdXN0b21Db21wb25lbnQoJ1VwbG9hZGVyJywgJ3VwbG9hZGVyJywgVXBsb2FkZXJDb21wb25lbnQpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFCb29sZWFuKHRoaXMuZnhXcmFwcGVyU2VydmljZS5nZXRDb21wb25lbnQoJ3RvZ2dsZScpKSkge1xyXG4gICAgICB0aGlzLmZ4V3JhcHBlclNlcnZpY2UucmVnaXN0ZXJDdXN0b21Db21wb25lbnQoJ1RvZ2dsZScsICd0b2dnbGUnLCBUb2dnbGVDb21wb25lbnQpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBnZXRQYXJzZWRGb3JtKCk6IEZ4Rm9ybSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRCdWlsZGVyLmdldFBhcnNlZEZvcm0oKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4iXX0=
@@ -0,0 +1,40 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@instantsys-labs/fx";
5
+ export class FxBuilderWrapperService {
6
+ fxComponentRegistry;
7
+ variables$ = new BehaviorSubject(null);
8
+ constructor(fxComponentRegistry) {
9
+ this.fxComponentRegistry = fxComponentRegistry;
10
+ }
11
+ registerCustomComponent(title, selector, component) {
12
+ this.fxComponentRegistry.registerComponent(selector, component, {
13
+ registeringAs: "CUSTOM",
14
+ libraryItem: {
15
+ title,
16
+ icon: 'fa-eye',
17
+ fxData: {
18
+ id: null,
19
+ name: selector,
20
+ value: "",
21
+ selector: selector,
22
+ elements: [],
23
+ events: []
24
+ }
25
+ },
26
+ });
27
+ }
28
+ getComponent(selector) {
29
+ return this.fxComponentRegistry.getComponent(selector);
30
+ }
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FxBuilderWrapperService, deps: [{ token: i1.FxComponentRegistryService }], target: i0.ɵɵFactoryTarget.Injectable });
32
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FxBuilderWrapperService, providedIn: 'root' });
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FxBuilderWrapperService, decorators: [{
35
+ type: Injectable,
36
+ args: [{
37
+ providedIn: 'root'
38
+ }]
39
+ }], ctorParameters: () => [{ type: i1.FxComponentRegistryService }] });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZngtYnVpbGRlci13cmFwcGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9meC1idWlsZGVyLXdyYXBwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBRSxlQUFlLEVBQVcsTUFBTSxNQUFNLENBQUM7OztBQUtoRCxNQUFNLE9BQU8sdUJBQXVCO0lBRWQ7SUFEYixVQUFVLEdBQUcsSUFBSSxlQUFlLENBQWEsSUFBSSxDQUFDLENBQUM7SUFDMUQsWUFBb0IsbUJBQStDO1FBQS9DLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBNEI7SUFBSSxDQUFDO0lBRWpFLHVCQUF1QixDQUFDLEtBQWEsRUFBRSxRQUFnQixFQUFFLFNBQWdDO1FBRTlGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFO1lBQzlELGFBQWEsRUFBRSxRQUFRO1lBQ3ZCLFdBQVcsRUFBRTtnQkFDWCxLQUFLO2dCQUNMLElBQUksRUFBRSxRQUFRO2dCQUNkLE1BQU0sRUFBRTtvQkFDTixFQUFFLEVBQUUsSUFBSTtvQkFDUixJQUFJLEVBQUUsUUFBUTtvQkFDZCxLQUFLLEVBQUUsRUFBRTtvQkFDVCxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsUUFBUSxFQUFFLEVBQUU7b0JBQ1osTUFBTSxFQUFFLEVBQUU7aUJBQ1g7YUFDRjtTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTSxZQUFZLENBQUMsUUFBZ0I7UUFDbEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7d0dBekJVLHVCQUF1Qjs0R0FBdkIsdUJBQXVCLGNBRnRCLE1BQU07OzRGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZ4QmFzZUNvbXBvbmVudCwgRnhDb21wb25lbnRSZWdpc3RyeVNlcnZpY2UgfSBmcm9tICdAaW5zdGFudHN5cy1sYWJzL2Z4JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSB7XHJcbiAgcHVibGljIHZhcmlhYmxlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueSB8IG51bGw+KG51bGwpO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZnhDb21wb25lbnRSZWdpc3RyeTogRnhDb21wb25lbnRSZWdpc3RyeVNlcnZpY2UpIHsgfVxyXG5cclxuICBwdWJsaWMgcmVnaXN0ZXJDdXN0b21Db21wb25lbnQodGl0bGU6IHN0cmluZywgc2VsZWN0b3I6IHN0cmluZywgY29tcG9uZW50OiBUeXBlPEZ4QmFzZUNvbXBvbmVudD5cclxuICApOiB2b2lkIHtcclxuICAgIHRoaXMuZnhDb21wb25lbnRSZWdpc3RyeS5yZWdpc3RlckNvbXBvbmVudChzZWxlY3RvciwgY29tcG9uZW50LCB7XHJcbiAgICAgIHJlZ2lzdGVyaW5nQXM6IFwiQ1VTVE9NXCIsXHJcbiAgICAgIGxpYnJhcnlJdGVtOiB7XHJcbiAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgaWNvbjogJ2ZhLWV5ZScsXHJcbiAgICAgICAgZnhEYXRhOiB7XHJcbiAgICAgICAgICBpZDogbnVsbCxcclxuICAgICAgICAgIG5hbWU6IHNlbGVjdG9yLFxyXG4gICAgICAgICAgdmFsdWU6IFwiXCIsXHJcbiAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXHJcbiAgICAgICAgICBlbGVtZW50czogW10sXHJcbiAgICAgICAgICBldmVudHM6IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb21wb25lbnQoc2VsZWN0b3I6IHN0cmluZyk6IFR5cGU8RnhCYXNlQ29tcG9uZW50PiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5meENvbXBvbmVudFJlZ2lzdHJ5LmdldENvbXBvbmVudChzZWxlY3Rvcik7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,89 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { DialogModule } from 'primeng/dialog';
5
+ import { InputTextModule } from 'primeng/inputtext';
6
+ import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/forms";
9
+ import * as i2 from "@angular/common";
10
+ import * as i3 from "primeng/button";
11
+ import * as i4 from "primeng/api";
12
+ import * as i5 from "primeng/dialog";
13
+ export class ConfigurationPanelComponent {
14
+ fb;
15
+ visible = false;
16
+ isVisible = new EventEmitter();
17
+ configuration = new EventEmitter();
18
+ rows = 1;
19
+ enableAPI = false;
20
+ api = '';
21
+ dynamicForm;
22
+ columnTypes = ['text', 'input-text', 'input-number', 'dropdown', 'smart-dropdown', 'checkbox', 'radio', 'radio-group', 'file-upload', 'textarea'];
23
+ constructor(fb) {
24
+ this.fb = fb;
25
+ this.dynamicForm = this.fb.group({
26
+ columns: this.fb.array([])
27
+ });
28
+ }
29
+ get columns() {
30
+ return this.dynamicForm.get('columns');
31
+ }
32
+ // Add Column Dynamically
33
+ addColumn() {
34
+ const columnFormGroup = this.fb.group({
35
+ header: ['', Validators.required],
36
+ cellType: ['', Validators.required],
37
+ placeholder: '',
38
+ options: this.fb.array([]),
39
+ apiUrl: '',
40
+ valueKey: '',
41
+ labelKey: '',
42
+ className: '',
43
+ apiKey: ''
44
+ });
45
+ this.columns.push(columnFormGroup);
46
+ }
47
+ // Remove Column
48
+ removeColumn(index) {
49
+ this.columns.removeAt(index);
50
+ }
51
+ // Add Options Dynamically
52
+ addOption(columnIndex) {
53
+ const optionGroup = this.fb.group({
54
+ optionName: ['', Validators.required],
55
+ optionValue: ['', Validators.required]
56
+ });
57
+ const column = this.columns.at(columnIndex);
58
+ const options = column.get('options');
59
+ options.push(optionGroup);
60
+ }
61
+ // Get options FormArray for a specific column
62
+ getOptions(columnIndex) {
63
+ const column = this.columns.at(columnIndex);
64
+ return column.get('options');
65
+ }
66
+ closeDialog() {
67
+ this.isVisible.emit(false);
68
+ }
69
+ saveConfiguration() {
70
+ this.configuration.emit({ rows: this.rows, columns: this.dynamicForm.value?.columns, enableAPI: this.enableAPI, api: this.api });
71
+ this.isVisible.emit(false);
72
+ }
73
+ onSubmit() {
74
+ console.log("Value columns formArray", this.dynamicForm.value);
75
+ }
76
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConfigurationPanelComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
77
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ConfigurationPanelComponent, isStandalone: true, selector: "fx-configuration-panel", inputs: { visible: "visible" }, outputs: { isVisible: "isVisible", configuration: "configuration" }, ngImport: i0, template: "<p-dialog [modal]=\"true\" [draggable]=\"false\" [(visible)]=\"visible\" [style]=\"{ width: '35rem' }\">\r\n <ng-content pTemplate=\"header\">\r\n <div class=\"flex p-2 bg-white border-2\">\r\n <p class=\"text-base\">Edit Configuration</p>\r\n </div>\r\n </ng-content>\r\n\r\n <ng-template pTemplate=\"content\">\r\n <div class=\"flex flex-col gap-4 bg-white p-2 border-2 border-gray-200\">\r\n <div class=\"flex items-center gap-4 mb-8\">\r\n <label for=\"rows\" class=\"font-semibold w-24\">Rows</label>\r\n <input type=\"text\" [readonly]=\"enableAPI\" [(ngModel)]=\"rows\" placeholder=\"rows\" class=\"form__input\" id=\"name\" autocomplete=\"rows\" />\r\n </div>\r\n <div class=\"flex items-center gap-4 mb-8\">\r\n <label for=\"enableAPI\" class=\"font-semibold w-24\">Enable API</label>\r\n <input type=\"checkbox\" [(ngModel)]=\"enableAPI\" placeholder=\"API Url\" id=\"enableAPI\" autocomplete=\"enableAPI\" />\r\n </div>\r\n @if (enableAPI) {\r\n <div class=\"flex items-center gap-4 mb-8\">\r\n <label for=\"api\" class=\"font-semibold w-24\">API</label>\r\n <input type=\"text\" [(ngModel)]=\"api\" placeholder=\"Enter API Url\" id=\"api\" autocomplete=\"api\" />\r\n </div>\r\n }\r\n <div class=\"flex items-center gap-4 mb-8\">\r\n <div class=\"grid grid-nogutter\">\r\n <div class=\"col-2 mb-3 flex items-center gap-3\">\r\n <p class=\"text-sm font-semibold\">Columns:</p>\r\n <button type=\"button\" (click)=\"addColumn()\">Add Column</button>\r\n </div>\r\n <div class=\"col-10\">\r\n <form [formGroup]=\"dynamicForm\" (ngSubmit)=\"onSubmit()\">\r\n <div formArrayName=\"columns\">\r\n <div *ngFor=\"let column of columns.controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"flex gap-4 mb-2\">\r\n <label class=\"white-space-nowrap\">Column Name:</label>\r\n <input formControlName=\"header\" placeholder=\"Enter Column Name\" class=\"form__input\" />\r\n </div>\r\n <div class=\"flex gap-4\">\r\n <label>Column Type:</label>\r\n <select formControlName=\"cellType\">\r\n <option *ngFor=\"let type of columnTypes\" [value]=\"type\">{{type}}</option>\r\n </select>\r\n </div>\r\n @if (enableAPI) {\r\n <div class=\"flex gap-4 mt-2\">\r\n <label>API Value Key:</label>\r\n <input formControlName=\"apiKey\" placeholder=\"Enter Value Key\" class=\"form__input\" />\r\n </div>\r\n }\r\n \r\n <!-- Show options if columnType is 'radio-group' or 'dropdown' -->\r\n <div *ngIf=\"['radio-group', 'dropdown'].includes(column.value.cellType)\">\r\n <div formArrayName=\"options\">\r\n <div *ngFor=\"let option of getOptions(i).controls; let j = index\" [formGroupName]=\"j\">\r\n <label>Option {{ j + 1 }}:</label>\r\n <input formControlName=\"optionName\" placeholder=\"Enter option name\" class=\"form__input\" />\r\n <input formControlName=\"optionValue\" placeholder=\"Enter option value\" class=\"form__input\" />\r\n <button type=\"button\" (click)=\"getOptions(i).removeAt(j)\">Remove Option</button>\r\n </div>\r\n </div>\r\n <button type=\"button\" (click)=\"addOption(i)\">Add Option</button>\r\n </div>\r\n\r\n <!-- Show apiUrl if columnType is 'smart-dropdown' -->\r\n <div *ngIf=\"['smart-dropdown'].includes(column.value.cellType)\" class=\"flex gap-2\">\r\n <div>\r\n <label>API Url</label>\r\n <input formControlName=\"apiUrl\" placeholder=\"Enter api url\" class=\"form__input\" />\r\n </div>\r\n <div>\r\n <label>Value Key</label>\r\n <input formControlName=\"valueKey\" placeholder=\"Enter Value Key\" class=\"form__input\" />\r\n </div>\r\n <div>\r\n <label>Label Key</label>\r\n <input formControlName=\"labelKey\" placeholder=\"Enter Label Key\" class=\"form__input\" />\r\n </div>\r\n </div>\r\n \r\n <button type=\"button\" (click)=\"columns.removeAt(i)\">Remove Column</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end bg-blue-500 gap-4 w-full\">\r\n <p-button label=\"Cancel\" severity=\"secondary\" (click)=\"closeDialog()\" />\r\n <p-button styleClass=\"border border-indigo-600\" label=\"Save\" (click)=\"saveConfiguration()\" />\r\n </div>\r\n </ng-template>\r\n</p-dialog>", styles: [":is() .p-dialog-content{padding:1.5rem}:is() .p-dialog-header{background:#fff;padding:1rem;font-size:1.25rem;font-weight:700}.form__input{width:100%;padding:8px;border:1px solid #ccc;border-radius:5px}label{font-size:14px;font-weight:600;margin-bottom:5px}.button-group{display:flex;justify-content:flex-end;gap:10px;padding-top:1rem}button{padding:8px 12px;border:none;border-radius:5px;cursor:pointer}.cancel{background:#ccc;color:#000}.save{background:#007bff;color:#fff}button:hover{opacity:.8}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i5.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
78
+ }
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConfigurationPanelComponent, decorators: [{
80
+ type: Component,
81
+ args: [{ selector: 'fx-configuration-panel', standalone: true, imports: [CommonModule, ReactiveFormsModule, ButtonModule, DialogModule, InputTextModule, FormsModule], template: "<p-dialog [modal]=\"true\" [draggable]=\"false\" [(visible)]=\"visible\" [style]=\"{ width: '35rem' }\">\r\n <ng-content pTemplate=\"header\">\r\n <div class=\"flex p-2 bg-white border-2\">\r\n <p class=\"text-base\">Edit Configuration</p>\r\n </div>\r\n </ng-content>\r\n\r\n <ng-template pTemplate=\"content\">\r\n <div class=\"flex flex-col gap-4 bg-white p-2 border-2 border-gray-200\">\r\n <div class=\"flex items-center gap-4 mb-8\">\r\n <label for=\"rows\" class=\"font-semibold w-24\">Rows</label>\r\n <input type=\"text\" [readonly]=\"enableAPI\" [(ngModel)]=\"rows\" placeholder=\"rows\" class=\"form__input\" id=\"name\" autocomplete=\"rows\" />\r\n </div>\r\n <div class=\"flex items-center gap-4 mb-8\">\r\n <label for=\"enableAPI\" class=\"font-semibold w-24\">Enable API</label>\r\n <input type=\"checkbox\" [(ngModel)]=\"enableAPI\" placeholder=\"API Url\" id=\"enableAPI\" autocomplete=\"enableAPI\" />\r\n </div>\r\n @if (enableAPI) {\r\n <div class=\"flex items-center gap-4 mb-8\">\r\n <label for=\"api\" class=\"font-semibold w-24\">API</label>\r\n <input type=\"text\" [(ngModel)]=\"api\" placeholder=\"Enter API Url\" id=\"api\" autocomplete=\"api\" />\r\n </div>\r\n }\r\n <div class=\"flex items-center gap-4 mb-8\">\r\n <div class=\"grid grid-nogutter\">\r\n <div class=\"col-2 mb-3 flex items-center gap-3\">\r\n <p class=\"text-sm font-semibold\">Columns:</p>\r\n <button type=\"button\" (click)=\"addColumn()\">Add Column</button>\r\n </div>\r\n <div class=\"col-10\">\r\n <form [formGroup]=\"dynamicForm\" (ngSubmit)=\"onSubmit()\">\r\n <div formArrayName=\"columns\">\r\n <div *ngFor=\"let column of columns.controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"flex gap-4 mb-2\">\r\n <label class=\"white-space-nowrap\">Column Name:</label>\r\n <input formControlName=\"header\" placeholder=\"Enter Column Name\" class=\"form__input\" />\r\n </div>\r\n <div class=\"flex gap-4\">\r\n <label>Column Type:</label>\r\n <select formControlName=\"cellType\">\r\n <option *ngFor=\"let type of columnTypes\" [value]=\"type\">{{type}}</option>\r\n </select>\r\n </div>\r\n @if (enableAPI) {\r\n <div class=\"flex gap-4 mt-2\">\r\n <label>API Value Key:</label>\r\n <input formControlName=\"apiKey\" placeholder=\"Enter Value Key\" class=\"form__input\" />\r\n </div>\r\n }\r\n \r\n <!-- Show options if columnType is 'radio-group' or 'dropdown' -->\r\n <div *ngIf=\"['radio-group', 'dropdown'].includes(column.value.cellType)\">\r\n <div formArrayName=\"options\">\r\n <div *ngFor=\"let option of getOptions(i).controls; let j = index\" [formGroupName]=\"j\">\r\n <label>Option {{ j + 1 }}:</label>\r\n <input formControlName=\"optionName\" placeholder=\"Enter option name\" class=\"form__input\" />\r\n <input formControlName=\"optionValue\" placeholder=\"Enter option value\" class=\"form__input\" />\r\n <button type=\"button\" (click)=\"getOptions(i).removeAt(j)\">Remove Option</button>\r\n </div>\r\n </div>\r\n <button type=\"button\" (click)=\"addOption(i)\">Add Option</button>\r\n </div>\r\n\r\n <!-- Show apiUrl if columnType is 'smart-dropdown' -->\r\n <div *ngIf=\"['smart-dropdown'].includes(column.value.cellType)\" class=\"flex gap-2\">\r\n <div>\r\n <label>API Url</label>\r\n <input formControlName=\"apiUrl\" placeholder=\"Enter api url\" class=\"form__input\" />\r\n </div>\r\n <div>\r\n <label>Value Key</label>\r\n <input formControlName=\"valueKey\" placeholder=\"Enter Value Key\" class=\"form__input\" />\r\n </div>\r\n <div>\r\n <label>Label Key</label>\r\n <input formControlName=\"labelKey\" placeholder=\"Enter Label Key\" class=\"form__input\" />\r\n </div>\r\n </div>\r\n \r\n <button type=\"button\" (click)=\"columns.removeAt(i)\">Remove Column</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end bg-blue-500 gap-4 w-full\">\r\n <p-button label=\"Cancel\" severity=\"secondary\" (click)=\"closeDialog()\" />\r\n <p-button styleClass=\"border border-indigo-600\" label=\"Save\" (click)=\"saveConfiguration()\" />\r\n </div>\r\n </ng-template>\r\n</p-dialog>", styles: [":is() .p-dialog-content{padding:1.5rem}:is() .p-dialog-header{background:#fff;padding:1rem;font-size:1.25rem;font-weight:700}.form__input{width:100%;padding:8px;border:1px solid #ccc;border-radius:5px}label{font-size:14px;font-weight:600;margin-bottom:5px}.button-group{display:flex;justify-content:flex-end;gap:10px;padding-top:1rem}button{padding:8px 12px;border:none;border-radius:5px;cursor:pointer}.cancel{background:#ccc;color:#000}.save{background:#007bff;color:#fff}button:hover{opacity:.8}\n"] }]
82
+ }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { visible: [{
83
+ type: Input
84
+ }], isVisible: [{
85
+ type: Output
86
+ }], configuration: [{
87
+ type: Output
88
+ }] } });
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9wYW5lbC9jb25maWd1cmF0aW9uLXBhbmVsL2NvbmZpZ3VyYXRpb24tcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvcGFuZWwvY29uZmlndXJhdGlvbi1wYW5lbC9jb25maWd1cmF0aW9uLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQVUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE9BQU8sRUFBcUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBU2pILE1BQU0sT0FBTywyQkFBMkI7SUFhbEI7SUFaWCxPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3hCLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBQ3hDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRTNDLElBQUksR0FBVyxDQUFDLENBQUM7SUFDakIsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUMzQixHQUFHLEdBQVcsRUFBRSxDQUFDO0lBRWpCLFdBQVcsQ0FBWTtJQUV2QixXQUFXLEdBQWEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRW5LLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUMzQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQWMsQ0FBQztJQUN0RCxDQUFDO0lBRUQseUJBQXlCO0lBQ2xCLFNBQVM7UUFDZCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNwQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNqQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxXQUFXLEVBQUUsRUFBRTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxFQUFFLEVBQUU7WUFDVixRQUFRLEVBQUUsRUFBRTtZQUNaLFFBQVEsRUFBRSxFQUFFO1lBQ1osU0FBUyxFQUFFLEVBQUU7WUFDYixNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxnQkFBZ0I7SUFDVCxZQUFZLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsMEJBQTBCO0lBQ25CLFNBQVMsQ0FBQyxXQUFtQjtRQUNsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNoQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUN2QyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQWMsQ0FBQztRQUN6RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBYyxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELDhDQUE4QztJQUN2QyxVQUFVLENBQUMsV0FBbUI7UUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFjLENBQUM7UUFDekQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBYyxDQUFDO0lBQzVDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNqSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxDQUFDO3dHQXpFVSwyQkFBMkI7NEZBQTNCLDJCQUEyQix1TENmeEMsb2pOQStGVyw2aUJEcEZDLFlBQVksK1BBQUUsbUJBQW1CLHN1REFBRSxZQUFZLG9lQUFFLFlBQVksdXVCQUFFLGVBQWUsOEJBQUUsV0FBVzs7NEZBSTFGLDJCQUEyQjtrQkFQdkMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFdBQVcsQ0FBQztnRkFLN0YsT0FBTztzQkFBZixLQUFLO2dCQUNJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcclxuaW1wb3J0IHsgRGlhbG9nLCBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XHJcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcclxuaW1wb3J0IHsgQ2FyZCB9IGZyb20gJ3ByaW1lbmcvY2FyZCc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Z4LWNvbmZpZ3VyYXRpb24tcGFuZWwnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQnV0dG9uTW9kdWxlLCBEaWFsb2dNb2R1bGUsIElucHV0VGV4dE1vZHVsZSwgRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25maWd1cmF0aW9uLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vY29uZmlndXJhdGlvbi1wYW5lbC5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvblBhbmVsQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSB2aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIGlzVmlzaWJsZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAT3V0cHV0KCkgY29uZmlndXJhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwdWJsaWMgcm93czogbnVtYmVyID0gMTtcclxuICBwdWJsaWMgZW5hYmxlQVBJOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGFwaTogc3RyaW5nID0gJyc7XHJcblxyXG4gIHB1YmxpYyBkeW5hbWljRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBwdWJsaWMgY29sdW1uVHlwZXM6IHN0cmluZ1tdID0gWyd0ZXh0JywgJ2lucHV0LXRleHQnLCAnaW5wdXQtbnVtYmVyJywgJ2Ryb3Bkb3duJywgJ3NtYXJ0LWRyb3Bkb3duJywgJ2NoZWNrYm94JywgJ3JhZGlvJywgJ3JhZGlvLWdyb3VwJywgJ2ZpbGUtdXBsb2FkJywgJ3RleHRhcmVhJ107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICB0aGlzLmR5bmFtaWNGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGNvbHVtbnM6IHRoaXMuZmIuYXJyYXkoW10pXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBjb2x1bW5zKCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRm9ybS5nZXQoJ2NvbHVtbnMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvLyBBZGQgQ29sdW1uIER5bmFtaWNhbGx5XHJcbiAgcHVibGljIGFkZENvbHVtbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbHVtbkZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBoZWFkZXI6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGNlbGxUeXBlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJycsXHJcbiAgICAgIG9wdGlvbnM6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBhcGlVcmw6ICcnLFxyXG4gICAgICB2YWx1ZUtleTogJycsXHJcbiAgICAgIGxhYmVsS2V5OiAnJyxcclxuICAgICAgY2xhc3NOYW1lOiAnJyxcclxuICAgICAgYXBpS2V5OiAnJ1xyXG4gICAgfSlcclxuICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtbkZvcm1Hcm91cCk7XHJcbiAgfVxyXG5cclxuICAvLyBSZW1vdmUgQ29sdW1uXHJcbiAgcHVibGljIHJlbW92ZUNvbHVtbihpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbHVtbnMucmVtb3ZlQXQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQWRkIE9wdGlvbnMgRHluYW1pY2FsbHlcclxuICBwdWJsaWMgYWRkT3B0aW9uKGNvbHVtbkluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG9wdGlvbkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIG9wdGlvbk5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIG9wdGlvblZhbHVlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuYXQoY29sdW1uSW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBjb2x1bW4uZ2V0KCdvcHRpb25zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgb3B0aW9ucy5wdXNoKG9wdGlvbkdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vIEdldCBvcHRpb25zIEZvcm1BcnJheSBmb3IgYSBzcGVjaWZpYyBjb2x1bW5cclxuICBwdWJsaWMgZ2V0T3B0aW9ucyhjb2x1bW5JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuYXQoY29sdW1uSW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgIHJldHVybiBjb2x1bW4uZ2V0KCdvcHRpb25zJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlRGlhbG9nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1Zpc2libGUuZW1pdChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uZW1pdCh7IHJvd3M6IHRoaXMucm93cywgY29sdW1uczogdGhpcy5keW5hbWljRm9ybS52YWx1ZT8uY29sdW1ucywgZW5hYmxlQVBJOiB0aGlzLmVuYWJsZUFQSSwgYXBpOiB0aGlzLmFwaSB9KTtcclxuICAgIHRoaXMuaXNWaXNpYmxlLmVtaXQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uU3VibWl0KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJWYWx1ZSBjb2x1bW5zIGZvcm1BcnJheVwiLCB0aGlzLmR5bmFtaWNGb3JtLnZhbHVlKTtcclxuICB9XHJcbn1cclxuIiwiPHAtZGlhbG9nIFttb2RhbF09XCJ0cnVlXCIgW2RyYWdnYWJsZV09XCJmYWxzZVwiIFsodmlzaWJsZSldPVwidmlzaWJsZVwiIFtzdHlsZV09XCJ7IHdpZHRoOiAnMzVyZW0nIH1cIj5cclxuICAgICAgICA8bmctY29udGVudCAgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHAtMiBiZy13aGl0ZSBib3JkZXItMlwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWJhc2VcIj5FZGl0IENvbmZpZ3VyYXRpb248L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGVudD5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICBwVGVtcGxhdGU9XCJjb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IGJnLXdoaXRlIHAtMiBib3JkZXItMiBib3JkZXItZ3JheS0yMDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBtYi04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJvd3NcIiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdy0yNFwiPlJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtyZWFkb25seV09XCJlbmFibGVBUElcIiBbKG5nTW9kZWwpXT1cInJvd3NcIiBwbGFjZWhvbGRlcj1cInJvd3NcIiBjbGFzcz1cImZvcm1fX2lucHV0XCIgaWQ9XCJuYW1lXCIgYXV0b2NvbXBsZXRlPVwicm93c1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBtYi04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVuYWJsZUFQSVwiIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB3LTI0XCI+RW5hYmxlIEFQSTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiZW5hYmxlQVBJXCIgcGxhY2Vob2xkZXI9XCJBUEkgVXJsXCIgaWQ9XCJlbmFibGVBUElcIiBhdXRvY29tcGxldGU9XCJlbmFibGVBUElcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICBAaWYgKGVuYWJsZUFQSSkge1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQgbWItOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFwaVwiIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB3LTI0XCI+QVBJPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiYXBpXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBBUEkgVXJsXCIgaWQ9XCJhcGlcIiBhdXRvY29tcGxldGU9XCJhcGlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBtYi04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1ub2d1dHRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgbWItMyBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGRcIj5Db2x1bW5zOjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRDb2x1bW4oKVwiPkFkZCBDb2x1bW48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZHluYW1pY0Zvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwid2hpdGUtc3BhY2Utbm93cmFwXCI+Q29sdW1uIE5hbWU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiaGVhZGVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb2x1bW4gTmFtZVwiIGNsYXNzPVwiZm9ybV9faW5wdXRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Q29sdW1uIFR5cGU6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImNlbGxUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB0eXBlIG9mIGNvbHVtblR5cGVzXCIgW3ZhbHVlXT1cInR5cGVcIj57e3R5cGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChlbmFibGVBUEkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+QVBJIFZhbHVlIEtleTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImFwaUtleVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgVmFsdWUgS2V5XCIgY2xhc3M9XCJmb3JtX19pbnB1dFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyBvcHRpb25zIGlmIGNvbHVtblR5cGUgaXMgJ3JhZGlvLWdyb3VwJyBvciAnZHJvcGRvd24nIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiWydyYWRpby1ncm91cCcsICdkcm9wZG93biddLmluY2x1ZGVzKGNvbHVtbi52YWx1ZS5jZWxsVHlwZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJvcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZ2V0T3B0aW9ucyhpKS5jb250cm9sczsgbGV0IGogPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImpcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk9wdGlvbiB7eyBqICsgMSB9fTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwib3B0aW9uTmFtZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgb3B0aW9uIG5hbWVcIiBjbGFzcz1cImZvcm1fX2lucHV0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cIm9wdGlvblZhbHVlXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBvcHRpb24gdmFsdWVcIiBjbGFzcz1cImZvcm1fX2lucHV0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdldE9wdGlvbnMoaSkucmVtb3ZlQXQoailcIj5SZW1vdmUgT3B0aW9uPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWRkT3B0aW9uKGkpXCI+QWRkIE9wdGlvbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyBhcGlVcmwgaWYgY29sdW1uVHlwZSBpcyAnc21hcnQtZHJvcGRvd24nIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIlsnc21hcnQtZHJvcGRvd24nXS5pbmNsdWRlcyhjb2x1bW4udmFsdWUuY2VsbFR5cGUpXCIgY2xhc3M9XCJmbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkFQSSBVcmw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYXBpVXJsXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBhcGkgdXJsXCIgY2xhc3M9XCJmb3JtX19pbnB1dFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+VmFsdWUgS2V5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInZhbHVlS2V5XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBWYWx1ZSBLZXlcIiBjbGFzcz1cImZvcm1fX2lucHV0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5MYWJlbCBLZXk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibGFiZWxLZXlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIExhYmVsIEtleVwiIGNsYXNzPVwiZm9ybV9faW5wdXRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjb2x1bW5zLnJlbW92ZUF0KGkpXCI+UmVtb3ZlIENvbHVtbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICBwVGVtcGxhdGU9XCJmb290ZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgYmctYmx1ZS01MDAgZ2FwLTQgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1idXR0b24gbGFiZWw9XCJDYW5jZWxcIiBzZXZlcml0eT1cInNlY29uZGFyeVwiIChjbGljayk9XCJjbG9zZURpYWxvZygpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBzdHlsZUNsYXNzPVwiYm9yZGVyIGJvcmRlci1pbmRpZ28tNjAwXCIgbGFiZWw9XCJTYXZlXCIgKGNsaWNrKT1cInNhdmVDb25maWd1cmF0aW9uKClcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG48L3AtZGlhbG9nPiJdfQ==
@@ -0,0 +1,24 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Output } from '@angular/core';
3
+ import { FxComponent } from '@instantsys-labs/fx';
4
+ import { ButtonModule } from 'primeng/button';
5
+ import { InputTextModule } from 'primeng/inputtext';
6
+ import { ConfigurationPanelComponent } from '../configuration-panel/configuration-panel.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
9
+ export class SettingsPanelComponent extends FxComponent {
10
+ configuration = new EventEmitter();
11
+ visible = false;
12
+ openSettingDialog() {
13
+ this.visible = true;
14
+ }
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SettingsPanelComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
16
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SettingsPanelComponent, isStandalone: true, selector: "fx-settings-panel", outputs: { configuration: "configuration" }, usesInheritance: true, ngImport: i0, template: "<fx-configuration-panel [visible]=\"visible\" (isVisible)=\"visible = $event\" (configuration)=\"configuration.emit($event)\"></fx-configuration-panel>\r\n\r\n<div class=\"fx-element\">\r\n <ng-content></ng-content>\r\n <ng-container *ngIf=\"fxData.$fxForm?.$mode !== FxMode.VIEW\">\r\n <div class=\"fx-overlay border-gray-400 border rounded cursor-pointer\" (click)=\"onElementSelect(fxData)\"\r\n (dblclick)=\"openSettingDialog()\">\r\n <div class=\"fx-actions flex justify-between\">\r\n\r\n <div class=\"bg-gray-700 text-gray-300 px-2 rounded-t ml-2 text-xs flex justify-center items-center\">\r\n <div>#{{ fxData.name }}-<span class=\"text-xs italic\">{{ fxData.id }}</span></div>\r\n </div>\r\n\r\n <div class=\"flex justify-around items-end mr-2\">\r\n <div class=\"cursor-pointer bg-secondary text-white w-8 mr-1 text-center rounded-t\" title=\"Settings\"\r\n (click)=\"fxSettingService.openSetting(fxData)\">\r\n <i class=\"fa fa-cog text-xs\"></i>\r\n </div>\r\n <div (click)=\"deleteElement(fxData)\"\r\n class=\"cursor-pointer bg-red-600 text-white w-8 mr-1 text-center rounded-t\" title=\"Delete\">\r\n <i class=\"fa fa-times text-xs\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container #dynamicComponentContainer></ng-container>\r\n </ng-container>\r\n</div>", styles: [".fx-element{position:relative}.fx-element .fx-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#0000001a;z-index:-1;pointer-events:none;opacity:0}.fx-element:hover .fx-overlay{z-index:1;opacity:1;pointer-events:auto}.fx-element:hover .fx-overlay .fx-actions{position:absolute;margin-top:-26px;height:25px;border-top-right-radius:10px;width:100%;border-top-left-radius:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: InputTextModule }, { kind: "component", type: ConfigurationPanelComponent, selector: "fx-configuration-panel", inputs: ["visible"], outputs: ["isVisible", "configuration"] }] });
17
+ }
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SettingsPanelComponent, decorators: [{
19
+ type: Component,
20
+ args: [{ selector: 'fx-settings-panel', standalone: true, imports: [CommonModule, ButtonModule, InputTextModule, ConfigurationPanelComponent], template: "<fx-configuration-panel [visible]=\"visible\" (isVisible)=\"visible = $event\" (configuration)=\"configuration.emit($event)\"></fx-configuration-panel>\r\n\r\n<div class=\"fx-element\">\r\n <ng-content></ng-content>\r\n <ng-container *ngIf=\"fxData.$fxForm?.$mode !== FxMode.VIEW\">\r\n <div class=\"fx-overlay border-gray-400 border rounded cursor-pointer\" (click)=\"onElementSelect(fxData)\"\r\n (dblclick)=\"openSettingDialog()\">\r\n <div class=\"fx-actions flex justify-between\">\r\n\r\n <div class=\"bg-gray-700 text-gray-300 px-2 rounded-t ml-2 text-xs flex justify-center items-center\">\r\n <div>#{{ fxData.name }}-<span class=\"text-xs italic\">{{ fxData.id }}</span></div>\r\n </div>\r\n\r\n <div class=\"flex justify-around items-end mr-2\">\r\n <div class=\"cursor-pointer bg-secondary text-white w-8 mr-1 text-center rounded-t\" title=\"Settings\"\r\n (click)=\"fxSettingService.openSetting(fxData)\">\r\n <i class=\"fa fa-cog text-xs\"></i>\r\n </div>\r\n <div (click)=\"deleteElement(fxData)\"\r\n class=\"cursor-pointer bg-red-600 text-white w-8 mr-1 text-center rounded-t\" title=\"Delete\">\r\n <i class=\"fa fa-times text-xs\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container #dynamicComponentContainer></ng-container>\r\n </ng-container>\r\n</div>", styles: [".fx-element{position:relative}.fx-element .fx-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#0000001a;z-index:-1;pointer-events:none;opacity:0}.fx-element:hover .fx-overlay{z-index:1;opacity:1;pointer-events:auto}.fx-element:hover .fx-overlay .fx-actions{position:absolute;margin-top:-26px;height:25px;border-top-right-radius:10px;width:100%;border-top-left-radius:10px}\n"] }]
21
+ }], propDecorators: { configuration: [{
22
+ type: Output
23
+ }] } });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvcGFuZWwvc2V0dGluZ3MtcGFuZWwvc2V0dGluZ3MtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvcGFuZWwvc2V0dGluZ3MtcGFuZWwvc2V0dGluZ3MtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBeUIsTUFBTSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2SSxPQUFPLEVBQUUsV0FBVyxFQUFrRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0RBQXNELENBQUM7OztBQVNuRyxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsV0FBVztJQUN6QyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUMzQyxPQUFPLEdBQVksS0FBSyxDQUFDO0lBRXpCLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO3dHQU5RLHNCQUFzQjs0RkFBdEIsc0JBQXNCLGlKQ2ZuQywrOUNBMkJNLHdjRGhCTSxZQUFZLGtJQUFFLFlBQVksOEJBQUUsZUFBZSwrQkFBRSwyQkFBMkI7OzRGQUl2RSxzQkFBc0I7a0JBUGxDLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLDJCQUEyQixDQUFDOzhCQUt2RSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZ4Q29tcG9uZW50LCBGeERhdGEsIEZ4TW9kZSwgRnhTZXR0aW5nQ29tcG9uZW50LCBGeFNldHRpbmdzU2VydmljZSwgRnhVdGlscyB9IGZyb20gJ0BpbnN0YW50c3lzLWxhYnMvZngnO1xyXG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XHJcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcclxuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9jb25maWd1cmF0aW9uLXBhbmVsL2NvbmZpZ3VyYXRpb24tcGFuZWwuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZngtc2V0dGluZ3MtcGFuZWwnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQnV0dG9uTW9kdWxlLCBJbnB1dFRleHRNb2R1bGUsIENvbmZpZ3VyYXRpb25QYW5lbENvbXBvbmVudF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NldHRpbmdzLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc2V0dGluZ3MtcGFuZWwuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFNldHRpbmdzUGFuZWxDb21wb25lbnQgZXh0ZW5kcyBGeENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBAT3V0cHV0KCkgY29uZmlndXJhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgcHVibGljIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgb3BlblNldHRpbmdEaWFsb2coKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XHJcbiAgICB9XHJcbn1cclxuIiwiPGZ4LWNvbmZpZ3VyYXRpb24tcGFuZWwgW3Zpc2libGVdPVwidmlzaWJsZVwiIChpc1Zpc2libGUpPVwidmlzaWJsZSA9ICRldmVudFwiIChjb25maWd1cmF0aW9uKT1cImNvbmZpZ3VyYXRpb24uZW1pdCgkZXZlbnQpXCI+PC9meC1jb25maWd1cmF0aW9uLXBhbmVsPlxyXG5cclxuPGRpdiBjbGFzcz1cImZ4LWVsZW1lbnRcIj5cclxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmeERhdGEuJGZ4Rm9ybT8uJG1vZGUgIT09IEZ4TW9kZS5WSUVXXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZ4LW92ZXJsYXkgYm9yZGVyLWdyYXktNDAwIGJvcmRlciByb3VuZGVkIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uRWxlbWVudFNlbGVjdChmeERhdGEpXCJcclxuICAgICAgICAgICAgKGRibGNsaWNrKT1cIm9wZW5TZXR0aW5nRGlhbG9nKClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZngtYWN0aW9ucyBmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLWdyYXktNzAwIHRleHQtZ3JheS0zMDAgcHgtMiByb3VuZGVkLXQgbWwtMiB0ZXh0LXhzIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXY+I3t7IGZ4RGF0YS5uYW1lIH19LTxzcGFuIGNsYXNzPVwidGV4dC14cyBpdGFsaWNcIj57eyBmeERhdGEuaWQgfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1hcm91bmQgaXRlbXMtZW5kIG1yLTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGJnLXNlY29uZGFyeSB0ZXh0LXdoaXRlIHctOCBtci0xIHRleHQtY2VudGVyIHJvdW5kZWQtdFwiIHRpdGxlPVwiU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImZ4U2V0dGluZ1NlcnZpY2Uub3BlblNldHRpbmcoZnhEYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jb2cgdGV4dC14c1wiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImRlbGV0ZUVsZW1lbnQoZnhEYXRhKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGJnLXJlZC02MDAgdGV4dC13aGl0ZSB3LTggbXItMSB0ZXh0LWNlbnRlciByb3VuZGVkLXRcIiB0aXRsZT1cIkRlbGV0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lcyAgdGV4dC14c1wiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgI2R5bmFtaWNDb21wb25lbnRDb250YWluZXI+PC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Public API Surface of fx-builder-wrapper
3
+ */
4
+ export * from './lib/fx-builder-wrapper.service';
5
+ export * from './lib/fx-builder-wrapper.component'; // builder // admin
6
+ export * from './lib/components/fx-form-component/fx-form-component.component'; // form preview
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2Z4LWJ1aWxkZXItd3JhcHBlci9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxvQ0FBb0MsQ0FBQyxDQUFDLG1CQUFtQjtBQUN2RSxjQUFjLGdFQUFnRSxDQUFDLENBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBmeC1idWlsZGVyLXdyYXBwZXJcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9meC1idWlsZGVyLXdyYXBwZXIuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Z4LWJ1aWxkZXItd3JhcHBlci5jb21wb25lbnQnOyAvLyBidWlsZGVyIC8vIGFkbWluXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvZngtZm9ybS1jb21wb25lbnQvZngtZm9ybS1jb21wb25lbnQuY29tcG9uZW50JzsgLy8gZm9ybSBwcmV2aWV3XHJcbiJdfQ==