@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.
- package/README.md +152 -0
- package/aquera-ngx-smart-table.d.ts +5 -0
- package/esm2020/aquera-ngx-smart-table.mjs +5 -0
- package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
- package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
- package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
- package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
- package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
- package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
- package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
- package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
- package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
- package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
- package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
- package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
- package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
- package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
- package/esm2020/lib/editors/index.mjs +9 -0
- package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
- package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
- package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
- package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
- package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
- package/esm2020/lib/factories/column-config.factory.mjs +231 -0
- package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
- package/esm2020/lib/models/base-column-config.class.mjs +253 -0
- package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
- package/esm2020/lib/models/cell-types.mjs +147 -0
- package/esm2020/lib/models/column-action.interface.mjs +6 -0
- package/esm2020/lib/models/column-config.interface.mjs +43 -0
- package/esm2020/lib/models/column-config.utils.mjs +101 -0
- package/esm2020/lib/models/row-action.interface.mjs +5 -0
- package/esm2020/lib/models/row-validator.interface.mjs +2 -0
- package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
- package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
- package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
- package/esm2020/lib/models/table-config.interface.mjs +106 -0
- package/esm2020/lib/models/table-validator.interface.mjs +2 -0
- package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
- package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
- package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
- package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
- package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
- package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
- package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
- package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
- package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
- package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
- package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
- package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
- package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
- package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
- package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
- package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
- package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
- package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
- package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
- package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
- package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
- package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
- package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
- package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/table-types.mjs +29 -0
- package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
- package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
- package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
- package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
- package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
- package/esm2020/lib/services/autosave.service.mjs +92 -0
- package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
- package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
- package/esm2020/lib/services/row-validation.service.mjs +42 -0
- package/esm2020/lib/services/validation-logger.service.mjs +177 -0
- package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
- package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
- package/esm2020/lib/smart-table.module.mjs +124 -0
- package/esm2020/lib/strategies/default-editors.mjs +433 -0
- package/esm2020/lib/strategies/default-formatters.mjs +238 -0
- package/esm2020/lib/strategies/default-validators.mjs +327 -0
- package/esm2020/public-api.mjs +146 -0
- package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
- package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
- package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
- package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
- package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
- package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
- package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
- package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
- package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
- package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
- package/lib/builder/definition-builder.module.d.ts +15 -0
- package/lib/builder/models/builder-state.interface.d.ts +93 -0
- package/lib/builder/services/definition-builder.service.d.ts +80 -0
- package/lib/builder/services/definition-export.service.d.ts +59 -0
- package/lib/builder/services/definition-import.service.d.ts +31 -0
- package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
- package/lib/builder/utils/config-validator.util.d.ts +32 -0
- package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
- package/lib/editors/index.d.ts +8 -0
- package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
- package/lib/editors/nile-calendar-editor.d.ts +89 -0
- package/lib/editors/nile-date-picker-editor.d.ts +95 -0
- package/lib/editors/nile-input-editor.d.ts +67 -0
- package/lib/editors/nile-select-editor.d.ts +109 -0
- package/lib/factories/column-config.factory.d.ts +73 -0
- package/lib/models/autosave-config.interface.d.ts +23 -0
- package/lib/models/base-column-config.class.d.ts +115 -0
- package/lib/models/cell-strategies.interface.d.ts +181 -0
- package/lib/models/cell-types.d.ts +337 -0
- package/lib/models/column-action.interface.d.ts +86 -0
- package/lib/models/column-config.interface.d.ts +272 -0
- package/lib/models/column-config.utils.d.ts +37 -0
- package/lib/models/row-action.interface.d.ts +86 -0
- package/lib/models/row-validator.interface.d.ts +37 -0
- package/lib/models/schema-validation.interface.d.ts +42 -0
- package/lib/models/sheet-action.interface.d.ts +59 -0
- package/lib/models/sheet-config.interface.d.ts +41 -0
- package/lib/models/table-config.interface.d.ts +245 -0
- package/lib/models/table-validator.interface.d.ts +40 -0
- package/lib/models/workbook-action.interface.d.ts +90 -0
- package/lib/models/workbook-config.interface.d.ts +107 -0
- package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
- package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
- package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
- package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
- package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
- package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
- package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
- package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
- package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
- package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
- package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
- package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
- package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
- package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
- package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
- package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
- package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
- package/lib/renderer/models/cell-state.interface.d.ts +118 -0
- package/lib/renderer/models/cell.class.d.ts +174 -0
- package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
- package/lib/renderer/models/sheet-state.class.d.ts +67 -0
- package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
- package/lib/renderer/models/table-state.class.d.ts +313 -0
- package/lib/renderer/models/table-state.interface.d.ts +18 -0
- package/lib/renderer/models/table-types.d.ts +228 -0
- package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
- package/lib/renderer/models/workbook-state.class.d.ts +117 -0
- package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
- package/lib/renderer/models/z-index.enum.d.ts +44 -0
- package/lib/schemas/table-config.schema.d.ts +455 -0
- package/lib/services/autosave.service.d.ts +73 -0
- package/lib/services/custom-validation-rules.util.d.ts +12 -0
- package/lib/services/json-schema-validator.service.d.ts +49 -0
- package/lib/services/row-validation.service.d.ts +17 -0
- package/lib/services/validation-logger.service.d.ts +87 -0
- package/lib/services/virtual-scroll.service.d.ts +44 -0
- package/lib/shared/shared-table-components.module.d.ts +9 -0
- package/lib/smart-table.module.d.ts +26 -0
- package/lib/strategies/default-editors.d.ts +109 -0
- package/lib/strategies/default-formatters.d.ts +116 -0
- package/lib/strategies/default-validators.d.ts +113 -0
- package/package.json +42 -0
- package/public-api.d.ts +70 -0
- package/src/lib/builder/README.md +30 -0
- package/src/lib/editors/README.md +303 -0
- package/src/lib/renderer/components/st-column-filter/README.md +286 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom editor using NileSelect from @aquera/nile-elements
|
|
3
|
+
* This demonstrates how to create dropdown/select editors for ngx-smart-table
|
|
4
|
+
*/
|
|
5
|
+
import { isObservable } from 'rxjs';
|
|
6
|
+
/**
|
|
7
|
+
* Custom editor that uses NileSelect component
|
|
8
|
+
* @template T The value type (string for single selection, string[] for multiple)
|
|
9
|
+
*/
|
|
10
|
+
export class NileSelectEditor {
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
this.eventListeners = [];
|
|
14
|
+
this.currentOptions = [];
|
|
15
|
+
// Handle Observable options
|
|
16
|
+
if (isObservable(options.options)) {
|
|
17
|
+
this.optionsSubscription = options.options.subscribe(opts => {
|
|
18
|
+
this.currentOptions = opts;
|
|
19
|
+
// If editor is already active, update the DOM
|
|
20
|
+
if (this.select) {
|
|
21
|
+
this.updateOptions();
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Static options
|
|
27
|
+
this.currentOptions = options.options || [];
|
|
28
|
+
if (this.currentOptions.length === 0) {
|
|
29
|
+
console.warn('NileSelectEditor: options array is empty');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
edit(context) {
|
|
34
|
+
if (!context.container) {
|
|
35
|
+
console.warn('NileSelectEditor requires a container element');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Create NileSelect custom element using document.createElement
|
|
39
|
+
this.select = document.createElement('nile-select');
|
|
40
|
+
this.select.className = 'st-cell-editor';
|
|
41
|
+
// Apply inline styles for proper cell fitting
|
|
42
|
+
this.select.style.width = '100%';
|
|
43
|
+
this.select.style.height = 'inherit';
|
|
44
|
+
this.select.style.boxSizing = 'border-box';
|
|
45
|
+
// Set initial value
|
|
46
|
+
this.setInitialValue(context.value);
|
|
47
|
+
// Apply all configuration options
|
|
48
|
+
this.applyOptions();
|
|
49
|
+
// Create and append options with current options
|
|
50
|
+
this.createAndAppendOptions(this.currentOptions);
|
|
51
|
+
// Set up event listeners
|
|
52
|
+
this.setupEventListeners(context);
|
|
53
|
+
// Clear container and append select
|
|
54
|
+
context.container.innerHTML = '';
|
|
55
|
+
context.container.appendChild(this.select);
|
|
56
|
+
// Focus after render
|
|
57
|
+
setTimeout(() => {
|
|
58
|
+
this.select?.focus();
|
|
59
|
+
this.select?.click();
|
|
60
|
+
}, 0);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Set the initial value for the select
|
|
64
|
+
*/
|
|
65
|
+
setInitialValue(value) {
|
|
66
|
+
if (!this.select)
|
|
67
|
+
return;
|
|
68
|
+
if (this.options.multiple) {
|
|
69
|
+
// Handle multiple selection - value should be array
|
|
70
|
+
if (Array.isArray(value)) {
|
|
71
|
+
this.select.value = value;
|
|
72
|
+
}
|
|
73
|
+
else if (value) {
|
|
74
|
+
this.select.value = [String(value)];
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.select.value = [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Handle single selection
|
|
82
|
+
this.select.value = value ? String(value) : '';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Apply all configuration options to the NileSelect element
|
|
87
|
+
*/
|
|
88
|
+
applyOptions() {
|
|
89
|
+
if (!this.select)
|
|
90
|
+
return;
|
|
91
|
+
// Basic options
|
|
92
|
+
if (this.options.placeholder) {
|
|
93
|
+
this.select.placeholder = this.options.placeholder;
|
|
94
|
+
}
|
|
95
|
+
if (this.options.size) {
|
|
96
|
+
this.select.size = this.options.size;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.select.size = 'small'; // Default for table cells
|
|
100
|
+
}
|
|
101
|
+
if (this.options.multiple) {
|
|
102
|
+
this.select.multiple = this.options.multiple;
|
|
103
|
+
}
|
|
104
|
+
// Behavior options
|
|
105
|
+
if (this.options.clearable) {
|
|
106
|
+
this.select.clearable = this.options.clearable;
|
|
107
|
+
}
|
|
108
|
+
if (this.options.disabled) {
|
|
109
|
+
this.select.disabled = this.options.disabled;
|
|
110
|
+
}
|
|
111
|
+
if (this.options.required) {
|
|
112
|
+
this.select.required = this.options.required;
|
|
113
|
+
}
|
|
114
|
+
if (this.options.searchEnabled) {
|
|
115
|
+
this.select.searchEnabled = this.options.searchEnabled;
|
|
116
|
+
}
|
|
117
|
+
// Visual states
|
|
118
|
+
if (this.options.warning) {
|
|
119
|
+
this.select.warning = this.options.warning;
|
|
120
|
+
}
|
|
121
|
+
if (this.options.error) {
|
|
122
|
+
this.select.error = this.options.error;
|
|
123
|
+
}
|
|
124
|
+
if (this.options.success) {
|
|
125
|
+
this.select.success = this.options.success;
|
|
126
|
+
}
|
|
127
|
+
if (this.options.errorMessage) {
|
|
128
|
+
this.select.errorMessage = this.options.errorMessage;
|
|
129
|
+
}
|
|
130
|
+
if (this.options.helpText) {
|
|
131
|
+
this.select.helpText = this.options.helpText;
|
|
132
|
+
}
|
|
133
|
+
// Advanced features
|
|
134
|
+
if (this.options.maxOptionsVisible !== undefined) {
|
|
135
|
+
this.select.maxOptionsVisible = this.options.maxOptionsVisible;
|
|
136
|
+
}
|
|
137
|
+
if (this.options.filled !== undefined) {
|
|
138
|
+
this.select.filled = this.options.filled;
|
|
139
|
+
}
|
|
140
|
+
if (this.options.pill) {
|
|
141
|
+
this.select.pill = this.options.pill;
|
|
142
|
+
}
|
|
143
|
+
if (this.options.hoist) {
|
|
144
|
+
this.select.hoist = this.options.hoist;
|
|
145
|
+
}
|
|
146
|
+
if (this.options.placement) {
|
|
147
|
+
this.select.placement = this.options.placement;
|
|
148
|
+
}
|
|
149
|
+
if (this.options.enableVirtualScroll) {
|
|
150
|
+
this.select.enableVirtualScroll = this.options.enableVirtualScroll;
|
|
151
|
+
}
|
|
152
|
+
if (this.options.disableLocalSearch) {
|
|
153
|
+
this.select.disableLocalSearch = this.options.disableLocalSearch;
|
|
154
|
+
}
|
|
155
|
+
if (this.options.portal !== undefined) {
|
|
156
|
+
this.select.portal = this.options.portal;
|
|
157
|
+
}
|
|
158
|
+
// Prevent width syncing issues in table cells
|
|
159
|
+
this.select.noWidthSync = true;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Update options dynamically while editor is active
|
|
163
|
+
*/
|
|
164
|
+
updateOptions() {
|
|
165
|
+
if (!this.select)
|
|
166
|
+
return;
|
|
167
|
+
// Clear existing options
|
|
168
|
+
while (this.select.firstChild) {
|
|
169
|
+
this.select.removeChild(this.select.firstChild);
|
|
170
|
+
}
|
|
171
|
+
// Re-append with new options
|
|
172
|
+
this.createAndAppendOptions(this.currentOptions);
|
|
173
|
+
// Trigger update on the web component
|
|
174
|
+
if (this.select.requestUpdate) {
|
|
175
|
+
this.select.requestUpdate();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Create NileOption elements and append them to the select
|
|
180
|
+
* @param options - The options to render
|
|
181
|
+
*/
|
|
182
|
+
createAndAppendOptions(options) {
|
|
183
|
+
if (!this.select)
|
|
184
|
+
return;
|
|
185
|
+
options.forEach(opt => {
|
|
186
|
+
const nileOption = document.createElement('nile-option');
|
|
187
|
+
// Auto-detect format: string or SelectOption object
|
|
188
|
+
if (typeof opt === 'string') {
|
|
189
|
+
nileOption.value = opt;
|
|
190
|
+
nileOption.setAttribute('value', opt);
|
|
191
|
+
nileOption.textContent = opt;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
nileOption.value = opt.value;
|
|
195
|
+
nileOption.setAttribute('value', opt.value);
|
|
196
|
+
nileOption.textContent = opt.label;
|
|
197
|
+
if (opt.disabled) {
|
|
198
|
+
nileOption.disabled = true;
|
|
199
|
+
nileOption.setAttribute('disabled', 'true');
|
|
200
|
+
}
|
|
201
|
+
// Handle prefix if provided (could be icon name or content)
|
|
202
|
+
if (opt.prefix) {
|
|
203
|
+
// nileOption.setAttribute('slot', 'prefix');
|
|
204
|
+
// nileOption.innerHTML = `<nile-icon name="${opt.prefix}"></nile-icon>`;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this.select.appendChild(nileOption);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Set up all event listeners with proper cleanup tracking
|
|
212
|
+
*/
|
|
213
|
+
setupEventListeners(context) {
|
|
214
|
+
if (!this.select)
|
|
215
|
+
return;
|
|
216
|
+
const validateOnSave = this.options.validateOnSave !== false;
|
|
217
|
+
// Handle keyboard events (keydown is not replaced by custom events)
|
|
218
|
+
const keydownHandler = (e) => {
|
|
219
|
+
const keyEvent = e;
|
|
220
|
+
if (keyEvent.key === 'Escape') {
|
|
221
|
+
keyEvent.preventDefault();
|
|
222
|
+
keyEvent.stopPropagation();
|
|
223
|
+
context.onCancel();
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
this.select.addEventListener('keydown', keydownHandler);
|
|
227
|
+
this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
|
|
228
|
+
// Use nile-change custom event as primary save trigger
|
|
229
|
+
const changeHandler = (e) => {
|
|
230
|
+
const customEvent = e;
|
|
231
|
+
if (validateOnSave && !this.select?.checkValidity()) {
|
|
232
|
+
this.select?.reportValidity();
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
context.onSave(this.parseValue(customEvent.detail.value));
|
|
236
|
+
};
|
|
237
|
+
this.select.addEventListener('nile-change', changeHandler);
|
|
238
|
+
this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
|
|
239
|
+
// Handle blur as secondary save trigger
|
|
240
|
+
const blurHandler = (e) => {
|
|
241
|
+
if (validateOnSave && !this.select?.checkValidity()) {
|
|
242
|
+
this.select?.reportValidity();
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
// context.onSave(this.getCurrentValue());
|
|
246
|
+
};
|
|
247
|
+
this.select.addEventListener('nile-blur', blurHandler);
|
|
248
|
+
this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
|
|
249
|
+
// Handle clear button if enabled
|
|
250
|
+
if (this.options.clearable) {
|
|
251
|
+
const clearHandler = (e) => {
|
|
252
|
+
context.onSave(this.parseValue(this.options.multiple ? [] : ''));
|
|
253
|
+
};
|
|
254
|
+
this.select.addEventListener('nile-clear', clearHandler);
|
|
255
|
+
this.eventListeners.push({ event: 'nile-clear', handler: clearHandler });
|
|
256
|
+
}
|
|
257
|
+
// Handle search for server-side search scenarios
|
|
258
|
+
if (this.options.disableLocalSearch) {
|
|
259
|
+
const searchHandler = (e) => {
|
|
260
|
+
const customEvent = e;
|
|
261
|
+
// Emit search query through onChange for external handling
|
|
262
|
+
context.onChange(customEvent.detail);
|
|
263
|
+
};
|
|
264
|
+
this.select.addEventListener('nile-search', searchHandler);
|
|
265
|
+
this.eventListeners.push({ event: 'nile-search', handler: searchHandler });
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Parse value based on selection mode
|
|
270
|
+
*/
|
|
271
|
+
parseValue(value) {
|
|
272
|
+
if (this.options.multiple) {
|
|
273
|
+
// Ensure array for multiple selection
|
|
274
|
+
if (Array.isArray(value)) {
|
|
275
|
+
return value;
|
|
276
|
+
}
|
|
277
|
+
return (value ? [value] : []);
|
|
278
|
+
}
|
|
279
|
+
// Single selection - return string
|
|
280
|
+
if (Array.isArray(value)) {
|
|
281
|
+
return (value.length > 0 ? value[0] : '');
|
|
282
|
+
}
|
|
283
|
+
return value;
|
|
284
|
+
}
|
|
285
|
+
destroy() {
|
|
286
|
+
// Unsubscribe from options Observable
|
|
287
|
+
if (this.optionsSubscription) {
|
|
288
|
+
this.optionsSubscription.unsubscribe();
|
|
289
|
+
this.optionsSubscription = undefined;
|
|
290
|
+
}
|
|
291
|
+
// Remove all event listeners
|
|
292
|
+
if (this.select) {
|
|
293
|
+
this.eventListeners.forEach(({ event, handler }) => {
|
|
294
|
+
this.select?.removeEventListener(event, handler);
|
|
295
|
+
});
|
|
296
|
+
this.eventListeners = [];
|
|
297
|
+
this.select.remove();
|
|
298
|
+
this.select = undefined;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
focus() {
|
|
302
|
+
this.select?.focus();
|
|
303
|
+
}
|
|
304
|
+
getCurrentValue() {
|
|
305
|
+
if (!this.select) {
|
|
306
|
+
return (this.options.multiple ? [] : '');
|
|
307
|
+
}
|
|
308
|
+
const value = this.select.value;
|
|
309
|
+
// Handle multiple selection
|
|
310
|
+
if (this.options.multiple) {
|
|
311
|
+
return (Array.isArray(value) ? value : [value]);
|
|
312
|
+
}
|
|
313
|
+
// Handle single selection
|
|
314
|
+
return (Array.isArray(value) ? (value.length > 0 ? value[0] : '') : value);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1zZWxlY3QtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9lZGl0b3JzL25pbGUtc2VsZWN0LWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFHSCxPQUFPLEVBQTRCLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQW1GOUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQU0zQixZQUE2QixPQUFnQztRQUFoQyxZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUpyRCxtQkFBYyxHQUFxRCxFQUFFLENBQUM7UUFFdEUsbUJBQWMsR0FBOEIsRUFBRSxDQUFDO1FBR3JELDRCQUE0QjtRQUM1QixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDM0IsOENBQThDO2dCQUM5QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUN0QjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDMUQ7U0FDRjtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsT0FBNkI7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDdEIsT0FBTyxDQUFD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QUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBaUIsQ0FBQztTQUMxRDtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRWhDLDRCQUE0QjtRQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQWlCLENBQUM7U0FDakU7UUFFRCwwQkFBMEI7UUFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBaUIsQ0FBQztJQUM3RixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZVNlbGVjdCBmcm9tIEBhcXVlcmEvbmlsZS1lbGVtZW50c1xuICogVGhpcyBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBkcm9wZG93bi9zZWxlY3QgZWRpdG9ycyBmb3Igbmd4LXNtYXJ0LXRhYmxlXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIGlzT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFNlbGVjdCBvcHRpb24gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XG4gIC8qKiBUaGUgb3B0aW9uJ3MgdmFsdWUgKi9cbiAgdmFsdWU6IHN0cmluZztcbiAgLyoqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb24gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBPcHRpb25hbCBwcmVmaXggaWNvbiBvciBjb250ZW50ICovXG4gIHByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZVNlbGVjdEVkaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pbGVTZWxlY3RFZGl0b3JPcHRpb25zIHtcbiAgLy8gT3B0aW9ucyBjb25maWd1cmF0aW9uIChSRVFVSVJFRClcbiAgLyoqIEFycmF5IG9mIG9wdGlvbnMgLSBzdXBwb3J0cyBzdGF0aWMgYXJyYXlzLCBPYnNlcnZhYmxlLCBvciBCZWhhdmlvclN1YmplY3QgZm9yIHJlYWN0aXZlIHVwZGF0ZXMgKi9cbiAgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gfCBzdHJpbmdbXSB8IE9ic2VydmFibGU8U2VsZWN0T3B0aW9uW10gfCBzdHJpbmdbXT47XG4gIFxuICAvLyBCYXNpYyBwcm9wZXJ0aWVzXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0IHdoZW4gbm8gc2VsZWN0aW9uIGlzIG1hZGUgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKiBTaXplIG9mIHRoZSBzZWxlY3QgY29udHJvbCAqL1xuICBzaXplPzogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJztcbiAgLyoqIEVuYWJsZSBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSAqL1xuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIFxuICAvLyBCZWhhdmlvciBvcHRpb25zXG4gIC8qKiBBZGRzIGNsZWFyIGJ1dHRvbiB3aGVuIHZhbHVlIGlzIG5vdCBlbXB0eSAqL1xuICBjbGVhcmFibGU/OiBib29sZWFuO1xuICAvKiogRGlzYWJsZSB0aGUgc2VsZWN0IGNvbnRyb2wgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogTWFrZSB0aGUgc2VsZWN0IHJlcXVpcmVkICovXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSAqL1xuICBzZWFyY2hFbmFibGVkPzogYm9vbGVhbjtcbiAgXG4gIC8vIFZpc3VhbCBzdGF0ZXNcbiAgLyoqIFdhcm5pbmcgc3RhdGUgc3R5bGluZyAqL1xuICB3YXJuaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIHN0YXRlIHN0eWxpbmcgKi9cbiAgZXJyb3I/OiBib29sZWFuO1xuICAvKiogU3VjY2VzcyBzdGF0ZSBzdHlsaW5nICovXG4gIHN1Y2Nlc3M/OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5ICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgLyoqIEhlbHAgdGV4dCB0byBkaXNwbGF5ICovXG4gIGhlbHBUZXh0Pzogc3RyaW5nO1xuICBcbiAgLy8gQWR2YW5jZWQgZmVhdHVyZXNcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGVkIG9wdGlvbnMgdG8gc2hvdyBpbiBtdWx0aXBsZSBtb2RlICgwID0gbm8gbGltaXQpICovXG4gIG1heE9wdGlvbnNWaXNpYmxlPzogbnVtYmVyO1xuICAvKiogRHJhd3MgYSBmaWxsZWQgc2VsZWN0IHN0eWxlICovXG4gIGZpbGxlZD86IGJvb2xlYW47XG4gIC8qKiBQaWxsLXN0eWxlIHdpdGggcm91bmRlZCBlZGdlcyAqL1xuICBwaWxsPzogYm9vbGVhbjtcbiAgLyoqIFVzZSBmaXhlZCBwb3NpdGlvbmluZyB0byBwcmV2ZW50IGNsaXBwaW5nICovXG4gIGhvaXN0PzogYm9vbGVhbjtcbiAgLyoqIFBsYWNlbWVudCBvZiB0aGUgZHJvcGRvd24gbWVudSAqL1xuICBwbGFjZW1lbnQ/OiAndG9wJyB8ICdib3R0b20nO1xuICBcbiAgLy8gVmlydHVhbCBzY3JvbGwgZm9yIGxhcmdlIGxpc3RzXG4gIC8qKiBFbmFibGUgdmlydHVhbCBzY3JvbGxpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZSB3aXRoIG1hbnkgb3B0aW9ucyAqL1xuICBlbmFibGVWaXJ0dWFsU2Nyb2xsPzogYm9vbGVhbjtcbiAgXG4gIC8vIFNlYXJjaCBjb25maWd1cmF0aW9uXG4gIC8qKiBEaXNhYmxlIGxvY2FsIHNlYXJjaCAodXNlIGZvciBzZXJ2ZXItc2lkZSBzZWFyY2gpICovXG4gIGRpc2FibGVMb2NhbFNlYXJjaD86IGJvb2xlYW47XG4gIFxuICAvLyBWYWxpZGF0aW9uXG4gIC8qKiBWYWxpZGF0ZSBiZWZvcmUgc2F2aW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICB2YWxpZGF0ZU9uU2F2ZT86IGJvb2xlYW47XG4gIFxuICAvLyBQb3J0YWwgb3B0aW9uc1xuICAvKiogQXBwZW5kIGRyb3Bkb3duIHRvIGRvY3VtZW50IGJvZHkgaW5zdGVhZCBvZiBwYXJlbnQgKi9cbiAgcG9ydGFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gZWRpdG9yIHRoYXQgdXNlcyBOaWxlU2VsZWN0IGNvbXBvbmVudFxuICogQHRlbXBsYXRlIFQgVGhlIHZhbHVlIHR5cGUgKHN0cmluZyBmb3Igc2luZ2xlIHNlbGVjdGlvbiwgc3RyaW5nW10gZm9yIG11bHRpcGxlKVxuICovXG5leHBvcnQgY2xhc3MgTmlsZVNlbGVjdEVkaXRvcjxUID0gc3RyaW5nPiBpbXBsZW1lbnRzIENlbGxFZGl0b3I8VD4ge1xuICBwcml2YXRlIHNlbGVjdD86IGFueTtcbiAgcHJpdmF0ZSBldmVudExpc3RlbmVyczogQXJyYXk8eyBldmVudDogc3RyaW5nOyBoYW5kbGVyOiBFdmVudExpc3RlbmVyIH0+ID0gW107XG4gIHByaXZhdGUgb3B0aW9uc1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjdXJyZW50T3B0aW9uczogKFNlbGVjdE9wdGlvbiB8IHN0cmluZylbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogTmlsZVNlbGVjdEVkaXRvck9wdGlvbnMpIHtcbiAgICAvLyBIYW5kbGUgT2JzZXJ2YWJsZSBvcHRpb25zXG4gICAgaWYgKGlzT2JzZXJ2YWJsZShvcHRpb25zLm9wdGlvbnMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnNTdWJzY3JpcHRpb24gPSBvcHRpb25zLm9wdGlvbnMuc3Vic2NyaWJlKG9wdHMgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gb3B0cztcbiAgICAgICAgLy8gSWYgZWRpdG9yIGlzIGFscmVhZHkgYWN0aXZlLCB1cGRhdGUgdGhlIERPTVxuICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0YXRpYyBvcHRpb25zXG4gICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gb3B0aW9ucy5vcHRpb25zIHx8IFtdO1xuICAgICAgaWYgKHRoaXMuY3VycmVudE9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTmlsZVNlbGVjdEVkaXRvcjogb3B0aW9ucyBhcnJheSBpcyBlbXB0eScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRleHQuY29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05pbGVTZWxlY3RFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBOaWxlU2VsZWN0IGN1c3RvbSBlbGVtZW50IHVzaW5nIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICB0aGlzLnNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtc2VsZWN0Jyk7XG4gICAgdGhpcy5zZWxlY3QuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yJztcbiAgICBcbiAgICAvLyBBcHBseSBpbmxpbmUgc3R5bGVzIGZvciBwcm9wZXIgY2VsbCBmaXR0aW5nXG4gICAgdGhpcy5zZWxlY3Quc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy5zZWxlY3Quc3R5bGUuaGVpZ2h0ID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICBcbiAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZVxuICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlKGNvbnRleHQudmFsdWUpO1xuXG4gICAgLy8gQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XG5cbiAgICAvLyBDcmVhdGUgYW5kIGFwcGVuZCBvcHRpb25zIHdpdGggY3VycmVudCBvcHRpb25zXG4gICAgdGhpcy5jcmVhdGVBbmRBcHBlbmRPcHRpb25zKHRoaXMuY3VycmVudE9wdGlvbnMpO1xuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0KTtcblxuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIHNlbGVjdFxuICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRleHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0KTtcblxuICAgIC8vIEZvY3VzIGFmdGVyIHJlbmRlclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3Q/LmZvY3VzKCk7XG4gICAgICB0aGlzLnNlbGVjdD8uY2xpY2soKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBzZWxlY3RcbiAgICovXG4gIHByaXZhdGUgc2V0SW5pdGlhbFZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgLy8gSGFuZGxlIG11bHRpcGxlIHNlbGVjdGlvbiAtIHZhbHVlIHNob3VsZCBiZSBhcnJheVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LnZhbHVlID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LnZhbHVlID0gW1N0cmluZyh2YWx1ZSldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3QudmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBzZWxlY3Rpb25cbiAgICAgIHRoaXMuc2VsZWN0LnZhbHVlID0gdmFsdWUgPyBTdHJpbmcodmFsdWUpIDogJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIE5pbGVTZWxlY3QgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkgcmV0dXJuO1xuXG4gICAgLy8gQmFzaWMgb3B0aW9uc1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2l6ZSkge1xuICAgICAgdGhpcy5zZWxlY3Quc2l6ZSA9IHRoaXMub3B0aW9ucy5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdC5zaXplID0gJ3NtYWxsJzsgLy8gRGVmYXVsdCBmb3IgdGFibGUgY2VsbHNcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnNlbGVjdC5tdWx0aXBsZSA9IHRoaXMub3B0aW9ucy5tdWx0aXBsZTtcbiAgICB9XG5cbiAgICAvLyBCZWhhdmlvciBvcHRpb25zXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jbGVhcmFibGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmNsZWFyYWJsZSA9IHRoaXMub3B0aW9ucy5jbGVhcmFibGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5zZWxlY3QuZGlzYWJsZWQgPSB0aGlzLm9wdGlvbnMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXF1aXJlZCkge1xuICAgICAgdGhpcy5zZWxlY3QucmVxdWlyZWQgPSB0aGlzLm9wdGlvbnMucmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZWFyY2hFbmFibGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5zZWFyY2hFbmFibGVkID0gdGhpcy5vcHRpb25zLnNlYXJjaEVuYWJsZWQ7XG4gICAgfVxuXG4gICAgLy8gVmlzdWFsIHN0YXRlc1xuICAgIGlmICh0aGlzLm9wdGlvbnMud2FybmluZykge1xuICAgICAgdGhpcy5zZWxlY3Qud2FybmluZyA9IHRoaXMub3B0aW9ucy53YXJuaW5nO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmVycm9yID0gdGhpcy5vcHRpb25zLmVycm9yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2Vzcykge1xuICAgICAgdGhpcy5zZWxlY3Quc3VjY2VzcyA9IHRoaXMub3B0aW9ucy5zdWNjZXNzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3JNZXNzYWdlKSB7XG4gICAgICB0aGlzLnNlbGVjdC5lcnJvck1lc3NhZ2UgPSB0aGlzLm9wdGlvbnMuZXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaGVscFRleHQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmhlbHBUZXh0ID0gdGhpcy5vcHRpb25zLmhlbHBUZXh0O1xuICAgIH1cblxuICAgIC8vIEFkdmFuY2VkIGZlYXR1cmVzXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tYXhPcHRpb25zVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5tYXhPcHRpb25zVmlzaWJsZSA9IHRoaXMub3B0aW9ucy5tYXhPcHRpb25zVmlzaWJsZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmZpbGxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5maWxsZWQgPSB0aGlzLm9wdGlvbnMuZmlsbGVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGlsbCkge1xuICAgICAgdGhpcy5zZWxlY3QucGlsbCA9IHRoaXMub3B0aW9ucy5waWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaG9pc3QpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmhvaXN0ID0gdGhpcy5vcHRpb25zLmhvaXN0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGxhY2VtZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdC5wbGFjZW1lbnQgPSB0aGlzLm9wdGlvbnMucGxhY2VtZW50O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlVmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5zZWxlY3QuZW5hYmxlVmlydHVhbFNjcm9sbCA9IHRoaXMub3B0aW9ucy5lbmFibGVWaXJ0dWFsU2Nyb2xsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsU2VhcmNoKSB7XG4gICAgICB0aGlzLnNlbGVjdC5kaXNhYmxlTG9jYWxTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsU2VhcmNoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucG9ydGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnBvcnRhbCA9IHRoaXMub3B0aW9ucy5wb3J0YWw7XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCB3aWR0aCBzeW5jaW5nIGlzc3VlcyBpbiB0YWJsZSBjZWxsc1xuICAgIHRoaXMuc2VsZWN0Lm5vV2lkdGhTeW5jID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgb3B0aW9ucyBkeW5hbWljYWxseSB3aGlsZSBlZGl0b3IgaXMgYWN0aXZlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZU9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2xlYXIgZXhpc3Rpbmcgb3B0aW9uc1xuICAgIHdoaWxlICh0aGlzLnNlbGVjdC5maXJzdENoaWxkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5yZW1vdmVDaGlsZCh0aGlzLnNlbGVjdC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBSZS1hcHBlbmQgd2l0aCBuZXcgb3B0aW9uc1xuICAgIHRoaXMuY3JlYXRlQW5kQXBwZW5kT3B0aW9ucyh0aGlzLmN1cnJlbnRPcHRpb25zKTtcbiAgICBcbiAgICAvLyBUcmlnZ2VyIHVwZGF0ZSBvbiB0aGUgd2ViIGNvbXBvbmVudFxuICAgIGlmICh0aGlzLnNlbGVjdC5yZXF1ZXN0VXBkYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdC5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBOaWxlT3B0aW9uIGVsZW1lbnRzIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgc2VsZWN0XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgdG8gcmVuZGVyXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFuZEFwcGVuZE9wdGlvbnMob3B0aW9uczogKFNlbGVjdE9wdGlvbiB8IHN0cmluZylbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3QpIHJldHVybjtcblxuICAgIG9wdGlvbnMuZm9yRWFjaChvcHQgPT4ge1xuICAgICAgY29uc3QgbmlsZU9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtb3B0aW9uJykgYXMgYW55O1xuXG4gICAgICAvLyBBdXRvLWRldGVjdCBmb3JtYXQ6IHN0cmluZyBvciBTZWxlY3RPcHRpb24gb2JqZWN0XG4gICAgICBpZiAodHlwZW9mIG9wdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmlsZU9wdGlvbi52YWx1ZSA9IG9wdDtcbiAgICAgICAgbmlsZU9wdGlvbi5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgb3B0KTtcbiAgICAgICAgbmlsZU9wdGlvbi50ZXh0Q29udGVudCA9IG9wdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5pbGVPcHRpb24udmFsdWUgPSBvcHQudmFsdWU7XG4gICAgICAgIG5pbGVPcHRpb24uc2V0QXR0cmlidXRlKCd2YWx1ZScsIG9wdC52YWx1ZSk7XG4gICAgICAgIG5pbGVPcHRpb24udGV4dENvbnRlbnQgPSBvcHQubGFiZWw7XG4gICAgICAgIFxuICAgICAgICBpZiAob3B0LmRpc2FibGVkKSB7XG4gICAgICAgICAgbmlsZU9wdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgbmlsZU9wdGlvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBwcmVmaXggaWYgcHJvdmlkZWQgKGNvdWxkIGJlIGljb24gbmFtZSBvciBjb250ZW50KVxuICAgICAgICBpZiAob3B0LnByZWZpeCkge1xuICAgICAgICAgIC8vIG5pbGVPcHRpb24uc2V0QXR0cmlidXRlKCdzbG90JywgJ3ByZWZpeCcpO1xuICAgICAgICAgIC8vIG5pbGVPcHRpb24uaW5uZXJIVE1MID0gYDxuaWxlLWljb24gbmFtZT1cIiR7b3B0LnByZWZpeH1cIj48L25pbGUtaWNvbj5gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0IS5hcHBlbmRDaGlsZChuaWxlT3B0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXAgYWxsIGV2ZW50IGxpc3RlbmVycyB3aXRoIHByb3BlciBjbGVhbnVwIHRyYWNraW5nXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0KSByZXR1cm47XG5cbiAgICBjb25zdCB2YWxpZGF0ZU9uU2F2ZSA9IHRoaXMub3B0aW9ucy52YWxpZGF0ZU9uU2F2ZSAhPT0gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgZXZlbnRzIChrZXlkb3duIGlzIG5vdCByZXBsYWNlZCBieSBjdXN0b20gZXZlbnRzKVxuICAgIGNvbnN0IGtleWRvd25IYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBrZXlFdmVudCA9IGUgYXMgS2V5Ym9hcmRFdmVudDtcbiAgICAgIGlmIChrZXlFdmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAna2V5ZG93bicsIGhhbmRsZXI6IGtleWRvd25IYW5kbGVyIH0pO1xuXG4gICAgLy8gVXNlIG5pbGUtY2hhbmdlIGN1c3RvbSBldmVudCBhcyBwcmltYXJ5IHNhdmUgdHJpZ2dlclxuICAgIGNvbnN0IGNoYW5nZUhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgIGlmICh2YWxpZGF0ZU9uU2F2ZSAmJiAhdGhpcy5zZWxlY3Q/LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICB0aGlzLnNlbGVjdD8ucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29udGV4dC5vblNhdmUodGhpcy5wYXJzZVZhbHVlKGN1c3RvbUV2ZW50LmRldGFpbC52YWx1ZSkpO1xuICAgIH07XG4gICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1jaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtY2hhbmdlJywgaGFuZGxlcjogY2hhbmdlSGFuZGxlciB9KTtcblxuICAgIC8vIEhhbmRsZSBibHVyIGFzIHNlY29uZGFyeSBzYXZlIHRyaWdnZXJcbiAgICBjb25zdCBibHVySGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgaWYgKHZhbGlkYXRlT25TYXZlICYmICF0aGlzLnNlbGVjdD8uY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Py5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBjb250ZXh0Lm9uU2F2ZSh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTtcbiAgICB9O1xuICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtYmx1cicsIGJsdXJIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtYmx1cicsIGhhbmRsZXI6IGJsdXJIYW5kbGVyIH0pO1xuXG4gICAgLy8gSGFuZGxlIGNsZWFyIGJ1dHRvbiBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jbGVhcmFibGUpIHtcbiAgICAgIGNvbnN0IGNsZWFySGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLnBhcnNlVmFsdWUodGhpcy5vcHRpb25zLm11bHRpcGxlID8gW10gOiAnJykpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2xlYXInLCBjbGVhckhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWNsZWFyJywgaGFuZGxlcjogY2xlYXJIYW5kbGVyIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWFyY2ggZm9yIHNlcnZlci1zaWRlIHNlYXJjaCBzY2VuYXJpb3NcbiAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVMb2NhbFNlYXJjaCkge1xuICAgICAgY29uc3Qgc2VhcmNoSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGUgYXMgQ3VzdG9tRXZlbnQ7XG4gICAgICAgIC8vIEVtaXQgc2VhcmNoIHF1ZXJ5IHRocm91Z2ggb25DaGFuZ2UgZm9yIGV4dGVybmFsIGhhbmRsaW5nXG4gICAgICAgIGNvbnRleHQub25DaGFuZ2UoY3VzdG9tRXZlbnQuZGV0YWlsIGFzIFQpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtc2VhcmNoJywgc2VhcmNoSGFuZGxlcik7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtc2VhcmNoJywgaGFuZGxlcjogc2VhcmNoSGFuZGxlciB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdmFsdWUgYmFzZWQgb24gc2VsZWN0aW9uIG1vZGVcbiAgICovXG4gIHByaXZhdGUgcGFyc2VWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pOiBUIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKSB7XG4gICAgICAvLyBFbnN1cmUgYXJyYXkgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHZhbHVlID8gW3ZhbHVlXSA6IFtdKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFNpbmdsZSBzZWxlY3Rpb24gLSByZXR1cm4gc3RyaW5nXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZVswXSA6ICcnKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gb3B0aW9ucyBPYnNlcnZhYmxlXG4gICAgaWYgKHRoaXMub3B0aW9uc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5vcHRpb25zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLm9wdGlvbnNTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuc2VsZWN0KSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgICAgIFxuICAgICAgdGhpcy5zZWxlY3QucmVtb3ZlKCk7XG4gICAgICB0aGlzLnNlbGVjdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdD8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0KSB7XG4gICAgICByZXR1cm4gKHRoaXMub3B0aW9ucy5tdWx0aXBsZSA/IFtdIDogJycpIGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdC52YWx1ZTtcbiAgICBcbiAgICAvLyBIYW5kbGUgbXVsdGlwbGUgc2VsZWN0aW9uXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSkgYXMgdW5rbm93biBhcyBUO1xuICAgIH1cbiAgICBcbiAgICAvLyBIYW5kbGUgc2luZ2xlIHNlbGVjdGlvblxuICAgIHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAodmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlWzBdIDogJycpIDogdmFsdWUpIGFzIHVua25vd24gYXMgVDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column configuration factory
|
|
3
|
+
* Simplifies creation of common column types with sensible defaults
|
|
4
|
+
*/
|
|
5
|
+
import { DEFAULT_COLUMN_CONFIG } from '../models/column-config.interface';
|
|
6
|
+
import { CellDataType } from '../models/cell-types';
|
|
7
|
+
import { Cell } from '../renderer/models/cell.class';
|
|
8
|
+
import { StringFormatter, NumberFormatter, CurrencyFormatter, DateFormatter, BooleanFormatter } from '../strategies/default-formatters';
|
|
9
|
+
import { PatternValidators } from '../strategies/default-validators';
|
|
10
|
+
import { TextEditor, NumberEditor, DateEditor, SelectEditor, BooleanEditor } from '../strategies/default-editors';
|
|
11
|
+
import { deepMergeColumnConfig } from '../models/column-config.utils';
|
|
12
|
+
/**
|
|
13
|
+
* Column configuration factory - Factory Pattern
|
|
14
|
+
* Provides convenient methods to create pre-configured column types
|
|
15
|
+
*/
|
|
16
|
+
export class ColumnConfigFactory {
|
|
17
|
+
/**
|
|
18
|
+
* Create a text column
|
|
19
|
+
*/
|
|
20
|
+
static text(key, options) {
|
|
21
|
+
const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
|
|
22
|
+
key,
|
|
23
|
+
header: key.charAt(0).toUpperCase() + key.slice(1),
|
|
24
|
+
dataType: CellDataType.STRING,
|
|
25
|
+
formatter: new StringFormatter(),
|
|
26
|
+
editor: new TextEditor(),
|
|
27
|
+
}, options || {});
|
|
28
|
+
return {
|
|
29
|
+
...config,
|
|
30
|
+
createCell(rowData, rowIndex) {
|
|
31
|
+
const valueGetter = options?.valueGetter || ((data) => data[key]);
|
|
32
|
+
const value = valueGetter(rowData);
|
|
33
|
+
return new Cell(this, value, rowData, rowIndex);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a number column
|
|
39
|
+
*/
|
|
40
|
+
static number(key, options) {
|
|
41
|
+
const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
|
|
42
|
+
key,
|
|
43
|
+
header: key.charAt(0).toUpperCase() + key.slice(1),
|
|
44
|
+
dataType: CellDataType.NUMBER,
|
|
45
|
+
formatter: new NumberFormatter({ decimals: 2 }),
|
|
46
|
+
validator: PatternValidators.custom((val) => typeof val === 'number' && !isNaN(val), 'Must be a valid number'),
|
|
47
|
+
editor: new NumberEditor(),
|
|
48
|
+
}, options || {});
|
|
49
|
+
return {
|
|
50
|
+
...config,
|
|
51
|
+
createCell(rowData, rowIndex) {
|
|
52
|
+
const valueGetter = options?.valueGetter || ((data) => data[key]);
|
|
53
|
+
const value = valueGetter(rowData);
|
|
54
|
+
return new Cell(this, value, rowData, rowIndex);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a currency column
|
|
60
|
+
*/
|
|
61
|
+
static currency(key, options) {
|
|
62
|
+
const currency = options?.currency || 'USD';
|
|
63
|
+
const locale = options?.locale || 'en-US';
|
|
64
|
+
const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
|
|
65
|
+
key,
|
|
66
|
+
header: key.charAt(0).toUpperCase() + key.slice(1),
|
|
67
|
+
dataType: CellDataType.NUMBER,
|
|
68
|
+
formatter: new CurrencyFormatter({ currency, locale }),
|
|
69
|
+
validator: PatternValidators.chain(PatternValidators.custom((val) => typeof val === 'number' && !isNaN(val), 'Must be a valid number'), PatternValidators.range(0, undefined, 'Amount must be positive')),
|
|
70
|
+
editor: new NumberEditor({ min: 0, step: 0.01 }),
|
|
71
|
+
}, options || {});
|
|
72
|
+
return {
|
|
73
|
+
...config,
|
|
74
|
+
createCell(rowData, rowIndex) {
|
|
75
|
+
const valueGetter = options?.valueGetter || ((data) => data[key]);
|
|
76
|
+
const value = valueGetter(rowData);
|
|
77
|
+
return new Cell(this, value, rowData, rowIndex);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create a date column
|
|
83
|
+
*/
|
|
84
|
+
static date(key, options) {
|
|
85
|
+
const dateStyle = options?.dateStyle || 'medium';
|
|
86
|
+
const locale = options?.locale || 'en-US';
|
|
87
|
+
const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
|
|
88
|
+
key,
|
|
89
|
+
header: key.charAt(0).toUpperCase() + key.slice(1),
|
|
90
|
+
dataType: CellDataType.DATE,
|
|
91
|
+
formatter: new DateFormatter({ dateStyle, locale }),
|
|
92
|
+
editor: new DateEditor(),
|
|
93
|
+
}, options || {});
|
|
94
|
+
return {
|
|
95
|
+
...config,
|
|
96
|
+
createCell(rowData, rowIndex) {
|
|
97
|
+
const valueGetter = options?.valueGetter || ((data) => data[key]);
|
|
98
|
+
const value = valueGetter(rowData);
|
|
99
|
+
return new Cell(this, value, rowData, rowIndex);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Create a boolean column
|
|
105
|
+
*/
|
|
106
|
+
static boolean(key, options) {
|
|
107
|
+
const trueValue = options?.trueValue || 'Yes';
|
|
108
|
+
const falseValue = options?.falseValue || 'No';
|
|
109
|
+
const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
|
|
110
|
+
key,
|
|
111
|
+
header: key.charAt(0).toUpperCase() + key.slice(1),
|
|
112
|
+
dataType: CellDataType.BOOLEAN,
|
|
113
|
+
formatter: new BooleanFormatter({ trueValue, falseValue }),
|
|
114
|
+
editor: new BooleanEditor(),
|
|
115
|
+
}, options || {});
|
|
116
|
+
return {
|
|
117
|
+
...config,
|
|
118
|
+
createCell(rowData, rowIndex) {
|
|
119
|
+
const valueGetter = options?.valueGetter || ((data) => data[key]);
|
|
120
|
+
const value = valueGetter(rowData);
|
|
121
|
+
return new Cell(this, value, rowData, rowIndex);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Create a select/dropdown column
|
|
127
|
+
*/
|
|
128
|
+
static select(key, selectOptions, options) {
|
|
129
|
+
const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
|
|
130
|
+
key,
|
|
131
|
+
header: key.charAt(0).toUpperCase() + key.slice(1),
|
|
132
|
+
editor: new SelectEditor({ options: selectOptions }),
|
|
133
|
+
}, options || {});
|
|
134
|
+
return {
|
|
135
|
+
...config,
|
|
136
|
+
createCell(rowData, rowIndex) {
|
|
137
|
+
const valueGetter = options?.valueGetter || ((data) => data[key]);
|
|
138
|
+
const value = valueGetter(rowData);
|
|
139
|
+
return new Cell(this, value, rowData, rowIndex);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Create an email column
|
|
145
|
+
*/
|
|
146
|
+
static email(key, options) {
|
|
147
|
+
const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
|
|
148
|
+
key,
|
|
149
|
+
header: key.charAt(0).toUpperCase() + key.slice(1),
|
|
150
|
+
dataType: CellDataType.STRING,
|
|
151
|
+
formatter: new StringFormatter(),
|
|
152
|
+
validator: PatternValidators.email(),
|
|
153
|
+
editor: new TextEditor({ placeholder: 'email@example.com' }),
|
|
154
|
+
}, options || {});
|
|
155
|
+
return {
|
|
156
|
+
...config,
|
|
157
|
+
createCell(rowData, rowIndex) {
|
|
158
|
+
const valueGetter = options?.valueGetter || ((data) => data[key]);
|
|
159
|
+
const value = valueGetter(rowData);
|
|
160
|
+
return new Cell(this, value, rowData, rowIndex);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Create a readonly column
|
|
166
|
+
*/
|
|
167
|
+
static readonly(key, options) {
|
|
168
|
+
const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
|
|
169
|
+
key,
|
|
170
|
+
header: key.charAt(0).toUpperCase() + key.slice(1),
|
|
171
|
+
editable: false,
|
|
172
|
+
}, options || {});
|
|
173
|
+
return {
|
|
174
|
+
...config,
|
|
175
|
+
createCell(rowData, rowIndex) {
|
|
176
|
+
const valueGetter = options?.valueGetter || ((data) => data[key]);
|
|
177
|
+
const value = valueGetter(rowData);
|
|
178
|
+
return new Cell(this, value, rowData, rowIndex);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Create a custom column with full control
|
|
184
|
+
*/
|
|
185
|
+
static custom(config) {
|
|
186
|
+
if (!config.key) {
|
|
187
|
+
throw new Error('Column key is required');
|
|
188
|
+
}
|
|
189
|
+
const mergedConfig = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
|
|
190
|
+
header: config.key.charAt(0).toUpperCase() + config.key.slice(1),
|
|
191
|
+
}, config);
|
|
192
|
+
return {
|
|
193
|
+
...mergedConfig,
|
|
194
|
+
createCell(rowData, rowIndex) {
|
|
195
|
+
const valueGetter = config.valueGetter || ((data) => data[config.key]);
|
|
196
|
+
const value = valueGetter(rowData);
|
|
197
|
+
return new Cell(this, value, rowData, rowIndex);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Create multiple columns at once from a simple configuration
|
|
203
|
+
*/
|
|
204
|
+
static fromKeys(keys) {
|
|
205
|
+
return keys.map(keyConfig => {
|
|
206
|
+
if (typeof keyConfig === 'string' || typeof keyConfig === 'number' || typeof keyConfig === 'symbol') {
|
|
207
|
+
return ColumnConfigFactory.text(String(keyConfig));
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
const { key, type = 'text', options = {} } = keyConfig;
|
|
211
|
+
const keyStr = String(key);
|
|
212
|
+
switch (type) {
|
|
213
|
+
case 'number':
|
|
214
|
+
return ColumnConfigFactory.number(keyStr, options);
|
|
215
|
+
case 'date':
|
|
216
|
+
return ColumnConfigFactory.date(keyStr, options);
|
|
217
|
+
case 'boolean':
|
|
218
|
+
return ColumnConfigFactory.boolean(keyStr, options);
|
|
219
|
+
case 'text':
|
|
220
|
+
default:
|
|
221
|
+
return ColumnConfigFactory.text(keyStr, options);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Convenience exports for common column types
|
|
229
|
+
*/
|
|
230
|
+
export const Columns = ColumnConfigFactory;
|
|
231
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWNvbmZpZy5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9mYWN0b3JpZXMvY29sdW1uLWNvbmZpZy5mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxlQUFlLEVBQ2YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUNMLGlCQUFpQixFQUNsQixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNkLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFdEU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQUM5Qjs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBVyxFQUFFLE9BQXVDO1FBQzlELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUNsQyxxQkFBcUIsRUFDckI7WUFDRSxHQUFHO1lBQ0gsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbEQsUUFBUSxFQUFFLFlBQVksQ0FBQyxNQUFNO1lBQzdCLFNBQVMsRUFBRSxJQUFJLGVBQWUsRUFBRTtZQUNoQyxNQUFNLEVB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O0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUNiLElBQXFHO1FBRXJHLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUMxQixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFO2dCQUNuRyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUNwRDtpQkFBTTtnQkFDTCxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxNQUFNLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQztnQkFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUUzQixRQUFRLElBQUksRUFBRTtvQkFDWixLQUFLLFFBQVE7d0JBQ1gsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNyRCxLQUFLLE1BQU07d0JBQ1QsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNuRCxLQUFLLFNBQVM7d0JBQ1osT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUN0RCxLQUFLLE1BQU0sQ0FBQztvQkFDWjt3QkFDRSxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb2x1bW4gY29uZmlndXJhdGlvbiBmYWN0b3J5XG4gKiBTaW1wbGlmaWVzIGNyZWF0aW9uIG9mIGNvbW1vbiBjb2x1bW4gdHlwZXMgd2l0aCBzZW5zaWJsZSBkZWZhdWx0c1xuICovXG5cbmltcG9ydCB7IENvbHVtbkNvbmZpZywgREVGQVVMVF9DT0xVTU5fQ09ORklHIH0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGxEYXRhVHlwZSB9IGZyb20gJy4uL21vZGVscy9jZWxsLXR5cGVzJztcbmltcG9ydCB7IENlbGwgfSBmcm9tICcuLi9yZW5kZXJlci9tb2RlbHMvY2VsbC5jbGFzcyc7XG5pbXBvcnQge1xuICBTdHJpbmdGb3JtYXR0ZXIsXG4gIE51bWJlckZvcm1hdHRlcixcbiAgQ3VycmVuY3lGb3JtYXR0ZXIsXG4gIERhdGVGb3JtYXR0ZXIsXG4gIEJvb2xlYW5Gb3JtYXR0ZXJcbn0gZnJvbSAnLi4vc3RyYXRlZ2llcy9kZWZhdWx0LWZvcm1hdHRlcnMnO1xuaW1wb3J0IHtcbiAgUGF0dGVyblZhbGlkYXRvcnNcbn0gZnJvbSAnLi4vc3RyYXRlZ2llcy9kZWZhdWx0LXZhbGlkYXRvcnMnO1xuaW1wb3J0IHtcbiAgVGV4dEVkaXRvcixcbiAgTnVtYmVyRWRpdG9yLFxuICBEYXRlRWRpdG9yLFxuICBTZWxlY3RFZGl0b3IsXG4gIEJvb2xlYW5FZGl0b3Jcbn0gZnJvbSAnLi4vc3RyYXRlZ2llcy9kZWZhdWx0LWVkaXRvcnMnO1xuaW1wb3J0IHsgZGVlcE1lcmdlQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi1jb25maWcudXRpbHMnO1xuXG4vKipcbiAqIENvbHVtbiBjb25maWd1cmF0aW9uIGZhY3RvcnkgLSBGYWN0b3J5IFBhdHRlcm5cbiAqIFByb3ZpZGVzIGNvbnZlbmllbnQgbWV0aG9kcyB0byBjcmVhdGUgcHJlLWNvbmZpZ3VyZWQgY29sdW1uIHR5cGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2x1bW5Db25maWdGYWN0b3J5IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRleHQgY29sdW1uXG4gICAqL1xuICBzdGF0aWMgdGV4dChrZXk6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8Q29sdW1uQ29uZmlnPHN0cmluZz4+KTogQ29sdW1uQ29uZmlnPHN0cmluZz4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGRlZXBNZXJnZUNvbHVtbkNvbmZpZyhcbiAgICAgIERFRkFVTFRfQ09MVU1OX0NPTkZJRyxcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICBoZWFkZXI6IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKSxcbiAgICAgICAgZGF0YVR5cGU6IENlbGxEYXRhVHlwZS5TVFJJTkcsXG4gICAgICAgIGZvcm1hdHRlcjogbmV3IFN0cmluZ0Zvcm1hdHRlcigpLFxuICAgICAgICBlZGl0b3I6IG5ldyBUZXh0RWRpdG9yKCksXG4gICAgICB9LFxuICAgICAgb3B0aW9ucyB8fCB7fVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgdmFsdWVHZXR0ZXIgPSBvcHRpb25zPy52YWx1ZUdldHRlciB8fCAoKGRhdGE6IGFueSkgPT4gZGF0YVtrZXldKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUdldHRlcihyb3dEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDZWxsKHRoaXMsIHZhbHVlLCByb3dEYXRhLCByb3dJbmRleCk7XG4gICAgICB9XG4gICAgfSBhcyBDb2x1bW5Db25maWc8c3RyaW5nPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBudW1iZXIgY29sdW1uXG4gICAqL1xuICBzdGF0aWMgbnVtYmVyKGtleTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8bnVtYmVyPj4pOiBDb2x1bW5Db25maWc8bnVtYmVyPiB7XG4gICAgY29uc3QgY29uZmlnID0gZGVlcE1lcmdlQ29sdW1uQ29uZmlnKFxuICAgICAgREVGQVVMVF9DT0xVTU5fQ09ORklHLFxuICAgICAge1xuICAgICAgICBrZXksXG4gICAgICAgIGhlYWRlcjoga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpLFxuICAgICAgICBkYXRhVHlwZTogQ2VsbERhdGFUeXBlLk5VTUJFUixcbiAgICAgICAgZm9ybWF0dGVyOiBuZXcgTnVtYmVyRm9ybWF0dGVyKHsgZGVjaW1hbHM6IDIgfSksXG4gICAgICAgIHZhbGlkYXRvcjogUGF0dGVyblZhbGlkYXRvcnMuY3VzdG9tKCh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFpc05hTih2YWwpLCAnTXVzdCBiZSBhIHZhbGlkIG51bWJlcicpLFxuICAgICAgICBlZGl0b3I6IG5ldyBOdW1iZXJFZGl0b3IoKSxcbiAgICAgIH0sXG4gICAgICBvcHRpb25zIHx8IHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjcmVhdGVDZWxsKHJvd0RhdGE6IGFueSwgcm93SW5kZXg/OiBudW1iZXIpOiBDZWxsPG51bWJlcj4ge1xuICAgICAgICBjb25zdCB2YWx1ZUdldHRlciA9IG9wdGlvbnM/LnZhbHVlR2V0dGVyIHx8ICgoZGF0YTogYW55KSA9PiBkYXRhW2tleV0pO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlR2V0dGVyKHJvd0RhdGEpO1xuICAgICAgICByZXR1cm4gbmV3IENlbGwodGhpcywgdmFsdWUsIHJvd0RhdGEsIHJvd0luZGV4KTtcbiAgICAgIH1cbiAgICB9IGFzIENvbHVtbkNvbmZpZzxudW1iZXI+O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGN1cnJlbmN5IGNvbHVtblxuICAgKi9cbiAgc3RhdGljIGN1cnJlbmN5KGtleTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8bnVtYmVyPj4gJiB7XG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG4gICAgbG9jYWxlPzogc3RyaW5nO1xuICB9KTogQ29sdW1uQ29uZmlnPG51bWJlcj4ge1xuICAgIGNvbnN0IGN1cnJlbmN5ID0gKG9wdGlvbnMgYXMgYW55KT8uY3VycmVuY3kgfHwgJ1VTRCc7XG4gICAgY29uc3QgbG9jYWxlID0gKG9wdGlvbnMgYXMgYW55KT8ubG9jYWxlIHx8ICdlbi1VUyc7XG5cbiAgICBjb25zdCBjb25maWcgPSBkZWVwTWVyZ2VDb2x1bW5Db25maWcoXG4gICAgICBERUZBVUxUX0NPTFVNTl9DT05GSUcsXG4gICAgICB7XG4gICAgICAgIGtleSxcbiAgICAgICAgaGVhZGVyOiBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSksXG4gICAgICAgIGRhdGFUeXBlOiBDZWxsRGF0YVR5cGUuTlVNQkVSLFxuICAgICAgICBmb3JtYXR0ZXI6IG5ldyBDdXJyZW5jeUZvcm1hdHRlcih7IGN1cnJlbmN5LCBsb2NhbGUgfSksXG4gICAgICAgIHZhbGlkYXRvcjogUGF0dGVyblZhbGlkYXRvcnMuY2hhaW4oXG4gICAgICAgICAgUGF0dGVyblZhbGlkYXRvcnMuY3VzdG9tKCh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFpc05hTih2YWwpLCAnTXVzdCBiZSBhIHZhbGlkIG51bWJlcicpLFxuICAgICAgICAgIFBhdHRlcm5WYWxpZGF0b3JzLnJhbmdlKDAsIHVuZGVmaW5lZCwgJ0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlJylcbiAgICAgICAgKSxcbiAgICAgICAgZWRpdG9yOiBuZXcgTnVtYmVyRWRpdG9yKHsgbWluOiAwLCBzdGVwOiAwLjAxIH0pLFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnMgfHwge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNyZWF0ZUNlbGwocm93RGF0YTogYW55LCByb3dJbmRleD86IG51bWJlcik6IENlbGw8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gb3B0aW9ucz8udmFsdWVHZXR0ZXIgfHwgKChkYXRhOiBhbnkpID0+IGRhdGFba2V5XSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVHZXR0ZXIocm93RGF0YSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2VsbCh0aGlzLCB2YWx1ZSwgcm93RGF0YSwgcm93SW5kZXgpO1xuICAgICAgfVxuICAgIH0gYXMgQ29sdW1uQ29uZmlnPG51bWJlcj47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGF0ZSBjb2x1bW5cbiAgICovXG4gIHN0YXRpYyBkYXRlKGtleTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8RGF0ZT4+ICYge1xuICAgIGRhdGVTdHlsZT86ICdmdWxsJyB8ICdsb25nJyB8ICdtZWRpdW0nIHwgJ3Nob3J0JztcbiAgICBsb2NhbGU/OiBzdHJpbmc7XG4gIH0pOiBDb2x1bW5Db25maWc8RGF0ZT4ge1xuICAgIGNvbnN0IGRhdGVTdHlsZSA9IChvcHRpb25zIGFzIGFueSk/LmRhdGVTdHlsZSB8fCAnbWVkaXVtJztcbiAgICBjb25zdCBsb2NhbGUgPSAob3B0aW9ucyBhcyBhbnkpPy5sb2NhbGUgfHwgJ2VuLVVTJztcblxuICAgIGNvbnN0IGNvbmZpZyA9IGRlZXBNZXJnZUNvbHVtbkNvbmZpZyhcbiAgICAgIERFRkFVTFRfQ09MVU1OX0NPTkZJRyxcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICBoZWFkZXI6IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKSxcbiAgICAgICAgZGF0YVR5cGU6IENlbGxEYXRhVHlwZS5EQVRFLFxuICAgICAgICBmb3JtYXR0ZXI6IG5ldyBEYXRlRm9ybWF0dGVyKHsgZGF0ZVN0eWxlLCBsb2NhbGUgfSksXG4gICAgICAgIGVkaXRvcjogbmV3IERhdGVFZGl0b3IoKSxcbiAgICAgIH0sXG4gICAgICBvcHRpb25zIHx8IHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjcmVhdGVDZWxsKHJvd0RhdGE6IGFueSwgcm93SW5kZXg/OiBudW1iZXIpOiBDZWxsPERhdGU+IHtcbiAgICAgICAgY29uc3QgdmFsdWVHZXR0ZXIgPSBvcHRpb25zPy52YWx1ZUdldHRlciB8fCAoKGRhdGE6IGFueSkgPT4gZGF0YVtrZXldKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUdldHRlcihyb3dEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDZWxsKHRoaXMsIHZhbHVlLCByb3dEYXRhLCByb3dJbmRleCk7XG4gICAgICB9XG4gICAgfSBhcyBDb2x1bW5Db25maWc8RGF0ZT47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYm9vbGVhbiBjb2x1bW5cbiAgICovXG4gIHN0YXRpYyBib29sZWFuKGtleTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8Ym9vbGVhbj4+ICYge1xuICAgIHRydWVWYWx1ZT86IHN0cmluZztcbiAgICBmYWxzZVZhbHVlPzogc3RyaW5nO1xuICB9KTogQ29sdW1uQ29uZmlnPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0cnVlVmFsdWUgPSAob3B0aW9ucyBhcyBhbnkpPy50cnVlVmFsdWUgfHwgJ1llcyc7XG4gICAgY29uc3QgZmFsc2VWYWx1ZSA9IChvcHRpb25zIGFzIGFueSk/LmZhbHNlVmFsdWUgfHwgJ05vJztcblxuICAgIGNvbnN0IGNvbmZpZyA9IGRlZXBNZXJnZUNvbHVtbkNvbmZpZyhcbiAgICAgIERFRkFVTFRfQ09MVU1OX0NPTkZJRyxcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICBoZWFkZXI6IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKSxcbiAgICAgICAgZGF0YVR5cGU6IENlbGxEYXRhVHlwZS5CT09MRUFOLFxuICAgICAgICBmb3JtYXR0ZXI6IG5ldyBCb29sZWFuRm9ybWF0dGVyKHsgdHJ1ZVZhbHVlLCBmYWxzZVZhbHVlIH0pLFxuICAgICAgICBlZGl0b3I6IG5ldyBCb29sZWFuRWRpdG9yKCksXG4gICAgICB9LFxuICAgICAgb3B0aW9ucyB8fCB7fVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gb3B0aW9ucz8udmFsdWVHZXR0ZXIgfHwgKChkYXRhOiBhbnkpID0+IGRhdGFba2V5XSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVHZXR0ZXIocm93RGF0YSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2VsbCh0aGlzLCB2YWx1ZSwgcm93RGF0YSwgcm93SW5kZXgpO1xuICAgICAgfVxuICAgIH0gYXMgQ29sdW1uQ29uZmlnPGJvb2xlYW4+O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNlbGVjdC9kcm9wZG93biBjb2x1bW5cbiAgICovXG4gIHN0YXRpYyBzZWxlY3Q8VCA9IHN0cmluZz4oXG4gICAga2V5OiBzdHJpbmcsXG4gICAgc2VsZWN0T3B0aW9uczogQXJyYXk8eyB2YWx1ZTogVDsgbGFiZWw6IHN0cmluZyB9PixcbiAgICBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8VD4+XG4gICk6IENvbHVtbkNvbmZpZzxUPiB7XG4gICAgY29uc3QgY29uZmlnID0gZGVlcE1lcmdlQ29sdW1uQ29uZmlnKFxuICAgICAgREVGQVVMVF9DT0xVTU5fQ09ORklHLFxuICAgICAge1xuICAgICAgICBrZXksXG4gICAgICAgIGhlYWRlcjoga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpLFxuICAgICAgICBlZGl0b3I6IG5ldyBTZWxlY3RFZGl0b3IoeyBvcHRpb25zOiBzZWxlY3RPcHRpb25zIH0pLFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnMgfHwge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNyZWF0ZUNlbGwocm93RGF0YTogYW55LCByb3dJbmRleD86IG51bWJlcik6IENlbGw8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZUdldHRlciA9IG9wdGlvbnM/LnZhbHVlR2V0dGVyIHx8ICgoZGF0YTogYW55KSA9PiBkYXRhW2tleV0pO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlR2V0dGVyKHJvd0RhdGEpO1xuICAgICAgICByZXR1cm4gbmV3IENlbGwodGhpcywgdmFsdWUsIHJvd0RhdGEsIHJvd0luZGV4KTtcbiAgICAgIH1cbiAgICB9IGFzIENvbHVtbkNvbmZpZzxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZW1haWwgY29sdW1uXG4gICAqL1xuICBzdGF0aWMgZW1haWwoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPENvbHVtbkNvbmZpZzxzdHJpbmc+Pik6IENvbHVtbkNvbmZpZzxzdHJpbmc+IHtcbiAgICBjb25zdCBjb25maWcgPSBkZWVwTWVyZ2VDb2x1bW5Db25maWcoXG4gICAgICBERUZBVUxUX0NPTFVNTl9DT05GSUcsXG4gICAgICB7XG4gICAgICAgIGtleSxcbiAgICAgICAgaGVhZGVyOiBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSksXG4gICAgICAgIGRhdGFUeXBlOiBDZWxsRGF0YVR5cGUuU1RSSU5HLFxuICAgICAgICBmb3JtYXR0ZXI6IG5ldyBTdHJpbmdGb3JtYXR0ZXIoKSxcbiAgICAgICAgdmFsaWRhdG9yOiBQYXR0ZXJuVmFsaWRhdG9ycy5lbWFpbCgpLFxuICAgICAgICBlZGl0b3I6IG5ldyBUZXh0RWRpdG9yKHsgcGxhY2Vob2xkZXI6ICdlbWFpbEBleGFtcGxlLmNvbScgfSksXG4gICAgICB9LFxuICAgICAgb3B0aW9ucyB8fCB7fVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgdmFsdWVHZXR0ZXIgPSBvcHRpb25zPy52YWx1ZUdldHRlciB8fCAoKGRhdGE6IGFueSkgPT4gZGF0YVtrZXldKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUdldHRlcihyb3dEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDZWxsKHRoaXMsIHZhbHVlLCByb3dEYXRhLCByb3dJbmRleCk7XG4gICAgICB9XG4gICAgfSBhcyBDb2x1bW5Db25maWc8c3RyaW5nPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZWFkb25seSBjb2x1bW5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seTxUID0gYW55PihrZXk6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8Q29sdW1uQ29uZmlnPFQ+Pik6IENvbHVtbkNvbmZpZzxUPiB7XG4gICAgY29uc3QgY29uZmlnID0gZGVlcE1lcmdlQ29sdW1uQ29uZmlnKFxuICAgICAgREVGQVVMVF9DT0xVTU5fQ09ORklHLFxuICAgICAge1xuICAgICAgICBrZXksXG4gICAgICAgIGhlYWRlcjoga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpLFxuICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgb3B0aW9ucyB8fCB7fVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gb3B0aW9ucz8udmFsdWVHZXR0ZXIgfHwgKChkYXRhOiBhbnkpID0+IGRhdGFba2V5XSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVHZXR0ZXIocm93RGF0YSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2VsbCh0aGlzLCB2YWx1ZSwgcm93RGF0YSwgcm93SW5kZXgpO1xuICAgICAgfVxuICAgIH0gYXMgQ29sdW1uQ29uZmlnPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGN1c3RvbSBjb2x1bW4gd2l0aCBmdWxsIGNvbnRyb2xcbiAgICovXG4gIHN0YXRpYyBjdXN0b208VCA9IGFueT4oY29uZmlnOiBQYXJ0aWFsPENvbHVtbkNvbmZpZzxUPj4gJiB7IGtleTogc3RyaW5nIH0pOiBDb2x1bW5Db25maWc8VD4ge1xuICAgIGlmICghY29uZmlnLmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2x1bW4ga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnID0gZGVlcE1lcmdlQ29sdW1uQ29uZmlnKFxuICAgICAgREVGQVVMVF9DT0xVTU5fQ09ORklHLFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IGNvbmZpZy5rZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBjb25maWcua2V5LnNsaWNlKDEpLFxuICAgICAgfSxcbiAgICAgIGNvbmZpZ1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWVyZ2VkQ29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gY29uZmlnLnZhbHVlR2V0dGVyIHx8ICgoZGF0YTogYW55KSA9PiBkYXRhW2NvbmZpZy5rZXldKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUdldHRlcihyb3dEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDZWxsKHRoaXMsIHZhbHVlLCByb3dEYXRhLCByb3dJbmRleCk7XG4gICAgICB9XG4gICAgfSBhcyBDb2x1bW5Db25maWc8VD47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG11bHRpcGxlIGNvbHVtbnMgYXQgb25jZSBmcm9tIGEgc2ltcGxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHN0YXRpYyBmcm9tS2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gICAga2V5czogQXJyYXk8a2V5b2YgVCB8IHsga2V5OiBrZXlvZiBUOyB0eXBlPzogJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAnYm9vbGVhbic7IG9wdGlvbnM/OiBhbnkgfT5cbiAgKTogQ29sdW1uQ29uZmlnPGFueT5bXSB7XG4gICAgcmV0dXJuIGtleXMubWFwKGtleUNvbmZpZyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleUNvbmZpZyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGtleUNvbmZpZyA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGtleUNvbmZpZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIENvbHVtbkNvbmZpZ0ZhY3RvcnkudGV4dChTdHJpbmcoa2V5Q29uZmlnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IGtleSwgdHlwZSA9ICd0ZXh0Jywgb3B0aW9ucyA9IHt9IH0gPSBrZXlDb25maWc7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IFN0cmluZyhrZXkpO1xuICAgICAgICBcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgIHJldHVybiBDb2x1bW5Db25maWdGYWN0b3J5Lm51bWJlcihrZXlTdHIsIG9wdGlvbnMpO1xuICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgcmV0dXJuIENvbHVtbkNvbmZpZ0ZhY3RvcnkuZGF0ZShrZXlTdHIsIG9wdGlvbnMpO1xuICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgcmV0dXJuIENvbHVtbkNvbmZpZ0ZhY3RvcnkuYm9vbGVhbihrZXlTdHIsIG9wdGlvbnMpO1xuICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gQ29sdW1uQ29uZmlnRmFjdG9yeS50ZXh0KGtleVN0ciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIGV4cG9ydHMgZm9yIGNvbW1vbiBjb2x1bW4gdHlwZXNcbiAqL1xuZXhwb3J0IGNvbnN0IENvbHVtbnMgPSBDb2x1bW5Db25maWdGYWN0b3J5O1xuXG4iXX0=
|