@aquera/ngx-smart-table 0.0.17-alpha → 0.0.19-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.
- package/{fesm2020 → fesm2022}/aquera-ngx-smart-table.mjs +1579 -2101
- package/fesm2022/aquera-ngx-smart-table.mjs.map +1 -0
- package/package.json +8 -16
- package/types/aquera-ngx-smart-table.d.ts +5909 -0
- package/aquera-ngx-smart-table.d.ts +0 -5
- package/esm2020/aquera-ngx-smart-table.mjs +0 -5
- package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +0 -63
- package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +0 -115
- package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +0 -206
- package/esm2020/lib/builder/components/column-list/column-list.component.mjs +0 -125
- package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +0 -105
- package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +0 -132
- package/esm2020/lib/builder/definition-builder.module.mjs +0 -70
- package/esm2020/lib/builder/models/builder-state.interface.mjs +0 -5
- package/esm2020/lib/builder/services/definition-builder.service.mjs +0 -251
- package/esm2020/lib/builder/services/definition-export.service.mjs +0 -167
- package/esm2020/lib/builder/services/definition-import.service.mjs +0 -193
- package/esm2020/lib/builder/services/sample-data-generator.service.mjs +0 -126
- package/esm2020/lib/builder/utils/config-validator.util.mjs +0 -165
- package/esm2020/lib/builder/utils/typescript-generator.util.mjs +0 -206
- package/esm2020/lib/editors/index.mjs +0 -9
- package/esm2020/lib/editors/nile-autocomplete-editor.mjs +0 -228
- package/esm2020/lib/editors/nile-calendar-editor.mjs +0 -211
- package/esm2020/lib/editors/nile-date-picker-editor.mjs +0 -188
- package/esm2020/lib/editors/nile-input-editor.mjs +0 -235
- package/esm2020/lib/editors/nile-select-editor.mjs +0 -498
- package/esm2020/lib/factories/column-config.factory.mjs +0 -231
- package/esm2020/lib/models/autosave-config.interface.mjs +0 -8
- package/esm2020/lib/models/base-column-config.class.mjs +0 -253
- package/esm2020/lib/models/cell-strategies.interface.mjs +0 -6
- package/esm2020/lib/models/cell-types.mjs +0 -147
- package/esm2020/lib/models/column-action.interface.mjs +0 -6
- package/esm2020/lib/models/column-config.interface.mjs +0 -43
- package/esm2020/lib/models/column-config.utils.mjs +0 -101
- package/esm2020/lib/models/row-action.interface.mjs +0 -5
- package/esm2020/lib/models/row-validator.interface.mjs +0 -2
- package/esm2020/lib/models/schema-validation.interface.mjs +0 -2
- package/esm2020/lib/models/sheet-action.interface.mjs +0 -5
- package/esm2020/lib/models/sheet-config.interface.mjs +0 -5
- package/esm2020/lib/models/table-config.interface.mjs +0 -107
- package/esm2020/lib/models/table-validator.interface.mjs +0 -2
- package/esm2020/lib/models/workbook-action.interface.mjs +0 -5
- package/esm2020/lib/models/workbook-config.interface.mjs +0 -5
- package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +0 -24
- package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +0 -397
- package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +0 -103
- package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +0 -383
- package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +0 -232
- package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +0 -97
- package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +0 -157
- package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +0 -87
- package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +0 -167
- package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +0 -165
- package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +0 -112
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +0 -1453
- package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +0 -169
- package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +0 -581
- package/esm2020/lib/renderer/directives/click-outside.directive.mjs +0 -28
- package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +0 -108
- package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +0 -83
- package/esm2020/lib/renderer/models/cell-state.interface.mjs +0 -66
- package/esm2020/lib/renderer/models/cell.class.mjs +0 -389
- package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +0 -7
- package/esm2020/lib/renderer/models/sheet-state.class.mjs +0 -90
- package/esm2020/lib/renderer/models/sheet-state.interface.mjs +0 -5
- package/esm2020/lib/renderer/models/table-state.class.mjs +0 -871
- package/esm2020/lib/renderer/models/table-state.interface.mjs +0 -5
- package/esm2020/lib/renderer/models/table-types.mjs +0 -29
- package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +0 -7
- package/esm2020/lib/renderer/models/workbook-state.class.mjs +0 -174
- package/esm2020/lib/renderer/models/workbook-state.interface.mjs +0 -5
- package/esm2020/lib/renderer/models/z-index.enum.mjs +0 -55
- package/esm2020/lib/schemas/table-config.schema.mjs +0 -472
- package/esm2020/lib/services/autosave.service.mjs +0 -92
- package/esm2020/lib/services/custom-validation-rules.util.mjs +0 -124
- package/esm2020/lib/services/json-schema-validator.service.mjs +0 -216
- package/esm2020/lib/services/row-validation.service.mjs +0 -42
- package/esm2020/lib/services/validation-logger.service.mjs +0 -177
- package/esm2020/lib/services/virtual-scroll.service.mjs +0 -52
- package/esm2020/lib/shared/shared-table-components.module.mjs +0 -35
- package/esm2020/lib/smart-table.module.mjs +0 -124
- package/esm2020/lib/strategies/default-editors.mjs +0 -433
- package/esm2020/lib/strategies/default-formatters.mjs +0 -238
- package/esm2020/lib/strategies/default-validators.mjs +0 -327
- package/esm2020/public-api.mjs +0 -146
- package/fesm2015/aquera-ngx-smart-table.mjs +0 -12347
- package/fesm2015/aquera-ngx-smart-table.mjs.map +0 -1
- package/fesm2020/aquera-ngx-smart-table.mjs.map +0 -1
- package/lib/builder/components/builder-preview/builder-preview.component.d.ts +0 -31
- package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +0 -53
- package/lib/builder/components/column-editor/column-editor.component.d.ts +0 -69
- package/lib/builder/components/column-list/column-list.component.d.ts +0 -65
- package/lib/builder/components/definition-builder/definition-builder.component.d.ts +0 -58
- package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +0 -32
- package/lib/builder/definition-builder.module.d.ts +0 -15
- package/lib/builder/models/builder-state.interface.d.ts +0 -93
- package/lib/builder/services/definition-builder.service.d.ts +0 -80
- package/lib/builder/services/definition-export.service.d.ts +0 -59
- package/lib/builder/services/definition-import.service.d.ts +0 -31
- package/lib/builder/services/sample-data-generator.service.d.ts +0 -41
- package/lib/builder/utils/config-validator.util.d.ts +0 -32
- package/lib/builder/utils/typescript-generator.util.d.ts +0 -29
- package/lib/editors/index.d.ts +0 -8
- package/lib/editors/nile-autocomplete-editor.d.ts +0 -102
- package/lib/editors/nile-calendar-editor.d.ts +0 -88
- package/lib/editors/nile-date-picker-editor.d.ts +0 -97
- package/lib/editors/nile-input-editor.d.ts +0 -67
- package/lib/editors/nile-select-editor.d.ts +0 -113
- package/lib/factories/column-config.factory.d.ts +0 -73
- package/lib/models/autosave-config.interface.d.ts +0 -23
- package/lib/models/base-column-config.class.d.ts +0 -115
- package/lib/models/cell-strategies.interface.d.ts +0 -188
- package/lib/models/cell-types.d.ts +0 -337
- package/lib/models/column-action.interface.d.ts +0 -86
- package/lib/models/column-config.interface.d.ts +0 -272
- package/lib/models/column-config.utils.d.ts +0 -37
- package/lib/models/row-action.interface.d.ts +0 -86
- package/lib/models/row-validator.interface.d.ts +0 -37
- package/lib/models/schema-validation.interface.d.ts +0 -42
- package/lib/models/sheet-action.interface.d.ts +0 -59
- package/lib/models/sheet-config.interface.d.ts +0 -41
- package/lib/models/table-config.interface.d.ts +0 -251
- package/lib/models/table-validator.interface.d.ts +0 -40
- package/lib/models/workbook-action.interface.d.ts +0 -95
- package/lib/models/workbook-config.interface.d.ts +0 -107
- package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +0 -9
- package/lib/renderer/components/st-cell/st-cell.component.d.ts +0 -69
- package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +0 -39
- package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +0 -139
- package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +0 -81
- package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +0 -44
- package/lib/renderer/components/st-header/st-header.component.d.ts +0 -93
- package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +0 -42
- package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +0 -67
- package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +0 -98
- package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +0 -58
- package/lib/renderer/components/st-table/st-table.component.d.ts +0 -380
- package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +0 -77
- package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +0 -275
- package/lib/renderer/directives/click-outside.directive.d.ts +0 -10
- package/lib/renderer/directives/st-column-resize.directive.d.ts +0 -44
- package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +0 -19
- package/lib/renderer/models/cell-state.interface.d.ts +0 -118
- package/lib/renderer/models/cell.class.d.ts +0 -174
- package/lib/renderer/models/row-validation-state.interface.d.ts +0 -27
- package/lib/renderer/models/sheet-state.class.d.ts +0 -67
- package/lib/renderer/models/sheet-state.interface.d.ts +0 -55
- package/lib/renderer/models/table-state.class.d.ts +0 -320
- package/lib/renderer/models/table-state.interface.d.ts +0 -18
- package/lib/renderer/models/table-types.d.ts +0 -228
- package/lib/renderer/models/table-validation-state.interface.d.ts +0 -34
- package/lib/renderer/models/workbook-state.class.d.ts +0 -117
- package/lib/renderer/models/workbook-state.interface.d.ts +0 -71
- package/lib/renderer/models/z-index.enum.d.ts +0 -44
- package/lib/schemas/table-config.schema.d.ts +0 -455
- package/lib/services/autosave.service.d.ts +0 -73
- package/lib/services/custom-validation-rules.util.d.ts +0 -12
- package/lib/services/json-schema-validator.service.d.ts +0 -49
- package/lib/services/row-validation.service.d.ts +0 -17
- package/lib/services/validation-logger.service.d.ts +0 -87
- package/lib/services/virtual-scroll.service.d.ts +0 -44
- package/lib/shared/shared-table-components.module.d.ts +0 -9
- package/lib/smart-table.module.d.ts +0 -26
- package/lib/strategies/default-editors.d.ts +0 -109
- package/lib/strategies/default-formatters.d.ts +0 -116
- package/lib/strategies/default-validators.d.ts +0 -113
- package/public-api.d.ts +0 -70
- package/src/lib/builder/README.md +0 -30
- package/src/lib/editors/README.md +0 -303
- package/src/lib/renderer/components/st-column-filter/README.md +0 -286
|
@@ -1,433 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default editor implementations
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Text editor - basic text input
|
|
6
|
-
*/
|
|
7
|
-
export class TextEditor {
|
|
8
|
-
constructor(options) {
|
|
9
|
-
this.options = options;
|
|
10
|
-
}
|
|
11
|
-
edit(context) {
|
|
12
|
-
if (!context.container) {
|
|
13
|
-
console.warn('TextEditor requires a container element');
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
// Create input element
|
|
17
|
-
this.input = document.createElement('input');
|
|
18
|
-
this.input.type = 'text';
|
|
19
|
-
this.input.value = context.value ?? '';
|
|
20
|
-
this.input.className = 'st-cell-editor st-text-editor';
|
|
21
|
-
// Apply inline styles for full width
|
|
22
|
-
this.input.style.width = 'inherit';
|
|
23
|
-
this.input.style.height = 'inherit';
|
|
24
|
-
this.input.style.boxSizing = 'border-box';
|
|
25
|
-
this.input.style.border = 'none';
|
|
26
|
-
this.input.style.outline = 'none';
|
|
27
|
-
if (this.options?.placeholder) {
|
|
28
|
-
this.input.placeholder = this.options.placeholder;
|
|
29
|
-
}
|
|
30
|
-
if (this.options?.maxLength) {
|
|
31
|
-
this.input.maxLength = this.options.maxLength;
|
|
32
|
-
}
|
|
33
|
-
// Handle Enter to save
|
|
34
|
-
this.input.addEventListener('keydown', (e) => {
|
|
35
|
-
if (e.key === 'Enter') {
|
|
36
|
-
e.preventDefault();
|
|
37
|
-
context.onSave(this.input.value);
|
|
38
|
-
}
|
|
39
|
-
else if (e.key === 'Escape') {
|
|
40
|
-
e.preventDefault();
|
|
41
|
-
context.onCancel();
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
// Handle blur to save
|
|
45
|
-
this.input.addEventListener('blur', () => {
|
|
46
|
-
context.onSave(this.input.value);
|
|
47
|
-
});
|
|
48
|
-
// Clear container and append input
|
|
49
|
-
context.container.innerHTML = '';
|
|
50
|
-
context.container.appendChild(this.input);
|
|
51
|
-
// Auto focus
|
|
52
|
-
if (this.options?.autoFocus !== false) {
|
|
53
|
-
this.input.focus();
|
|
54
|
-
if (this.options?.selectOnFocus !== false) {
|
|
55
|
-
this.input.select();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
destroy() {
|
|
60
|
-
if (this.input) {
|
|
61
|
-
this.input.remove();
|
|
62
|
-
this.input = undefined;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
focus() {
|
|
66
|
-
this.input?.focus();
|
|
67
|
-
}
|
|
68
|
-
getCurrentValue() {
|
|
69
|
-
return this.input?.value ?? '';
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Number editor - numeric input
|
|
74
|
-
*/
|
|
75
|
-
export class NumberEditor {
|
|
76
|
-
constructor(options) {
|
|
77
|
-
this.options = options;
|
|
78
|
-
}
|
|
79
|
-
edit(context) {
|
|
80
|
-
if (!context.container) {
|
|
81
|
-
console.warn('NumberEditor requires a container element');
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
// Create input element
|
|
85
|
-
this.input = document.createElement('input');
|
|
86
|
-
this.input.type = 'number';
|
|
87
|
-
this.input.value = context.value?.toString() ?? '';
|
|
88
|
-
this.input.className = 'st-cell-editor st-number-editor';
|
|
89
|
-
// Apply inline styles with flex-grow for numbers
|
|
90
|
-
this.input.style.width = 'inherit';
|
|
91
|
-
this.input.style.height = 'inherit';
|
|
92
|
-
this.input.style.boxSizing = 'border-box';
|
|
93
|
-
this.input.style.flexGrow = '1';
|
|
94
|
-
this.input.style.border = 'none';
|
|
95
|
-
this.input.style.outline = 'none';
|
|
96
|
-
if (this.options?.placeholder) {
|
|
97
|
-
this.input.placeholder = this.options.placeholder;
|
|
98
|
-
}
|
|
99
|
-
if (this.options?.min !== undefined) {
|
|
100
|
-
this.input.min = this.options.min.toString();
|
|
101
|
-
}
|
|
102
|
-
if (this.options?.max !== undefined) {
|
|
103
|
-
this.input.max = this.options.max.toString();
|
|
104
|
-
}
|
|
105
|
-
if (this.options?.step !== undefined) {
|
|
106
|
-
this.input.step = this.options.step.toString();
|
|
107
|
-
}
|
|
108
|
-
// Handle Enter to save
|
|
109
|
-
this.input.addEventListener('keydown', (e) => {
|
|
110
|
-
if (e.key === 'Enter') {
|
|
111
|
-
e.preventDefault();
|
|
112
|
-
const value = parseFloat(this.input.value);
|
|
113
|
-
context.onSave(value);
|
|
114
|
-
}
|
|
115
|
-
else if (e.key === 'Escape') {
|
|
116
|
-
e.preventDefault();
|
|
117
|
-
context.onCancel();
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
// Handle blur to save
|
|
121
|
-
this.input.addEventListener('blur', () => {
|
|
122
|
-
const value = parseFloat(this.input.value);
|
|
123
|
-
context.onSave(value);
|
|
124
|
-
});
|
|
125
|
-
// Clear container and append input
|
|
126
|
-
context.container.innerHTML = '';
|
|
127
|
-
context.container.appendChild(this.input);
|
|
128
|
-
// Auto focus
|
|
129
|
-
if (this.options?.autoFocus !== false) {
|
|
130
|
-
this.input.focus();
|
|
131
|
-
if (this.options?.selectOnFocus !== false) {
|
|
132
|
-
this.input.select();
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
destroy() {
|
|
137
|
-
if (this.input) {
|
|
138
|
-
this.input.remove();
|
|
139
|
-
this.input = undefined;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
focus() {
|
|
143
|
-
this.input?.focus();
|
|
144
|
-
}
|
|
145
|
-
getCurrentValue() {
|
|
146
|
-
return parseFloat(this.input?.value ?? '0');
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Date editor - date input
|
|
151
|
-
*/
|
|
152
|
-
export class DateEditor {
|
|
153
|
-
constructor(options) {
|
|
154
|
-
this.options = options;
|
|
155
|
-
}
|
|
156
|
-
edit(context) {
|
|
157
|
-
if (!context.container) {
|
|
158
|
-
console.warn('DateEditor requires a container element');
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
// Create input element
|
|
162
|
-
this.input = document.createElement('input');
|
|
163
|
-
this.input.type = 'date';
|
|
164
|
-
this.input.className = 'st-cell-editor st-date-editor';
|
|
165
|
-
// Apply inline styles for full width
|
|
166
|
-
this.input.style.width = 'inherit';
|
|
167
|
-
this.input.style.height = 'inherit';
|
|
168
|
-
this.input.style.boxSizing = 'border-box';
|
|
169
|
-
// Format date value
|
|
170
|
-
if (context.value) {
|
|
171
|
-
const date = context.value instanceof Date ? context.value : new Date(context.value);
|
|
172
|
-
if (!isNaN(date.getTime())) {
|
|
173
|
-
this.input.value = date.toISOString().split('T')[0];
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
if (this.options?.min) {
|
|
177
|
-
const minDate = this.options.min instanceof Date ? this.options.min : new Date(this.options.min);
|
|
178
|
-
this.input.min = minDate.toISOString().split('T')[0];
|
|
179
|
-
}
|
|
180
|
-
if (this.options?.max) {
|
|
181
|
-
const maxDate = this.options.max instanceof Date ? this.options.max : new Date(this.options.max);
|
|
182
|
-
this.input.max = maxDate.toISOString().split('T')[0];
|
|
183
|
-
}
|
|
184
|
-
// Handle Enter to save
|
|
185
|
-
this.input.addEventListener('keydown', (e) => {
|
|
186
|
-
if (e.key === 'Enter') {
|
|
187
|
-
e.preventDefault();
|
|
188
|
-
const value = this.input.value ? new Date(this.input.value) : null;
|
|
189
|
-
context.onSave(value);
|
|
190
|
-
}
|
|
191
|
-
else if (e.key === 'Escape') {
|
|
192
|
-
e.preventDefault();
|
|
193
|
-
context.onCancel();
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
// Handle change to save
|
|
197
|
-
this.input.addEventListener('change', () => {
|
|
198
|
-
const value = this.input.value ? new Date(this.input.value) : null;
|
|
199
|
-
context.onSave(value);
|
|
200
|
-
});
|
|
201
|
-
// Handle blur to save
|
|
202
|
-
this.input.addEventListener('blur', () => {
|
|
203
|
-
const value = this.input.value ? new Date(this.input.value) : null;
|
|
204
|
-
context.onSave(value);
|
|
205
|
-
});
|
|
206
|
-
// Clear container and append input
|
|
207
|
-
context.container.innerHTML = '';
|
|
208
|
-
context.container.appendChild(this.input);
|
|
209
|
-
// Auto focus
|
|
210
|
-
if (this.options?.autoFocus !== false) {
|
|
211
|
-
this.input.focus();
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
destroy() {
|
|
215
|
-
if (this.input) {
|
|
216
|
-
this.input.remove();
|
|
217
|
-
this.input = undefined;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
focus() {
|
|
221
|
-
this.input?.focus();
|
|
222
|
-
}
|
|
223
|
-
getCurrentValue() {
|
|
224
|
-
const value = this.input?.value;
|
|
225
|
-
return value ? new Date(value) : new Date();
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Select editor - dropdown selection
|
|
230
|
-
*/
|
|
231
|
-
export class SelectEditor {
|
|
232
|
-
constructor(options) {
|
|
233
|
-
this.options = options;
|
|
234
|
-
}
|
|
235
|
-
edit(context) {
|
|
236
|
-
if (!context.container) {
|
|
237
|
-
console.warn('SelectEditor requires a container element');
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
// Create select element
|
|
241
|
-
this.select = document.createElement('select');
|
|
242
|
-
this.select.className = 'st-cell-editor st-select-editor';
|
|
243
|
-
// Apply inline styles for full width
|
|
244
|
-
this.select.style.width = '100%';
|
|
245
|
-
this.select.style.boxSizing = 'border-box';
|
|
246
|
-
// Add placeholder option
|
|
247
|
-
if (this.options.placeholder) {
|
|
248
|
-
const placeholderOption = document.createElement('option');
|
|
249
|
-
placeholderOption.value = '';
|
|
250
|
-
placeholderOption.textContent = this.options.placeholder;
|
|
251
|
-
placeholderOption.disabled = true;
|
|
252
|
-
this.select.appendChild(placeholderOption);
|
|
253
|
-
}
|
|
254
|
-
// Add options
|
|
255
|
-
this.options.options.forEach(opt => {
|
|
256
|
-
const option = document.createElement('option');
|
|
257
|
-
option.value = String(opt.value);
|
|
258
|
-
option.textContent = opt.label;
|
|
259
|
-
option.selected = opt.value === context.value;
|
|
260
|
-
this.select.appendChild(option);
|
|
261
|
-
});
|
|
262
|
-
// Handle change to save
|
|
263
|
-
this.select.addEventListener('change', () => {
|
|
264
|
-
const selectedOption = this.options.options.find(opt => String(opt.value) === this.select.value);
|
|
265
|
-
if (selectedOption) {
|
|
266
|
-
context.onSave(selectedOption.value);
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
// Handle keydown
|
|
270
|
-
this.select.addEventListener('keydown', (e) => {
|
|
271
|
-
if (e.key === 'Escape') {
|
|
272
|
-
e.preventDefault();
|
|
273
|
-
context.onCancel();
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
// Handle blur to cancel (already saved on change)
|
|
277
|
-
this.select.addEventListener('blur', () => {
|
|
278
|
-
// Don't save on blur since we save on change
|
|
279
|
-
context.onCancel();
|
|
280
|
-
});
|
|
281
|
-
// Clear container and append select
|
|
282
|
-
context.container.innerHTML = '';
|
|
283
|
-
context.container.appendChild(this.select);
|
|
284
|
-
// Auto focus
|
|
285
|
-
if (this.options.autoFocus !== false) {
|
|
286
|
-
this.select.focus();
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
destroy() {
|
|
290
|
-
if (this.select) {
|
|
291
|
-
this.select.remove();
|
|
292
|
-
this.select = undefined;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
focus() {
|
|
296
|
-
this.select?.focus();
|
|
297
|
-
}
|
|
298
|
-
getCurrentValue() {
|
|
299
|
-
const selectedOption = this.options.options.find(opt => String(opt.value) === this.select?.value);
|
|
300
|
-
return selectedOption?.value ?? '';
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Boolean editor - checkbox
|
|
305
|
-
*/
|
|
306
|
-
export class BooleanEditor {
|
|
307
|
-
constructor(options) {
|
|
308
|
-
this.options = options;
|
|
309
|
-
}
|
|
310
|
-
edit(context) {
|
|
311
|
-
if (!context.container) {
|
|
312
|
-
console.warn('BooleanEditor requires a container element');
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
// Create checkbox element
|
|
316
|
-
this.checkbox = document.createElement('input');
|
|
317
|
-
this.checkbox.type = 'checkbox';
|
|
318
|
-
this.checkbox.checked = !!context.value;
|
|
319
|
-
this.checkbox.className = 'st-cell-editor st-boolean-editor';
|
|
320
|
-
// Apply inline styles (centered checkbox)
|
|
321
|
-
this.checkbox.style.margin = '0 auto';
|
|
322
|
-
this.checkbox.style.display = 'block';
|
|
323
|
-
// Handle change to save
|
|
324
|
-
if (this.options?.saveOnChange !== false) {
|
|
325
|
-
this.checkbox.addEventListener('change', () => {
|
|
326
|
-
context.onSave(this.checkbox.checked);
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
// Handle keydown
|
|
330
|
-
this.checkbox.addEventListener('keydown', (e) => {
|
|
331
|
-
if (e.key === 'Enter') {
|
|
332
|
-
e.preventDefault();
|
|
333
|
-
context.onSave(this.checkbox.checked);
|
|
334
|
-
}
|
|
335
|
-
else if (e.key === 'Escape') {
|
|
336
|
-
e.preventDefault();
|
|
337
|
-
context.onCancel();
|
|
338
|
-
}
|
|
339
|
-
});
|
|
340
|
-
// Clear container and append checkbox
|
|
341
|
-
context.container.innerHTML = '';
|
|
342
|
-
context.container.appendChild(this.checkbox);
|
|
343
|
-
// Auto focus
|
|
344
|
-
if (this.options?.autoFocus !== false) {
|
|
345
|
-
this.checkbox.focus();
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
destroy() {
|
|
349
|
-
if (this.checkbox) {
|
|
350
|
-
this.checkbox.remove();
|
|
351
|
-
this.checkbox = undefined;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
focus() {
|
|
355
|
-
this.checkbox?.focus();
|
|
356
|
-
}
|
|
357
|
-
getCurrentValue() {
|
|
358
|
-
return this.checkbox?.checked ?? false;
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Textarea editor - multi-line text input
|
|
363
|
-
*/
|
|
364
|
-
export class TextAreaEditor {
|
|
365
|
-
constructor(options) {
|
|
366
|
-
this.options = options;
|
|
367
|
-
}
|
|
368
|
-
edit(context) {
|
|
369
|
-
if (!context.container) {
|
|
370
|
-
console.warn('TextAreaEditor requires a container element');
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
// Create textarea element
|
|
374
|
-
this.textarea = document.createElement('textarea');
|
|
375
|
-
this.textarea.value = context.value ?? '';
|
|
376
|
-
this.textarea.className = 'st-cell-editor st-textarea-editor';
|
|
377
|
-
// Apply inline styles for full width
|
|
378
|
-
this.textarea.style.width = 'inherit';
|
|
379
|
-
this.textarea.style.height = 'inherit';
|
|
380
|
-
this.textarea.style.boxSizing = 'border-box';
|
|
381
|
-
this.textarea.style.resize = 'vertical';
|
|
382
|
-
if (this.options?.placeholder) {
|
|
383
|
-
this.textarea.placeholder = this.options.placeholder;
|
|
384
|
-
}
|
|
385
|
-
if (this.options?.maxLength) {
|
|
386
|
-
this.textarea.maxLength = this.options.maxLength;
|
|
387
|
-
}
|
|
388
|
-
if (this.options?.rows) {
|
|
389
|
-
this.textarea.rows = this.options.rows;
|
|
390
|
-
}
|
|
391
|
-
if (this.options?.cols) {
|
|
392
|
-
this.textarea.cols = this.options.cols;
|
|
393
|
-
}
|
|
394
|
-
// Handle Ctrl+Enter to save
|
|
395
|
-
this.textarea.addEventListener('keydown', (e) => {
|
|
396
|
-
if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {
|
|
397
|
-
e.preventDefault();
|
|
398
|
-
context.onSave(this.textarea.value);
|
|
399
|
-
}
|
|
400
|
-
else if (e.key === 'Escape') {
|
|
401
|
-
e.preventDefault();
|
|
402
|
-
context.onCancel();
|
|
403
|
-
}
|
|
404
|
-
});
|
|
405
|
-
// Handle blur to save
|
|
406
|
-
this.textarea.addEventListener('blur', () => {
|
|
407
|
-
context.onSave(this.textarea.value);
|
|
408
|
-
});
|
|
409
|
-
// Clear container and append textarea
|
|
410
|
-
context.container.innerHTML = '';
|
|
411
|
-
context.container.appendChild(this.textarea);
|
|
412
|
-
// Auto focus
|
|
413
|
-
if (this.options?.autoFocus !== false) {
|
|
414
|
-
this.textarea.focus();
|
|
415
|
-
if (this.options?.selectOnFocus !== false) {
|
|
416
|
-
this.textarea.select();
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
destroy() {
|
|
421
|
-
if (this.textarea) {
|
|
422
|
-
this.textarea.remove();
|
|
423
|
-
this.textarea = undefined;
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
focus() {
|
|
427
|
-
this.textarea?.focus();
|
|
428
|
-
}
|
|
429
|
-
getCurrentValue() {
|
|
430
|
-
return this.textarea?.value ?? '';
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1lZGl0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9zdHJhdGVnaWVzL2RlZmF1bHQtZWRpdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUlIOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFHckIsWUFDbUIsT0FLaEI7UUFMZ0IsWUFBTyxHQUFQLE9BQU8sQ0FLdkI7SUFDQSxDQUFDO0lBRUosSUFBSSxDQUFDLE9BQWtDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUN4RCxPQUFPO1NBQ1I7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRywrQkFBK0IsQ0FBQztRQUN2RCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFB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TyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUyxDQUFDLEtBQVksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUgsc0NBQXNDO1FBQ3RDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFN0MsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsS0FBSyxLQUFLLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDeEI7U0FDRjtJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmF1bHQgZWRpdG9yIGltcGxlbWVudGF0aW9uc1xuICovXG5cbmltcG9ydCB7IENlbGxFZGl0b3IsIENlbGxFZGl0b3JDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzL2NlbGwtc3RyYXRlZ2llcy5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIFRleHQgZWRpdG9yIC0gYmFzaWMgdGV4dCBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgVGV4dEVkaXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3I8c3RyaW5nPiB7XG4gIHByaXZhdGUgaW5wdXQ/OiBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IHtcbiAgICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgICAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgICAgIHNlbGVjdE9uRm9jdXM/OiBib29sZWFuO1xuICAgIH1cbiAgKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8c3RyaW5nPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGV4dEVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGlucHV0IGVsZW1lbnRcbiAgICB0aGlzLmlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0aGlzLmlucHV0LnR5cGUgPSAndGV4dCc7XG4gICAgdGhpcy5pbnB1dC52YWx1ZSA9IGNvbnRleHQudmFsdWUgPz8gJyc7XG4gICAgdGhpcy5pbnB1dC5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtdGV4dC1lZGl0b3InO1xuICAgIC8vIEFwcGx5IGlubGluZSBzdHlsZXMgZm9yIGZ1bGwgd2lkdGhcbiAgICB0aGlzLmlucHV0LnN0eWxlLndpZHRoID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuaGVpZ2h0ID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuYm9yZGVyID0gJ25vbmUnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUub3V0bGluZSA9ICdub25lJztcblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLmlucHV0LnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lm1heExlbmd0aCkge1xuICAgICAgdGhpcy5pbnB1dC5tYXhMZW5ndGggPSB0aGlzLm9wdGlvbnMubWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBFbnRlciB0byBzYXZlXG4gICAgdGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuaW5wdXQhLnZhbHVlIGFzIGFueSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25DYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBibHVyIHRvIHNhdmVcbiAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XG4gICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLmlucHV0IS52YWx1ZSBhcyBhbnkpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2xlYXIgY29udGFpbmVyIGFuZCBhcHBlbmQgaW5wdXRcbiAgICBjb250ZXh0LmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmlucHV0KTtcblxuICAgIC8vIEF1dG8gZm9jdXNcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgICBcbiAgICAgIGlmICh0aGlzLm9wdGlvbnM/LnNlbGVjdE9uRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuaW5wdXQuc2VsZWN0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dCkge1xuICAgICAgdGhpcy5pbnB1dC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dD8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlucHV0Py52YWx1ZSA/PyAnJztcbiAgfVxufVxuXG4vKipcbiAqIE51bWJlciBlZGl0b3IgLSBudW1lcmljIGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBOdW1iZXJFZGl0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yPG51bWJlcj4ge1xuICBwcml2YXRlIGlucHV0PzogSFRNTElucHV0RWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiB7XG4gICAgICBtaW4/OiBudW1iZXI7XG4gICAgICBtYXg/OiBudW1iZXI7XG4gICAgICBzdGVwPzogbnVtYmVyO1xuICAgICAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAgICAgc2VsZWN0T25Gb2N1cz86IGJvb2xlYW47XG4gICAgfVxuICApIHt9XG5cbiAgZWRpdChjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxudW1iZXI+KTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdOdW1iZXJFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbnB1dCBlbGVtZW50XG4gICAgdGhpcy5pbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgdGhpcy5pbnB1dC50eXBlID0gJ251bWJlcic7XG4gICAgdGhpcy5pbnB1dC52YWx1ZSA9IGNvbnRleHQudmFsdWU/LnRvU3RyaW5nKCkgPz8gJyc7XG4gICAgdGhpcy5pbnB1dC5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtbnVtYmVyLWVkaXRvcic7XG4gICAgLy8gQXBwbHkgaW5saW5lIHN0eWxlcyB3aXRoIGZsZXgtZ3JvdyBmb3IgbnVtYmVyc1xuICAgIHRoaXMuaW5wdXQuc3R5bGUud2lkdGggPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5pbnB1dC5zdHlsZS5oZWlnaHQgPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5pbnB1dC5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7XG4gICAgdGhpcy5pbnB1dC5zdHlsZS5mbGV4R3JvdyA9ICcxJztcbiAgICB0aGlzLmlucHV0LnN0eWxlLmJvcmRlciA9ICdub25lJztcbiAgICB0aGlzLmlucHV0LnN0eWxlLm91dGxpbmUgPSAnbm9uZSc7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5pbnB1dC5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5taW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnB1dC5taW4gPSB0aGlzLm9wdGlvbnMubWluLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaW5wdXQubWF4ID0gdGhpcy5vcHRpb25zLm1heC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnN0ZXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnB1dC5zdGVwID0gdGhpcy5vcHRpb25zLnN0ZXAudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgRW50ZXIgdG8gc2F2ZVxuICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQodGhpcy5pbnB1dCEudmFsdWUpO1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSBhcyBhbnkpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgYmx1ciB0byBzYXZlXG4gICAgdGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHRoaXMuaW5wdXQhLnZhbHVlKTtcbiAgICAgIGNvbnRleHQub25TYXZlKHZhbHVlIGFzIGFueSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCBpbnB1dFxuICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRleHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuaW5wdXQpO1xuXG4gICAgLy8gQXV0byBmb2N1c1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmF1dG9Gb2N1cyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMub3B0aW9ucz8uc2VsZWN0T25Gb2N1cyAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5pbnB1dC5zZWxlY3QoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlucHV0KSB7XG4gICAgICB0aGlzLmlucHV0LnJlbW92ZSgpO1xuICAgICAgdGhpcy5pbnB1dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0Py5mb2N1cygpO1xuICB9XG5cbiAgZ2V0Q3VycmVudFZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy5pbnB1dD8udmFsdWUgPz8gJzAnKTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGUgZWRpdG9yIC0gZGF0ZSBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgRGF0ZUVkaXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3I8RGF0ZT4ge1xuICBwcml2YXRlIGlucHV0PzogSFRNTElucHV0RWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiB7XG4gICAgICBtaW4/OiBzdHJpbmcgfCBEYXRlO1xuICAgICAgbWF4Pzogc3RyaW5nIHwgRGF0ZTtcbiAgICAgIGF1dG9Gb2N1cz86IGJvb2xlYW47XG4gICAgfVxuICApIHt9XG5cbiAgZWRpdChjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxEYXRlPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignRGF0ZUVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGlucHV0IGVsZW1lbnRcbiAgICB0aGlzLmlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0aGlzLmlucHV0LnR5cGUgPSAnZGF0ZSc7XG4gICAgdGhpcy5pbnB1dC5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtZGF0ZS1lZGl0b3InO1xuICAgIC8vIEFwcGx5IGlubGluZSBzdHlsZXMgZm9yIGZ1bGwgd2lkdGhcbiAgICB0aGlzLmlucHV0LnN0eWxlLndpZHRoID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuaGVpZ2h0ID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuXG4gICAgLy8gRm9ybWF0IGRhdGUgdmFsdWVcbiAgICBpZiAoY29udGV4dC52YWx1ZSkge1xuICAgICAgY29uc3QgZGF0ZSA9IGNvbnRleHQudmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gY29udGV4dC52YWx1ZSA6IG5ldyBEYXRlKGNvbnRleHQudmFsdWUpO1xuICAgICAgaWYgKCFpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhpcy5pbnB1dC52YWx1ZSA9IGRhdGUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lm1pbikge1xuICAgICAgY29uc3QgbWluRGF0ZSA9IHRoaXMub3B0aW9ucy5taW4gaW5zdGFuY2VvZiBEYXRlID8gdGhpcy5vcHRpb25zLm1pbiA6IG5ldyBEYXRlKHRoaXMub3B0aW9ucy5taW4pO1xuICAgICAgdGhpcy5pbnB1dC5taW4gPSBtaW5EYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5tYXgpIHtcbiAgICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm9wdGlvbnMubWF4IGluc3RhbmNlb2YgRGF0ZSA/IHRoaXMub3B0aW9ucy5tYXggOiBuZXcgRGF0ZSh0aGlzLm9wdGlvbnMubWF4KTtcbiAgICAgIHRoaXMuaW5wdXQubWF4ID0gbWF4RGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEVudGVyIHRvIHNhdmVcbiAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0IS52YWx1ZSA/IG5ldyBEYXRlKHRoaXMuaW5wdXQhLnZhbHVlKSA6IG51bGw7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHZhbHVlIGFzIGFueSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25DYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBjaGFuZ2UgdG8gc2F2ZVxuICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0IS52YWx1ZSA/IG5ldyBEYXRlKHRoaXMuaW5wdXQhLnZhbHVlKSA6IG51bGw7XG4gICAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSBhcyBhbnkpO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGJsdXIgdG8gc2F2ZVxuICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnB1dCEudmFsdWUgPyBuZXcgRGF0ZSh0aGlzLmlucHV0IS52YWx1ZSkgOiBudWxsO1xuICAgICAgY29udGV4dC5vblNhdmUodmFsdWUgYXMgYW55KTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIGlucHV0XG4gICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pbnB1dCk7XG5cbiAgICAvLyBBdXRvIGZvY3VzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYXV0b0ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5wdXQpIHtcbiAgICAgIHRoaXMuaW5wdXQucmVtb3ZlKCk7XG4gICAgICB0aGlzLmlucHV0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXQ/LmZvY3VzKCk7XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogRGF0ZSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0Py52YWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgPyBuZXcgRGF0ZSh2YWx1ZSkgOiBuZXcgRGF0ZSgpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IGVkaXRvciAtIGRyb3Bkb3duIHNlbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0RWRpdG9yPFQgPSBhbnk+IGltcGxlbWVudHMgQ2VsbEVkaXRvcjxUPiB7XG4gIHByaXZhdGUgc2VsZWN0PzogSFRNTFNlbGVjdEVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiB7XG4gICAgICBvcHRpb25zOiBBcnJheTx7IHZhbHVlOiBUOyBsYWJlbDogc3RyaW5nIH0+O1xuICAgICAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAgIH1cbiAgKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRleHQuY29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NlbGVjdEVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHNlbGVjdCBlbGVtZW50XG4gICAgdGhpcy5zZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTtcbiAgICB0aGlzLnNlbGVjdC5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3Qtc2VsZWN0LWVkaXRvcic7XG4gICAgLy8gQXBwbHkgaW5saW5lIHN0eWxlcyBmb3IgZnVsbCB3aWR0aFxuICAgIHRoaXMuc2VsZWN0LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcblxuICAgIC8vIEFkZCBwbGFjZWhvbGRlciBvcHRpb25cbiAgICBpZiAodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlck9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgcGxhY2Vob2xkZXJPcHRpb24udmFsdWUgPSAnJztcbiAgICAgIHBsYWNlaG9sZGVyT3B0aW9uLnRleHRDb250ZW50ID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgICAgcGxhY2Vob2xkZXJPcHRpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3QuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXJPcHRpb24pO1xuICAgIH1cblxuICAgIC8vIEFkZCBvcHRpb25zXG4gICAgdGhpcy5vcHRpb25zLm9wdGlvbnMuZm9yRWFjaChvcHQgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHRpb24udmFsdWUgPSBTdHJpbmcob3B0LnZhbHVlKTtcbiAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IG9wdC5sYWJlbDtcbiAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG9wdC52YWx1ZSA9PT0gY29udGV4dC52YWx1ZTtcbiAgICAgIHRoaXMuc2VsZWN0IS5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGNoYW5nZSB0byBzYXZlXG4gICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMub3B0aW9ucy5maW5kKFxuICAgICAgICBvcHQgPT4gU3RyaW5nKG9wdC52YWx1ZSkgPT09IHRoaXMuc2VsZWN0IS52YWx1ZVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZShzZWxlY3RlZE9wdGlvbi52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUga2V5ZG93blxuICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25DYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBibHVyIHRvIGNhbmNlbCAoYWxyZWFkeSBzYXZlZCBvbiBjaGFuZ2UpXG4gICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgIC8vIERvbid0IHNhdmUgb24gYmx1ciBzaW5jZSB3ZSBzYXZlIG9uIGNoYW5nZVxuICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2xlYXIgY29udGFpbmVyIGFuZCBhcHBlbmQgc2VsZWN0XG4gICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zZWxlY3QpO1xuXG4gICAgLy8gQXV0byBmb2N1c1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zZWxlY3QuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdCkge1xuICAgICAgdGhpcy5zZWxlY3QucmVtb3ZlKCk7XG4gICAgICB0aGlzLnNlbGVjdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdD8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMub3B0aW9ucy5vcHRpb25zLmZpbmQoXG4gICAgICBvcHQgPT4gU3RyaW5nKG9wdC52YWx1ZSkgPT09IHRoaXMuc2VsZWN0Py52YWx1ZVxuICAgICk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uPy52YWx1ZSA/PyAoJycgYXMgYW55KTtcbiAgfVxufVxuXG4vKipcbiAqIEJvb2xlYW4gZWRpdG9yIC0gY2hlY2tib3hcbiAqL1xuZXhwb3J0IGNsYXNzIEJvb2xlYW5FZGl0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yPGJvb2xlYW4+IHtcbiAgcHJpdmF0ZSBjaGVja2JveD86IEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zPzoge1xuICAgICAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgICAgIHNhdmVPbkNoYW5nZT86IGJvb2xlYW47XG4gICAgfVxuICApIHt9XG5cbiAgZWRpdChjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxib29sZWFuPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignQm9vbGVhbkVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNoZWNrYm94IGVsZW1lbnRcbiAgICB0aGlzLmNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0aGlzLmNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIHRoaXMuY2hlY2tib3guY2hlY2tlZCA9ICEhY29udGV4dC52YWx1ZTtcbiAgICB0aGlzLmNoZWNrYm94LmNsYXNzTmFtZSA9ICdzdC1jZWxsLWVkaXRvciBzdC1ib29sZWFuLWVkaXRvcic7XG4gICAgLy8gQXBwbHkgaW5saW5lIHN0eWxlcyAoY2VudGVyZWQgY2hlY2tib3gpXG4gICAgdGhpcy5jaGVja2JveC5zdHlsZS5tYXJnaW4gPSAnMCBhdXRvJztcbiAgICB0aGlzLmNoZWNrYm94LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgLy8gSGFuZGxlIGNoYW5nZSB0byBzYXZlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2F2ZU9uQ2hhbmdlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuY2hlY2tib3ghLmNoZWNrZWQgYXMgYW55KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBrZXlkb3duXG4gICAgdGhpcy5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuY2hlY2tib3ghLmNoZWNrZWQgYXMgYW55KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2xlYXIgY29udGFpbmVyIGFuZCBhcHBlbmQgY2hlY2tib3hcbiAgICBjb250ZXh0LmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNoZWNrYm94KTtcblxuICAgIC8vIEF1dG8gZm9jdXNcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmNoZWNrYm94LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja2JveCkge1xuICAgICAgdGhpcy5jaGVja2JveC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuY2hlY2tib3ggPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja2JveD8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja2JveD8uY2hlY2tlZCA/PyBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRleHRhcmVhIGVkaXRvciAtIG11bHRpLWxpbmUgdGV4dCBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgVGV4dEFyZWFFZGl0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yPHN0cmluZz4ge1xuICBwcml2YXRlIHRleHRhcmVhPzogSFRNTFRleHRBcmVhRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiB7XG4gICAgICByb3dzPzogbnVtYmVyO1xuICAgICAgY29scz86IG51bWJlcjtcbiAgICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgICAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgICAgIHNlbGVjdE9uRm9jdXM/OiBib29sZWFuO1xuICAgIH1cbiAgKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8c3RyaW5nPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGV4dEFyZWFFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0ZXh0YXJlYSBlbGVtZW50XG4gICAgdGhpcy50ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGhpcy50ZXh0YXJlYS52YWx1ZSA9IGNvbnRleHQudmFsdWUgPz8gJyc7XG4gICAgdGhpcy50ZXh0YXJlYS5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtdGV4dGFyZWEtZWRpdG9yJztcbiAgICAvLyBBcHBseSBpbmxpbmUgc3R5bGVzIGZvciBmdWxsIHdpZHRoXG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aCA9ICdpbmhlcml0JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdpbmhlcml0JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLnJlc2l6ZSA9ICd2ZXJ0aWNhbCc7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy50ZXh0YXJlYS5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5tYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMudGV4dGFyZWEubWF4TGVuZ3RoID0gdGhpcy5vcHRpb25zLm1heExlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5yb3dzKSB7XG4gICAgICB0aGlzLnRleHRhcmVhLnJvd3MgPSB0aGlzLm9wdGlvbnMucm93cztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jb2xzKSB7XG4gICAgICB0aGlzLnRleHRhcmVhLmNvbHMgPSB0aGlzLm9wdGlvbnMuY29scztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgQ3RybCtFbnRlciB0byBzYXZlXG4gICAgdGhpcy50ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLnRleHRhcmVhIS52YWx1ZSBhcyBhbnkpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgYmx1ciB0byBzYXZlXG4gICAgdGhpcy50ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgY29udGV4dC5vblNhdmUodGhpcy50ZXh0YXJlYSEudmFsdWUgYXMgYW55KTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIHRleHRhcmVhXG4gICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy50ZXh0YXJlYSk7XG5cbiAgICAvLyBBdXRvIGZvY3VzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYXV0b0ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy50ZXh0YXJlYS5mb2N1cygpO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5vcHRpb25zPy5zZWxlY3RPbkZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnRleHRhcmVhLnNlbGVjdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGV4dGFyZWEpIHtcbiAgICAgIHRoaXMudGV4dGFyZWEucmVtb3ZlKCk7XG4gICAgICB0aGlzLnRleHRhcmVhID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMudGV4dGFyZWE/LmZvY3VzKCk7XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0YXJlYT8udmFsdWUgPz8gJyc7XG4gIH1cbn1cblxuIl19
|