@aquera/ngx-smart-table 0.0.17-patch-0.5 → 0.0.17-patch-0.7

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,296 @@
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
+ this.hasChangeOccurred = false;
57
+ }
58
+ edit(context) {
59
+ if (!context.container) {
60
+ console.warn('NileChipEditor requires a container element');
61
+ return;
62
+ }
63
+ injectChipStyles();
64
+ this.cellContainer = context.container;
65
+ // Create the floating popover
66
+ this.popover = document.createElement('div');
67
+ this.popover.className = 'st-chip-popover';
68
+ // Create nile-chip inside the popover
69
+ this.chip = document.createElement('nile-chip');
70
+ this.chip.className = 'st-cell-editor st-nile-chip-editor';
71
+ this.setInitialValue(context.value);
72
+ this.applyOptions();
73
+ this.popover.appendChild(this.chip);
74
+ // Apply custom max-height if provided
75
+ if (this.options?.popoverMaxHeight) {
76
+ this.popover.style.maxHeight = `${this.options.popoverMaxHeight}px`;
77
+ }
78
+ // Append popover to body and position it
79
+ document.body.appendChild(this.popover);
80
+ this.positionPopover();
81
+ this.setupEventListeners(context);
82
+ if (this.options?.autoFocus !== false) {
83
+ setTimeout(() => {
84
+ try {
85
+ this.chip?.focus();
86
+ }
87
+ catch { /* ignore */ }
88
+ }, 0);
89
+ }
90
+ }
91
+ positionPopover() {
92
+ if (!this.popover || !this.cellContainer)
93
+ return;
94
+ const rect = this.cellContainer.getBoundingClientRect();
95
+ const minWidth = this.options?.popoverMinWidth ?? rect.width;
96
+ const popoverWidth = Math.max(minWidth, rect.width);
97
+ this.popover.style.top = `${rect.bottom + 2}px`;
98
+ this.popover.style.left = `${rect.left}px`;
99
+ this.popover.style.width = `${popoverWidth}px`;
100
+ // After rendering, check if it goes off-screen bottom and flip above if needed
101
+ requestAnimationFrame(() => {
102
+ if (!this.popover)
103
+ return;
104
+ const popRect = this.popover.getBoundingClientRect();
105
+ if (popRect.bottom > window.innerHeight) {
106
+ this.popover.style.top = `${rect.top - popRect.height - 2}px`;
107
+ }
108
+ });
109
+ }
110
+ setInitialValue(value) {
111
+ if (!this.chip)
112
+ return;
113
+ if (Array.isArray(value)) {
114
+ this.trackedValues = [...value];
115
+ this.chip.value = this.trackedValues;
116
+ }
117
+ else if (typeof value === 'string' && value) {
118
+ this.trackedValues = [value];
119
+ this.chip.value = this.trackedValues;
120
+ }
121
+ else {
122
+ this.trackedValues = [];
123
+ this.chip.value = [];
124
+ }
125
+ }
126
+ applyOptions() {
127
+ if (!this.chip || !this.options)
128
+ return;
129
+ if (this.options.placeholder) {
130
+ this.chip.placeholder = this.options.placeholder;
131
+ }
132
+ if (this.options.label) {
133
+ this.chip.label = this.options.label;
134
+ }
135
+ if (this.options.helpText) {
136
+ this.chip.helpText = this.options.helpText;
137
+ }
138
+ if (this.options.disabled !== undefined) {
139
+ this.chip.disabled = this.options.disabled;
140
+ }
141
+ if (this.options.readonly !== undefined) {
142
+ this.chip.readonly = this.options.readonly;
143
+ }
144
+ if (this.options.acceptUserInput !== undefined) {
145
+ this.chip.acceptUserInput = this.options.acceptUserInput;
146
+ }
147
+ if (this.options.noDuplicates !== undefined) {
148
+ this.chip.noDuplicates = this.options.noDuplicates;
149
+ }
150
+ if (this.options.clearable !== undefined) {
151
+ this.chip.clearable = this.options.clearable;
152
+ }
153
+ if (this.options.noWrap !== undefined) {
154
+ this.chip.noWrap = this.options.noWrap;
155
+ }
156
+ if (this.options.noAutoComplete !== undefined) {
157
+ this.chip.noAutoComplete = this.options.noAutoComplete;
158
+ }
159
+ if (this.options.enableVirtualScroll !== undefined) {
160
+ this.chip.enableVirtualScroll = this.options.enableVirtualScroll;
161
+ }
162
+ if (this.options.openDropdownOnFocus !== undefined) {
163
+ this.chip.openDropdownOnFocus = this.options.openDropdownOnFocus;
164
+ }
165
+ if (this.options.loading !== undefined) {
166
+ this.chip.loading = this.options.loading;
167
+ }
168
+ // Visual states
169
+ if (this.options.warning !== undefined) {
170
+ this.chip.warning = this.options.warning;
171
+ }
172
+ if (this.options.error !== undefined) {
173
+ this.chip.error = this.options.error;
174
+ }
175
+ if (this.options.success !== undefined) {
176
+ this.chip.success = this.options.success;
177
+ }
178
+ if (this.options.errorMessage) {
179
+ this.chip.errorMessage = this.options.errorMessage;
180
+ }
181
+ if (this.options.errorIndexes) {
182
+ this.chip.errorIndexes = this.options.errorIndexes;
183
+ }
184
+ // Autocomplete options
185
+ if (this.options.autoCompleteOptions) {
186
+ const opts = this.options.autoCompleteOptions;
187
+ const stringOpts = opts.map(o => typeof o === 'string' ? o : (o.label ?? o.value));
188
+ this.chip.autoCompleteOptions = stringOpts;
189
+ }
190
+ if (this.options.filterFunction) {
191
+ this.chip.filterFunction = this.options.filterFunction;
192
+ }
193
+ if (this.options.renderItemFunction) {
194
+ this.chip.renderItemFunction = this.options.renderItemFunction;
195
+ }
196
+ }
197
+ addListener(element, event, handler, capture) {
198
+ element.addEventListener(event, handler, capture);
199
+ this.eventListeners.push({ element, event, handler, capture });
200
+ }
201
+ setupEventListeners(context) {
202
+ if (!this.chip)
203
+ return;
204
+ // Track chip changes
205
+ this.addListener(this.chip, 'nile-chip-change', (e) => {
206
+ const detail = e.detail;
207
+ const newValue = Array.isArray(detail?.value) ? [...detail.value] : (this.chip?.value ? [...this.chip.value] : []);
208
+ this.trackedValues = newValue;
209
+ this.hasChangeOccurred = true;
210
+ context.onChange(newValue);
211
+ });
212
+ // Keyboard handling on the chip element
213
+ this.addListener(this.chip, 'keydown', (e) => {
214
+ const keyEvent = e;
215
+ if (keyEvent.key === 'Enter') {
216
+ keyEvent.stopPropagation();
217
+ }
218
+ else if (keyEvent.key === 'Escape') {
219
+ keyEvent.preventDefault();
220
+ keyEvent.stopPropagation();
221
+ context.onCancel();
222
+ }
223
+ else if (keyEvent.key === 'Tab') {
224
+ keyEvent.preventDefault();
225
+ keyEvent.stopPropagation();
226
+ context.onSave(this.getCurrentValue());
227
+ }
228
+ });
229
+ // Click-outside: save when clicking anywhere outside the popover
230
+ let saveTriggered = false;
231
+ const mousedownHandler = (e) => {
232
+ if (saveTriggered)
233
+ return;
234
+ if (!this.popover)
235
+ return;
236
+ const path = e.composedPath();
237
+ for (const el of path) {
238
+ if (el === this.popover)
239
+ return;
240
+ if (el === this.chip)
241
+ return;
242
+ if (el instanceof HTMLElement) {
243
+ if (el.tagName?.toLowerCase() === 'nile-chip')
244
+ return;
245
+ if (el.className && typeof el.className === 'string' && el.className.includes('nile-chip'))
246
+ return;
247
+ }
248
+ }
249
+ saveTriggered = true;
250
+ context.onSave(this.getCurrentValue());
251
+ };
252
+ document.addEventListener('mousedown', mousedownHandler, true);
253
+ this._documentMousedownHandler = mousedownHandler;
254
+ // Reposition on scroll/resize so popover stays aligned with the cell
255
+ const reposition = () => this.positionPopover();
256
+ this.addListener(window, 'resize', reposition);
257
+ this.addListener(window, 'scroll', reposition, true);
258
+ }
259
+ destroy() {
260
+ // Remove document mousedown handler
261
+ if (this._documentMousedownHandler) {
262
+ document.removeEventListener('mousedown', this._documentMousedownHandler, true);
263
+ delete this._documentMousedownHandler;
264
+ }
265
+ // Remove all tracked listeners
266
+ for (const { element, event, handler, capture } of this.eventListeners) {
267
+ element.removeEventListener(event, handler, capture);
268
+ }
269
+ this.eventListeners = [];
270
+ // Remove the popover from the DOM
271
+ if (this.popover) {
272
+ this.popover.remove();
273
+ this.popover = undefined;
274
+ }
275
+ this.chip = undefined;
276
+ this.cellContainer = undefined;
277
+ this.trackedValues = [];
278
+ this.hasChangeOccurred = false;
279
+ }
280
+ focus() {
281
+ try {
282
+ this.chip?.focus();
283
+ }
284
+ catch { /* ignore */ }
285
+ }
286
+ getCurrentValue() {
287
+ if (this.hasChangeOccurred) {
288
+ return [...this.trackedValues];
289
+ }
290
+ if (!this.chip)
291
+ return [];
292
+ const val = this.chip.value;
293
+ return Array.isArray(val) ? [...val] : [];
294
+ }
295
+ }
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jaGlwLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvZWRpdG9ycy9uaWxlLWNoaXAtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBc0ZILElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLFNBQVMsZ0JBQWdCO0lBQ3ZCLElBQUksa0JBQWtCO1FBQUUsT0FBTztJQUMvQixrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFFMUIsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUM7SUFDMUMsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU87SUFFN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qm5CLENBQUM7SUFDRixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQVV6QixZQUE2QixPQUErQjtRQUEvQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQVQ1RCwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsbUJBQWMsR0FBOEYsRUFBRSxDQUFDO1FBQy9HLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBQzdCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztJQUU2QixDQUFDO0lBRWhFLElBQUksQ0FBQyxPQUFvQztRQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7WUFDNUQsT0FBTztT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RUFBRSxDQUFDO1NBQUU7UUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFFO0lBQ3BELENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDNUIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZUNoaXAgZnJvbSBAYXF1ZXJhL25pbGUtZWxlbWVudHNcbiAqIFJlbmRlcnMgdGhlIGNoaXAgaW5wdXQgaW4gYSBmbG9hdGluZyBwb3BvdmVyIGJlbG93IHRoZSBjZWxsIHRvIGF2b2lkIHJvdyBoZWlnaHQgbWlzbWF0Y2guXG4gKlxuICogQHNlZSBodHRwczovL25pbGUuYXF1ZXJhbGFicy5jb20vMS42LjMvY2hpcD90aGVtZT1lbnRlcnByaXNlXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5cbi8qKlxuICogQ2hpcCBvcHRpb24gZm9yIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENoaXBPcHRpb24ge1xuICAvKiogVGhlIG9wdGlvbidzIHZhbHVlICovXG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3B0aW9uIChkZWZhdWx0cyB0byB2YWx1ZSBpZiBvbWl0dGVkKSAqL1xuICBsYWJlbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZUNoaXBFZGl0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOaWxlQ2hpcEVkaXRvck9wdGlvbnMge1xuICAvKiogQXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb24gbGlzdCAoZnVsbCBzZXQpICovXG4gIGF1dG9Db21wbGV0ZU9wdGlvbnM/OiBDaGlwT3B0aW9uW10gfCBzdHJpbmdbXTtcblxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCBzaG93biBpbnNpZGUgdGhlIGlucHV0IGFyZWEgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqIEFsbG93IHVzZXJzIHRvIHR5cGUgY3VzdG9tIHZhbHVlcyBub3QgcHJlc2VudCBpbiB0aGUgc3VnZ2VzdGlvbiBsaXN0ICovXG4gIGFjY2VwdFVzZXJJbnB1dD86IGJvb2xlYW47XG5cbiAgLyoqIFByZXZlbnQgZHVwbGljYXRlIGNoaXAgdmFsdWVzICovXG4gIG5vRHVwbGljYXRlcz86IGJvb2xlYW47XG5cbiAgLyoqIERpc2FibGUgdGhlIGNoaXAgaW5wdXQgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKiBNYWtlIHRoZSBjaGlwIGlucHV0IHJlYWRvbmx5ICovXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcblxuICAvKiogU2hvdyBhIGNsZWFyLWFsbCBidXR0b24gKi9cbiAgY2xlYXJhYmxlPzogYm9vbGVhbjtcblxuICAvKiogUHJldmVudCBjaGlwIHRhZ3MgZnJvbSB3cmFwcGluZyB0byBtdWx0aXBsZSBsaW5lcyAqL1xuICBub1dyYXA/OiBib29sZWFuO1xuXG4gIC8qKiBSZW1vdmUgdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93biBlbnRpcmVseSAqL1xuICBub0F1dG9Db21wbGV0ZT86IGJvb2xlYW47XG5cbiAgLyoqIEVuYWJsZSB2aXJ0dWFsIHNjcm9sbGluZyBpbiB0aGUgc3VnZ2VzdGlvbiBkcm9wZG93biAqL1xuICBlbmFibGVWaXJ0dWFsU2Nyb2xsPzogYm9vbGVhbjtcblxuICAvKiogQ29udHJvbCB3aGV0aGVyIHRoZSBkcm9wZG93biBvcGVucyBvbiBmb2N1cyDigJQgJ3RydWUnIHwgJ2ZhbHNlJyB8ICdhbHdheXMnICovXG4gIG9wZW5Ecm9wZG93bk9uRm9jdXM/OiBzdHJpbmc7XG5cbiAgLyoqIFNob3cgbG9hZGluZyBzcGlubmVyIGluc2lkZSB0aGUgZHJvcGRvd24gKi9cbiAgbG9hZGluZz86IGJvb2xlYW47XG5cbiAgLy8gVmlzdWFsIHN0YXRlc1xuICAvKiogV2FybmluZyBzdGF0ZSBzdHlsaW5nICovXG4gIHdhcm5pbmc/OiBib29sZWFuO1xuICAvKiogRXJyb3Igc3RhdGUgc3R5bGluZyAqL1xuICBlcnJvcj86IGJvb2xlYW47XG4gIC8qKiBTdWNjZXNzIHN0YXRlIHN0eWxpbmcgKi9cbiAgc3VjY2Vzcz86IGJvb2xlYW47XG4gIC8qKiBFcnJvciBtZXNzYWdlIHNob3duIGJlbG93IHRoZSBpbnB1dCAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBIZWxwIHRleHQgc2hvd24gYmVsb3cgdGhlIGlucHV0ICovXG4gIGhlbHBUZXh0Pzogc3RyaW5nO1xuICAvKiogTGFiZWwgdGV4dCBmb3IgdGhlIGNoaXAgaW5wdXQgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBJbmRleGVzIG9mIGNoaXBzIHRvIGhpZ2hsaWdodCBhcyBlcnJvcnMgKi9cbiAgZXJyb3JJbmRleGVzPzogbnVtYmVyW107XG5cbiAgLyoqIEN1c3RvbSBmaWx0ZXIgZnVuY3Rpb24gZm9yIGF1dG9jb21wbGV0ZSAqL1xuICBmaWx0ZXJGdW5jdGlvbj86IChxdWVyeTogc3RyaW5nLCBvcHRpb246IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKiogQ3VzdG9tIHJlbmRlciBmdW5jdGlvbiBmb3IgZHJvcGRvd24gaXRlbXMgKi9cbiAgcmVuZGVySXRlbUZ1bmN0aW9uPzogKG9wdGlvbjogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgLyoqIEF1dG8tZm9jdXMgdGhlIGlucHV0IHdoZW4gZWRpdG9yIG9wZW5zIChkZWZhdWx0OiB0cnVlKSAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuXG4gIC8qKiBNaW5pbXVtIHdpZHRoIG9mIHRoZSBwb3BvdmVyIGluIHB4IChkZWZhdWx0OiB3aWR0aCBvZiB0aGUgY2VsbCkgKi9cbiAgcG9wb3Zlck1pbldpZHRoPzogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIGhlaWdodCBvZiB0aGUgcG9wb3ZlciBpbiBweCBiZWZvcmUgaXQgc2Nyb2xscyAoZGVmYXVsdDogMjAwKSAqL1xuICBwb3BvdmVyTWF4SGVpZ2h0PzogbnVtYmVyO1xufVxuXG5sZXQgY2hpcFN0eWxlc0luamVjdGVkID0gZmFsc2U7XG5mdW5jdGlvbiBpbmplY3RDaGlwU3R5bGVzKCk6IHZvaWQge1xuICBpZiAoY2hpcFN0eWxlc0luamVjdGVkKSByZXR1cm47XG4gIGNoaXBTdHlsZXNJbmplY3RlZCA9IHRydWU7XG5cbiAgY29uc3Qgc3R5bGVJZCA9ICduaWxlLWNoaXAtZWRpdG9yLXN0eWxlcyc7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHlsZUlkKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUuaWQgPSBzdHlsZUlkO1xuICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAuc3QtY2hpcC1wb3BvdmVyIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHotaW5kZXg6IDEwMDAwO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tbmlsZS1jb2xvcnMtd2hpdGUtYmFzZSwgI2ZmZik7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1uaWxlLWNvbG9ycy1uZXV0cmFsLTIwMCwgI2UyZThmMCk7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gICAgICBwYWRkaW5nOiA4cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgbWF4LWhlaWdodDogMjAwcHg7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIH1cbiAgICAuc3QtY2hpcC1wb3BvdmVyIG5pbGUtY2hpcCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgLnN0LWNoaXAtcG9wb3ZlciBuaWxlLWNoaXA6OnBhcnQoYmFzZSkge1xuICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBtaW4taGVpZ2h0OiAzMnB4O1xuICAgIH1cbiAgICAuc3QtY2hpcC1wb3BvdmVyIG5pbGUtY2hpcDo6cGFydChpbnB1dCkge1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1uaWxlLWZvbnQtc2l6ZS1zbWFsbCwgMTNweCk7XG4gICAgfVxuICBgO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cblxuLyoqXG4gKiBDdXN0b20gZWRpdG9yIHRoYXQgdXNlcyBOaWxlQ2hpcCAodGFnIGlucHV0KSBjb21wb25lbnQuXG4gKiBSZW5kZXJzIGluIGEgZmxvYXRpbmcgcG9wb3ZlciBiZWxvdyB0aGUgY2VsbCB0byBhdm9pZCBleHBhbmRpbmcgcm93IGhlaWdodC5cbiAqXG4gKiBDZWxsIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGBzdHJpbmdbXWAgKGFycmF5IG9mIHRhZyBzdHJpbmdzKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5pbGVDaGlwRWRpdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvcjxzdHJpbmdbXT4ge1xuICBhY2NlcHRzSW5pdGlhbEtleXByZXNzID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjaGlwPzogYW55O1xuICBwcml2YXRlIHBvcG92ZXI/OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSBjZWxsQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IEFycmF5PHsgZWxlbWVudDogRXZlbnRUYXJnZXQ7IGV2ZW50OiBzdHJpbmc7IGhhbmRsZXI6IEV2ZW50TGlzdGVuZXI7IGNhcHR1cmU/OiBib29sZWFuIH0+ID0gW107XG4gIHByaXZhdGUgdHJhY2tlZFZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBoYXNDaGFuZ2VPY2N1cnJlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IE5pbGVDaGlwRWRpdG9yT3B0aW9ucykge31cblxuICBlZGl0KGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PHN0cmluZ1tdPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignTmlsZUNoaXBFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluamVjdENoaXBTdHlsZXMoKTtcblxuICAgIHRoaXMuY2VsbENvbnRhaW5lciA9IGNvbnRleHQuY29udGFpbmVyO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBmbG9hdGluZyBwb3BvdmVyXG4gICAgdGhpcy5wb3BvdmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5wb3BvdmVyLmNsYXNzTmFtZSA9ICdzdC1jaGlwLXBvcG92ZXInO1xuXG4gICAgLy8gQ3JlYXRlIG5pbGUtY2hpcCBpbnNpZGUgdGhlIHBvcG92ZXJcbiAgICB0aGlzLmNoaXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWNoaXAnKTtcbiAgICB0aGlzLmNoaXAuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yIHN0LW5pbGUtY2hpcC1lZGl0b3InO1xuXG4gICAgdGhpcy5zZXRJbml0aWFsVmFsdWUoY29udGV4dC52YWx1ZSk7XG4gICAgdGhpcy5hcHBseU9wdGlvbnMoKTtcbiAgICB0aGlzLnBvcG92ZXIuYXBwZW5kQ2hpbGQodGhpcy5jaGlwKTtcblxuICAgIC8vIEFwcGx5IGN1c3RvbSBtYXgtaGVpZ2h0IGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucG9wb3Zlck1heEhlaWdodCkge1xuICAgICAgdGhpcy5wb3BvdmVyLnN0eWxlLm1heEhlaWdodCA9IGAke3RoaXMub3B0aW9ucy5wb3BvdmVyTWF4SGVpZ2h0fXB4YDtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcG9wb3ZlciB0byBib2R5IGFuZCBwb3NpdGlvbiBpdFxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5wb3BvdmVyKTtcbiAgICB0aGlzLnBvc2l0aW9uUG9wb3ZlcigpO1xuXG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYXV0b0ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRyeSB7IHRoaXMuY2hpcD8uZm9jdXMoKTsgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uUG9wb3ZlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucG9wb3ZlciB8fCAhdGhpcy5jZWxsQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5jZWxsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1pbldpZHRoID0gdGhpcy5vcHRpb25zPy5wb3BvdmVyTWluV2lkdGggPz8gcmVjdC53aWR0aDtcbiAgICBjb25zdCBwb3BvdmVyV2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgcmVjdC53aWR0aCk7XG5cbiAgICB0aGlzLnBvcG92ZXIuc3R5bGUudG9wID0gYCR7cmVjdC5ib3R0b20gKyAyfXB4YDtcbiAgICB0aGlzLnBvcG92ZXIuc3R5bGUubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XG4gICAgdGhpcy5wb3BvdmVyLnN0eWxlLndpZHRoID0gYCR7cG9wb3ZlcldpZHRofXB4YDtcblxuICAgIC8vIEFmdGVyIHJlbmRlcmluZywgY2hlY2sgaWYgaXQgZ29lcyBvZmYtc2NyZWVuIGJvdHRvbSBhbmQgZmxpcCBhYm92ZSBpZiBuZWVkZWRcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnBvcG92ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHBvcFJlY3QgPSB0aGlzLnBvcG92ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAocG9wUmVjdC5ib3R0b20gPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyLnN0eWxlLnRvcCA9IGAke3JlY3QudG9wIC0gcG9wUmVjdC5oZWlnaHQgLSAyfXB4YDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5pdGlhbFZhbHVlKHZhbHVlOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGlwKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB0aGlzLnRyYWNrZWRWYWx1ZXMgPSBbLi4udmFsdWVdO1xuICAgICAgdGhpcy5jaGlwLnZhbHVlID0gdGhpcy50cmFja2VkVmFsdWVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSkge1xuICAgICAgdGhpcy50cmFja2VkVmFsdWVzID0gW3ZhbHVlXTtcbiAgICAgIHRoaXMuY2hpcC52YWx1ZSA9IHRoaXMudHJhY2tlZFZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFja2VkVmFsdWVzID0gW107XG4gICAgICB0aGlzLmNoaXAudmFsdWUgPSBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5T3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hpcCB8fCAhdGhpcy5vcHRpb25zKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLmNoaXAucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbCkge1xuICAgICAgdGhpcy5jaGlwLmxhYmVsID0gdGhpcy5vcHRpb25zLmxhYmVsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaGVscFRleHQpIHtcbiAgICAgIHRoaXMuY2hpcC5oZWxwVGV4dCA9IHRoaXMub3B0aW9ucy5oZWxwVGV4dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5kaXNhYmxlZCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRvbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5yZWFkb25seSA9IHRoaXMub3B0aW9ucy5yZWFkb25seTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmFjY2VwdFVzZXJJbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAuYWNjZXB0VXNlcklucHV0ID0gdGhpcy5vcHRpb25zLmFjY2VwdFVzZXJJbnB1dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm5vRHVwbGljYXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAubm9EdXBsaWNhdGVzID0gdGhpcy5vcHRpb25zLm5vRHVwbGljYXRlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNsZWFyYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAuY2xlYXJhYmxlID0gdGhpcy5vcHRpb25zLmNsZWFyYWJsZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm5vV3JhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNoaXAubm9XcmFwID0gdGhpcy5vcHRpb25zLm5vV3JhcDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm5vQXV0b0NvbXBsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC5ub0F1dG9Db21wbGV0ZSA9IHRoaXMub3B0aW9ucy5ub0F1dG9Db21wbGV0ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZVZpcnR1YWxTY3JvbGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLmVuYWJsZVZpcnR1YWxTY3JvbGwgPSB0aGlzLm9wdGlvbnMuZW5hYmxlVmlydHVhbFNjcm9sbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm9wZW5Ecm9wZG93bk9uRm9jdXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLm9wZW5Ecm9wZG93bk9uRm9jdXMgPSB0aGlzLm9wdGlvbnMub3BlbkRyb3Bkb3duT25Gb2N1cztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmxvYWRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLmxvYWRpbmcgPSB0aGlzLm9wdGlvbnMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBWaXN1YWwgc3RhdGVzXG4gICAgaWYgKHRoaXMub3B0aW9ucy53YXJuaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hpcC53YXJuaW5nID0gdGhpcy5vcHRpb25zLndhcm5pbmc7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLmVycm9yID0gdGhpcy5vcHRpb25zLmVycm9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnN1Y2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGlwLnN1Y2Nlc3MgPSB0aGlzLm9wdGlvbnMuc3VjY2VzcztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuY2hpcC5lcnJvck1lc3NhZ2UgPSB0aGlzLm9wdGlvbnMuZXJyb3JNZXNzYWdlO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmVycm9ySW5kZXhlcykge1xuICAgICAgdGhpcy5jaGlwLmVycm9ySW5kZXhlcyA9IHRoaXMub3B0aW9ucy5lcnJvckluZGV4ZXM7XG4gICAgfVxuXG4gICAgLy8gQXV0b2NvbXBsZXRlIG9wdGlvbnNcbiAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Db21wbGV0ZU9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMuYXV0b0NvbXBsZXRlT3B0aW9ucztcbiAgICAgIGNvbnN0IHN0cmluZ09wdHM6IHN0cmluZ1tdID0gb3B0cy5tYXAobyA9PiB0eXBlb2YgbyA9PT0gJ3N0cmluZycgPyBvIDogKG8ubGFiZWwgPz8gby52YWx1ZSkpO1xuICAgICAgdGhpcy5jaGlwLmF1dG9Db21wbGV0ZU9wdGlvbnMgPSBzdHJpbmdPcHRzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuY2hpcC5maWx0ZXJGdW5jdGlvbiA9IHRoaXMub3B0aW9ucy5maWx0ZXJGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJlbmRlckl0ZW1GdW5jdGlvbikge1xuICAgICAgdGhpcy5jaGlwLnJlbmRlckl0ZW1GdW5jdGlvbiA9IHRoaXMub3B0aW9ucy5yZW5kZXJJdGVtRnVuY3Rpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRMaXN0ZW5lcihlbGVtZW50OiBFdmVudFRhcmdldCwgZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciwgY2FwdHVyZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBjYXB0dXJlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PHN0cmluZ1tdPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGlwKSByZXR1cm47XG5cbiAgICAvLyBUcmFjayBjaGlwIGNoYW5nZXNcbiAgICB0aGlzLmFkZExpc3RlbmVyKHRoaXMuY2hpcCwgJ25pbGUtY2hpcC1jaGFuZ2UnLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRldGFpbCA9IChlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgICBjb25zdCBuZXdWYWx1ZTogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGRldGFpbD8udmFsdWUpID8gWy4uLmRldGFpbC52YWx1ZV0gOiAodGhpcy5jaGlwPy52YWx1ZSA/IFsuLi50aGlzLmNoaXAudmFsdWVdIDogW10pO1xuICAgICAgdGhpcy50cmFja2VkVmFsdWVzID0gbmV3VmFsdWU7XG4gICAgICB0aGlzLmhhc0NoYW5nZU9jY3VycmVkID0gdHJ1ZTtcbiAgICAgIGNvbnRleHQub25DaGFuZ2UobmV3VmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLy8gS2V5Ym9hcmQgaGFuZGxpbmcgb24gdGhlIGNoaXAgZWxlbWVudFxuICAgIHRoaXMuYWRkTGlzdGVuZXIodGhpcy5jaGlwLCAna2V5ZG93bicsIChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBlIGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSBlbHNlIGlmIChrZXlFdmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9IGVsc2UgaWYgKGtleUV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2xpY2stb3V0c2lkZTogc2F2ZSB3aGVuIGNsaWNraW5nIGFueXdoZXJlIG91dHNpZGUgdGhlIHBvcG92ZXJcbiAgICBsZXQgc2F2ZVRyaWdnZXJlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG1vdXNlZG93bkhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKHNhdmVUcmlnZ2VyZWQpIHJldHVybjtcbiAgICAgIGlmICghdGhpcy5wb3BvdmVyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBhdGggPSBlLmNvbXBvc2VkUGF0aCgpO1xuICAgICAgZm9yIChjb25zdCBlbCBvZiBwYXRoKSB7XG4gICAgICAgIGlmIChlbCA9PT0gdGhpcy5wb3BvdmVyKSByZXR1cm47XG4gICAgICAgIGlmIChlbCA9PT0gdGhpcy5jaGlwKSByZXR1cm47XG4gICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKGVsLnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICduaWxlLWNoaXAnKSByZXR1cm47XG4gICAgICAgICAgaWYgKGVsLmNsYXNzTmFtZSAmJiB0eXBlb2YgZWwuY2xhc3NOYW1lID09PSAnc3RyaW5nJyAmJiBlbC5jbGFzc05hbWUuaW5jbHVkZXMoJ25pbGUtY2hpcCcpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2F2ZVRyaWdnZXJlZCA9IHRydWU7XG4gICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgbW91c2Vkb3duSGFuZGxlciwgdHJ1ZSk7XG4gICAgKHRoaXMgYXMgYW55KS5fZG9jdW1lbnRNb3VzZWRvd25IYW5kbGVyID0gbW91c2Vkb3duSGFuZGxlcjtcblxuICAgIC8vIFJlcG9zaXRpb24gb24gc2Nyb2xsL3Jlc2l6ZSBzbyBwb3BvdmVyIHN0YXlzIGFsaWduZWQgd2l0aCB0aGUgY2VsbFxuICAgIGNvbnN0IHJlcG9zaXRpb24gPSAoKSA9PiB0aGlzLnBvc2l0aW9uUG9wb3ZlcigpO1xuICAgIHRoaXMuYWRkTGlzdGVuZXIod2luZG93LCAncmVzaXplJywgcmVwb3NpdGlvbik7XG4gICAgdGhpcy5hZGRMaXN0ZW5lcih3aW5kb3csICdzY3JvbGwnLCByZXBvc2l0aW9uLCB0cnVlKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGRvY3VtZW50IG1vdXNlZG93biBoYW5kbGVyXG4gICAgaWYgKCh0aGlzIGFzIGFueSkuX2RvY3VtZW50TW91c2Vkb3duSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKHRoaXMgYXMgYW55KS5fZG9jdW1lbnRNb3VzZWRvd25IYW5kbGVyLCB0cnVlKTtcbiAgICAgIGRlbGV0ZSAodGhpcyBhcyBhbnkpLl9kb2N1bWVudE1vdXNlZG93bkhhbmRsZXI7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB0cmFja2VkIGxpc3RlbmVyc1xuICAgIGZvciAoY29uc3QgeyBlbGVtZW50LCBldmVudCwgaGFuZGxlciwgY2FwdHVyZSB9IG9mIHRoaXMuZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY2FwdHVyZSk7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcG9wb3ZlciBmcm9tIHRoZSBET01cbiAgICBpZiAodGhpcy5wb3BvdmVyKSB7XG4gICAgICB0aGlzLnBvcG92ZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLnBvcG92ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5jaGlwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2VsbENvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRyYWNrZWRWYWx1ZXMgPSBbXTtcbiAgICB0aGlzLmhhc0NoYW5nZU9jY3VycmVkID0gZmFsc2U7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0cnkgeyB0aGlzLmNoaXA/LmZvY3VzKCk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfVxuICB9XG5cbiAgZ2V0Q3VycmVudFZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5oYXNDaGFuZ2VPY2N1cnJlZCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLnRyYWNrZWRWYWx1ZXNdO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hpcCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuY2hpcC52YWx1ZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gWy4uLnZhbF0gOiBbXTtcbiAgfVxufVxuIl19