@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.
Files changed (141) hide show
  1. package/esm2022/gnggln-ng-ui-system.mjs +5 -0
  2. package/esm2022/lib/components/accordion/accordion.component.mjs +353 -0
  3. package/esm2022/lib/components/accordion/accordion.types.mjs +6 -0
  4. package/esm2022/lib/components/accordion/index.mjs +2 -0
  5. package/esm2022/lib/components/base-layout/base-layout.component.mjs +218 -0
  6. package/esm2022/lib/components/base-layout/base-layout.types.mjs +6 -0
  7. package/esm2022/lib/components/base-layout/index.mjs +14 -0
  8. package/esm2022/lib/components/button/button-area.component.mjs +196 -0
  9. package/esm2022/lib/components/button/button.component.mjs +164 -0
  10. package/esm2022/lib/components/button/button.types.mjs +6 -0
  11. package/esm2022/lib/components/button/index.mjs +16 -0
  12. package/esm2022/lib/components/crud-table/crud-table.component.mjs +789 -0
  13. package/esm2022/lib/components/crud-table/crud-table.types.mjs +6 -0
  14. package/esm2022/lib/components/crud-table/index.mjs +16 -0
  15. package/esm2022/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  16. package/esm2022/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  17. package/esm2022/lib/components/form-builder/form-builder.component.mjs +824 -0
  18. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +510 -0
  19. package/esm2022/lib/components/form-builder/index.mjs +19 -0
  20. package/esm2022/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  21. package/esm2022/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  22. package/esm2022/lib/components/form-builder/services/location.service.mjs +140 -0
  23. package/esm2022/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
  24. package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +161 -0
  25. package/esm2022/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  26. package/esm2022/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  27. package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  28. package/esm2022/lib/components/form-builder/types/condition.types.mjs +6 -0
  29. package/esm2022/lib/components/form-builder/types/field.types.mjs +6 -0
  30. package/esm2022/lib/components/form-builder/types/index.mjs +2 -0
  31. package/esm2022/lib/components/form-builder/types/schema.types.mjs +6 -0
  32. package/esm2022/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  33. package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -0
  34. package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
  35. package/esm2022/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
  36. package/esm2022/lib/components/form-builder-editor/index.mjs +21 -0
  37. package/esm2022/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
  38. package/esm2022/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
  39. package/esm2022/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
  40. package/esm2022/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
  41. package/esm2022/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
  42. package/esm2022/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
  43. package/esm2022/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
  44. package/esm2022/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
  45. package/esm2022/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
  46. package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
  47. package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +472 -0
  48. package/esm2022/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
  49. package/esm2022/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
  50. package/esm2022/lib/components/layout-builder/index.mjs +18 -0
  51. package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +1730 -0
  52. package/esm2022/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  53. package/esm2022/lib/components/layout-builder/layout.service.mjs +239 -0
  54. package/esm2022/lib/components/modal/confirm-dialog.component.mjs +151 -0
  55. package/esm2022/lib/components/modal/index.mjs +4 -0
  56. package/esm2022/lib/components/modal/modal.component.mjs +139 -0
  57. package/esm2022/lib/components/modal/modal.service.mjs +194 -0
  58. package/esm2022/lib/components/modal/modal.types.mjs +6 -0
  59. package/esm2022/lib/components/page-header/breadcrumb.service.mjs +242 -0
  60. package/esm2022/lib/components/page-header/index.mjs +20 -0
  61. package/esm2022/lib/components/page-header/page-header.component.mjs +243 -0
  62. package/esm2022/lib/components/page-header/page-header.types.mjs +21 -0
  63. package/esm2022/lib/components/table/index.mjs +2 -0
  64. package/esm2022/lib/components/table/paginated-table.component.mjs +407 -0
  65. package/esm2022/lib/components/table/table.types.mjs +6 -0
  66. package/esm2022/lib/core/types/index.mjs +6 -0
  67. package/esm2022/lib/core/utils/index.mjs +53 -0
  68. package/esm2022/lib/sources/location-data.opt.json +8942 -0
  69. package/esm2022/lib/sources/nazioni.opt.json +215 -0
  70. package/esm2022/public-api.mjs +34 -0
  71. package/fesm2022/gnggln-ng-ui-system.mjs +55752 -0
  72. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -0
  73. package/index.d.ts +5 -0
  74. package/lib/components/accordion/accordion.component.d.ts +118 -0
  75. package/lib/components/accordion/accordion.types.d.ts +62 -0
  76. package/lib/components/accordion/index.d.ts +2 -0
  77. package/lib/components/base-layout/base-layout.component.d.ts +83 -0
  78. package/lib/components/base-layout/base-layout.types.d.ts +26 -0
  79. package/lib/components/base-layout/index.d.ts +13 -0
  80. package/lib/components/button/button-area.component.d.ts +88 -0
  81. package/lib/components/button/button.component.d.ts +55 -0
  82. package/lib/components/button/button.types.d.ts +70 -0
  83. package/lib/components/button/index.d.ts +15 -0
  84. package/lib/components/crud-table/crud-table.component.d.ts +143 -0
  85. package/lib/components/crud-table/crud-table.types.d.ts +207 -0
  86. package/lib/components/crud-table/index.d.ts +15 -0
  87. package/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  88. package/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  89. package/lib/components/form-builder/form-builder.component.d.ts +183 -0
  90. package/lib/components/form-builder/form-wizard.component.d.ts +87 -0
  91. package/lib/components/form-builder/index.d.ts +13 -0
  92. package/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  93. package/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  94. package/lib/components/form-builder/services/location.service.d.ts +83 -0
  95. package/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
  96. package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +28 -0
  97. package/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  98. package/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  99. package/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  100. package/lib/components/form-builder/types/condition.types.d.ts +51 -0
  101. package/lib/components/form-builder/types/field.types.d.ts +288 -0
  102. package/lib/components/form-builder/types/index.d.ts +5 -0
  103. package/lib/components/form-builder/types/schema.types.d.ts +227 -0
  104. package/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  105. package/lib/components/form-builder/types/validation.types.d.ts +174 -0
  106. package/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
  107. package/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
  108. package/lib/components/form-builder-editor/index.d.ts +15 -0
  109. package/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
  110. package/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
  111. package/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
  112. package/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
  113. package/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
  114. package/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
  115. package/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
  116. package/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
  117. package/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
  118. package/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
  119. package/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
  120. package/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
  121. package/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
  122. package/lib/components/layout-builder/index.d.ts +16 -0
  123. package/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
  124. package/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  125. package/lib/components/layout-builder/layout.service.d.ts +100 -0
  126. package/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  127. package/lib/components/modal/index.d.ts +4 -0
  128. package/lib/components/modal/modal.component.d.ts +44 -0
  129. package/lib/components/modal/modal.service.d.ts +93 -0
  130. package/lib/components/modal/modal.types.d.ts +110 -0
  131. package/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  132. package/lib/components/page-header/index.d.ts +16 -0
  133. package/lib/components/page-header/page-header.component.d.ts +59 -0
  134. package/lib/components/page-header/page-header.types.d.ts +96 -0
  135. package/lib/components/table/index.d.ts +2 -0
  136. package/lib/components/table/paginated-table.component.d.ts +85 -0
  137. package/lib/components/table/table.types.d.ts +81 -0
  138. package/lib/core/types/index.d.ts +57 -0
  139. package/lib/core/utils/index.d.ts +29 -0
  140. package/package.json +44 -0
  141. package/public-api.d.ts +22 -0
@@ -0,0 +1,323 @@
1
+ /**
2
+ * @module ng-ui-system/form-builder-editor
3
+ * Componente editor delle opzioni per campi di tipo select, radio e multiselect.
4
+ *
5
+ * Permette di aggiungere, modificare, riordinare e rimuovere le opzioni
6
+ * di un campo di scelta, con supporto per valore, etichetta e stato disabilitato.
7
+ */
8
+ import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';
9
+ import { FormsModule } from '@angular/forms';
10
+ import { MatCardModule } from '@angular/material/card';
11
+ import { MatFormFieldModule } from '@angular/material/form-field';
12
+ import { MatInputModule } from '@angular/material/input';
13
+ import { MatCheckboxModule } from '@angular/material/checkbox';
14
+ import { MatTooltipModule } from '@angular/material/tooltip';
15
+ import { LucideAngularModule } from 'lucide-angular';
16
+ import { UiButtonComponent } from '../../../button/index';
17
+ import * as i0 from "@angular/core";
18
+ import * as i1 from "@angular/forms";
19
+ import * as i2 from "@angular/material/card";
20
+ import * as i3 from "@angular/material/form-field";
21
+ import * as i4 from "@angular/material/input";
22
+ import * as i5 from "@angular/material/checkbox";
23
+ import * as i6 from "@angular/material/tooltip";
24
+ import * as i7 from "lucide-angular";
25
+ /**
26
+ * Editor per le opzioni di un campo di scelta (select, radio, multiselect).
27
+ *
28
+ * Mostra una lista di opzioni con:
29
+ * - Header con titolo e pulsante per aggiungere nuove opzioni
30
+ * - Per ogni opzione: input valore, input etichetta, checkbox disabilitato,
31
+ * frecce per spostamento su/giu, pulsante elimina
32
+ * - Stato vuoto quando non ci sono opzioni configurate
33
+ */
34
+ export class UiOptionsEditorComponent {
35
+ constructor() {
36
+ /**
37
+ * Opzioni del campo da modificare.
38
+ * Accetta sia un array di UiFieldOption che un valore generico
39
+ * (per gestire campi non ancora configurati).
40
+ */
41
+ this.options = [];
42
+ /** Emette l'array aggiornato delle opzioni ad ogni modifica. */
43
+ this.optionsChange = new EventEmitter();
44
+ }
45
+ /**
46
+ * Normalizza l'input per garantire che sia sempre un array valido.
47
+ * Gestisce il caso in cui le opzioni siano null, undefined o di tipo inatteso.
48
+ */
49
+ get normalizedOptions() {
50
+ if (Array.isArray(this.options)) {
51
+ return this.options;
52
+ }
53
+ return [];
54
+ }
55
+ /**
56
+ * Aggiunge una nuova opzione vuota alla lista e notifica il parent.
57
+ */
58
+ addOption() {
59
+ const newOption = {
60
+ value: '',
61
+ label: '',
62
+ disabled: false,
63
+ };
64
+ const updated = [...this.normalizedOptions, newOption];
65
+ this.emitChange(updated);
66
+ }
67
+ /**
68
+ * Aggiorna una proprieta specifica di un'opzione.
69
+ * @param index - Indice dell'opzione da aggiornare.
70
+ * @param field - Nome della proprieta da modificare.
71
+ * @param value - Nuovo valore della proprieta.
72
+ */
73
+ updateOption(index, field, value) {
74
+ const updated = this.normalizedOptions.map((opt, i) => (i === index ? { ...opt, [field]: value } : opt));
75
+ this.emitChange(updated);
76
+ }
77
+ /**
78
+ * Rimuove un'opzione dalla lista.
79
+ * @param index - Indice dell'opzione da rimuovere.
80
+ */
81
+ removeOption(index) {
82
+ const updated = this.normalizedOptions.filter((_, i) => i !== index);
83
+ this.emitChange(updated);
84
+ }
85
+ /**
86
+ * Sposta un'opzione in alto o in basso nella lista.
87
+ * @param index - Indice corrente dell'opzione.
88
+ * @param direction - Direzione dello spostamento: -1 (su) o +1 (giu).
89
+ */
90
+ moveOption(index, direction) {
91
+ const newIndex = index + direction;
92
+ if (newIndex < 0 || newIndex >= this.normalizedOptions.length) {
93
+ return;
94
+ }
95
+ const updated = [...this.normalizedOptions];
96
+ const [moved] = updated.splice(index, 1);
97
+ updated.splice(newIndex, 0, moved);
98
+ this.emitChange(updated);
99
+ }
100
+ /**
101
+ * Emette l'array aggiornato delle opzioni.
102
+ * @param options - Nuovo array di opzioni.
103
+ */
104
+ emitChange(options) {
105
+ this.optionsChange.emit(options);
106
+ }
107
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiOptionsEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
108
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiOptionsEditorComponent, isStandalone: true, selector: "ui-options-editor", inputs: { options: "options" }, outputs: { optionsChange: "optionsChange" }, ngImport: i0, template: `
109
+ <mat-card class="options-card">
110
+ <!-- Header -->
111
+ <div class="options-header">
112
+ <span class="options-header__title">
113
+ <lucide-icon name="list" [size]="16" />
114
+ Opzioni del Campo
115
+ </span>
116
+ <ui-button
117
+ icon="plus"
118
+ variant="ghost"
119
+ size="sm"
120
+ ariaLabel="Aggiungi opzione"
121
+ tooltip="Aggiungi opzione"
122
+ (click)="addOption()"
123
+ />
124
+ </div>
125
+
126
+ <!-- Lista opzioni -->
127
+ <div class="options-list">
128
+ @for (option of normalizedOptions; track $index) {
129
+ <div class="option-row">
130
+ <!-- Indice opzione -->
131
+ <span class="option-row__index">{{ $index + 1 }}</span>
132
+
133
+ <!-- Input valore -->
134
+ <mat-form-field class="option-row__field" appearance="outline">
135
+ <mat-label>Valore</mat-label>
136
+ <input
137
+ matInput
138
+ [ngModel]="option.value"
139
+ (ngModelChange)="updateOption($index, 'value', $event)"
140
+ placeholder="Valore"
141
+ />
142
+ </mat-form-field>
143
+
144
+ <!-- Input etichetta -->
145
+ <mat-form-field class="option-row__field" appearance="outline">
146
+ <mat-label>Etichetta</mat-label>
147
+ <input
148
+ matInput
149
+ [ngModel]="option.label"
150
+ (ngModelChange)="updateOption($index, 'label', $event)"
151
+ placeholder="Etichetta"
152
+ />
153
+ </mat-form-field>
154
+
155
+ <!-- Checkbox disabilitato -->
156
+ <mat-checkbox
157
+ [checked]="!!option.disabled"
158
+ (change)="updateOption($index, 'disabled', $event.checked)"
159
+ matTooltip="Opzione disabilitata"
160
+ class="option-row__checkbox"
161
+ >
162
+ <span class="option-row__checkbox-label">Disab.</span>
163
+ </mat-checkbox>
164
+
165
+ <!-- Azioni di riordino e rimozione -->
166
+ <div class="option-row__actions">
167
+ <ui-button
168
+ icon="arrow-up"
169
+ variant="ghost"
170
+ size="xs"
171
+ ariaLabel="Sposta su"
172
+ tooltip="Sposta su"
173
+ [disabled]="$index === 0"
174
+ (click)="moveOption($index, -1)"
175
+ />
176
+
177
+ <ui-button
178
+ icon="arrow-down"
179
+ variant="ghost"
180
+ size="xs"
181
+ ariaLabel="Sposta giu"
182
+ tooltip="Sposta giu"
183
+ [disabled]="$index === normalizedOptions.length - 1"
184
+ (click)="moveOption($index, 1)"
185
+ />
186
+
187
+ <ui-button
188
+ icon="trash-2"
189
+ variant="warn"
190
+ size="xs"
191
+ ariaLabel="Elimina opzione"
192
+ tooltip="Elimina opzione"
193
+ (click)="removeOption($index)"
194
+ />
195
+ </div>
196
+ </div>
197
+ } @empty {
198
+ <!-- Stato vuoto -->
199
+ <div class="options-empty">
200
+ <lucide-icon name="inbox" [size]="24" />
201
+ <span>Nessuna opzione configurata</span>
202
+ </div>
203
+ }
204
+ </div>
205
+ </mat-card>
206
+ `, isInline: true, styles: [":host{display:block}.options-card{border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md);overflow:hidden}.options-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-3) var(--ui-spacing-4);background:var(--ui-color-bg-subtle);border-bottom:1px solid var(--ui-color-border)}.options-header__title{display:flex;align-items:center;gap:var(--ui-spacing-2);font-size:var(--ui-font-size-sm);font-weight:600;color:var(--ui-color-text)}.options-list{padding:var(--ui-spacing-3);display:flex;flex-direction:column;gap:var(--ui-spacing-2)}.option-row{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-2);background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-sm);transition:border-color var(--ui-transition-fast),box-shadow var(--ui-transition-fast)}.option-row:hover{border-color:var(--ui-color-primary);box-shadow:var(--ui-shadow-sm)}.option-row__index{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--ui-color-bg-subtle);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-xs);font-weight:600;flex-shrink:0}.option-row__field{flex:1;min-width:0}.option-row__field ::ng-deep .mat-mdc-form-field-infix{padding-top:var(--ui-spacing-1)!important;padding-bottom:var(--ui-spacing-1)!important;min-height:unset}.option-row__field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.option-row__checkbox{flex-shrink:0}.option-row__checkbox-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-secondary)}.option-row__actions{display:flex;align-items:center;gap:var(--ui-spacing-1);flex-shrink:0}.options-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-6) var(--ui-spacing-4);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-sm)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i7.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
207
+ }
208
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiOptionsEditorComponent, decorators: [{
209
+ type: Component,
210
+ args: [{ selector: 'ui-options-editor', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
211
+ FormsModule,
212
+ MatCardModule,
213
+ MatFormFieldModule,
214
+ MatInputModule,
215
+ MatCheckboxModule,
216
+ MatTooltipModule,
217
+ LucideAngularModule,
218
+ UiButtonComponent,
219
+ ], template: `
220
+ <mat-card class="options-card">
221
+ <!-- Header -->
222
+ <div class="options-header">
223
+ <span class="options-header__title">
224
+ <lucide-icon name="list" [size]="16" />
225
+ Opzioni del Campo
226
+ </span>
227
+ <ui-button
228
+ icon="plus"
229
+ variant="ghost"
230
+ size="sm"
231
+ ariaLabel="Aggiungi opzione"
232
+ tooltip="Aggiungi opzione"
233
+ (click)="addOption()"
234
+ />
235
+ </div>
236
+
237
+ <!-- Lista opzioni -->
238
+ <div class="options-list">
239
+ @for (option of normalizedOptions; track $index) {
240
+ <div class="option-row">
241
+ <!-- Indice opzione -->
242
+ <span class="option-row__index">{{ $index + 1 }}</span>
243
+
244
+ <!-- Input valore -->
245
+ <mat-form-field class="option-row__field" appearance="outline">
246
+ <mat-label>Valore</mat-label>
247
+ <input
248
+ matInput
249
+ [ngModel]="option.value"
250
+ (ngModelChange)="updateOption($index, 'value', $event)"
251
+ placeholder="Valore"
252
+ />
253
+ </mat-form-field>
254
+
255
+ <!-- Input etichetta -->
256
+ <mat-form-field class="option-row__field" appearance="outline">
257
+ <mat-label>Etichetta</mat-label>
258
+ <input
259
+ matInput
260
+ [ngModel]="option.label"
261
+ (ngModelChange)="updateOption($index, 'label', $event)"
262
+ placeholder="Etichetta"
263
+ />
264
+ </mat-form-field>
265
+
266
+ <!-- Checkbox disabilitato -->
267
+ <mat-checkbox
268
+ [checked]="!!option.disabled"
269
+ (change)="updateOption($index, 'disabled', $event.checked)"
270
+ matTooltip="Opzione disabilitata"
271
+ class="option-row__checkbox"
272
+ >
273
+ <span class="option-row__checkbox-label">Disab.</span>
274
+ </mat-checkbox>
275
+
276
+ <!-- Azioni di riordino e rimozione -->
277
+ <div class="option-row__actions">
278
+ <ui-button
279
+ icon="arrow-up"
280
+ variant="ghost"
281
+ size="xs"
282
+ ariaLabel="Sposta su"
283
+ tooltip="Sposta su"
284
+ [disabled]="$index === 0"
285
+ (click)="moveOption($index, -1)"
286
+ />
287
+
288
+ <ui-button
289
+ icon="arrow-down"
290
+ variant="ghost"
291
+ size="xs"
292
+ ariaLabel="Sposta giu"
293
+ tooltip="Sposta giu"
294
+ [disabled]="$index === normalizedOptions.length - 1"
295
+ (click)="moveOption($index, 1)"
296
+ />
297
+
298
+ <ui-button
299
+ icon="trash-2"
300
+ variant="warn"
301
+ size="xs"
302
+ ariaLabel="Elimina opzione"
303
+ tooltip="Elimina opzione"
304
+ (click)="removeOption($index)"
305
+ />
306
+ </div>
307
+ </div>
308
+ } @empty {
309
+ <!-- Stato vuoto -->
310
+ <div class="options-empty">
311
+ <lucide-icon name="inbox" [size]="24" />
312
+ <span>Nessuna opzione configurata</span>
313
+ </div>
314
+ }
315
+ </div>
316
+ </mat-card>
317
+ `, styles: [":host{display:block}.options-card{border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md);overflow:hidden}.options-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-3) var(--ui-spacing-4);background:var(--ui-color-bg-subtle);border-bottom:1px solid var(--ui-color-border)}.options-header__title{display:flex;align-items:center;gap:var(--ui-spacing-2);font-size:var(--ui-font-size-sm);font-weight:600;color:var(--ui-color-text)}.options-list{padding:var(--ui-spacing-3);display:flex;flex-direction:column;gap:var(--ui-spacing-2)}.option-row{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-2);background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-sm);transition:border-color var(--ui-transition-fast),box-shadow var(--ui-transition-fast)}.option-row:hover{border-color:var(--ui-color-primary);box-shadow:var(--ui-shadow-sm)}.option-row__index{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--ui-color-bg-subtle);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-xs);font-weight:600;flex-shrink:0}.option-row__field{flex:1;min-width:0}.option-row__field ::ng-deep .mat-mdc-form-field-infix{padding-top:var(--ui-spacing-1)!important;padding-bottom:var(--ui-spacing-1)!important;min-height:unset}.option-row__field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.option-row__checkbox{flex-shrink:0}.option-row__checkbox-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-secondary)}.option-row__actions{display:flex;align-items:center;gap:var(--ui-spacing-1);flex-shrink:0}.options-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-6) var(--ui-spacing-4);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-sm)}\n"] }]
318
+ }], propDecorators: { options: [{
319
+ type: Input
320
+ }], optionsChange: [{
321
+ type: Output
322
+ }] } });
323
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXItZWRpdG9yL3N1Yi1jb21wb25lbnRzL29wdGlvbnMtZWRpdG9yL29wdGlvbnMtZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7QUFHMUQ7Ozs7Ozs7O0dBUUc7QUE4T0gsTUFBTSxPQUFPLHdCQUF3QjtJQTdPckM7UUE4T0U7Ozs7V0FJRztRQUNNLFlBQU8sR0FBMEIsRUFBRSxDQUFDO1FBRTdDLGdFQUFnRTtRQUN0RCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0tBcUUvRDtJQW5FQzs7O09BR0c7SUFDSCxJQUFJLGlCQUFpQjtRQUNuQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxNQUFNLFNBQVMsR0FBa0I7WUFDL0IsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLEtBQWEsRUFBRSxLQUEwQixFQUFFLEtBQVU7UUFDaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxLQUFhO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxLQUFhLEVBQUUsU0FBaUI7UUFDekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5RCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFVBQVUsQ0FBQyxPQUF3QjtRQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDOytHQTdFVSx3QkFBd0I7bUdBQXhCLHdCQUF3QiwwSkEvTnpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtHVCx1K0RBM0dDLFdBQVcsOG1CQUNYLGFBQWEsNElBQ2Isa0JBQWtCLDBTQUNsQixjQUFjLDBXQUNkLGlCQUFpQixvWUFDakIsZ0JBQWdCLDRUQUNoQixtQkFBbUIsZ1BBQ25CLGlCQUFpQjs7NEZBaU9SLHdCQUF3QjtrQkE3T3BDLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxXQUFXO3dCQUNYLGFBQWE7d0JBQ2Isa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEIsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrR1Q7OEJBbUlRLE9BQU87c0JBQWYsS0FBSztnQkFHSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBtb2R1bGUgbmctdWktc3lzdGVtL2Zvcm0tYnVpbGRlci1lZGl0b3JcclxuICogQ29tcG9uZW50ZSBlZGl0b3IgZGVsbGUgb3B6aW9uaSBwZXIgY2FtcGkgZGkgdGlwbyBzZWxlY3QsIHJhZGlvIGUgbXVsdGlzZWxlY3QuXHJcbiAqXHJcbiAqIFBlcm1ldHRlIGRpIGFnZ2l1bmdlcmUsIG1vZGlmaWNhcmUsIHJpb3JkaW5hcmUgZSByaW11b3ZlcmUgbGUgb3B6aW9uaVxyXG4gKiBkaSB1biBjYW1wbyBkaSBzY2VsdGEsIGNvbiBzdXBwb3J0byBwZXIgdmFsb3JlLCBldGljaGV0dGEgZSBzdGF0byBkaXNhYmlsaXRhdG8uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRDYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSB9IGZyb20gJ2x1Y2lkZS1hbmd1bGFyJztcclxuXHJcbmltcG9ydCB7IFVpQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYnV0dG9uL2luZGV4JztcclxuaW1wb3J0IHsgVWlGaWVsZE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2Zvcm0tYnVpbGRlci90eXBlcy9pbmRleCc7XHJcblxyXG4vKipcclxuICogRWRpdG9yIHBlciBsZSBvcHppb25pIGRpIHVuIGNhbXBvIGRpIHNjZWx0YSAoc2VsZWN0LCByYWRpbywgbXVsdGlzZWxlY3QpLlxyXG4gKlxyXG4gKiBNb3N0cmEgdW5hIGxpc3RhIGRpIG9wemlvbmkgY29uOlxyXG4gKiAtIEhlYWRlciBjb24gdGl0b2xvIGUgcHVsc2FudGUgcGVyIGFnZ2l1bmdlcmUgbnVvdmUgb3B6aW9uaVxyXG4gKiAtIFBlciBvZ25pIG9wemlvbmU6IGlucHV0IHZhbG9yZSwgaW5wdXQgZXRpY2hldHRhLCBjaGVja2JveCBkaXNhYmlsaXRhdG8sXHJcbiAqICAgZnJlY2NlIHBlciBzcG9zdGFtZW50byBzdS9naXUsIHB1bHNhbnRlIGVsaW1pbmFcclxuICogLSBTdGF0byB2dW90byBxdWFuZG8gbm9uIGNpIHNvbm8gb3B6aW9uaSBjb25maWd1cmF0ZVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1vcHRpb25zLWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIE1hdENhcmRNb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsXHJcbiAgICBVaUJ1dHRvbkNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWNhcmQgY2xhc3M9XCJvcHRpb25zLWNhcmRcIj5cclxuICAgICAgPCEtLSBIZWFkZXIgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb25zLWhlYWRlclwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ucy1oZWFkZXJfX3RpdGxlXCI+XHJcbiAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImxpc3RcIiBbc2l6ZV09XCIxNlwiIC8+XHJcbiAgICAgICAgICBPcHppb25pIGRlbCBDYW1wb1xyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICBpY29uPVwicGx1c1wiXHJcbiAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxyXG4gICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgIGFyaWFMYWJlbD1cIkFnZ2l1bmdpIG9wemlvbmVcIlxyXG4gICAgICAgICAgdG9vbHRpcD1cIkFnZ2l1bmdpIG9wemlvbmVcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImFkZE9wdGlvbigpXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gTGlzdGEgb3B6aW9uaSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnMtbGlzdFwiPlxyXG4gICAgICAgIEBmb3IgKG9wdGlvbiBvZiBub3JtYWxpemVkT3B0aW9uczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLXJvd1wiPlxyXG4gICAgICAgICAgICA8IS0tIEluZGljZSBvcHppb25lIC0tPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbi1yb3dfX2luZGV4XCI+e3sgJGluZGV4ICsgMSB9fTwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSW5wdXQgdmFsb3JlIC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJvcHRpb24tcm93X19maWVsZFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWxvcmU8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uKCRpbmRleCwgJ3ZhbHVlJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlZhbG9yZVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSW5wdXQgZXRpY2hldHRhIC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJvcHRpb24tcm93X19maWVsZFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5FdGljaGV0dGE8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb24ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uKCRpbmRleCwgJ2xhYmVsJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkV0aWNoZXR0YVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggZGlzYWJpbGl0YXRvIC0tPlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiISFvcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlT3B0aW9uKCRpbmRleCwgJ2Rpc2FibGVkJywgJGV2ZW50LmNoZWNrZWQpXCJcclxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiT3B6aW9uZSBkaXNhYmlsaXRhdGFcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwib3B0aW9uLXJvd19fY2hlY2tib3hcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb24tcm93X19jaGVja2JveC1sYWJlbFwiPkRpc2FiLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEF6aW9uaSBkaSByaW9yZGlubyBlIHJpbW96aW9uZSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1yb3dfX2FjdGlvbnNcIj5cclxuICAgICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBpY29uPVwiYXJyb3ctdXBcIlxyXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcclxuICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiXHJcbiAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJTcG9zdGEgc3VcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcD1cIlNwb3N0YSBzdVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiJGluZGV4ID09PSAwXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlT3B0aW9uKCRpbmRleCwgLTEpXCJcclxuICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBpY29uPVwiYXJyb3ctZG93blwiXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxyXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcclxuICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNwb3N0YSBnaXVcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcD1cIlNwb3N0YSBnaXVcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiRpbmRleCA9PT0gbm9ybWFsaXplZE9wdGlvbnMubGVuZ3RoIC0gMVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZU9wdGlvbigkaW5kZXgsIDEpXCJcclxuICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBpY29uPVwidHJhc2gtMlwiXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICBzaXplPVwieHNcIlxyXG4gICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRWxpbWluYSBvcHppb25lXCJcclxuICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJFbGltaW5hIG9wemlvbmVcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZU9wdGlvbigkaW5kZXgpXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH0gQGVtcHR5IHtcclxuICAgICAgICAgIDwhLS0gU3RhdG8gdnVvdG8gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9ucy1lbXB0eVwiPlxyXG4gICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImluYm94XCIgW3NpemVdPVwiMjRcIiAvPlxyXG4gICAgICAgICAgICA8c3Bhbj5OZXNzdW5hIG9wemlvbmUgY29uZmlndXJhdGE8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtY2FyZD5cclxuICBgLFxyXG4gIHN0eWxlczogW1xyXG4gICAgYFxyXG4gICAgLyog4pSA4pSA4pSAIENhcmQgb3B6aW9uaSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cclxuXHJcbiAgICA6aG9zdCB7XHJcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb25zLWNhcmQge1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11aS1yYWRpdXMtbWQpO1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIOKUgOKUgOKUgCBIZWFkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXHJcblxyXG4gICAgLm9wdGlvbnMtaGVhZGVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTMpIHZhcigtLXVpLXNwYWNpbmctNCk7XHJcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLWJnLXN1YnRsZSk7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb25zLWhlYWRlcl9fdGl0bGUge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBnYXA6IHZhcigtLXVpLXNwYWNpbmctMik7XHJcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdWktZm9udC1zaXplLXNtKTtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgY29sb3I6IHZhcigtLXVpLWNvbG9yLXRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIOKUgOKUgOKUgCBMaXN0YSBvcHppb25pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xyXG5cclxuICAgIC5vcHRpb25zLWxpc3Qge1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTMpO1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICBnYXA6IHZhcigtLXVpLXNwYWNpbmctMik7XHJcbiAgICB9XHJcblxyXG4gICAgLyog4pSA4pSA4pSAIFJpZ2Egb3B6aW9uZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cclxuXHJcbiAgICAub3B0aW9uLXJvdyB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0yKTtcclxuICAgICAgcGFkZGluZzogdmFyKC0tdWktc3BhY2luZy0yKTtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3Itc3VyZmFjZSk7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXVpLWNvbG9yLWJvcmRlcik7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVpLXJhZGl1cy1zbSk7XHJcbiAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS11aS10cmFuc2l0aW9uLWZhc3QpLFxyXG4gICAgICAgICAgICAgICAgICBib3gtc2hhZG93IHZhcigtLXVpLXRyYW5zaXRpb24tZmFzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbi1yb3c6aG92ZXIge1xyXG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXVpLWNvbG9yLXByaW1hcnkpO1xyXG4gICAgICBib3gtc2hhZG93OiB2YXIoLS11aS1zaGFkb3ctc20pO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24tcm93X19pbmRleCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICB3aWR0aDogMjRweDtcclxuICAgICAgaGVpZ2h0OiAyNHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLWJnLXN1YnRsZSk7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LW11dGVkKTtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUteHMpO1xyXG4gICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICBmbGV4LXNocmluazogMDtcclxuICAgIH1cclxuXHJcbiAgICAub3B0aW9uLXJvd19fZmllbGQge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBtaW4td2lkdGg6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyogUmlkdWNlIGwnYWx0ZXp6YSBkZWkgZm9ybSBmaWVsZCBpbmxpbmUgKi9cclxuICAgIC5vcHRpb24tcm93X19maWVsZCA6Om5nLWRlZXAgLm1hdC1tZGMtZm9ybS1maWVsZC1pbmZpeCB7XHJcbiAgICAgIHBhZGRpbmctdG9wOiB2YXIoLS11aS1zcGFjaW5nLTEpICFpbXBvcnRhbnQ7XHJcbiAgICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS11aS1zcGFjaW5nLTEpICFpbXBvcnRhbnQ7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IHVuc2V0O1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24tcm93X19maWVsZCA6Om5nLWRlZXAgLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbi1yb3dfX2NoZWNrYm94IHtcclxuICAgICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbi1yb3dfX2NoZWNrYm94LWxhYmVsIHtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUteHMpO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dC1zZWNvbmRhcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24tcm93X19hY3Rpb25zIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiB2YXIoLS11aS1zcGFjaW5nLTEpO1xyXG4gICAgICBmbGV4LXNocmluazogMDtcclxuICAgIH1cclxuXHJcbiAgICAvKiDilIDilIDilIAgU3RhdG8gdnVvdG8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXHJcblxyXG4gICAgLm9wdGlvbnMtZW1wdHkge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgZ2FwOiB2YXIoLS11aS1zcGFjaW5nLTIpO1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTYpIHZhcigtLXVpLXNwYWNpbmctNCk7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LW11dGVkKTtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUtc20pO1xyXG4gICAgfVxyXG5cclxuICBgLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaU9wdGlvbnNFZGl0b3JDb21wb25lbnQge1xyXG4gIC8qKlxyXG4gICAqIE9wemlvbmkgZGVsIGNhbXBvIGRhIG1vZGlmaWNhcmUuXHJcbiAgICogQWNjZXR0YSBzaWEgdW4gYXJyYXkgZGkgVWlGaWVsZE9wdGlvbiBjaGUgdW4gdmFsb3JlIGdlbmVyaWNvXHJcbiAgICogKHBlciBnZXN0aXJlIGNhbXBpIG5vbiBhbmNvcmEgY29uZmlndXJhdGkpLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IFVpRmllbGRPcHRpb25bXSB8IGFueSA9IFtdO1xyXG5cclxuICAvKiogRW1ldHRlIGwnYXJyYXkgYWdnaW9ybmF0byBkZWxsZSBvcHppb25pIGFkIG9nbmkgbW9kaWZpY2EuICovXHJcbiAgQE91dHB1dCgpIG9wdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRmllbGRPcHRpb25bXT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTm9ybWFsaXp6YSBsJ2lucHV0IHBlciBnYXJhbnRpcmUgY2hlIHNpYSBzZW1wcmUgdW4gYXJyYXkgdmFsaWRvLlxyXG4gICAqIEdlc3Rpc2NlIGlsIGNhc28gaW4gY3VpIGxlIG9wemlvbmkgc2lhbm8gbnVsbCwgdW5kZWZpbmVkIG8gZGkgdGlwbyBpbmF0dGVzby5cclxuICAgKi9cclxuICBnZXQgbm9ybWFsaXplZE9wdGlvbnMoKTogVWlGaWVsZE9wdGlvbltdIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucztcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFnZ2l1bmdlIHVuYSBudW92YSBvcHppb25lIHZ1b3RhIGFsbGEgbGlzdGEgZSBub3RpZmljYSBpbCBwYXJlbnQuXHJcbiAgICovXHJcbiAgYWRkT3B0aW9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbmV3T3B0aW9uOiBVaUZpZWxkT3B0aW9uID0ge1xyXG4gICAgICB2YWx1ZTogJycsXHJcbiAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IHVwZGF0ZWQgPSBbLi4udGhpcy5ub3JtYWxpemVkT3B0aW9ucywgbmV3T3B0aW9uXTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSh1cGRhdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFnZ2lvcm5hIHVuYSBwcm9wcmlldGEgc3BlY2lmaWNhIGRpIHVuJ29wemlvbmUuXHJcbiAgICogQHBhcmFtIGluZGV4IC0gSW5kaWNlIGRlbGwnb3B6aW9uZSBkYSBhZ2dpb3JuYXJlLlxyXG4gICAqIEBwYXJhbSBmaWVsZCAtIE5vbWUgZGVsbGEgcHJvcHJpZXRhIGRhIG1vZGlmaWNhcmUuXHJcbiAgICogQHBhcmFtIHZhbHVlIC0gTnVvdm8gdmFsb3JlIGRlbGxhIHByb3ByaWV0YS5cclxuICAgKi9cclxuICB1cGRhdGVPcHRpb24oaW5kZXg6IG51bWJlciwgZmllbGQ6IGtleW9mIFVpRmllbGRPcHRpb24sIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVwZGF0ZWQgPSB0aGlzLm5vcm1hbGl6ZWRPcHRpb25zLm1hcCgob3B0LCBpKSA9PiAoaSA9PT0gaW5kZXggPyB7IC4uLm9wdCwgW2ZpZWxkXTogdmFsdWUgfSA6IG9wdCkpO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHVwZGF0ZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmltdW92ZSB1bidvcHppb25lIGRhbGxhIGxpc3RhLlxyXG4gICAqIEBwYXJhbSBpbmRleCAtIEluZGljZSBkZWxsJ29wemlvbmUgZGEgcmltdW92ZXJlLlxyXG4gICAqL1xyXG4gIHJlbW92ZU9wdGlvbihpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5ub3JtYWxpemVkT3B0aW9ucy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSh1cGRhdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNwb3N0YSB1bidvcHppb25lIGluIGFsdG8gbyBpbiBiYXNzbyBuZWxsYSBsaXN0YS5cclxuICAgKiBAcGFyYW0gaW5kZXggLSBJbmRpY2UgY29ycmVudGUgZGVsbCdvcHppb25lLlxyXG4gICAqIEBwYXJhbSBkaXJlY3Rpb24gLSBEaXJlemlvbmUgZGVsbG8gc3Bvc3RhbWVudG86IC0xIChzdSkgbyArMSAoZ2l1KS5cclxuICAgKi9cclxuICBtb3ZlT3B0aW9uKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogLTEgfCAxKTogdm9pZCB7XHJcbiAgICBjb25zdCBuZXdJbmRleCA9IGluZGV4ICsgZGlyZWN0aW9uO1xyXG4gICAgaWYgKG5ld0luZGV4IDwgMCB8fCBuZXdJbmRleCA+PSB0aGlzLm5vcm1hbGl6ZWRPcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB1cGRhdGVkID0gWy4uLnRoaXMubm9ybWFsaXplZE9wdGlvbnNdO1xyXG4gICAgY29uc3QgW21vdmVkXSA9IHVwZGF0ZWQuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHVwZGF0ZWQuc3BsaWNlKG5ld0luZGV4LCAwLCBtb3ZlZCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodXBkYXRlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbWV0dGUgbCdhcnJheSBhZ2dpb3JuYXRvIGRlbGxlIG9wemlvbmkuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBOdW92byBhcnJheSBkaSBvcHppb25pLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZW1pdENoYW5nZShvcHRpb25zOiBVaUZpZWxkT3B0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMub3B0aW9uc0NoYW5nZS5lbWl0KG9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,238 @@
1
+ import { Component, ChangeDetectionStrategy, ChangeDetectorRef, Input, Output, EventEmitter, ViewChild, inject, } from '@angular/core';
2
+ import { LucideAngularModule } from 'lucide-angular';
3
+ import { UiButtonComponent } from '../../../button/index';
4
+ import { UiFormBuilderComponent } from '../../../form-builder/form-builder.component';
5
+ import { UiEditorFormValuesPanelComponent } from '../form-values-panel/form-values-panel.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "lucide-angular";
8
+ /**
9
+ * Contenitore per l'anteprima live del form in fase di editing.
10
+ *
11
+ * Mostra una preview del form builder generato dallo schema corrente,
12
+ * con possibilita di aggiornamento forzato e pannello dei valori.
13
+ *
14
+ * @selector ui-editor-preview-container
15
+ */
16
+ export class UiEditorPreviewContainerComponent {
17
+ constructor() {
18
+ /** @internal Change detector per OnPush. */
19
+ this.cdr = inject(ChangeDetectorRef);
20
+ /** Schema del form ricevuto dal parent (cambia ad ogni modifica nell'editor). */
21
+ this.schema = null;
22
+ /**
23
+ * Chiave per forzare la ri-creazione del form builder.
24
+ * Viene incrementata dal componente padre per invalidare l'anteprima.
25
+ */
26
+ this.key = 0;
27
+ /** Emesso alla richiesta di aggiornamento forzato dell'anteprima. */
28
+ this.refresh = new EventEmitter();
29
+ /**
30
+ * Snapshot immutabile dello schema usato per il rendering.
31
+ * Viene aggiornato SOLO al primo caricamento, al cambio tab
32
+ * (quando `key` cambia) o al refresh esplicito.
33
+ * Questo evita che le modifiche nell'editor ricostruiscano
34
+ * continuamente il form, perdendo lo stato dell'utente.
35
+ */
36
+ this.previewSchema = null;
37
+ /** Stato di apertura del pannello valori in basso. */
38
+ this.isValuesPanelOpen = false;
39
+ /** Valori correnti del form nell'anteprima. */
40
+ this.currentFormValues = {};
41
+ /** @internal Ultimo valore di `key` applicato allo snapshot. */
42
+ this.lastAppliedKey = -1;
43
+ }
44
+ ngOnChanges(changes) {
45
+ const keyChanged = changes['key'] && this.key !== this.lastAppliedKey;
46
+ const firstSchema = changes['schema']?.firstChange;
47
+ if (keyChanged || firstSchema) {
48
+ this.applySchemaSnapshot();
49
+ }
50
+ }
51
+ /**
52
+ * Riceve i valori aggiornati dal form builder ad ogni interazione.
53
+ * @param values - Valori correnti del form (inclusi campi disabilitati)
54
+ */
55
+ onFormBuilderValueChange(values) {
56
+ this.currentFormValues = values;
57
+ this.cdr.markForCheck();
58
+ }
59
+ /** Alterna la visibilita del pannello dei valori del form. */
60
+ toggleValuesPanel() {
61
+ this.isValuesPanelOpen = !this.isValuesPanelOpen;
62
+ }
63
+ /**
64
+ * Gestisce il cambiamento dei valori dal pannello JSON.
65
+ * @param values - Nuovi valori parsati dal JSON
66
+ */
67
+ onFormValuesChange(values) {
68
+ this.currentFormValues = values;
69
+ }
70
+ /**
71
+ * Aggiorna i valori leggendo lo stato corrente dal form builder.
72
+ */
73
+ onRefreshValues() {
74
+ if (this.formBuilderRef) {
75
+ this.currentFormValues = this.formBuilderRef.getFormValue();
76
+ this.cdr.markForCheck();
77
+ }
78
+ }
79
+ /**
80
+ * @internal
81
+ * Crea una copia profonda dello schema corrente come snapshot
82
+ * per il rendering dell'anteprima. L'id viene reso univoco
83
+ * per forzare il rebuild del form builder (che ricostruisce
84
+ * solo quando `schema.id` cambia).
85
+ */
86
+ applySchemaSnapshot() {
87
+ if (this.schema) {
88
+ const snapshot = structuredClone(this.schema);
89
+ snapshot.id = `${snapshot.id}__preview_${this.key}`;
90
+ this.previewSchema = snapshot;
91
+ }
92
+ else {
93
+ this.previewSchema = null;
94
+ }
95
+ this.lastAppliedKey = this.key;
96
+ this.currentFormValues = {};
97
+ }
98
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiEditorPreviewContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
99
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiEditorPreviewContainerComponent, isStandalone: true, selector: "ui-editor-preview-container", inputs: { schema: "schema", key: "key" }, outputs: { refresh: "refresh" }, viewQueries: [{ propertyName: "formBuilderRef", first: true, predicate: UiFormBuilderComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
100
+ <div class="preview-container">
101
+ <!-- Intestazione con azioni -->
102
+ <div class="preview-container__header">
103
+ <div class="preview-container__header-left">
104
+ <lucide-icon name="eye" [size]="18" aria-hidden="true" />
105
+ <span class="preview-container__title">Anteprima Form</span>
106
+ </div>
107
+
108
+ <div class="preview-container__header-actions">
109
+ <!-- Aggiorna anteprima -->
110
+ <ui-button
111
+ icon="refresh-cw"
112
+ variant="ghost"
113
+ size="sm"
114
+ tooltip="Aggiorna anteprima"
115
+ ariaLabel="Aggiorna anteprima"
116
+ (click)="refresh.emit()"
117
+ />
118
+
119
+ <!-- Mostra/nascondi pannello valori -->
120
+ <ui-button
121
+ icon="code"
122
+ variant="ghost"
123
+ size="sm"
124
+ tooltip="Mostra/nascondi valori form"
125
+ ariaLabel="Mostra/nascondi valori form"
126
+ (click)="toggleValuesPanel()"
127
+ />
128
+ </div>
129
+ </div>
130
+
131
+ <!-- Contenuto anteprima -->
132
+ <div class="preview-container__content">
133
+ @if (!previewSchema || !previewSchema.sections || previewSchema.sections.length === 0) {
134
+ <!-- Stato vuoto: nessuno schema -->
135
+ <div class="preview-container__empty">
136
+ <lucide-icon name="layout-template" [size]="40" aria-hidden="true" />
137
+ <p class="preview-container__empty-text">
138
+ Aggiungi sezioni e campi per visualizzare l'anteprima
139
+ </p>
140
+ </div>
141
+ } @else {
142
+ <!-- Rendering del form builder con snapshot dello schema -->
143
+ <div class="preview-container__form-wrapper">
144
+ <ui-form-builder
145
+ [schema]="previewSchema"
146
+ (valueChange)="onFormBuilderValueChange($event)"
147
+ />
148
+ </div>
149
+ }
150
+ </div>
151
+
152
+ <!-- Pannello valori in basso -->
153
+ <ui-editor-form-values-panel
154
+ [formValues]="currentFormValues"
155
+ [isOpen]="isValuesPanelOpen"
156
+ (valuesChange)="onFormValuesChange($event)"
157
+ (refreshValues)="onRefreshValues()"
158
+ (toggle)="toggleValuesPanel()"
159
+ />
160
+ </div>
161
+ `, isInline: true, styles: [".preview-container{display:flex;flex-direction:column;height:100%;background:var(--ui-color-bg-subtle, #fafafa);position:relative}.preview-container__header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-2, 8px) var(--ui-spacing-4, 16px);border-bottom:1px solid var(--ui-color-border, #e0e0e0);background:var(--ui-color-surface, #fff)}.preview-container__header-left{display:flex;align-items:center;gap:var(--ui-spacing-2, 8px)}.preview-container__title{font-weight:600;font-size:var(--ui-font-size-sm, .875rem);color:var(--ui-color-text, #212121)}.preview-container__header-actions{display:flex;align-items:center;gap:var(--ui-spacing-1, 4px)}.preview-container__content{flex:1;overflow-y:auto;padding:var(--ui-spacing-4, 16px)}.preview-container__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--ui-spacing-3, 12px);padding:var(--ui-spacing-8, 64px) var(--ui-spacing-4, 16px);text-align:center;color:var(--ui-color-text-muted, #9e9e9e)}.preview-container__empty-text{font-size:var(--ui-font-size-sm, .875rem);margin:0}.preview-container__form-wrapper{background:var(--ui-color-surface, #fff);border-radius:var(--ui-radius-md, 8px);padding:var(--ui-spacing-4, 16px);box-shadow:var(--ui-shadow-sm, 0 1px 3px rgba(0,0,0,.1))}\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"] }, { kind: "component", type: UiEditorFormValuesPanelComponent, selector: "ui-editor-form-values-panel", inputs: ["formValues", "isOpen"], outputs: ["valuesChange", "refreshValues", "toggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
162
+ }
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiEditorPreviewContainerComponent, decorators: [{
164
+ type: Component,
165
+ args: [{ selector: 'ui-editor-preview-container', standalone: true, imports: [LucideAngularModule, UiButtonComponent, UiFormBuilderComponent, UiEditorFormValuesPanelComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
166
+ <div class="preview-container">
167
+ <!-- Intestazione con azioni -->
168
+ <div class="preview-container__header">
169
+ <div class="preview-container__header-left">
170
+ <lucide-icon name="eye" [size]="18" aria-hidden="true" />
171
+ <span class="preview-container__title">Anteprima Form</span>
172
+ </div>
173
+
174
+ <div class="preview-container__header-actions">
175
+ <!-- Aggiorna anteprima -->
176
+ <ui-button
177
+ icon="refresh-cw"
178
+ variant="ghost"
179
+ size="sm"
180
+ tooltip="Aggiorna anteprima"
181
+ ariaLabel="Aggiorna anteprima"
182
+ (click)="refresh.emit()"
183
+ />
184
+
185
+ <!-- Mostra/nascondi pannello valori -->
186
+ <ui-button
187
+ icon="code"
188
+ variant="ghost"
189
+ size="sm"
190
+ tooltip="Mostra/nascondi valori form"
191
+ ariaLabel="Mostra/nascondi valori form"
192
+ (click)="toggleValuesPanel()"
193
+ />
194
+ </div>
195
+ </div>
196
+
197
+ <!-- Contenuto anteprima -->
198
+ <div class="preview-container__content">
199
+ @if (!previewSchema || !previewSchema.sections || previewSchema.sections.length === 0) {
200
+ <!-- Stato vuoto: nessuno schema -->
201
+ <div class="preview-container__empty">
202
+ <lucide-icon name="layout-template" [size]="40" aria-hidden="true" />
203
+ <p class="preview-container__empty-text">
204
+ Aggiungi sezioni e campi per visualizzare l'anteprima
205
+ </p>
206
+ </div>
207
+ } @else {
208
+ <!-- Rendering del form builder con snapshot dello schema -->
209
+ <div class="preview-container__form-wrapper">
210
+ <ui-form-builder
211
+ [schema]="previewSchema"
212
+ (valueChange)="onFormBuilderValueChange($event)"
213
+ />
214
+ </div>
215
+ }
216
+ </div>
217
+
218
+ <!-- Pannello valori in basso -->
219
+ <ui-editor-form-values-panel
220
+ [formValues]="currentFormValues"
221
+ [isOpen]="isValuesPanelOpen"
222
+ (valuesChange)="onFormValuesChange($event)"
223
+ (refreshValues)="onRefreshValues()"
224
+ (toggle)="toggleValuesPanel()"
225
+ />
226
+ </div>
227
+ `, styles: [".preview-container{display:flex;flex-direction:column;height:100%;background:var(--ui-color-bg-subtle, #fafafa);position:relative}.preview-container__header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-2, 8px) var(--ui-spacing-4, 16px);border-bottom:1px solid var(--ui-color-border, #e0e0e0);background:var(--ui-color-surface, #fff)}.preview-container__header-left{display:flex;align-items:center;gap:var(--ui-spacing-2, 8px)}.preview-container__title{font-weight:600;font-size:var(--ui-font-size-sm, .875rem);color:var(--ui-color-text, #212121)}.preview-container__header-actions{display:flex;align-items:center;gap:var(--ui-spacing-1, 4px)}.preview-container__content{flex:1;overflow-y:auto;padding:var(--ui-spacing-4, 16px)}.preview-container__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--ui-spacing-3, 12px);padding:var(--ui-spacing-8, 64px) var(--ui-spacing-4, 16px);text-align:center;color:var(--ui-color-text-muted, #9e9e9e)}.preview-container__empty-text{font-size:var(--ui-font-size-sm, .875rem);margin:0}.preview-container__form-wrapper{background:var(--ui-color-surface, #fff);border-radius:var(--ui-radius-md, 8px);padding:var(--ui-spacing-4, 16px);box-shadow:var(--ui-shadow-sm, 0 1px 3px rgba(0,0,0,.1))}\n"] }]
228
+ }], propDecorators: { formBuilderRef: [{
229
+ type: ViewChild,
230
+ args: [UiFormBuilderComponent]
231
+ }], schema: [{
232
+ type: Input
233
+ }], key: [{
234
+ type: Input
235
+ }], refresh: [{
236
+ type: Output
237
+ }] } });
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXItZWRpdG9yL3N1Yi1jb21wb25lbnRzL3ByZXZpZXctY29udGFpbmVyL3ByZXZpZXctY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osU0FBUyxFQUNULE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUcxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7O0FBRXBHOzs7Ozs7O0dBT0c7QUE4SUgsTUFBTSxPQUFPLGlDQUFpQztJQTdJOUM7UUE4SUUsNENBQTRDO1FBQzNCLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUtqRCxpRkFBaUY7UUFDeEUsV0FBTSxHQUF3QixJQUFJLENBQUM7UUFFNUM7OztXQUdHO1FBQ00sUUFBRyxHQUFXLENBQUMsQ0FBQztRQUV6QixxRUFBcUU7UUFDM0QsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFN0M7Ozs7OztXQU1HO1FBQ0gsa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBRTFDLHNEQUFzRDtRQUN0RCxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFMUIsK0NBQStDO1FBQy9DLHNCQUFpQixHQUFRLEVBQUUsQ0FBQztRQUU1QixnRUFBZ0U7UUFDeEQsbUJBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQTZEN0I7SUEzREMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDdEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsQ0FBQztRQUVuRCxJQUFJLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLE1BQVc7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCw4REFBOEQ7SUFDOUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ25ELENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0IsQ0FBQyxNQUFXO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQzsrR0EvRlUsaUNBQWlDO21HQUFqQyxpQ0FBaUMsa05BS2pDLHNCQUFzQixxRUE3SXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThEVCx1MkNBaEVTLG1CQUFtQixnUEFBRSxpQkFBaUIsdU1BQUUsc0JBQXNCLGdQQUFFLGdDQUFnQzs7NEZBMEkvRixpQ0FBaUM7a0JBN0k3QyxTQUFTOytCQUNFLDZCQUE2QixjQUMzQixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxnQ0FBZ0MsQ0FBQyxtQkFDMUYsdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4RFQ7OEJBK0VrQyxjQUFjO3NCQUFoRCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFHeEIsTUFBTTtzQkFBZCxLQUFLO2dCQU1HLEdBQUc7c0JBQVgsS0FBSztnQkFHSSxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgaW5qZWN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlIH0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBVaUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2J1dHRvbi9pbmRleCc7XHJcblxyXG5pbXBvcnQgeyBVaUZvcm1TY2hlbWEgfSBmcm9tICcuLi8uLi8uLi9mb3JtLWJ1aWxkZXIvdHlwZXMvaW5kZXgnO1xyXG5pbXBvcnQgeyBVaUZvcm1CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZm9ybS1idWlsZGVyL2Zvcm0tYnVpbGRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVaUVkaXRvckZvcm1WYWx1ZXNQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0tdmFsdWVzLXBhbmVsL2Zvcm0tdmFsdWVzLXBhbmVsLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQ29udGVuaXRvcmUgcGVyIGwnYW50ZXByaW1hIGxpdmUgZGVsIGZvcm0gaW4gZmFzZSBkaSBlZGl0aW5nLlxyXG4gKlxyXG4gKiBNb3N0cmEgdW5hIHByZXZpZXcgZGVsIGZvcm0gYnVpbGRlciBnZW5lcmF0byBkYWxsbyBzY2hlbWEgY29ycmVudGUsXHJcbiAqIGNvbiBwb3NzaWJpbGl0YSBkaSBhZ2dpb3JuYW1lbnRvIGZvcnphdG8gZSBwYW5uZWxsbyBkZWkgdmFsb3JpLlxyXG4gKlxyXG4gKiBAc2VsZWN0b3IgdWktZWRpdG9yLXByZXZpZXctY29udGFpbmVyXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLWVkaXRvci1wcmV2aWV3LWNvbnRhaW5lcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTHVjaWRlQW5ndWxhck1vZHVsZSwgVWlCdXR0b25Db21wb25lbnQsIFVpRm9ybUJ1aWxkZXJDb21wb25lbnQsIFVpRWRpdG9yRm9ybVZhbHVlc1BhbmVsQ29tcG9uZW50XSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInByZXZpZXctY29udGFpbmVyXCI+XHJcbiAgICAgIDwhLS0gSW50ZXN0YXppb25lIGNvbiBhemlvbmkgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWNvbnRhaW5lcl9faGVhZGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctY29udGFpbmVyX19oZWFkZXItbGVmdFwiPlxyXG4gICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJleWVcIiBbc2l6ZV09XCIxOFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInByZXZpZXctY29udGFpbmVyX190aXRsZVwiPkFudGVwcmltYSBGb3JtPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1jb250YWluZXJfX2hlYWRlci1hY3Rpb25zXCI+XHJcbiAgICAgICAgICA8IS0tIEFnZ2lvcm5hIGFudGVwcmltYSAtLT5cclxuICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgaWNvbj1cInJlZnJlc2gtY3dcIlxyXG4gICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxyXG4gICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICB0b29sdGlwPVwiQWdnaW9ybmEgYW50ZXByaW1hXCJcclxuICAgICAgICAgICAgYXJpYUxhYmVsPVwiQWdnaW9ybmEgYW50ZXByaW1hXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInJlZnJlc2guZW1pdCgpXCJcclxuICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgPCEtLSBNb3N0cmEvbmFzY29uZGkgcGFubmVsbG8gdmFsb3JpIC0tPlxyXG4gICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICBpY29uPVwiY29kZVwiXHJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXHJcbiAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgIHRvb2x0aXA9XCJNb3N0cmEvbmFzY29uZGkgdmFsb3JpIGZvcm1cIlxyXG4gICAgICAgICAgICBhcmlhTGFiZWw9XCJNb3N0cmEvbmFzY29uZGkgdmFsb3JpIGZvcm1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlVmFsdWVzUGFuZWwoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gQ29udGVudXRvIGFudGVwcmltYSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctY29udGFpbmVyX19jb250ZW50XCI+XHJcbiAgICAgICAgQGlmICghcHJldmlld1NjaGVtYSB8fCAhcHJldmlld1NjaGVtYS5zZWN0aW9ucyB8fCBwcmV2aWV3U2NoZW1hLnNlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgPCEtLSBTdGF0byB2dW90bzogbmVzc3VubyBzY2hlbWEgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1jb250YWluZXJfX2VtcHR5XCI+XHJcbiAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwibGF5b3V0LXRlbXBsYXRlXCIgW3NpemVdPVwiNDBcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cInByZXZpZXctY29udGFpbmVyX19lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgQWdnaXVuZ2kgc2V6aW9uaSBlIGNhbXBpIHBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWFcclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICA8IS0tIFJlbmRlcmluZyBkZWwgZm9ybSBidWlsZGVyIGNvbiBzbmFwc2hvdCBkZWxsbyBzY2hlbWEgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1jb250YWluZXJfX2Zvcm0td3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8dWktZm9ybS1idWlsZGVyXHJcbiAgICAgICAgICAgICAgW3NjaGVtYV09XCJwcmV2aWV3U2NoZW1hXCJcclxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25Gb3JtQnVpbGRlclZhbHVlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gUGFubmVsbG8gdmFsb3JpIGluIGJhc3NvIC0tPlxyXG4gICAgICA8dWktZWRpdG9yLWZvcm0tdmFsdWVzLXBhbmVsXHJcbiAgICAgICAgW2Zvcm1WYWx1ZXNdPVwiY3VycmVudEZvcm1WYWx1ZXNcIlxyXG4gICAgICAgIFtpc09wZW5dPVwiaXNWYWx1ZXNQYW5lbE9wZW5cIlxyXG4gICAgICAgICh2YWx1ZXNDaGFuZ2UpPVwib25Gb3JtVmFsdWVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIChyZWZyZXNoVmFsdWVzKT1cIm9uUmVmcmVzaFZhbHVlcygpXCJcclxuICAgICAgICAodG9nZ2xlKT1cInRvZ2dsZVZhbHVlc1BhbmVsKClcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgIC8qIENvbnRlbml0b3JlIHByaW5jaXBhbGUgZGVsbCdhbnRlcHJpbWEgKi9cclxuICAgIC5wcmV2aWV3LWNvbnRhaW5lciB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3ItYmctc3VidGxlLCAjZmFmYWZhKTtcclxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIEludGVzdGF6aW9uZSBkZWxsJ2FudGVwcmltYSAqL1xyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19oZWFkZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgICAgIHBhZGRpbmc6IHZhcigtLXVpLXNwYWNpbmctMiwgOHB4KSB2YXIoLS11aS1zcGFjaW5nLTQsIDE2cHgpO1xyXG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tdWktY29sb3ItYm9yZGVyLCAjZTBlMGUwKTtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3Itc3VyZmFjZSwgI2ZmZik7XHJcbiAgICB9XHJcblxyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19oZWFkZXItbGVmdCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0yLCA4cHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC5wcmV2aWV3LWNvbnRhaW5lcl9fdGl0bGUge1xyXG4gICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICBmb250LXNpemU6IHZhcigtLXVpLWZvbnQtc2l6ZS1zbSwgMC44NzVyZW0pO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dCwgIzIxMjEyMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19oZWFkZXItYWN0aW9ucyB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0xLCA0cHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIEFyZWEgZGkgY29udGVudXRvIHNjcm9sbGFiaWxlICovXHJcbiAgICAucHJldmlldy1jb250YWluZXJfX2NvbnRlbnQge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTQsIDE2cHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFN0YXRvIHZ1b3RvOiBuZXNzdW5vIHNjaGVtYSBkaXNwb25pYmlsZSAqL1xyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19lbXB0eSB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBnYXA6IHZhcigtLXVpLXNwYWNpbmctMywgMTJweCk7XHJcbiAgICAgIHBhZGRpbmc6IHZhcigtLXVpLXNwYWNpbmctOCwgNjRweCkgdmFyKC0tdWktc3BhY2luZy00LCAxNnB4KTtcclxuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dC1tdXRlZCwgIzllOWU5ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19lbXB0eS10ZXh0IHtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUtc20sIDAuODc1cmVtKTtcclxuICAgICAgbWFyZ2luOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFdyYXBwZXIgZGVsIGZvcm0gYnVpbGRlciByZW5kZXJpenphdG8gKi9cclxuICAgIC5wcmV2aWV3LWNvbnRhaW5lcl9fZm9ybS13cmFwcGVyIHtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3Itc3VyZmFjZSwgI2ZmZik7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVpLXJhZGl1cy1tZCwgOHB4KTtcclxuICAgICAgcGFkZGluZzogdmFyKC0tdWktc3BhY2luZy00LCAxNnB4KTtcclxuICAgICAgYm94LXNoYWRvdzogdmFyKC0tdWktc2hhZG93LXNtLCAwIDFweCAzcHggcmdiYSgwLDAsMCwwLjEpKTtcclxuICAgIH1cclxuICBgLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaUVkaXRvclByZXZpZXdDb250YWluZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIC8qKiBAaW50ZXJuYWwgQ2hhbmdlIGRldGVjdG9yIHBlciBPblB1c2guICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG5cclxuICAvKiogUmlmZXJpbWVudG8gYWxsJ2lzdGFuemEgZGVsIGZvcm0gYnVpbGRlciBwZXIgbGVnZ2VyZSBpIHZhbG9yaS4gKi9cclxuICBAVmlld0NoaWxkKFVpRm9ybUJ1aWxkZXJDb21wb25lbnQpIGZvcm1CdWlsZGVyUmVmPzogVWlGb3JtQnVpbGRlckNvbXBvbmVudDtcclxuXHJcbiAgLyoqIFNjaGVtYSBkZWwgZm9ybSByaWNldnV0byBkYWwgcGFyZW50IChjYW1iaWEgYWQgb2duaSBtb2RpZmljYSBuZWxsJ2VkaXRvcikuICovXHJcbiAgQElucHV0KCkgc2NoZW1hOiBVaUZvcm1TY2hlbWEgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2hpYXZlIHBlciBmb3J6YXJlIGxhIHJpLWNyZWF6aW9uZSBkZWwgZm9ybSBidWlsZGVyLlxyXG4gICAqIFZpZW5lIGluY3JlbWVudGF0YSBkYWwgY29tcG9uZW50ZSBwYWRyZSBwZXIgaW52YWxpZGFyZSBsJ2FudGVwcmltYS5cclxuICAgKi9cclxuICBASW5wdXQoKSBrZXk6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKiBFbWVzc28gYWxsYSByaWNoaWVzdGEgZGkgYWdnaW9ybmFtZW50byBmb3J6YXRvIGRlbGwnYW50ZXByaW1hLiAqL1xyXG4gIEBPdXRwdXQoKSByZWZyZXNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBTbmFwc2hvdCBpbW11dGFiaWxlIGRlbGxvIHNjaGVtYSB1c2F0byBwZXIgaWwgcmVuZGVyaW5nLlxyXG4gICAqIFZpZW5lIGFnZ2lvcm5hdG8gU09MTyBhbCBwcmltbyBjYXJpY2FtZW50bywgYWwgY2FtYmlvIHRhYlxyXG4gICAqIChxdWFuZG8gYGtleWAgY2FtYmlhKSBvIGFsIHJlZnJlc2ggZXNwbGljaXRvLlxyXG4gICAqIFF1ZXN0byBldml0YSBjaGUgbGUgbW9kaWZpY2hlIG5lbGwnZWRpdG9yIHJpY29zdHJ1aXNjYW5vXHJcbiAgICogY29udGludWFtZW50ZSBpbCBmb3JtLCBwZXJkZW5kbyBsbyBzdGF0byBkZWxsJ3V0ZW50ZS5cclxuICAgKi9cclxuICBwcmV2aWV3U2NoZW1hOiBVaUZvcm1TY2hlbWEgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIFN0YXRvIGRpIGFwZXJ0dXJhIGRlbCBwYW5uZWxsbyB2YWxvcmkgaW4gYmFzc28uICovXHJcbiAgaXNWYWx1ZXNQYW5lbE9wZW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFZhbG9yaSBjb3JyZW50aSBkZWwgZm9ybSBuZWxsJ2FudGVwcmltYS4gKi9cclxuICBjdXJyZW50Rm9ybVZhbHVlczogYW55ID0ge307XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgVWx0aW1vIHZhbG9yZSBkaSBga2V5YCBhcHBsaWNhdG8gYWxsbyBzbmFwc2hvdC4gKi9cclxuICBwcml2YXRlIGxhc3RBcHBsaWVkS2V5ID0gLTE7XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGNvbnN0IGtleUNoYW5nZWQgPSBjaGFuZ2VzWydrZXknXSAmJiB0aGlzLmtleSAhPT0gdGhpcy5sYXN0QXBwbGllZEtleTtcclxuICAgIGNvbnN0IGZpcnN0U2NoZW1hID0gY2hhbmdlc1snc2NoZW1hJ10/LmZpcnN0Q2hhbmdlO1xyXG5cclxuICAgIGlmIChrZXlDaGFuZ2VkIHx8IGZpcnN0U2NoZW1hKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlTY2hlbWFTbmFwc2hvdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmljZXZlIGkgdmFsb3JpIGFnZ2lvcm5hdGkgZGFsIGZvcm0gYnVpbGRlciBhZCBvZ25pIGludGVyYXppb25lLlxyXG4gICAqIEBwYXJhbSB2YWx1ZXMgLSBWYWxvcmkgY29ycmVudGkgZGVsIGZvcm0gKGluY2x1c2kgY2FtcGkgZGlzYWJpbGl0YXRpKVxyXG4gICAqL1xyXG4gIG9uRm9ybUJ1aWxkZXJWYWx1ZUNoYW5nZSh2YWx1ZXM6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50Rm9ybVZhbHVlcyA9IHZhbHVlcztcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFsdGVybmEgbGEgdmlzaWJpbGl0YSBkZWwgcGFubmVsbG8gZGVpIHZhbG9yaSBkZWwgZm9ybS4gKi9cclxuICB0b2dnbGVWYWx1ZXNQYW5lbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNWYWx1ZXNQYW5lbE9wZW4gPSAhdGhpcy5pc1ZhbHVlc1BhbmVsT3BlbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlc3Rpc2NlIGlsIGNhbWJpYW1lbnRvIGRlaSB2YWxvcmkgZGFsIHBhbm5lbGxvIEpTT04uXHJcbiAgICogQHBhcmFtIHZhbHVlcyAtIE51b3ZpIHZhbG9yaSBwYXJzYXRpIGRhbCBKU09OXHJcbiAgICovXHJcbiAgb25Gb3JtVmFsdWVzQ2hhbmdlKHZhbHVlczogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRGb3JtVmFsdWVzID0gdmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWdnaW9ybmEgaSB2YWxvcmkgbGVnZ2VuZG8gbG8gc3RhdG8gY29ycmVudGUgZGFsIGZvcm0gYnVpbGRlci5cclxuICAgKi9cclxuICBvblJlZnJlc2hWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQnVpbGRlclJlZikge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb3JtVmFsdWVzID0gdGhpcy5mb3JtQnVpbGRlclJlZi5nZXRGb3JtVmFsdWUoKTtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKiBDcmVhIHVuYSBjb3BpYSBwcm9mb25kYSBkZWxsbyBzY2hlbWEgY29ycmVudGUgY29tZSBzbmFwc2hvdFxyXG4gICAqIHBlciBpbCByZW5kZXJpbmcgZGVsbCdhbnRlcHJpbWEuIEwnaWQgdmllbmUgcmVzbyB1bml2b2NvXHJcbiAgICogcGVyIGZvcnphcmUgaWwgcmVidWlsZCBkZWwgZm9ybSBidWlsZGVyIChjaGUgcmljb3N0cnVpc2NlXHJcbiAgICogc29sbyBxdWFuZG8gYHNjaGVtYS5pZGAgY2FtYmlhKS5cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5U2NoZW1hU25hcHNob3QoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zY2hlbWEpIHtcclxuICAgICAgY29uc3Qgc25hcHNob3QgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5zY2hlbWEpO1xyXG4gICAgICBzbmFwc2hvdC5pZCA9IGAke3NuYXBzaG90LmlkfV9fcHJldmlld18ke3RoaXMua2V5fWA7XHJcbiAgICAgIHRoaXMucHJldmlld1NjaGVtYSA9IHNuYXBzaG90O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wcmV2aWV3U2NoZW1hID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMubGFzdEFwcGxpZWRLZXkgPSB0aGlzLmtleTtcclxuICAgIHRoaXMuY3VycmVudEZvcm1WYWx1ZXMgPSB7fTtcclxuICB9XHJcbn1cclxuIl19