@aquera/ngx-smart-table 0.0.14-alpha → 0.0.15-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.
@@ -14,6 +14,8 @@ export class NileSelectEditor {
14
14
  this.eventListeners = [];
15
15
  this.currentOptions = [];
16
16
  this.isInitializing = false; // Flag to prevent immediate close during initialization
17
+ this.hasSaved = false; // Flag to prevent double-save
18
+ this.lastSelectedValue = ''; // Track the last selected value
17
19
  // Handle Observable options
18
20
  if (isObservable(options.options)) {
19
21
  this.optionsSubscription = options.options.subscribe(opts => {
@@ -110,6 +112,8 @@ export class NileSelectEditor {
110
112
  }
111
113
  // Set initializing flag to prevent immediate close
112
114
  this.isInitializing = true;
115
+ this.hasSaved = false;
116
+ this.lastSelectedValue = '';
113
117
  // Create NileSelect custom element using document.createElement
114
118
  this.select = document.createElement('nile-select');
115
119
  this.select.className = 'st-cell-editor';
@@ -316,12 +320,29 @@ export class NileSelectEditor {
316
320
  return;
317
321
  const validateOnSave = this.options.validateOnSave !== false;
318
322
  // Prevent click events from bubbling up to the cell container
319
- // This prevents parent handlers from interfering with nile-select's toggle
320
- const clickHandler = (e) => {
323
+ const selectClickHandler = (e) => {
321
324
  e.stopPropagation();
322
325
  };
323
- this.select.addEventListener('click', clickHandler);
324
- this.eventListeners.push({ event: 'click', handler: clickHandler });
326
+ this.select.addEventListener('click', selectClickHandler);
327
+ this.eventListeners.push({ event: 'click', handler: selectClickHandler });
328
+ // For single-select with portal, listen to document mousedown to detect option selection
329
+ // Use mousedown because it fires before blur
330
+ if (!this.options.multiple) {
331
+ const documentMouseDownHandler = (e) => {
332
+ const composedPath = e.composedPath?.() || [];
333
+ // Look for nile-option in the event path
334
+ for (const el of composedPath) {
335
+ if (el instanceof HTMLElement && el.tagName?.toLowerCase() === 'nile-option') {
336
+ const optionValue = el.getAttribute('value') || el.value || '';
337
+ this.lastSelectedValue = optionValue;
338
+ return;
339
+ }
340
+ }
341
+ };
342
+ // Add listener immediately (mousedown fires before blur, so no need for delay)
343
+ document.addEventListener('mousedown', documentMouseDownHandler, true); // capture phase
344
+ this.eventListeners.push({ event: 'document-mousedown', handler: documentMouseDownHandler });
345
+ }
325
346
  // Handle keyboard events (keydown is not replaced by custom events)
326
347
  const keydownHandler = (e) => {
327
348
  const keyEvent = e;
@@ -333,43 +354,45 @@ export class NileSelectEditor {
333
354
  };
334
355
  this.select.addEventListener('keydown', keydownHandler);
335
356
  this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
336
- // Use nile-change custom event as primary save trigger
337
- const changeHandler = (e) => {
338
- // Ignore change events during initialization (can fire when setting initial value)
339
- if (this.isInitializing) {
357
+ // Use nile-blur event as save trigger for single-select
358
+ // Add a small delay to allow the value to update before reading
359
+ const singleSelectSaveHandler = (e) => {
360
+ // Don't save again if already saved
361
+ // Ignore events that fire during initialization (e.g. when setting initial value)
362
+ if (this.hasSaved || this.isInitializing) {
340
363
  return;
341
364
  }
342
- const customEvent = e;
343
- if (validateOnSave && !this.select?.checkValidity()) {
344
- this.select?.reportValidity();
345
- return;
346
- }
347
- // Only save immediately for single-select
348
- // Multi-select saves on outside click
365
+ // Only save for single-select
349
366
  if (!this.options.multiple) {
350
- context.onSave(this.parseValue(customEvent.detail.value));
351
- }
352
- };
353
- this.select.addEventListener('nile-change', changeHandler);
354
- this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
355
- // Handle blur as secondary save trigger - only for single-select
356
- // Multi-select uses hide event instead
357
- const blurHandler = (e) => {
358
- // Ignore blur during initialization
359
- if (this.isInitializing) {
360
- return;
361
- }
362
- if (validateOnSave && !this.select?.checkValidity()) {
363
- this.select?.reportValidity();
364
- return;
365
- }
366
- // For single-select, save on blur (when clicking outside)
367
- if (!this.options.multiple) {
368
- context.onSave(this.getCurrentValue());
367
+ // Add a small delay to let the value update after selection
368
+ setTimeout(() => {
369
+ // Check again after timeout in case saved by another handler
370
+ if (this.hasSaved) {
371
+ return;
372
+ }
373
+ if (validateOnSave && !this.select?.checkValidity()) {
374
+ this.select?.reportValidity();
375
+ return;
376
+ }
377
+ // Use lastSelectedValue if available, otherwise get from element
378
+ const target = e.target;
379
+ const value = this.lastSelectedValue || target?.value || this.select?.value || '';
380
+ this.hasSaved = true;
381
+ context.onSave(this.parseValue(value));
382
+ }, 50); // 50ms delay to allow value to update
369
383
  }
370
384
  };
371
- this.select.addEventListener('nile-blur', blurHandler);
372
- this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
385
+ // Listen to blur and nile-blur events for focus loss detection
386
+ // Nile web components emit nile-blur custom event instead of native blur
387
+ this.select.addEventListener('blur', singleSelectSaveHandler);
388
+ this.eventListeners.push({ event: 'blur', handler: singleSelectSaveHandler });
389
+ this.select.addEventListener('nile-blur', singleSelectSaveHandler);
390
+ this.eventListeners.push({ event: 'nile-blur', handler: singleSelectSaveHandler });
391
+ // Also listen to change events as fallback
392
+ this.select.addEventListener('nile-change', singleSelectSaveHandler);
393
+ this.eventListeners.push({ event: 'nile-change', handler: singleSelectSaveHandler });
394
+ this.select.addEventListener('change', singleSelectSaveHandler);
395
+ this.eventListeners.push({ event: 'change', handler: singleSelectSaveHandler });
373
396
  // Handle clear button if enabled
374
397
  if (this.options.clearable) {
375
398
  const clearHandler = (e) => {
@@ -444,8 +467,10 @@ export class NileSelectEditor {
444
467
  return value;
445
468
  }
446
469
  destroy() {
447
- // Reset initialization flag
470
+ // Reset flags
448
471
  this.isInitializing = false;
472
+ this.hasSaved = false;
473
+ this.lastSelectedValue = '';
449
474
  // Unsubscribe from options Observable
450
475
  if (this.optionsSubscription) {
451
476
  this.optionsSubscription.unsubscribe();
@@ -458,6 +483,10 @@ export class NileSelectEditor {
458
483
  // Remove from document for multi-select click handler (bubbling phase)
459
484
  document.removeEventListener('click', handler, false);
460
485
  }
486
+ else if (event === 'document-mousedown') {
487
+ // Remove from document for single-select option mousedown handler (capture phase)
488
+ document.removeEventListener('mousedown', handler, true);
489
+ }
461
490
  else {
462
491
  // Remove from select element
463
492
  this.select?.removeEventListener(event, handler);
@@ -486,4 +515,4 @@ export class NileSelectEditor {
486
515
  }
487
516
  }
488
517
  NileSelectEditor.stylesInjected = false;
489
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1zZWxlY3QtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9lZGl0b3JzL25pbGUtc2VsZWN0LWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFHSCxPQUFPLEVBQTRCLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQW1GOUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQW9GM0IsWUFBNkIsT0FBZ0M7UUFBaEMsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFuRjdELDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUt2QixtQkFBYyxHQUFxRCxFQUFFLENBQUM7UUFFdEUsbUJBQWMsR0FBOEIsRUFBRSxDQUFDO1FBQy9DLG1CQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsd0RBQXdEO1FBNEV0Riw0QkFBNEI7UUFDNUIsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLDhDQUE4QztnQkFDOUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNmLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDdEI7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxpQkFBaUI7WUFDakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzFEO1NBQ0Y7SUFDSCxDQUFDO0lB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QUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFpQixDQUFDO1NBQ2pFO1FBRUQsMEJBQTBCO1FBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQWlCLENBQUM7SUFDN0YsQ0FBQzs7QUE5aEJjLCtCQUFjLEdBQUcsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXN0b20gZWRpdG9yIHVzaW5nIE5pbGVTZWxlY3QgZnJvbSBAYXF1ZXJhL25pbGUtZWxlbWVudHNcbiAqIFRoaXMgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgZHJvcGRvd24vc2VsZWN0IGVkaXRvcnMgZm9yIG5neC1zbWFydC10YWJsZVxuICovXG5cbmltcG9ydCB7IENlbGxFZGl0b3IsIENlbGxFZGl0b3JDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzL2NlbGwtc3RyYXRlZ2llcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBpc09ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBTZWxlY3Qgb3B0aW9uIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RPcHRpb24ge1xuICAvKiogVGhlIG9wdGlvbidzIHZhbHVlICovXG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3B0aW9uICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWQgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgcHJlZml4IGljb24gb3IgY29udGVudCAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBpbnRlcmZhY2UgZm9yIE5pbGVTZWxlY3RFZGl0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOaWxlU2VsZWN0RWRpdG9yT3B0aW9ucyB7XG4gIC8vIE9wdGlvbnMgY29uZmlndXJhdGlvbiAoUkVRVUlSRUQpXG4gIC8qKiBBcnJheSBvZiBvcHRpb25zIC0gc3VwcG9ydHMgc3RhdGljIGFycmF5cywgT2JzZXJ2YWJsZSwgb3IgQmVoYXZpb3JTdWJqZWN0IGZvciByZWFjdGl2ZSB1cGRhdGVzICovXG4gIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdIHwgc3RyaW5nW10gfCBPYnNlcnZhYmxlPFNlbGVjdE9wdGlvbltdIHwgc3RyaW5nW10+O1xuICBcbiAgLy8gQmFzaWMgcHJvcGVydGllc1xuICAvKiogUGxhY2Vob2xkZXIgdGV4dCB3aGVuIG5vIHNlbGVjdGlvbiBpcyBtYWRlICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKiogU2l6ZSBvZiB0aGUgc2VsZWN0IGNvbnRyb2wgKi9cbiAgc2l6ZT86ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZSc7XG4gIC8qKiBFbmFibGUgbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGUgKi9cbiAgbXVsdGlwbGU/OiBib29sZWFuO1xuICBcbiAgLy8gQmVoYXZpb3Igb3B0aW9uc1xuICAvKiogQWRkcyBjbGVhciBidXR0b24gd2hlbiB2YWx1ZSBpcyBub3QgZW1wdHkgKi9cbiAgY2xlYXJhYmxlPzogYm9vbGVhbjtcbiAgLyoqIERpc2FibGUgdGhlIHNlbGVjdCBjb250cm9sICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIE1ha2UgdGhlIHNlbGVjdCByZXF1aXJlZCAqL1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgKi9cbiAgc2VhcmNoRW5hYmxlZD86IGJvb2xlYW47XG4gIFxuICAvLyBWaXN1YWwgc3RhdGVzXG4gIC8qKiBXYXJuaW5nIHN0YXRlIHN0eWxpbmcgKi9cbiAgd2FybmluZz86IGJvb2xlYW47XG4gIC8qKiBFcnJvciBzdGF0ZSBzdHlsaW5nICovXG4gIGVycm9yPzogYm9vbGVhbjtcbiAgLyoqIFN1Y2Nlc3Mgc3RhdGUgc3R5bGluZyAqL1xuICBzdWNjZXNzPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBIZWxwIHRleHQgdG8gZGlzcGxheSAqL1xuICBoZWxwVGV4dD86IHN0cmluZztcbiAgXG4gIC8vIEFkdmFuY2VkIGZlYXR1cmVzXG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBzZWxlY3RlZCBvcHRpb25zIHRvIHNob3cgaW4gbXVsdGlwbGUgbW9kZSAoMCA9IG5vIGxpbWl0KSAqL1xuICBtYXhPcHRpb25zVmlzaWJsZT86IG51bWJlcjtcbiAgLyoqIERyYXdzIGEgZmlsbGVkIHNlbGVjdCBzdHlsZSAqL1xuICBmaWxsZWQ/OiBib29sZWFuO1xuICAvKiogUGlsbC1zdHlsZSB3aXRoIHJvdW5kZWQgZWRnZXMgKi9cbiAgcGlsbD86IGJvb2xlYW47XG4gIC8qKiBVc2UgZml4ZWQgcG9zaXRpb25pbmcgdG8gcHJldmVudCBjbGlwcGluZyAqL1xuICBob2lzdD86IGJvb2xlYW47XG4gIC8qKiBQbGFjZW1lbnQgb2YgdGhlIGRyb3Bkb3duIG1lbnUgKi9cbiAgcGxhY2VtZW50PzogJ3RvcCcgfCAnYm90dG9tJztcbiAgXG4gIC8vIFZpcnR1YWwgc2Nyb2xsIGZvciBsYXJnZSBsaXN0c1xuICAvKiogRW5hYmxlIHZpcnR1YWwgc2Nyb2xsaW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBtYW55IG9wdGlvbnMgKi9cbiAgZW5hYmxlVmlydHVhbFNjcm9sbD86IGJvb2xlYW47XG4gIFxuICAvLyBTZWFyY2ggY29uZmlndXJhdGlvblxuICAvKiogRGlzYWJsZSBsb2NhbCBzZWFyY2ggKHVzZSBmb3Igc2VydmVyLXNpZGUgc2VhcmNoKSAqL1xuICBkaXNhYmxlTG9jYWxTZWFyY2g/OiBib29sZWFuO1xuICBcbiAgLy8gVmFsaWRhdGlvblxuICAvKiogVmFsaWRhdGUgYmVmb3JlIHNhdmluZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgdmFsaWRhdGVPblNhdmU/OiBib29sZWFuO1xuICBcbiAgLy8gUG9ydGFsIG9wdGlvbnNcbiAgLyoqIEFwcGVuZCBkcm9wZG93biB0byBkb2N1bWVudCBib2R5IGluc3RlYWQgb2YgcGFyZW50ICovXG4gIHBvcnRhbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ3VzdG9tIGVkaXRvciB0aGF0IHVzZXMgTmlsZVNlbGVjdCBjb21wb25lbnRcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB2YWx1ZSB0eXBlIChzdHJpbmcgZm9yIHNpbmdsZSBzZWxlY3Rpb24sIHN0cmluZ1tdIGZvciBtdWx0aXBsZSlcbiAqL1xuZXhwb3J0IGNsYXNzIE5pbGVTZWxlY3RFZGl0b3I8VCA9IHN0cmluZz4gaW1wbGVtZW50cyBDZWxsRWRpdG9yPFQ+IHtcbiAgYWNjZXB0c0luaXRpYWxLZXlwcmVzcyA9IGZhbHNlO1xuICBcbiAgcHJpdmF0ZSBzdGF0aWMgc3R5bGVzSW5qZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzZWxlY3Q/OiBhbnk7XG4gIHByaXZhdGUgcG9ydGFsRGl2PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IEFycmF5PHsgZXZlbnQ6IHN0cmluZzsgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciB9PiA9IFtdO1xuICBwcml2YXRlIG9wdGlvbnNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgY3VycmVudE9wdGlvbnM6IChTZWxlY3RPcHRpb24gfCBzdHJpbmcpW10gPSBbXTtcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemluZyA9IGZhbHNlOyAvLyBGbGFnIHRvIHByZXZlbnQgaW1tZWRpYXRlIGNsb3NlIGR1cmluZyBpbml0aWFsaXphdGlvblxuXG4gIC8qKlxuICAgKiBJbmplY3QgZ2xvYmFsIHN0eWxlcyB0byByZW1vdmUgYm9yZGVyIGZyb20gbmlsZS1zZWxlY3QgY29tYm9ib3hcbiAgICogVXNlcyA6OnBhcnQgc2VsZWN0b3Igd2hpY2ggd29ya3MgYWNyb3NzIHNoYWRvdyBET00gYm91bmRhcmllc1xuICAgKi9cbiAgcHJpdmF0ZSBpbmplY3RCb3JkZXJsZXNzU3R5bGVzKCk6IHZvaWQge1xuICAgIGlmIChOaWxlU2VsZWN0RWRpdG9yLnN0eWxlc0luamVjdGVkKSByZXR1cm47XG4gICAgXG4gICAgY29uc3Qgc3R5bGVJZCA9ICduaWxlLXNlbGVjdC1ib3JkZXJsZXNzLXN0eWxlcyc7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0eWxlSWQpKSB7XG4gICAgICBOaWxlU2VsZWN0RWRpdG9yLnN0eWxlc0luamVjdGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLmlkID0gc3R5bGVJZDtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgIC5zdC1jZWxsLWVkaXRvcjo6cGFydChjb21ib2JveCkge1xuICAgICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgIG1pbi1oZWlnaHQ6IHVuc2V0ICFpbXBvcnRhbnQ7XG4gICAgICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xuICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgICAuc3QtY2VsbC1lZGl0b3I6OnBhcnQoY29tYm9ib3gpOmhvdmVyIHtcbiAgICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgICAgLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KGNvbWJvYm94KTpmb2N1cyB7XG4gICAgICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICAgIC8vIC5zdC1jZWxsLWVkaXRvcjo6cGFydCh0YWcpIHtcbiAgICAgIC8vICAgbWFyZ2luOiAxcHggMnB4ICFpbXBvcnRhbnQ7XG4gICAgICAvLyAgIGJvcmRlci1yYWRpdXM6IDNweCAhaW1wb3J0YW50O1xuICAgICAgLy8gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlOGYwICFpbXBvcnRhbnQ7XG4gICAgICAvLyAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICAgICAgLy8gICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICAgIC8vIH1cbiAgICAgIC8vIC5zdC1jZWxsLWVkaXRvcjo6cGFydCh0YWdfX2Jhc2UpIHtcbiAgICAgIC8vICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAvLyAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIC8vICAgcGFkZGluZzogMCAycHggIWltcG9ydGFudDtcbiAgICAgIC8vICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICAvLyB9XG4gICAgICAvLyAuc3QtY2VsbC1lZGl0b3I6OnBhcnQodGFnX19jb250ZW50KSB7XG4gICAgICAvLyAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICAgIC8vIH1cbiAgICAgIC5zdC1jZWxsLWVkaXRvcjo6cGFydCh0YWdzKSB7XG4gICAgICAgIGdhcDogMnB4ICFpbXBvcnRhbnQ7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICAgIC5zdC1jZWxsLWVkaXRvcjo6cGFydCh0YWdzLWNvdW50KSB7XG4gICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgICAgLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KGZvb3Rlcikge1xuICAgICAgICBoZWlnaHQ6IDM1cHggIWltcG9ydGFudDtcbiAgICAgICAgbWluLWhlaWdodDogMzVweCAhaW1wb3J0YW50O1xuICAgICAgICBwYWRkaW5nOiA4cHggIWltcG9ydGFudDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDMwcHggIWltcG9ydGFudDtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgICAgLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KGxpc3Rib3gpIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgIGA7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgTmlsZVNlbGVjdEVkaXRvci5zdHlsZXNJbmplY3RlZCA9IHRydWU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE5pbGVTZWxlY3RFZGl0b3JPcHRpb25zKSB7XG4gICAgLy8gSGFuZGxlIE9ic2VydmFibGUgb3B0aW9uc1xuICAgIGlmIChpc09ic2VydmFibGUob3B0aW9ucy5vcHRpb25zKSkge1xuICAgICAgdGhpcy5vcHRpb25zU3Vic2NyaXB0aW9uID0gb3B0aW9ucy5vcHRpb25zLnN1YnNjcmliZShvcHRzID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50T3B0aW9ucyA9IG9wdHM7XG4gICAgICAgIC8vIElmIGVkaXRvciBpcyBhbHJlYWR5IGFjdGl2ZSwgdXBkYXRlIHRoZSBET01cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVPcHRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGF0aWMgb3B0aW9uc1xuICAgICAgdGhpcy5jdXJyZW50T3B0aW9ucyA9IG9wdGlvbnMub3B0aW9ucyB8fCBbXTtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRPcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ05pbGVTZWxlY3RFZGl0b3I6IG9wdGlvbnMgYXJyYXkgaXMgZW1wdHknKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlZGl0KGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+KTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdOaWxlU2VsZWN0RWRpdG9yIHJlcXVpcmVzIGEgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZXQgaW5pdGlhbGl6aW5nIGZsYWcgdG8gcHJldmVudCBpbW1lZGlhdGUgY2xvc2VcbiAgICB0aGlzLmlzSW5pdGlhbGl6aW5nID0gdHJ1ZTtcblxuICAgIC8vIENyZWF0ZSBOaWxlU2VsZWN0IGN1c3RvbSBlbGVtZW50IHVzaW5nIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICB0aGlzLnNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtc2VsZWN0Jyk7XG4gICAgdGhpcy5zZWxlY3QuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yJztcbiAgICBcbiAgICAvLyBBcHBseSBpbmxpbmUgc3R5bGVzIGZvciBwcm9wZXIgY2VsbCBmaXR0aW5nIC0gcHJldmVudCBoZWlnaHQgY2hhbmdlc1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLndpZHRoID0gJ2NhbGMoMTAwJSAtIDRweCknO1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICB0aGlzLnNlbGVjdC5zdHlsZS5tYXhIZWlnaHQgPSAnMTAwJSc7XG4gICAgdGhpcy5zZWxlY3Quc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLm1hcmdpbiA9ICcwIDJweCc7XG4gICAgdGhpcy5zZWxlY3Quc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICBcbiAgICAvLyBJbmplY3Qgc3R5bGVzIHRvIHJlbW92ZSBib3JkZXIgdXNpbmcgOjpwYXJ0IHNlbGVjdG9yXG4gICAgdGhpcy5pbmplY3RCb3JkZXJsZXNzU3R5bGVzKCk7XG4gICAgXG4gICAgLy8gQWxzbyB0cnkgcmVtb3Zpbmcgb3V0bGluZSBvbiBob3N0IGVsZW1lbnRcbiAgICB0aGlzLnNlbGVjdC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLmJvcmRlciA9ICdub25lJztcbiAgICBcbiAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZVxuICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlKGNvbnRleHQudmFsdWUpO1xuXG4gICAgLy8gQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XG5cbiAgICAvLyBDcmVhdGUgYW5kIGFwcGVuZCBvcHRpb25zIHdpdGggY3VycmVudCBvcHRpb25zXG4gICAgdGhpcy5jcmVhdGVBbmRBcHBlbmRPcHRpb25zKHRoaXMuY3VycmVudE9wdGlvbnMpO1xuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0KTtcblxuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIHNlbGVjdFxuICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRleHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0KTtcblxuICAgIC8vIEZvY3VzIGFuZCBhdXRvLW9wZW4gYWZ0ZXIgcmVuZGVyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdD8uZm9jdXMoKTtcbiAgICAgIFxuICAgICAgLy8gQXV0by1vcGVuIHRoZSBkcm9wZG93blxuICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Lm9wZW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBpbml0aWFsaXppbmcgZmxhZyBhZnRlciBkcm9wZG93biBoYXMgb3BlbmVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemluZyA9IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgLy8gRm9yIG11bHRpLXNlbGVjdCwgZmluZCB0aGUgcG9ydGFsIGRpdiBmb3IgY2xpY2sgZGV0ZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgICAgICB0aGlzLnBvcnRhbERpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uaWxlLXNlbGVjdC1wb3J0YWwtYXBwZW5kJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgc2VsZWN0XG4gICAqL1xuICBwcml2YXRlIHNldEluaXRpYWxWYWx1ZSh2YWx1ZTogVCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3QpIHJldHVybjtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBzZWxlY3Rpb24gLSB2YWx1ZSBzaG91bGQgYmUgYXJyYXlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aGlzLnNlbGVjdC52YWx1ZSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNlbGVjdC52YWx1ZSA9IFtTdHJpbmcodmFsdWUpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LnZhbHVlID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBzaW5nbGUgc2VsZWN0aW9uXG4gICAgICB0aGlzLnNlbGVjdC52YWx1ZSA9IHZhbHVlID8gU3RyaW5nKHZhbHVlKSA6ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbGwgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHRoZSBOaWxlU2VsZWN0IGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXBwbHlPcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3QpIHJldHVybjtcblxuICAgIC8vIEJhc2ljIG9wdGlvbnNcbiAgICBpZiAodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLnNlbGVjdC5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNpemUpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnNpemUgPSB0aGlzLm9wdGlvbnMuc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Quc2l6ZSA9ICdzbWFsbCc7IC8vIERlZmF1bHQgZm9yIHRhYmxlIGNlbGxzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5zZWxlY3QubXVsdGlwbGUgPSB0aGlzLm9wdGlvbnMubXVsdGlwbGU7XG4gICAgfVxuXG4gICAgLy8gQmVoYXZpb3Igb3B0aW9uc1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY2xlYXJhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdC5jbGVhcmFibGUgPSB0aGlzLm9wdGlvbnMuY2xlYXJhYmxlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmRpc2FibGVkID0gdGhpcy5vcHRpb25zLmRpc2FibGVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVxdWlyZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnJlcXVpcmVkID0gdGhpcy5vcHRpb25zLnJlcXVpcmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2VhcmNoRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZWxlY3Quc2VhcmNoRW5hYmxlZCA9IHRoaXMub3B0aW9ucy5zZWFyY2hFbmFibGVkO1xuICAgIH1cblxuICAgIC8vIFZpc3VhbCBzdGF0ZXNcbiAgICBpZiAodGhpcy5vcHRpb25zLndhcm5pbmcpIHtcbiAgICAgIHRoaXMuc2VsZWN0Lndhcm5pbmcgPSB0aGlzLm9wdGlvbnMud2FybmluZztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmVycm9yKSB7XG4gICAgICB0aGlzLnNlbGVjdC5lcnJvciA9IHRoaXMub3B0aW9ucy5lcnJvcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnN1Y2Nlc3MgPSB0aGlzLm9wdGlvbnMuc3VjY2VzcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmVycm9yTWVzc2FnZSkge1xuICAgICAgdGhpcy5zZWxlY3QuZXJyb3JNZXNzYWdlID0gdGhpcy5vcHRpb25zLmVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmhlbHBUZXh0KSB7XG4gICAgICB0aGlzLnNlbGVjdC5oZWxwVGV4dCA9IHRoaXMub3B0aW9ucy5oZWxwVGV4dDtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlZCBmZWF0dXJlc1xuICAgIGlmICh0aGlzLm9wdGlvbnMubWF4T3B0aW9uc1Zpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZWxlY3QubWF4T3B0aW9uc1Zpc2libGUgPSB0aGlzLm9wdGlvbnMubWF4T3B0aW9uc1Zpc2libGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5maWxsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZWxlY3QuZmlsbGVkID0gdGhpcy5vcHRpb25zLmZpbGxlZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnBpbGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnBpbGwgPSB0aGlzLm9wdGlvbnMucGlsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmhvaXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmhvaXN0ID0gdGhpcy5vcHRpb25zLmhvaXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IGhvaXN0IHRvIHRydWUgZm9yIGFsbCBzZWxlY3RzIHRvIHByZXZlbnQgY2xpcHBpbmcgaXNzdWVzIGluIHRhYmxlIGNlbGxzXG4gICAgICB0aGlzLnNlbGVjdC5ob2lzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wbGFjZW1lbnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnBsYWNlbWVudCA9IHRoaXMub3B0aW9ucy5wbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICB0aGlzLnNlbGVjdC5lbmFibGVWaXJ0dWFsU2Nyb2xsID0gdGhpcy5vcHRpb25zLmVuYWJsZVZpcnR1YWxTY3JvbGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlTG9jYWxTZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmRpc2FibGVMb2NhbFNlYXJjaCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlTG9jYWxTZWFyY2g7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wb3J0YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZWxlY3QucG9ydGFsID0gdGhpcy5vcHRpb25zLnBvcnRhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3QucG9ydGFsID0gdHJ1ZTsgLy8gRGVmYXVsdCB0byBwb3J0YWwgbW9kZSBmb3IgYmV0dGVyIHBvc2l0aW9uaW5nXG4gICAgfVxuXG4gICAgLy8gUHJldmVudCB3aWR0aCBzeW5jaW5nIGlzc3VlcyBpbiB0YWJsZSBjZWxsc1xuICAgIHRoaXMuc2VsZWN0Lm5vV2lkdGhTeW5jID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgb3B0aW9ucyBkeW5hbWljYWxseSB3aGlsZSBlZGl0b3IgaXMgYWN0aXZlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZU9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2xlYXIgZXhpc3Rpbmcgb3B0aW9uc1xuICAgIHdoaWxlICh0aGlzLnNlbGVjdC5maXJzdENoaWxkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5yZW1vdmVDaGlsZCh0aGlzLnNlbGVjdC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBSZS1hcHBlbmQgd2l0aCBuZXcgb3B0aW9uc1xuICAgIHRoaXMuY3JlYXRlQW5kQXBwZW5kT3B0aW9ucyh0aGlzLmN1cnJlbnRPcHRpb25zKTtcbiAgICBcbiAgICAvLyBUcmlnZ2VyIHVwZGF0ZSBvbiB0aGUgd2ViIGNvbXBvbmVudFxuICAgIGlmICh0aGlzLnNlbGVjdC5yZXF1ZXN0VXBkYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdC5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBOaWxlT3B0aW9uIGVsZW1lbnRzIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgc2VsZWN0XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgdG8gcmVuZGVyXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFuZEFwcGVuZE9wdGlvbnMob3B0aW9uczogKFNlbGVjdE9wdGlvbiB8IHN0cmluZylbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3QpIHJldHVybjtcblxuICAgIG9wdGlvbnMuZm9yRWFjaChvcHQgPT4ge1xuICAgICAgY29uc3QgbmlsZU9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtb3B0aW9uJykgYXMgYW55O1xuXG4gICAgICAvLyBBdXRvLWRldGVjdCBmb3JtYXQ6IHN0cmluZyBvciBTZWxlY3RPcHRpb24gb2JqZWN0XG4gICAgICBpZiAodHlwZW9mIG9wdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmlsZU9wdGlvbi52YWx1ZSA9IG9wdDtcbiAgICAgICAgbmlsZU9wdGlvbi5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgb3B0KTtcbiAgICAgICAgbmlsZU9wdGlvbi50ZXh0Q29udGVudCA9IG9wdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5pbGVPcHRpb24udmFsdWUgPSBvcHQudmFsdWU7XG4gICAgICAgIG5pbGVPcHRpb24uc2V0QXR0cmlidXRlKCd2YWx1ZScsIG9wdC52YWx1ZSk7XG4gICAgICAgIG5pbGVPcHRpb24udGV4dENvbnRlbnQgPSBvcHQubGFiZWw7XG4gICAgICAgIFxuICAgICAgICBpZiAob3B0LmRpc2FibGVkKSB7XG4gICAgICAgICAgbmlsZU9wdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgbmlsZU9wdGlvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBwcmVmaXggaWYgcHJvdmlkZWQgKGNvdWxkIGJlIGljb24gbmFtZSBvciBjb250ZW50KVxuICAgICAgICBpZiAob3B0LnByZWZpeCkge1xuICAgICAgICAgIC8vIG5pbGVPcHRpb24uc2V0QXR0cmlidXRlKCdzbG90JywgJ3ByZWZpeCcpO1xuICAgICAgICAgIC8vIG5pbGVPcHRpb24uaW5uZXJIVE1MID0gYDxuaWxlLWljb24gbmFtZT1cIiR7b3B0LnByZWZpeH1cIj48L25pbGUtaWNvbj5gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0IS5hcHBlbmRDaGlsZChuaWxlT3B0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXAgYWxsIGV2ZW50IGxpc3RlbmVycyB3aXRoIHByb3BlciBjbGVhbnVwIHRyYWNraW5nXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0KSByZXR1cm47XG5cbiAgICBjb25zdCB2YWxpZGF0ZU9uU2F2ZSA9IHRoaXMub3B0aW9ucy52YWxpZGF0ZU9uU2F2ZSAhPT0gZmFsc2U7XG5cbiAgICAvLyBQcmV2ZW50IGNsaWNrIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHVwIHRvIHRoZSBjZWxsIGNvbnRhaW5lclxuICAgIC8vIFRoaXMgcHJldmVudHMgcGFyZW50IGhhbmRsZXJzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBuaWxlLXNlbGVjdCdzIHRvZ2dsZVxuICAgIGNvbnN0IGNsaWNrSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ2NsaWNrJywgaGFuZGxlcjogY2xpY2tIYW5kbGVyIH0pO1xuXG4gICAgLy8gSGFuZGxlIGtleWJvYXJkIGV2ZW50cyAoa2V5ZG93biBpcyBub3QgcmVwbGFjZWQgYnkgY3VzdG9tIGV2ZW50cylcbiAgICBjb25zdCBrZXlkb3duSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBlIGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd25IYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ2tleWRvd24nLCBoYW5kbGVyOiBrZXlkb3duSGFuZGxlciB9KTtcblxuICAgIC8vIFVzZSBuaWxlLWNoYW5nZSBjdXN0b20gZXZlbnQgYXMgcHJpbWFyeSBzYXZlIHRyaWdnZXJcbiAgICBjb25zdCBjaGFuZ2VIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBJZ25vcmUgY2hhbmdlIGV2ZW50cyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKGNhbiBmaXJlIHdoZW4gc2V0dGluZyBpbml0aWFsIHZhbHVlKVxuICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXppbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IGUgYXMgQ3VzdG9tRXZlbnQ7XG4gICAgICBpZiAodmFsaWRhdGVPblNhdmUgJiYgIXRoaXMuc2VsZWN0Py5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Q/LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gT25seSBzYXZlIGltbWVkaWF0ZWx5IGZvciBzaW5nbGUtc2VsZWN0XG4gICAgICAvLyBNdWx0aS1zZWxlY3Qgc2F2ZXMgb24gb3V0c2lkZSBjbGlja1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgICAgY29udGV4dC5vblNhdmUodGhpcy5wYXJzZVZhbHVlKGN1c3RvbUV2ZW50LmRldGFpbC52YWx1ZSkpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1jaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtY2hhbmdlJywgaGFuZGxlcjogY2hhbmdlSGFuZGxlciB9KTtcblxuICAgIC8vIEhhbmRsZSBibHVyIGFzIHNlY29uZGFyeSBzYXZlIHRyaWdnZXIgLSBvbmx5IGZvciBzaW5nbGUtc2VsZWN0XG4gICAgLy8gTXVsdGktc2VsZWN0IHVzZXMgaGlkZSBldmVudCBpbnN0ZWFkXG4gICAgY29uc3QgYmx1ckhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIC8vIElnbm9yZSBibHVyIGR1cmluZyBpbml0aWFsaXphdGlvblxuICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXppbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkYXRlT25TYXZlICYmICF0aGlzLnNlbGVjdD8uY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Py5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBGb3Igc2luZ2xlLXNlbGVjdCwgc2F2ZSBvbiBibHVyICh3aGVuIGNsaWNraW5nIG91dHNpZGUpXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtYmx1cicsIGJsdXJIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtYmx1cicsIGhhbmRsZXI6IGJsdXJIYW5kbGVyIH0pO1xuXG5cbiAgICAvLyBIYW5kbGUgY2xlYXIgYnV0dG9uIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5vcHRpb25zLmNsZWFyYWJsZSkge1xuICAgICAgY29uc3QgY2xlYXJIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMucGFyc2VWYWx1ZSh0aGlzLm9wdGlvbnMubXVsdGlwbGUgPyBbXSA6ICcnKSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1jbGVhcicsIGNsZWFySGFuZGxlcik7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtY2xlYXInLCBoYW5kbGVyOiBjbGVhckhhbmRsZXIgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlYXJjaCBmb3Igc2VydmVyLXNpZGUgc2VhcmNoIHNjZW5hcmlvc1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsU2VhcmNoKSB7XG4gICAgICBjb25zdCBzZWFyY2hIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgICAgLy8gRW1pdCBzZWFyY2ggcXVlcnkgdGhyb3VnaCBvbkNoYW5nZSBmb3IgZXh0ZXJuYWwgaGFuZGxpbmdcbiAgICAgICAgY29udGV4dC5vbkNoYW5nZShjdXN0b21FdmVudC5kZXRhaWwgYXMgVCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1zZWFyY2gnLCBzZWFyY2hIYW5kbGVyKTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1zZWFyY2gnLCBoYW5kbGVyOiBzZWFyY2hIYW5kbGVyIH0pO1xuICAgIH1cblxuICAgIC8vIEZvciBtdWx0aS1zZWxlY3Q6IGRldGVjdCBjbGlja3Mgb3V0c2lkZSBwb3J0YWwgYW5kIHNlbGVjdFxuICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IGRvY3VtZW50Q2xpY2tIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBlIGFzIE1vdXNlRXZlbnQ7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG1vdXNlRXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgcG9ydGFsIGRpdiBleGlzdHMgKG1pZ2h0IHRha2UgYSBtb21lbnQgdG8gcmVuZGVyKVxuICAgICAgICBpZiAoIXRoaXMucG9ydGFsRGl2KSB7XG4gICAgICAgICAgdGhpcy5wb3J0YWxEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubmlsZS1zZWxlY3QtcG9ydGFsLWFwcGVuZCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgY2xpY2sgaXMgaW5zaWRlIHRoZSBzZWxlY3Qgb3IgcG9ydGFsXG4gICAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGVTZWxlY3QgPSB0aGlzLnNlbGVjdD8uY29udGFpbnModGFyZ2V0KTtcbiAgICAgICAgY29uc3QgY2xpY2tlZEluc2lkZVBvcnRhbCA9IHRoaXMucG9ydGFsRGl2Py5jb250YWlucyh0YXJnZXQpO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgY2xpY2tlZCBvdXRzaWRlIGJvdGggc2VsZWN0IGFuZCBwb3J0YWwsIHNhdmUgYW5kIGNsb3NlXG4gICAgICAgIGlmICghY2xpY2tlZEluc2lkZVNlbGVjdCAmJiAhY2xpY2tlZEluc2lkZVBvcnRhbCkge1xuICAgICAgICAgIGlmICh2YWxpZGF0ZU9uU2F2ZSAmJiAhdGhpcy5zZWxlY3Q/LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Q/LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgY2xpY2sgaXMgaW5zaWRlIC0gZG8gbm90aGluZyAoZHJvcGRvd24gc3RheXMgb3BlbilcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIERlbGF5IGFkZGluZyB0aGUgZG9jdW1lbnQgY2xpY2sgaGFuZGxlciB0byBwcmV2ZW50IHRoZSBpbml0aWFsIGNsaWNrIFxuICAgICAgLy8gKHRoYXQgb3BlbmVkIHRoZSBlZGl0b3IpIGZyb20gaW1tZWRpYXRlbHkgdHJpZ2dlcmluZyBpdCBhbmQgY2xvc2luZyB0aGUgZHJvcGRvd25cbiAgICAgIC8vIFVzZSAyMDBtcyB0byBlbnN1cmUgdGhlIGRyb3Bkb3duIGhhcyBmdWxseSBvcGVuZWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IGFkZCBpZiBzZWxlY3Qgc3RpbGwgZXhpc3RzIChlZGl0b3Igbm90IGRlc3Ryb3llZClcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0KSB7XG4gICAgICAgICAgLy8gVXNlIGJ1YmJsaW5nIHBoYXNlIChmYWxzZSkgaW5zdGVhZCBvZiBjYXB0dXJlIHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBuaWxlLXNlbGVjdCdzIHRvZ2dsZVxuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZG9jdW1lbnRDbGlja0hhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBcbiAgICAgICAgICAgIGV2ZW50OiAnZG9jdW1lbnQtY2xpY2snLCAgLy8gVXNlIGN1c3RvbSBuYW1lIHRvIGlkZW50aWZ5IGl0XG4gICAgICAgICAgICBoYW5kbGVyOiBkb2N1bWVudENsaWNrSGFuZGxlciBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdmFsdWUgYmFzZWQgb24gc2VsZWN0aW9uIG1vZGVcbiAgICovXG4gIHByaXZhdGUgcGFyc2VWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pOiBUIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKSB7XG4gICAgICAvLyBFbnN1cmUgYXJyYXkgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHZhbHVlID8gW3ZhbHVlXSA6IFtdKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFNpbmdsZSBzZWxlY3Rpb24gLSByZXR1cm4gc3RyaW5nXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZVswXSA6ICcnKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IGluaXRpYWxpemF0aW9uIGZsYWdcbiAgICB0aGlzLmlzSW5pdGlhbGl6aW5nID0gZmFsc2U7XG4gICAgXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBvcHRpb25zIE9ic2VydmFibGVcbiAgICBpZiAodGhpcy5vcHRpb25zU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLm9wdGlvbnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMub3B0aW9uc1N1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnNcbiAgICBpZiAodGhpcy5zZWxlY3QpIHtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgoeyBldmVudCwgaGFuZGxlciB9KSA9PiB7XG4gICAgICAgIGlmIChldmVudCA9PT0gJ2RvY3VtZW50LWNsaWNrJykge1xuICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIGRvY3VtZW50IGZvciBtdWx0aS1zZWxlY3QgY2xpY2sgaGFuZGxlciAoYnViYmxpbmcgcGhhc2UpXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGZyb20gc2VsZWN0IGVsZW1lbnRcbiAgICAgICAgICB0aGlzLnNlbGVjdD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xuICAgICAgXG4gICAgICB0aGlzLnNlbGVjdC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc2VsZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5wb3J0YWxEaXYgPSB1bmRlZmluZWQ7ICAvLyBDbGVhbiB1cCBwb3J0YWwgcmVmZXJlbmNlXG4gICAgfVxuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Q/LmZvY3VzKCk7XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogVCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkge1xuICAgICAgcmV0dXJuICh0aGlzLm9wdGlvbnMubXVsdGlwbGUgPyBbXSA6ICcnKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3QudmFsdWU7XG4gICAgXG4gICAgLy8gSGFuZGxlIG11bHRpcGxlIHNlbGVjdGlvblxuICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pIGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIHNpbmdsZSBzZWxlY3Rpb25cbiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkodmFsdWUpID8gKHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZVswXSA6ICcnKSA6IHZhbHVlKSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cbn1cbiJdfQ==
518
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1zZWxlY3QtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9lZGl0b3JzL25pbGUtc2VsZWN0LWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFHSCxPQUFPLEVBQTRCLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQW1GOUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQXNGM0IsWUFBNkIsT0FBZ0M7UUFBaEMsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFyRjdELDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUt2QixtQkFBYyxHQUFxRCxFQUFFLENBQUM7UUFFdEUsbUJBQWMsR0FBOEIsRUFBRSxDQUFDO1FBQy9DLG1CQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsd0RBQXdEO1FBQ2hGLGFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyw4QkFBOEI7UUFDaEQsc0JBQWlCLEdBQXNCLEVBQUUsQ0FBQyxDQUFDLGdDQUFnQztRQTRFakYsNEJBQTRCO1FBQzVCLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQiw4Q0FBOEM7Z0JBQzlDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDZixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQ3RCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsaUJBQWlCO1lBQ2pCLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDNUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FB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LElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUUsNEJBQTRCO1NBQzFEO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBaUIsQ0FBQztTQUMxRDtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRWhDLDRCQUE0QjtRQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQWlCLENBQUM7U0FDakU7UUFFRCwwQkFBMEI7UUFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBaUIsQ0FBQztJQUM3RixDQUFDOztBQTlqQmMsK0JBQWMsR0FBRyxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZVNlbGVjdCBmcm9tIEBhcXVlcmEvbmlsZS1lbGVtZW50c1xuICogVGhpcyBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBkcm9wZG93bi9zZWxlY3QgZWRpdG9ycyBmb3Igbmd4LXNtYXJ0LXRhYmxlXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIGlzT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFNlbGVjdCBvcHRpb24gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XG4gIC8qKiBUaGUgb3B0aW9uJ3MgdmFsdWUgKi9cbiAgdmFsdWU6IHN0cmluZztcbiAgLyoqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb24gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBPcHRpb25hbCBwcmVmaXggaWNvbiBvciBjb250ZW50ICovXG4gIHByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZVNlbGVjdEVkaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pbGVTZWxlY3RFZGl0b3JPcHRpb25zIHtcbiAgLy8gT3B0aW9ucyBjb25maWd1cmF0aW9uIChSRVFVSVJFRClcbiAgLyoqIEFycmF5IG9mIG9wdGlvbnMgLSBzdXBwb3J0cyBzdGF0aWMgYXJyYXlzLCBPYnNlcnZhYmxlLCBvciBCZWhhdmlvclN1YmplY3QgZm9yIHJlYWN0aXZlIHVwZGF0ZXMgKi9cbiAgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gfCBzdHJpbmdbXSB8IE9ic2VydmFibGU8U2VsZWN0T3B0aW9uW10gfCBzdHJpbmdbXT47XG4gIFxuICAvLyBCYXNpYyBwcm9wZXJ0aWVzXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0IHdoZW4gbm8gc2VsZWN0aW9uIGlzIG1hZGUgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKiBTaXplIG9mIHRoZSBzZWxlY3QgY29udHJvbCAqL1xuICBzaXplPzogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJztcbiAgLyoqIEVuYWJsZSBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSAqL1xuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIFxuICAvLyBCZWhhdmlvciBvcHRpb25zXG4gIC8qKiBBZGRzIGNsZWFyIGJ1dHRvbiB3aGVuIHZhbHVlIGlzIG5vdCBlbXB0eSAqL1xuICBjbGVhcmFibGU/OiBib29sZWFuO1xuICAvKiogRGlzYWJsZSB0aGUgc2VsZWN0IGNvbnRyb2wgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogTWFrZSB0aGUgc2VsZWN0IHJlcXVpcmVkICovXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSAqL1xuICBzZWFyY2hFbmFibGVkPzogYm9vbGVhbjtcbiAgXG4gIC8vIFZpc3VhbCBzdGF0ZXNcbiAgLyoqIFdhcm5pbmcgc3RhdGUgc3R5bGluZyAqL1xuICB3YXJuaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIHN0YXRlIHN0eWxpbmcgKi9cbiAgZXJyb3I/OiBib29sZWFuO1xuICAvKiogU3VjY2VzcyBzdGF0ZSBzdHlsaW5nICovXG4gIHN1Y2Nlc3M/OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5ICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgLyoqIEhlbHAgdGV4dCB0byBkaXNwbGF5ICovXG4gIGhlbHBUZXh0Pzogc3RyaW5nO1xuICBcbiAgLy8gQWR2YW5jZWQgZmVhdHVyZXNcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGVkIG9wdGlvbnMgdG8gc2hvdyBpbiBtdWx0aXBsZSBtb2RlICgwID0gbm8gbGltaXQpICovXG4gIG1heE9wdGlvbnNWaXNpYmxlPzogbnVtYmVyO1xuICAvKiogRHJhd3MgYSBmaWxsZWQgc2VsZWN0IHN0eWxlICovXG4gIGZpbGxlZD86IGJvb2xlYW47XG4gIC8qKiBQaWxsLXN0eWxlIHdpdGggcm91bmRlZCBlZGdlcyAqL1xuICBwaWxsPzogYm9vbGVhbjtcbiAgLyoqIFVzZSBmaXhlZCBwb3NpdGlvbmluZyB0byBwcmV2ZW50IGNsaXBwaW5nICovXG4gIGhvaXN0PzogYm9vbGVhbjtcbiAgLyoqIFBsYWNlbWVudCBvZiB0aGUgZHJvcGRvd24gbWVudSAqL1xuICBwbGFjZW1lbnQ/OiAndG9wJyB8ICdib3R0b20nO1xuICBcbiAgLy8gVmlydHVhbCBzY3JvbGwgZm9yIGxhcmdlIGxpc3RzXG4gIC8qKiBFbmFibGUgdmlydHVhbCBzY3JvbGxpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZSB3aXRoIG1hbnkgb3B0aW9ucyAqL1xuICBlbmFibGVWaXJ0dWFsU2Nyb2xsPzogYm9vbGVhbjtcbiAgXG4gIC8vIFNlYXJjaCBjb25maWd1cmF0aW9uXG4gIC8qKiBEaXNhYmxlIGxvY2FsIHNlYXJjaCAodXNlIGZvciBzZXJ2ZXItc2lkZSBzZWFyY2gpICovXG4gIGRpc2FibGVMb2NhbFNlYXJjaD86IGJvb2xlYW47XG4gIFxuICAvLyBWYWxpZGF0aW9uXG4gIC8qKiBWYWxpZGF0ZSBiZWZvcmUgc2F2aW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICB2YWxpZGF0ZU9uU2F2ZT86IGJvb2xlYW47XG4gIFxuICAvLyBQb3J0YWwgb3B0aW9uc1xuICAvKiogQXBwZW5kIGRyb3Bkb3duIHRvIGRvY3VtZW50IGJvZHkgaW5zdGVhZCBvZiBwYXJlbnQgKi9cbiAgcG9ydGFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gZWRpdG9yIHRoYXQgdXNlcyBOaWxlU2VsZWN0IGNvbXBvbmVudFxuICogQHRlbXBsYXRlIFQgVGhlIHZhbHVlIHR5cGUgKHN0cmluZyBmb3Igc2luZ2xlIHNlbGVjdGlvbiwgc3RyaW5nW10gZm9yIG11bHRpcGxlKVxuICovXG5leHBvcnQgY2xhc3MgTmlsZVNlbGVjdEVkaXRvcjxUID0gc3RyaW5nPiBpbXBsZW1lbnRzIENlbGxFZGl0b3I8VD4ge1xuICBhY2NlcHRzSW5pdGlhbEtleXByZXNzID0gZmFsc2U7XG4gIFxuICBwcml2YXRlIHN0YXRpYyBzdHlsZXNJbmplY3RlZCA9IGZhbHNlO1xuICBwcml2YXRlIHNlbGVjdD86IGFueTtcbiAgcHJpdmF0ZSBwb3J0YWxEaXY/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBldmVudExpc3RlbmVyczogQXJyYXk8eyBldmVudDogc3RyaW5nOyBoYW5kbGVyOiBFdmVudExpc3RlbmVyIH0+ID0gW107XG4gIHByaXZhdGUgb3B0aW9uc1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjdXJyZW50T3B0aW9uczogKFNlbGVjdE9wdGlvbiB8IHN0cmluZylbXSA9IFtdO1xuICBwcml2YXRlIGlzSW5pdGlhbGl6aW5nID0gZmFsc2U7IC8vIEZsYWcgdG8gcHJldmVudCBpbW1lZGlhdGUgY2xvc2UgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gIHByaXZhdGUgaGFzU2F2ZWQgPSBmYWxzZTsgLy8gRmxhZyB0byBwcmV2ZW50IGRvdWJsZS1zYXZlXG4gIHByaXZhdGUgbGFzdFNlbGVjdGVkVmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7IC8vIFRyYWNrIHRoZSBsYXN0IHNlbGVjdGVkIHZhbHVlXG5cbiAgLyoqXG4gICAqIEluamVjdCBnbG9iYWwgc3R5bGVzIHRvIHJlbW92ZSBib3JkZXIgZnJvbSBuaWxlLXNlbGVjdCBjb21ib2JveFxuICAgKiBVc2VzIDo6cGFydCBzZWxlY3RvciB3aGljaCB3b3JrcyBhY3Jvc3Mgc2hhZG93IERPTSBib3VuZGFyaWVzXG4gICAqL1xuICBwcml2YXRlIGluamVjdEJvcmRlcmxlc3NTdHlsZXMoKTogdm9pZCB7XG4gICAgaWYgKE5pbGVTZWxlY3RFZGl0b3Iuc3R5bGVzSW5qZWN0ZWQpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCBzdHlsZUlkID0gJ25pbGUtc2VsZWN0LWJvcmRlcmxlc3Mtc3R5bGVzJztcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHtcbiAgICAgIE5pbGVTZWxlY3RFZGl0b3Iuc3R5bGVzSW5qZWN0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUuaWQgPSBzdHlsZUlkO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgICAgLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KGNvbWJvYm94KSB7XG4gICAgICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgbWluLWhlaWdodDogdW5zZXQgIWltcG9ydGFudDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICAgIC5zdC1jZWxsLWVkaXRvcjo6cGFydChjb21ib2JveCk6aG92ZXIge1xuICAgICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgICAuc3QtY2VsbC1lZGl0b3I6OnBhcnQoY29tYm9ib3gpOmZvY3VzIHtcbiAgICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgICAgLy8gLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KHRhZykge1xuICAgICAgLy8gICBtYXJnaW46IDFweCAycHggIWltcG9ydGFudDtcbiAgICAgIC8vICAgYm9yZGVyLXJhZGl1czogM3B4ICFpbXBvcnRhbnQ7XG4gICAgICAvLyAgIGJhY2tncm91bmQtY29sb3I6ICNlMmU4ZjAgIWltcG9ydGFudDtcbiAgICAgIC8vICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICAvLyAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgICAgLy8gfVxuICAgICAgLy8gLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KHRhZ19fYmFzZSkge1xuICAgICAgLy8gICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIC8vICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgLy8gICBwYWRkaW5nOiAwIDJweCAhaW1wb3J0YW50O1xuICAgICAgLy8gICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICAgIC8vIH1cbiAgICAgIC8vIC5zdC1jZWxsLWVkaXRvcjo6cGFydCh0YWdfX2NvbnRlbnQpIHtcbiAgICAgIC8vICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgICAgLy8gfVxuICAgICAgLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KHRhZ3MpIHtcbiAgICAgICAgZ2FwOiAycHggIWltcG9ydGFudDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgICAgLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KHRhZ3MtY291bnQpIHtcbiAgICAgICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgICAuc3QtY2VsbC1lZGl0b3I6OnBhcnQoZm9vdGVyKSB7XG4gICAgICAgIGhlaWdodDogMzVweCAhaW1wb3J0YW50O1xuICAgICAgICBtaW4taGVpZ2h0OiAzNXB4ICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDhweCAhaW1wb3J0YW50O1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMzBweCAhaW1wb3J0YW50O1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgICAuc3QtY2VsbC1lZGl0b3I6OnBhcnQobGlzdGJveCkge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgYDtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICBOaWxlU2VsZWN0RWRpdG9yLnN0eWxlc0luamVjdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogTmlsZVNlbGVjdEVkaXRvck9wdGlvbnMpIHtcbiAgICAvLyBIYW5kbGUgT2JzZXJ2YWJsZSBvcHRpb25zXG4gICAgaWYgKGlzT2JzZXJ2YWJsZShvcHRpb25zLm9wdGlvbnMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnNTdWJzY3JpcHRpb24gPSBvcHRpb25zLm9wdGlvbnMuc3Vic2NyaWJlKG9wdHMgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gb3B0cztcbiAgICAgICAgLy8gSWYgZWRpdG9yIGlzIGFscmVhZHkgYWN0aXZlLCB1cGRhdGUgdGhlIERPTVxuICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0YXRpYyBvcHRpb25zXG4gICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gb3B0aW9ucy5vcHRpb25zIHx8IFtdO1xuICAgICAgaWYgKHRoaXMuY3VycmVudE9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTmlsZVNlbGVjdEVkaXRvcjogb3B0aW9ucyBhcnJheSBpcyBlbXB0eScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRleHQuY29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05pbGVTZWxlY3RFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldCBpbml0aWFsaXppbmcgZmxhZyB0byBwcmV2ZW50IGltbWVkaWF0ZSBjbG9zZVxuICAgIHRoaXMuaXNJbml0aWFsaXppbmcgPSB0cnVlO1xuICAgIHRoaXMuaGFzU2F2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RTZWxlY3RlZFZhbHVlID0gJyc7XG5cbiAgICAvLyBDcmVhdGUgTmlsZVNlbGVjdCBjdXN0b20gZWxlbWVudCB1c2luZyBkb2N1bWVudC5jcmVhdGVFbGVtZW50XG4gICAgdGhpcy5zZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLXNlbGVjdCcpO1xuICAgIHRoaXMuc2VsZWN0LmNsYXNzTmFtZSA9ICdzdC1jZWxsLWVkaXRvcic7XG4gICAgXG4gICAgLy8gQXBwbHkgaW5saW5lIHN0eWxlcyBmb3IgcHJvcGVyIGNlbGwgZml0dGluZyAtIHByZXZlbnQgaGVpZ2h0IGNoYW5nZXNcbiAgICB0aGlzLnNlbGVjdC5zdHlsZS53aWR0aCA9ICdjYWxjKDEwMCUgLSA0cHgpJztcbiAgICB0aGlzLnNlbGVjdC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgdGhpcy5zZWxlY3Quc3R5bGUubWF4SGVpZ2h0ID0gJzEwMCUnO1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICB0aGlzLnNlbGVjdC5zdHlsZS5tYXJnaW4gPSAnMCAycHgnO1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgXG4gICAgLy8gSW5qZWN0IHN0eWxlcyB0byByZW1vdmUgYm9yZGVyIHVzaW5nIDo6cGFydCBzZWxlY3RvclxuICAgIHRoaXMuaW5qZWN0Qm9yZGVybGVzc1N0eWxlcygpO1xuICAgIFxuICAgIC8vIEFsc28gdHJ5IHJlbW92aW5nIG91dGxpbmUgb24gaG9zdCBlbGVtZW50XG4gICAgdGhpcy5zZWxlY3Quc3R5bGUub3V0bGluZSA9ICdub25lJztcbiAgICB0aGlzLnNlbGVjdC5zdHlsZS5ib3JkZXIgPSAnbm9uZSc7XG4gICAgXG4gICAgLy8gU2V0IGluaXRpYWwgdmFsdWVcbiAgICB0aGlzLnNldEluaXRpYWxWYWx1ZShjb250ZXh0LnZhbHVlKTtcblxuICAgIC8vIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuXG4gICAgLy8gQ3JlYXRlIGFuZCBhcHBlbmQgb3B0aW9ucyB3aXRoIGN1cnJlbnQgb3B0aW9uc1xuICAgIHRoaXMuY3JlYXRlQW5kQXBwZW5kT3B0aW9ucyh0aGlzLmN1cnJlbnRPcHRpb25zKTtcblxuICAgIC8vIFNldCB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dCk7XG5cbiAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCBzZWxlY3RcbiAgICBjb250ZXh0LmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdCk7XG5cbiAgICAvLyBGb2N1cyBhbmQgYXV0by1vcGVuIGFmdGVyIHJlbmRlclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3Q/LmZvY3VzKCk7XG4gICAgICBcbiAgICAgIC8vIEF1dG8tb3BlbiB0aGUgZHJvcGRvd25cbiAgICAgIGlmICh0aGlzLnNlbGVjdCkge1xuICAgICAgICB0aGlzLnNlbGVjdC5vcGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2xlYXIgaW5pdGlhbGl6aW5nIGZsYWcgYWZ0ZXIgZHJvcGRvd24gaGFzIG9wZW5lZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXppbmcgPSBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciBtdWx0aS1zZWxlY3QsIGZpbmQgdGhlIHBvcnRhbCBkaXYgZm9yIGNsaWNrIGRldGVjdGlvblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy5wb3J0YWxEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubmlsZS1zZWxlY3QtcG9ydGFsLWFwcGVuZCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIHNlbGVjdFxuICAgKi9cbiAgcHJpdmF0ZSBzZXRJbml0aWFsVmFsdWUodmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKSB7XG4gICAgICAvLyBIYW5kbGUgbXVsdGlwbGUgc2VsZWN0aW9uIC0gdmFsdWUgc2hvdWxkIGJlIGFycmF5XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3QudmFsdWUgPSBbU3RyaW5nKHZhbHVlKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdC52YWx1ZSA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgc2luZ2xlIHNlbGVjdGlvblxuICAgICAgdGhpcy5zZWxlY3QudmFsdWUgPSB2YWx1ZSA/IFN0cmluZyh2YWx1ZSkgOiAnJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgTmlsZVNlbGVjdCBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGFwcGx5T3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0KSByZXR1cm47XG5cbiAgICAvLyBCYXNpYyBvcHRpb25zXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5zZWxlY3QucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaXplKSB7XG4gICAgICB0aGlzLnNlbGVjdC5zaXplID0gdGhpcy5vcHRpb25zLnNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0LnNpemUgPSAnc21hbGwnOyAvLyBEZWZhdWx0IGZvciB0YWJsZSBjZWxsc1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0Lm11bHRpcGxlID0gdGhpcy5vcHRpb25zLm11bHRpcGxlO1xuICAgIH1cblxuICAgIC8vIEJlaGF2aW9yIG9wdGlvbnNcbiAgICBpZiAodGhpcy5vcHRpb25zLmNsZWFyYWJsZSkge1xuICAgICAgdGhpcy5zZWxlY3QuY2xlYXJhYmxlID0gdGhpcy5vcHRpb25zLmNsZWFyYWJsZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5kaXNhYmxlZCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJlcXVpcmVkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5yZXF1aXJlZCA9IHRoaXMub3B0aW9ucy5yZXF1aXJlZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNlYXJjaEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnNlYXJjaEVuYWJsZWQgPSB0aGlzLm9wdGlvbnMuc2VhcmNoRW5hYmxlZDtcbiAgICB9XG5cbiAgICAvLyBWaXN1YWwgc3RhdGVzXG4gICAgaWYgKHRoaXMub3B0aW9ucy53YXJuaW5nKSB7XG4gICAgICB0aGlzLnNlbGVjdC53YXJuaW5nID0gdGhpcy5vcHRpb25zLndhcm5pbmc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvcikge1xuICAgICAgdGhpcy5zZWxlY3QuZXJyb3IgPSB0aGlzLm9wdGlvbnMuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdWNjZXNzKSB7XG4gICAgICB0aGlzLnNlbGVjdC5zdWNjZXNzID0gdGhpcy5vcHRpb25zLnN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5lcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmVycm9yTWVzc2FnZSA9IHRoaXMub3B0aW9ucy5lcnJvck1lc3NhZ2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5oZWxwVGV4dCkge1xuICAgICAgdGhpcy5zZWxlY3QuaGVscFRleHQgPSB0aGlzLm9wdGlvbnMuaGVscFRleHQ7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZWQgZmVhdHVyZXNcbiAgICBpZiAodGhpcy5vcHRpb25zLm1heE9wdGlvbnNWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0Lm1heE9wdGlvbnNWaXNpYmxlID0gdGhpcy5vcHRpb25zLm1heE9wdGlvbnNWaXNpYmxlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsbGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmZpbGxlZCA9IHRoaXMub3B0aW9ucy5maWxsZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5waWxsKSB7XG4gICAgICB0aGlzLnNlbGVjdC5waWxsID0gdGhpcy5vcHRpb25zLnBpbGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ob2lzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5ob2lzdCA9IHRoaXMub3B0aW9ucy5ob2lzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCBob2lzdCB0byB0cnVlIGZvciBhbGwgc2VsZWN0cyB0byBwcmV2ZW50IGNsaXBwaW5nIGlzc3VlcyBpbiB0YWJsZSBjZWxsc1xuICAgICAgdGhpcy5zZWxlY3QuaG9pc3QgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGxhY2VtZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdC5wbGFjZW1lbnQgPSB0aGlzLm9wdGlvbnMucGxhY2VtZW50O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlVmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5zZWxlY3QuZW5hYmxlVmlydHVhbFNjcm9sbCA9IHRoaXMub3B0aW9ucy5lbmFibGVWaXJ0dWFsU2Nyb2xsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsU2VhcmNoKSB7XG4gICAgICB0aGlzLnNlbGVjdC5kaXNhYmxlTG9jYWxTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsU2VhcmNoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucG9ydGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnBvcnRhbCA9IHRoaXMub3B0aW9ucy5wb3J0YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0LnBvcnRhbCA9IHRydWU7IC8vIERlZmF1bHQgdG8gcG9ydGFsIG1vZGUgZm9yIGJldHRlciBwb3NpdGlvbmluZ1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgd2lkdGggc3luY2luZyBpc3N1ZXMgaW4gdGFibGUgY2VsbHNcbiAgICB0aGlzLnNlbGVjdC5ub1dpZHRoU3luYyA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG9wdGlvbnMgZHluYW1pY2FsbHkgd2hpbGUgZWRpdG9yIGlzIGFjdGl2ZVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVPcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3QpIHJldHVybjtcblxuICAgIC8vIENsZWFyIGV4aXN0aW5nIG9wdGlvbnNcbiAgICB3aGlsZSAodGhpcy5zZWxlY3QuZmlyc3RDaGlsZCkge1xuICAgICAgdGhpcy5zZWxlY3QucmVtb3ZlQ2hpbGQodGhpcy5zZWxlY3QuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgLy8gUmUtYXBwZW5kIHdpdGggbmV3IG9wdGlvbnNcbiAgICB0aGlzLmNyZWF0ZUFuZEFwcGVuZE9wdGlvbnModGhpcy5jdXJyZW50T3B0aW9ucyk7XG4gICAgXG4gICAgLy8gVHJpZ2dlciB1cGRhdGUgb24gdGhlIHdlYiBjb21wb25lbnRcbiAgICBpZiAodGhpcy5zZWxlY3QucmVxdWVzdFVwZGF0ZSkge1xuICAgICAgdGhpcy5zZWxlY3QucmVxdWVzdFVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgTmlsZU9wdGlvbiBlbGVtZW50cyBhbmQgYXBwZW5kIHRoZW0gdG8gdGhlIHNlbGVjdFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIHRvIHJlbmRlclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBbmRBcHBlbmRPcHRpb25zKG9wdGlvbnM6IChTZWxlY3RPcHRpb24gfCBzdHJpbmcpW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0KSByZXR1cm47XG5cbiAgICBvcHRpb25zLmZvckVhY2gob3B0ID0+IHtcbiAgICAgIGNvbnN0IG5pbGVPcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLW9wdGlvbicpIGFzIGFueTtcblxuICAgICAgLy8gQXV0by1kZXRlY3QgZm9ybWF0OiBzdHJpbmcgb3IgU2VsZWN0T3B0aW9uIG9iamVjdFxuICAgICAgaWYgKHR5cGVvZiBvcHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG5pbGVPcHRpb24udmFsdWUgPSBvcHQ7XG4gICAgICAgIG5pbGVPcHRpb24uc2V0QXR0cmlidXRlKCd2YWx1ZScsIG9wdCk7XG4gICAgICAgIG5pbGVPcHRpb24udGV4dENvbnRlbnQgPSBvcHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuaWxlT3B0aW9uLnZhbHVlID0gb3B0LnZhbHVlO1xuICAgICAgICBuaWxlT3B0aW9uLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBvcHQudmFsdWUpO1xuICAgICAgICBuaWxlT3B0aW9uLnRleHRDb250ZW50ID0gb3B0LmxhYmVsO1xuICAgICAgICBcbiAgICAgICAgaWYgKG9wdC5kaXNhYmxlZCkge1xuICAgICAgICAgIG5pbGVPcHRpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIG5pbGVPcHRpb24uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgcHJlZml4IGlmIHByb3ZpZGVkIChjb3VsZCBiZSBpY29uIG5hbWUgb3IgY29udGVudClcbiAgICAgICAgaWYgKG9wdC5wcmVmaXgpIHtcbiAgICAgICAgICAvLyBuaWxlT3B0aW9uLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdwcmVmaXgnKTtcbiAgICAgICAgICAvLyBuaWxlT3B0aW9uLmlubmVySFRNTCA9IGA8bmlsZS1pY29uIG5hbWU9XCIke29wdC5wcmVmaXh9XCI+PC9uaWxlLWljb24+YDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdCEuYXBwZW5kQ2hpbGQobmlsZU9wdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGFsbCBldmVudCBsaXN0ZW5lcnMgd2l0aCBwcm9wZXIgY2xlYW51cCB0cmFja2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdmFsaWRhdGVPblNhdmUgPSB0aGlzLm9wdGlvbnMudmFsaWRhdGVPblNhdmUgIT09IGZhbHNlO1xuXG4gICAgLy8gUHJldmVudCBjbGljayBldmVudHMgZnJvbSBidWJibGluZyB1cCB0byB0aGUgY2VsbCBjb250YWluZXJcbiAgICBjb25zdCBzZWxlY3RDbGlja0hhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICB0aGlzLnNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbGVjdENsaWNrSGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICdjbGljaycsIGhhbmRsZXI6IHNlbGVjdENsaWNrSGFuZGxlciB9KTtcbiAgICBcbiAgICAvLyBGb3Igc2luZ2xlLXNlbGVjdCB3aXRoIHBvcnRhbCwgbGlzdGVuIHRvIGRvY3VtZW50IG1vdXNlZG93biB0byBkZXRlY3Qgb3B0aW9uIHNlbGVjdGlvblxuICAgIC8vIFVzZSBtb3VzZWRvd24gYmVjYXVzZSBpdCBmaXJlcyBiZWZvcmUgYmx1clxuICAgIGlmICghdGhpcy5vcHRpb25zLm11bHRpcGxlKSB7XG4gICAgICBjb25zdCBkb2N1bWVudE1vdXNlRG93bkhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY29tcG9zZWRQYXRoID0gZS5jb21wb3NlZFBhdGg/LigpIHx8IFtdO1xuICAgICAgICBcbiAgICAgICAgLy8gTG9vayBmb3IgbmlsZS1vcHRpb24gaW4gdGhlIGV2ZW50IHBhdGhcbiAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjb21wb3NlZFBhdGgpIHtcbiAgICAgICAgICBpZiAoZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlbC50YWdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAnbmlsZS1vcHRpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGVsLmdldEF0dHJpYnV0ZSgndmFsdWUnKSB8fCAoZWwgYXMgYW55KS52YWx1ZSB8fCAnJztcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVmFsdWUgPSBvcHRpb25WYWx1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIEFkZCBsaXN0ZW5lciBpbW1lZGlhdGVseSAobW91c2Vkb3duIGZpcmVzIGJlZm9yZSBibHVyLCBzbyBubyBuZWVkIGZvciBkZWxheSlcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGRvY3VtZW50TW91c2VEb3duSGFuZGxlciwgdHJ1ZSk7IC8vIGNhcHR1cmUgcGhhc2VcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnZG9jdW1lbnQtbW91c2Vkb3duJywgaGFuZGxlcjogZG9jdW1lbnRNb3VzZURvd25IYW5kbGVyIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBrZXlib2FyZCBldmVudHMgKGtleWRvd24gaXMgbm90IHJlcGxhY2VkIGJ5IGN1c3RvbSBldmVudHMpXG4gICAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGtleUV2ZW50ID0gZSBhcyBLZXlib2FyZEV2ZW50O1xuICAgICAgaWYgKGtleUV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnRleHQub25DYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlkb3duSGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICdrZXlkb3duJywgaGFuZGxlcjoga2V5ZG93bkhhbmRsZXIgfSk7XG5cbiAgICAvLyBVc2UgbmlsZS1ibHVyIGV2ZW50IGFzIHNhdmUgdHJpZ2dlciBmb3Igc2luZ2xlLXNlbGVjdFxuICAgIC8vIEFkZCBhIHNtYWxsIGRlbGF5IHRvIGFsbG93IHRoZSB2YWx1ZSB0byB1cGRhdGUgYmVmb3JlIHJlYWRpbmdcbiAgICBjb25zdCBzaW5nbGVTZWxlY3RTYXZlSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgLy8gRG9uJ3Qgc2F2ZSBhZ2FpbiBpZiBhbHJlYWR5IHNhdmVkXG4gICAgICAvLyBJZ25vcmUgZXZlbnRzIHRoYXQgZmlyZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKGUuZy4gd2hlbiBzZXR0aW5nIGluaXRpYWwgdmFsdWUpXG4gICAgICBpZiAodGhpcy5oYXNTYXZlZCB8fCB0aGlzLmlzSW5pdGlhbGl6aW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gT25seSBzYXZlIGZvciBzaW5nbGUtc2VsZWN0XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgICAvLyBBZGQgYSBzbWFsbCBkZWxheSB0byBsZXQgdGhlIHZhbHVlIHVwZGF0ZSBhZnRlciBzZWxlY3Rpb25cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgYWdhaW4gYWZ0ZXIgdGltZW91dCBpbiBjYXNlIHNhdmVkIGJ5IGFub3RoZXIgaGFuZGxlclxuICAgICAgICAgIGlmICh0aGlzLmhhc1NhdmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmICh2YWxpZGF0ZU9uU2F2ZSAmJiAhdGhpcy5zZWxlY3Q/LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Q/LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVzZSBsYXN0U2VsZWN0ZWRWYWx1ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBnZXQgZnJvbSBlbGVtZW50XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgYW55O1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5sYXN0U2VsZWN0ZWRWYWx1ZSB8fCB0YXJnZXQ/LnZhbHVlIHx8IHRoaXMuc2VsZWN0Py52YWx1ZSB8fCAnJztcbiAgICAgICAgICB0aGlzLmhhc1NhdmVkID0gdHJ1ZTtcbiAgICAgICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLnBhcnNlVmFsdWUodmFsdWUpKTtcbiAgICAgICAgfSwgNTApOyAvLyA1MG1zIGRlbGF5IHRvIGFsbG93IHZhbHVlIHRvIHVwZGF0ZVxuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gTGlzdGVuIHRvIGJsdXIgYW5kIG5pbGUtYmx1ciBldmVudHMgZm9yIGZvY3VzIGxvc3MgZGV0ZWN0aW9uXG4gICAgLy8gTmlsZSB3ZWIgY29tcG9uZW50cyBlbWl0IG5pbGUtYmx1ciBjdXN0b20gZXZlbnQgaW5zdGVhZCBvZiBuYXRpdmUgYmx1clxuICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBzaW5nbGVTZWxlY3RTYXZlSGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICdibHVyJywgaGFuZGxlcjogc2luZ2xlU2VsZWN0U2F2ZUhhbmRsZXIgfSk7XG4gICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1ibHVyJywgc2luZ2xlU2VsZWN0U2F2ZUhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1ibHVyJywgaGFuZGxlcjogc2luZ2xlU2VsZWN0U2F2ZUhhbmRsZXIgfSk7XG4gICAgXG4gICAgLy8gQWxzbyBsaXN0ZW4gdG8gY2hhbmdlIGV2ZW50cyBhcyBmYWxsYmFja1xuICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2hhbmdlJywgc2luZ2xlU2VsZWN0U2F2ZUhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1jaGFuZ2UnLCBoYW5kbGVyOiBzaW5nbGVTZWxlY3RTYXZlSGFuZGxlciB9KTtcbiAgICB0aGlzLnNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBzaW5nbGVTZWxlY3RTYXZlSGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICdjaGFuZ2UnLCBoYW5kbGVyOiBzaW5nbGVTZWxlY3RTYXZlSGFuZGxlciB9KTtcblxuICAgIC8vIEhhbmRsZSBjbGVhciBidXR0b24gaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2xlYXJhYmxlKSB7XG4gICAgICBjb25zdCBjbGVhckhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29udGV4dC5vblNhdmUodGhpcy5wYXJzZVZhbHVlKHRoaXMub3B0aW9ucy5tdWx0aXBsZSA/IFtdIDogJycpKTtcbiAgICAgIH07XG4gICAgICB0aGlzLnNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCduaWxlLWNsZWFyJywgY2xlYXJIYW5kbGVyKTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1jbGVhcicsIGhhbmRsZXI6IGNsZWFySGFuZGxlciB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VhcmNoIGZvciBzZXJ2ZXItc2lkZSBzZWFyY2ggc2NlbmFyaW9zXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlTG9jYWxTZWFyY2gpIHtcbiAgICAgIGNvbnN0IHNlYXJjaEhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBlIGFzIEN1c3RvbUV2ZW50O1xuICAgICAgICAvLyBFbWl0IHNlYXJjaCBxdWVyeSB0aHJvdWdoIG9uQ2hhbmdlIGZvciBleHRlcm5hbCBoYW5kbGluZ1xuICAgICAgICBjb250ZXh0Lm9uQ2hhbmdlKGN1c3RvbUV2ZW50LmRldGFpbCBhcyBUKTtcbiAgICAgIH07XG4gICAgICB0aGlzLnNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCduaWxlLXNlYXJjaCcsIHNlYXJjaEhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLXNlYXJjaCcsIGhhbmRsZXI6IHNlYXJjaEhhbmRsZXIgfSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIG11bHRpLXNlbGVjdDogZGV0ZWN0IGNsaWNrcyBvdXRzaWRlIHBvcnRhbCBhbmQgc2VsZWN0XG4gICAgaWYgKHRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgY29uc3QgZG9jdW1lbnRDbGlja0hhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgbW91c2VFdmVudCA9IGUgYXMgTW91c2VFdmVudDtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gbW91c2VFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiBwb3J0YWwgZGl2IGV4aXN0cyAobWlnaHQgdGFrZSBhIG1vbWVudCB0byByZW5kZXIpXG4gICAgICAgIGlmICghdGhpcy5wb3J0YWxEaXYpIHtcbiAgICAgICAgICB0aGlzLnBvcnRhbERpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uaWxlLXNlbGVjdC1wb3J0YWwtYXBwZW5kJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIERldGVybWluZSBpZiBjbGljayBpcyBpbnNpZGUgdGhlIHNlbGVjdCBvciBwb3J0YWxcbiAgICAgICAgY29uc3QgY2xpY2tlZEluc2lkZVNlbGVjdCA9IHRoaXMuc2VsZWN0Py5jb250YWlucyh0YXJnZXQpO1xuICAgICAgICBjb25zdCBjbGlja2VkSW5zaWRlUG9ydGFsID0gdGhpcy5wb3J0YWxEaXY/LmNvbnRhaW5zKHRhcmdldCk7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiBjbGlja2VkIG91dHNpZGUgYm90aCBzZWxlY3QgYW5kIHBvcnRhbCwgc2F2ZSBhbmQgY2xvc2VcbiAgICAgICAgaWYgKCFjbGlja2VkSW5zaWRlU2VsZWN0ICYmICFjbGlja2VkSW5zaWRlUG9ydGFsKSB7XG4gICAgICAgICAgaWYgKHZhbGlkYXRlT25TYXZlICYmICF0aGlzLnNlbGVjdD8uY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdD8ucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGV4dC5vblNhdmUodGhpcy5nZXRDdXJyZW50VmFsdWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjbGljayBpcyBpbnNpZGUgLSBkbyBub3RoaW5nIChkcm9wZG93biBzdGF5cyBvcGVuKVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gRGVsYXkgYWRkaW5nIHRoZSBkb2N1bWVudCBjbGljayBoYW5kbGVyIHRvIHByZXZlbnQgdGhlIGluaXRpYWwgY2xpY2sgXG4gICAgICAvLyAodGhhdCBvcGVuZWQgdGhlIGVkaXRvcikgZnJvbSBpbW1lZGlhdGVseSB0cmlnZ2VyaW5nIGl0IGFuZCBjbG9zaW5nIHRoZSBkcm9wZG93blxuICAgICAgLy8gVXNlIDIwMG1zIHRvIGVuc3VyZSB0aGUgZHJvcGRvd24gaGFzIGZ1bGx5IG9wZW5lZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgYWRkIGlmIHNlbGVjdCBzdGlsbCBleGlzdHMgKGVkaXRvciBub3QgZGVzdHJveWVkKVxuICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcbiAgICAgICAgICAvLyBVc2UgYnViYmxpbmcgcGhhc2UgKGZhbHNlKSBpbnN0ZWFkIG9mIGNhcHR1cmUgdG8gbm90IGludGVyZmVyZSB3aXRoIG5pbGUtc2VsZWN0J3MgdG9nZ2xlXG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb2N1bWVudENsaWNrSGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICAgICAgZXZlbnQ6ICdkb2N1bWVudC1jbGljaycsICAvLyBVc2UgY3VzdG9tIG5hbWUgdG8gaWRlbnRpZnkgaXRcbiAgICAgICAgICAgIGhhbmRsZXI6IGRvY3VtZW50Q2xpY2tIYW5kbGVyIFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCAyMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSB2YWx1ZSBiYXNlZCBvbiBzZWxlY3Rpb24gbW9kZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFQge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgIC8vIEVuc3VyZSBhcnJheSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIGFzIHVua25vd24gYXMgVDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAodmFsdWUgPyBbdmFsdWVdIDogW10pIGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgXG4gICAgLy8gU2luZ2xlIHNlbGVjdGlvbiAtIHJldHVybiBzdHJpbmdcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAodmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlWzBdIDogJycpIGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlIGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgZmxhZ3NcbiAgICB0aGlzLmlzSW5pdGlhbGl6aW5nID0gZmFsc2U7XG4gICAgdGhpcy5oYXNTYXZlZCA9IGZhbHNlO1xuICAgIHRoaXMubGFzdFNlbGVjdGVkVmFsdWUgPSAnJztcbiAgICBcbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIG9wdGlvbnMgT2JzZXJ2YWJsZVxuICAgIGlmICh0aGlzLm9wdGlvbnNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMub3B0aW9uc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5vcHRpb25zU3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICAgIGlmICh0aGlzLnNlbGVjdCkge1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5mb3JFYWNoKCh7IGV2ZW50LCBoYW5kbGVyIH0pID0+IHtcbiAgICAgICAgaWYgKGV2ZW50ID09PSAnZG9jdW1lbnQtY2xpY2snKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGZyb20gZG9jdW1lbnQgZm9yIG11bHRpLXNlbGVjdCBjbGljayBoYW5kbGVyIChidWJibGluZyBwaGFzZSlcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2RvY3VtZW50LW1vdXNlZG93bicpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBkb2N1bWVudCBmb3Igc2luZ2xlLXNlbGVjdCBvcHRpb24gbW91c2Vkb3duIGhhbmRsZXIgKGNhcHR1cmUgcGhhc2UpXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlciwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGZyb20gc2VsZWN0IGVsZW1lbnRcbiAgICAgICAgICB0aGlzLnNlbGVjdD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xuICAgICAgXG4gICAgICB0aGlzLnNlbGVjdC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc2VsZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5wb3J0YWxEaXYgPSB1bmRlZmluZWQ7ICAvLyBDbGVhbiB1cCBwb3J0YWwgcmVmZXJlbmNlXG4gICAgfVxuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Q/LmZvY3VzKCk7XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogVCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkge1xuICAgICAgcmV0dXJuICh0aGlzLm9wdGlvbnMubXVsdGlwbGUgPyBbXSA6ICcnKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3QudmFsdWU7XG4gICAgXG4gICAgLy8gSGFuZGxlIG11bHRpcGxlIHNlbGVjdGlvblxuICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pIGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIHNpbmdsZSBzZWxlY3Rpb25cbiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkodmFsdWUpID8gKHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZVswXSA6ICcnKSA6IHZhbHVlKSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cbn1cbiJdfQ==
@@ -3534,6 +3534,8 @@ class NileSelectEditor {
3534
3534
  this.eventListeners = [];
3535
3535
  this.currentOptions = [];
3536
3536
  this.isInitializing = false; // Flag to prevent immediate close during initialization
3537
+ this.hasSaved = false; // Flag to prevent double-save
3538
+ this.lastSelectedValue = ''; // Track the last selected value
3537
3539
  // Handle Observable options
3538
3540
  if (isObservable(options.options)) {
3539
3541
  this.optionsSubscription = options.options.subscribe(opts => {
@@ -3630,6 +3632,8 @@ class NileSelectEditor {
3630
3632
  }
3631
3633
  // Set initializing flag to prevent immediate close
3632
3634
  this.isInitializing = true;
3635
+ this.hasSaved = false;
3636
+ this.lastSelectedValue = '';
3633
3637
  // Create NileSelect custom element using document.createElement
3634
3638
  this.select = document.createElement('nile-select');
3635
3639
  this.select.className = 'st-cell-editor';
@@ -3837,12 +3841,30 @@ class NileSelectEditor {
3837
3841
  return;
3838
3842
  const validateOnSave = this.options.validateOnSave !== false;
3839
3843
  // Prevent click events from bubbling up to the cell container
3840
- // This prevents parent handlers from interfering with nile-select's toggle
3841
- const clickHandler = (e) => {
3844
+ const selectClickHandler = (e) => {
3842
3845
  e.stopPropagation();
3843
3846
  };
3844
- this.select.addEventListener('click', clickHandler);
3845
- this.eventListeners.push({ event: 'click', handler: clickHandler });
3847
+ this.select.addEventListener('click', selectClickHandler);
3848
+ this.eventListeners.push({ event: 'click', handler: selectClickHandler });
3849
+ // For single-select with portal, listen to document mousedown to detect option selection
3850
+ // Use mousedown because it fires before blur
3851
+ if (!this.options.multiple) {
3852
+ const documentMouseDownHandler = (e) => {
3853
+ var _a, _b;
3854
+ const composedPath = ((_a = e.composedPath) === null || _a === void 0 ? void 0 : _a.call(e)) || [];
3855
+ // Look for nile-option in the event path
3856
+ for (const el of composedPath) {
3857
+ if (el instanceof HTMLElement && ((_b = el.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'nile-option') {
3858
+ const optionValue = el.getAttribute('value') || el.value || '';
3859
+ this.lastSelectedValue = optionValue;
3860
+ return;
3861
+ }
3862
+ }
3863
+ };
3864
+ // Add listener immediately (mousedown fires before blur, so no need for delay)
3865
+ document.addEventListener('mousedown', documentMouseDownHandler, true); // capture phase
3866
+ this.eventListeners.push({ event: 'document-mousedown', handler: documentMouseDownHandler });
3867
+ }
3846
3868
  // Handle keyboard events (keydown is not replaced by custom events)
3847
3869
  const keydownHandler = (e) => {
3848
3870
  const keyEvent = e;
@@ -3854,45 +3876,46 @@ class NileSelectEditor {
3854
3876
  };
3855
3877
  this.select.addEventListener('keydown', keydownHandler);
3856
3878
  this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
3857
- // Use nile-change custom event as primary save trigger
3858
- const changeHandler = (e) => {
3859
- var _a, _b;
3860
- // Ignore change events during initialization (can fire when setting initial value)
3861
- if (this.isInitializing) {
3862
- return;
3863
- }
3864
- const customEvent = e;
3865
- if (validateOnSave && !((_a = this.select) === null || _a === void 0 ? void 0 : _a.checkValidity())) {
3866
- (_b = this.select) === null || _b === void 0 ? void 0 : _b.reportValidity();
3867
- return;
3868
- }
3869
- // Only save immediately for single-select
3870
- // Multi-select saves on outside click
3871
- if (!this.options.multiple) {
3872
- context.onSave(this.parseValue(customEvent.detail.value));
3873
- }
3874
- };
3875
- this.select.addEventListener('nile-change', changeHandler);
3876
- this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
3877
- // Handle blur as secondary save trigger - only for single-select
3878
- // Multi-select uses hide event instead
3879
- const blurHandler = (e) => {
3880
- var _a, _b;
3881
- // Ignore blur during initialization
3882
- if (this.isInitializing) {
3883
- return;
3884
- }
3885
- if (validateOnSave && !((_a = this.select) === null || _a === void 0 ? void 0 : _a.checkValidity())) {
3886
- (_b = this.select) === null || _b === void 0 ? void 0 : _b.reportValidity();
3879
+ // Use nile-blur event as save trigger for single-select
3880
+ // Add a small delay to allow the value to update before reading
3881
+ const singleSelectSaveHandler = (e) => {
3882
+ // Don't save again if already saved
3883
+ // Ignore events that fire during initialization (e.g. when setting initial value)
3884
+ if (this.hasSaved || this.isInitializing) {
3887
3885
  return;
3888
3886
  }
3889
- // For single-select, save on blur (when clicking outside)
3887
+ // Only save for single-select
3890
3888
  if (!this.options.multiple) {
3891
- context.onSave(this.getCurrentValue());
3889
+ // Add a small delay to let the value update after selection
3890
+ setTimeout(() => {
3891
+ var _a, _b, _c;
3892
+ // Check again after timeout in case saved by another handler
3893
+ if (this.hasSaved) {
3894
+ return;
3895
+ }
3896
+ if (validateOnSave && !((_a = this.select) === null || _a === void 0 ? void 0 : _a.checkValidity())) {
3897
+ (_b = this.select) === null || _b === void 0 ? void 0 : _b.reportValidity();
3898
+ return;
3899
+ }
3900
+ // Use lastSelectedValue if available, otherwise get from element
3901
+ const target = e.target;
3902
+ const value = this.lastSelectedValue || (target === null || target === void 0 ? void 0 : target.value) || ((_c = this.select) === null || _c === void 0 ? void 0 : _c.value) || '';
3903
+ this.hasSaved = true;
3904
+ context.onSave(this.parseValue(value));
3905
+ }, 50); // 50ms delay to allow value to update
3892
3906
  }
3893
3907
  };
3894
- this.select.addEventListener('nile-blur', blurHandler);
3895
- this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
3908
+ // Listen to blur and nile-blur events for focus loss detection
3909
+ // Nile web components emit nile-blur custom event instead of native blur
3910
+ this.select.addEventListener('blur', singleSelectSaveHandler);
3911
+ this.eventListeners.push({ event: 'blur', handler: singleSelectSaveHandler });
3912
+ this.select.addEventListener('nile-blur', singleSelectSaveHandler);
3913
+ this.eventListeners.push({ event: 'nile-blur', handler: singleSelectSaveHandler });
3914
+ // Also listen to change events as fallback
3915
+ this.select.addEventListener('nile-change', singleSelectSaveHandler);
3916
+ this.eventListeners.push({ event: 'nile-change', handler: singleSelectSaveHandler });
3917
+ this.select.addEventListener('change', singleSelectSaveHandler);
3918
+ this.eventListeners.push({ event: 'change', handler: singleSelectSaveHandler });
3896
3919
  // Handle clear button if enabled
3897
3920
  if (this.options.clearable) {
3898
3921
  const clearHandler = (e) => {
@@ -3968,8 +3991,10 @@ class NileSelectEditor {
3968
3991
  return value;
3969
3992
  }
3970
3993
  destroy() {
3971
- // Reset initialization flag
3994
+ // Reset flags
3972
3995
  this.isInitializing = false;
3996
+ this.hasSaved = false;
3997
+ this.lastSelectedValue = '';
3973
3998
  // Unsubscribe from options Observable
3974
3999
  if (this.optionsSubscription) {
3975
4000
  this.optionsSubscription.unsubscribe();
@@ -3983,6 +4008,10 @@ class NileSelectEditor {
3983
4008
  // Remove from document for multi-select click handler (bubbling phase)
3984
4009
  document.removeEventListener('click', handler, false);
3985
4010
  }
4011
+ else if (event === 'document-mousedown') {
4012
+ // Remove from document for single-select option mousedown handler (capture phase)
4013
+ document.removeEventListener('mousedown', handler, true);
4014
+ }
3986
4015
  else {
3987
4016
  // Remove from select element
3988
4017
  (_a = this.select) === null || _a === void 0 ? void 0 : _a.removeEventListener(event, handler);