@gnggln/ng-ui-system 1.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/gnggln-ng-ui-system.mjs +5 -0
- package/esm2022/lib/components/accordion/accordion.component.mjs +353 -0
- package/esm2022/lib/components/accordion/accordion.types.mjs +6 -0
- package/esm2022/lib/components/accordion/index.mjs +2 -0
- package/esm2022/lib/components/base-layout/base-layout.component.mjs +218 -0
- package/esm2022/lib/components/base-layout/base-layout.types.mjs +6 -0
- package/esm2022/lib/components/base-layout/index.mjs +14 -0
- package/esm2022/lib/components/button/button-area.component.mjs +196 -0
- package/esm2022/lib/components/button/button.component.mjs +164 -0
- package/esm2022/lib/components/button/button.types.mjs +6 -0
- package/esm2022/lib/components/button/index.mjs +16 -0
- package/esm2022/lib/components/crud-table/crud-table.component.mjs +789 -0
- package/esm2022/lib/components/crud-table/crud-table.types.mjs +6 -0
- package/esm2022/lib/components/crud-table/index.mjs +16 -0
- package/esm2022/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
- package/esm2022/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
- package/esm2022/lib/components/form-builder/form-builder.component.mjs +824 -0
- package/esm2022/lib/components/form-builder/form-wizard.component.mjs +510 -0
- package/esm2022/lib/components/form-builder/index.mjs +19 -0
- package/esm2022/lib/components/form-builder/services/form-condition.service.mjs +132 -0
- package/esm2022/lib/components/form-builder/services/form-validation.service.mjs +381 -0
- package/esm2022/lib/components/form-builder/services/location.service.mjs +140 -0
- package/esm2022/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
- package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +161 -0
- package/esm2022/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
- package/esm2022/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
- package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
- package/esm2022/lib/components/form-builder/types/condition.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/field.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/index.mjs +2 -0
- package/esm2022/lib/components/form-builder/types/schema.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/territoriale.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -0
- package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
- package/esm2022/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
- package/esm2022/lib/components/form-builder-editor/index.mjs +21 -0
- package/esm2022/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
- package/esm2022/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
- package/esm2022/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +472 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
- package/esm2022/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
- package/esm2022/lib/components/layout-builder/index.mjs +18 -0
- package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +1730 -0
- package/esm2022/lib/components/layout-builder/layout-builder.types.mjs +9 -0
- package/esm2022/lib/components/layout-builder/layout.service.mjs +239 -0
- package/esm2022/lib/components/modal/confirm-dialog.component.mjs +151 -0
- package/esm2022/lib/components/modal/index.mjs +4 -0
- package/esm2022/lib/components/modal/modal.component.mjs +139 -0
- package/esm2022/lib/components/modal/modal.service.mjs +194 -0
- package/esm2022/lib/components/modal/modal.types.mjs +6 -0
- package/esm2022/lib/components/page-header/breadcrumb.service.mjs +242 -0
- package/esm2022/lib/components/page-header/index.mjs +20 -0
- package/esm2022/lib/components/page-header/page-header.component.mjs +243 -0
- package/esm2022/lib/components/page-header/page-header.types.mjs +21 -0
- package/esm2022/lib/components/table/index.mjs +2 -0
- package/esm2022/lib/components/table/paginated-table.component.mjs +407 -0
- package/esm2022/lib/components/table/table.types.mjs +6 -0
- package/esm2022/lib/core/types/index.mjs +6 -0
- package/esm2022/lib/core/utils/index.mjs +53 -0
- package/esm2022/lib/sources/location-data.opt.json +8942 -0
- package/esm2022/lib/sources/nazioni.opt.json +215 -0
- package/esm2022/public-api.mjs +34 -0
- package/fesm2022/gnggln-ng-ui-system.mjs +55752 -0
- package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/accordion/accordion.component.d.ts +118 -0
- package/lib/components/accordion/accordion.types.d.ts +62 -0
- package/lib/components/accordion/index.d.ts +2 -0
- package/lib/components/base-layout/base-layout.component.d.ts +83 -0
- package/lib/components/base-layout/base-layout.types.d.ts +26 -0
- package/lib/components/base-layout/index.d.ts +13 -0
- package/lib/components/button/button-area.component.d.ts +88 -0
- package/lib/components/button/button.component.d.ts +55 -0
- package/lib/components/button/button.types.d.ts +70 -0
- package/lib/components/button/index.d.ts +15 -0
- package/lib/components/crud-table/crud-table.component.d.ts +143 -0
- package/lib/components/crud-table/crud-table.types.d.ts +207 -0
- package/lib/components/crud-table/index.d.ts +15 -0
- package/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
- package/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
- package/lib/components/form-builder/form-builder.component.d.ts +183 -0
- package/lib/components/form-builder/form-wizard.component.d.ts +87 -0
- package/lib/components/form-builder/index.d.ts +13 -0
- package/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
- package/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
- package/lib/components/form-builder/services/location.service.d.ts +83 -0
- package/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
- package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +28 -0
- package/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
- package/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
- package/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
- package/lib/components/form-builder/types/condition.types.d.ts +51 -0
- package/lib/components/form-builder/types/field.types.d.ts +288 -0
- package/lib/components/form-builder/types/index.d.ts +5 -0
- package/lib/components/form-builder/types/schema.types.d.ts +227 -0
- package/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
- package/lib/components/form-builder/types/validation.types.d.ts +174 -0
- package/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
- package/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
- package/lib/components/form-builder-editor/index.d.ts +15 -0
- package/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
- package/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
- package/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
- package/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
- package/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
- package/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
- package/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
- package/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
- package/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
- package/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
- package/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
- package/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
- package/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
- package/lib/components/layout-builder/index.d.ts +16 -0
- package/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
- package/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
- package/lib/components/layout-builder/layout.service.d.ts +100 -0
- package/lib/components/modal/confirm-dialog.component.d.ts +46 -0
- package/lib/components/modal/index.d.ts +4 -0
- package/lib/components/modal/modal.component.d.ts +44 -0
- package/lib/components/modal/modal.service.d.ts +93 -0
- package/lib/components/modal/modal.types.d.ts +110 -0
- package/lib/components/page-header/breadcrumb.service.d.ts +96 -0
- package/lib/components/page-header/index.d.ts +16 -0
- package/lib/components/page-header/page-header.component.d.ts +59 -0
- package/lib/components/page-header/page-header.types.d.ts +96 -0
- package/lib/components/table/index.d.ts +2 -0
- package/lib/components/table/paginated-table.component.d.ts +85 -0
- package/lib/components/table/table.types.d.ts +81 -0
- package/lib/core/types/index.d.ts +57 -0
- package/lib/core/utils/index.d.ts +29 -0
- package/package.json +44 -0
- package/public-api.d.ts +22 -0
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ChangeDetectorRef, ViewEncapsulation, ViewChild, inject, } from '@angular/core';
|
|
2
|
+
import { LucideAngularModule } from 'lucide-angular';
|
|
3
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
4
|
+
import { UiButtonComponent } from '../../components/button/index';
|
|
5
|
+
import { UiFormBuilderComponent } from './form-builder.component';
|
|
6
|
+
import { UiWizardSyncService } from './services/wizard-sync.service';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "lucide-angular";
|
|
9
|
+
/**
|
|
10
|
+
* Componente wizard che wrappa `UiFormBuilderComponent`
|
|
11
|
+
* aggiungendo navigazione multi-step, barra di progresso,
|
|
12
|
+
* validazione per step e sincronizzazione wireless.
|
|
13
|
+
*
|
|
14
|
+
* @selector ui-form-wizard
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```html
|
|
18
|
+
* <ui-form-wizard
|
|
19
|
+
* [schema]="wizardSchema"
|
|
20
|
+
* [wizardConfig]="wizardConfig"
|
|
21
|
+
* (wizardComplete)="onComplete($event)"
|
|
22
|
+
* (stepChange)="onStepChange($event)"
|
|
23
|
+
* />
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export class UiFormWizardComponent {
|
|
27
|
+
constructor() {
|
|
28
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
29
|
+
this.wizardSync = inject(UiWizardSyncService);
|
|
30
|
+
this.destroy$ = new Subject();
|
|
31
|
+
/** Metodi di validazione custom per step. */
|
|
32
|
+
this.customValidationMethods = {};
|
|
33
|
+
/** Dati iniziali. */
|
|
34
|
+
this.initialData = {};
|
|
35
|
+
/** Modalita sola lettura. */
|
|
36
|
+
this.readonly = false;
|
|
37
|
+
/** Stato disabilitato. */
|
|
38
|
+
this.disabled = false;
|
|
39
|
+
/** Pulsante in caricamento. */
|
|
40
|
+
this.loadingFor = null;
|
|
41
|
+
// ─── Output ─────────────────────────────────────────────────────
|
|
42
|
+
this.stepChange = new EventEmitter();
|
|
43
|
+
this.stepComplete = new EventEmitter();
|
|
44
|
+
this.stepValidationFailed = new EventEmitter();
|
|
45
|
+
this.wizardComplete = new EventEmitter();
|
|
46
|
+
this.valueChange = new EventEmitter();
|
|
47
|
+
this.validationChange = new EventEmitter();
|
|
48
|
+
this.customEvent = new EventEmitter();
|
|
49
|
+
// ─── Stato ──────────────────────────────────────────────────────
|
|
50
|
+
this.state = {
|
|
51
|
+
currentStep: 0,
|
|
52
|
+
totalSteps: 0,
|
|
53
|
+
completedSteps: new Set(),
|
|
54
|
+
visitedSteps: new Set([0]),
|
|
55
|
+
isValid: false,
|
|
56
|
+
stepErrors: {},
|
|
57
|
+
};
|
|
58
|
+
/** Step ordinati per stepNumber. */
|
|
59
|
+
this.wizardSteps = [];
|
|
60
|
+
/** Dati accumulati del form. */
|
|
61
|
+
this.accumulatedData = {};
|
|
62
|
+
/**
|
|
63
|
+
* Schema cachato per lo step corrente.
|
|
64
|
+
* Evita di creare un nuovo oggetto ad ogni ciclo di change detection,
|
|
65
|
+
* cosa che causerebbe rebuild infiniti nel form builder.
|
|
66
|
+
*/
|
|
67
|
+
this._cachedStepSchema = null;
|
|
68
|
+
this._cachedStepIndex = -1;
|
|
69
|
+
}
|
|
70
|
+
// ─── Getter calcolati ───────────────────────────────────────────
|
|
71
|
+
get currentStepSchema() {
|
|
72
|
+
// Se lo step non e cambiato, restituisci lo schema cachato
|
|
73
|
+
if (this._cachedStepIndex === this.state.currentStep && this._cachedStepSchema) {
|
|
74
|
+
return this._cachedStepSchema;
|
|
75
|
+
}
|
|
76
|
+
const step = this.wizardSteps[this.state.currentStep];
|
|
77
|
+
if (!step)
|
|
78
|
+
return null;
|
|
79
|
+
this._cachedStepSchema = {
|
|
80
|
+
id: this.schema.id + '-step-' + this.state.currentStep,
|
|
81
|
+
sections: [step],
|
|
82
|
+
config: { ...this.schema.config, hideFooter: true, showButtons: false },
|
|
83
|
+
};
|
|
84
|
+
this._cachedStepIndex = this.state.currentStep;
|
|
85
|
+
return this._cachedStepSchema;
|
|
86
|
+
}
|
|
87
|
+
get currentStepTitle() {
|
|
88
|
+
const step = this.wizardSteps[this.state.currentStep];
|
|
89
|
+
return step?.wizardStep?.stepTitle || step?.title || '';
|
|
90
|
+
}
|
|
91
|
+
get currentStepDescription() {
|
|
92
|
+
const step = this.wizardSteps[this.state.currentStep];
|
|
93
|
+
return step?.wizardStep?.stepDescription || step?.description || '';
|
|
94
|
+
}
|
|
95
|
+
get isLastStep() {
|
|
96
|
+
return this.state.currentStep >= this.state.totalSteps - 1;
|
|
97
|
+
}
|
|
98
|
+
get progressPercent() {
|
|
99
|
+
if (this.state.totalSteps <= 1)
|
|
100
|
+
return 100;
|
|
101
|
+
return Math.round((this.state.currentStep / (this.state.totalSteps - 1)) * 100);
|
|
102
|
+
}
|
|
103
|
+
// ─── Lifecycle ──────────────────────────────────────────────────
|
|
104
|
+
ngOnInit() {
|
|
105
|
+
if (!this.schema)
|
|
106
|
+
return;
|
|
107
|
+
// Estrai e ordina gli step
|
|
108
|
+
this.wizardSteps = this.schema.sections
|
|
109
|
+
.filter((s) => s.wizardStep)
|
|
110
|
+
.sort((a, b) => (a.wizardStep.stepNumber || 0) - (b.wizardStep.stepNumber || 0));
|
|
111
|
+
this.state.totalSteps = this.wizardSteps.length;
|
|
112
|
+
this.accumulatedData = { ...this.initialData };
|
|
113
|
+
// Sincronizzazione wireless
|
|
114
|
+
if (this.wizardConfig.wizardId) {
|
|
115
|
+
this.syncWizardState();
|
|
116
|
+
// Ascolta navigazione esterna
|
|
117
|
+
this.wizardSync
|
|
118
|
+
.getWizardState$(this.wizardConfig.wizardId)
|
|
119
|
+
.pipe(takeUntil(this.destroy$))
|
|
120
|
+
.subscribe((data) => {
|
|
121
|
+
if (data && data.wizardState.currentStep !== this.state.currentStep) {
|
|
122
|
+
this.navigateToStep(data.wizardState.currentStep);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
ngOnDestroy() {
|
|
128
|
+
this.destroy$.next();
|
|
129
|
+
this.destroy$.complete();
|
|
130
|
+
if (this.wizardConfig?.wizardId) {
|
|
131
|
+
this.wizardSync.unregisterWizard(this.wizardConfig.wizardId);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// ─── Navigazione ────────────────────────────────────────────────
|
|
135
|
+
/** Vai allo step successivo con validazione. */
|
|
136
|
+
async goToNextStep() {
|
|
137
|
+
if (this.isLastStep)
|
|
138
|
+
return;
|
|
139
|
+
// Valida step corrente
|
|
140
|
+
if (!(await this.validateCurrentStep()))
|
|
141
|
+
return;
|
|
142
|
+
// Salva dati step corrente
|
|
143
|
+
this.state.completedSteps.add(this.state.currentStep);
|
|
144
|
+
await this.autoSaveIfNeeded();
|
|
145
|
+
this.navigateToStep(this.state.currentStep + 1);
|
|
146
|
+
}
|
|
147
|
+
/** Torna allo step precedente. */
|
|
148
|
+
goToPreviousStep() {
|
|
149
|
+
if (this.state.currentStep <= 0)
|
|
150
|
+
return;
|
|
151
|
+
this.navigateToStep(this.state.currentStep - 1);
|
|
152
|
+
}
|
|
153
|
+
/** Completa il wizard. */
|
|
154
|
+
async finishWizard() {
|
|
155
|
+
if (!(await this.validateCurrentStep()))
|
|
156
|
+
return;
|
|
157
|
+
this.state.completedSteps.add(this.state.currentStep);
|
|
158
|
+
await this.autoSaveIfNeeded();
|
|
159
|
+
this.wizardComplete.emit(this.accumulatedData);
|
|
160
|
+
}
|
|
161
|
+
/** Salva lo step corrente manualmente. */
|
|
162
|
+
async saveCurrentStep() {
|
|
163
|
+
if (this.wizardConfig.onStepSave) {
|
|
164
|
+
const data = this.formBuilder?.getFormValue() || {};
|
|
165
|
+
await this.wizardConfig.onStepSave(data, this.state.currentStep);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// ─── Callback form builder ─────────────────────────────────────
|
|
169
|
+
onValueChange(data) {
|
|
170
|
+
this.accumulatedData = { ...this.accumulatedData, ...data };
|
|
171
|
+
this.valueChange.emit(this.accumulatedData);
|
|
172
|
+
}
|
|
173
|
+
onValidationChange(state) {
|
|
174
|
+
this.state.isValid = state.valid;
|
|
175
|
+
this.validationChange.emit(state);
|
|
176
|
+
}
|
|
177
|
+
// ─── Navigazione interna ───────────────────────────────────────
|
|
178
|
+
navigateToStep(targetStep) {
|
|
179
|
+
if (targetStep < 0 || targetStep >= this.state.totalSteps)
|
|
180
|
+
return;
|
|
181
|
+
const from = this.state.currentStep;
|
|
182
|
+
this.state.currentStep = targetStep;
|
|
183
|
+
this.state.visitedSteps.add(targetStep);
|
|
184
|
+
// Invalida la cache per forzare la creazione di un nuovo schema
|
|
185
|
+
this._cachedStepSchema = null;
|
|
186
|
+
this._cachedStepIndex = -1;
|
|
187
|
+
this.stepChange.emit({
|
|
188
|
+
from,
|
|
189
|
+
to: targetStep,
|
|
190
|
+
direction: targetStep > from ? 'next' : 'previous',
|
|
191
|
+
});
|
|
192
|
+
this.syncWizardState();
|
|
193
|
+
this.cdr.markForCheck();
|
|
194
|
+
}
|
|
195
|
+
async validateCurrentStep() {
|
|
196
|
+
// Validazione form standard
|
|
197
|
+
this.formBuilder?.validateAllFields();
|
|
198
|
+
const isFormValid = this.formBuilder?.isFormValid() ?? true;
|
|
199
|
+
// Validazione custom per step
|
|
200
|
+
const step = this.wizardSteps[this.state.currentStep];
|
|
201
|
+
const customFnName = step?.wizardStep?.customValidationFn;
|
|
202
|
+
if (customFnName && this.customValidationMethods[customFnName]) {
|
|
203
|
+
const customValid = await this.customValidationMethods[customFnName](this.accumulatedData, this.state.currentStep, isFormValid);
|
|
204
|
+
if (!customValid) {
|
|
205
|
+
this.stepValidationFailed.emit({
|
|
206
|
+
step: this.state.currentStep,
|
|
207
|
+
errors: ['Validazione custom fallita'],
|
|
208
|
+
});
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Se il form non e valido, blocca la navigazione
|
|
213
|
+
if (!isFormValid && step?.wizardStep?.validation?.required !== false) {
|
|
214
|
+
const errors = this.formBuilder?.getDetailedFormErrors().flatMap((e) => e.errors) || [];
|
|
215
|
+
this.stepValidationFailed.emit({
|
|
216
|
+
step: this.state.currentStep,
|
|
217
|
+
errors,
|
|
218
|
+
});
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
this.stepComplete.emit({
|
|
222
|
+
step: this.state.currentStep,
|
|
223
|
+
data: this.formBuilder?.getFormValue() || {},
|
|
224
|
+
});
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
async autoSaveIfNeeded() {
|
|
228
|
+
if (this.wizardConfig.autoSave && this.wizardConfig.onStepSave) {
|
|
229
|
+
const data = this.formBuilder?.getFormValue() || {};
|
|
230
|
+
await this.wizardConfig.onStepSave(data, this.state.currentStep);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
syncWizardState() {
|
|
234
|
+
if (!this.wizardConfig.wizardId)
|
|
235
|
+
return;
|
|
236
|
+
const syncData = {
|
|
237
|
+
wizardId: this.wizardConfig.wizardId,
|
|
238
|
+
wizardState: { ...this.state },
|
|
239
|
+
wizardSteps: this.wizardSteps.map((s) => ({
|
|
240
|
+
title: s.wizardStep?.stepTitle || s.title,
|
|
241
|
+
description: s.wizardStep?.stepDescription || s.description,
|
|
242
|
+
})),
|
|
243
|
+
isWizardMode: true,
|
|
244
|
+
schema: this.schema,
|
|
245
|
+
};
|
|
246
|
+
this.wizardSync.registerWizard(this.wizardConfig.wizardId, syncData);
|
|
247
|
+
}
|
|
248
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
249
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiFormWizardComponent, isStandalone: true, selector: "ui-form-wizard", inputs: { schema: "schema", wizardConfig: "wizardConfig", customValidationMethods: "customValidationMethods", initialData: "initialData", readonly: "readonly", disabled: "disabled", loadingFor: "loadingFor" }, outputs: { stepChange: "stepChange", stepComplete: "stepComplete", stepValidationFailed: "stepValidationFailed", wizardComplete: "wizardComplete", valueChange: "valueChange", validationChange: "validationChange", customEvent: "customEvent" }, viewQueries: [{ propertyName: "formBuilder", first: true, predicate: UiFormBuilderComponent, descendants: true }], ngImport: i0, template: `
|
|
250
|
+
@if (schema && wizardConfig) {
|
|
251
|
+
<div class="ui-form-wizard">
|
|
252
|
+
|
|
253
|
+
<!-- Header wizard (nascosto se wireless) -->
|
|
254
|
+
@if (!wizardConfig.wirelessHeading) {
|
|
255
|
+
<div class="ui-form-wizard__header">
|
|
256
|
+
|
|
257
|
+
@if (wizardConfig.showProgress !== false) {
|
|
258
|
+
<!-- Barra progresso lineare -->
|
|
259
|
+
@if (wizardConfig.progressStyle !== 'steps') {
|
|
260
|
+
<div class="ui-form-wizard__progress-bar">
|
|
261
|
+
<div class="ui-form-wizard__progress-fill"
|
|
262
|
+
[style.width.%]="progressPercent"></div>
|
|
263
|
+
</div>
|
|
264
|
+
<span class="ui-form-wizard__progress-text">
|
|
265
|
+
{{ progressPercent }}% completato
|
|
266
|
+
</span>
|
|
267
|
+
} @else {
|
|
268
|
+
<!-- Step indicators -->
|
|
269
|
+
<div class="ui-form-wizard__steps">
|
|
270
|
+
@for (step of wizardSteps; track $index; let i = $index) {
|
|
271
|
+
<div class="ui-form-wizard__step"
|
|
272
|
+
[class.ui-form-wizard__step--current]="i === state.currentStep"
|
|
273
|
+
[class.ui-form-wizard__step--completed]="state.completedSteps.has(i)"
|
|
274
|
+
[class.ui-form-wizard__step--visited]="state.visitedSteps.has(i)"
|
|
275
|
+
>
|
|
276
|
+
<div class="ui-form-wizard__step-circle">
|
|
277
|
+
@if (state.completedSteps.has(i)) {
|
|
278
|
+
<lucide-icon name="check" [size]="16" />
|
|
279
|
+
} @else {
|
|
280
|
+
<span>{{ i + 1 }}</span>
|
|
281
|
+
}
|
|
282
|
+
</div>
|
|
283
|
+
<div class="ui-form-wizard__step-label">
|
|
284
|
+
{{ step.wizardStep?.stepTitle || step.title || 'Step ' + (i + 1) }}
|
|
285
|
+
</div>
|
|
286
|
+
</div>
|
|
287
|
+
}
|
|
288
|
+
</div>
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
<!-- Info step corrente -->
|
|
293
|
+
<div class="ui-form-wizard__step-info">
|
|
294
|
+
<h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
|
|
295
|
+
@if (currentStepDescription) {
|
|
296
|
+
<p class="ui-form-wizard__step-description">{{ currentStepDescription }}</p>
|
|
297
|
+
}
|
|
298
|
+
<span class="ui-form-wizard__step-counter">
|
|
299
|
+
Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
|
|
300
|
+
</span>
|
|
301
|
+
</div>
|
|
302
|
+
</div>
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
<!-- Form builder per lo step corrente -->
|
|
306
|
+
<ui-form-builder
|
|
307
|
+
[schema]="currentStepSchema!"
|
|
308
|
+
[initialData]="initialData"
|
|
309
|
+
[readonly]="readonly"
|
|
310
|
+
[disabled]="disabled"
|
|
311
|
+
[loadingFor]="loadingFor"
|
|
312
|
+
(valueChange)="onValueChange($event)"
|
|
313
|
+
(validationChange)="onValidationChange($event)"
|
|
314
|
+
(customEvent)="customEvent.emit($event)"
|
|
315
|
+
/>
|
|
316
|
+
|
|
317
|
+
<!-- Footer navigazione -->
|
|
318
|
+
@if (wizardConfig.showNavigationButtons !== false) {
|
|
319
|
+
<div class="ui-form-wizard__footer">
|
|
320
|
+
@if (wizardConfig.allowBackNavigation !== false && state.currentStep > 0) {
|
|
321
|
+
<ui-button
|
|
322
|
+
label="{{ wizardConfig.buttonLabels?.previous || 'Indietro' }}"
|
|
323
|
+
variant="outline"
|
|
324
|
+
icon="chevron-left"
|
|
325
|
+
(click)="goToPreviousStep()"
|
|
326
|
+
/>
|
|
327
|
+
} @else {
|
|
328
|
+
<div></div>
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
<div class="ui-form-wizard__footer-right">
|
|
332
|
+
@if (wizardConfig.autoSave && wizardConfig.buttonLabels?.save) {
|
|
333
|
+
<ui-button
|
|
334
|
+
[label]="wizardConfig.buttonLabels!.save!"
|
|
335
|
+
variant="outline"
|
|
336
|
+
(click)="saveCurrentStep()"
|
|
337
|
+
/>
|
|
338
|
+
}
|
|
339
|
+
@if (isLastStep) {
|
|
340
|
+
<ui-button
|
|
341
|
+
label="{{ wizardConfig.buttonLabels?.finish || 'Completa' }}"
|
|
342
|
+
variant="primary"
|
|
343
|
+
icon="check"
|
|
344
|
+
iconPosition="trailing"
|
|
345
|
+
(click)="finishWizard()"
|
|
346
|
+
/>
|
|
347
|
+
} @else {
|
|
348
|
+
<ui-button
|
|
349
|
+
label="{{ wizardConfig.buttonLabels?.next || 'Avanti' }}"
|
|
350
|
+
variant="primary"
|
|
351
|
+
icon="chevron-right"
|
|
352
|
+
iconPosition="trailing"
|
|
353
|
+
(click)="goToNextStep()"
|
|
354
|
+
/>
|
|
355
|
+
}
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
}
|
|
359
|
+
</div>
|
|
360
|
+
}
|
|
361
|
+
`, isInline: true, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}\n"], dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["label", "tooltip", "variant", "size", "icon", "iconPosition", "loading", "disabled", "fullWidth", "type", "ariaLabel", "customClass"] }, { kind: "component", type: UiFormBuilderComponent, selector: "ui-form-builder", inputs: ["schema", "initialData", "readonly", "disabled", "buttonsOverride", "loadingFor"], outputs: ["valueChange", "validationChange", "formSubmit", "formReset", "customEvent"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
362
|
+
}
|
|
363
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, decorators: [{
|
|
364
|
+
type: Component,
|
|
365
|
+
args: [{ selector: 'ui-form-wizard', standalone: true, imports: [LucideAngularModule, UiButtonComponent, UiFormBuilderComponent], encapsulation: ViewEncapsulation.None, template: `
|
|
366
|
+
@if (schema && wizardConfig) {
|
|
367
|
+
<div class="ui-form-wizard">
|
|
368
|
+
|
|
369
|
+
<!-- Header wizard (nascosto se wireless) -->
|
|
370
|
+
@if (!wizardConfig.wirelessHeading) {
|
|
371
|
+
<div class="ui-form-wizard__header">
|
|
372
|
+
|
|
373
|
+
@if (wizardConfig.showProgress !== false) {
|
|
374
|
+
<!-- Barra progresso lineare -->
|
|
375
|
+
@if (wizardConfig.progressStyle !== 'steps') {
|
|
376
|
+
<div class="ui-form-wizard__progress-bar">
|
|
377
|
+
<div class="ui-form-wizard__progress-fill"
|
|
378
|
+
[style.width.%]="progressPercent"></div>
|
|
379
|
+
</div>
|
|
380
|
+
<span class="ui-form-wizard__progress-text">
|
|
381
|
+
{{ progressPercent }}% completato
|
|
382
|
+
</span>
|
|
383
|
+
} @else {
|
|
384
|
+
<!-- Step indicators -->
|
|
385
|
+
<div class="ui-form-wizard__steps">
|
|
386
|
+
@for (step of wizardSteps; track $index; let i = $index) {
|
|
387
|
+
<div class="ui-form-wizard__step"
|
|
388
|
+
[class.ui-form-wizard__step--current]="i === state.currentStep"
|
|
389
|
+
[class.ui-form-wizard__step--completed]="state.completedSteps.has(i)"
|
|
390
|
+
[class.ui-form-wizard__step--visited]="state.visitedSteps.has(i)"
|
|
391
|
+
>
|
|
392
|
+
<div class="ui-form-wizard__step-circle">
|
|
393
|
+
@if (state.completedSteps.has(i)) {
|
|
394
|
+
<lucide-icon name="check" [size]="16" />
|
|
395
|
+
} @else {
|
|
396
|
+
<span>{{ i + 1 }}</span>
|
|
397
|
+
}
|
|
398
|
+
</div>
|
|
399
|
+
<div class="ui-form-wizard__step-label">
|
|
400
|
+
{{ step.wizardStep?.stepTitle || step.title || 'Step ' + (i + 1) }}
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
}
|
|
404
|
+
</div>
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
<!-- Info step corrente -->
|
|
409
|
+
<div class="ui-form-wizard__step-info">
|
|
410
|
+
<h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
|
|
411
|
+
@if (currentStepDescription) {
|
|
412
|
+
<p class="ui-form-wizard__step-description">{{ currentStepDescription }}</p>
|
|
413
|
+
}
|
|
414
|
+
<span class="ui-form-wizard__step-counter">
|
|
415
|
+
Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
|
|
416
|
+
</span>
|
|
417
|
+
</div>
|
|
418
|
+
</div>
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
<!-- Form builder per lo step corrente -->
|
|
422
|
+
<ui-form-builder
|
|
423
|
+
[schema]="currentStepSchema!"
|
|
424
|
+
[initialData]="initialData"
|
|
425
|
+
[readonly]="readonly"
|
|
426
|
+
[disabled]="disabled"
|
|
427
|
+
[loadingFor]="loadingFor"
|
|
428
|
+
(valueChange)="onValueChange($event)"
|
|
429
|
+
(validationChange)="onValidationChange($event)"
|
|
430
|
+
(customEvent)="customEvent.emit($event)"
|
|
431
|
+
/>
|
|
432
|
+
|
|
433
|
+
<!-- Footer navigazione -->
|
|
434
|
+
@if (wizardConfig.showNavigationButtons !== false) {
|
|
435
|
+
<div class="ui-form-wizard__footer">
|
|
436
|
+
@if (wizardConfig.allowBackNavigation !== false && state.currentStep > 0) {
|
|
437
|
+
<ui-button
|
|
438
|
+
label="{{ wizardConfig.buttonLabels?.previous || 'Indietro' }}"
|
|
439
|
+
variant="outline"
|
|
440
|
+
icon="chevron-left"
|
|
441
|
+
(click)="goToPreviousStep()"
|
|
442
|
+
/>
|
|
443
|
+
} @else {
|
|
444
|
+
<div></div>
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
<div class="ui-form-wizard__footer-right">
|
|
448
|
+
@if (wizardConfig.autoSave && wizardConfig.buttonLabels?.save) {
|
|
449
|
+
<ui-button
|
|
450
|
+
[label]="wizardConfig.buttonLabels!.save!"
|
|
451
|
+
variant="outline"
|
|
452
|
+
(click)="saveCurrentStep()"
|
|
453
|
+
/>
|
|
454
|
+
}
|
|
455
|
+
@if (isLastStep) {
|
|
456
|
+
<ui-button
|
|
457
|
+
label="{{ wizardConfig.buttonLabels?.finish || 'Completa' }}"
|
|
458
|
+
variant="primary"
|
|
459
|
+
icon="check"
|
|
460
|
+
iconPosition="trailing"
|
|
461
|
+
(click)="finishWizard()"
|
|
462
|
+
/>
|
|
463
|
+
} @else {
|
|
464
|
+
<ui-button
|
|
465
|
+
label="{{ wizardConfig.buttonLabels?.next || 'Avanti' }}"
|
|
466
|
+
variant="primary"
|
|
467
|
+
icon="chevron-right"
|
|
468
|
+
iconPosition="trailing"
|
|
469
|
+
(click)="goToNextStep()"
|
|
470
|
+
/>
|
|
471
|
+
}
|
|
472
|
+
</div>
|
|
473
|
+
</div>
|
|
474
|
+
}
|
|
475
|
+
</div>
|
|
476
|
+
}
|
|
477
|
+
`, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}\n"] }]
|
|
478
|
+
}], propDecorators: { formBuilder: [{
|
|
479
|
+
type: ViewChild,
|
|
480
|
+
args: [UiFormBuilderComponent]
|
|
481
|
+
}], schema: [{
|
|
482
|
+
type: Input
|
|
483
|
+
}], wizardConfig: [{
|
|
484
|
+
type: Input
|
|
485
|
+
}], customValidationMethods: [{
|
|
486
|
+
type: Input
|
|
487
|
+
}], initialData: [{
|
|
488
|
+
type: Input
|
|
489
|
+
}], readonly: [{
|
|
490
|
+
type: Input
|
|
491
|
+
}], disabled: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}], loadingFor: [{
|
|
494
|
+
type: Input
|
|
495
|
+
}], stepChange: [{
|
|
496
|
+
type: Output
|
|
497
|
+
}], stepComplete: [{
|
|
498
|
+
type: Output
|
|
499
|
+
}], stepValidationFailed: [{
|
|
500
|
+
type: Output
|
|
501
|
+
}], wizardComplete: [{
|
|
502
|
+
type: Output
|
|
503
|
+
}], valueChange: [{
|
|
504
|
+
type: Output
|
|
505
|
+
}], validationChange: [{
|
|
506
|
+
type: Output
|
|
507
|
+
}], customEvent: [{
|
|
508
|
+
type: Output
|
|
509
|
+
}] } });
|
|
510
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS13aXphcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZm9ybS13aXphcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBYWxFLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSxnQ0FBZ0MsQ0FBQzs7O0FBRXZGOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBeUhILE1BQU0sT0FBTyxxQkFBcUI7SUF4SGxDO1FBeUhtQixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBWWhELDZDQUE2QztRQUNwQyw0QkFBdUIsR0FBeUMsRUFBRSxDQUFDO1FBRTVFLHFCQUFxQjtRQUNaLGdCQUFXLEdBQWUsRUFBRSxDQUFDO1FBRXRDLDZCQUE2QjtRQUNwQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCLDBCQUEwQjtRQUNqQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCLCtCQUErQjtR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QixxQkFBcUIsNGpCQUtyQixzQkFBc0IsZ0RBeEh2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdIVCxzL0ZBbEhTLG1CQUFtQixnUEFBRSxpQkFBaUIsdU1BQUUsc0JBQXNCOzs0RkFxSDdELHFCQUFxQjtrQkF4SGpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsaUJBQzFELGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnSFQ7OEJBUWtDLFdBQVc7c0JBQTdDLFNBQVM7dUJBQUMsc0JBQXNCO2dCQUt4QixNQUFNO3NCQUFkLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFJSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBWaWV3Q2hpbGQsXHJcbiAgaW5qZWN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlIH0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVWlCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2J1dHRvbi9pbmRleCc7XHJcblxyXG5pbXBvcnQgeyBVaUZvcm1CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLWJ1aWxkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBVaUZvcm1TY2hlbWEsXHJcbiAgVWlGb3JtU2VjdGlvbixcclxuICBVaUZvcm1EYXRhLFxyXG4gIFVpV2l6YXJkQ29uZmlnLFxyXG4gIFVpV2l6YXJkU3RhdGUsXHJcbiAgVWlXaXphcmRTdGVwQ2hhbmdlRXZlbnQsXHJcbiAgVWlXaXphcmRTdGVwQ29tcGxldGVFdmVudCxcclxuICBVaVdpemFyZFZhbGlkYXRpb25GbixcclxuICBVaUZvcm1DdXN0b21FdmVudCxcclxufSBmcm9tICcuL3R5cGVzL3NjaGVtYS50eXBlcyc7XHJcbmltcG9ydCB7IFVpRm9ybVZhbGlkYXRpb25TdGF0ZSB9IGZyb20gJy4vdHlwZXMvdmFsaWRhdGlvbi50eXBlcyc7XHJcbmltcG9ydCB7IFVpV2l6YXJkU3luY1NlcnZpY2UsIFVpV2l6YXJkU3luY0RhdGEgfSBmcm9tICcuL3NlcnZpY2VzL3dpemFyZC1zeW5jLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgd2l6YXJkIGNoZSB3cmFwcGEgYFVpRm9ybUJ1aWxkZXJDb21wb25lbnRgXHJcbiAqIGFnZ2l1bmdlbmRvIG5hdmlnYXppb25lIG11bHRpLXN0ZXAsIGJhcnJhIGRpIHByb2dyZXNzbyxcclxuICogdmFsaWRhemlvbmUgcGVyIHN0ZXAgZSBzaW5jcm9uaXp6YXppb25lIHdpcmVsZXNzLlxyXG4gKlxyXG4gKiBAc2VsZWN0b3IgdWktZm9ybS13aXphcmRcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8dWktZm9ybS13aXphcmRcclxuICogICBbc2NoZW1hXT1cIndpemFyZFNjaGVtYVwiXHJcbiAqICAgW3dpemFyZENvbmZpZ109XCJ3aXphcmRDb25maWdcIlxyXG4gKiAgICh3aXphcmRDb21wbGV0ZSk9XCJvbkNvbXBsZXRlKCRldmVudClcIlxyXG4gKiAgIChzdGVwQ2hhbmdlKT1cIm9uU3RlcENoYW5nZSgkZXZlbnQpXCJcclxuICogLz5cclxuICogYGBgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLWZvcm0td2l6YXJkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtMdWNpZGVBbmd1bGFyTW9kdWxlLCBVaUJ1dHRvbkNvbXBvbmVudCwgVWlGb3JtQnVpbGRlckNvbXBvbmVudF0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgQGlmIChzY2hlbWEgJiYgd2l6YXJkQ29uZmlnKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZFwiPlxyXG5cclxuICAgICAgICA8IS0tIEhlYWRlciB3aXphcmQgKG5hc2Nvc3RvIHNlIHdpcmVsZXNzKSAtLT5cclxuICAgICAgICBAaWYgKCF3aXphcmRDb25maWcud2lyZWxlc3NIZWFkaW5nKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2hlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgQGlmICh3aXphcmRDb25maWcuc2hvd1Byb2dyZXNzICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIDwhLS0gQmFycmEgcHJvZ3Jlc3NvIGxpbmVhcmUgLS0+XHJcbiAgICAgICAgICAgICAgQGlmICh3aXphcmRDb25maWcucHJvZ3Jlc3NTdHlsZSAhPT0gJ3N0ZXBzJykge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1iYXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1maWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fcHJvZ3Jlc3MtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBwcm9ncmVzc1BlcmNlbnQgfX0lIGNvbXBsZXRhdG9cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDwhLS0gU3RlcCBpbmRpY2F0b3JzIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwc1wiPlxyXG4gICAgICAgICAgICAgICAgICBAZm9yIChzdGVwIG9mIHdpemFyZFN0ZXBzOyB0cmFjayAkaW5kZXg7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy51aS1mb3JtLXdpemFyZF9fc3RlcC0tY3VycmVudF09XCJpID09PSBzdGF0ZS5jdXJyZW50U3RlcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLWNvbXBsZXRlZF09XCJzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnVpLWZvcm0td2l6YXJkX19zdGVwLS12aXNpdGVkXT1cInN0YXRlLnZpc2l0ZWRTdGVwcy5oYXMoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpICsgMSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RlcC53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgc3RlcC50aXRsZSB8fCAnU3RlcCAnICsgKGkgKyAxKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPCEtLSBJbmZvIHN0ZXAgY29ycmVudGUgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtdGl0bGVcIj57eyBjdXJyZW50U3RlcFRpdGxlIH19PC9oMj5cclxuICAgICAgICAgICAgICBAaWYgKGN1cnJlbnRTdGVwRGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtZGVzY3JpcHRpb25cIj57eyBjdXJyZW50U3RlcERlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWNvdW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIFBhc3NvIHt7IHN0YXRlLmN1cnJlbnRTdGVwICsgMSB9fSBkaSB7eyBzdGF0ZS50b3RhbFN0ZXBzIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBGb3JtIGJ1aWxkZXIgcGVyIGxvIHN0ZXAgY29ycmVudGUgLS0+XHJcbiAgICAgICAgPHVpLWZvcm0tYnVpbGRlclxyXG4gICAgICAgICAgW3NjaGVtYV09XCJjdXJyZW50U3RlcFNjaGVtYSFcIlxyXG4gICAgICAgICAgW2luaXRpYWxEYXRhXT1cImluaXRpYWxEYXRhXCJcclxuICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2xvYWRpbmdGb3JdPVwibG9hZGluZ0ZvclwiXHJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICh2YWxpZGF0aW9uQ2hhbmdlKT1cIm9uVmFsaWRhdGlvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChjdXN0b21FdmVudCk9XCJjdXN0b21FdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDwhLS0gRm9vdGVyIG5hdmlnYXppb25lIC0tPlxyXG4gICAgICAgIEBpZiAod2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIEBpZiAod2l6YXJkQ29uZmlnLmFsbG93QmFja05hdmlnYXRpb24gIT09IGZhbHNlICYmIHN0YXRlLmN1cnJlbnRTdGVwID4gMCkge1xyXG4gICAgICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgICAgIGxhYmVsPVwie3sgd2l6YXJkQ29uZmlnLmJ1dHRvbkxhYmVscz8ucHJldmlvdXMgfHwgJ0luZGlldHJvJyB9fVwiXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICBpY29uPVwiY2hldnJvbi1sZWZ0XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXNTdGVwKClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgQGlmICh3aXphcmRDb25maWcuYXV0b1NhdmUgJiYgd2l6YXJkQ29uZmlnLmJ1dHRvbkxhYmVscz8uc2F2ZSkge1xyXG4gICAgICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwid2l6YXJkQ29uZmlnLmJ1dHRvbkxhYmVscyEuc2F2ZSFcIlxyXG4gICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlQ3VycmVudFN0ZXAoKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKGlzTGFzdFN0ZXApIHtcclxuICAgICAgICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eyB3aXphcmRDb25maWcuYnV0dG9uTGFiZWxzPy5maW5pc2ggfHwgJ0NvbXBsZXRhJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgaWNvbj1cImNoZWNrXCJcclxuICAgICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInRyYWlsaW5nXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmaW5pc2hXaXphcmQoKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cInt7IHdpemFyZENvbmZpZy5idXR0b25MYWJlbHM/Lm5leHQgfHwgJ0F2YW50aScgfX1cIlxyXG4gICAgICAgICAgICAgICAgICB2YXJpYW50PVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgIGljb249XCJjaGV2cm9uLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInRyYWlsaW5nXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvTmV4dFN0ZXAoKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIGAsXHJcbiAgc3R5bGVVcmw6ICcuL2Zvcm0td2l6YXJkLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpRm9ybVdpemFyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aXphcmRTeW5jID0gaW5qZWN0KFVpV2l6YXJkU3luY1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKFVpRm9ybUJ1aWxkZXJDb21wb25lbnQpIGZvcm1CdWlsZGVyPzogVWlGb3JtQnVpbGRlckNvbXBvbmVudDtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIElucHV0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogU2NoZW1hIGNvbXBsZXRvIGRlbCBmb3JtICh0dXR0ZSBsZSBzZXppb25pIGNvbiB3aXphcmRTdGVwKS4gKi9cclxuICBASW5wdXQoKSBzY2hlbWEhOiBVaUZvcm1TY2hlbWE7XHJcblxyXG4gIC8qKiBDb25maWd1cmF6aW9uZSBkZWwgd2l6YXJkLiAqL1xyXG4gIEBJbnB1dCgpIHdpemFyZENvbmZpZyE6IFVpV2l6YXJkQ29uZmlnO1xyXG5cclxuICAvKiogTWV0b2RpIGRpIHZhbGlkYXppb25lIGN1c3RvbSBwZXIgc3RlcC4gKi9cclxuICBASW5wdXQoKSBjdXN0b21WYWxpZGF0aW9uTWV0aG9kczogUmVjb3JkPHN0cmluZywgVWlXaXphcmRWYWxpZGF0aW9uRm4+ID0ge307XHJcblxyXG4gIC8qKiBEYXRpIGluaXppYWxpLiAqL1xyXG4gIEBJbnB1dCgpIGluaXRpYWxEYXRhOiBVaUZvcm1EYXRhID0ge307XHJcblxyXG4gIC8qKiBNb2RhbGl0YSBzb2xhIGxldHR1cmEuICovXHJcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFN0YXRvIGRpc2FiaWxpdGF0by4gKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKiogUHVsc2FudGUgaW4gY2FyaWNhbWVudG8uICovXHJcbiAgQElucHV0KCkgbG9hZGluZ0Zvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBPdXRwdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDaGFuZ2VFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgc3RlcENvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDb21wbGV0ZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBzdGVwVmFsaWRhdGlvbkZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBudW1iZXI7IGVycm9yczogc3RyaW5nW10gfT4oKTtcclxuICBAT3V0cHV0KCkgd2l6YXJkQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybURhdGE+KCk7XHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1EYXRhPigpO1xyXG4gIEBPdXRwdXQoKSB2YWxpZGF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1WYWxpZGF0aW9uU3RhdGU+KCk7XHJcbiAgQE91dHB1dCgpIGN1c3RvbUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1DdXN0b21FdmVudD4oKTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIFN0YXRvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBzdGF0ZTogVWlXaXphcmRTdGF0ZSA9IHtcclxuICAgIGN1cnJlbnRTdGVwOiAwLFxyXG4gICAgdG90YWxTdGVwczogMCxcclxuICAgIGNvbXBsZXRlZFN0ZXBzOiBuZXcgU2V0PG51bWJlcj4oKSxcclxuICAgIHZpc2l0ZWRTdGVwczogbmV3IFNldDxudW1iZXI+KFswXSksXHJcbiAgICBpc1ZhbGlkOiBmYWxzZSxcclxuICAgIHN0ZXBFcnJvcnM6IHt9LFxyXG4gIH07XHJcblxyXG4gIC8qKiBTdGVwIG9yZGluYXRpIHBlciBzdGVwTnVtYmVyLiAqL1xyXG4gIHdpemFyZFN0ZXBzOiBVaUZvcm1TZWN0aW9uW10gPSBbXTtcclxuXHJcbiAgLyoqIERhdGkgYWNjdW11bGF0aSBkZWwgZm9ybS4gKi9cclxuICBwcml2YXRlIGFjY3VtdWxhdGVkRGF0YTogVWlGb3JtRGF0YSA9IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBTY2hlbWEgY2FjaGF0byBwZXIgbG8gc3RlcCBjb3JyZW50ZS5cclxuICAgKiBFdml0YSBkaSBjcmVhcmUgdW4gbnVvdm8gb2dnZXR0byBhZCBvZ25pIGNpY2xvIGRpIGNoYW5nZSBkZXRlY3Rpb24sXHJcbiAgICogY29zYSBjaGUgY2F1c2VyZWJiZSByZWJ1aWxkIGluZmluaXRpIG5lbCBmb3JtIGJ1aWxkZXIuXHJcbiAgICovXHJcbiAgX2NhY2hlZFN0ZXBTY2hlbWE6IFVpRm9ybVNjaGVtYSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2NhY2hlZFN0ZXBJbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBHZXR0ZXIgY2FsY29sYXRpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBnZXQgY3VycmVudFN0ZXBTY2hlbWEoKTogVWlGb3JtU2NoZW1hIHwgbnVsbCB7XHJcbiAgICAvLyBTZSBsbyBzdGVwIG5vbiBlIGNhbWJpYXRvLCByZXN0aXR1aXNjaSBsbyBzY2hlbWEgY2FjaGF0b1xyXG4gICAgaWYgKHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9PT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAmJiB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLndpemFyZFN0ZXBzW3RoaXMuc3RhdGUuY3VycmVudFN0ZXBdO1xyXG4gICAgaWYgKCFzdGVwKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hID0ge1xyXG4gICAgICBpZDogdGhpcy5zY2hlbWEuaWQgKyAnLXN0ZXAtJyArIHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIHNlY3Rpb25zOiBbc3RlcF0sXHJcbiAgICAgIGNvbmZpZzogeyAuLi50aGlzLnNjaGVtYS5jb25maWcsIGhpZGVGb290ZXI6IHRydWUsIHNob3dCdXR0b25zOiBmYWxzZSB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9IHRoaXMuc3RhdGUuY3VycmVudFN0ZXA7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3RlcFNjaGVtYTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50U3RlcFRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy53aXphcmRTdGVwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXTtcclxuICAgIHJldHVybiBzdGVwPy53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgc3RlcD8udGl0bGUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudFN0ZXBEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMud2l6YXJkU3RlcHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF07XHJcbiAgICByZXR1cm4gc3RlcD8ud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IHN0ZXA/LmRlc2NyaXB0aW9uIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCA+PSB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgLSAxO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUudG90YWxTdGVwcyA8PSAxKSByZXR1cm4gMTAwO1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgLyAodGhpcy5zdGF0ZS50b3RhbFN0ZXBzIC0gMSkpICogMTAwKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNjaGVtYSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIEVzdHJhaSBlIG9yZGluYSBnbGkgc3RlcFxyXG4gICAgdGhpcy53aXphcmRTdGVwcyA9IHRoaXMuc2NoZW1hLnNlY3Rpb25zXHJcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMud2l6YXJkU3RlcClcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCkgLSAoYi53aXphcmRTdGVwIS5zdGVwTnVtYmVyIHx8IDApKTtcclxuXHJcbiAgICB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgPSB0aGlzLndpemFyZFN0ZXBzLmxlbmd0aDtcclxuICAgIHRoaXMuYWNjdW11bGF0ZWREYXRhID0geyAuLi50aGlzLmluaXRpYWxEYXRhIH07XHJcblxyXG4gICAgLy8gU2luY3Jvbml6emF6aW9uZSB3aXJlbGVzc1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkKSB7XHJcbiAgICAgIHRoaXMuc3luY1dpemFyZFN0YXRlKCk7XHJcblxyXG4gICAgICAvLyBBc2NvbHRhIG5hdmlnYXppb25lIGVzdGVybmFcclxuICAgICAgdGhpcy53aXphcmRTeW5jXHJcbiAgICAgICAgLmdldFdpemFyZFN0YXRlJCh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZClcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS53aXphcmRTdGF0ZS5jdXJyZW50U3RlcCAhPT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCkge1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKGRhdGEud2l6YXJkU3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQpIHtcclxuICAgICAgdGhpcy53aXphcmRTeW5jLnVucmVnaXN0ZXJXaXphcmQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIE5hdmlnYXppb25lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogVmFpIGFsbG8gc3RlcCBzdWNjZXNzaXZvIGNvbiB2YWxpZGF6aW9uZS4gKi9cclxuICBhc3luYyBnb1RvTmV4dFN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc0xhc3RTdGVwKSByZXR1cm47XHJcblxyXG4gICAgLy8gVmFsaWRhIHN0ZXAgY29ycmVudGVcclxuICAgIGlmICghKGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCgpKSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFNhbHZhIGRhdGkgc3RlcCBjb3JyZW50ZVxyXG4gICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5hZGQodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICBhd2FpdCB0aGlzLmF1dG9TYXZlSWZOZWVkZWQoKTtcclxuXHJcbiAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgKyAxKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb3JuYSBhbGxvIHN0ZXAgcHJlY2VkZW50ZS4gKi9cclxuICBnb1RvUHJldmlvdXNTdGVwKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPD0gMCkgcmV0dXJuO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcCh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ29tcGxldGEgaWwgd2l6YXJkLiAqL1xyXG4gIGFzeW5jIGZpbmlzaFdpemFyZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghKGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCgpKSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMuYWRkKHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgYXdhaXQgdGhpcy5hdXRvU2F2ZUlmTmVlZGVkKCk7XHJcblxyXG4gICAgdGhpcy53aXphcmRDb21wbGV0ZS5lbWl0KHRoaXMuYWNjdW11bGF0ZWREYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBTYWx2YSBsbyBzdGVwIGNvcnJlbnRlIG1hbnVhbG1lbnRlLiAqL1xyXG4gIGFzeW5jIHNhdmVDdXJyZW50U3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fTtcclxuICAgICAgYXdhaXQgdGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZShkYXRhLCB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBDYWxsYmFjayBmb3JtIGJ1aWxkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIG9uVmFsdWVDaGFuZ2UoZGF0YTogVWlGb3JtRGF0YSk6IHZvaWQge1xyXG4gICAgdGhpcy5hY2N1bXVsYXRlZERhdGEgPSB7IC4uLnRoaXMuYWNjdW11bGF0ZWREYXRhLCAuLi5kYXRhIH07XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5hY2N1bXVsYXRlZERhdGEpO1xyXG4gIH1cclxuXHJcbiAgb25WYWxpZGF0aW9uQ2hhbmdlKHN0YXRlOiBVaUZvcm1WYWxpZGF0aW9uU3RhdGUpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGUuaXNWYWxpZCA9IHN0YXRlLnZhbGlkO1xyXG4gICAgdGhpcy52YWxpZGF0aW9uQ2hhbmdlLmVtaXQoc3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIE5hdmlnYXppb25lIGludGVybmEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgbmF2aWdhdGVUb1N0ZXAodGFyZ2V0U3RlcDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGFyZ2V0U3RlcCA8IDAgfHwgdGFyZ2V0U3RlcCA+PSB0aGlzLnN0YXRlLnRvdGFsU3RlcHMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBmcm9tID0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcDtcclxuICAgIHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPSB0YXJnZXRTdGVwO1xyXG4gICAgdGhpcy5zdGF0ZS52aXNpdGVkU3RlcHMuYWRkKHRhcmdldFN0ZXApO1xyXG5cclxuICAgIC8vIEludmFsaWRhIGxhIGNhY2hlIHBlciBmb3J6YXJlIGxhIGNyZWF6aW9uZSBkaSB1biBudW92byBzY2hlbWFcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWEgPSBudWxsO1xyXG4gICAgdGhpcy5fY2FjaGVkU3RlcEluZGV4ID0gLTE7XHJcblxyXG4gICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBmcm9tLFxyXG4gICAgICB0bzogdGFyZ2V0U3RlcCxcclxuICAgICAgZGlyZWN0aW9uOiB0YXJnZXRTdGVwID4gZnJvbSA/ICduZXh0JyA6ICdwcmV2aW91cycsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN5bmNXaXphcmRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQ3VycmVudFN0ZXAoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBWYWxpZGF6aW9uZSBmb3JtIHN0YW5kYXJkXHJcbiAgICB0aGlzLmZvcm1CdWlsZGVyPy52YWxpZGF0ZUFsbEZpZWxkcygpO1xyXG4gICAgY29uc3QgaXNGb3JtVmFsaWQgPSB0aGlzLmZvcm1CdWlsZGVyPy5pc0Zvcm1WYWxpZCgpID8/IHRydWU7XHJcblxyXG4gICAgLy8gVmFsaWRhemlvbmUgY3VzdG9tIHBlciBzdGVwXHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy53aXphcmRTdGVwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXTtcclxuICAgIGNvbnN0IGN1c3RvbUZuTmFtZSA9IHN0ZXA/LndpemFyZFN0ZXA/LmN1c3RvbVZhbGlkYXRpb25GbjtcclxuXHJcbiAgICBpZiAoY3VzdG9tRm5OYW1lICYmIHRoaXMuY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHNbY3VzdG9tRm5OYW1lXSkge1xyXG4gICAgICBjb25zdCBjdXN0b21WYWxpZCA9IGF3YWl0IHRoaXMuY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHNbY3VzdG9tRm5OYW1lXShcclxuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSxcclxuICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIGlzRm9ybVZhbGlkLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFjdXN0b21WYWxpZCkge1xyXG4gICAgICAgIHRoaXMuc3RlcFZhbGlkYXRpb25GYWlsZWQuZW1pdCh7XHJcbiAgICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgICAgZXJyb3JzOiBbJ1ZhbGlkYXppb25lIGN1c3RvbSBmYWxsaXRhJ10sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2UgaWwgZm9ybSBub24gZSB2YWxpZG8sIGJsb2NjYSBsYSBuYXZpZ2F6aW9uZVxyXG4gICAgaWYgKCFpc0Zvcm1WYWxpZCAmJiBzdGVwPy53aXphcmRTdGVwPy52YWxpZGF0aW9uPy5yZXF1aXJlZCAhPT0gZmFsc2UpIHtcclxuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCkuZmxhdE1hcCgoZSkgPT4gZS5lcnJvcnMpIHx8IFtdO1xyXG4gICAgICB0aGlzLnN0ZXBWYWxpZGF0aW9uRmFpbGVkLmVtaXQoe1xyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgZXJyb3JzLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RlcENvbXBsZXRlLmVtaXQoe1xyXG4gICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICBkYXRhOiB0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhdXRvU2F2ZUlmTmVlZGVkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmF1dG9TYXZlICYmIHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybUJ1aWxkZXI/LmdldEZvcm1WYWx1ZSgpIHx8IHt9O1xyXG4gICAgICBhd2FpdCB0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKGRhdGEsIHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzeW5jV2l6YXJkU3RhdGUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc3luY0RhdGE6IFVpV2l6YXJkU3luY0RhdGEgPSB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgd2l6YXJkU3RhdGU6IHsgLi4udGhpcy5zdGF0ZSB9LFxyXG4gICAgICB3aXphcmRTdGVwczogdGhpcy53aXphcmRTdGVwcy5tYXAoKHMpID0+ICh7XHJcbiAgICAgICAgdGl0bGU6IHMud2l6YXJkU3RlcD8uc3RlcFRpdGxlIHx8IHMudGl0bGUsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IHMud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IHMuZGVzY3JpcHRpb24sXHJcbiAgICAgIH0pKSxcclxuICAgICAgaXNXaXphcmRNb2RlOiB0cnVlLFxyXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLndpemFyZFN5bmMucmVnaXN0ZXJXaXphcmQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsIHN5bmNEYXRhKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// ── Componenti ──
|
|
2
|
+
export { UiFormBuilderComponent, UiFormErrorStateMatcher } from './form-builder.component';
|
|
3
|
+
export { UiFormWizardComponent } from './form-wizard.component';
|
|
4
|
+
export { UiFormErrorSummaryComponent } from './sub-components/error-summary/form-error-summary.component';
|
|
5
|
+
export { UiFileInputComponent } from './sub-components/file-input/file-input.component';
|
|
6
|
+
export { UiSpecificaTerritorialeComponent } from './sub-components/specifica-territoriale/specifica-territoriale.component';
|
|
7
|
+
export { UiTableTerritorialeComponent } from './sub-components/table-territoriale/table-territoriale.component';
|
|
8
|
+
// ── Servizi ──
|
|
9
|
+
export { UiFormConditionService } from './services/form-condition.service';
|
|
10
|
+
export { UiFormValidationService } from './services/form-validation.service';
|
|
11
|
+
export { UiLocationService, } from './services/location.service';
|
|
12
|
+
export { UiWizardSyncService, } from './services/wizard-sync.service';
|
|
13
|
+
// ── Direttive ──
|
|
14
|
+
export { UiCurrencyInputDirective } from './directives/currency-input.directive';
|
|
15
|
+
// ── Adapter e formati data ──
|
|
16
|
+
export { UiItalianDateAdapter, UI_IT_DATE_FORMATS } from './adapters/it-date-adapter';
|
|
17
|
+
// ── Tipi ──
|
|
18
|
+
export * from './types/index';
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0tYnVpbGRlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUI7QUFDbkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDMUcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDeEYsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDNUgsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sa0VBQWtFLENBQUM7QUFFaEgsZ0JBQWdCO0FBQ2hCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzdFLE9BQU8sRUFDTCxpQkFBaUIsR0FJbEIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsbUJBQW1CLEdBRXBCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsa0JBQWtCO0FBQ2xCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRWpGLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RixhQUFhO0FBQ2IsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDilIDilIAgQ29tcG9uZW50aSDilIDilIBcclxuZXhwb3J0IHsgVWlGb3JtQnVpbGRlckNvbXBvbmVudCwgVWlGb3JtRXJyb3JTdGF0ZU1hdGNoZXIgfSBmcm9tICcuL2Zvcm0tYnVpbGRlci5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBVaUZvcm1XaXphcmRDb21wb25lbnQgfSBmcm9tICcuL2Zvcm0td2l6YXJkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFVpRm9ybUVycm9yU3VtbWFyeUNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvZXJyb3Itc3VtbWFyeS9mb3JtLWVycm9yLXN1bW1hcnkuY29tcG9uZW50JztcclxuZXhwb3J0IHsgVWlGaWxlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL2ZpbGUtaW5wdXQvZmlsZS1pbnB1dC5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBVaVNwZWNpZmljYVRlcnJpdG9yaWFsZUNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvc3BlY2lmaWNhLXRlcnJpdG9yaWFsZS9zcGVjaWZpY2EtdGVycml0b3JpYWxlLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFVpVGFibGVUZXJyaXRvcmlhbGVDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL3RhYmxlLXRlcnJpdG9yaWFsZS90YWJsZS10ZXJyaXRvcmlhbGUuY29tcG9uZW50JztcclxuXHJcbi8vIOKUgOKUgCBTZXJ2aXppIOKUgOKUgFxyXG5leHBvcnQgeyBVaUZvcm1Db25kaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9mb3JtLWNvbmRpdGlvbi5zZXJ2aWNlJztcclxuZXhwb3J0IHsgVWlGb3JtVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Zvcm0tdmFsaWRhdGlvbi5zZXJ2aWNlJztcclxuZXhwb3J0IHtcclxuICBVaUxvY2F0aW9uU2VydmljZSxcclxuICB0eXBlIFVpTmF6aW9uZSxcclxuICB0eXBlIFVpUHJvdmluY2lhLFxyXG4gIHR5cGUgVWlDb211bmUsXHJcbn0gZnJvbSAnLi9zZXJ2aWNlcy9sb2NhdGlvbi5zZXJ2aWNlJztcclxuZXhwb3J0IHtcclxuICBVaVdpemFyZFN5bmNTZXJ2aWNlLFxyXG4gIHR5cGUgVWlXaXphcmRTeW5jRGF0YSxcclxufSBmcm9tICcuL3NlcnZpY2VzL3dpemFyZC1zeW5jLnNlcnZpY2UnO1xyXG5cclxuLy8g4pSA4pSAIERpcmV0dGl2ZSDilIDilIBcclxuZXhwb3J0IHsgVWlDdXJyZW5jeUlucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2N1cnJlbmN5LWlucHV0LmRpcmVjdGl2ZSc7XHJcblxyXG4vLyDilIDilIAgQWRhcHRlciBlIGZvcm1hdGkgZGF0YSDilIDilIBcclxuZXhwb3J0IHsgVWlJdGFsaWFuRGF0ZUFkYXB0ZXIsIFVJX0lUX0RBVEVfRk9STUFUUyB9IGZyb20gJy4vYWRhcHRlcnMvaXQtZGF0ZS1hZGFwdGVyJztcclxuXHJcbi8vIOKUgOKUgCBUaXBpIOKUgOKUgFxyXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2luZGV4JztcclxuIl19
|