@aquera/ngx-smart-table 0.0.2-alpha

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 (169) hide show
  1. package/README.md +152 -0
  2. package/aquera-ngx-smart-table.d.ts +5 -0
  3. package/esm2020/aquera-ngx-smart-table.mjs +5 -0
  4. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
  5. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
  6. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
  7. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
  8. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
  9. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
  10. package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
  11. package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
  12. package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
  13. package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
  14. package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
  15. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
  16. package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
  17. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
  18. package/esm2020/lib/editors/index.mjs +9 -0
  19. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
  20. package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
  21. package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
  22. package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
  23. package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
  24. package/esm2020/lib/factories/column-config.factory.mjs +231 -0
  25. package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
  26. package/esm2020/lib/models/base-column-config.class.mjs +253 -0
  27. package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
  28. package/esm2020/lib/models/cell-types.mjs +147 -0
  29. package/esm2020/lib/models/column-action.interface.mjs +6 -0
  30. package/esm2020/lib/models/column-config.interface.mjs +43 -0
  31. package/esm2020/lib/models/column-config.utils.mjs +101 -0
  32. package/esm2020/lib/models/row-action.interface.mjs +5 -0
  33. package/esm2020/lib/models/row-validator.interface.mjs +2 -0
  34. package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
  35. package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
  36. package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
  37. package/esm2020/lib/models/table-config.interface.mjs +106 -0
  38. package/esm2020/lib/models/table-validator.interface.mjs +2 -0
  39. package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
  40. package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
  41. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
  42. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
  43. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
  44. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
  45. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
  46. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
  47. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
  48. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
  49. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
  50. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
  51. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
  52. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
  53. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
  54. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
  55. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
  56. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
  57. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
  58. package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
  59. package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
  60. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
  61. package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
  62. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
  63. package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
  64. package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
  65. package/esm2020/lib/renderer/models/table-types.mjs +29 -0
  66. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
  67. package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
  68. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
  69. package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
  70. package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
  71. package/esm2020/lib/services/autosave.service.mjs +92 -0
  72. package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
  73. package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
  74. package/esm2020/lib/services/row-validation.service.mjs +42 -0
  75. package/esm2020/lib/services/validation-logger.service.mjs +177 -0
  76. package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
  77. package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
  78. package/esm2020/lib/smart-table.module.mjs +124 -0
  79. package/esm2020/lib/strategies/default-editors.mjs +433 -0
  80. package/esm2020/lib/strategies/default-formatters.mjs +238 -0
  81. package/esm2020/lib/strategies/default-validators.mjs +327 -0
  82. package/esm2020/public-api.mjs +146 -0
  83. package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
  84. package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
  85. package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
  86. package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
  87. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
  88. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
  89. package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
  90. package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
  91. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
  92. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
  93. package/lib/builder/definition-builder.module.d.ts +15 -0
  94. package/lib/builder/models/builder-state.interface.d.ts +93 -0
  95. package/lib/builder/services/definition-builder.service.d.ts +80 -0
  96. package/lib/builder/services/definition-export.service.d.ts +59 -0
  97. package/lib/builder/services/definition-import.service.d.ts +31 -0
  98. package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
  99. package/lib/builder/utils/config-validator.util.d.ts +32 -0
  100. package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
  101. package/lib/editors/index.d.ts +8 -0
  102. package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
  103. package/lib/editors/nile-calendar-editor.d.ts +89 -0
  104. package/lib/editors/nile-date-picker-editor.d.ts +95 -0
  105. package/lib/editors/nile-input-editor.d.ts +67 -0
  106. package/lib/editors/nile-select-editor.d.ts +109 -0
  107. package/lib/factories/column-config.factory.d.ts +73 -0
  108. package/lib/models/autosave-config.interface.d.ts +23 -0
  109. package/lib/models/base-column-config.class.d.ts +115 -0
  110. package/lib/models/cell-strategies.interface.d.ts +181 -0
  111. package/lib/models/cell-types.d.ts +337 -0
  112. package/lib/models/column-action.interface.d.ts +86 -0
  113. package/lib/models/column-config.interface.d.ts +272 -0
  114. package/lib/models/column-config.utils.d.ts +37 -0
  115. package/lib/models/row-action.interface.d.ts +86 -0
  116. package/lib/models/row-validator.interface.d.ts +37 -0
  117. package/lib/models/schema-validation.interface.d.ts +42 -0
  118. package/lib/models/sheet-action.interface.d.ts +59 -0
  119. package/lib/models/sheet-config.interface.d.ts +41 -0
  120. package/lib/models/table-config.interface.d.ts +245 -0
  121. package/lib/models/table-validator.interface.d.ts +40 -0
  122. package/lib/models/workbook-action.interface.d.ts +90 -0
  123. package/lib/models/workbook-config.interface.d.ts +107 -0
  124. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
  125. package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
  126. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
  127. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
  128. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
  129. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
  130. package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
  131. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
  132. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
  133. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
  134. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
  135. package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
  136. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
  137. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
  138. package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
  139. package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
  140. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
  141. package/lib/renderer/models/cell-state.interface.d.ts +118 -0
  142. package/lib/renderer/models/cell.class.d.ts +174 -0
  143. package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
  144. package/lib/renderer/models/sheet-state.class.d.ts +67 -0
  145. package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
  146. package/lib/renderer/models/table-state.class.d.ts +313 -0
  147. package/lib/renderer/models/table-state.interface.d.ts +18 -0
  148. package/lib/renderer/models/table-types.d.ts +228 -0
  149. package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
  150. package/lib/renderer/models/workbook-state.class.d.ts +117 -0
  151. package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
  152. package/lib/renderer/models/z-index.enum.d.ts +44 -0
  153. package/lib/schemas/table-config.schema.d.ts +455 -0
  154. package/lib/services/autosave.service.d.ts +73 -0
  155. package/lib/services/custom-validation-rules.util.d.ts +12 -0
  156. package/lib/services/json-schema-validator.service.d.ts +49 -0
  157. package/lib/services/row-validation.service.d.ts +17 -0
  158. package/lib/services/validation-logger.service.d.ts +87 -0
  159. package/lib/services/virtual-scroll.service.d.ts +44 -0
  160. package/lib/shared/shared-table-components.module.d.ts +9 -0
  161. package/lib/smart-table.module.d.ts +26 -0
  162. package/lib/strategies/default-editors.d.ts +109 -0
  163. package/lib/strategies/default-formatters.d.ts +116 -0
  164. package/lib/strategies/default-validators.d.ts +113 -0
  165. package/package.json +42 -0
  166. package/public-api.d.ts +70 -0
  167. package/src/lib/builder/README.md +30 -0
  168. package/src/lib/editors/README.md +303 -0
  169. package/src/lib/renderer/components/st-column-filter/README.md +286 -0
@@ -0,0 +1,391 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, HostListener } from '@angular/core';
2
+ import { EditMode, NavigationKey, NavigationDirection } from '../../../models/cell-types';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ export class StCellComponent {
6
+ constructor() {
7
+ this.editMode = EditMode.CLICK;
8
+ this.cellChange = new EventEmitter();
9
+ this.cellEdit = new EventEmitter();
10
+ this.cellSave = new EventEmitter();
11
+ this.cellCancel = new EventEmitter();
12
+ this.cellSaveAndNavigate = new EventEmitter();
13
+ }
14
+ ngOnInit() {
15
+ // Subscribe to editing position changes
16
+ // When another cell starts editing, save this cell if it's currently editing
17
+ if (this.tableState && this.columnIndex !== undefined) {
18
+ this.editingPositionSubscription = this.tableState.editingCellPosition$.subscribe(position => {
19
+ const rowIndex = this.cell.getRowIndex();
20
+ // If this cell is currently editing
21
+ if (this.cell.isEditing() && rowIndex !== undefined) {
22
+ // And the new editing position is a different cell
23
+ if (position &&
24
+ (position.rowIndex !== rowIndex || position.columnIndex !== this.columnIndex)) {
25
+ // Force save this cell
26
+ this.saveEdit(this.cell.getValue());
27
+ }
28
+ }
29
+ });
30
+ }
31
+ }
32
+ ngAfterViewInit() {
33
+ // If cell is already in editing mode, render the editor
34
+ if (this.cell.isEditing() && this.editorContainer) {
35
+ this.renderEditor();
36
+ }
37
+ }
38
+ ngOnDestroy() {
39
+ this.cleanupEditor();
40
+ // Unsubscribe from editing position changes
41
+ if (this.editingPositionSubscription) {
42
+ this.editingPositionSubscription.unsubscribe();
43
+ }
44
+ }
45
+ get isEditable() {
46
+ const config = this.cell.getColumnConfig();
47
+ return config.editable ?? false;
48
+ }
49
+ get validationError() {
50
+ // Read validation state without triggering validation
51
+ // This prevents ExpressionChangedAfterItHasBeenCheckedError
52
+ const state = this.cell.getState();
53
+ if (state.error) {
54
+ return state.error;
55
+ }
56
+ if (state.errors && Array.isArray(state.errors) && state.errors.length > 0) {
57
+ return state.errors.join(', ');
58
+ }
59
+ // Only return generic message if cell is marked as invalid
60
+ if (!this.cell.isValid()) {
61
+ return 'Invalid value';
62
+ }
63
+ return undefined;
64
+ }
65
+ get hasCellTemplate() {
66
+ const config = this.cell.getColumnConfig();
67
+ return !!config.cellTemplate;
68
+ }
69
+ get cellTemplate() {
70
+ return this.cell.getColumnConfig().cellTemplate || null;
71
+ }
72
+ get templateContext() {
73
+ return {
74
+ $implicit: this.cell.getValue(),
75
+ cell: this.cell,
76
+ rowData: this.cell.getRowData(),
77
+ rowIndex: this.cell.getRowIndex()
78
+ };
79
+ }
80
+ onCellKeyDown(event) {
81
+ // Only handle if this cell is focused
82
+ if (!this.cell.isFocused()) {
83
+ return;
84
+ }
85
+ // Use NavigationKey enum for type-safe key checking
86
+ switch (event.key) {
87
+ case NavigationKey.ENTER:
88
+ if (this.cell.isEditing()) {
89
+ // Save and let navigation happen
90
+ event.preventDefault();
91
+ event.stopPropagation();
92
+ this.saveEdit(this.cell.getValue());
93
+ // Emit event to trigger navigation down
94
+ this.cellSaveAndNavigate.emit({ event, direction: NavigationDirection.DOWN });
95
+ }
96
+ // If not editing, let directive handle navigation
97
+ break;
98
+ case NavigationKey.TAB:
99
+ if (this.cell.isEditing()) {
100
+ // Save and let navigation happen
101
+ event.preventDefault();
102
+ event.stopPropagation();
103
+ this.saveEdit(this.cell.getValue());
104
+ const direction = event.shiftKey ? NavigationDirection.LEFT : NavigationDirection.RIGHT;
105
+ this.cellSaveAndNavigate.emit({ event, direction });
106
+ }
107
+ // If not editing, let directive handle navigation
108
+ break;
109
+ case NavigationKey.ESCAPE:
110
+ if (this.cell.isEditing()) {
111
+ event.preventDefault();
112
+ event.stopPropagation();
113
+ this.cancelEdit();
114
+ // Stay focused on same cell (no navigation)
115
+ }
116
+ break;
117
+ default:
118
+ // Check for alphanumeric keys when focused but not editing
119
+ if (!this.cell.isEditing() && this.isAlphanumericKey(event)) {
120
+ if (this.canEditViaKeyboard()) {
121
+ event.preventDefault();
122
+ event.stopPropagation();
123
+ // Start editing with the pressed key as initial value
124
+ this.startEditWithKey(event.key);
125
+ }
126
+ }
127
+ break;
128
+ }
129
+ }
130
+ /**
131
+ * Check if Enter key can trigger editing
132
+ * Using EditMode enum values
133
+ */
134
+ canEditViaEnter() {
135
+ return this.isEditable &&
136
+ (this.editMode === EditMode.ENTER || this.editMode === EditMode.CLICK);
137
+ }
138
+ /**
139
+ * Check if keyboard can trigger editing (for alphanumeric and double-click)
140
+ */
141
+ canEditViaKeyboard() {
142
+ return this.isEditable &&
143
+ (this.editMode === EditMode.ENTER || this.editMode === EditMode.CLICK);
144
+ }
145
+ /**
146
+ * Check if a key is alphanumeric (single character)
147
+ */
148
+ isAlphanumericKey(event) {
149
+ // Single character keys (letters, numbers, symbols)
150
+ return event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;
151
+ }
152
+ /**
153
+ * Start editing with a specific key as the initial value
154
+ */
155
+ startEditWithKey(key) {
156
+ const canStart = this.cell.startEdit();
157
+ if (canStart) {
158
+ // Replace current value with the key
159
+ this.cell.setValue(key, false);
160
+ const column = this.cell.getColumnConfig();
161
+ const editEvent = {
162
+ cell: this.cell,
163
+ value: key,
164
+ rowData: this.cell.getRowData(),
165
+ columnKey: column.key,
166
+ rowIndex: this.cell.getRowIndex(),
167
+ cellState: this.cell.getState()
168
+ };
169
+ this.cellEdit.emit(editEvent);
170
+ setTimeout(() => {
171
+ this.renderEditor();
172
+ }, 0);
173
+ }
174
+ }
175
+ onCellClick() {
176
+ // Single click now only focuses, doesn't start editing
177
+ // Focus is handled by parent st-table component
178
+ }
179
+ onCellDoubleClick() {
180
+ // Double-click starts editing regardless of EditMode (Excel-like behavior)
181
+ if (this.isEditable && !this.cell.isEditing()) {
182
+ this.startEdit();
183
+ }
184
+ }
185
+ startEdit() {
186
+ const canStart = this.cell.startEdit();
187
+ if (canStart) {
188
+ const column = this.cell.getColumnConfig();
189
+ // Notify TableState that this cell is now editing
190
+ if (this.tableState && this.columnIndex !== undefined) {
191
+ const rowIndex = this.cell.getRowIndex();
192
+ if (rowIndex !== undefined) {
193
+ this.tableState.setEditingCell(rowIndex, this.columnIndex);
194
+ }
195
+ }
196
+ const editEvent = {
197
+ cell: this.cell,
198
+ value: this.cell.getValue(),
199
+ rowData: this.cell.getRowData(),
200
+ columnKey: column.key,
201
+ rowIndex: this.cell.getRowIndex(),
202
+ cellState: this.cell.getState()
203
+ };
204
+ this.cellEdit.emit(editEvent);
205
+ // Wait for Angular to render the editor container
206
+ setTimeout(() => {
207
+ this.renderEditor();
208
+ }, 0);
209
+ }
210
+ }
211
+ renderEditor() {
212
+ if (!this.editorContainer) {
213
+ return;
214
+ }
215
+ const column = this.cell.getColumnConfig();
216
+ const editor = column.editor;
217
+ if (!editor) {
218
+ console.warn('No editor configured for column:', column.key);
219
+ return;
220
+ }
221
+ const value = this.cell.getValue();
222
+ const container = this.editorContainer.nativeElement;
223
+ // Create editor context
224
+ const context = {
225
+ value,
226
+ rowData: this.cell.getRowData(),
227
+ columnKey: column.key,
228
+ rowIndex: this.cell.getRowIndex(),
229
+ onChange: (newValue) => {
230
+ // Trigger eager validation if enabled
231
+ if (this.tableConfig?.validation?.mode === 'eager') {
232
+ // Update cell value temporarily for validation
233
+ this.cell.setValue(newValue, true); // skip validation to avoid double validation
234
+ this.triggerEagerValidation();
235
+ }
236
+ },
237
+ onSave: (newValue) => {
238
+ this.saveEdit(newValue);
239
+ },
240
+ onCancel: () => {
241
+ this.cancelEdit();
242
+ },
243
+ container
244
+ };
245
+ // Call editor's edit method
246
+ editor.edit(context);
247
+ // Store cleanup callback
248
+ this.editorCleanup = () => {
249
+ if (editor.destroy) {
250
+ editor.destroy();
251
+ }
252
+ // Clear container
253
+ while (container.firstChild) {
254
+ container.removeChild(container.firstChild);
255
+ }
256
+ };
257
+ }
258
+ saveEdit(newValue) {
259
+ const previousValue = this.cell.getValue();
260
+ const wasValid = this.cell.isValid();
261
+ const success = this.cell.saveEdit(newValue);
262
+ if (success) {
263
+ const column = this.cell.getColumnConfig();
264
+ const cellState = this.cell.getState();
265
+ const isValid = this.cell.isValid();
266
+ // Notify TableState that editing ended
267
+ if (this.tableState) {
268
+ this.tableState.clearEditingCell();
269
+ // Update validation state (lazy mode - on save)
270
+ this.updateValidationState();
271
+ }
272
+ // Emit save event
273
+ const saveEvent = {
274
+ cell: this.cell,
275
+ newValue: newValue,
276
+ previousValue: previousValue,
277
+ rowData: this.cell.getRowData(),
278
+ columnKey: column.key,
279
+ rowIndex: this.cell.getRowIndex(),
280
+ isValid: isValid,
281
+ validationErrors: cellState.error ? [cellState.error] : undefined,
282
+ cellState: cellState
283
+ };
284
+ this.cellSave.emit(saveEvent);
285
+ // Emit change event
286
+ const changeEvent = {
287
+ cell: this.cell,
288
+ oldValue: previousValue,
289
+ newValue: newValue,
290
+ rowData: this.cell.getRowData(),
291
+ columnKey: column.key,
292
+ rowIndex: this.cell.getRowIndex(),
293
+ wasValid: wasValid,
294
+ isValid: isValid,
295
+ cellState: cellState
296
+ };
297
+ this.cellChange.emit(changeEvent);
298
+ this.cleanupEditor();
299
+ }
300
+ // If validation fails, keep editing mode
301
+ }
302
+ /**
303
+ * Update validation state in TableState
304
+ * Called on save (lazy mode) or on change (eager mode)
305
+ */
306
+ updateValidationState() {
307
+ if (!this.tableState)
308
+ return;
309
+ const column = this.cell.getColumnConfig();
310
+ const isValid = this.cell.isValid();
311
+ const error = this.cell.getState().error;
312
+ const rowIndex = this.cell.getRowIndex();
313
+ // Only update if rowIndex is defined
314
+ if (rowIndex === undefined)
315
+ return;
316
+ this.tableState.updateCellValidation(rowIndex, column.key, isValid, error);
317
+ }
318
+ /**
319
+ * Trigger eager validation (on every change)
320
+ */
321
+ triggerEagerValidation() {
322
+ if (!this.tableState || !this.tableConfig)
323
+ return;
324
+ const validationMode = this.tableConfig.validation?.mode || 'lazy';
325
+ if (validationMode !== 'eager')
326
+ return;
327
+ // Re-validate the cell
328
+ this.cell.validate();
329
+ // Update validation state
330
+ this.updateValidationState();
331
+ }
332
+ cancelEdit() {
333
+ const column = this.cell.getColumnConfig();
334
+ const cellState = this.cell.getState();
335
+ // Notify TableState that editing ended
336
+ if (this.tableState) {
337
+ this.tableState.clearEditingCell();
338
+ }
339
+ const cancelEvent = {
340
+ cell: this.cell,
341
+ value: this.cell.getValue(),
342
+ previousValue: cellState.previousValue,
343
+ rowData: this.cell.getRowData(),
344
+ columnKey: column.key,
345
+ rowIndex: this.cell.getRowIndex(),
346
+ cellState: cellState
347
+ };
348
+ this.cell.cancelEdit();
349
+ this.cellCancel.emit(cancelEvent);
350
+ this.cleanupEditor();
351
+ }
352
+ cleanupEditor() {
353
+ if (this.editorCleanup) {
354
+ this.editorCleanup();
355
+ this.editorCleanup = undefined;
356
+ }
357
+ }
358
+ }
359
+ StCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
360
+ StCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StCellComponent, selector: "st-cell", inputs: { cell: "cell", editMode: "editMode", tableState: "tableState", tableConfig: "tableConfig", columnIndex: "columnIndex" }, outputs: { cellChange: "cellChange", cellEdit: "cellEdit", cellSave: "cellSave", cellCancel: "cellCancel", cellSaveAndNavigate: "cellSaveAndNavigate" }, host: { listeners: { "keydown": "onCellKeyDown($event)" } }, viewQueries: [{ propertyName: "editorContainer", first: true, predicate: ["editorContainer"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"st-cell\" \n [ngClass]=\"{\n 'editing': cell.isEditing(),\n 'dirty': cell.isDirty(),\n 'invalid': !cell.isValid(),\n 'readonly': !isEditable\n }\"\n (click)=\"onCellClick()\" \n (dblclick)=\"onCellDoubleClick()\">\n\n <!-- Display Mode with Template Support -->\n <ng-container *ngIf=\"!cell.isEditing()\">\n <!-- Custom Template -->\n <ng-container *ngIf=\"hasCellTemplate\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: templateContext\"></ng-container>\n </ng-container>\n\n <!-- Default Text Rendering -->\n <span *ngIf=\"!hasCellTemplate\" class=\"cell-display\">\n {{ cell.render() }}\n </span>\n </ng-container>\n\n <!-- Edit Mode -->\n <div *ngIf=\"cell.isEditing()\" class=\"cell-editor\" #editorContainer>\n </div>\n</div>", styles: [".st-cell{position:relative;cursor:pointer;transition:background-color .2s;min-height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;box-sizing:border-box}.st-cell.invalid{border-left:2px solid #e53e3e}.st-cell.readonly{cursor:default}.cell-display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-content:center;width:100%;height:100%;padding-left:4px;font-size:12px;font-weight:300;letter-spacing:.2px;line-height:14px}.cell-editor{display:flex;height:100%;width:100%}.cell-editor input,.cell-editor select,.cell-editor textarea{width:100%;border:none;outline:none;font:inherit;padding:0;background:transparent;color:inherit}.cell-editor input[type=number]{text-align:inherit}.cell-error{position:absolute;right:4px;top:50%;transform:translateY(-50%);color:#e53e3e;font-weight:700;cursor:help;font-size:14px}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
361
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StCellComponent, decorators: [{
362
+ type: Component,
363
+ args: [{ selector: 'st-cell', template: "<div class=\"st-cell\" \n [ngClass]=\"{\n 'editing': cell.isEditing(),\n 'dirty': cell.isDirty(),\n 'invalid': !cell.isValid(),\n 'readonly': !isEditable\n }\"\n (click)=\"onCellClick()\" \n (dblclick)=\"onCellDoubleClick()\">\n\n <!-- Display Mode with Template Support -->\n <ng-container *ngIf=\"!cell.isEditing()\">\n <!-- Custom Template -->\n <ng-container *ngIf=\"hasCellTemplate\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: templateContext\"></ng-container>\n </ng-container>\n\n <!-- Default Text Rendering -->\n <span *ngIf=\"!hasCellTemplate\" class=\"cell-display\">\n {{ cell.render() }}\n </span>\n </ng-container>\n\n <!-- Edit Mode -->\n <div *ngIf=\"cell.isEditing()\" class=\"cell-editor\" #editorContainer>\n </div>\n</div>", styles: [".st-cell{position:relative;cursor:pointer;transition:background-color .2s;min-height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;box-sizing:border-box}.st-cell.invalid{border-left:2px solid #e53e3e}.st-cell.readonly{cursor:default}.cell-display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-content:center;width:100%;height:100%;padding-left:4px;font-size:12px;font-weight:300;letter-spacing:.2px;line-height:14px}.cell-editor{display:flex;height:100%;width:100%}.cell-editor input,.cell-editor select,.cell-editor textarea{width:100%;border:none;outline:none;font:inherit;padding:0;background:transparent;color:inherit}.cell-editor input[type=number]{text-align:inherit}.cell-error{position:absolute;right:4px;top:50%;transform:translateY(-50%);color:#e53e3e;font-weight:700;cursor:help;font-size:14px}\n"] }]
364
+ }], ctorParameters: function () { return []; }, propDecorators: { cell: [{
365
+ type: Input
366
+ }], editMode: [{
367
+ type: Input
368
+ }], tableState: [{
369
+ type: Input
370
+ }], tableConfig: [{
371
+ type: Input
372
+ }], columnIndex: [{
373
+ type: Input
374
+ }], cellChange: [{
375
+ type: Output
376
+ }], cellEdit: [{
377
+ type: Output
378
+ }], cellSave: [{
379
+ type: Output
380
+ }], cellCancel: [{
381
+ type: Output
382
+ }], cellSaveAndNavigate: [{
383
+ type: Output
384
+ }], editorContainer: [{
385
+ type: ViewChild,
386
+ args: ['editorContainer', { read: ElementRef }]
387
+ }], onCellKeyDown: [{
388
+ type: HostListener,
389
+ args: ['keydown', ['$event']]
390
+ }] } });
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtY2VsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2NvbXBvbmVudHMvc3QtY2VsbC9zdC1jZWxsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1jZWxsL3N0LWNlbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBOEIsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNKLE9BQU8sRUFBa0UsUUFBUSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFTMUosTUFBTSxPQUFPLGVBQWU7SUFtQjFCO1FBakJTLGFBQVEsR0FBYSxRQUFRLENBQUMsS0FBSyxDQUFDO1FBS25DLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNqRCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDN0MsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQzdDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNqRCx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBMEQsQ0FBQztJQVN4RyxDQUFDO0lBRUosUUFBUTtRQUNOLHdDQUF3QztRQUN4Qyw2RUFBNkU7UUFDN0UsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ3JELElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxRQUFR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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBUZW1wbGF0ZVJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDZWxsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NlbGwuY2xhc3MnO1xuaW1wb3J0IHsgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDZWxsRWRpdEV2ZW50LCBDZWxsU2F2ZUV2ZW50LCBDZWxsQ2hhbmdlRXZlbnQsIENlbGxDYW5jZWxFdmVudCwgRWRpdE1vZGUsIE5hdmlnYXRpb25LZXksIE5hdmlnYXRpb25EaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RhYmxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdC1jZWxsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LWNlbGwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC1jZWxsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFN0Q2VsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgY2VsbCE6IENlbGw8YW55PjtcbiAgQElucHV0KCkgZWRpdE1vZGU6IEVkaXRNb2RlID0gRWRpdE1vZGUuQ0xJQ0s7XG4gIEBJbnB1dCgpIHRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBASW5wdXQoKSB0YWJsZUNvbmZpZz86IFRhYmxlQ29uZmlnO1xuICBASW5wdXQoKSBjb2x1bW5JbmRleD86IG51bWJlcjtcbiAgXG4gIEBPdXRwdXQoKSBjZWxsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsQ2hhbmdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjZWxsRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbEVkaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNlbGxTYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsU2F2ZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENhbmNlbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbFNhdmVBbmROYXZpZ2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8e2V2ZW50OiBLZXlib2FyZEV2ZW50LCBkaXJlY3Rpb246IE5hdmlnYXRpb25EaXJlY3Rpb259PigpO1xuICBcbiAgQFZpZXdDaGlsZCgnZWRpdG9yQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGVkaXRvckNvbnRhaW5lcj86IEVsZW1lbnRSZWY7XG4gIFxuICBwcml2YXRlIGVkaXRvckNsZWFudXA/OiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZWRpdGluZ1Bvc2l0aW9uU3Vic2NyaXB0aW9uPzogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gU3Vic2NyaWJlIHRvIGVkaXRpbmcgcG9zaXRpb24gY2hhbmdlc1xuICAgIC8vIFdoZW4gYW5vdGhlciBjZWxsIHN0YXJ0cyBlZGl0aW5nLCBzYXZlIHRoaXMgY2VsbCBpZiBpdCdzIGN1cnJlbnRseSBlZGl0aW5nXG4gICAgaWYgKHRoaXMudGFibGVTdGF0ZSAmJiB0aGlzLmNvbHVtbkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdGluZ1Bvc2l0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZVN0YXRlLmVkaXRpbmdDZWxsUG9zaXRpb24kLnN1YnNjcmliZShwb3NpdGlvbiA9PiB7XG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5jZWxsLmdldFJvd0luZGV4KCk7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB0aGlzIGNlbGwgaXMgY3VycmVudGx5IGVkaXRpbmdcbiAgICAgICAgaWYgKHRoaXMuY2VsbC5pc0VkaXRpbmcoKSAmJiByb3dJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQW5kIHRoZSBuZXcgZWRpdGluZyBwb3NpdGlvbiBpcyBhIGRpZmZlcmVudCBjZWxsXG4gICAgICAgICAgaWYgKHBvc2l0aW9uICYmIFxuICAgICAgICAgICAgICAocG9zaXRpb24ucm93SW5kZXggIT09IHJvd0luZGV4IHx8IHBvc2l0aW9uLmNvbHVtbkluZGV4ICE9PSB0aGlzLmNvbHVtbkluZGV4KSkge1xuICAgICAgICAgICAgLy8gRm9yY2Ugc2F2ZSB0aGlzIGNlbGxcbiAgICAgICAgICAgIHRoaXMuc2F2ZUVkaXQodGhpcy5jZWxsLmdldFZhbHVlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIElmIGNlbGwgaXMgYWxyZWFkeSBpbiBlZGl0aW5nIG1vZGUsIHJlbmRlciB0aGUgZWRpdG9yXG4gICAgaWYgKHRoaXMuY2VsbC5pc0VkaXRpbmcoKSAmJiB0aGlzLmVkaXRvckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZW5kZXJFZGl0b3IoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBFZGl0b3IoKTtcbiAgICBcbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGVkaXRpbmcgcG9zaXRpb24gY2hhbmdlc1xuICAgIGlmICh0aGlzLmVkaXRpbmdQb3NpdGlvblN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5lZGl0aW5nUG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgcmV0dXJuIGNvbmZpZy5lZGl0YWJsZSA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCB2YWxpZGF0aW9uRXJyb3IoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBSZWFkIHZhbGlkYXRpb24gc3RhdGUgd2l0aG91dCB0cmlnZ2VyaW5nIHZhbGlkYXRpb25cbiAgICAvLyBUaGlzIHByZXZlbnRzIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY2VsbC5nZXRTdGF0ZSgpO1xuICAgIFxuICAgIGlmIChzdGF0ZS5lcnJvcikge1xuICAgICAgcmV0dXJuIHN0YXRlLmVycm9yO1xuICAgIH1cbiAgICBcbiAgICBpZiAoc3RhdGUuZXJyb3JzICYmIEFycmF5LmlzQXJyYXkoc3RhdGUuZXJyb3JzKSAmJiBzdGF0ZS5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHN0YXRlLmVycm9ycy5qb2luKCcsICcpO1xuICAgIH1cbiAgICBcbiAgICAvLyBPbmx5IHJldHVybiBnZW5lcmljIG1lc3NhZ2UgaWYgY2VsbCBpcyBtYXJrZWQgYXMgaW52YWxpZFxuICAgIGlmICghdGhpcy5jZWxsLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuICdJbnZhbGlkIHZhbHVlJztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBoYXNDZWxsVGVtcGxhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jZWxsLmdldENvbHVtbkNvbmZpZygpO1xuICAgIHJldHVybiAhIWNvbmZpZy5jZWxsVGVtcGxhdGU7XG4gIH1cblxuICBnZXQgY2VsbFRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jZWxsLmdldENvbHVtbkNvbmZpZygpLmNlbGxUZW1wbGF0ZSB8fCBudWxsO1xuICB9XG5cbiAgZ2V0IHRlbXBsYXRlQ29udGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHRoaXMuY2VsbC5nZXRWYWx1ZSgpLFxuICAgICAgY2VsbDogdGhpcy5jZWxsLFxuICAgICAgcm93RGF0YTogdGhpcy5jZWxsLmdldFJvd0RhdGEoKSxcbiAgICAgIHJvd0luZGV4OiB0aGlzLmNlbGwuZ2V0Um93SW5kZXgoKVxuICAgIH07XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25DZWxsS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8vIE9ubHkgaGFuZGxlIGlmIHRoaXMgY2VsbCBpcyBmb2N1c2VkXG4gICAgaWYgKCF0aGlzLmNlbGwuaXNGb2N1c2VkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIE5hdmlnYXRpb25LZXkgZW51bSBmb3IgdHlwZS1zYWZlIGtleSBjaGVja2luZ1xuICAgIHN3aXRjaCAoZXZlbnQua2V5IGFzIE5hdmlnYXRpb25LZXkpIHtcbiAgICAgIGNhc2UgTmF2aWdhdGlvbktleS5FTlRFUjpcbiAgICAgICAgaWYgKHRoaXMuY2VsbC5pc0VkaXRpbmcoKSkge1xuICAgICAgICAgIC8vIFNhdmUgYW5kIGxldCBuYXZpZ2F0aW9uIGhhcHBlblxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy5zYXZlRWRpdCh0aGlzLmNlbGwuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgLy8gRW1pdCBldmVudCB0byB0cmlnZ2VyIG5hdmlnYXRpb24gZG93blxuICAgICAgICAgIHRoaXMuY2VsbFNhdmVBbmROYXZpZ2F0ZS5lbWl0KHsgZXZlbnQsIGRpcmVjdGlvbjogTmF2aWdhdGlvbkRpcmVjdGlvbi5ET1dOIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vdCBlZGl0aW5nLCBsZXQgZGlyZWN0aXZlIGhhbmRsZSBuYXZpZ2F0aW9uXG4gICAgICAgIGJyZWFrO1xuICAgICAgICBcbiAgICAgIGNhc2UgTmF2aWdhdGlvbktleS5UQUI6XG4gICAgICAgIGlmICh0aGlzLmNlbGwuaXNFZGl0aW5nKCkpIHtcbiAgICAgICAgICAvLyBTYXZlIGFuZCBsZXQgbmF2aWdhdGlvbiBoYXBwZW5cbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMuc2F2ZUVkaXQodGhpcy5jZWxsLmdldFZhbHVlKCkpO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gTmF2aWdhdGlvbkRpcmVjdGlvbi5MRUZUIDogTmF2aWdhdGlvbkRpcmVjdGlvbi5SSUdIVDtcbiAgICAgICAgICB0aGlzLmNlbGxTYXZlQW5kTmF2aWdhdGUuZW1pdCh7IGV2ZW50LCBkaXJlY3Rpb24gfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm90IGVkaXRpbmcsIGxldCBkaXJlY3RpdmUgaGFuZGxlIG5hdmlnYXRpb25cbiAgICAgICAgYnJlYWs7XG4gICAgICAgIFxuICAgICAgY2FzZSBOYXZpZ2F0aW9uS2V5LkVTQ0FQRTpcbiAgICAgICAgaWYgKHRoaXMuY2VsbC5pc0VkaXRpbmcoKSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy5jYW5jZWxFZGl0KCk7XG4gICAgICAgICAgLy8gU3RheSBmb2N1c2VkIG9uIHNhbWUgY2VsbCAobm8gbmF2aWdhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgICAgXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBDaGVjayBmb3IgYWxwaGFudW1lcmljIGtleXMgd2hlbiBmb2N1c2VkIGJ1dCBub3QgZWRpdGluZ1xuICAgICAgICBpZiAoIXRoaXMuY2VsbC5pc0VkaXRpbmcoKSAmJiB0aGlzLmlzQWxwaGFudW1lcmljS2V5KGV2ZW50KSkge1xuICAgICAgICAgIGlmICh0aGlzLmNhbkVkaXRWaWFLZXlib2FyZCgpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAvLyBTdGFydCBlZGl0aW5nIHdpdGggdGhlIHByZXNzZWQga2V5IGFzIGluaXRpYWwgdmFsdWVcbiAgICAgICAgICAgIHRoaXMuc3RhcnRFZGl0V2l0aEtleShldmVudC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBFbnRlciBrZXkgY2FuIHRyaWdnZXIgZWRpdGluZ1xuICAgKiBVc2luZyBFZGl0TW9kZSBlbnVtIHZhbHVlc1xuICAgKi9cbiAgcHJpdmF0ZSBjYW5FZGl0VmlhRW50ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFZGl0YWJsZSAmJiBcbiAgICAgICAgICAgKHRoaXMuZWRpdE1vZGUgPT09IEVkaXRNb2RlLkVOVEVSIHx8IHRoaXMuZWRpdE1vZGUgPT09IEVkaXRNb2RlLkNMSUNLKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGtleWJvYXJkIGNhbiB0cmlnZ2VyIGVkaXRpbmcgKGZvciBhbHBoYW51bWVyaWMgYW5kIGRvdWJsZS1jbGljaylcbiAgICovXG4gIHByaXZhdGUgY2FuRWRpdFZpYUtleWJvYXJkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRWRpdGFibGUgJiYgXG4gICAgICAgICAgICh0aGlzLmVkaXRNb2RlID09PSBFZGl0TW9kZS5FTlRFUiB8fCB0aGlzLmVkaXRNb2RlID09PSBFZGl0TW9kZS5DTElDSyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGtleSBpcyBhbHBoYW51bWVyaWMgKHNpbmdsZSBjaGFyYWN0ZXIpXG4gICAqL1xuICBwcml2YXRlIGlzQWxwaGFudW1lcmljS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgLy8gU2luZ2xlIGNoYXJhY3RlciBrZXlzIChsZXR0ZXJzLCBudW1iZXJzLCBzeW1ib2xzKVxuICAgIHJldHVybiBldmVudC5rZXkubGVuZ3RoID09PSAxICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdGFydCBlZGl0aW5nIHdpdGggYSBzcGVjaWZpYyBrZXkgYXMgdGhlIGluaXRpYWwgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgc3RhcnRFZGl0V2l0aEtleShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNhblN0YXJ0ID0gdGhpcy5jZWxsLnN0YXJ0RWRpdCgpO1xuICAgIGlmIChjYW5TdGFydCkge1xuICAgICAgLy8gUmVwbGFjZSBjdXJyZW50IHZhbHVlIHdpdGggdGhlIGtleVxuICAgICAgdGhpcy5jZWxsLnNldFZhbHVlKGtleSwgZmFsc2UpO1xuICAgICAgXG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgICBjb25zdCBlZGl0RXZlbnQ6IENlbGxFZGl0RXZlbnQgPSB7XG4gICAgICAgIGNlbGw6IHRoaXMuY2VsbCxcbiAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgcm93RGF0YTogdGhpcy5jZWxsLmdldFJvd0RhdGEoKSxcbiAgICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgICByb3dJbmRleDogdGhpcy5jZWxsLmdldFJvd0luZGV4KCksXG4gICAgICAgIGNlbGxTdGF0ZTogdGhpcy5jZWxsLmdldFN0YXRlKClcbiAgICAgIH07XG4gICAgICB0aGlzLmNlbGxFZGl0LmVtaXQoZWRpdEV2ZW50KTtcbiAgICAgIFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyRWRpdG9yKCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBvbkNlbGxDbGljaygpOiB2b2lkIHtcbiAgICAvLyBTaW5nbGUgY2xpY2sgbm93IG9ubHkgZm9jdXNlcywgZG9lc24ndCBzdGFydCBlZGl0aW5nXG4gICAgLy8gRm9jdXMgaXMgaGFuZGxlZCBieSBwYXJlbnQgc3QtdGFibGUgY29tcG9uZW50XG4gIH1cblxuICBvbkNlbGxEb3VibGVDbGljaygpOiB2b2lkIHtcbiAgICAvLyBEb3VibGUtY2xpY2sgc3RhcnRzIGVkaXRpbmcgcmVnYXJkbGVzcyBvZiBFZGl0TW9kZSAoRXhjZWwtbGlrZSBiZWhhdmlvcilcbiAgICBpZiAodGhpcy5pc0VkaXRhYmxlICYmICF0aGlzLmNlbGwuaXNFZGl0aW5nKCkpIHtcbiAgICAgIHRoaXMuc3RhcnRFZGl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVkaXQoKTogdm9pZCB7XG4gICAgY29uc3QgY2FuU3RhcnQgPSB0aGlzLmNlbGwuc3RhcnRFZGl0KCk7XG4gICAgaWYgKGNhblN0YXJ0KSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgICBcbiAgICAgIC8vIE5vdGlmeSBUYWJsZVN0YXRlIHRoYXQgdGhpcyBjZWxsIGlzIG5vdyBlZGl0aW5nXG4gICAgICBpZiAodGhpcy50YWJsZVN0YXRlICYmIHRoaXMuY29sdW1uSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuY2VsbC5nZXRSb3dJbmRleCgpO1xuICAgICAgICBpZiAocm93SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMudGFibGVTdGF0ZS5zZXRFZGl0aW5nQ2VsbChyb3dJbmRleCwgdGhpcy5jb2x1bW5JbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZWRpdEV2ZW50OiBDZWxsRWRpdEV2ZW50ID0ge1xuICAgICAgICBjZWxsOiB0aGlzLmNlbGwsXG4gICAgICAgIHZhbHVlOiB0aGlzLmNlbGwuZ2V0VmFsdWUoKSxcbiAgICAgICAgcm93RGF0YTogdGhpcy5jZWxsLmdldFJvd0RhdGEoKSxcbiAgICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgICByb3dJbmRleDogdGhpcy5jZWxsLmdldFJvd0luZGV4KCksXG4gICAgICAgIGNlbGxTdGF0ZTogdGhpcy5jZWxsLmdldFN0YXRlKClcbiAgICAgIH07XG4gICAgICB0aGlzLmNlbGxFZGl0LmVtaXQoZWRpdEV2ZW50KTtcbiAgICAgIFxuICAgICAgLy8gV2FpdCBmb3IgQW5ndWxhciB0byByZW5kZXIgdGhlIGVkaXRvciBjb250YWluZXJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlckVkaXRvcigpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJFZGl0b3IoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvckNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2VsbC5nZXRDb2x1bW5Db25maWcoKTtcbiAgICBjb25zdCBlZGl0b3IgPSBjb2x1bW4uZWRpdG9yO1xuICAgIFxuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIGVkaXRvciBjb25maWd1cmVkIGZvciBjb2x1bW46JywgY29sdW1uLmtleSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNlbGwuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmVkaXRvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIFxuICAgIC8vIENyZWF0ZSBlZGl0b3IgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PGFueT4gPSB7XG4gICAgICB2YWx1ZSxcbiAgICAgIHJvd0RhdGE6IHRoaXMuY2VsbC5nZXRSb3dEYXRhKCksXG4gICAgICBjb2x1bW5LZXk6IGNvbHVtbi5rZXksXG4gICAgICByb3dJbmRleDogdGhpcy5jZWxsLmdldFJvd0luZGV4KCksXG4gICAgICBvbkNoYW5nZTogKG5ld1ZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gVHJpZ2dlciBlYWdlciB2YWxpZGF0aW9uIGlmIGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb25maWc/LnZhbGlkYXRpb24/Lm1vZGUgPT09ICdlYWdlcicpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgY2VsbCB2YWx1ZSB0ZW1wb3JhcmlseSBmb3IgdmFsaWRhdGlvblxuICAgICAgICAgIHRoaXMuY2VsbC5zZXRWYWx1ZShuZXdWYWx1ZSwgdHJ1ZSk7IC8vIHNraXAgdmFsaWRhdGlvbiB0byBhdm9pZCBkb3VibGUgdmFsaWRhdGlvblxuICAgICAgICAgIHRoaXMudHJpZ2dlckVhZ2VyVmFsaWRhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25TYXZlOiAobmV3VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNhdmVFZGl0KG5ld1ZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvbkNhbmNlbDogKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgIH0sXG4gICAgICBjb250YWluZXJcbiAgICB9O1xuICAgIFxuICAgIC8vIENhbGwgZWRpdG9yJ3MgZWRpdCBtZXRob2RcbiAgICBlZGl0b3IuZWRpdChjb250ZXh0KTtcbiAgICBcbiAgICAvLyBTdG9yZSBjbGVhbnVwIGNhbGxiYWNrXG4gICAgdGhpcy5lZGl0b3JDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgaWYgKGVkaXRvci5kZXN0cm95KSB7XG4gICAgICAgIGVkaXRvci5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICAvLyBDbGVhciBjb250YWluZXJcbiAgICAgIHdoaWxlIChjb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNhdmVFZGl0KG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5jZWxsLmdldFZhbHVlKCk7XG4gICAgY29uc3Qgd2FzVmFsaWQgPSB0aGlzLmNlbGwuaXNWYWxpZCgpO1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmNlbGwuc2F2ZUVkaXQobmV3VmFsdWUpO1xuICAgIFxuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgICBjb25zdCBjZWxsU3RhdGUgPSB0aGlzLmNlbGwuZ2V0U3RhdGUoKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLmNlbGwuaXNWYWxpZCgpO1xuICAgICAgXG4gICAgICAvLyBOb3RpZnkgVGFibGVTdGF0ZSB0aGF0IGVkaXRpbmcgZW5kZWRcbiAgICAgIGlmICh0aGlzLnRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0YXRlLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB2YWxpZGF0aW9uIHN0YXRlIChsYXp5IG1vZGUgLSBvbiBzYXZlKVxuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZSgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbWl0IHNhdmUgZXZlbnRcbiAgICAgIGNvbnN0IHNhdmVFdmVudDogQ2VsbFNhdmVFdmVudCA9IHtcbiAgICAgICAgY2VsbDogdGhpcy5jZWxsLFxuICAgICAgICBuZXdWYWx1ZTogbmV3VmFsdWUsXG4gICAgICAgIHByZXZpb3VzVmFsdWU6IHByZXZpb3VzVmFsdWUsXG4gICAgICAgIHJvd0RhdGE6IHRoaXMuY2VsbC5nZXRSb3dEYXRhKCksXG4gICAgICAgIGNvbHVtbktleTogY29sdW1uLmtleSxcbiAgICAgICAgcm93SW5kZXg6IHRoaXMuY2VsbC5nZXRSb3dJbmRleCgpLFxuICAgICAgICBpc1ZhbGlkOiBpc1ZhbGlkLFxuICAgICAgICB2YWxpZGF0aW9uRXJyb3JzOiBjZWxsU3RhdGUuZXJyb3IgPyBbY2VsbFN0YXRlLmVycm9yXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgY2VsbFN0YXRlOiBjZWxsU3RhdGVcbiAgICAgIH07XG4gICAgICB0aGlzLmNlbGxTYXZlLmVtaXQoc2F2ZUV2ZW50KTtcbiAgICAgIFxuICAgICAgLy8gRW1pdCBjaGFuZ2UgZXZlbnRcbiAgICAgIGNvbnN0IGNoYW5nZUV2ZW50OiBDZWxsQ2hhbmdlRXZlbnQgPSB7XG4gICAgICAgIGNlbGw6IHRoaXMuY2VsbCxcbiAgICAgICAgb2xkVmFsdWU6IHByZXZpb3VzVmFsdWUsXG4gICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgcm93RGF0YTogdGhpcy5jZWxsLmdldFJvd0RhdGEoKSxcbiAgICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgICByb3dJbmRleDogdGhpcy5jZWxsLmdldFJvd0luZGV4KCksXG4gICAgICAgIHdhc1ZhbGlkOiB3YXNWYWxpZCxcbiAgICAgICAgaXNWYWxpZDogaXNWYWxpZCxcbiAgICAgICAgY2VsbFN0YXRlOiBjZWxsU3RhdGVcbiAgICAgIH07XG4gICAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdChjaGFuZ2VFdmVudCk7XG4gICAgICBcbiAgICAgIHRoaXMuY2xlYW51cEVkaXRvcigpO1xuICAgIH1cbiAgICAvLyBJZiB2YWxpZGF0aW9uIGZhaWxzLCBrZWVwIGVkaXRpbmcgbW9kZVxuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIHZhbGlkYXRpb24gc3RhdGUgaW4gVGFibGVTdGF0ZVxuICAgKiBDYWxsZWQgb24gc2F2ZSAobGF6eSBtb2RlKSBvciBvbiBjaGFuZ2UgKGVhZ2VyIG1vZGUpXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVZhbGlkYXRpb25TdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2VsbC5nZXRDb2x1bW5Db25maWcoKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy5jZWxsLmlzVmFsaWQoKTtcbiAgICBjb25zdCBlcnJvciA9IHRoaXMuY2VsbC5nZXRTdGF0ZSgpLmVycm9yO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5jZWxsLmdldFJvd0luZGV4KCk7XG4gICAgXG4gICAgLy8gT25seSB1cGRhdGUgaWYgcm93SW5kZXggaXMgZGVmaW5lZFxuICAgIGlmIChyb3dJbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgXG4gICAgdGhpcy50YWJsZVN0YXRlLnVwZGF0ZUNlbGxWYWxpZGF0aW9uKFxuICAgICAgcm93SW5kZXgsXG4gICAgICBjb2x1bW4ua2V5LFxuICAgICAgaXNWYWxpZCxcbiAgICAgIGVycm9yXG4gICAgKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFRyaWdnZXIgZWFnZXIgdmFsaWRhdGlvbiAob24gZXZlcnkgY2hhbmdlKVxuICAgKi9cbiAgcHJpdmF0ZSB0cmlnZ2VyRWFnZXJWYWxpZGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJsZVN0YXRlIHx8ICF0aGlzLnRhYmxlQ29uZmlnKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdmFsaWRhdGlvbk1vZGUgPSB0aGlzLnRhYmxlQ29uZmlnLnZhbGlkYXRpb24/Lm1vZGUgfHwgJ2xhenknO1xuICAgIGlmICh2YWxpZGF0aW9uTW9kZSAhPT0gJ2VhZ2VyJykgcmV0dXJuO1xuICAgIFxuICAgIC8vIFJlLXZhbGlkYXRlIHRoZSBjZWxsXG4gICAgdGhpcy5jZWxsLnZhbGlkYXRlKCk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhbGlkYXRpb24gc3RhdGVcbiAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb25TdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxFZGl0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2VsbC5nZXRDb2x1bW5Db25maWcoKTtcbiAgICBjb25zdCBjZWxsU3RhdGUgPSB0aGlzLmNlbGwuZ2V0U3RhdGUoKTtcbiAgICBcbiAgICAvLyBOb3RpZnkgVGFibGVTdGF0ZSB0aGF0IGVkaXRpbmcgZW5kZWRcbiAgICBpZiAodGhpcy50YWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLnRhYmxlU3RhdGUuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjYW5jZWxFdmVudDogQ2VsbENhbmNlbEV2ZW50ID0ge1xuICAgICAgY2VsbDogdGhpcy5jZWxsLFxuICAgICAgdmFsdWU6IHRoaXMuY2VsbC5nZXRWYWx1ZSgpLFxuICAgICAgcHJldmlvdXNWYWx1ZTogY2VsbFN0YXRlLnByZXZpb3VzVmFsdWUsXG4gICAgICByb3dEYXRhOiB0aGlzLmNlbGwuZ2V0Um93RGF0YSgpLFxuICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgcm93SW5kZXg6IHRoaXMuY2VsbC5nZXRSb3dJbmRleCgpLFxuICAgICAgY2VsbFN0YXRlOiBjZWxsU3RhdGVcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuY2VsbC5jYW5jZWxFZGl0KCk7XG4gICAgdGhpcy5jZWxsQ2FuY2VsLmVtaXQoY2FuY2VsRXZlbnQpO1xuICAgIHRoaXMuY2xlYW51cEVkaXRvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwRWRpdG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRvckNsZWFudXApIHtcbiAgICAgIHRoaXMuZWRpdG9yQ2xlYW51cCgpO1xuICAgICAgdGhpcy5lZGl0b3JDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInN0LWNlbGxcIiBcbiAgW25nQ2xhc3NdPVwie1xuICAgICdlZGl0aW5nJzogY2VsbC5pc0VkaXRpbmcoKSxcbiAgICAnZGlydHknOiBjZWxsLmlzRGlydHkoKSxcbiAgICAnaW52YWxpZCc6ICFjZWxsLmlzVmFsaWQoKSxcbiAgICAncmVhZG9ubHknOiAhaXNFZGl0YWJsZVxuICB9XCJcbiAgKGNsaWNrKT1cIm9uQ2VsbENsaWNrKClcIiBcbiAgKGRibGNsaWNrKT1cIm9uQ2VsbERvdWJsZUNsaWNrKClcIj5cblxuICA8IS0tIERpc3BsYXkgTW9kZSB3aXRoIFRlbXBsYXRlIFN1cHBvcnQgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2VsbC5pc0VkaXRpbmcoKVwiPlxuICAgIDwhLS0gQ3VzdG9tIFRlbXBsYXRlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNDZWxsVGVtcGxhdGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHRlbXBsYXRlQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBEZWZhdWx0IFRleHQgUmVuZGVyaW5nIC0tPlxuICAgIDxzcGFuICpuZ0lmPVwiIWhhc0NlbGxUZW1wbGF0ZVwiIGNsYXNzPVwiY2VsbC1kaXNwbGF5XCI+XG4gICAgICB7eyBjZWxsLnJlbmRlcigpIH19XG4gICAgPC9zcGFuPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIEVkaXQgTW9kZSAtLT5cbiAgPGRpdiAqbmdJZj1cImNlbGwuaXNFZGl0aW5nKClcIiBjbGFzcz1cImNlbGwtZWRpdG9yXCIgI2VkaXRvckNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
@@ -0,0 +1,103 @@
1
+ import { Component, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { CellDataType } from '../../../models/cell-types';
3
+ import { ColumnConfigFactory } from '../../../factories/column-config.factory';
4
+ import { ColumnEditorComponent } from '../../../builder/components/column-editor/column-editor.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../builder/components/column-editor/column-editor.component";
7
+ export class StColumnEditorModalComponent {
8
+ constructor() {
9
+ this.columnCreated = new EventEmitter();
10
+ this.cancelled = new EventEmitter();
11
+ this.columnIndex = -1;
12
+ }
13
+ ngOnInit() {
14
+ // Create a default column that will be edited
15
+ this.newColumn = this.createDefaultColumn();
16
+ }
17
+ ngOnDestroy() {
18
+ // Cleanup if needed
19
+ }
20
+ /**
21
+ * Create a default column configuration
22
+ */
23
+ createDefaultColumn() {
24
+ return ColumnConfigFactory.text('newColumn', {
25
+ header: 'New Column',
26
+ editable: true,
27
+ sortable: true,
28
+ filterable: true,
29
+ resizable: true,
30
+ hideable: true,
31
+ visible: true
32
+ });
33
+ }
34
+ /**
35
+ * Trigger save from external button
36
+ */
37
+ onSave() {
38
+ // Call the column editor's save method
39
+ if (this.columnEditor) {
40
+ this.columnEditor.onSave();
41
+ }
42
+ }
43
+ /**
44
+ * Handle column updates from the editor
45
+ */
46
+ onColumnUpdated(updates) {
47
+ // Merge updates into the new column
48
+ this.newColumn = { ...this.newColumn, ...updates };
49
+ // Use ColumnConfigFactory to create proper column based on data type
50
+ let finalColumn;
51
+ const key = updates.key || this.newColumn.key;
52
+ const dataType = updates.dataType || this.newColumn.dataType;
53
+ switch (dataType) {
54
+ case CellDataType.NUMBER:
55
+ finalColumn = ColumnConfigFactory.number(key, this.newColumn);
56
+ break;
57
+ case CellDataType.DATE:
58
+ finalColumn = ColumnConfigFactory.date(key, this.newColumn);
59
+ break;
60
+ case CellDataType.BOOLEAN:
61
+ finalColumn = ColumnConfigFactory.boolean(key, this.newColumn);
62
+ break;
63
+ default:
64
+ finalColumn = ColumnConfigFactory.text(key, this.newColumn);
65
+ }
66
+ // Emit the created column
67
+ this.columnCreated.emit(finalColumn);
68
+ }
69
+ /**
70
+ * Handle cancel from the editor
71
+ */
72
+ onCancel() {
73
+ this.cancelled.emit();
74
+ }
75
+ /**
76
+ * Handle backdrop click to close modal
77
+ */
78
+ onBackdropClick(event) {
79
+ if (event.target === event.currentTarget) {
80
+ this.cancelled.emit();
81
+ }
82
+ }
83
+ /**
84
+ * Prevent event propagation from modal content
85
+ */
86
+ onModalContentClick(event) {
87
+ event.stopPropagation();
88
+ }
89
+ }
90
+ StColumnEditorModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnEditorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
91
+ StColumnEditorModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StColumnEditorModalComponent, selector: "st-column-editor-modal", outputs: { columnCreated: "columnCreated", cancelled: "cancelled" }, viewQueries: [{ propertyName: "columnEditor", first: true, predicate: ColumnEditorComponent, descendants: true }], ngImport: i0, template: "<div class=\"modal-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"modal-content\" (click)=\"onModalContentClick($event)\">\n <div class=\"modal-header\">\n <h2>Add New Column</h2>\n <button class=\"close-button\" (click)=\"onCancel()\" type=\"button\" aria-label=\"Close\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <!-- Now using the shared st-column-editor component from SharedTableComponentsModule -->\n <st-column-editor\n [column]=\"newColumn\"\n [columnIndex]=\"columnIndex\"\n (columnUpdated)=\"onColumnUpdated($event)\"\n (cancel)=\"onCancel()\">\n </st-column-editor>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSave()\">Add Column</button>\n </div>\n </div>\n</div>\n", styles: [".modal-backdrop{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:2000;animation:fadeIn .2s ease-in-out}.modal-content{background:white;border-radius:8px;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f;max-width:600px;max-height:90vh;width:90%;display:flex;flex-direction:column;animation:slideUp .3s cubic-bezier(.4,0,.2,1)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid #e0e0e0;flex-shrink:0}.modal-header h2{margin:0;font-size:20px;font-weight:500;color:#212121}.close-button{background:none;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;border-radius:50%;color:#757575;transition:all .2s ease}.close-button:hover{background-color:#0000000a;color:#212121}.close-button:active{background-color:#00000014}.close-button:focus{outline:none;box-shadow:0 0 0 2px #1976d24d}.close-button svg{width:24px;height:24px}.modal-body{padding:0;overflow-y:auto;flex:1;min-height:0}.modal-body ::ng-deep st-column-editor{display:block}.modal-body ::ng-deep st-column-editor .column-editor{padding:0;border:none;box-shadow:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-header{display:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-actions{display:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-form{padding:24px}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 24px;border-top:1px solid #e0e0e0;flex-shrink:0;background-color:#f5f5f5}.modal-footer .btn{padding:10px 20px;border:none;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.modal-footer .btn:focus{outline:none;box-shadow:0 0 0 2px #0000001a}.modal-footer .btn.btn-secondary{background-color:#fff;color:#424242;border:1px solid #d0d0d0}.modal-footer .btn.btn-secondary:hover{background-color:#f5f5f5}.modal-footer .btn.btn-secondary:active{background-color:#eee}.modal-footer .btn.btn-primary{background-color:#1976d2;color:#fff}.modal-footer .btn.btn-primary:hover{background-color:#1565c0}.modal-footer .btn.btn-primary:active{background-color:#0d47a1}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(50px)}to{opacity:1;transform:translateY(0)}}\n"], components: [{ type: i1.ColumnEditorComponent, selector: "st-column-editor", inputs: ["column", "columnIndex"], outputs: ["columnUpdated", "cancel"] }] });
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StColumnEditorModalComponent, decorators: [{
93
+ type: Component,
94
+ args: [{ selector: 'st-column-editor-modal', template: "<div class=\"modal-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"modal-content\" (click)=\"onModalContentClick($event)\">\n <div class=\"modal-header\">\n <h2>Add New Column</h2>\n <button class=\"close-button\" (click)=\"onCancel()\" type=\"button\" aria-label=\"Close\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"modal-body\">\n <!-- Now using the shared st-column-editor component from SharedTableComponentsModule -->\n <st-column-editor\n [column]=\"newColumn\"\n [columnIndex]=\"columnIndex\"\n (columnUpdated)=\"onColumnUpdated($event)\"\n (cancel)=\"onCancel()\">\n </st-column-editor>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSave()\">Add Column</button>\n </div>\n </div>\n</div>\n", styles: [".modal-backdrop{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:2000;animation:fadeIn .2s ease-in-out}.modal-content{background:white;border-radius:8px;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f;max-width:600px;max-height:90vh;width:90%;display:flex;flex-direction:column;animation:slideUp .3s cubic-bezier(.4,0,.2,1)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid #e0e0e0;flex-shrink:0}.modal-header h2{margin:0;font-size:20px;font-weight:500;color:#212121}.close-button{background:none;border:none;cursor:pointer;padding:8px;display:flex;align-items:center;justify-content:center;border-radius:50%;color:#757575;transition:all .2s ease}.close-button:hover{background-color:#0000000a;color:#212121}.close-button:active{background-color:#00000014}.close-button:focus{outline:none;box-shadow:0 0 0 2px #1976d24d}.close-button svg{width:24px;height:24px}.modal-body{padding:0;overflow-y:auto;flex:1;min-height:0}.modal-body ::ng-deep st-column-editor{display:block}.modal-body ::ng-deep st-column-editor .column-editor{padding:0;border:none;box-shadow:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-header{display:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-actions{display:none}.modal-body ::ng-deep st-column-editor .column-editor .editor-form{padding:24px}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 24px;border-top:1px solid #e0e0e0;flex-shrink:0;background-color:#f5f5f5}.modal-footer .btn{padding:10px 20px;border:none;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.modal-footer .btn:focus{outline:none;box-shadow:0 0 0 2px #0000001a}.modal-footer .btn.btn-secondary{background-color:#fff;color:#424242;border:1px solid #d0d0d0}.modal-footer .btn.btn-secondary:hover{background-color:#f5f5f5}.modal-footer .btn.btn-secondary:active{background-color:#eee}.modal-footer .btn.btn-primary{background-color:#1976d2;color:#fff}.modal-footer .btn.btn-primary:hover{background-color:#1565c0}.modal-footer .btn.btn-primary:active{background-color:#0d47a1}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(50px)}to{opacity:1;transform:translateY(0)}}\n"] }]
95
+ }], propDecorators: { columnCreated: [{
96
+ type: Output
97
+ }], cancelled: [{
98
+ type: Output
99
+ }], columnEditor: [{
100
+ type: ViewChild,
101
+ args: [ColumnEditorComponent]
102
+ }] } });
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtY29sdW1uLWVkaXRvci1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL3JlbmRlcmVyL2NvbXBvbmVudHMvc3QtY29sdW1uLWVkaXRvci1tb2RhbC9zdC1jb2x1bW4tZWRpdG9yLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1jb2x1bW4tZWRpdG9yLW1vZGFsL3N0LWNvbHVtbi1lZGl0b3ItbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1FQUFtRSxDQUFDOzs7QUFPMUcsTUFBTSxPQUFPLDRCQUE0QjtJQUx6QztRQU1ZLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDakQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLL0MsZ0JBQVcsR0FBVyxDQUFDLENBQUMsQ0FBQztLQXdGMUI7SUF0RkMsUUFBUTtRQUNOLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXO1FBQ1Qsb0JBQW9CO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQjtRQUN6QixPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0MsTUFBTSxFQUFFLFlBQVk7WUFDcEIsUUFBUSxFQUFFLElBQUk7WUFDZCxRQUFRLEVBQUUsSUFBSTtZQUNkLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUk7WUFDZCxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSix1Q0FBdUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsT0FBOEI7UUFDNUMsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUVuRCxxRUFBcUU7UUFDckUsSUFBSSxXQUF5QixDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUU3RCxRQUFRLFFBQVEsRUFBRTtZQUNoQixLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUN0QixXQUFXLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlELE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxJQUFJO2dCQUNwQixXQUFXLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVELE1BQU07WUFDUixLQUFLLFlBQVksQ0FBQyxPQUFPO2dCQUN2QixXQUFXLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQy9ELE1BQU07WUFDUjtnQkFDRSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDL0Q7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLEtBQVk7UUFDMUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQixDQUFDLEtBQVk7UUFDOUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7O3lIQTlGVSw0QkFBNEI7NkdBQTVCLDRCQUE0QixpTEFJNUIscUJBQXFCLGdEQ2ZsQyxrc0NBeUJBOzJGRGRhLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSx3QkFBd0I7OEJBS3hCLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFFMkIsWUFBWTtzQkFBN0MsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2x1bW5Db25maWcgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY29sdW1uLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ2VsbERhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NlbGwtdHlwZXMnO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcy9jb2x1bW4tY29uZmlnLmZhY3RvcnknO1xuaW1wb3J0IHsgQ29sdW1uRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYnVpbGRlci9jb21wb25lbnRzL2NvbHVtbi1lZGl0b3IvY29sdW1uLWVkaXRvci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdC1jb2x1bW4tZWRpdG9yLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LWNvbHVtbi1lZGl0b3ItbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC1jb2x1bW4tZWRpdG9yLW1vZGFsLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3RDb2x1bW5FZGl0b3JNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQE91dHB1dCgpIGNvbHVtbkNyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbkNvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIEBWaWV3Q2hpbGQoQ29sdW1uRWRpdG9yQ29tcG9uZW50KSBjb2x1bW5FZGl0b3IhOiBDb2x1bW5FZGl0b3JDb21wb25lbnQ7XG4gIFxuICBuZXdDb2x1bW4hOiBDb2x1bW5Db25maWc7XG4gIGNvbHVtbkluZGV4OiBudW1iZXIgPSAtMTtcbiAgXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgY29sdW1uIHRoYXQgd2lsbCBiZSBlZGl0ZWRcbiAgICB0aGlzLm5ld0NvbHVtbiA9IHRoaXMuY3JlYXRlRGVmYXVsdENvbHVtbigpO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbnVwIGlmIG5lZWRlZFxuICB9XG4gIFxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVmYXVsdCBjb2x1bW4gY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0Q29sdW1uKCk6IENvbHVtbkNvbmZpZyB7XG4gICAgcmV0dXJuIENvbHVtbkNvbmZpZ0ZhY3RvcnkudGV4dCgnbmV3Q29sdW1uJywge1xuICAgICAgaGVhZGVyOiAnTmV3IENvbHVtbicsXG4gICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgZmlsdGVyYWJsZTogdHJ1ZSxcbiAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgIGhpZGVhYmxlOiB0cnVlLFxuICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogVHJpZ2dlciBzYXZlIGZyb20gZXh0ZXJuYWwgYnV0dG9uXG4gICAqL1xuICBvblNhdmUoKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgY29sdW1uIGVkaXRvcidzIHNhdmUgbWV0aG9kXG4gICAgaWYgKHRoaXMuY29sdW1uRWRpdG9yKSB7XG4gICAgICB0aGlzLmNvbHVtbkVkaXRvci5vblNhdmUoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY29sdW1uIHVwZGF0ZXMgZnJvbSB0aGUgZWRpdG9yXG4gICAqL1xuICBvbkNvbHVtblVwZGF0ZWQodXBkYXRlczogUGFydGlhbDxDb2x1bW5Db25maWc+KTogdm9pZCB7XG4gICAgLy8gTWVyZ2UgdXBkYXRlcyBpbnRvIHRoZSBuZXcgY29sdW1uXG4gICAgdGhpcy5uZXdDb2x1bW4gPSB7IC4uLnRoaXMubmV3Q29sdW1uLCAuLi51cGRhdGVzIH07XG4gICAgXG4gICAgLy8gVXNlIENvbHVtbkNvbmZpZ0ZhY3RvcnkgdG8gY3JlYXRlIHByb3BlciBjb2x1bW4gYmFzZWQgb24gZGF0YSB0eXBlXG4gICAgbGV0IGZpbmFsQ29sdW1uOiBDb2x1bW5Db25maWc7XG4gICAgY29uc3Qga2V5ID0gdXBkYXRlcy5rZXkgfHwgdGhpcy5uZXdDb2x1bW4ua2V5O1xuICAgIGNvbnN0IGRhdGFUeXBlID0gdXBkYXRlcy5kYXRhVHlwZSB8fCB0aGlzLm5ld0NvbHVtbi5kYXRhVHlwZTtcbiAgICBcbiAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XG4gICAgICBjYXNlIENlbGxEYXRhVHlwZS5OVU1CRVI6XG4gICAgICAgIGZpbmFsQ29sdW1uID0gQ29sdW1uQ29uZmlnRmFjdG9yeS5udW1iZXIoa2V5LCB0aGlzLm5ld0NvbHVtbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuREFURTpcbiAgICAgICAgZmluYWxDb2x1bW4gPSBDb2x1bW5Db25maWdGYWN0b3J5LmRhdGUoa2V5LCB0aGlzLm5ld0NvbHVtbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuQk9PTEVBTjpcbiAgICAgICAgZmluYWxDb2x1bW4gPSBDb2x1bW5Db25maWdGYWN0b3J5LmJvb2xlYW4oa2V5LCB0aGlzLm5ld0NvbHVtbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZmluYWxDb2x1bW4gPSBDb2x1bW5Db25maWdGYWN0b3J5LnRleHQoa2V5LCB0aGlzLm5ld0NvbHVtbik7XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNyZWF0ZWQgY29sdW1uXG4gICAgdGhpcy5jb2x1bW5DcmVhdGVkLmVtaXQoZmluYWxDb2x1bW4pO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGNhbmNlbCBmcm9tIHRoZSBlZGl0b3JcbiAgICovXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBiYWNrZHJvcCBjbGljayB0byBjbG9zZSBtb2RhbFxuICAgKi9cbiAgb25CYWNrZHJvcENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQcmV2ZW50IGV2ZW50IHByb3BhZ2F0aW9uIGZyb20gbW9kYWwgY29udGVudFxuICAgKi9cbiAgb25Nb2RhbENvbnRlbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLWJhY2tkcm9wXCIgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygkZXZlbnQpXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgKGNsaWNrKT1cIm9uTW9kYWxDb250ZW50Q2xpY2soJGV2ZW50KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgIDxoMj5BZGQgTmV3IENvbHVtbjwvaDI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgIDwhLS0gTm93IHVzaW5nIHRoZSBzaGFyZWQgc3QtY29sdW1uLWVkaXRvciBjb21wb25lbnQgZnJvbSBTaGFyZWRUYWJsZUNvbXBvbmVudHNNb2R1bGUgLS0+XG4gICAgICA8c3QtY29sdW1uLWVkaXRvclxuICAgICAgICBbY29sdW1uXT1cIm5ld0NvbHVtblwiXG4gICAgICAgIFtjb2x1bW5JbmRleF09XCJjb2x1bW5JbmRleFwiXG4gICAgICAgIChjb2x1bW5VcGRhdGVkKT1cIm9uQ29sdW1uVXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgKGNhbmNlbCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICA8L3N0LWNvbHVtbi1lZGl0b3I+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJvblNhdmUoKVwiPkFkZCBDb2x1bW48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==