@aquera/ngx-smart-table 0.0.17-patch-0.4 → 0.0.17-patch-0.6

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.
@@ -6,5 +6,6 @@ export { NileSelectEditor } from './nile-select-editor';
6
6
  export { NileAutoCompleteEditor } from './nile-autocomplete-editor';
7
7
  export { NileCalendarEditor } from './nile-calendar-editor';
8
8
  export { NileDatePickerEditor } from './nile-date-picker-editor';
9
+ export { NileChipEditor } from './nile-chip-editor';
9
10
  export { NileCodeEditor } from './nile-code-editor';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2VkaXRvcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUEwQixNQUFNLHFCQUFxQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsc0JBQXNCLEVBQXFELE1BQU0sNEJBQTRCLENBQUM7QUFDdkgsT0FBTyxFQUFFLGtCQUFrQixFQUFnRCxNQUFNLHdCQUF3QixDQUFDO0FBQzFHLE9BQU8sRUFBRSxvQkFBb0IsRUFBMEMsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RyxPQUFPLEVBQUUsY0FBYyxFQUFrRSxNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXN0b20gY2VsbCBlZGl0b3JzIGZvciBuZ3gtc21hcnQtdGFibGVcbiAqL1xuXG5leHBvcnQgeyBOaWxlSW5wdXRFZGl0b3IsIE5pbGVJbnB1dEVkaXRvck9wdGlvbnMgfSBmcm9tICcuL25pbGUtaW5wdXQtZWRpdG9yJztcbmV4cG9ydCB7IE5pbGVTZWxlY3RFZGl0b3IsIE5pbGVTZWxlY3RFZGl0b3JPcHRpb25zLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuL25pbGUtc2VsZWN0LWVkaXRvcic7XG5leHBvcnQgeyBOaWxlQXV0b0NvbXBsZXRlRWRpdG9yLCBOaWxlQXV0b0NvbXBsZXRlRWRpdG9yT3B0aW9ucywgQXV0b0NvbXBsZXRlT3B0aW9uIH0gZnJvbSAnLi9uaWxlLWF1dG9jb21wbGV0ZS1lZGl0b3InO1xuZXhwb3J0IHsgTmlsZUNhbGVuZGFyRWRpdG9yLCBOaWxlQ2FsZW5kYXJFZGl0b3JPcHRpb25zLCBBbGxvd2VkRGF0ZXNSYW5nZSB9IGZyb20gJy4vbmlsZS1jYWxlbmRhci1lZGl0b3InO1xuZXhwb3J0IHsgTmlsZURhdGVQaWNrZXJFZGl0b3IsIE5pbGVEYXRlUGlja2VyRWRpdG9yT3B0aW9ucywgRGF0ZVJhbmdlIH0gZnJvbSAnLi9uaWxlLWRhdGUtcGlja2VyLWVkaXRvcic7XG5leHBvcnQgeyBOaWxlQ29kZUVkaXRvciwgTmlsZUNvZGVFZGl0b3JPcHRpb25zLCBDb2RlRWRpdG9yQ29tcGxldGlvbiwgQXV0b0NvbXBsZXRlU3R5bGUgfSBmcm9tICcuL25pbGUtY29kZS1lZGl0b3InO1xuIl19
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2VkaXRvcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUEwQixNQUFNLHFCQUFxQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsc0JBQXNCLEVBQXFELE1BQU0sNEJBQTRCLENBQUM7QUFDdkgsT0FBTyxFQUFFLGtCQUFrQixFQUFnRCxNQUFNLHdCQUF3QixDQUFDO0FBQzFHLE9BQU8sRUFBRSxvQkFBb0IsRUFBMEMsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RyxPQUFPLEVBQUUsY0FBYyxFQUFxQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQWtFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBjZWxsIGVkaXRvcnMgZm9yIG5neC1zbWFydC10YWJsZVxuICovXG5cbmV4cG9ydCB7IE5pbGVJbnB1dEVkaXRvciwgTmlsZUlucHV0RWRpdG9yT3B0aW9ucyB9IGZyb20gJy4vbmlsZS1pbnB1dC1lZGl0b3InO1xuZXhwb3J0IHsgTmlsZVNlbGVjdEVkaXRvciwgTmlsZVNlbGVjdEVkaXRvck9wdGlvbnMsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4vbmlsZS1zZWxlY3QtZWRpdG9yJztcbmV4cG9ydCB7IE5pbGVBdXRvQ29tcGxldGVFZGl0b3IsIE5pbGVBdXRvQ29tcGxldGVFZGl0b3JPcHRpb25zLCBBdXRvQ29tcGxldGVPcHRpb24gfSBmcm9tICcuL25pbGUtYXV0b2NvbXBsZXRlLWVkaXRvcic7XG5leHBvcnQgeyBOaWxlQ2FsZW5kYXJFZGl0b3IsIE5pbGVDYWxlbmRhckVkaXRvck9wdGlvbnMsIEFsbG93ZWREYXRlc1JhbmdlIH0gZnJvbSAnLi9uaWxlLWNhbGVuZGFyLWVkaXRvcic7XG5leHBvcnQgeyBOaWxlRGF0ZVBpY2tlckVkaXRvciwgTmlsZURhdGVQaWNrZXJFZGl0b3JPcHRpb25zLCBEYXRlUmFuZ2UgfSBmcm9tICcuL25pbGUtZGF0ZS1waWNrZXItZWRpdG9yJztcbmV4cG9ydCB7IE5pbGVDaGlwRWRpdG9yLCBOaWxlQ2hpcEVkaXRvck9wdGlvbnMsIENoaXBPcHRpb24gfSBmcm9tICcuL25pbGUtY2hpcC1lZGl0b3InO1xuZXhwb3J0IHsgTmlsZUNvZGVFZGl0b3IsIE5pbGVDb2RlRWRpdG9yT3B0aW9ucywgQ29kZUVkaXRvckNvbXBsZXRpb24sIEF1dG9Db21wbGV0ZVN0eWxlIH0gZnJvbSAnLi9uaWxlLWNvZGUtZWRpdG9yJztcbiJdfQ==
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Custom editor using NileChip from @aquera/nile-elements
3
+ * Renders the chip input in a floating popover below the cell to avoid row height mismatch.
4
+ *
5
+ * @see https://nile.aqueralabs.com/1.6.3/chip?theme=enterprise
6
+ */
7
+ let chipStylesInjected = false;
8
+ function injectChipStyles() {
9
+ if (chipStylesInjected)
10
+ return;
11
+ chipStylesInjected = true;
12
+ const styleId = 'nile-chip-editor-styles';
13
+ if (document.getElementById(styleId))
14
+ return;
15
+ const style = document.createElement('style');
16
+ style.id = styleId;
17
+ style.textContent = `
18
+ .st-chip-popover {
19
+ position: fixed;
20
+ z-index: 10000;
21
+ background: var(--nile-colors-white-base, #fff);
22
+ border: 1px solid var(--nile-colors-neutral-200, #e2e8f0);
23
+ border-radius: 6px;
24
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
25
+ padding: 8px;
26
+ box-sizing: border-box;
27
+ max-height: 200px;
28
+ overflow-y: auto;
29
+ }
30
+ .st-chip-popover nile-chip {
31
+ width: 100%;
32
+ }
33
+ .st-chip-popover nile-chip::part(base) {
34
+ border: none !important;
35
+ box-shadow: none !important;
36
+ min-height: 32px;
37
+ }
38
+ .st-chip-popover nile-chip::part(input) {
39
+ font-size: var(--nile-font-size-small, 13px);
40
+ }
41
+ `;
42
+ document.head.appendChild(style);
43
+ }
44
+ /**
45
+ * Custom editor that uses NileChip (tag input) component.
46
+ * Renders in a floating popover below the cell to avoid expanding row height.
47
+ *
48
+ * Cell value is expected to be `string[]` (array of tag strings).
49
+ */
50
+ export class NileChipEditor {
51
+ constructor(options) {
52
+ this.options = options;
53
+ this.acceptsInitialKeypress = false;
54
+ this.eventListeners = [];
55
+ this.trackedValues = [];
56
+ }
57
+ edit(context) {
58
+ if (!context.container) {
59
+ console.warn('NileChipEditor requires a container element');
60
+ return;
61
+ }
62
+ injectChipStyles();
63
+ this.cellContainer = context.container;
64
+ // Create the floating popover
65
+ this.popover = document.createElement('div');
66
+ this.popover.className = 'st-chip-popover';
67
+ // Create nile-chip inside the popover
68
+ this.chip = document.createElement('nile-chip');
69
+ this.chip.className = 'st-cell-editor st-nile-chip-editor';
70
+ this.setInitialValue(context.value);
71
+ this.applyOptions();
72
+ this.popover.appendChild(this.chip);
73
+ // Apply custom max-height if provided
74
+ if (this.options?.popoverMaxHeight) {
75
+ this.popover.style.maxHeight = `${this.options.popoverMaxHeight}px`;
76
+ }
77
+ // Append popover to body and position it
78
+ document.body.appendChild(this.popover);
79
+ this.positionPopover();
80
+ this.setupEventListeners(context);
81
+ if (this.options?.autoFocus !== false) {
82
+ setTimeout(() => {
83
+ try {
84
+ this.chip?.focus();
85
+ }
86
+ catch { /* ignore */ }
87
+ }, 0);
88
+ }
89
+ }
90
+ positionPopover() {
91
+ if (!this.popover || !this.cellContainer)
92
+ return;
93
+ const rect = this.cellContainer.getBoundingClientRect();
94
+ const minWidth = this.options?.popoverMinWidth ?? rect.width;
95
+ const popoverWidth = Math.max(minWidth, rect.width);
96
+ this.popover.style.top = `${rect.bottom + 2}px`;
97
+ this.popover.style.left = `${rect.left}px`;
98
+ this.popover.style.width = `${popoverWidth}px`;
99
+ // After rendering, check if it goes off-screen bottom and flip above if needed
100
+ requestAnimationFrame(() => {
101
+ if (!this.popover)
102
+ return;
103
+ const popRect = this.popover.getBoundingClientRect();
104
+ if (popRect.bottom > window.innerHeight) {
105
+ this.popover.style.top = `${rect.top - popRect.height - 2}px`;
106
+ }
107
+ });
108
+ }
109
+ setInitialValue(value) {
110
+ if (!this.chip)
111
+ return;
112
+ if (Array.isArray(value)) {
113
+ this.trackedValues = [...value];
114
+ this.chip.value = this.trackedValues;
115
+ }
116
+ else if (typeof value === 'string' && value) {
117
+ this.trackedValues = [value];
118
+ this.chip.value = this.trackedValues;
119
+ }
120
+ else {
121
+ this.trackedValues = [];
122
+ this.chip.value = [];
123
+ }
124
+ }
125
+ applyOptions() {
126
+ if (!this.chip || !this.options)
127
+ return;
128
+ if (this.options.placeholder) {
129
+ this.chip.placeholder = this.options.placeholder;
130
+ }
131
+ if (this.options.label) {
132
+ this.chip.label = this.options.label;
133
+ }
134
+ if (this.options.helpText) {
135
+ this.chip.helpText = this.options.helpText;
136
+ }
137
+ if (this.options.disabled !== undefined) {
138
+ this.chip.disabled = this.options.disabled;
139
+ }
140
+ if (this.options.readonly !== undefined) {
141
+ this.chip.readonly = this.options.readonly;
142
+ }
143
+ if (this.options.acceptUserInput !== undefined) {
144
+ this.chip.acceptUserInput = this.options.acceptUserInput;
145
+ }
146
+ if (this.options.noDuplicates !== undefined) {
147
+ this.chip.noDuplicates = this.options.noDuplicates;
148
+ }
149
+ if (this.options.clearable !== undefined) {
150
+ this.chip.clearable = this.options.clearable;
151
+ }
152
+ if (this.options.noWrap !== undefined) {
153
+ this.chip.noWrap = this.options.noWrap;
154
+ }
155
+ if (this.options.noAutoComplete !== undefined) {
156
+ this.chip.noAutoComplete = this.options.noAutoComplete;
157
+ }
158
+ if (this.options.enableVirtualScroll !== undefined) {
159
+ this.chip.enableVirtualScroll = this.options.enableVirtualScroll;
160
+ }
161
+ if (this.options.openDropdownOnFocus !== undefined) {
162
+ this.chip.openDropdownOnFocus = this.options.openDropdownOnFocus;
163
+ }
164
+ if (this.options.loading !== undefined) {
165
+ this.chip.loading = this.options.loading;
166
+ }
167
+ // Visual states
168
+ if (this.options.warning !== undefined) {
169
+ this.chip.warning = this.options.warning;
170
+ }
171
+ if (this.options.error !== undefined) {
172
+ this.chip.error = this.options.error;
173
+ }
174
+ if (this.options.success !== undefined) {
175
+ this.chip.success = this.options.success;
176
+ }
177
+ if (this.options.errorMessage) {
178
+ this.chip.errorMessage = this.options.errorMessage;
179
+ }
180
+ if (this.options.errorIndexes) {
181
+ this.chip.errorIndexes = this.options.errorIndexes;
182
+ }
183
+ // Autocomplete options
184
+ if (this.options.autoCompleteOptions) {
185
+ const opts = this.options.autoCompleteOptions;
186
+ const stringOpts = opts.map(o => typeof o === 'string' ? o : (o.label ?? o.value));
187
+ this.chip.autoCompleteOptions = stringOpts;
188
+ }
189
+ if (this.options.filterFunction) {
190
+ this.chip.filterFunction = this.options.filterFunction;
191
+ }
192
+ if (this.options.renderItemFunction) {
193
+ this.chip.renderItemFunction = this.options.renderItemFunction;
194
+ }
195
+ }
196
+ addListener(element, event, handler, capture) {
197
+ element.addEventListener(event, handler, capture);
198
+ this.eventListeners.push({ element, event, handler, capture });
199
+ }
200
+ setupEventListeners(context) {
201
+ if (!this.chip)
202
+ return;
203
+ // Track chip changes
204
+ this.addListener(this.chip, 'nile-chip-change', (e) => {
205
+ const detail = e.detail;
206
+ const newValue = Array.isArray(detail?.value) ? [...detail.value] : (this.chip?.value ? [...this.chip.value] : []);
207
+ this.trackedValues = newValue;
208
+ context.onChange(newValue);
209
+ });
210
+ // Keyboard handling on the chip element
211
+ this.addListener(this.chip, 'keydown', (e) => {
212
+ const keyEvent = e;
213
+ if (keyEvent.key === 'Enter') {
214
+ keyEvent.stopPropagation();
215
+ }
216
+ else if (keyEvent.key === 'Escape') {
217
+ keyEvent.preventDefault();
218
+ keyEvent.stopPropagation();
219
+ context.onCancel();
220
+ }
221
+ else if (keyEvent.key === 'Tab') {
222
+ keyEvent.preventDefault();
223
+ keyEvent.stopPropagation();
224
+ context.onSave(this.getCurrentValue());
225
+ }
226
+ });
227
+ // Click-outside: save when clicking anywhere outside the popover
228
+ let saveTriggered = false;
229
+ const mousedownHandler = (e) => {
230
+ if (saveTriggered)
231
+ return;
232
+ if (!this.popover)
233
+ return;
234
+ const path = e.composedPath();
235
+ for (const el of path) {
236
+ if (el === this.popover)
237
+ return;
238
+ if (el === this.chip)
239
+ return;
240
+ if (el instanceof HTMLElement) {
241
+ if (el.tagName?.toLowerCase() === 'nile-chip')
242
+ return;
243
+ if (el.className && typeof el.className === 'string' && el.className.includes('nile-chip'))
244
+ return;
245
+ }
246
+ }
247
+ saveTriggered = true;
248
+ context.onSave(this.getCurrentValue());
249
+ };
250
+ document.addEventListener('mousedown', mousedownHandler, true);
251
+ this._documentMousedownHandler = mousedownHandler;
252
+ // Reposition on scroll/resize so popover stays aligned with the cell
253
+ const reposition = () => this.positionPopover();
254
+ this.addListener(window, 'resize', reposition);
255
+ this.addListener(window, 'scroll', reposition, true);
256
+ }
257
+ destroy() {
258
+ // Remove document mousedown handler
259
+ if (this._documentMousedownHandler) {
260
+ document.removeEventListener('mousedown', this._documentMousedownHandler, true);
261
+ delete this._documentMousedownHandler;
262
+ }
263
+ // Remove all tracked listeners
264
+ for (const { element, event, handler, capture } of this.eventListeners) {
265
+ element.removeEventListener(event, handler, capture);
266
+ }
267
+ this.eventListeners = [];
268
+ // Remove the popover from the DOM
269
+ if (this.popover) {
270
+ this.popover.remove();
271
+ this.popover = undefined;
272
+ }
273
+ this.chip = undefined;
274
+ this.cellContainer = undefined;
275
+ this.trackedValues = [];
276
+ }
277
+ focus() {
278
+ try {
279
+ this.chip?.focus();
280
+ }
281
+ catch { /* ignore */ }
282
+ }
283
+ getCurrentValue() {
284
+ if (this.trackedValues.length > 0) {
285
+ return [...this.trackedValues];
286
+ }
287
+ if (!this.chip)
288
+ return [];
289
+ const val = this.chip.value;
290
+ return Array.isArray(val) ? [...val] : [];
291
+ }
292
+ }
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jaGlwLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvZWRpdG9ycy9uaWxlLWNoaXAtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBc0ZILElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLFNBQVMsZ0JBQWdCO0lBQ3ZCLElBQUksa0JBQWtCO1FBQUUsT0FBTztJQUMvQixrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFFMUIsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUM7SUFDMUMsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU87SUFFN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qm5CLENBQUM7SUFDRixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQVN6QixZQUE2QixPQUErQjtRQUEvQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQVI1RCwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsbUJBQWMsR0FBOEYsRUFBRSxDQUFDO1FBQy9HLGtCQUFhLEdBQWEsRUFBRSxDQUFDO0lBRTBCLENBQUM7SUFFaEUsSUFBSSxDQUFDLE9BQW9DO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQztZQUM1RCxPQUFPO1NBQ1I7UUFFRCxnQkFBZ0IsRUFBRSxDQUFDO1FB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QyxFQUFFO1lBQ2pDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzVCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXN0b20gZWRpdG9yIHVzaW5nIE5pbGVDaGlwIGZyb20gQGFxdWVyYS9uaWxlLWVsZW1lbnRzXG4gKiBSZW5kZXJzIHRoZSBjaGlwIGlucHV0IGluIGEgZmxvYXRpbmcgcG9wb3ZlciBiZWxvdyB0aGUgY2VsbCB0byBhdm9pZCByb3cgaGVpZ2h0IG1pc21hdGNoLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9uaWxlLmFxdWVyYWxhYnMuY29tLzEuNi4zL2NoaXA/dGhlbWU9ZW50ZXJwcmlzZVxuICovXG5cbmltcG9ydCB7IENlbGxFZGl0b3IsIENlbGxFZGl0b3JDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzL2NlbGwtc3RyYXRlZ2llcy5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIENoaXAgb3B0aW9uIGZvciBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGlwT3B0aW9uIHtcbiAgLyoqIFRoZSBvcHRpb24ncyB2YWx1ZSAqL1xuICB2YWx1ZTogc3RyaW5nO1xuICAvKiogRGlzcGxheSBsYWJlbCBmb3IgdGhlIG9wdGlvbiAoZGVmYXVsdHMgdG8gdmFsdWUgaWYgb21pdHRlZCkgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBpbnRlcmZhY2UgZm9yIE5pbGVDaGlwRWRpdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmlsZUNoaXBFZGl0b3JPcHRpb25zIHtcbiAgLyoqIEF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uIGxpc3QgKGZ1bGwgc2V0KSAqL1xuICBhdXRvQ29tcGxldGVPcHRpb25zPzogQ2hpcE9wdGlvbltdIHwgc3RyaW5nW107XG5cbiAgLyoqIFBsYWNlaG9sZGVyIHRleHQgc2hvd24gaW5zaWRlIHRoZSBpbnB1dCBhcmVhICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuXG4gIC8qKiBBbGxvdyB1c2VycyB0byB0eXBlIGN1c3RvbSB2YWx1ZXMgbm90IHByZXNlbnQgaW4gdGhlIHN1Z2dlc3Rpb24gbGlzdCAqL1xuICBhY2NlcHRVc2VySW5wdXQ/OiBib29sZWFuO1xuXG4gIC8qKiBQcmV2ZW50IGR1cGxpY2F0ZSBjaGlwIHZhbHVlcyAqL1xuICBub0R1cGxpY2F0ZXM/OiBib29sZWFuO1xuXG4gIC8qKiBEaXNhYmxlIHRoZSBjaGlwIGlucHV0ICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcblxuICAvKiogTWFrZSB0aGUgY2hpcCBpbnB1dCByZWFkb25seSAqL1xuICByZWFkb25seT86IGJvb2xlYW47XG5cbiAgLyoqIFNob3cgYSBjbGVhci1hbGwgYnV0dG9uICovXG4gIGNsZWFyYWJsZT86IGJvb2xlYW47XG5cbiAgLyoqIFByZXZlbnQgY2hpcCB0YWdzIGZyb20gd3JhcHBpbmcgdG8gbXVsdGlwbGUgbGluZXMgKi9cbiAgbm9XcmFwPzogYm9vbGVhbjtcblxuICAvKiogUmVtb3ZlIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gZW50aXJlbHkgKi9cbiAgbm9BdXRvQ29tcGxldGU/OiBib29sZWFuO1xuXG4gIC8qKiBFbmFibGUgdmlydHVhbCBzY3JvbGxpbmcgaW4gdGhlIHN1Z2dlc3Rpb24gZHJvcGRvd24gKi9cbiAgZW5hYmxlVmlydHVhbFNjcm9sbD86IGJvb2xlYW47XG5cbiAgLyoqIENvbnRyb2wgd2hldGhlciB0aGUgZHJvcGRvd24gb3BlbnMgb24gZm9jdXMg4oCUICd0cnVlJyB8ICdmYWxzZScgfCAnYWx3YXlzJyAqL1xuICBvcGVuRHJvcGRvd25PbkZvY3VzPzogc3RyaW5nO1xuXG4gIC8qKiBTaG93IGxvYWRpbmcgc3Bpbm5lciBpbnNpZGUgdGhlIGRyb3Bkb3duICovXG4gIGxvYWRpbmc/OiBib29sZWFuO1xuXG4gIC8vIFZpc3VhbCBzdGF0ZXNcbiAgLyoqIFdhcm5pbmcgc3RhdGUgc3R5bGluZyAqL1xuICB3YXJuaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIHN0YXRlIHN0eWxpbmcgKi9cbiAgZXJyb3I/OiBib29sZWFuO1xuICAvKiogU3VjY2VzcyBzdGF0ZSBzdHlsaW5nICovXG4gIHN1Y2Nlc3M/OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSBzaG93biBiZWxvdyB0aGUgaW5wdXQgKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICAvKiogSGVscCB0ZXh0IHNob3duIGJlbG93IHRoZSBpbnB1dCAqL1xuICBoZWxwVGV4dD86IHN0cmluZztcbiAgLyoqIExhYmVsIHRleHQgZm9yIHRoZSBjaGlwIGlucHV0ICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogSW5kZXhlcyBvZiBjaGlwcyB0byBoaWdobGlnaHQgYXMgZXJyb3JzICovXG4gIGVycm9ySW5kZXhlcz86IG51bWJlcltdO1xuXG4gIC8qKiBDdXN0b20gZmlsdGVyIGZ1bmN0aW9uIGZvciBhdXRvY29tcGxldGUgKi9cbiAgZmlsdGVyRnVuY3Rpb24/OiAocXVlcnk6IHN0cmluZywgb3B0aW9uOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgLyoqIEN1c3RvbSByZW5kZXIgZnVuY3Rpb24gZm9yIGRyb3Bkb3duIGl0ZW1zICovXG4gIHJlbmRlckl0ZW1GdW5jdGlvbj86IChvcHRpb246IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gIC8qKiBBdXRvLWZvY3VzIHRoZSBpbnB1dCB3aGVuIGVkaXRvciBvcGVucyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcblxuICAvKiogTWluaW11bSB3aWR0aCBvZiB0aGUgcG9wb3ZlciBpbiBweCAoZGVmYXVsdDogd2lkdGggb2YgdGhlIGNlbGwpICovXG4gIHBvcG92ZXJNaW5XaWR0aD86IG51bWJlcjtcblxuICAvKiogTWF4aW11bSBoZWlnaHQgb2YgdGhlIHBvcG92ZXIgaW4gcHggYmVmb3JlIGl0IHNjcm9sbHMgKGRlZmF1bHQ6IDIwMCkgKi9cbiAgcG9wb3Zlck1heEhlaWdodD86IG51bWJlcjtcbn1cblxubGV0IGNoaXBTdHlsZXNJbmplY3RlZCA9IGZhbHNlO1xuZnVuY3Rpb24gaW5qZWN0Q2hpcFN0eWxlcygpOiB2b2lkIHtcbiAgaWYgKGNoaXBTdHlsZXNJbmplY3RlZCkgcmV0dXJuO1xuICBjaGlwU3R5bGVzSW5qZWN0ZWQgPSB0cnVlO1xuXG4gIGNvbnN0IHN0eWxlSWQgPSAnbmlsZS1jaGlwLWVkaXRvci1zdHlsZXMnO1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHJldHVybjtcblxuICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlLmlkID0gc3R5bGVJZDtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLnN0LWNoaXAtcG9wb3ZlciB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICB6LWluZGV4OiAxMDAwMDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLW5pbGUtY29sb3JzLXdoaXRlLWJhc2UsICNmZmYpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbmlsZS1jb2xvcnMtbmV1dHJhbC0yMDAsICNlMmU4ZjApO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgYm94LXNoYWRvdzogMCA0cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICAgICAgcGFkZGluZzogOHB4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIG1heC1oZWlnaHQ6IDIwMHB4O1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICB9XG4gICAgLnN0LWNoaXAtcG9wb3ZlciBuaWxlLWNoaXAge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICAgIC5zdC1jaGlwLXBvcG92ZXIgbmlsZS1jaGlwOjpwYXJ0KGJhc2UpIHtcbiAgICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgbWluLWhlaWdodDogMzJweDtcbiAgICB9XG4gICAgLnN0LWNoaXAtcG9wb3ZlciBuaWxlLWNoaXA6OnBhcnQoaW5wdXQpIHtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbmlsZS1mb250LXNpemUtc21hbGwsIDEzcHgpO1xuICAgIH1cbiAgYDtcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5cbi8qKlxuICogQ3VzdG9tIGVkaXRvciB0aGF0IHVzZXMgTmlsZUNoaXAgKHRhZyBpbnB1dCkgY29tcG9uZW50LlxuICogUmVuZGVycyBpbiBhIGZsb2F0aW5nIHBvcG92ZXIgYmVsb3cgdGhlIGNlbGwgdG8gYXZvaWQgZXhwYW5kaW5nIHJvdyBoZWlnaHQuXG4gKlxuICogQ2VsbCB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBgc3RyaW5nW11gIChhcnJheSBvZiB0YWcgc3RyaW5ncykuXG4gKi9cbmV4cG9ydCBjbGFzcyBOaWxlQ2hpcEVkaXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3I8c3RyaW5nW10+IHtcbiAgYWNjZXB0c0luaXRpYWxLZXlwcmVzcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY2hpcD86IGFueTtcbiAgcHJpdmF0ZSBwb3BvdmVyPzogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgY2VsbENvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGV2ZW50TGlzdGVuZXJzOiBBcnJheTx7IGVsZW1lbnQ6IEV2ZW50VGFyZ2V0OyBldmVudDogc3RyaW5nOyBoYW5kbGVyOiBFdmVudExpc3RlbmVyOyBjYXB0dXJlPzogYm9vbGVhbiB9PiA9IFtdO1xuICBwcml2YXRlIHRyYWNrZWRWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zPzogTmlsZUNoaXBFZGl0b3JPcHRpb25zKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8c3RyaW5nW10+KTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdOaWxlQ2hpcEVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5qZWN0Q2hpcFN0eWxlcygpO1xuXG4gICAgdGhpcy5jZWxsQ29udGFpbmVyID0gY29udGV4dC5jb250YWluZXI7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGZsb2F0aW5nIHBvcG92ZXJcbiAgICB0aGlzLnBvcG92ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnBvcG92ZXIuY2xhc3NOYW1lID0gJ3N0LWNoaXAtcG9wb3Zlcic7XG5cbiAgICAvLyBDcmVhdGUgbmlsZS1jaGlwIGluc2lkZSB0aGUgcG9wb3ZlclxuICAgIHRoaXMuY2hpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtY2hpcCcpO1xuICAgIHRoaXMuY2hpcC5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtbmlsZS1jaGlwLWVkaXRvcic7XG5cbiAgICB0aGlzLnNldEluaXRpYWxWYWx1ZShjb250ZXh0LnZhbHVlKTtcbiAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuICAgIHRoaXMucG9wb3Zlci5hcHBlbmRDaGlsZCh0aGlzLmNoaXApO1xuXG4gICAgLy8gQXBwbHkgY3VzdG9tIG1heC1oZWlnaHQgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5vcHRpb25zPy5wb3BvdmVyTWF4SGVpZ2h0KSB7XG4gICAgICB0aGlzLnBvcG92ZXIuc3R5bGUubWF4SGVpZ2h0ID0gYCR7dGhpcy5vcHRpb25zLnBvcG92ZXJNYXhIZWlnaHR9cHhgO1xuICAgIH1cblxuICAgIC8vIEFwcGVuZCBwb3BvdmVyIHRvIGJvZHkgYW5kIHBvc2l0aW9uIGl0XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnBvcG92ZXIpO1xuICAgIHRoaXMucG9zaXRpb25Qb3BvdmVyKCk7XG5cbiAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dCk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHJ5IHsgdGhpcy5jaGlwPy5mb2N1cygpOyB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Qb3BvdmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb3BvdmVyIHx8ICF0aGlzLmNlbGxDb250YWluZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmNlbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbWluV2lkdGggPSB0aGlzLm9wdGlvbnM/LnBvcG92ZXJNaW5XaWR0aCA/PyByZWN0LndpZHRoO1xuICAgIGNvbnN0IHBvcG92ZXJXaWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCByZWN0LndpZHRoKTtcblxuICAgIHRoaXMucG9wb3Zlci5zdHlsZS50b3AgPSBgJHtyZWN0LmJvdHRvbSArIDJ9cHhgO1xuICAgIHRoaXMucG9wb3Zlci5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcbiAgICB0aGlzLnBvcG92ZXIuc3R5bGUud2lkdGggPSBgJHtwb3BvdmVyV2lkdGh9cHhgO1xuXG4gICAgLy8gQWZ0ZXIgcmVuZGVyaW5nLCBjaGVjayBpZiBpdCBnb2VzIG9mZi1zY3JlZW4gYm90dG9tIGFuZCBmbGlwIGFib3ZlIGlmIG5lZWRlZFxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucG9wb3ZlcikgcmV0dXJuO1xuICAgICAgY29uc3QgcG9wUmVjdCA9IHRoaXMucG9wb3Zlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChwb3BSZWN0LmJvdHRvbSA+IHdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgICAgICB0aGlzLnBvcG92ZXIuc3R5bGUudG9wID0gYCR7cmVjdC50b3AgLSBwb3BSZWN0LmhlaWdodCAtIDJ9cHhgO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbml0aWFsVmFsdWUodmFsdWU6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoaXApIHJldHVybjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMudHJhY2tlZFZhbHVlcyA9IFsuLi52YWx1ZV07XG4gICAgICB0aGlzLmNoaXAudmFsdWUgPSB0aGlzLnRyYWNrZWRWYWx1ZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlKSB7XG4gICAgICB0aGlzLnRyYWNrZWRWYWx1ZXMgPSBbdmFsdWVdO1xuICAgICAgdGhpcy5jaGlwLnZhbHVlID0gdGhpcy50cmFja2VkVmFsdWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYWNrZWRWYWx1ZXMgPSBbXTtcbiAgICAgIHRoaXMuY2hpcC52YWx1ZSA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlPcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGlwIHx8ICF0aGlzLm9wdGlvbnMpIHJldHVybjtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuY2hpcC5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmxhYmVsKSB7XG4gICAgICB0aGlzLmNoaXAubGFiZWwgPSB0aGlzLm9wdGlvbnMubGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5oZWxwVGV4dCkge1xuICAgICAgdGhpcy5jaGlwLmhlbHBUZXh0ID0gdGhpcy5vcHRpb25zLmhlbHBUZXh0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLmRpc2FibGVkID0gdGhpcy5vcHRpb25zLmRpc2FibGVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVhZG9ubHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLnJlYWRvbmx5ID0gdGhpcy5vcHRpb25zLnJlYWRvbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWNjZXB0VXNlcklucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5hY2NlcHRVc2VySW5wdXQgPSB0aGlzLm9wdGlvbnMuYWNjZXB0VXNlcklucHV0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9EdXBsaWNhdGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5ub0R1cGxpY2F0ZXMgPSB0aGlzLm9wdGlvbnMubm9EdXBsaWNhdGVzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2xlYXJhYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5jbGVhcmFibGUgPSB0aGlzLm9wdGlvbnMuY2xlYXJhYmxlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9XcmFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5ub1dyYXAgPSB0aGlzLm9wdGlvbnMubm9XcmFwO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9BdXRvQ29tcGxldGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLm5vQXV0b0NvbXBsZXRlID0gdGhpcy5vcHRpb25zLm5vQXV0b0NvbXBsZXRlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlVmlydHVhbFNjcm9sbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAuZW5hYmxlVmlydHVhbFNjcm9sbCA9IHRoaXMub3B0aW9ucy5lbmFibGVWaXJ0dWFsU2Nyb2xsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3BlbkRyb3Bkb3duT25Gb2N1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAub3BlbkRyb3Bkb3duT25Gb2N1cyA9IHRoaXMub3B0aW9ucy5vcGVuRHJvcGRvd25PbkZvY3VzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubG9hZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAubG9hZGluZyA9IHRoaXMub3B0aW9ucy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFZpc3VhbCBzdGF0ZXNcbiAgICBpZiAodGhpcy5vcHRpb25zLndhcm5pbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLndhcm5pbmcgPSB0aGlzLm9wdGlvbnMud2FybmluZztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAuZXJyb3IgPSB0aGlzLm9wdGlvbnMuZXJyb3I7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAuc3VjY2VzcyA9IHRoaXMub3B0aW9ucy5zdWNjZXNzO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmVycm9yTWVzc2FnZSkge1xuICAgICAgdGhpcy5jaGlwLmVycm9yTWVzc2FnZSA9IHRoaXMub3B0aW9ucy5lcnJvck1lc3NhZ2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3JJbmRleGVzKSB7XG4gICAgICB0aGlzLmNoaXAuZXJyb3JJbmRleGVzID0gdGhpcy5vcHRpb25zLmVycm9ySW5kZXhlcztcbiAgICB9XG5cbiAgICAvLyBBdXRvY29tcGxldGUgb3B0aW9uc1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b0NvbXBsZXRlT3B0aW9ucykge1xuICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucy5hdXRvQ29tcGxldGVPcHRpb25zO1xuICAgICAgY29uc3Qgc3RyaW5nT3B0czogc3RyaW5nW10gPSBvcHRzLm1hcChvID0+IHR5cGVvZiBvID09PSAnc3RyaW5nJyA/IG8gOiAoby5sYWJlbCA/PyBvLnZhbHVlKSk7XG4gICAgICB0aGlzLmNoaXAuYXV0b0NvbXBsZXRlT3B0aW9ucyA9IHN0cmluZ09wdHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5maWx0ZXJGdW5jdGlvbikge1xuICAgICAgdGhpcy5jaGlwLmZpbHRlckZ1bmN0aW9uID0gdGhpcy5vcHRpb25zLmZpbHRlckZ1bmN0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVuZGVySXRlbUZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmNoaXAucmVuZGVySXRlbUZ1bmN0aW9uID0gdGhpcy5vcHRpb25zLnJlbmRlckl0ZW1GdW5jdGlvbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZExpc3RlbmVyKGVsZW1lbnQ6IEV2ZW50VGFyZ2V0LCBldmVudDogc3RyaW5nLCBoYW5kbGVyOiBFdmVudExpc3RlbmVyLCBjYXB0dXJlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY2FwdHVyZSk7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8c3RyaW5nW10+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoaXApIHJldHVybjtcblxuICAgIC8vIFRyYWNrIGNoaXAgY2hhbmdlc1xuICAgIHRoaXMuYWRkTGlzdGVuZXIodGhpcy5jaGlwLCAnbmlsZS1jaGlwLWNoYW5nZScsIChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZGV0YWlsID0gKGUgYXMgQ3VzdG9tRXZlbnQpLmRldGFpbDtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlOiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkoZGV0YWlsPy52YWx1ZSkgPyBbLi4uZGV0YWlsLnZhbHVlXSA6ICh0aGlzLmNoaXA/LnZhbHVlID8gWy4uLnRoaXMuY2hpcC52YWx1ZV0gOiBbXSk7XG4gICAgICB0aGlzLnRyYWNrZWRWYWx1ZXMgPSBuZXdWYWx1ZTtcbiAgICAgIGNvbnRleHQub25DaGFuZ2UobmV3VmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLy8gS2V5Ym9hcmQgaGFuZGxpbmcgb24gdGhlIGNoaXAgZWxlbWVudFxuICAgIHRoaXMuYWRkTGlzdGVuZXIodGhpcy5jaGlwLCAna2V5ZG93bicsIChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBlIGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSBlbHNlIGlmIChrZXlFdmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleUV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2xpY2stb3V0c2lkZTogc2F2ZSB3aGVuIGNsaWNraW5nIGFueXdoZXJlIG91dHNpZGUgdGhlIHBvcG92ZXJcbiAgICBsZXQgc2F2ZVRyaWdnZXJlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG1vdXNlZG93bkhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKHNhdmVUcmlnZ2VyZWQpIHJldHVybjtcbiAgICAgIGlmICghdGhpcy5wb3BvdmVyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBhdGggPSBlLmNvbXBvc2VkUGF0aCgpO1xuICAgICAgZm9yIChjb25zdCBlbCBvZiBwYXRoKSB7XG4gICAgICAgIGlmIChlbCA9PT0gdGhpcy5wb3BvdmVyKSByZXR1cm47XG4gICAgICAgIGlmIChlbCA9PT0gdGhpcy5jaGlwKSByZXR1cm47XG4gICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKGVsLnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICduaWxlLWNoaXAnKSByZXR1cm47XG4gICAgICAgICAgaWYgKGVsLmNsYXNzTmFtZSAmJiB0eXBlb2YgZWwuY2xhc3NOYW1lID09PSAnc3RyaW5nJyAmJiBlbC5jbGFzc05hbWUuaW5jbHVkZXMoJ25pbGUtY2hpcCcpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2F2ZVRyaWdnZXJlZCA9IHRydWU7XG4gICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgbW91c2Vkb3duSGFuZGxlciwgdHJ1ZSk7XG4gICAgKHRoaXMgYXMgYW55KS5fZG9jdW1lbnRNb3VzZWRvd25IYW5kbGVyID0gbW91c2Vkb3duSGFuZGxlcjtcblxuICAgIC8vIFJlcG9zaXRpb24gb24gc2Nyb2xsL3Jlc2l6ZSBzbyBwb3BvdmVyIHN0YXlzIGFsaWduZWQgd2l0aCB0aGUgY2VsbFxuICAgIGNvbnN0IHJlcG9zaXRpb24gPSAoKSA9PiB0aGlzLnBvc2l0aW9uUG9wb3ZlcigpO1xuICAgIHRoaXMuYWRkTGlzdGVuZXIod2luZG93LCAncmVzaXplJywgcmVwb3NpdGlvbik7XG4gICAgdGhpcy5hZGRMaXN0ZW5lcih3aW5kb3csICdzY3JvbGwnLCByZXBvc2l0aW9uLCB0cnVlKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGRvY3VtZW50IG1vdXNlZG93biBoYW5kbGVyXG4gICAgaWYgKCh0aGlzIGFzIGFueSkuX2RvY3VtZW50TW91c2Vkb3duSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKHRoaXMgYXMgYW55KS5fZG9jdW1lbnRNb3VzZWRvd25IYW5kbGVyLCB0cnVlKTtcbiAgICAgIGRlbGV0ZSAodGhpcyBhcyBhbnkpLl9kb2N1bWVudE1vdXNlZG93bkhhbmRsZXI7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB0cmFja2VkIGxpc3RlbmVyc1xuICAgIGZvciAoY29uc3QgeyBlbGVtZW50LCBldmVudCwgaGFuZGxlciwgY2FwdHVyZSB9IG9mIHRoaXMuZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY2FwdHVyZSk7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcG9wb3ZlciBmcm9tIHRoZSBET01cbiAgICBpZiAodGhpcy5wb3BvdmVyKSB7XG4gICAgICB0aGlzLnBvcG92ZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLnBvcG92ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5jaGlwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2VsbENvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRyYWNrZWRWYWx1ZXMgPSBbXTtcbiAgfVxuXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRyeSB7IHRoaXMuY2hpcD8uZm9jdXMoKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLnRyYWNrZWRWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLnRyYWNrZWRWYWx1ZXNdO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hpcCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuY2hpcC52YWx1ZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gWy4uLnZhbF0gOiBbXTtcbiAgfVxufVxuIl19