inspector-ng 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -115,6 +115,8 @@ A checkpoint contains the root Store value and current route. Restore dispatches
115
115
  | `Backspace` / `Delete` | Delete the selected guide |
116
116
  | `Ctrl/Cmd + Shift + P` | Search and restore checkpoints when configured |
117
117
 
118
+ Tool shortcuts never run while the Inspector is disabled or while focus is inside a form control, form, editable region, or textbox-like editor. Modified application/browser shortcuts such as `Ctrl/Cmd+S` are not intercepted. `Ctrl/Cmd+Shift+P` is the only intentional exception and remains available from inputs and with the Inspector rail disabled.
119
+
118
120
  ## Features
119
121
 
120
122
  - **Element Inspection** — Click any element to see its bounding box, padding, margin, font size, line height, color, and more.
@@ -298,12 +298,11 @@ export class inspectorComponent {
298
298
  this.handleCommandBarKeydown(event, key);
299
299
  return;
300
300
  }
301
- if (key === 'm') {
302
- const target = event.target;
303
- if (target?.matches('input, textarea, select') ||
304
- target?.isContentEditable) {
305
- return;
306
- }
301
+ if (this.blocksInspectorShortcut(event.target) || event.repeat) {
302
+ return;
303
+ }
304
+ const hasShortcutModifier = event.metaKey || event.ctrlKey || event.altKey || event.shiftKey;
305
+ if (key === 'm' && !hasShortcutModifier) {
307
306
  event.preventDefault();
308
307
  this.setInspectorEnabled(!this.enabled());
309
308
  return;
@@ -316,6 +315,14 @@ export class inspectorComponent {
316
315
  event.shiftKey ? this.redo() : this.undo();
317
316
  return;
318
317
  }
318
+ if (event.key === 'Alt') {
319
+ this.altPressed.set(true);
320
+ this.updateDistanceOverlay();
321
+ return;
322
+ }
323
+ if (hasShortcutModifier) {
324
+ return;
325
+ }
319
326
  if (key === 's') {
320
327
  event.preventDefault();
321
328
  this.setToolMode('select');
@@ -336,11 +343,6 @@ export class inspectorComponent {
336
343
  this.setGuideOrientation('vertical');
337
344
  return;
338
345
  }
339
- if (event.key === 'Alt') {
340
- this.altPressed.set(true);
341
- this.updateDistanceOverlay();
342
- return;
343
- }
344
346
  if (key === 'escape') {
345
347
  event.preventDefault();
346
348
  this.selectedMeasurement.set(null);
@@ -529,6 +531,11 @@ export class inspectorComponent {
529
531
  this.beginDelete(active);
530
532
  }
531
533
  }
534
+ blocksInspectorShortcut(target) {
535
+ if (!(target instanceof HTMLElement))
536
+ return false;
537
+ return target.closest('form, input, textarea, select, option, [contenteditable]:not([contenteditable="false"]), [role="textbox"]') !== null;
538
+ }
532
539
  clampActiveCheckpoint() {
533
540
  this.activeCheckpointIndex.set(Math.min(this.activeCheckpointIndex(), Math.max(0, this.filteredCheckpoints().length - 1)));
534
541
  }
@@ -730,4 +737,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
730
737
  type: HostListener,
731
738
  args: ['window:scroll']
732
739
  }] } });
733
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixHQUN0QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVloRSxPQUFPLEVBRUwsMEJBQTBCLEdBQzNCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQVVoRCxNQUFNLE9BQU8sa0JBQWtCO0lBK0U3QixZQUFpQyxVQUFrQjtRQTlFMUMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNa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OUIsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLEVBQUUsbUJBR00sdUJBQXVCLENBQUMsTUFBTTs7MEJBaUZsQyxNQUFNOzJCQUFDLFdBQVc7eUNBdkV0QixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBcVVOLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvRzFDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU3hDLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF3RTlDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0I7Z0JBVWhDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMkJ4QyxvQkFBb0I7c0JBRm5CLFlBQVk7dUJBQUMsZUFBZTs7c0JBQzVCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBQTEFURk9STV9JRCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBHVUlERV9ISVRCT1hfU0laRSxcbiAgR1VJREVfU05BUF9ESVNUQU5DRSxcbiAgaW5zcGVjdG9yX1NUQVRFX1ZFUlNJT04sXG4gIGluc3BlY3Rvcl9TVE9SQUdFX0tFWSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zcGVjdE1lYXN1cmVtZW50LFxuICBnZXRSZWN0RnJvbURvbSxcbiAgZ2V0VGFyZ2V0RWxlbWVudCxcbiAgZ2V0VmlzaWJsZVRleHRCbG9ja3MsXG59IGZyb20gJy4vZG9tJztcbmltcG9ydCB7IGdldERpc3RhbmNlT3ZlcmxheSB9IGZyb20gJy4vZGlzdGFuY2VzJztcbmltcG9ydCB7IGNsYW1wLCBnZXRWaWV3cG9ydFNpemUsIHJlY3RzRXF1YWwgfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIERpc3RhbmNlT3ZlcmxheSxcbiAgR3VpZGUsXG4gIEd1aWRlT3JpZW50YXRpb24sXG4gIEluc3BlY3RNZWFzdXJlbWVudCxcbiAgaW5zcGVjdG9yTGVnYWN5UGVyc2lzdGVkU3RhdGUsXG4gIGluc3BlY3RvclBlcnNpc3RlZFN0YXRlLFxuICBSZWN0LFxuICBUZXh0QmxvY2tBbm5vdGF0aW9uLFxuICBUb29sTW9kZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLFxuICBJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSxcbn0gZnJvbSAnLi9jaGVja3BvaW50cyc7XG5pbXBvcnQgeyBmdXp6eUNoZWNrcG9pbnRzIH0gZnJvbSAnLi9jaGVja3BvaW50LXNlYXJjaCc7XG5pbXBvcnQgeyBjcmVhdGVJZCwgZm9ybWF0VmFsdWUgfSBmcm9tICcuL3V0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW5zcGVjdG9yLW92ZXJsYXknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2luc3BlY3Rvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9pbnNwZWN0b3IuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBpbnNwZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICByZWFkb25seSBNYXRoID0gTWF0aDtcbiAgcmVhZG9ubHkgZm9ybWF0VmFsdWUgPSBmb3JtYXRWYWx1ZTtcbiAgcmVhZG9ubHkgZ3VpZGVIaXRib3hTaXplID0gR1VJREVfSElUQk9YX1NJWkU7XG4gIHJlYWRvbmx5IG92ZXJsYXlSb290ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pignb3ZlcmxheVJvb3QnKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludERpYWxvZyA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaWFsb2dFbGVtZW50Pj4oJ2NoZWNrcG9pbnREaWFsb2cnKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludFNlYXJjaCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PignY2hlY2twb2ludFNlYXJjaCcpO1xuXG4gIEBJbnB1dCgpIGhpZ2hsaWdodENvbG9yID0gJyM0ZjhjZmYnO1xuICBASW5wdXQoKSBndWlkZUNvbG9yID0gJyNmZjdhMDAnO1xuICBASW5wdXQoKSBob3ZlckhpZ2hsaWdodEVuYWJsZWQgPSB0cnVlO1xuICBASW5wdXQoKSBwZXJzaXN0T25SZWxvYWQgPSBmYWxzZTtcblxuICByZWFkb25seSBjaGVja3BvaW50U2VydmljZSA9IGluamVjdChJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgY29tbWFuZEJhck9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBjaGVja3BvaW50UXVlcnkgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBhY3RpdmVDaGVja3BvaW50SW5kZXggPSBzaWduYWwoMCk7XG4gIHJlYWRvbmx5IGVkaXRpbmdDaGVja3BvaW50SWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRlbGV0aW5nQ2hlY2twb2ludElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSByZW5hbWVEcmFmdCA9IHNpZ25hbCgnJyk7XG4gIHJlYWRvbmx5IGNoZWNrcG9pbnRUb2FzdCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludFRvYXN0SXNFcnJvciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGZpbHRlcmVkQ2hlY2twb2ludHMgPSBjb21wdXRlZCgoKSA9PlxuICAgIGZ1enp5Q2hlY2twb2ludHMoXG4gICAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jaGVja3BvaW50cygpID8/IFtdLFxuICAgICAgdGhpcy5jaGVja3BvaW50UXVlcnkoKSxcbiAgICApLFxuICApO1xuXG4gIHJlYWRvbmx5IGVuYWJsZWQgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IHRvb2xNb2RlID0gc2lnbmFsPFRvb2xNb2RlPignbm9uZScpO1xuICByZWFkb25seSBndWlkZU9yaWVudGF0aW9uID0gc2lnbmFsPEd1aWRlT3JpZW50YXRpb24+KCd2ZXJ0aWNhbCcpO1xuICByZWFkb25seSBndWlkZXMgPSBzaWduYWw8R3VpZGVbXT4oW10pO1xuICByZWFkb25seSBob3ZlclJlY3QgPSBzaWduYWw8UmVjdCB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzZWxlY3RlZEd1aWRlSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkTWVhc3VyZW1lbnQgPSBzaWduYWw8SW5zcGVjdE1lYXN1cmVtZW50IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNob3dUeXBvZ3JhcGh5ID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgYWx0UHJlc3NlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGRpc3RhbmNlT3ZlcmxheSA9IHNpZ25hbDxEaXN0YW5jZU92ZXJsYXkgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdGV4dEJsb2NrcyA9IHNpZ25hbDxUZXh0QmxvY2tBbm5vdGF0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgZ3VpZGVQcmV2aWV3ID0gc2lnbmFsPEd1aWRlIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRNZXRhTGluZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudCgpO1xuICAgIGlmICghc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3NlbGVjdGVkLmxhYmVsfSDCtyAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLnJlY3Qud2lkdGgpfSB4ICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQucmVjdC5oZWlnaHQpfSDCtyAke3NlbGVjdGVkLnN0eWxlcy5mb250U2l6ZX0gLyAke3NlbGVjdGVkLnN0eWxlcy5saW5lSGVpZ2h0fSAvICR7c2VsZWN0ZWQuc3R5bGVzLmNvbG9yfWA7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGh5ZHJhdGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3J5ID0gc2lnbmFsPEd1aWRlW11bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RvcnlJbmRleCA9IHNpZ25hbCgtMSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2FwdHVyZWRDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFldmVudC5zaGlmdEtleSB8fFxuICAgICAgIXRoaXMuY2FuSW5zcGVjdENsaWNrKGV2ZW50KSB8fFxuICAgICAgIXRoaXMuc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfTtcbiAgcHJpdmF0ZSBkcmFnZ2luZ0d1aWRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdG9hc3RUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICByZWFkb25seSBjYW5VbmRvID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oaXN0b3J5SW5kZXgoKSA+IDApO1xuICByZWFkb25seSBjYW5SZWRvID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4KCkgPj0gMCAmJlxuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgoKSA8IHRoaXMuaGlzdG9yeSgpLmxlbmd0aCAtIDEsXG4gICk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogb2JqZWN0KSB7XG4gICAgdGhpcy5pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucGVyc2lzdE9uUmVsb2FkIHx8ICF0aGlzLmlzQnJvd3NlciB8fCAhdGhpcy5oeWRyYXRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZDogaW5zcGVjdG9yUGVyc2lzdGVkU3RhdGUgPSB7XG4gICAgICAgIHZlcnNpb246IGluc3BlY3Rvcl9TVEFURV9WRVJTSU9OLFxuICAgICAgICBlbmFibGVkOiB0aGlzLmVuYWJsZWQoKSxcbiAgICAgICAgdG9vbE1vZGU6IHRoaXMudG9vbE1vZGUoKSxcbiAgICAgICAgZ3VpZGVPcmllbnRhdGlvbjogdGhpcy5ndWlkZU9yaWVudGF0aW9uKCksXG4gICAgICAgIGd1aWRlczogdGhpcy5ndWlkZXMoKSxcbiAgICAgICAgc2hvd1R5cG9ncmFwaHk6IHRoaXMuc2hvd1R5cG9ncmFwaHkoKSxcbiAgICAgIH07XG5cbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgaW5zcGVjdG9yX1NUT1JBR0VfS0VZLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNhcHR1cmVkQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMucGVyc2lzdE9uUmVsb2FkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oaW5zcGVjdG9yX1NUT1JBR0VfS0VZKTtcbiAgICBpZiAoIXN0b3JlZCkge1xuICAgICAgdGhpcy5oeWRyYXRlZC5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RvcmVkKSBhc1xuICAgICAgICB8IGluc3BlY3RvclBlcnNpc3RlZFN0YXRlXG4gICAgICAgIHwgaW5zcGVjdG9yTGVnYWN5UGVyc2lzdGVkU3RhdGU7XG4gICAgICBpZiAocGFyc2VkLnZlcnNpb24gPT09IGluc3BlY3Rvcl9TVEFURV9WRVJTSU9OIHx8IHBhcnNlZC52ZXJzaW9uID09PSAxKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZC5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KHBhcnNlZC50b29sTW9kZSk7XG4gICAgICAgIHRoaXMuZ3VpZGVPcmllbnRhdGlvbi5zZXQocGFyc2VkLmd1aWRlT3JpZW50YXRpb24pO1xuICAgICAgICB0aGlzLmd1aWRlcy5zZXQocGFyc2VkLmd1aWRlcyA/PyBbXSk7XG4gICAgICAgIHRoaXMuc2hvd1R5cG9ncmFwaHkuc2V0KFxuICAgICAgICAgIHBhcnNlZC52ZXJzaW9uID09PSAxID8gZmFsc2UgOiAocGFyc2VkLnNob3dUeXBvZ3JhcGh5ID8/IGZhbHNlKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZWNvcmRIaXN0b3J5KHBhcnNlZC5ndWlkZXMgPz8gW10pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIG1hbGZvcm1lZCBzdGF0ZVxuICAgIH1cblxuICAgIHRoaXMuaHlkcmF0ZWQuc2V0KHRydWUpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNhcHR1cmVkQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMudG9hc3RUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RUaW1lcik7XG4gIH1cblxuICBzZXRUb29sTW9kZShtb2RlOiBUb29sTW9kZSkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZW5hYmxlZC5zZXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy50b29sTW9kZS5zZXQodGhpcy50b29sTW9kZSgpID09PSBtb2RlID8gJ25vbmUnIDogbW9kZSk7XG4gICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgc2V0R3VpZGVPcmllbnRhdGlvbihvcmllbnRhdGlvbjogR3VpZGVPcmllbnRhdGlvbikge1xuICAgIHRoaXMuZ3VpZGVPcmllbnRhdGlvbi5zZXQob3JpZW50YXRpb24pO1xuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgfVxuXG4gIGFjdGl2YXRlR3VpZGVPcmllbnRhdGlvbihvcmllbnRhdGlvbjogR3VpZGVPcmllbnRhdGlvbikge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy50b29sTW9kZSgpID09PSAnZ3VpZGVzJyAmJiB0aGlzLmd1aWRlT3JpZW50YXRpb24oKSA9PT0gb3JpZW50YXRpb247XG4gICAgdGhpcy5zZXRHdWlkZU9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTtcbiAgICBpZiAoaXNBY3RpdmUgfHwgdGhpcy50b29sTW9kZSgpICE9PSAnZ3VpZGVzJykge1xuICAgICAgdGhpcy5zZXRUb29sTW9kZSgnZ3VpZGVzJyk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlVHlwb2dyYXBoeSgpIHtcbiAgICB0aGlzLnNob3dUeXBvZ3JhcGh5LnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgZGlzYWJsZUluc3BlY3RvcigpIHtcbiAgICB0aGlzLnNldEluc3BlY3RvckVuYWJsZWQoZmFsc2UpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZUNoZWNrcG9pbnQoKSB7XG4gICAgY29uc3QgY2hlY2twb2ludCA9IGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LnNhdmUoKTtcbiAgICBpZiAoY2hlY2twb2ludCkge1xuICAgICAgdGhpcy5zaG93Q2hlY2twb2ludFRvYXN0KGBTYXZlZCDigJwke2NoZWNrcG9pbnQubmFtZX3igJ0uYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5lcnJvcigpKSB7XG4gICAgICB0aGlzLnNob3dDaGVja3BvaW50VG9hc3QodGhpcy5jaGVja3BvaW50U2VydmljZS5lcnJvcigpISwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3BlbkNoZWNrcG9pbnRDb21tYW5kQmFyKCkge1xuICAgIGlmICghdGhpcy5jaGVja3BvaW50U2VydmljZSB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgdGhpcy5jb21tYW5kQmFyT3BlbigpKSByZXR1cm47XG4gICAgdGhpcy5jb21tYW5kQmFyT3Blbi5zZXQodHJ1ZSk7XG4gICAgdGhpcy5jaGVja3BvaW50UXVlcnkuc2V0KCcnKTtcbiAgICB0aGlzLmFjdGl2ZUNoZWNrcG9pbnRJbmRleC5zZXQoMCk7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5zaG93TW9kYWwoKTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpKTtcbiAgICBhd2FpdCB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLmxvYWQoKTtcbiAgICB0aGlzLmNsYW1wQWN0aXZlQ2hlY2twb2ludCgpO1xuICB9XG5cbiAgY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpIHtcbiAgICBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZT8uYnVzeSgpKSByZXR1cm47XG4gICAgdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICB0aGlzLmNvbW1hbmRCYXJPcGVuLnNldChmYWxzZSk7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgfVxuXG4gIHVwZGF0ZUNoZWNrcG9pbnRRdWVyeShldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLmNoZWNrcG9pbnRRdWVyeS5zZXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG4gICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KDApO1xuICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VydmljZT8uY2xlYXJFcnJvcigpO1xuICB9XG5cbiAgc2V0QWN0aXZlQ2hlY2twb2ludChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KGluZGV4KTtcbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmVDaGVja3BvaW50KGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2twb2ludFNlcnZpY2UgfHwgdGhpcy5jaGVja3BvaW50U2VydmljZS5idXN5KCkpIHJldHVybjtcbiAgICBjb25zdCByZXN0b3JlZCA9IGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2UucmVzdG9yZShjaGVja3BvaW50LmlkKTtcbiAgICBpZiAoIXJlc3RvcmVkKSByZXR1cm47XG4gICAgdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICB0aGlzLmNvbW1hbmRCYXJPcGVuLnNldChmYWxzZSk7XG4gICAgdGhpcy5zaG93Q2hlY2twb2ludFRvYXN0KGBSZXN0b3JlZCDigJwke2NoZWNrcG9pbnQubmFtZX3igJ0uYCk7XG4gIH1cblxuICBiZWdpblJlbmFtZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLCBldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5idXN5KCkpIHJldHVybjtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KGNoZWNrcG9pbnQuaWQpO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMucmVuYW1lRHJhZnQuc2V0KGNoZWNrcG9pbnQubmFtZSk7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFxuICAgICAgICAnLmluc3BlY3Rvci1jb21tYW5kLXJvd19fcmVuYW1lJyxcbiAgICAgICk7XG4gICAgICBpbnB1dD8uZm9jdXMoKTtcbiAgICAgIGlucHV0Py5zZWxlY3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVJlbmFtZURyYWZ0KGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMucmVuYW1lRHJhZnQuc2V0KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xuICAgIHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmNsZWFyRXJyb3IoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFJlbmFtZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKSB7XG4gICAgaWYgKGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LnJlbmFtZShjaGVja3BvaW50LmlkLCB0aGlzLnJlbmFtZURyYWZ0KCkpKSB7XG4gICAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBjYW5jZWxSZW5hbWUoKSB7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jbGVhckVycm9yKCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGJlZ2luRGVsZXRlKGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsIGV2ZW50PzogRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KGNoZWNrcG9pbnQuaWQpO1xuICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gIH1cblxuICBjYW5jZWxEZWxldGUoZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgYXN5bmMgY29uZmlybURlbGV0ZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLCBldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghYXdhaXQgdGhpcy5jaGVja3BvaW50U2VydmljZT8uZGVsZXRlKGNoZWNrcG9pbnQuaWQpKSByZXR1cm47XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jbGFtcEFjdGl2ZUNoZWNrcG9pbnQoKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgaGFuZGxlQ2hlY2twb2ludERpYWxvZ0NsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgZXZlbnQudGFyZ2V0ID09PSB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudCAmJlxuICAgICAgIXRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSAmJlxuICAgICAgIXRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQoKVxuICAgICkge1xuICAgICAgdGhpcy5jbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJHdWlkZXMoKSB7XG4gICAgdGhpcy5ndWlkZXMuc2V0KFtdKTtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KFtdKTtcbiAgfVxuXG4gIHRyYWNrR3VpZGUgPSAoX2luZGV4OiBudW1iZXIsIGd1aWRlOiBHdWlkZSkgPT4gZ3VpZGUuaWQ7XG4gIHRyYWNrVGV4dEJsb2NrID0gKF9pbmRleDogbnVtYmVyLCBibG9jazogVGV4dEJsb2NrQW5ub3RhdGlvbikgPT4gYmxvY2suaWQ7XG4gIHRyYWNrQ29ubmVjdG9yID0gKFxuICAgIF9pbmRleDogbnVtYmVyLFxuICAgIGNvbm5lY3RvcjogRGlzdGFuY2VPdmVybGF5Wydjb25uZWN0b3JzJ11bbnVtYmVyXSxcbiAgKSA9PiBgJHtjb25uZWN0b3IueDF9OiR7Y29ubmVjdG9yLnkxfToke2Nvbm5lY3Rvci54Mn06JHtjb25uZWN0b3IueTJ9YDtcblxuICBzdGFydEd1aWRlRHJhZyhldmVudDogUG9pbnRlckV2ZW50LCBndWlkZTogR3VpZGUpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gZ3VpZGUuaWQ7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KGd1aWRlLmlkKTtcbiAgfVxuXG4gIGZvcm1hdEVkZ2VzKGVkZ2VzOiBJbnNwZWN0TWVhc3VyZW1lbnRbJ3BhZGRpbmcnXSkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShlZGdlcy50b3ApfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLnJpZ2h0KX0gJHtmb3JtYXRWYWx1ZShlZGdlcy5ib3R0b20pfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLmxlZnQpfWA7XG4gIH1cblxuICBmb3JtYXRHYXAoc2VsZWN0ZWQ6IEluc3BlY3RNZWFzdXJlbWVudCkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5nYXAucm93KX0gLyAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLmdhcC5jb2x1bW4pfWA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuY2hlY2twb2ludFNlcnZpY2UgJiZcbiAgICAgICFldmVudC5yZXBlYXQgJiZcbiAgICAgIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXG4gICAgICBldmVudC5zaGlmdEtleSAmJlxuICAgICAga2V5ID09PSAncCdcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNvbW1hbmRCYXJPcGVuKCkgPyB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKSA6IHZvaWQgdGhpcy5vcGVuQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb21tYW5kQmFyT3BlbigpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbW1hbmRCYXJLZXlkb3duKGV2ZW50LCBrZXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmIChcbiAgICAgICAgdGFyZ2V0Py5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCcpIHx8XG4gICAgICAgIHRhcmdldD8uaXNDb250ZW50RWRpdGFibGVcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRJbnNwZWN0b3JFbmFibGVkKCF0aGlzLmVuYWJsZWQoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJiBrZXkgPT09ICd6Jykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy5yZWRvKCkgOiB0aGlzLnVuZG8oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAncycpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKCdzZWxlY3QnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZycpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFRvb2xNb2RlKCdndWlkZXMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnaCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEd1aWRlT3JpZW50YXRpb24oJ2hvcml6b250YWwnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAndicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEd1aWRlT3JpZW50YXRpb24oJ3ZlcnRpY2FsJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0FsdCcpIHtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdlc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgIHRoaXMuY2xlYXJHdWlkZXMoKTtcbiAgICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoKGtleSA9PT0gJ2JhY2tzcGFjZScgfHwga2V5ID09PSAnZGVsZXRlJykgJiYgdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IG5leHRHdWlkZXMgPSB0aGlzLmd1aWRlcygpLmZpbHRlcihcbiAgICAgICAgKGd1aWRlKSA9PiBndWlkZS5pZCAhPT0gdGhpcy5zZWxlY3RlZEd1aWRlSWQoKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmd1aWRlcy5zZXQobmV4dEd1aWRlcyk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnJlY29yZEhpc3RvcnkobmV4dEd1aWRlcyk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5dXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQWx0Jykge1xuICAgICAgdGhpcy5hbHRQcmVzc2VkLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJtb3ZlJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlUG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkgfHwgIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgICAgdGhpcy5ndWlkZXMuc2V0KFxuICAgICAgICB0aGlzLmd1aWRlcygpLm1hcCgoZ3VpZGUpID0+IHtcbiAgICAgICAgICBpZiAoZ3VpZGUuaWQgIT09IHRoaXMuZHJhZ2dpbmdHdWlkZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ3VpZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgICAgICAgY29uc3QgbWF4ID1cbiAgICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gdmlld3BvcnQud2lkdGggOiB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZ3VpZGUsIHBvc2l0aW9uOiBjbGFtcChyYXdQb3NpdGlvbiwgMCwgbWF4KSB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpID8/XG4gICAgICAgIGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldCh0aGlzLmdldEd1aWRlUHJldmlldyhldmVudCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgIT09ICdzZWxlY3QnIHx8ICF0aGlzLmhvdmVySGlnaGxpZ2h0RW5hYmxlZCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmFsdFByZXNzZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICAgKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBnZXRSZWN0RnJvbURvbSh0YXJnZXQpO1xuICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gdGFyZ2V0O1xuICAgIGlmICghcmVjdHNFcXVhbChyZWN0LCB0aGlzLmhvdmVyUmVjdCgpKSkge1xuICAgICAgdGhpcy5ob3ZlclJlY3Quc2V0KHJlY3QpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnKVxuICBoYW5kbGVQb2ludGVyVXAoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlY29yZEhpc3RvcnkodGhpcy5ndWlkZXMoKSk7XG4gICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBudWxsO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdndWlkZXMnKSB7XG4gICAgICBpZiAob3ZlcmxheSAmJiBvdmVybGF5LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBndWlkZSA9IHRoaXMuZ2V0R3VpZGVQcmV2aWV3KGV2ZW50KTtcbiAgICAgIHRoaXMuYWRkR3VpZGUoeyAuLi5ndWlkZSwgaWQ6IGNyZWF0ZUlkKCkgfSk7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQoZ3VpZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jYW5JbnNwZWN0Q2xpY2soZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RFbGVtZW50QXRQb2ludChldmVudCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpXG4gIGhhbmRsZVZpZXdwb3J0Q2hhbmdlKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCAmJiBkb2N1bWVudC5jb250YWlucyh0aGlzLnNlbGVjdGVkRWxlbWVudCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRGlzdGFuY2VPdmVybGF5KCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5JbnNwZWN0Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3NlciB8fCB0aGlzLnRvb2xNb2RlKCkgIT09ICdzZWxlY3QnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsO1xuICAgIHJldHVybiAhKG92ZXJsYXkgJiYgb3ZlcmxheS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbnNwZWN0b3JFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVuYWJsZWQuc2V0KGVuYWJsZWQpO1xuICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgdGhpcy50b29sTW9kZS5zZXQoJ25vbmUnKTtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFtdKTtcbiAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5ob3ZlckVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kcmFnZ2luZ0d1aWRlSWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbW1hbmRCYXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGNoZWNrcG9pbnRzID0gdGhpcy5maWx0ZXJlZENoZWNrcG9pbnRzKCk7XG4gICAgY29uc3QgYWN0aXZlID0gY2hlY2twb2ludHNbdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXgoKV07XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBpc1JlbmFtZUlucHV0ID0gdGFyZ2V0Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdpbnNwZWN0b3ItY29tbWFuZC1yb3dfX3JlbmFtZScpID8/IGZhbHNlO1xuXG4gICAgaWYgKGtleSA9PT0gJ2VzY2FwZScpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy5lZGl0aW5nQ2hlY2twb2ludElkKCkpIHRoaXMuY2FuY2VsUmVuYW1lKCk7XG4gICAgICBlbHNlIGlmICh0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkKCkpIHRoaXMuY2FuY2VsRGVsZXRlKCk7XG4gICAgICBlbHNlIHRoaXMuY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZT8uYnVzeSgpKSByZXR1cm47XG4gICAgY29uc3QgZWRpdGluZ0NoZWNrcG9pbnQgPSBjaGVja3BvaW50cy5maW5kKCh7IGlkIH0pID0+IGlkID09PSB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQoKSk7XG4gICAgaWYgKGlzUmVuYW1lSW5wdXQgJiYga2V5ID09PSAnZW50ZXInICYmIGVkaXRpbmdDaGVja3BvaW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdm9pZCB0aGlzLmZpbmlzaFJlbmFtZShlZGl0aW5nQ2hlY2twb2ludCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1JlbmFtZUlucHV0KSByZXR1cm47XG4gICAgaWYgKGtleSA9PT0gJ2Fycm93ZG93bicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFjdGl2ZUNoZWNrcG9pbnRJbmRleC5zZXQoTWF0aC5taW4odGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXgoKSArIDEsIE1hdGgubWF4KDAsIGNoZWNrcG9pbnRzLmxlbmd0aCAtIDEpKSk7XG4gICAgICB0aGlzLnNjcm9sbEFjdGl2ZUNoZWNrcG9pbnRJbnRvVmlldygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAnYXJyb3d1cCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFjdGl2ZUNoZWNrcG9pbnRJbmRleC5zZXQoTWF0aC5tYXgoMCwgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXgoKSAtIDEpKTtcbiAgICAgIHRoaXMuc2Nyb2xsQWN0aXZlQ2hlY2twb2ludEludG9WaWV3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdlbnRlcicgJiYgYWN0aXZlICYmICF0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2b2lkIHRoaXMucmVzdG9yZUNoZWNrcG9pbnQoYWN0aXZlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2YyJyAmJiBhY3RpdmUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmJlZ2luUmVuYW1lKGFjdGl2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdkZWxldGUnICYmIGFjdGl2ZSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuYmVnaW5EZWxldGUoYWN0aXZlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsYW1wQWN0aXZlQ2hlY2twb2ludCgpIHtcbiAgICB0aGlzLmFjdGl2ZUNoZWNrcG9pbnRJbmRleC5zZXQoXG4gICAgICBNYXRoLm1pbih0aGlzLmFjdGl2ZUNoZWNrcG9pbnRJbmRleCgpLCBNYXRoLm1heCgwLCB0aGlzLmZpbHRlcmVkQ2hlY2twb2ludHMoKS5sZW5ndGggLSAxKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsQWN0aXZlQ2hlY2twb2ludEludG9WaWV3KCkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuY2hlY2twb2ludERpYWxvZygpPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxuICAgICAgICBgW2RhdGEtY2hlY2twb2ludC1pbmRleD1cIiR7dGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXgoKX1cIl1gLFxuICAgICAgKTtcbiAgICAgIHJvdz8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Q2hlY2twb2ludFRvYXN0KG1lc3NhZ2U6IHN0cmluZywgaXNFcnJvciA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMudG9hc3RUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RUaW1lcik7XG4gICAgdGhpcy5jaGVja3BvaW50VG9hc3RJc0Vycm9yLnNldChpc0Vycm9yKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRUb2FzdC5zZXQobWVzc2FnZSk7XG4gICAgdGhpcy50b2FzdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRUb2FzdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmNoZWNrcG9pbnRUb2FzdElzRXJyb3Iuc2V0KGZhbHNlKTtcbiAgICB9LCAyNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0RWxlbWVudChcbiAgICAgIHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgb3ZlcmxheSxcbiAgICApO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEN0cmwrY2xpY2s6IHNlbGVjdCB0aGUgbWluaW11bSBjb21tb24gcGFyZW50IG9mIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBjbGlja2VkIGVsZW1lbnRcbiAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgdGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNvbW1vblBhcmVudCA9IHRoaXMuZmluZE1pbmltdW1Db21tb25QYXJlbnQoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LFxuICAgICAgICB0YXJnZXQsXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBjb21tb25QYXJlbnQgJiZcbiAgICAgICAgY29tbW9uUGFyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmXG4gICAgICAgIGNvbW1vblBhcmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChnZXRJbnNwZWN0TWVhc3VyZW1lbnQoY29tbW9uUGFyZW50KSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gY29tbW9uUGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KHRhcmdldCkpO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChcbiAgICAgIHRoaXMuZmluZEd1aWRlQXRQb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSxcbiAgICApO1xuICAgIHRoaXMudXBkYXRlRGlzdGFuY2VPdmVybGF5KCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEaXN0YW5jZU92ZXJsYXkoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuYWx0UHJlc3NlZCgpIHx8XG4gICAgICAhdGhpcy5zZWxlY3RlZEVsZW1lbnQgfHxcbiAgICAgICF0aGlzLmhvdmVyRWxlbWVudCB8fFxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPT09IHRoaXMuaG92ZXJFbGVtZW50IHx8XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5jb250YWlucyh0aGlzLmhvdmVyRWxlbWVudCkgfHxcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50LmNvbnRhaW5zKHRoaXMuc2VsZWN0ZWRFbGVtZW50KVxuICAgICkge1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChcbiAgICAgIGdldERpc3RhbmNlT3ZlcmxheShcbiAgICAgICAgZ2V0UmVjdEZyb21Eb20odGhpcy5zZWxlY3RlZEVsZW1lbnQpLFxuICAgICAgICBnZXRSZWN0RnJvbURvbSh0aGlzLmhvdmVyRWxlbWVudCksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCkge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIgfHwgIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLnNob3dUeXBvZ3JhcGh5KCkpIHtcbiAgICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2V0Vmlld3BvcnRTaXplKCk7XG4gICAgdGhpcy50ZXh0QmxvY2tzLnNldChcbiAgICAgIGdldFZpc2libGVUZXh0QmxvY2tzKHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChibG9jaykgPT5cbiAgICAgICAgICAgIGJsb2NrLnJlY3QudG9wID49IDAgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QudG9wIDw9IHZpZXdwb3J0LmhlaWdodCAmJlxuICAgICAgICAgICAgYmxvY2sucmVjdC5sZWZ0ID49IDAgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QubGVmdCA8PSB2aWV3cG9ydC53aWR0aCxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChibG9jaykgPT4gKHtcbiAgICAgICAgICAuLi5ibG9jayxcbiAgICAgICAgICByZWN0OiB7XG4gICAgICAgICAgICAuLi5ibG9jay5yZWN0LFxuICAgICAgICAgICAgbGVmdDogY2xhbXAoYmxvY2sucmVjdC5sZWZ0LCAwLCB2aWV3cG9ydC53aWR0aCAtIDEyKSxcbiAgICAgICAgICAgIHRvcDogY2xhbXAoYmxvY2sucmVjdC50b3AsIDE0LCB2aWV3cG9ydC5oZWlnaHQpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRHdWlkZShndWlkZTogR3VpZGUpIHtcbiAgICBjb25zdCBuZXh0R3VpZGVzID0gWy4uLnRoaXMuZ3VpZGVzKCksIGd1aWRlXTtcbiAgICB0aGlzLmd1aWRlcy5zZXQobmV4dEd1aWRlcyk7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KGd1aWRlLmlkKTtcbiAgICB0aGlzLnJlY29yZEhpc3RvcnkobmV4dEd1aWRlcyk7XG4gIH1cblxuICBwcml2YXRlIGdldEd1aWRlUHJldmlldyhldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCk6IEd1aWRlIHtcbiAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdGhpcy5ndWlkZU9yaWVudGF0aW9uKCk7XG4gICAgY29uc3QgcmF3UG9zaXRpb24gPVxuICAgICAgb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBldmVudC5jbGllbnRYIDogZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBtYXggPSBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHZpZXdwb3J0LndpZHRoIDogdmlld3BvcnQuaGVpZ2h0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiAncHJldmlldycsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnNuYXBHdWlkZShjbGFtcChyYXdQb3NpdGlvbiwgMCwgbWF4KSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc25hcEd1aWRlKHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IGd1aWRlIG9mIHRoaXMuZ3VpZGVzKCkpIHtcbiAgICAgIGlmIChNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHBvc2l0aW9uKSA8PSBHVUlERV9TTkFQX0RJU1RBTkNFKSB7XG4gICAgICAgIHJldHVybiBndWlkZS5wb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kR3VpZGVBdFBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBndWlkZSBvZiB0aGlzLmd1aWRlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnICYmXG4gICAgICAgIE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0geCkgPD0gR1VJREVfSElUQk9YX1NJWkVcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZ3VpZGUuaWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgJiZcbiAgICAgICAgTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSB5KSA8PSBHVUlERV9ISVRCT1hfU0laRVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBndWlkZS5pZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHVuZG8oKSB7XG4gICAgaWYgKCF0aGlzLmNhblVuZG8oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmhpc3RvcnlJbmRleCgpIC0gMTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICB0aGlzLmd1aWRlcy5zZXQodGhpcy5jbG9uZUd1aWRlcyh0aGlzLmhpc3RvcnkoKVtuZXh0SW5kZXhdKSk7XG4gIH1cblxuICBwcml2YXRlIHJlZG8oKSB7XG4gICAgaWYgKCF0aGlzLmNhblJlZG8oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmhpc3RvcnlJbmRleCgpICsgMTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICB0aGlzLmd1aWRlcy5zZXQodGhpcy5jbG9uZUd1aWRlcyh0aGlzLmhpc3RvcnkoKVtuZXh0SW5kZXhdKSk7XG4gIH1cblxuICBwcml2YXRlIHJlY29yZEhpc3RvcnkoZ3VpZGVzOiBHdWlkZVtdKSB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuaGlzdG9yeSgpLnNsaWNlKDAsIHRoaXMuaGlzdG9yeUluZGV4KCkgKyAxKTtcbiAgICBiYXNlLnB1c2godGhpcy5jbG9uZUd1aWRlcyhndWlkZXMpKTtcbiAgICB0aGlzLmhpc3Rvcnkuc2V0KGJhc2UpO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChiYXNlLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUd1aWRlcyhndWlkZXM6IEd1aWRlW10pIHtcbiAgICByZXR1cm4gZ3VpZGVzLm1hcCgoZ3VpZGUpID0+ICh7IC4uLmd1aWRlIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1pbmltdW1Db21tb25QYXJlbnQoXG4gICAgZWxlbWVudEE6IEhUTUxFbGVtZW50LFxuICAgIGVsZW1lbnRCOiBIVE1MRWxlbWVudCxcbiAgKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBCdWlsZCBhbmNlc3RvciBjaGFpbiBmb3IgZWxlbWVudCBBXG4gICAgY29uc3QgYW5jZXN0b3JzQSA9IG5ldyBTZXQ8RWxlbWVudD4oKTtcbiAgICBsZXQgY3VycmVudDogRWxlbWVudCB8IG51bGwgPSBlbGVtZW50QTtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgYW5jZXN0b3JzQS5hZGQoY3VycmVudCk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFdhbGsgdXAgZnJvbSBlbGVtZW50QiB1bnRpbCB3ZSBmaW5kIGEgY29tbW9uIGFuY2VzdG9yXG4gICAgY3VycmVudCA9IGVsZW1lbnRCO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBpZiAoYW5jZXN0b3JzQS5oYXMoY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLXJvb3RcIiAjb3ZlcmxheVJvb3Q+XG4gIEBpZiAoZW5hYmxlZCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLXRvb2xiYXJfX3JhaWxcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInRvb2xNb2RlKCkgPT09ICdzZWxlY3QnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VG9vbE1vZGUoJ3NlbGVjdCcpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VsZWN0IG1vZGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTMgMmw4IDgtMyAuN0w2LjcgMTMgNiAxMCAzIDJ6XCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci10b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj5TZWxlY3Q8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIEBpZiAoY2hlY2twb2ludFNlcnZpY2UpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzYXZlQ2hlY2twb2ludCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjaGVja3BvaW50U2VydmljZS5idXN5KClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNhdmUgY2hlY2twb2ludFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMi41IDJoOS42bDEuNCAxLjRWMTRoLTExem0yIDEuNXYzaDZ2LTN6bS41IDZWMTJoNlY5LjV6XCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+U2F2ZSBjaGVja3BvaW50PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19zZWNvbmRhcnlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLXRvb2xiYXJfX3JldmVhbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19yZXZlYWwtaW5uZXJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInNob3dUeXBvZ3JhcGh5KClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVUeXBvZ3JhcGh5KClcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJUeXBvZ3JhcGh5IG92ZXJsYXlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNFYyaDEwdjJoLTR2MTBIN1Y0elwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+VHlwb2dyYXBoeTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInRvb2xNb2RlKCkgPT09ICdndWlkZXMnICYmIGd1aWRlT3JpZW50YXRpb24oKSA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlR3VpZGVPcmllbnRhdGlvbigndmVydGljYWwnKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlZlcnRpY2FsIGd1aWRlc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNSAyaDEuNXYxMmgtMS41elwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+VmVydGljYWwgZ3VpZGVzPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItaWNvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwidG9vbE1vZGUoKSA9PT0gJ2d1aWRlcycgJiYgZ3VpZGVPcmllbnRhdGlvbigpID09PSAnaG9yaXpvbnRhbCdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZUd1aWRlT3JpZW50YXRpb24oJ2hvcml6b250YWwnKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkhvcml6b250YWwgZ3VpZGVzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yIDcuMjVoMTJ2MS41SDJ6XCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci10b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj5Ib3Jpem9udGFsIGd1aWRlczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhcl9fZGl2aWRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uIGluc3BlY3Rvci1pY29uLWJ1dHRvbi0tcG93ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJkaXNhYmxlSW5zcGVjdG9yKClcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJEaXNhYmxlIGluc3BlY3RvcjsgcHJlc3MgTSB0byBlbmFibGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcuMjUgMS41aDEuNXY2aC0xLjV6TTQuMSAzLjM1bC45NiAxLjE1QTQuMjUgNC4yNSAwIDEgMCAxMC45NCA0LjVsLjk2LTEuMTVBNS43NSA1Ljc1IDAgMSAxIDQuMSAzLjM1elwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+RGlzYWJsZTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIEBpZiAoY2hlY2twb2ludFNlcnZpY2UpIHtcbiAgICA8ZGlhbG9nXG4gICAgICAjY2hlY2twb2ludERpYWxvZ1xuICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1kaWFsb2dcIlxuICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiaW5zcGVjdG9yLWNvbW1hbmQtdGl0bGVcIlxuICAgICAgKGNhbmNlbCk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVDaGVja3BvaW50RGlhbG9nQ2xpY2soJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgPGhlYWRlciBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19zZWFyY2hcIj5cbiAgICAgICAgICA8bGFiZWwgaWQ9XCJpbnNwZWN0b3ItY29tbWFuZC10aXRsZVwiIGNsYXNzPVwiaW5zcGVjdG9yLXZpc3VhbGx5LWhpZGRlblwiIGZvcj1cImluc3BlY3Rvci1jaGVja3BvaW50LXNlYXJjaFwiPlxuICAgICAgICAgICAgU2VhcmNoIGNoZWNrcG9pbnRzXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNjaGVja3BvaW50U2VhcmNoXG4gICAgICAgICAgICBpZD1cImluc3BlY3Rvci1jaGVja3BvaW50LXNlYXJjaFwiXG4gICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGaW5kIGEgY2hlY2twb2ludOKAplwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiY2hlY2twb2ludFF1ZXJ5KClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCInaW5zcGVjdG9yLWNoZWNrcG9pbnQtcmVzdWx0cydcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImZpbHRlcmVkQ2hlY2twb2ludHMoKS5sZW5ndGggPyAnaW5zcGVjdG9yLWNoZWNrcG9pbnQtJyArIGZpbHRlcmVkQ2hlY2twb2ludHMoKVthY3RpdmVDaGVja3BvaW50SW5kZXgoKV0uaWQgOiBudWxsXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJ1cGRhdGVDaGVja3BvaW50UXVlcnkoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgQGlmIChjaGVja3BvaW50U2VydmljZS5lcnJvcigpOyBhcyBlcnJvcikge1xuICAgICAgICAgIDxwIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmRfX21lc3NhZ2UgaW5zcGVjdG9yLWNvbW1hbmRfX21lc3NhZ2UtLWVycm9yXCIgcm9sZT1cImFsZXJ0XCI+e3sgZXJyb3IgfX08L3A+XG4gICAgICAgIH1cblxuICAgICAgICA8ZGl2IGlkPVwiaW5zcGVjdG9yLWNoZWNrcG9pbnQtcmVzdWx0c1wiIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmRfX3Jlc3VsdHNcIiByb2xlPVwibGlzdGJveFwiIGFyaWEtbGFiZWw9XCJTYXZlZCBjaGVja3BvaW50c1wiPlxuICAgICAgICAgIEBpZiAoY2hlY2twb2ludFNlcnZpY2UubG9hZGluZygpKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlXCIgcm9sZT1cInN0YXR1c1wiPkxvYWRpbmcgY2hlY2twb2ludHPigKY8L3A+XG4gICAgICAgICAgfSBAZWxzZSBpZiAoIWNoZWNrcG9pbnRTZXJ2aWNlLmNoZWNrcG9pbnRzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlXCIgcm9sZT1cInN0YXR1c1wiPk5vIGNoZWNrcG9pbnRzIHlldC4gU2F2ZSBvbmUgZnJvbSB0aGUgSW5zcGVjdG9yIHRvb2xiYXIuPC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKCFmaWx0ZXJlZENoZWNrcG9pbnRzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlXCIgcm9sZT1cInN0YXR1c1wiPk5vIGNoZWNrcG9pbnQgbWF0Y2hlcyDigJx7eyBjaGVja3BvaW50UXVlcnkoKSB9feKAnS48L3A+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAZm9yIChjaGVja3BvaW50IG9mIGZpbHRlcmVkQ2hlY2twb2ludHMoKTsgdHJhY2sgY2hlY2twb2ludC5pZDsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd1wiXG4gICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgW2lkXT1cIidpbnNwZWN0b3ItY2hlY2twb2ludC0nICsgY2hlY2twb2ludC5pZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jaGVja3BvaW50LWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImFjdGl2ZUNoZWNrcG9pbnRJbmRleCgpID09PSBpbmRleFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJhY3RpdmVDaGVja3BvaW50SW5kZXgoKSA9PT0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1idXN5XT1cImNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKSAmJiBhY3RpdmVDaGVja3BvaW50SW5kZXgoKSA9PT0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEFjdGl2ZUNoZWNrcG9pbnQoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRpbmdDaGVja3BvaW50SWQoKSA9PT0gY2hlY2twb2ludC5pZCB8fCBlZGl0aW5nQ2hlY2twb2ludElkKCkgPT09IGNoZWNrcG9pbnQuaWQgPyBudWxsIDogcmVzdG9yZUNoZWNrcG9pbnQoY2hlY2twb2ludClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChkZWxldGluZ0NoZWNrcG9pbnRJZCgpID09PSBjaGVja3BvaW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fY29uZmlybVwiPkRlbGV0ZSDigJx7eyBjaGVja3BvaW50Lm5hbWUgfX3igJ0/PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX2NvbmZpcm0tYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImlzLWRhbmdlclwiIChjbGljayk9XCJjb25maXJtRGVsZXRlKGNoZWNrcG9pbnQsICRldmVudClcIj5EZWxldGUgY2hlY2twb2ludDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FuY2VsRGVsZXRlKCRldmVudClcIj5LZWVwIGNoZWNrcG9pbnQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChlZGl0aW5nQ2hlY2twb2ludElkKCkgPT09IGNoZWNrcG9pbnQuaWQpIHtcbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fcmVuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNoZWNrcG9pbnQgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyZW5hbWVEcmFmdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInVwZGF0ZVJlbmFtZURyYWZ0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNoZWNrcG9pbnRTZXJ2aWNlLmJ1c3koKSAmJiBhY3RpdmVDaGVja3BvaW50SW5kZXgoKSA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBSZXN0b3Jpbmcg4oCce3sgY2hlY2twb2ludC5uYW1lIH194oCd4oCmXG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHt7IGNoZWNrcG9pbnQubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kLXJvd19fYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYmVnaW5SZW5hbWUoY2hlY2twb2ludCwgJGV2ZW50KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbmFtZSAnICsgY2hlY2twb2ludC5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHBhdGggZD1cIm0xMS44IDEuOCAyLjQgMi40LTguMyA4LjMtMy4xLjcuNy0zLjF6bS04IDEwLjQgMS41LS4zLTEuMi0xLjJ6XCIgLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJiZWdpbkRlbGV0ZShjaGVja3BvaW50LCAkZXZlbnQpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlICcgKyBjaGVja3BvaW50Lm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48cGF0aCBkPVwiTTUuNSAyaDVsLjUgMUgxNHYxLjI1SDJWM2gzem0tMiAzLjI1aDlMMTIgMTRINHpcIiAvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaWFsb2c+XG4gIH1cblxuICBAaWYgKGNoZWNrcG9pbnRUb2FzdCgpOyBhcyB0b2FzdCkge1xuICAgIDxwXG4gICAgICBjbGFzcz1cImluc3BlY3Rvci1jaGVja3BvaW50LXRvYXN0XCJcbiAgICAgIFtjbGFzcy5pbnNwZWN0b3ItY2hlY2twb2ludC10b2FzdC0tZXJyb3JdPVwiY2hlY2twb2ludFRvYXN0SXNFcnJvcigpXCJcbiAgICAgIFthdHRyLnJvbGVdPVwiY2hlY2twb2ludFRvYXN0SXNFcnJvcigpID8gJ2FsZXJ0JyA6ICdzdGF0dXMnXCJcbiAgICA+e3sgdG9hc3QgfX08L3A+XG4gIH1cblxuICBAaWYgKGVuYWJsZWQoKSAmJiB0b29sTW9kZSgpID09PSBcInNlbGVjdFwiKSB7XG4gICAgQGlmIChob3ZlclJlY3QoKSAmJiBob3ZlckhpZ2hsaWdodEVuYWJsZWQpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLWhvdmVyXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiaG92ZXJSZWN0KCkhLmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImhvdmVyUmVjdCgpIS50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaG92ZXJSZWN0KCkhLndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJob3ZlclJlY3QoKSEuaGVpZ2h0XCJcbiAgICAgICAgW3N0eWxlLi0taW5zcGVjdG9yLWFjY2VudF09XCJoaWdobGlnaHRDb2xvclwiXG4gICAgICA+PC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChzZWxlY3RlZE1lYXN1cmVtZW50KCk7IGFzIHNlbGVjdGVkKSB7XG4gICAgICBAaWYgKHNlbGVjdGVkLmdhcC5hY3RpdmUgJiYgc2VsZWN0ZWQucGFyZW50UmVjdCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLWdhcFwiXG4gICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC5sZWZ0XCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QudG9wXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC53aWR0aFwiXG4gICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LmhlaWdodFwiXG4gICAgICAgID48L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveC10YWcgaW5zcGVjdG9yLWJveC10YWctLWdhcFwiXG4gICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC5sZWZ0XCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QudG9wIC0gOFwiXG4gICAgICAgID5cbiAgICAgICAgICBHIHt7IGZvcm1hdEdhcChzZWxlY3RlZCkgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLW1hcmdpblwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5oZWlnaHRcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnIGluc3BlY3Rvci1ib3gtdGFnLS1tYXJnaW5cIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QudG9wIC0gOFwiXG4gICAgICA+XG4gICAgICAgIE0ge3sgZm9ybWF0RWRnZXMoc2VsZWN0ZWQubWFyZ2luKSB9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLXNlbGVjdGVkXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQucmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5yZWN0LnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5yZWN0LndpZHRoXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJzZWxlY3RlZC5yZWN0LmhlaWdodFwiXG4gICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1hY2NlbnRdPVwiaGlnaGxpZ2h0Q29sb3JcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yLWxhYmVsXCI+e3sgc2VsZWN0ZWRNZXRhTGluZSgpIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3ggaW5zcGVjdG9yLWJveC0tcGFkZGluZ1wiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LnRvcFwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3QuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tcGFkZGluZ1wiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgIHNlbGVjdGVkLnBhZGRpbmdSZWN0LnRvcCArIHNlbGVjdGVkLnBhZGRpbmdSZWN0LmhlaWdodCArIDhcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgUCB7eyBmb3JtYXRFZGdlcyhzZWxlY3RlZC5wYWRkaW5nKSB9fVxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgc2hvd1R5cG9ncmFwaHkoKSkge1xuICAgIEBmb3IgKGJsb2NrIG9mIHRleHRCbG9ja3MoKTsgdHJhY2sgYmxvY2suaWQpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItdGV4dC1jaGlwXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiYmxvY2sucmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJibG9jay5yZWN0LnRvcCAtIDhcIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXRleHQtY2hpcF9fc3dhdGNoXCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJibG9jay5zdHlsZXMuY29sb3JcIlxuICAgICAgICA+PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBibG9jay5zdHlsZXMuZm9udFNpemUgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IGJsb2NrLnN0eWxlcy5saW5lSGVpZ2h0IH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBibG9jay5zdHlsZXMuY29sb3IgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cblxuICBAaWYgKGVuYWJsZWQoKSAmJiBhbHRQcmVzc2VkKCkgJiYgZGlzdGFuY2VPdmVybGF5KCk7IGFzIGRpc3RhbmNlKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLWRpc3RhbmNlXCJcbiAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImRpc3RhbmNlLnJlY3RBLmxlZnRcIlxuICAgICAgW3N0eWxlLnRvcC5weF09XCJkaXN0YW5jZS5yZWN0QS50b3BcIlxuICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRpc3RhbmNlLnJlY3RBLndpZHRoXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZGlzdGFuY2UucmVjdEEuaGVpZ2h0XCJcbiAgICA+PC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLWRpc3RhbmNlXCJcbiAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImRpc3RhbmNlLnJlY3RCLmxlZnRcIlxuICAgICAgW3N0eWxlLnRvcC5weF09XCJkaXN0YW5jZS5yZWN0Qi50b3BcIlxuICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRpc3RhbmNlLnJlY3RCLndpZHRoXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZGlzdGFuY2UucmVjdEIuaGVpZ2h0XCJcbiAgICA+PC9kaXY+XG5cbiAgICBAZm9yIChcbiAgICAgIGNvbm5lY3RvciBvZiBkaXN0YW5jZS5jb25uZWN0b3JzO1xuICAgICAgdHJhY2sgdHJhY2tDb25uZWN0b3IoJGluZGV4LCBjb25uZWN0b3IpXG4gICAgKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbm5lY3RvclwiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItY29ubmVjdG9yLS12ZXJ0aWNhbF09XCJjb25uZWN0b3IueDEgPT09IGNvbm5lY3Rvci54MlwiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItY29ubmVjdG9yLS1ob3Jpem9udGFsXT1cImNvbm5lY3Rvci55MSA9PT0gY29ubmVjdG9yLnkyXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiTWF0aC5taW4oY29ubmVjdG9yLngxLCBjb25uZWN0b3IueDIpXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJNYXRoLm1pbihjb25uZWN0b3IueTEsIGNvbm5lY3Rvci55MilcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiTWF0aC5tYXgoMSwgTWF0aC5hYnMoY29ubmVjdG9yLngyIC0gY29ubmVjdG9yLngxKSlcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIk1hdGgubWF4KDEsIE1hdGguYWJzKGNvbm5lY3Rvci55MiAtIGNvbm5lY3Rvci55MSkpXCJcbiAgICAgID48L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGRpc3RhbmNlLmhvcml6b250YWwgJiYgZGlzdGFuY2UuaG9yaXpvbnRhbC52YWx1ZSA+IDApIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtbGluZSBpbnNwZWN0b3ItZGlzdGFuY2UtbGluZS0taG9yaXpvbnRhbFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgIE1hdGgubWluKGRpc3RhbmNlLmhvcml6b250YWwueDEhLCBkaXN0YW5jZS5ob3Jpem9udGFsLngyISlcbiAgICAgICAgXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJkaXN0YW5jZS5ob3Jpem9udGFsLnkhXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIlxuICAgICAgICAgIE1hdGguYWJzKGRpc3RhbmNlLmhvcml6b250YWwueDIhIC0gZGlzdGFuY2UuaG9yaXpvbnRhbC54MSEpXG4gICAgICAgIFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLXRhZ1wiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgIChkaXN0YW5jZS5ob3Jpem9udGFsLngxISArIGRpc3RhbmNlLmhvcml6b250YWwueDIhKSAvIDJcbiAgICAgICAgXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJkaXN0YW5jZS5ob3Jpem9udGFsLnkhICsgMTBcIlxuICAgICAgPlxuICAgICAgICB7eyBmb3JtYXRWYWx1ZShkaXN0YW5jZS5ob3Jpem9udGFsLnZhbHVlKSB9fVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChkaXN0YW5jZS52ZXJ0aWNhbCAmJiBkaXN0YW5jZS52ZXJ0aWNhbC52YWx1ZSA+IDApIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZGlzdGFuY2UtbGluZSBpbnNwZWN0b3ItZGlzdGFuY2UtbGluZS0tdmVydGljYWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS52ZXJ0aWNhbC54IVwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiTWF0aC5taW4oZGlzdGFuY2UudmVydGljYWwueTEhLCBkaXN0YW5jZS52ZXJ0aWNhbC55MiEpXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJcbiAgICAgICAgICBNYXRoLmFicyhkaXN0YW5jZS52ZXJ0aWNhbC55MiEgLSBkaXN0YW5jZS52ZXJ0aWNhbC55MSEpXG4gICAgICAgIFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLXRhZyBpbnNwZWN0b3ItZGlzdGFuY2UtdGFnLS12ZXJ0aWNhbFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImRpc3RhbmNlLnZlcnRpY2FsLnghICsgMTBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIihkaXN0YW5jZS52ZXJ0aWNhbC55MSEgKyBkaXN0YW5jZS52ZXJ0aWNhbC55MiEpIC8gMlwiXG4gICAgICA+XG4gICAgICAgIHt7IGZvcm1hdFZhbHVlKGRpc3RhbmNlLnZlcnRpY2FsLnZhbHVlKSB9fVxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkpIHtcbiAgICBAaWYgKHRvb2xNb2RlKCkgPT09IFwiZ3VpZGVzXCIpIHtcbiAgICAgIEBpZiAoZ3VpZGVQcmV2aWV3KCk7IGFzIHByZXZpZXcpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlIGluc3BlY3Rvci1ndWlkZS0tcHJldmlld1wiXG4gICAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1ndWlkZS0tdmVydGljYWxdPVwicHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1ndWlkZS0taG9yaXpvbnRhbF09XCJcbiAgICAgICAgICAgIHByZXZpZXcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICAgIFwiXG4gICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXG4gICAgICAgICAgICBwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gcHJldmlldy5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgICBwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBwcmV2aWV3LnBvc2l0aW9uIDogbnVsbFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW3N0eWxlLi0taW5zcGVjdG9yLWd1aWRlXT1cImd1aWRlQ29sb3JcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUtbGluZVwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgfVxuXG4gICAgQGZvciAoZ3VpZGUgb2YgZ3VpZGVzKCk7IHRyYWNrIGd1aWRlLmlkKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ndWlkZVwiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXZlcnRpY2FsXT1cImd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1ndWlkZS0taG9yaXpvbnRhbF09XCJndWlkZS5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnXCJcbiAgICAgICAgW2NsYXNzLmluc3BlY3Rvci1ndWlkZS0tc2VsZWN0ZWRdPVwic2VsZWN0ZWRHdWlkZUlkKCkgPT09IGd1aWRlLmlkXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiXG4gICAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBndWlkZS5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJcbiAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gZ3VpZGUucG9zaXRpb24gOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1ndWlkZV09XCJndWlkZUNvbG9yXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cInN0YXJ0R3VpZGVEcmFnKCRldmVudCwgZ3VpZGUpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGUtbGluZVwiPjwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgfVxuPC9kaXY+XG4iXX0=
740
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2luc3BlY3Rvci1uZy9zcmMvbGliL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnNwZWN0b3Itbmcvc3JjL2xpYi9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixHQUN0QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVloRSxPQUFPLEVBRUwsMEJBQTBCLEdBQzNCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQVVoRCxNQUFNLE9BQU8sa0JBQWtCO0lBK0U3QixZQUFpQyxVQUFrQjtRQTlFMUMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNa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T0FBTyxHQUFHLFFBQVEsQ0FBQztRQUNuQixPQUFPLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sT0FBc0IsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDbEMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0ExMUJVLGtCQUFrQixrQkErRVQsV0FBVzttR0EvRXBCLGtCQUFrQix1NUJDeEQvQix1eWdCQStZQTs7NEZEdlZhLGtCQUFrQjtrQkFSOUIsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLEVBQUUsbUJBR00sdUJBQXVCLENBQUMsTUFBTTs7MEJBaUZsQyxNQUFNOzJCQUFDLFdBQVc7eUNBdkV0QixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBcVVOLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF1RzFDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU3hDLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF3RTlDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0I7Z0JBVWhDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMkJ4QyxvQkFBb0I7c0JBRm5CLFlBQVk7dUJBQUMsZUFBZTs7c0JBQzVCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBQTEFURk9STV9JRCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBHVUlERV9ISVRCT1hfU0laRSxcbiAgR1VJREVfU05BUF9ESVNUQU5DRSxcbiAgaW5zcGVjdG9yX1NUQVRFX1ZFUlNJT04sXG4gIGluc3BlY3Rvcl9TVE9SQUdFX0tFWSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zcGVjdE1lYXN1cmVtZW50LFxuICBnZXRSZWN0RnJvbURvbSxcbiAgZ2V0VGFyZ2V0RWxlbWVudCxcbiAgZ2V0VmlzaWJsZVRleHRCbG9ja3MsXG59IGZyb20gJy4vZG9tJztcbmltcG9ydCB7IGdldERpc3RhbmNlT3ZlcmxheSB9IGZyb20gJy4vZGlzdGFuY2VzJztcbmltcG9ydCB7IGNsYW1wLCBnZXRWaWV3cG9ydFNpemUsIHJlY3RzRXF1YWwgfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIERpc3RhbmNlT3ZlcmxheSxcbiAgR3VpZGUsXG4gIEd1aWRlT3JpZW50YXRpb24sXG4gIEluc3BlY3RNZWFzdXJlbWVudCxcbiAgaW5zcGVjdG9yTGVnYWN5UGVyc2lzdGVkU3RhdGUsXG4gIGluc3BlY3RvclBlcnNpc3RlZFN0YXRlLFxuICBSZWN0LFxuICBUZXh0QmxvY2tBbm5vdGF0aW9uLFxuICBUb29sTW9kZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLFxuICBJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSxcbn0gZnJvbSAnLi9jaGVja3BvaW50cyc7XG5pbXBvcnQgeyBmdXp6eUNoZWNrcG9pbnRzIH0gZnJvbSAnLi9jaGVja3BvaW50LXNlYXJjaCc7XG5pbXBvcnQgeyBjcmVhdGVJZCwgZm9ybWF0VmFsdWUgfSBmcm9tICcuL3V0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW5zcGVjdG9yLW92ZXJsYXknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2luc3BlY3Rvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9pbnNwZWN0b3IuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBpbnNwZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICByZWFkb25seSBNYXRoID0gTWF0aDtcbiAgcmVhZG9ubHkgZm9ybWF0VmFsdWUgPSBmb3JtYXRWYWx1ZTtcbiAgcmVhZG9ubHkgZ3VpZGVIaXRib3hTaXplID0gR1VJREVfSElUQk9YX1NJWkU7XG4gIHJlYWRvbmx5IG92ZXJsYXlSb290ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+Pignb3ZlcmxheVJvb3QnKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludERpYWxvZyA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaWFsb2dFbGVtZW50Pj4oJ2NoZWNrcG9pbnREaWFsb2cnKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludFNlYXJjaCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PignY2hlY2twb2ludFNlYXJjaCcpO1xuXG4gIEBJbnB1dCgpIGhpZ2hsaWdodENvbG9yID0gJyM0ZjhjZmYnO1xuICBASW5wdXQoKSBndWlkZUNvbG9yID0gJyNmZjdhMDAnO1xuICBASW5wdXQoKSBob3ZlckhpZ2hsaWdodEVuYWJsZWQgPSB0cnVlO1xuICBASW5wdXQoKSBwZXJzaXN0T25SZWxvYWQgPSBmYWxzZTtcblxuICByZWFkb25seSBjaGVja3BvaW50U2VydmljZSA9IGluamVjdChJbnNwZWN0b3JDaGVja3BvaW50U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgY29tbWFuZEJhck9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBjaGVja3BvaW50UXVlcnkgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBhY3RpdmVDaGVja3BvaW50SW5kZXggPSBzaWduYWwoMCk7XG4gIHJlYWRvbmx5IGVkaXRpbmdDaGVja3BvaW50SWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRlbGV0aW5nQ2hlY2twb2ludElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSByZW5hbWVEcmFmdCA9IHNpZ25hbCgnJyk7XG4gIHJlYWRvbmx5IGNoZWNrcG9pbnRUb2FzdCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludFRvYXN0SXNFcnJvciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGZpbHRlcmVkQ2hlY2twb2ludHMgPSBjb21wdXRlZCgoKSA9PlxuICAgIGZ1enp5Q2hlY2twb2ludHMoXG4gICAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jaGVja3BvaW50cygpID8/IFtdLFxuICAgICAgdGhpcy5jaGVja3BvaW50UXVlcnkoKSxcbiAgICApLFxuICApO1xuXG4gIHJlYWRvbmx5IGVuYWJsZWQgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IHRvb2xNb2RlID0gc2lnbmFsPFRvb2xNb2RlPignbm9uZScpO1xuICByZWFkb25seSBndWlkZU9yaWVudGF0aW9uID0gc2lnbmFsPEd1aWRlT3JpZW50YXRpb24+KCd2ZXJ0aWNhbCcpO1xuICByZWFkb25seSBndWlkZXMgPSBzaWduYWw8R3VpZGVbXT4oW10pO1xuICByZWFkb25seSBob3ZlclJlY3QgPSBzaWduYWw8UmVjdCB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzZWxlY3RlZEd1aWRlSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkTWVhc3VyZW1lbnQgPSBzaWduYWw8SW5zcGVjdE1lYXN1cmVtZW50IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNob3dUeXBvZ3JhcGh5ID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgYWx0UHJlc3NlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGRpc3RhbmNlT3ZlcmxheSA9IHNpZ25hbDxEaXN0YW5jZU92ZXJsYXkgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdGV4dEJsb2NrcyA9IHNpZ25hbDxUZXh0QmxvY2tBbm5vdGF0aW9uW10+KFtdKTtcbiAgcmVhZG9ubHkgZ3VpZGVQcmV2aWV3ID0gc2lnbmFsPEd1aWRlIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRNZXRhTGluZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudCgpO1xuICAgIGlmICghc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3NlbGVjdGVkLmxhYmVsfSDCtyAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLnJlY3Qud2lkdGgpfSB4ICR7Zm9ybWF0VmFsdWUoc2VsZWN0ZWQucmVjdC5oZWlnaHQpfSDCtyAke3NlbGVjdGVkLnN0eWxlcy5mb250U2l6ZX0gLyAke3NlbGVjdGVkLnN0eWxlcy5saW5lSGVpZ2h0fSAvICR7c2VsZWN0ZWQuc3R5bGVzLmNvbG9yfWA7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGh5ZHJhdGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3J5ID0gc2lnbmFsPEd1aWRlW11bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RvcnlJbmRleCA9IHNpZ25hbCgtMSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2FwdHVyZWRDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFldmVudC5zaGlmdEtleSB8fFxuICAgICAgIXRoaXMuY2FuSW5zcGVjdENsaWNrKGV2ZW50KSB8fFxuICAgICAgIXRoaXMuc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfTtcbiAgcHJpdmF0ZSBkcmFnZ2luZ0d1aWRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdG9hc3RUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICByZWFkb25seSBjYW5VbmRvID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oaXN0b3J5SW5kZXgoKSA+IDApO1xuICByZWFkb25seSBjYW5SZWRvID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4KCkgPj0gMCAmJlxuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgoKSA8IHRoaXMuaGlzdG9yeSgpLmxlbmd0aCAtIDEsXG4gICk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogb2JqZWN0KSB7XG4gICAgdGhpcy5pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucGVyc2lzdE9uUmVsb2FkIHx8ICF0aGlzLmlzQnJvd3NlciB8fCAhdGhpcy5oeWRyYXRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZDogaW5zcGVjdG9yUGVyc2lzdGVkU3RhdGUgPSB7XG4gICAgICAgIHZlcnNpb246IGluc3BlY3Rvcl9TVEFURV9WRVJTSU9OLFxuICAgICAgICBlbmFibGVkOiB0aGlzLmVuYWJsZWQoKSxcbiAgICAgICAgdG9vbE1vZGU6IHRoaXMudG9vbE1vZGUoKSxcbiAgICAgICAgZ3VpZGVPcmllbnRhdGlvbjogdGhpcy5ndWlkZU9yaWVudGF0aW9uKCksXG4gICAgICAgIGd1aWRlczogdGhpcy5ndWlkZXMoKSxcbiAgICAgICAgc2hvd1R5cG9ncmFwaHk6IHRoaXMuc2hvd1R5cG9ncmFwaHkoKSxcbiAgICAgIH07XG5cbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgaW5zcGVjdG9yX1NUT1JBR0VfS0VZLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNhcHR1cmVkQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMucGVyc2lzdE9uUmVsb2FkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oaW5zcGVjdG9yX1NUT1JBR0VfS0VZKTtcbiAgICBpZiAoIXN0b3JlZCkge1xuICAgICAgdGhpcy5oeWRyYXRlZC5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RvcmVkKSBhc1xuICAgICAgICB8IGluc3BlY3RvclBlcnNpc3RlZFN0YXRlXG4gICAgICAgIHwgaW5zcGVjdG9yTGVnYWN5UGVyc2lzdGVkU3RhdGU7XG4gICAgICBpZiAocGFyc2VkLnZlcnNpb24gPT09IGluc3BlY3Rvcl9TVEFURV9WRVJTSU9OIHx8IHBhcnNlZC52ZXJzaW9uID09PSAxKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZC5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KHBhcnNlZC50b29sTW9kZSk7XG4gICAgICAgIHRoaXMuZ3VpZGVPcmllbnRhdGlvbi5zZXQocGFyc2VkLmd1aWRlT3JpZW50YXRpb24pO1xuICAgICAgICB0aGlzLmd1aWRlcy5zZXQocGFyc2VkLmd1aWRlcyA/PyBbXSk7XG4gICAgICAgIHRoaXMuc2hvd1R5cG9ncmFwaHkuc2V0KFxuICAgICAgICAgIHBhcnNlZC52ZXJzaW9uID09PSAxID8gZmFsc2UgOiAocGFyc2VkLnNob3dUeXBvZ3JhcGh5ID8/IGZhbHNlKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZWNvcmRIaXN0b3J5KHBhcnNlZC5ndWlkZXMgPz8gW10pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIG1hbGZvcm1lZCBzdGF0ZVxuICAgIH1cblxuICAgIHRoaXMuaHlkcmF0ZWQuc2V0KHRydWUpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNhcHR1cmVkQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMudG9hc3RUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RUaW1lcik7XG4gIH1cblxuICBzZXRUb29sTW9kZShtb2RlOiBUb29sTW9kZSkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZW5hYmxlZC5zZXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy50b29sTW9kZS5zZXQodGhpcy50b29sTW9kZSgpID09PSBtb2RlID8gJ25vbmUnIDogbW9kZSk7XG4gICAgdGhpcy5ob3ZlclJlY3Quc2V0KG51bGwpO1xuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgc2V0R3VpZGVPcmllbnRhdGlvbihvcmllbnRhdGlvbjogR3VpZGVPcmllbnRhdGlvbikge1xuICAgIHRoaXMuZ3VpZGVPcmllbnRhdGlvbi5zZXQob3JpZW50YXRpb24pO1xuICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgfVxuXG4gIGFjdGl2YXRlR3VpZGVPcmllbnRhdGlvbihvcmllbnRhdGlvbjogR3VpZGVPcmllbnRhdGlvbikge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy50b29sTW9kZSgpID09PSAnZ3VpZGVzJyAmJiB0aGlzLmd1aWRlT3JpZW50YXRpb24oKSA9PT0gb3JpZW50YXRpb247XG4gICAgdGhpcy5zZXRHdWlkZU9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTtcbiAgICBpZiAoaXNBY3RpdmUgfHwgdGhpcy50b29sTW9kZSgpICE9PSAnZ3VpZGVzJykge1xuICAgICAgdGhpcy5zZXRUb29sTW9kZSgnZ3VpZGVzJyk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlVHlwb2dyYXBoeSgpIHtcbiAgICB0aGlzLnNob3dUeXBvZ3JhcGh5LnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgZGlzYWJsZUluc3BlY3RvcigpIHtcbiAgICB0aGlzLnNldEluc3BlY3RvckVuYWJsZWQoZmFsc2UpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZUNoZWNrcG9pbnQoKSB7XG4gICAgY29uc3QgY2hlY2twb2ludCA9IGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LnNhdmUoKTtcbiAgICBpZiAoY2hlY2twb2ludCkge1xuICAgICAgdGhpcy5zaG93Q2hlY2twb2ludFRvYXN0KGBTYXZlZCDigJwke2NoZWNrcG9pbnQubmFtZX3igJ0uYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5lcnJvcigpKSB7XG4gICAgICB0aGlzLnNob3dDaGVja3BvaW50VG9hc3QodGhpcy5jaGVja3BvaW50U2VydmljZS5lcnJvcigpISwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3BlbkNoZWNrcG9pbnRDb21tYW5kQmFyKCkge1xuICAgIGlmICghdGhpcy5jaGVja3BvaW50U2VydmljZSB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgdGhpcy5jb21tYW5kQmFyT3BlbigpKSByZXR1cm47XG4gICAgdGhpcy5jb21tYW5kQmFyT3Blbi5zZXQodHJ1ZSk7XG4gICAgdGhpcy5jaGVja3BvaW50UXVlcnkuc2V0KCcnKTtcbiAgICB0aGlzLmFjdGl2ZUNoZWNrcG9pbnRJbmRleC5zZXQoMCk7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLmNsZWFyRXJyb3IoKTtcbiAgICB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5zaG93TW9kYWwoKTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpKTtcbiAgICBhd2FpdCB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlLmxvYWQoKTtcbiAgICB0aGlzLmNsYW1wQWN0aXZlQ2hlY2twb2ludCgpO1xuICB9XG5cbiAgY2xvc2VDaGVja3BvaW50Q29tbWFuZEJhcigpIHtcbiAgICBpZiAodGhpcy5jaGVja3BvaW50U2VydmljZT8uYnVzeSgpKSByZXR1cm47XG4gICAgdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICB0aGlzLmNvbW1hbmRCYXJPcGVuLnNldChmYWxzZSk7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgfVxuXG4gIHVwZGF0ZUNoZWNrcG9pbnRRdWVyeShldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLmNoZWNrcG9pbnRRdWVyeS5zZXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSk7XG4gICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KDApO1xuICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VydmljZT8uY2xlYXJFcnJvcigpO1xuICB9XG5cbiAgc2V0QWN0aXZlQ2hlY2twb2ludChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KGluZGV4KTtcbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmVDaGVja3BvaW50KGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2twb2ludFNlcnZpY2UgfHwgdGhpcy5jaGVja3BvaW50U2VydmljZS5idXN5KCkpIHJldHVybjtcbiAgICBjb25zdCByZXN0b3JlZCA9IGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2UucmVzdG9yZShjaGVja3BvaW50LmlkKTtcbiAgICBpZiAoIXJlc3RvcmVkKSByZXR1cm47XG4gICAgdGhpcy5jaGVja3BvaW50RGlhbG9nKCk/Lm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICB0aGlzLmNvbW1hbmRCYXJPcGVuLnNldChmYWxzZSk7XG4gICAgdGhpcy5zaG93Q2hlY2twb2ludFRvYXN0KGBSZXN0b3JlZCDigJwke2NoZWNrcG9pbnQubmFtZX3igJ0uYCk7XG4gIH1cblxuICBiZWdpblJlbmFtZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLCBldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5idXN5KCkpIHJldHVybjtcbiAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KGNoZWNrcG9pbnQuaWQpO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgIHRoaXMucmVuYW1lRHJhZnQuc2V0KGNoZWNrcG9pbnQubmFtZSk7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFxuICAgICAgICAnLmluc3BlY3Rvci1jb21tYW5kLXJvd19fcmVuYW1lJyxcbiAgICAgICk7XG4gICAgICBpbnB1dD8uZm9jdXMoKTtcbiAgICAgIGlucHV0Py5zZWxlY3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVJlbmFtZURyYWZ0KGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMucmVuYW1lRHJhZnQuc2V0KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xuICAgIHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmNsZWFyRXJyb3IoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFJlbmFtZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkKSB7XG4gICAgaWYgKGF3YWl0IHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LnJlbmFtZShjaGVja3BvaW50LmlkLCB0aGlzLnJlbmFtZURyYWZ0KCkpKSB7XG4gICAgICB0aGlzLmVkaXRpbmdDaGVja3BvaW50SWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBjYW5jZWxSZW5hbWUoKSB7XG4gICAgdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZXJ2aWNlPy5jbGVhckVycm9yKCk7XG4gICAgdGhpcy5jaGVja3BvaW50U2VhcmNoKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGJlZ2luRGVsZXRlKGNoZWNrcG9pbnQ6IEluc3BlY3RvckNoZWNrcG9pbnRSZWNvcmQsIGV2ZW50PzogRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQuc2V0KGNoZWNrcG9pbnQuaWQpO1xuICAgIHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gIH1cblxuICBjYW5jZWxEZWxldGUoZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmRlbGV0aW5nQ2hlY2twb2ludElkLnNldChudWxsKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgYXN5bmMgY29uZmlybURlbGV0ZShjaGVja3BvaW50OiBJbnNwZWN0b3JDaGVja3BvaW50UmVjb3JkLCBldmVudD86IEV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghYXdhaXQgdGhpcy5jaGVja3BvaW50U2VydmljZT8uZGVsZXRlKGNoZWNrcG9pbnQuaWQpKSByZXR1cm47XG4gICAgdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jbGFtcEFjdGl2ZUNoZWNrcG9pbnQoKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRTZWFyY2goKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgaGFuZGxlQ2hlY2twb2ludERpYWxvZ0NsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgZXZlbnQudGFyZ2V0ID09PSB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudCAmJlxuICAgICAgIXRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSAmJlxuICAgICAgIXRoaXMuZGVsZXRpbmdDaGVja3BvaW50SWQoKVxuICAgICkge1xuICAgICAgdGhpcy5jbG9zZUNoZWNrcG9pbnRDb21tYW5kQmFyKCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJHdWlkZXMoKSB7XG4gICAgdGhpcy5ndWlkZXMuc2V0KFtdKTtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KFtdKTtcbiAgfVxuXG4gIHRyYWNrR3VpZGUgPSAoX2luZGV4OiBudW1iZXIsIGd1aWRlOiBHdWlkZSkgPT4gZ3VpZGUuaWQ7XG4gIHRyYWNrVGV4dEJsb2NrID0gKF9pbmRleDogbnVtYmVyLCBibG9jazogVGV4dEJsb2NrQW5ub3RhdGlvbikgPT4gYmxvY2suaWQ7XG4gIHRyYWNrQ29ubmVjdG9yID0gKFxuICAgIF9pbmRleDogbnVtYmVyLFxuICAgIGNvbm5lY3RvcjogRGlzdGFuY2VPdmVybGF5Wydjb25uZWN0b3JzJ11bbnVtYmVyXSxcbiAgKSA9PiBgJHtjb25uZWN0b3IueDF9OiR7Y29ubmVjdG9yLnkxfToke2Nvbm5lY3Rvci54Mn06JHtjb25uZWN0b3IueTJ9YDtcblxuICBzdGFydEd1aWRlRHJhZyhldmVudDogUG9pbnRlckV2ZW50LCBndWlkZTogR3VpZGUpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gZ3VpZGUuaWQ7XG4gICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KGd1aWRlLmlkKTtcbiAgfVxuXG4gIGZvcm1hdEVkZ2VzKGVkZ2VzOiBJbnNwZWN0TWVhc3VyZW1lbnRbJ3BhZGRpbmcnXSkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShlZGdlcy50b3ApfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLnJpZ2h0KX0gJHtmb3JtYXRWYWx1ZShlZGdlcy5ib3R0b20pfSAke2Zvcm1hdFZhbHVlKGVkZ2VzLmxlZnQpfWA7XG4gIH1cblxuICBmb3JtYXRHYXAoc2VsZWN0ZWQ6IEluc3BlY3RNZWFzdXJlbWVudCkge1xuICAgIHJldHVybiBgJHtmb3JtYXRWYWx1ZShzZWxlY3RlZC5nYXAucm93KX0gLyAke2Zvcm1hdFZhbHVlKHNlbGVjdGVkLmdhcC5jb2x1bW4pfWA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuY2hlY2twb2ludFNlcnZpY2UgJiZcbiAgICAgICFldmVudC5yZXBlYXQgJiZcbiAgICAgIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXG4gICAgICBldmVudC5zaGlmdEtleSAmJlxuICAgICAga2V5ID09PSAncCdcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNvbW1hbmRCYXJPcGVuKCkgPyB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKSA6IHZvaWQgdGhpcy5vcGVuQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb21tYW5kQmFyT3BlbigpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbW1hbmRCYXJLZXlkb3duKGV2ZW50LCBrZXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJsb2Nrc0luc3BlY3RvclNob3J0Y3V0KGV2ZW50LnRhcmdldCkgfHwgZXZlbnQucmVwZWF0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFzU2hvcnRjdXRNb2RpZmllciA9IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAoa2V5ID09PSAnbScgJiYgIWhhc1Nob3J0Y3V0TW9kaWZpZXIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEluc3BlY3RvckVuYWJsZWQoIXRoaXMuZW5hYmxlZCgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmIGtleSA9PT0gJ3onKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc2hpZnRLZXkgPyB0aGlzLnJlZG8oKSA6IHRoaXMudW5kbygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdBbHQnKSB7XG4gICAgICB0aGlzLmFsdFByZXNzZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaGFzU2hvcnRjdXRNb2RpZmllcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdzJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0VG9vbE1vZGUoJ3NlbGVjdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdnJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0VG9vbE1vZGUoJ2d1aWRlcycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdoJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0R3VpZGVPcmllbnRhdGlvbignaG9yaXpvbnRhbCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICd2Jykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0R3VpZGVPcmllbnRhdGlvbigndmVydGljYWwnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnZXNjYXBlJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICB0aGlzLmNsZWFyR3VpZGVzKCk7XG4gICAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKChrZXkgPT09ICdiYWNrc3BhY2UnIHx8IGtleSA9PT0gJ2RlbGV0ZScpICYmIHRoaXMuc2VsZWN0ZWRHdWlkZUlkKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBuZXh0R3VpZGVzID0gdGhpcy5ndWlkZXMoKS5maWx0ZXIoXG4gICAgICAgIChndWlkZSkgPT4gZ3VpZGUuaWQgIT09IHRoaXMuc2VsZWN0ZWRHdWlkZUlkKCksXG4gICAgICApO1xuICAgICAgdGhpcy5ndWlkZXMuc2V0KG5leHRHdWlkZXMpO1xuICAgICAgdGhpcy5zZWxlY3RlZEd1aWRlSWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5yZWNvcmRIaXN0b3J5KG5leHRHdWlkZXMpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0FsdCcpIHtcbiAgICAgIHRoaXMuYWx0UHJlc3NlZC5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVybW92ZScsIFsnJGV2ZW50J10pXG4gIGhhbmRsZVBvaW50ZXJNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpIHx8ICF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KG51bGwpO1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICAgIHRoaXMuZ3VpZGVzLnNldChcbiAgICAgICAgdGhpcy5ndWlkZXMoKS5tYXAoKGd1aWRlKSA9PiB7XG4gICAgICAgICAgaWYgKGd1aWRlLmlkICE9PSB0aGlzLmRyYWdnaW5nR3VpZGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGd1aWRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByYXdQb3NpdGlvbiA9XG4gICAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IGV2ZW50LmNsaWVudFggOiBldmVudC5jbGllbnRZO1xuICAgICAgICAgIGNvbnN0IG1heCA9XG4gICAgICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHZpZXdwb3J0LndpZHRoIDogdmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICAgIHJldHVybiB7IC4uLmd1aWRlLCBwb3NpdGlvbjogY2xhbXAocmF3UG9zaXRpb24sIDAsIG1heCkgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdndWlkZXMnKSB7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQobnVsbCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSA/P1xuICAgICAgICBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ3VpZGVQcmV2aWV3LnNldChudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQodGhpcy5nZXRHdWlkZVByZXZpZXcoZXZlbnQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpICE9PSAnc2VsZWN0JyB8fCAhdGhpcy5ob3ZlckhpZ2hsaWdodEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmICghdGhpcy5hbHRQcmVzc2VkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldEVsZW1lbnQoXG4gICAgICB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgIHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsLFxuICAgICk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChudWxsKTtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gZ2V0UmVjdEZyb21Eb20odGFyZ2V0KTtcbiAgICB0aGlzLmhvdmVyRWxlbWVudCA9IHRhcmdldDtcbiAgICBpZiAoIXJlY3RzRXF1YWwocmVjdCwgdGhpcy5ob3ZlclJlY3QoKSkpIHtcbiAgICAgIHRoaXMuaG92ZXJSZWN0LnNldChyZWN0KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICB0aGlzLnJlZnJlc2hUeXBvZ3JhcGh5QmxvY2tzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cG9pbnRlcnVwJylcbiAgaGFuZGxlUG9pbnRlclVwKCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZ0d1aWRlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KHRoaXMuZ3VpZGVzKCkpO1xuICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gbnVsbDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpjbGljaycsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5Um9vdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XG5cbiAgICBpZiAodGhpcy50b29sTW9kZSgpID09PSAnZ3VpZGVzJykge1xuICAgICAgaWYgKG92ZXJsYXkgJiYgb3ZlcmxheS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3VpZGUgPSB0aGlzLmdldEd1aWRlUHJldmlldyhldmVudCk7XG4gICAgICB0aGlzLmFkZEd1aWRlKHsgLi4uZ3VpZGUsIGlkOiBjcmVhdGVJZCgpIH0pO1xuICAgICAgdGhpcy5ndWlkZVByZXZpZXcuc2V0KGd1aWRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2FuSW5zcGVjdENsaWNrKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0RWxlbWVudEF0UG9pbnQoZXZlbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBoYW5kbGVWaWV3cG9ydENoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQgJiYgZG9jdW1lbnQuY29udGFpbnModGhpcy5zZWxlY3RlZEVsZW1lbnQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCkpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuSW5zcGVjdENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5pc0Jyb3dzZXIgfHwgdGhpcy50b29sTW9kZSgpICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbDtcbiAgICByZXR1cm4gIShvdmVybGF5ICYmIG92ZXJsYXkuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5zcGVjdG9yRW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5lbmFibGVkLnNldChlbmFibGVkKTtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIHRoaXMudG9vbE1vZGUuc2V0KCdub25lJyk7XG4gICAgICB0aGlzLmhvdmVyUmVjdC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQobnVsbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5kaXN0YW5jZU92ZXJsYXkuc2V0KG51bGwpO1xuICAgICAgdGhpcy50ZXh0QmxvY2tzLnNldChbXSk7XG4gICAgICB0aGlzLmd1aWRlUHJldmlldy5zZXQobnVsbCk7XG4gICAgICB0aGlzLmFsdFByZXNzZWQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ2dpbmdHdWlkZUlkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb21tYW5kQmFyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjaGVja3BvaW50cyA9IHRoaXMuZmlsdGVyZWRDaGVja3BvaW50cygpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IGNoZWNrcG9pbnRzW3RoaXMuYWN0aXZlQ2hlY2twb2ludEluZGV4KCldO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgaXNSZW5hbWVJbnB1dCA9IHRhcmdldD8uY2xhc3NMaXN0Py5jb250YWlucygnaW5zcGVjdG9yLWNvbW1hbmQtcm93X19yZW5hbWUnKSA/PyBmYWxzZTtcblxuICAgIGlmIChrZXkgPT09ICdlc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHRoaXMuZWRpdGluZ0NoZWNrcG9pbnRJZCgpKSB0aGlzLmNhbmNlbFJlbmFtZSgpO1xuICAgICAgZWxzZSBpZiAodGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZCgpKSB0aGlzLmNhbmNlbERlbGV0ZSgpO1xuICAgICAgZWxzZSB0aGlzLmNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hlY2twb2ludFNlcnZpY2U/LmJ1c3koKSkgcmV0dXJuO1xuICAgIGNvbnN0IGVkaXRpbmdDaGVja3BvaW50ID0gY2hlY2twb2ludHMuZmluZCgoeyBpZCB9KSA9PiBpZCA9PT0gdGhpcy5lZGl0aW5nQ2hlY2twb2ludElkKCkpO1xuICAgIGlmIChpc1JlbmFtZUlucHV0ICYmIGtleSA9PT0gJ2VudGVyJyAmJiBlZGl0aW5nQ2hlY2twb2ludCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZvaWQgdGhpcy5maW5pc2hSZW5hbWUoZWRpdGluZ0NoZWNrcG9pbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNSZW5hbWVJbnB1dCkgcmV0dXJuO1xuICAgIGlmIChrZXkgPT09ICdhcnJvd2Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KE1hdGgubWluKHRoaXMuYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgKyAxLCBNYXRoLm1heCgwLCBjaGVja3BvaW50cy5sZW5ndGggLSAxKSkpO1xuICAgICAgdGhpcy5zY3JvbGxBY3RpdmVDaGVja3BvaW50SW50b1ZpZXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2Fycm93dXAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KE1hdGgubWF4KDAsIHRoaXMuYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgLSAxKSk7XG4gICAgICB0aGlzLnNjcm9sbEFjdGl2ZUNoZWNrcG9pbnRJbnRvVmlldygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAnZW50ZXInICYmIGFjdGl2ZSAmJiAhdGhpcy5kZWxldGluZ0NoZWNrcG9pbnRJZCgpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdm9pZCB0aGlzLnJlc3RvcmVDaGVja3BvaW50KGFjdGl2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdmMicgJiYgYWN0aXZlKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5iZWdpblJlbmFtZShhY3RpdmUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAnZGVsZXRlJyAmJiBhY3RpdmUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmJlZ2luRGVsZXRlKGFjdGl2ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBibG9ja3NJbnNwZWN0b3JTaG9ydGN1dCh0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0YXJnZXQuY2xvc2VzdChcbiAgICAgICdmb3JtLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgb3B0aW9uLCBbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJdKSwgW3JvbGU9XCJ0ZXh0Ym94XCJdJyxcbiAgICApICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGFtcEFjdGl2ZUNoZWNrcG9pbnQoKSB7XG4gICAgdGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXguc2V0KFxuICAgICAgTWF0aC5taW4odGhpcy5hY3RpdmVDaGVja3BvaW50SW5kZXgoKSwgTWF0aC5tYXgoMCwgdGhpcy5maWx0ZXJlZENoZWNrcG9pbnRzKCkubGVuZ3RoIC0gMSkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEFjdGl2ZUNoZWNrcG9pbnRJbnRvVmlldygpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLmNoZWNrcG9pbnREaWFsb2coKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgYFtkYXRhLWNoZWNrcG9pbnQtaW5kZXg9XCIke3RoaXMuYWN0aXZlQ2hlY2twb2ludEluZGV4KCl9XCJdYCxcbiAgICAgICk7XG4gICAgICByb3c/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0NoZWNrcG9pbnRUb2FzdChtZXNzYWdlOiBzdHJpbmcsIGlzRXJyb3IgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnRvYXN0VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0VGltZXIpO1xuICAgIHRoaXMuY2hlY2twb2ludFRvYXN0SXNFcnJvci5zZXQoaXNFcnJvcik7XG4gICAgdGhpcy5jaGVja3BvaW50VG9hc3Quc2V0KG1lc3NhZ2UpO1xuICAgIHRoaXMudG9hc3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jaGVja3BvaW50VG9hc3Quc2V0KG51bGwpO1xuICAgICAgdGhpcy5jaGVja3BvaW50VG9hc3RJc0Vycm9yLnNldChmYWxzZSk7XG4gICAgfSwgMjUwMCk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEVsZW1lbnRBdFBvaW50KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVJvb3QoKT8ubmF0aXZlRWxlbWVudCA/PyBudWxsO1xuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldEVsZW1lbnQoXG4gICAgICB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgIG92ZXJsYXksXG4gICAgKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5zZWxlY3RlZE1lYXN1cmVtZW50LnNldChudWxsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDdHJsK2NsaWNrOiBzZWxlY3QgdGhlIG1pbmltdW0gY29tbW9uIHBhcmVudCBvZiBjdXJyZW50IHNlbGVjdGlvbiBhbmQgY2xpY2tlZCBlbGVtZW50XG4gICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIHRoaXMuc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBjb21tb25QYXJlbnQgPSB0aGlzLmZpbmRNaW5pbXVtQ29tbW9uUGFyZW50KFxuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgY29tbW9uUGFyZW50ICYmXG4gICAgICAgIGNvbW1vblBhcmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJlxuICAgICAgICBjb21tb25QYXJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNZWFzdXJlbWVudC5zZXQoZ2V0SW5zcGVjdE1lYXN1cmVtZW50KGNvbW1vblBhcmVudCkpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IGNvbW1vblBhcmVudDtcbiAgICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZU92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTWVhc3VyZW1lbnQuc2V0KGdldEluc3BlY3RNZWFzdXJlbWVudCh0YXJnZXQpKTtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IHRhcmdldDtcbiAgICB0aGlzLnNlbGVjdGVkR3VpZGVJZC5zZXQoXG4gICAgICB0aGlzLmZpbmRHdWlkZUF0UG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSksXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZURpc3RhbmNlT3ZlcmxheSgpO1xuICAgIHRoaXMucmVmcmVzaFR5cG9ncmFwaHlCbG9ja3MoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzdGFuY2VPdmVybGF5KCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFsdFByZXNzZWQoKSB8fFxuICAgICAgIXRoaXMuc2VsZWN0ZWRFbGVtZW50IHx8XG4gICAgICAhdGhpcy5ob3ZlckVsZW1lbnQgfHxcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID09PSB0aGlzLmhvdmVyRWxlbWVudCB8fFxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuY29udGFpbnModGhpcy5ob3ZlckVsZW1lbnQpIHx8XG4gICAgICB0aGlzLmhvdmVyRWxlbWVudC5jb250YWlucyh0aGlzLnNlbGVjdGVkRWxlbWVudClcbiAgICApIHtcbiAgICAgIHRoaXMuZGlzdGFuY2VPdmVybGF5LnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3RhbmNlT3ZlcmxheS5zZXQoXG4gICAgICBnZXREaXN0YW5jZU92ZXJsYXkoXG4gICAgICAgIGdldFJlY3RGcm9tRG9tKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSxcbiAgICAgICAgZ2V0UmVjdEZyb21Eb20odGhpcy5ob3ZlckVsZW1lbnQpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVHlwb2dyYXBoeUJsb2NrcygpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyIHx8ICF0aGlzLmVuYWJsZWQoKSB8fCAhdGhpcy5zaG93VHlwb2dyYXBoeSgpKSB7XG4gICAgICB0aGlzLnRleHRCbG9ja3Muc2V0KFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgIHRoaXMudGV4dEJsb2Nrcy5zZXQoXG4gICAgICBnZXRWaXNpYmxlVGV4dEJsb2Nrcyh0aGlzLm92ZXJsYXlSb290KCk/Lm5hdGl2ZUVsZW1lbnQgPz8gbnVsbClcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+XG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LnRvcCA8PSB2aWV3cG9ydC5oZWlnaHQgJiZcbiAgICAgICAgICAgIGJsb2NrLnJlY3QubGVmdCA+PSAwICYmXG4gICAgICAgICAgICBibG9jay5yZWN0LmxlZnQgPD0gdmlld3BvcnQud2lkdGgsXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoYmxvY2spID0+ICh7XG4gICAgICAgICAgLi4uYmxvY2ssXG4gICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgLi4uYmxvY2sucmVjdCxcbiAgICAgICAgICAgIGxlZnQ6IGNsYW1wKGJsb2NrLnJlY3QubGVmdCwgMCwgdmlld3BvcnQud2lkdGggLSAxMiksXG4gICAgICAgICAgICB0b3A6IGNsYW1wKGJsb2NrLnJlY3QudG9wLCAxNCwgdmlld3BvcnQuaGVpZ2h0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkR3VpZGUoZ3VpZGU6IEd1aWRlKSB7XG4gICAgY29uc3QgbmV4dEd1aWRlcyA9IFsuLi50aGlzLmd1aWRlcygpLCBndWlkZV07XG4gICAgdGhpcy5ndWlkZXMuc2V0KG5leHRHdWlkZXMpO1xuICAgIHRoaXMuc2VsZWN0ZWRHdWlkZUlkLnNldChndWlkZS5pZCk7XG4gICAgdGhpcy5yZWNvcmRIaXN0b3J5KG5leHRHdWlkZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHdWlkZVByZXZpZXcoZXZlbnQ6IFBvaW50ZXJFdmVudCB8IE1vdXNlRXZlbnQpOiBHdWlkZSB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3cG9ydFNpemUoKTtcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IHRoaXMuZ3VpZGVPcmllbnRhdGlvbigpO1xuICAgIGNvbnN0IHJhd1Bvc2l0aW9uID1cbiAgICAgIG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XG4gICAgY29uc3QgbWF4ID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyB2aWV3cG9ydC53aWR0aCA6IHZpZXdwb3J0LmhlaWdodDtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3ByZXZpZXcnLFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgICBwb3NpdGlvbjogdGhpcy5zbmFwR3VpZGUoY2xhbXAocmF3UG9zaXRpb24sIDAsIG1heCkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNuYXBHdWlkZShwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBndWlkZSBvZiB0aGlzLmd1aWRlcygpKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoZ3VpZGUucG9zaXRpb24gLSBwb3NpdGlvbikgPD0gR1VJREVfU05BUF9ESVNUQU5DRSkge1xuICAgICAgICByZXR1cm4gZ3VpZGUucG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEd1aWRlQXRQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgZ3VpZGUgb2YgdGhpcy5ndWlkZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJlxuICAgICAgICBNYXRoLmFicyhndWlkZS5wb3NpdGlvbiAtIHgpIDw9IEdVSURFX0hJVEJPWF9TSVpFXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGd1aWRlLmlkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBndWlkZS5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnICYmXG4gICAgICAgIE1hdGguYWJzKGd1aWRlLnBvc2l0aW9uIC0geSkgPD0gR1VJREVfSElUQk9YX1NJWkVcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZ3VpZGUuaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmRvKCkge1xuICAgIGlmICghdGhpcy5jYW5VbmRvKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSAtIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgdGhpcy5ndWlkZXMuc2V0KHRoaXMuY2xvbmVHdWlkZXModGhpcy5oaXN0b3J5KClbbmV4dEluZGV4XSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRvKCkge1xuICAgIGlmICghdGhpcy5jYW5SZWRvKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSArIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgdGhpcy5ndWlkZXMuc2V0KHRoaXMuY2xvbmVHdWlkZXModGhpcy5oaXN0b3J5KClbbmV4dEluZGV4XSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvcmRIaXN0b3J5KGd1aWRlczogR3VpZGVbXSkge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmhpc3RvcnkoKS5zbGljZSgwLCB0aGlzLmhpc3RvcnlJbmRleCgpICsgMSk7XG4gICAgYmFzZS5wdXNoKHRoaXMuY2xvbmVHdWlkZXMoZ3VpZGVzKSk7XG4gICAgdGhpcy5oaXN0b3J5LnNldChiYXNlKTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQoYmFzZS5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVHdWlkZXMoZ3VpZGVzOiBHdWlkZVtdKSB7XG4gICAgcmV0dXJuIGd1aWRlcy5tYXAoKGd1aWRlKSA9PiAoeyAuLi5ndWlkZSB9KSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRNaW5pbXVtQ29tbW9uUGFyZW50KFxuICAgIGVsZW1lbnRBOiBIVE1MRWxlbWVudCxcbiAgICBlbGVtZW50QjogSFRNTEVsZW1lbnQsXG4gICk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgLy8gQnVpbGQgYW5jZXN0b3IgY2hhaW4gZm9yIGVsZW1lbnQgQVxuICAgIGNvbnN0IGFuY2VzdG9yc0EgPSBuZXcgU2V0PEVsZW1lbnQ+KCk7XG4gICAgbGV0IGN1cnJlbnQ6IEVsZW1lbnQgfCBudWxsID0gZWxlbWVudEE7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGFuY2VzdG9yc0EuYWRkKGN1cnJlbnQpO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBXYWxrIHVwIGZyb20gZWxlbWVudEIgdW50aWwgd2UgZmluZCBhIGNvbW1vbiBhbmNlc3RvclxuICAgIGN1cnJlbnQgPSBlbGVtZW50QjtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgaWYgKGFuY2VzdG9yc0EuaGFzKGN1cnJlbnQpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImluc3BlY3Rvci1yb290XCIgI292ZXJsYXlSb290PlxuICBAaWYgKGVuYWJsZWQoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19yYWlsXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJ0b29sTW9kZSgpID09PSAnc2VsZWN0J1wiXG4gICAgICAgICAgKGNsaWNrKT1cInNldFRvb2xNb2RlKCdzZWxlY3QnKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlNlbGVjdCBtb2RlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zIDJsOCA4LTMgLjdMNi43IDEzIDYgMTAgMyAyelwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+U2VsZWN0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICBAaWYgKGNoZWNrcG9pbnRTZXJ2aWNlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZUNoZWNrcG9pbnQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2hlY2twb2ludFNlcnZpY2UuYnVzeSgpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlIGNoZWNrcG9pbnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIuNSAyaDkuNmwxLjQgMS40VjE0aC0xMXptMiAxLjV2M2g2di0zem0uNSA2VjEyaDZWOS41elwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlNhdmUgY2hlY2twb2ludDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhcl9fc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci10b29sYmFyX19yZXZlYWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3ItdG9vbGJhcl9fcmV2ZWFsLWlubmVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJzaG93VHlwb2dyYXBoeSgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlVHlwb2dyYXBoeSgpXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiVHlwb2dyYXBoeSBvdmVybGF5XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDRWMmgxMHYyaC00djEwSDdWNHpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlR5cG9ncmFwaHk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJ0b29sTW9kZSgpID09PSAnZ3VpZGVzJyAmJiBndWlkZU9yaWVudGF0aW9uKCkgPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZUd1aWRlT3JpZW50YXRpb24oJ3ZlcnRpY2FsJylcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJWZXJ0aWNhbCBndWlkZXNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuMjUgMmgxLjV2MTJoLTEuNXpcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlZlcnRpY2FsIGd1aWRlczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cInRvb2xNb2RlKCkgPT09ICdndWlkZXMnICYmIGd1aWRlT3JpZW50YXRpb24oKSA9PT0gJ2hvcml6b250YWwnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZhdGVHdWlkZU9yaWVudGF0aW9uKCdob3Jpem9udGFsJylcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJIb3Jpem9udGFsIGd1aWRlc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiA3LjI1aDEydjEuNUgyelwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+SG9yaXpvbnRhbCBndWlkZXM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2xiYXJfX2RpdmlkZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1pY29uLWJ1dHRvbiBpbnNwZWN0b3ItaWNvbi1idXR0b24tLXBvd2VyXCJcbiAgICAgICAgICAoY2xpY2spPVwiZGlzYWJsZUluc3BlY3RvcigpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRGlzYWJsZSBpbnNwZWN0b3I7IHByZXNzIE0gdG8gZW5hYmxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjI1IDEuNWgxLjV2NmgtMS41ek00LjEgMy4zNWwuOTYgMS4xNUE0LjI1IDQuMjUgMCAxIDAgMTAuOTQgNC41bC45Ni0xLjE1QTUuNzUgNS43NSAwIDEgMSA0LjEgMy4zNXpcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLXRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPkRpc2FibGU8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKGNoZWNrcG9pbnRTZXJ2aWNlKSB7XG4gICAgPGRpYWxvZ1xuICAgICAgI2NoZWNrcG9pbnREaWFsb2dcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtZGlhbG9nXCJcbiAgICAgIGFyaWEtbGFiZWxsZWRieT1cImluc3BlY3Rvci1jb21tYW5kLXRpdGxlXCJcbiAgICAgIChjYW5jZWwpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGNsb3NlQ2hlY2twb2ludENvbW1hbmRCYXIoKVwiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ2hlY2twb2ludERpYWxvZ0NsaWNrKCRldmVudClcIlxuICAgID5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDxoZWFkZXIgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fc2VhcmNoXCI+XG4gICAgICAgICAgPGxhYmVsIGlkPVwiaW5zcGVjdG9yLWNvbW1hbmQtdGl0bGVcIiBjbGFzcz1cImluc3BlY3Rvci12aXN1YWxseS1oaWRkZW5cIiBmb3I9XCJpbnNwZWN0b3ItY2hlY2twb2ludC1zZWFyY2hcIj5cbiAgICAgICAgICAgIFNlYXJjaCBjaGVja3BvaW50c1xuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjY2hlY2twb2ludFNlYXJjaFxuICAgICAgICAgICAgaWQ9XCJpbnNwZWN0b3ItY2hlY2twb2ludC1zZWFyY2hcIlxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmluZCBhIGNoZWNrcG9pbnTigKZcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImNoZWNrcG9pbnRRdWVyeSgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ2luc3BlY3Rvci1jaGVja3BvaW50LXJlc3VsdHMnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJmaWx0ZXJlZENoZWNrcG9pbnRzKCkubGVuZ3RoID8gJ2luc3BlY3Rvci1jaGVja3BvaW50LScgKyBmaWx0ZXJlZENoZWNrcG9pbnRzKClbYWN0aXZlQ2hlY2twb2ludEluZGV4KCldLmlkIDogbnVsbFwiXG4gICAgICAgICAgICAoaW5wdXQpPVwidXBkYXRlQ2hlY2twb2ludFF1ZXJ5KCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIEBpZiAoY2hlY2twb2ludFNlcnZpY2UuZXJyb3IoKTsgYXMgZXJyb3IpIHtcbiAgICAgICAgICA8cCBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlIGluc3BlY3Rvci1jb21tYW5kX19tZXNzYWdlLS1lcnJvclwiIHJvbGU9XCJhbGVydFwiPnt7IGVycm9yIH19PC9wPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBpZD1cImluc3BlY3Rvci1jaGVja3BvaW50LXJlc3VsdHNcIiBjbGFzcz1cImluc3BlY3Rvci1jb21tYW5kX19yZXN1bHRzXCIgcm9sZT1cImxpc3Rib3hcIiBhcmlhLWxhYmVsPVwiU2F2ZWQgY2hlY2twb2ludHNcIj5cbiAgICAgICAgICBAaWYgKGNoZWNrcG9pbnRTZXJ2aWNlLmxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj5Mb2FkaW5nIGNoZWNrcG9pbnRz4oCmPC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKCFjaGVja3BvaW50U2VydmljZS5jaGVja3BvaW50cygpLmxlbmd0aCkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj5ObyBjaGVja3BvaW50cyB5ZXQuIFNhdmUgb25lIGZyb20gdGhlIEluc3BlY3RvciB0b29sYmFyLjwvcD5cbiAgICAgICAgICB9IEBlbHNlIGlmICghZmlsdGVyZWRDaGVja3BvaW50cygpLmxlbmd0aCkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZF9fbWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj5ObyBjaGVja3BvaW50IG1hdGNoZXMg4oCce3sgY2hlY2twb2ludFF1ZXJ5KCkgfX3igJ0uPC9wPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAoY2hlY2twb2ludCBvZiBmaWx0ZXJlZENoZWNrcG9pbnRzKCk7IHRyYWNrIGNoZWNrcG9pbnQuaWQ7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIFtpZF09XCInaW5zcGVjdG9yLWNoZWNrcG9pbnQtJyArIGNoZWNrcG9pbnQuaWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY2hlY2twb2ludC1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJhY3RpdmVDaGVja3BvaW50SW5kZXgoKSA9PT0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgPT09IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYnVzeV09XCJjaGVja3BvaW50U2VydmljZS5idXN5KCkgJiYgYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgPT09IGluZGV4XCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRBY3RpdmVDaGVja3BvaW50KGluZGV4KVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0aW5nQ2hlY2twb2ludElkKCkgPT09IGNoZWNrcG9pbnQuaWQgfHwgZWRpdGluZ0NoZWNrcG9pbnRJZCgpID09PSBjaGVja3BvaW50LmlkID8gbnVsbCA6IHJlc3RvcmVDaGVja3BvaW50KGNoZWNrcG9pbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAoZGVsZXRpbmdDaGVja3BvaW50SWQoKSA9PT0gY2hlY2twb2ludC5pZCkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX2NvbmZpcm1cIj5EZWxldGUg4oCce3sgY2hlY2twb2ludC5uYW1lIH194oCdPzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWNvbW1hbmQtcm93X19jb25maXJtLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpcy1kYW5nZXJcIiAoY2xpY2spPVwiY29uZmlybURlbGV0ZShjaGVja3BvaW50LCAkZXZlbnQpXCI+RGVsZXRlIGNoZWNrcG9pbnQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbERlbGV0ZSgkZXZlbnQpXCI+S2VlcCBjaGVja3BvaW50PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZWRpdGluZ0NoZWNrcG9pbnRJZCgpID09PSBjaGVja3BvaW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX3JlbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDaGVja3BvaW50IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicmVuYW1lRHJhZnQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJ1cGRhdGVSZW5hbWVEcmFmdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX25hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjaGVja3BvaW50U2VydmljZS5idXN5KCkgJiYgYWN0aXZlQ2hlY2twb2ludEluZGV4KCkgPT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgUmVzdG9yaW5nIOKAnHt7IGNoZWNrcG9pbnQubmFtZSB9feKAneKAplxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjaGVja3BvaW50Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnNwZWN0b3ItY29tbWFuZC1yb3dfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImJlZ2luUmVuYW1lKGNoZWNrcG9pbnQsICRldmVudClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW5hbWUgJyArIGNoZWNrcG9pbnQubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxwYXRoIGQ9XCJtMTEuOCAxLjggMi40IDIuNC04LjMgOC4zLTMuMS43LjctMy4xem0tOCAxMC40IDEuNS0uMy0xLjItMS4yelwiIC8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYmVnaW5EZWxldGUoY2hlY2twb2ludCwgJGV2ZW50KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0RlbGV0ZSAnICsgY2hlY2twb2ludC5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHBhdGggZD1cIk01LjUgMmg1bC41IDFIMTR2MS4yNUgyVjNoM3ptLTIgMy4yNWg5TDEyIDE0SDR6XCIgLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvZGlhbG9nPlxuICB9XG5cbiAgQGlmIChjaGVja3BvaW50VG9hc3QoKTsgYXMgdG9hc3QpIHtcbiAgICA8cFxuICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItY2hlY2twb2ludC10b2FzdFwiXG4gICAgICBbY2xhc3MuaW5zcGVjdG9yLWNoZWNrcG9pbnQtdG9hc3QtLWVycm9yXT1cImNoZWNrcG9pbnRUb2FzdElzRXJyb3IoKVwiXG4gICAgICBbYXR0ci5yb2xlXT1cImNoZWNrcG9pbnRUb2FzdElzRXJyb3IoKSA/ICdhbGVydCcgOiAnc3RhdHVzJ1wiXG4gICAgPnt7IHRvYXN0IH19PC9wPlxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgdG9vbE1vZGUoKSA9PT0gXCJzZWxlY3RcIikge1xuICAgIEBpZiAoaG92ZXJSZWN0KCkgJiYgaG92ZXJIaWdobGlnaHRFbmFibGVkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1ob3ZlclwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImhvdmVyUmVjdCgpIS5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJob3ZlclJlY3QoKSEudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhvdmVyUmVjdCgpIS53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiaG92ZXJSZWN0KCkhLmhlaWdodFwiXG4gICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1hY2NlbnRdPVwiaGlnaGxpZ2h0Q29sb3JcIlxuICAgICAgPjwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoc2VsZWN0ZWRNZWFzdXJlbWVudCgpOyBhcyBzZWxlY3RlZCkge1xuICAgICAgQGlmIChzZWxlY3RlZC5nYXAuYWN0aXZlICYmIHNlbGVjdGVkLnBhcmVudFJlY3QpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcFwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3Qud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucGFyZW50UmVjdC5oZWlnaHRcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ib3gtdGFnIGluc3BlY3Rvci1ib3gtdGFnLS1nYXBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnBhcmVudFJlY3QubGVmdFwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYXJlbnRSZWN0LnRvcCAtIDhcIlxuICAgICAgICA+XG4gICAgICAgICAgRyB7eyBmb3JtYXRHYXAoc2VsZWN0ZWQpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1tYXJnaW5cIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LmxlZnRcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QudG9wXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLm1hcmdpblJlY3QuaGVpZ2h0XCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94LXRhZyBpbnNwZWN0b3ItYm94LXRhZy0tbWFyZ2luXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwic2VsZWN0ZWQubWFyZ2luUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5tYXJnaW5SZWN0LnRvcCAtIDhcIlxuICAgICAgPlxuICAgICAgICBNIHt7IGZvcm1hdEVkZ2VzKHNlbGVjdGVkLm1hcmdpbikgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1zZWxlY3RlZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInNlbGVjdGVkLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwic2VsZWN0ZWQucmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucmVjdC53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwic2VsZWN0ZWQucmVjdC5oZWlnaHRcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItYWNjZW50XT1cImhpZ2hsaWdodENvbG9yXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvci1sYWJlbFwiPnt7IHNlbGVjdGVkTWV0YUxpbmUoKSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItYm94IGluc3BlY3Rvci1ib3gtLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3BcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwic2VsZWN0ZWQucGFkZGluZ1JlY3Qud2lkdGhcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInNlbGVjdGVkLnBhZGRpbmdSZWN0LmhlaWdodFwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveC10YWcgaW5zcGVjdG9yLWJveC10YWctLXBhZGRpbmdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJzZWxlY3RlZC5wYWRkaW5nUmVjdC5sZWZ0XCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCJcbiAgICAgICAgICBzZWxlY3RlZC5wYWRkaW5nUmVjdC50b3AgKyBzZWxlY3RlZC5wYWRkaW5nUmVjdC5oZWlnaHQgKyA4XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIFAge3sgZm9ybWF0RWRnZXMoc2VsZWN0ZWQucGFkZGluZykgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpICYmIHNob3dUeXBvZ3JhcGh5KCkpIHtcbiAgICBAZm9yIChibG9jayBvZiB0ZXh0QmxvY2tzKCk7IHRyYWNrIGJsb2NrLmlkKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLXRleHQtY2hpcFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImJsb2NrLnJlY3QubGVmdFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiYmxvY2sucmVjdC50b3AgLSA4XCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci10ZXh0LWNoaXBfX3N3YXRjaFwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiYmxvY2suc3R5bGVzLmNvbG9yXCJcbiAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmZvbnRTaXplIH19PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBibG9jay5zdHlsZXMubGluZUhlaWdodCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgYmxvY2suc3R5bGVzLmNvbG9yIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG5cbiAgQGlmIChlbmFibGVkKCkgJiYgYWx0UHJlc3NlZCgpICYmIGRpc3RhbmNlT3ZlcmxheSgpOyBhcyBkaXN0YW5jZSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0QS5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEEudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0QS53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RBLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWJveCBpbnNwZWN0b3ItYm94LS1kaXN0YW5jZVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS5yZWN0Qi5sZWZ0XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UucmVjdEIudG9wXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkaXN0YW5jZS5yZWN0Qi53aWR0aFwiXG4gICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRpc3RhbmNlLnJlY3RCLmhlaWdodFwiXG4gICAgPjwvZGl2PlxuXG4gICAgQGZvciAoXG4gICAgICBjb25uZWN0b3Igb2YgZGlzdGFuY2UuY29ubmVjdG9ycztcbiAgICAgIHRyYWNrIHRyYWNrQ29ubmVjdG9yKCRpbmRleCwgY29ubmVjdG9yKVxuICAgICkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1jb25uZWN0b3JcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0tdmVydGljYWxdPVwiY29ubmVjdG9yLngxID09PSBjb25uZWN0b3IueDJcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWNvbm5lY3Rvci0taG9yaXpvbnRhbF09XCJjb25uZWN0b3IueTEgPT09IGNvbm5lY3Rvci55MlwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIk1hdGgubWluKGNvbm5lY3Rvci54MSwgY29ubmVjdG9yLngyKVwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiTWF0aC5taW4oY29ubmVjdG9yLnkxLCBjb25uZWN0b3IueTIpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIk1hdGgubWF4KDEsIE1hdGguYWJzKGNvbm5lY3Rvci54MiAtIGNvbm5lY3Rvci54MSkpXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJNYXRoLm1heCgxLCBNYXRoLmFicyhjb25uZWN0b3IueTIgLSBjb25uZWN0b3IueTEpKVwiXG4gICAgICA+PC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChkaXN0YW5jZS5ob3Jpem9udGFsICYmIGRpc3RhbmNlLmhvcml6b250YWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLWhvcml6b250YWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICBNYXRoLm1pbihkaXN0YW5jZS5ob3Jpem9udGFsLngxISwgZGlzdGFuY2UuaG9yaXpvbnRhbC54MiEpXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55IVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJcbiAgICAgICAgICBNYXRoLmFicyhkaXN0YW5jZS5ob3Jpem9udGFsLngyISAtIGRpc3RhbmNlLmhvcml6b250YWwueDEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWdcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJcbiAgICAgICAgICAoZGlzdGFuY2UuaG9yaXpvbnRhbC54MSEgKyBkaXN0YW5jZS5ob3Jpem9udGFsLngyISkgLyAyXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiZGlzdGFuY2UuaG9yaXpvbnRhbC55ISArIDEwXCJcbiAgICAgID5cbiAgICAgICAge3sgZm9ybWF0VmFsdWUoZGlzdGFuY2UuaG9yaXpvbnRhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoZGlzdGFuY2UudmVydGljYWwgJiYgZGlzdGFuY2UudmVydGljYWwudmFsdWUgPiAwKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUgaW5zcGVjdG9yLWRpc3RhbmNlLWxpbmUtLXZlcnRpY2FsXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZGlzdGFuY2UudmVydGljYWwueCFcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cIk1hdGgubWluKGRpc3RhbmNlLnZlcnRpY2FsLnkxISwgZGlzdGFuY2UudmVydGljYWwueTIhKVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UudmVydGljYWwueTIhIC0gZGlzdGFuY2UudmVydGljYWwueTEhKVxuICAgICAgICBcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1kaXN0YW5jZS10YWcgaW5zcGVjdG9yLWRpc3RhbmNlLXRhZy0tdmVydGljYWxcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJkaXN0YW5jZS52ZXJ0aWNhbC54ISArIDEwXCJcbiAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZGlzdGFuY2UudmVydGljYWwueTEhICsgZGlzdGFuY2UudmVydGljYWwueTIhKSAvIDJcIlxuICAgICAgPlxuICAgICAgICB7eyBmb3JtYXRWYWx1ZShkaXN0YW5jZS52ZXJ0aWNhbC52YWx1ZSkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuXG4gIEBpZiAoZW5hYmxlZCgpKSB7XG4gICAgQGlmICh0b29sTW9kZSgpID09PSBcImd1aWRlc1wiKSB7XG4gICAgICBAaWYgKGd1aWRlUHJldmlldygpOyBhcyBwcmV2aWV3KSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImluc3BlY3Rvci1ndWlkZSBpbnNwZWN0b3ItZ3VpZGUtLXByZXZpZXdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXZlcnRpY2FsXT1cInByZXZpZXcub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiXG4gICAgICAgICAgICBwcmV2aWV3Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IHByZXZpZXcucG9zaXRpb24gOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cIlxuICAgICAgICAgICAgcHJldmlldy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gcHJldmlldy5wb3NpdGlvbiA6IG51bGxcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtzdHlsZS4tLWluc3BlY3Rvci1ndWlkZV09XCJndWlkZUNvbG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cblxuICAgIEBmb3IgKGd1aWRlIG9mIGd1aWRlcygpOyB0cmFjayBndWlkZS5pZCkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJpbnNwZWN0b3ItZ3VpZGVcIlxuICAgICAgICBbY2xhc3MuaW5zcGVjdG9yLWd1aWRlLS12ZXJ0aWNhbF09XCJndWlkZS5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLWhvcml6b250YWxdPVwiZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgIFtjbGFzcy5pbnNwZWN0b3ItZ3VpZGUtLXNlbGVjdGVkXT1cInNlbGVjdGVkR3VpZGVJZCgpID09PSBndWlkZS5pZFwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIlxuICAgICAgICAgIGd1aWRlLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gZ3VpZGUucG9zaXRpb24gOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwiXG4gICAgICAgICAgZ3VpZGUub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/IGd1aWRlLnBvc2l0aW9uIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUuLS1pbnNwZWN0b3ItZ3VpZGVdPVwiZ3VpZGVDb2xvclwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJzdGFydEd1aWRlRHJhZygkZXZlbnQsIGd1aWRlKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5zcGVjdG9yLWd1aWRlLWxpbmVcIj48L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIH1cbjwvZGl2PlxuIl19
@@ -932,12 +932,11 @@ class inspectorComponent {
932
932
  this.handleCommandBarKeydown(event, key);
933
933
  return;
934
934
  }
935
- if (key === 'm') {
936
- const target = event.target;
937
- if (target?.matches('input, textarea, select') ||
938
- target?.isContentEditable) {
939
- return;
940
- }
935
+ if (this.blocksInspectorShortcut(event.target) || event.repeat) {
936
+ return;
937
+ }
938
+ const hasShortcutModifier = event.metaKey || event.ctrlKey || event.altKey || event.shiftKey;
939
+ if (key === 'm' && !hasShortcutModifier) {
941
940
  event.preventDefault();
942
941
  this.setInspectorEnabled(!this.enabled());
943
942
  return;
@@ -950,6 +949,14 @@ class inspectorComponent {
950
949
  event.shiftKey ? this.redo() : this.undo();
951
950
  return;
952
951
  }
952
+ if (event.key === 'Alt') {
953
+ this.altPressed.set(true);
954
+ this.updateDistanceOverlay();
955
+ return;
956
+ }
957
+ if (hasShortcutModifier) {
958
+ return;
959
+ }
953
960
  if (key === 's') {
954
961
  event.preventDefault();
955
962
  this.setToolMode('select');
@@ -970,11 +977,6 @@ class inspectorComponent {
970
977
  this.setGuideOrientation('vertical');
971
978
  return;
972
979
  }
973
- if (event.key === 'Alt') {
974
- this.altPressed.set(true);
975
- this.updateDistanceOverlay();
976
- return;
977
- }
978
980
  if (key === 'escape') {
979
981
  event.preventDefault();
980
982
  this.selectedMeasurement.set(null);
@@ -1163,6 +1165,11 @@ class inspectorComponent {
1163
1165
  this.beginDelete(active);
1164
1166
  }
1165
1167
  }
1168
+ blocksInspectorShortcut(target) {
1169
+ if (!(target instanceof HTMLElement))
1170
+ return false;
1171
+ return target.closest('form, input, textarea, select, option, [contenteditable]:not([contenteditable="false"]), [role="textbox"]') !== null;
1172
+ }
1166
1173
  clampActiveCheckpoint() {
1167
1174
  this.activeCheckpointIndex.set(Math.min(this.activeCheckpointIndex(), Math.max(0, this.filteredCheckpoints().length - 1)));
1168
1175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"inspector-ng.mjs","sources":["../../../projects/inspector-ng/src/lib/constants.ts","../../../projects/inspector-ng/src/lib/checkpoints.ts","../../../projects/inspector-ng/src/lib/geometry.ts","../../../projects/inspector-ng/src/lib/distances.ts","../../../projects/inspector-ng/src/lib/dom.ts","../../../projects/inspector-ng/src/lib/checkpoint-search.ts","../../../projects/inspector-ng/src/lib/utils.ts","../../../projects/inspector-ng/src/lib/inspector.component.ts","../../../projects/inspector-ng/src/lib/inspector.component.html","../../../projects/inspector-ng/src/inspector-ng.ts"],"sourcesContent":["export const inspector_STORAGE_KEY = \"inspector-state\";\nexport const inspector_STATE_VERSION = 2;\nexport const GUIDE_SNAP_DISTANCE = 10;\nexport const GUIDE_HITBOX_SIZE = 14;\n","import {\n EnvironmentProviders,\n Inject,\n Injectable,\n InjectionToken,\n Optional,\n PLATFORM_ID,\n makeEnvironmentProviders,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router } from '@angular/router';\nimport {\n Action,\n ActionReducer,\n META_REDUCERS,\n Store,\n} from '@ngrx/store';\nimport { firstValueFrom, take } from 'rxjs';\n\nexport interface InspectorCheckpointRecord {\n version: 1;\n id: string;\n name: string;\n route: string;\n createdAt: string;\n state: unknown;\n}\n\ninterface RestoreCheckpointAction extends Action {\n type: typeof RESTORE_CHECKPOINT;\n state: unknown;\n}\n\nconst RESTORE_CHECKPOINT = '[Inspector Checkpoints] Restore';\nconst DATABASE_NAME = 'inspector-ng';\nconst DATABASE_VERSION = 1;\nconst STORE_NAME = 'checkpoints';\n\nexport const INSPECTOR_CHECKPOINT_REPOSITORY =\n new InjectionToken<InspectorCheckpointRepository>('INSPECTOR_CHECKPOINT_REPOSITORY');\n\nexport function inspectorCheckpointMetaReducer<T>(\n reducer: ActionReducer<T>,\n): ActionReducer<T> {\n return (state, action) => {\n if (action.type === RESTORE_CHECKPOINT) {\n return (action as RestoreCheckpointAction).state as T;\n }\n return reducer(state, action);\n };\n}\n\nexport abstract class InspectorCheckpointRepository {\n abstract list(): Promise<InspectorCheckpointRecord[]>;\n abstract put(checkpoint: InspectorCheckpointRecord): Promise<void>;\n abstract delete(id: string): Promise<void>;\n}\n\n@Injectable()\nexport class IndexedDbCheckpointRepository extends InspectorCheckpointRepository {\n private databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(@Inject(PLATFORM_ID) private readonly platformId: object) {\n super();\n }\n\n async list(): Promise<InspectorCheckpointRecord[]> {\n const database = await this.database();\n const values = await this.request<unknown[]>(\n database.transaction(STORE_NAME, 'readonly').objectStore(STORE_NAME).getAll(),\n );\n return values\n .filter(isCheckpointRecord)\n .sort(newestFirst);\n }\n\n async put(checkpoint: InspectorCheckpointRecord): Promise<void> {\n const database = await this.database();\n await this.transactionComplete(database, 'readwrite', (store) => store.put(checkpoint));\n }\n\n async delete(id: string): Promise<void> {\n const database = await this.database();\n await this.transactionComplete(database, 'readwrite', (store) => store.delete(id));\n }\n\n private database(): Promise<IDBDatabase> {\n if (!isPlatformBrowser(this.platformId) || typeof indexedDB === 'undefined') {\n return Promise.reject(new Error('Checkpoints are only available in a browser with IndexedDB.'));\n }\n if (this.databasePromise) return this.databasePromise;\n\n this.databasePromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n request.onupgradeneeded = () => {\n const database = request.result;\n if (database.objectStoreNames.contains(STORE_NAME)) return;\n const store = database.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt');\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB could not be opened.'));\n request.onblocked = () => reject(new Error('IndexedDB is blocked by another open tab.'));\n });\n return this.databasePromise;\n }\n\n private request<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed.'));\n });\n }\n\n private transactionComplete(\n database: IDBDatabase,\n mode: IDBTransactionMode,\n operation: (store: IDBObjectStore) => IDBRequest,\n ): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, mode);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed.'));\n transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction was aborted.'));\n operation(transaction.objectStore(STORE_NAME));\n });\n }\n}\n\n@Injectable()\nexport class InspectorCheckpointService {\n readonly checkpoints = signal<InspectorCheckpointRecord[]>([]);\n readonly loading = signal(false);\n readonly busy = signal(false);\n readonly error = signal<string | null>(null);\n\n constructor(\n @Inject(INSPECTOR_CHECKPOINT_REPOSITORY)\n private readonly repository: InspectorCheckpointRepository,\n @Optional() @Inject(Store) private readonly store: Store | null,\n @Optional() @Inject(Router) private readonly router: Router | null,\n @Inject(PLATFORM_ID) private readonly platformId: object,\n ) {}\n\n async load(): Promise<void> {\n this.error.set(null);\n this.loading.set(true);\n try {\n this.checkpoints.set((await this.repository.list()).sort(newestFirst));\n } catch (error) {\n this.error.set(this.messageFor(error, 'Saved checkpoints could not be loaded. Try reloading the page.'));\n } finally {\n this.loading.set(false);\n }\n }\n\n async save(): Promise<InspectorCheckpointRecord | null> {\n this.error.set(null);\n if (!this.store) {\n this.error.set(this.missingStoreMessage());\n return null;\n }\n\n this.busy.set(true);\n try {\n const currentState = await firstValueFrom(this.store.pipe(take(1)));\n const state = cloneJson(currentState);\n const persisted = await this.repository.list();\n const route = this.currentRoute();\n const pathname = this.currentPathname();\n const checkpoint: InspectorCheckpointRecord = {\n version: 1,\n id: createCheckpointId(),\n name: nextAutomaticName(pathname, persisted.map(({ name }) => name)),\n route,\n createdAt: new Date().toISOString(),\n state,\n };\n await this.repository.put(checkpoint);\n this.checkpoints.set([checkpoint, ...persisted].sort(newestFirst));\n return checkpoint;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be saved.'));\n return null;\n } finally {\n this.busy.set(false);\n }\n }\n\n async restore(id: string): Promise<boolean> {\n this.error.set(null);\n if (!this.store) {\n this.error.set(this.missingStoreMessage());\n return false;\n }\n this.busy.set(true);\n try {\n const checkpoint = (await this.repository.list()).find((item) => item.id === id);\n if (!checkpoint) throw new Error('Checkpoint not found. It may have been deleted in another tab.');\n const state = cloneJson(\n checkpoint.state,\n `“${checkpoint.name}” could not be decoded. Delete it and save a new checkpoint.`,\n );\n this.store.dispatch({ type: RESTORE_CHECKPOINT, state } as RestoreCheckpointAction);\n if (this.router && !await this.router.navigateByUrl(checkpoint.route)) {\n throw new Error(`The state was restored, but navigation to “${checkpoint.route}” was cancelled.`);\n }\n return true;\n } catch (error) {\n this.error.set(this.messageFor(error, 'The checkpoint could not be restored. Delete it and save a new one.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n async rename(id: string, name: string): Promise<boolean> {\n this.error.set(null);\n const nextName = name.trim();\n if (!nextName) {\n this.error.set('Please enter a checkpoint name.');\n return false;\n }\n\n this.busy.set(true);\n try {\n const checkpoints = await this.repository.list();\n if (checkpoints.some((item) => item.id !== id && item.name.toLocaleLowerCase() === nextName.toLocaleLowerCase())) {\n throw new Error(`A checkpoint named “${nextName}” already exists. Choose a different name.`);\n }\n const checkpoint = checkpoints.find((item) => item.id === id);\n if (!checkpoint) throw new Error('Checkpoint not found. It may have been deleted in another tab.');\n await this.repository.put({ ...checkpoint, name: nextName });\n this.checkpoints.set(\n checkpoints.map((item) => item.id === id ? { ...item, name: nextName } : item).sort(newestFirst),\n );\n return true;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be renamed.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n async delete(id: string): Promise<boolean> {\n this.error.set(null);\n this.busy.set(true);\n try {\n await this.repository.delete(id);\n this.checkpoints.set(this.checkpoints().filter((item) => item.id !== id));\n return true;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be deleted.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n clearError(): void {\n this.error.set(null);\n }\n\n private currentRoute(): string {\n if (!isPlatformBrowser(this.platformId)) return '/';\n return `${this.currentPathname()}${window.location.search}${window.location.hash}`;\n }\n\n private currentPathname(): string {\n if (!isPlatformBrowser(this.platformId)) return '/';\n return window.location.pathname || '/';\n }\n\n private missingStoreMessage(): string {\n return 'The NgRx root store is unavailable. Check that provideInspectorCheckpoints() is registered after provideStore().';\n }\n\n private storageMessage(error: unknown, fallback: string): string {\n if (isQuotaError(error)) {\n return 'Browser storage is full. Delete old checkpoints, then try saving again.';\n }\n return this.messageFor(error, fallback);\n }\n\n private messageFor(error: unknown, fallback: string): string {\n return error instanceof Error && error.message ? error.message : fallback;\n }\n}\n\nexport function provideInspectorCheckpoints(): EnvironmentProviders {\n return makeEnvironmentProviders([\n IndexedDbCheckpointRepository,\n {\n provide: INSPECTOR_CHECKPOINT_REPOSITORY,\n useExisting: IndexedDbCheckpointRepository,\n },\n InspectorCheckpointService,\n {\n provide: META_REDUCERS,\n multi: true,\n useValue: inspectorCheckpointMetaReducer,\n },\n ]);\n}\n\nexport function nextAutomaticName(route: string, names: string[]): string {\n const used = new Set(names.map((name) => name.toLocaleLowerCase()));\n if (!used.has(route.toLocaleLowerCase())) return route;\n for (let suffix = 2; ; suffix += 1) {\n const candidate = `${route} ${suffix}`;\n if (!used.has(candidate.toLocaleLowerCase())) return candidate;\n }\n}\n\nfunction cloneJson(\n value: unknown,\n failureMessage = 'The NgRx root state is not JSON-serializable. Remove circular or unsupported values and try again.',\n): unknown {\n try {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) throw new Error();\n return JSON.parse(serialized) as unknown;\n } catch {\n throw new Error(failureMessage);\n }\n}\n\nfunction createCheckpointId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `checkpoint-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction isQuotaError(error: unknown): boolean {\n return error instanceof DOMException && (\n error.name === 'QuotaExceededError' || error.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n );\n}\n\nfunction newestFirst(a: InspectorCheckpointRecord, b: InspectorCheckpointRecord): number {\n return b.createdAt.localeCompare(a.createdAt) || b.id.localeCompare(a.id);\n}\n\nfunction isCheckpointRecord(value: unknown): value is InspectorCheckpointRecord {\n if (!value || typeof value !== 'object') return false;\n const checkpoint = value as Partial<InspectorCheckpointRecord>;\n return checkpoint.version === 1 &&\n typeof checkpoint.id === 'string' &&\n typeof checkpoint.name === 'string' &&\n typeof checkpoint.route === 'string' &&\n typeof checkpoint.createdAt === 'string' &&\n 'state' in checkpoint;\n}\n","import { Rect } from './types';\n\nexport const clamp = (value: number, min: number, max: number) =>\n Math.max(min, Math.min(max, value));\n\nexport const getViewportSize = () => ({\n width: typeof window === 'undefined' ? 1 : window.innerWidth || 1,\n height: typeof window === 'undefined' ? 1 : window.innerHeight || 1,\n});\n\nexport const rectContainsPoint = (\n rect: Rect,\n point: { x: number; y: number },\n) =>\n point.x >= rect.left &&\n point.x <= rect.left + rect.width &&\n point.y >= rect.top &&\n point.y <= rect.top + rect.height;\n\nexport const rectsEqual = (a: Rect | null, b: Rect | null, epsilon = 0.5) => {\n if (a === b) {\n return true;\n }\n\n if (!a || !b) {\n return false;\n }\n\n return (\n Math.abs(a.left - b.left) < epsilon &&\n Math.abs(a.top - b.top) < epsilon &&\n Math.abs(a.width - b.width) < epsilon &&\n Math.abs(a.height - b.height) < epsilon\n );\n};\n","import { clamp, getViewportSize } from './geometry';\nimport { DistanceOverlay, Rect } from './types';\n\nexport const getDistanceOverlay = (rectA: Rect, rectB: Rect): DistanceOverlay => {\n const rightA = rectA.left + rectA.width;\n const bottomA = rectA.top + rectA.height;\n const rightB = rectB.left + rectB.width;\n const bottomB = rectB.top + rectB.height;\n const centerAX = rectA.left + rectA.width / 2;\n const centerAY = rectA.top + rectA.height / 2;\n\n let horizontal: DistanceOverlay['horizontal'] = null;\n let vertical: DistanceOverlay['vertical'] = null;\n const connectors: DistanceOverlay['connectors'] = [];\n\n const separatedX = rightA <= rectB.left || rightB <= rectA.left;\n const separatedY = bottomA <= rectB.top || bottomB <= rectA.top;\n\n if (separatedX) {\n const aIsLeft = rightA <= rectB.left;\n const x1 = aIsLeft ? rightA : rightB;\n const x2 = aIsLeft ? rectB.left : rectA.left;\n const y = centerAY;\n horizontal = { x1, x2, y, value: Math.abs(x2 - x1) };\n\n const edgeBX = aIsLeft ? rectB.left : rightB;\n if (y < rectB.top) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: rectB.top });\n } else if (y > bottomB) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: bottomB });\n }\n }\n\n if (separatedY) {\n const aIsTop = bottomA <= rectB.top;\n const y1 = aIsTop ? bottomA : bottomB;\n const y2 = aIsTop ? rectB.top : rectA.top;\n const x = centerAX;\n vertical = { y1, y2, x, value: Math.abs(y2 - y1) };\n\n const edgeBY = aIsTop ? rectB.top : bottomB;\n if (x < rectB.left) {\n connectors.push({ x1: x, y1: edgeBY, x2: rectB.left, y2: edgeBY });\n } else if (x > rightB) {\n connectors.push({ x1: x, y1: edgeBY, x2: rightB, y2: edgeBY });\n }\n }\n\n const viewport = getViewportSize();\n\n return {\n rectA,\n rectB,\n horizontal,\n vertical,\n connectors: connectors\n .map((segment) => ({\n x1: clamp(segment.x1, 0, viewport.width),\n y1: clamp(segment.y1, 0, viewport.height),\n x2: clamp(segment.x2, 0, viewport.width),\n y2: clamp(segment.y2, 0, viewport.height),\n }))\n .filter(\n (segment) =>\n Math.abs(segment.x1 - segment.x2) > 0.5 ||\n Math.abs(segment.y1 - segment.y2) > 0.5,\n ),\n };\n};\n","import { InspectMeasurement, Rect, TextBlockAnnotation, TextInspection } from './types';\n\nexport const getRectFromDom = (element: Element): Rect => {\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n};\n\nexport const getElementLabel = (element: HTMLElement) => {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className\n ? `.${element.className.toString().split(' ')[0]}`\n : '';\n return `${tag}${id}${className}`;\n};\n\nconst toHex = (value: number) => value.toString(16).padStart(2, '0');\n\nconst normalizeColorToHex = (color: string) => {\n const trimmed = color.trim().toLowerCase();\n if (trimmed.startsWith('#')) {\n if (trimmed.length === 4) {\n return `#${trimmed[1]}${trimmed[1]}${trimmed[2]}${trimmed[2]}${trimmed[3]}${trimmed[3]}`;\n }\n return trimmed;\n }\n\n const rgbMatch = trimmed.match(\n /^rgba?\\(\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)(?:\\s*,\\s*[0-9.]+\\s*)?\\)$/,\n );\n if (!rgbMatch) {\n return color;\n }\n\n const [, r, g, b] = rgbMatch;\n return `#${toHex(Math.round(Number(r)))}${toHex(Math.round(Number(g)))}${toHex(Math.round(Number(b)))}`;\n};\n\nexport const getTextInspection = (element: HTMLElement): TextInspection => {\n const style = window.getComputedStyle(element);\n return {\n fontFamily: style.fontFamily,\n fontSize: style.fontSize,\n fontWeight: style.fontWeight,\n lineHeight: style.lineHeight,\n letterSpacing: style.letterSpacing,\n color: normalizeColorToHex(style.color),\n textAlign: style.textAlign,\n };\n};\n\nconst parseEdge = (value: string) => Number.parseFloat(value) || 0;\n\nexport const getInspectMeasurement = (element: HTMLElement): InspectMeasurement => {\n const rect = getRectFromDom(element);\n const style = window.getComputedStyle(element);\n const parentElement = element.parentElement;\n const parentStyle = parentElement ? window.getComputedStyle(parentElement) : null;\n const padding = {\n top: parseEdge(style.paddingTop),\n right: parseEdge(style.paddingRight),\n bottom: parseEdge(style.paddingBottom),\n left: parseEdge(style.paddingLeft),\n };\n const margin = {\n top: parseEdge(style.marginTop),\n right: parseEdge(style.marginRight),\n bottom: parseEdge(style.marginBottom),\n left: parseEdge(style.marginLeft),\n };\n const rowGap = parentStyle ? parseEdge(parentStyle.rowGap) : 0;\n const columnGap = parentStyle ? parseEdge(parentStyle.columnGap) : 0;\n const parentDisplay = parentStyle?.display ?? '';\n const hasGap =\n !!parentElement &&\n (parentDisplay.includes('flex') || parentDisplay.includes('grid')) &&\n (rowGap > 0 || columnGap > 0);\n\n return {\n rect,\n paddingRect: {\n left: rect.left + padding.left,\n top: rect.top + padding.top,\n width: Math.max(0, rect.width - padding.left - padding.right),\n height: Math.max(0, rect.height - padding.top - padding.bottom),\n },\n marginRect: {\n left: rect.left - margin.left,\n top: rect.top - margin.top,\n width: rect.width + margin.left + margin.right,\n height: rect.height + margin.top + margin.bottom,\n },\n padding,\n margin,\n gap: {\n row: rowGap,\n column: columnGap,\n active: hasGap,\n },\n parentRect: hasGap && parentElement ? getRectFromDom(parentElement) : null,\n label: getElementLabel(element),\n styles: getTextInspection(element),\n };\n};\n\nconst isVisibleTextCandidate = (element: HTMLElement) => {\n const text = element.innerText?.trim() ?? '';\n if (!text) {\n return false;\n }\n\n const style = window.getComputedStyle(element);\n if (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n Number.parseFloat(style.opacity || '1') === 0\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width < 8 || rect.height < 8) {\n return false;\n }\n\n for (const child of Array.from(element.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if ((child.innerText?.trim() ?? '') && child.getBoundingClientRect().height > 0) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const getVisibleTextBlocks = (\n overlayElement: HTMLElement | null,\n limit = 160,\n): TextBlockAnnotation[] => {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const nodes = Array.from(document.querySelectorAll('body *'));\n const blocks: TextBlockAnnotation[] = [];\n\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement && overlayElement.contains(node)) {\n continue;\n }\n if (!isVisibleTextCandidate(node)) {\n continue;\n }\n\n const rect = getRectFromDom(node);\n const text = (node.innerText || node.textContent || '').replace(/\\s+/g, ' ').trim();\n blocks.push({\n id: `${node.tagName.toLowerCase()}-${Math.round(rect.left)}-${Math.round(rect.top)}-${text.slice(0, 24)}`,\n rect,\n text,\n styles: getTextInspection(node),\n });\n\n if (blocks.length >= limit) {\n break;\n }\n }\n\n return blocks;\n};\n\nexport const getTargetElement = (\n point: { x: number; y: number },\n overlayElement: HTMLElement | null,\n) => {\n if (typeof document === 'undefined') {\n return null;\n }\n\n if (overlayElement) {\n const previous = overlayElement.style.pointerEvents;\n overlayElement.style.pointerEvents = 'none';\n const elements = document.elementsFromPoint(point.x, point.y);\n overlayElement.style.pointerEvents = previous;\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement.contains(element)) {\n continue;\n }\n if (element === document.body || element === document.documentElement) {\n continue;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 2 || rect.height <= 2) {\n continue;\n }\n return element;\n }\n\n return null;\n }\n\n return document.elementFromPoint(point.x, point.y) as HTMLElement | null;\n};\n","import { InspectorCheckpointRecord } from './checkpoints';\n\ninterface RankedCheckpoint {\n checkpoint: InspectorCheckpointRecord;\n score: number;\n}\n\nexport function fuzzyCheckpoints(\n checkpoints: InspectorCheckpointRecord[],\n query: string,\n): InspectorCheckpointRecord[] {\n const normalizedQuery = normalize(query.trim());\n if (!normalizedQuery) return [...checkpoints].sort(newestFirst);\n\n return checkpoints\n .map((checkpoint): RankedCheckpoint | null => {\n const score = fuzzyScore(checkpoint.name, normalizedQuery);\n return score === null ? null : { checkpoint, score };\n })\n .filter((item): item is RankedCheckpoint => item !== null)\n .sort((a, b) => b.score - a.score || newestFirst(a.checkpoint, b.checkpoint))\n .map(({ checkpoint }) => checkpoint);\n}\n\nexport function fuzzyScore(value: string, normalizedQuery: string): number | null {\n const candidate = normalize(value);\n if (candidate === normalizedQuery) return 10_000;\n if (candidate.startsWith(normalizedQuery)) return 8_000 - candidate.length;\n\n const substringIndex = candidate.indexOf(normalizedQuery);\n if (substringIndex >= 0) return 6_000 - substringIndex * 10 - candidate.length;\n\n let queryIndex = 0;\n let firstIndex = -1;\n let lastIndex = -1;\n let gapPenalty = 0;\n for (let index = 0; index < candidate.length && queryIndex < normalizedQuery.length; index += 1) {\n if (candidate[index] !== normalizedQuery[queryIndex]) continue;\n if (firstIndex < 0) firstIndex = index;\n if (lastIndex >= 0) gapPenalty += index - lastIndex - 1;\n lastIndex = index;\n queryIndex += 1;\n }\n if (queryIndex !== normalizedQuery.length) return null;\n return 4_000 - firstIndex * 10 - gapPenalty * 20 - candidate.length;\n}\n\nfunction normalize(value: string): string {\n return value\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLocaleLowerCase();\n}\n\nfunction newestFirst(a: InspectorCheckpointRecord, b: InspectorCheckpointRecord): number {\n return b.createdAt.localeCompare(a.createdAt) || b.id.localeCompare(a.id);\n}\n","export const createId = () =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n\nexport const formatValue = (value: number) => Math.round(value);\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n GUIDE_HITBOX_SIZE,\n GUIDE_SNAP_DISTANCE,\n inspector_STATE_VERSION,\n inspector_STORAGE_KEY,\n} from './constants';\nimport {\n getInspectMeasurement,\n getRectFromDom,\n getTargetElement,\n getVisibleTextBlocks,\n} from './dom';\nimport { getDistanceOverlay } from './distances';\nimport { clamp, getViewportSize, rectsEqual } from './geometry';\nimport {\n DistanceOverlay,\n Guide,\n GuideOrientation,\n InspectMeasurement,\n inspectorLegacyPersistedState,\n inspectorPersistedState,\n Rect,\n TextBlockAnnotation,\n ToolMode,\n} from './types';\nimport {\n InspectorCheckpointRecord,\n InspectorCheckpointService,\n} from './checkpoints';\nimport { fuzzyCheckpoints } from './checkpoint-search';\nimport { createId, formatValue } from './utils';\n\n@Component({\n selector: 'inspector-overlay',\n standalone: true,\n imports: [],\n templateUrl: './inspector.component.html',\n styleUrl: './inspector.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class inspectorComponent implements OnDestroy {\n readonly Math = Math;\n readonly formatValue = formatValue;\n readonly guideHitboxSize = GUIDE_HITBOX_SIZE;\n readonly overlayRoot = viewChild<ElementRef<HTMLElement>>('overlayRoot');\n readonly checkpointDialog = viewChild<ElementRef<HTMLDialogElement>>('checkpointDialog');\n readonly checkpointSearch = viewChild<ElementRef<HTMLInputElement>>('checkpointSearch');\n\n @Input() highlightColor = '#4f8cff';\n @Input() guideColor = '#ff7a00';\n @Input() hoverHighlightEnabled = true;\n @Input() persistOnReload = false;\n\n readonly checkpointService = inject(InspectorCheckpointService, { optional: true });\n readonly commandBarOpen = signal(false);\n readonly checkpointQuery = signal('');\n readonly activeCheckpointIndex = signal(0);\n readonly editingCheckpointId = signal<string | null>(null);\n readonly deletingCheckpointId = signal<string | null>(null);\n readonly renameDraft = signal('');\n readonly checkpointToast = signal<string | null>(null);\n readonly checkpointToastIsError = signal(false);\n readonly filteredCheckpoints = computed(() =>\n fuzzyCheckpoints(\n this.checkpointService?.checkpoints() ?? [],\n this.checkpointQuery(),\n ),\n );\n\n readonly enabled = signal(true);\n readonly toolMode = signal<ToolMode>('none');\n readonly guideOrientation = signal<GuideOrientation>('vertical');\n readonly guides = signal<Guide[]>([]);\n readonly hoverRect = signal<Rect | null>(null);\n readonly selectedGuideId = signal<string | null>(null);\n readonly selectedMeasurement = signal<InspectMeasurement | null>(null);\n readonly showTypography = signal(false);\n readonly altPressed = signal(false);\n readonly distanceOverlay = signal<DistanceOverlay | null>(null);\n readonly textBlocks = signal<TextBlockAnnotation[]>([]);\n readonly guidePreview = signal<Guide | null>(null);\n\n readonly selectedMetaLine = computed(() => {\n const selected = this.selectedMeasurement();\n if (!selected) {\n return '';\n }\n return `${selected.label} · ${formatValue(selected.rect.width)} x ${formatValue(selected.rect.height)} · ${selected.styles.fontSize} / ${selected.styles.lineHeight} / ${selected.styles.color}`;\n });\n\n private readonly isBrowser: boolean;\n private readonly hydrated = signal(false);\n private readonly history = signal<Guide[][]>([]);\n private readonly historyIndex = signal(-1);\n private readonly handleCapturedClick = (event: MouseEvent) => {\n if (\n !event.shiftKey ||\n !this.canInspectClick(event) ||\n !this.selectElementAtPoint(event)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n };\n private draggingGuideId: string | null = null;\n private selectedElement: HTMLElement | null = null;\n private hoverElement: HTMLElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly canUndo = computed(() => this.historyIndex() > 0);\n readonly canRedo = computed(\n () =>\n this.historyIndex() >= 0 &&\n this.historyIndex() < this.history().length - 1,\n );\n\n constructor(@Inject(PLATFORM_ID) platformId: object) {\n this.isBrowser = isPlatformBrowser(platformId);\n\n effect(() => {\n if (!this.persistOnReload || !this.isBrowser || !this.hydrated()) {\n return;\n }\n\n const payload: inspectorPersistedState = {\n version: inspector_STATE_VERSION,\n enabled: this.enabled(),\n toolMode: this.toolMode(),\n guideOrientation: this.guideOrientation(),\n guides: this.guides(),\n showTypography: this.showTypography(),\n };\n\n window.localStorage.setItem(\n inspector_STORAGE_KEY,\n JSON.stringify(payload),\n );\n });\n }\n\n ngOnInit() {\n if (!this.isBrowser) {\n this.hydrated.set(true);\n return;\n }\n\n window.addEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n\n if (!this.persistOnReload) {\n this.hydrated.set(true);\n return;\n }\n\n const stored = window.localStorage.getItem(inspector_STORAGE_KEY);\n if (!stored) {\n this.hydrated.set(true);\n return;\n }\n\n try {\n const parsed = JSON.parse(stored) as\n | inspectorPersistedState\n | inspectorLegacyPersistedState;\n if (parsed.version === inspector_STATE_VERSION || parsed.version === 1) {\n this.enabled.set(true);\n this.toolMode.set(parsed.toolMode);\n this.guideOrientation.set(parsed.guideOrientation);\n this.guides.set(parsed.guides ?? []);\n this.showTypography.set(\n parsed.version === 1 ? false : (parsed.showTypography ?? false),\n );\n this.recordHistory(parsed.guides ?? []);\n }\n } catch {\n // ignore malformed state\n }\n\n this.hydrated.set(true);\n this.refreshTypographyBlocks();\n }\n\n ngOnDestroy() {\n if (!this.isBrowser) {\n return;\n }\n\n window.removeEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n setToolMode(mode: ToolMode) {\n if (!this.enabled()) {\n this.enabled.set(true);\n }\n\n this.toolMode.set(this.toolMode() === mode ? 'none' : mode);\n this.hoverRect.set(null);\n this.guidePreview.set(null);\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n }\n\n setGuideOrientation(orientation: GuideOrientation) {\n this.guideOrientation.set(orientation);\n this.guidePreview.set(null);\n }\n\n activateGuideOrientation(orientation: GuideOrientation) {\n const isActive = this.toolMode() === 'guides' && this.guideOrientation() === orientation;\n this.setGuideOrientation(orientation);\n if (isActive || this.toolMode() !== 'guides') {\n this.setToolMode('guides');\n }\n }\n\n toggleTypography() {\n this.showTypography.update((value) => !value);\n this.refreshTypographyBlocks();\n }\n\n disableInspector() {\n this.setInspectorEnabled(false);\n }\n\n async saveCheckpoint() {\n const checkpoint = await this.checkpointService?.save();\n if (checkpoint) {\n this.showCheckpointToast(`Saved “${checkpoint.name}”.`);\n } else if (this.checkpointService?.error()) {\n this.showCheckpointToast(this.checkpointService.error()!, true);\n }\n }\n\n async openCheckpointCommandBar() {\n if (!this.checkpointService || !this.isBrowser || this.commandBarOpen()) return;\n this.commandBarOpen.set(true);\n this.checkpointQuery.set('');\n this.activeCheckpointIndex.set(0);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n this.checkpointService.clearError();\n this.checkpointDialog()?.nativeElement.showModal();\n queueMicrotask(() => this.checkpointSearch()?.nativeElement.focus());\n await this.checkpointService.load();\n this.clampActiveCheckpoint();\n }\n\n closeCheckpointCommandBar() {\n if (this.checkpointService?.busy()) return;\n this.checkpointDialog()?.nativeElement.close();\n this.commandBarOpen.set(false);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n }\n\n updateCheckpointQuery(event: Event) {\n this.checkpointQuery.set((event.target as HTMLInputElement).value);\n this.activeCheckpointIndex.set(0);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n this.checkpointService?.clearError();\n }\n\n setActiveCheckpoint(index: number) {\n this.activeCheckpointIndex.set(index);\n }\n\n async restoreCheckpoint(checkpoint: InspectorCheckpointRecord) {\n if (!this.checkpointService || this.checkpointService.busy()) return;\n const restored = await this.checkpointService.restore(checkpoint.id);\n if (!restored) return;\n this.checkpointDialog()?.nativeElement.close();\n this.commandBarOpen.set(false);\n this.showCheckpointToast(`Restored “${checkpoint.name}”.`);\n }\n\n beginRename(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (this.checkpointService?.busy()) return;\n this.editingCheckpointId.set(checkpoint.id);\n this.deletingCheckpointId.set(null);\n this.renameDraft.set(checkpoint.name);\n queueMicrotask(() => {\n const input = this.checkpointDialog()?.nativeElement.querySelector<HTMLInputElement>(\n '.inspector-command-row__rename',\n );\n input?.focus();\n input?.select();\n });\n }\n\n updateRenameDraft(event: Event) {\n this.renameDraft.set((event.target as HTMLInputElement).value);\n this.checkpointService?.clearError();\n }\n\n async finishRename(checkpoint: InspectorCheckpointRecord) {\n if (await this.checkpointService?.rename(checkpoint.id, this.renameDraft())) {\n this.editingCheckpointId.set(null);\n this.checkpointSearch()?.nativeElement.focus();\n }\n }\n\n cancelRename() {\n this.editingCheckpointId.set(null);\n this.checkpointService?.clearError();\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n beginDelete(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (this.checkpointService?.busy()) return;\n this.deletingCheckpointId.set(checkpoint.id);\n this.editingCheckpointId.set(null);\n }\n\n cancelDelete(event?: Event) {\n event?.stopPropagation();\n this.deletingCheckpointId.set(null);\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n async confirmDelete(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (!await this.checkpointService?.delete(checkpoint.id)) return;\n this.deletingCheckpointId.set(null);\n this.clampActiveCheckpoint();\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n handleCheckpointDialogClick(event: MouseEvent) {\n if (\n event.target === this.checkpointDialog()?.nativeElement &&\n !this.checkpointService?.busy() &&\n !this.deletingCheckpointId()\n ) {\n this.closeCheckpointCommandBar();\n }\n }\n\n clearGuides() {\n this.guides.set([]);\n this.selectedGuideId.set(null);\n this.recordHistory([]);\n }\n\n trackGuide = (_index: number, guide: Guide) => guide.id;\n trackTextBlock = (_index: number, block: TextBlockAnnotation) => block.id;\n trackConnector = (\n _index: number,\n connector: DistanceOverlay['connectors'][number],\n ) => `${connector.x1}:${connector.y1}:${connector.x2}:${connector.y2}`;\n\n startGuideDrag(event: PointerEvent, guide: Guide) {\n event.preventDefault();\n event.stopPropagation();\n this.draggingGuideId = guide.id;\n this.selectedGuideId.set(guide.id);\n }\n\n formatEdges(edges: InspectMeasurement['padding']) {\n return `${formatValue(edges.top)} ${formatValue(edges.right)} ${formatValue(edges.bottom)} ${formatValue(edges.left)}`;\n }\n\n formatGap(selected: InspectMeasurement) {\n return `${formatValue(selected.gap.row)} / ${formatValue(selected.gap.column)}`;\n }\n\n @HostListener('window:keydown', ['$event'])\n handleKeydown(event: KeyboardEvent) {\n const key = event.key.toLowerCase();\n\n if (\n this.checkpointService &&\n !event.repeat &&\n (event.metaKey || event.ctrlKey) &&\n event.shiftKey &&\n key === 'p'\n ) {\n event.preventDefault();\n this.commandBarOpen() ? this.closeCheckpointCommandBar() : void this.openCheckpointCommandBar();\n return;\n }\n\n if (this.commandBarOpen()) {\n this.handleCommandBarKeydown(event, key);\n return;\n }\n\n if (key === 'm') {\n const target = event.target as HTMLElement | null;\n if (\n target?.matches('input, textarea, select') ||\n target?.isContentEditable\n ) {\n return;\n }\n event.preventDefault();\n this.setInspectorEnabled(!this.enabled());\n return;\n }\n\n if (!this.enabled()) {\n return;\n }\n\n if ((event.metaKey || event.ctrlKey) && key === 'z') {\n event.preventDefault();\n event.shiftKey ? this.redo() : this.undo();\n return;\n }\n\n if (key === 's') {\n event.preventDefault();\n this.setToolMode('select');\n return;\n }\n\n if (key === 'g') {\n event.preventDefault();\n this.setToolMode('guides');\n return;\n }\n\n if (key === 'h') {\n event.preventDefault();\n this.setGuideOrientation('horizontal');\n return;\n }\n\n if (key === 'v') {\n event.preventDefault();\n this.setGuideOrientation('vertical');\n return;\n }\n\n if (event.key === 'Alt') {\n this.altPressed.set(true);\n this.updateDistanceOverlay();\n return;\n }\n\n if (key === 'escape') {\n event.preventDefault();\n this.selectedMeasurement.set(null);\n this.selectedGuideId.set(null);\n this.hoverRect.set(null);\n this.distanceOverlay.set(null);\n this.selectedElement = null;\n this.hoverElement = null;\n this.guidePreview.set(null);\n this.clearGuides();\n this.refreshTypographyBlocks();\n return;\n }\n\n if ((key === 'backspace' || key === 'delete') && this.selectedGuideId()) {\n event.preventDefault();\n const nextGuides = this.guides().filter(\n (guide) => guide.id !== this.selectedGuideId(),\n );\n this.guides.set(nextGuides);\n this.selectedGuideId.set(null);\n this.recordHistory(nextGuides);\n }\n }\n\n @HostListener('window:keyup', ['$event'])\n handleKeyup(event: KeyboardEvent) {\n if (event.key === 'Alt') {\n this.altPressed.set(false);\n this.distanceOverlay.set(null);\n }\n }\n\n @HostListener('window:pointermove', ['$event'])\n handlePointerMove(event: PointerEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n if (this.draggingGuideId) {\n this.guidePreview.set(null);\n const viewport = getViewportSize();\n this.guides.set(\n this.guides().map((guide) => {\n if (guide.id !== this.draggingGuideId) {\n return guide;\n }\n const rawPosition =\n guide.orientation === 'vertical' ? event.clientX : event.clientY;\n const max =\n guide.orientation === 'vertical' ? viewport.width : viewport.height;\n return { ...guide, position: clamp(rawPosition, 0, max) };\n }),\n );\n return;\n }\n\n if (this.toolMode() === 'guides') {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n\n if (\n this.overlayRoot()?.nativeElement.contains(event.target as Node) ??\n false\n ) {\n this.guidePreview.set(null);\n return;\n }\n\n this.guidePreview.set(this.getGuidePreview(event));\n return;\n }\n\n this.guidePreview.set(null);\n\n if (this.toolMode() !== 'select' || !this.hoverHighlightEnabled) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n if (!this.altPressed()) {\n return;\n }\n }\n\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n this.overlayRoot()?.nativeElement ?? null,\n );\n if (!target) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n return;\n }\n\n const rect = getRectFromDom(target);\n this.hoverElement = target;\n if (!rectsEqual(rect, this.hoverRect())) {\n this.hoverRect.set(rect);\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n @HostListener('window:pointerup')\n handlePointerUp() {\n if (!this.draggingGuideId) {\n return;\n }\n this.recordHistory(this.guides());\n this.draggingGuideId = null;\n }\n\n @HostListener('window:click', ['$event'])\n handleClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n\n if (this.toolMode() === 'guides') {\n if (overlay && overlay.contains(event.target as Node)) {\n return;\n }\n const guide = this.getGuidePreview(event);\n this.addGuide({ ...guide, id: createId() });\n this.guidePreview.set(guide);\n return;\n }\n\n if (!this.canInspectClick(event)) {\n return;\n }\n\n this.selectElementAtPoint(event);\n }\n\n @HostListener('window:resize')\n @HostListener('window:scroll')\n handleViewportChange() {\n if (this.selectedElement && document.contains(this.selectedElement)) {\n this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n private canInspectClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser || this.toolMode() !== 'select') {\n return false;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n return !(overlay && overlay.contains(event.target as Node));\n }\n\n private setInspectorEnabled(enabled: boolean) {\n this.enabled.set(enabled);\n if (!enabled) {\n this.toolMode.set('none');\n this.hoverRect.set(null);\n this.selectedGuideId.set(null);\n this.selectedMeasurement.set(null);\n this.distanceOverlay.set(null);\n this.textBlocks.set([]);\n this.guidePreview.set(null);\n this.altPressed.set(false);\n this.selectedElement = null;\n this.hoverElement = null;\n this.draggingGuideId = null;\n }\n this.refreshTypographyBlocks();\n }\n\n private handleCommandBarKeydown(event: KeyboardEvent, key: string) {\n const checkpoints = this.filteredCheckpoints();\n const active = checkpoints[this.activeCheckpointIndex()];\n const target = event.target as HTMLElement | null;\n const isRenameInput = target?.classList?.contains('inspector-command-row__rename') ?? false;\n\n if (key === 'escape') {\n event.preventDefault();\n if (this.editingCheckpointId()) this.cancelRename();\n else if (this.deletingCheckpointId()) this.cancelDelete();\n else this.closeCheckpointCommandBar();\n return;\n }\n if (this.checkpointService?.busy()) return;\n const editingCheckpoint = checkpoints.find(({ id }) => id === this.editingCheckpointId());\n if (isRenameInput && key === 'enter' && editingCheckpoint) {\n event.preventDefault();\n void this.finishRename(editingCheckpoint);\n return;\n }\n if (isRenameInput) return;\n if (key === 'arrowdown') {\n event.preventDefault();\n this.activeCheckpointIndex.set(Math.min(this.activeCheckpointIndex() + 1, Math.max(0, checkpoints.length - 1)));\n this.scrollActiveCheckpointIntoView();\n return;\n }\n if (key === 'arrowup') {\n event.preventDefault();\n this.activeCheckpointIndex.set(Math.max(0, this.activeCheckpointIndex() - 1));\n this.scrollActiveCheckpointIntoView();\n return;\n }\n if (key === 'enter' && active && !this.deletingCheckpointId()) {\n event.preventDefault();\n void this.restoreCheckpoint(active);\n return;\n }\n if (key === 'f2' && active) {\n event.preventDefault();\n this.beginRename(active);\n return;\n }\n if (key === 'delete' && active) {\n event.preventDefault();\n this.beginDelete(active);\n }\n }\n\n private clampActiveCheckpoint() {\n this.activeCheckpointIndex.set(\n Math.min(this.activeCheckpointIndex(), Math.max(0, this.filteredCheckpoints().length - 1)),\n );\n }\n\n private scrollActiveCheckpointIntoView() {\n queueMicrotask(() => {\n const row = this.checkpointDialog()?.nativeElement.querySelector<HTMLElement>(\n `[data-checkpoint-index=\"${this.activeCheckpointIndex()}\"]`,\n );\n row?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n private showCheckpointToast(message: string, isError = false) {\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.checkpointToastIsError.set(isError);\n this.checkpointToast.set(message);\n this.toastTimer = setTimeout(() => {\n this.checkpointToast.set(null);\n this.checkpointToastIsError.set(false);\n }, 2500);\n }\n\n private selectElementAtPoint(event: MouseEvent) {\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n overlay,\n );\n if (!target) {\n this.selectedMeasurement.set(null);\n this.selectedElement = null;\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n return false;\n }\n\n // Ctrl+click: select the minimum common parent of current selection and clicked element\n if ((event.ctrlKey || event.metaKey) && this.selectedElement) {\n const commonParent = this.findMinimumCommonParent(\n this.selectedElement,\n target,\n );\n if (\n commonParent &&\n commonParent !== document.body &&\n commonParent !== document.documentElement\n ) {\n this.selectedMeasurement.set(getInspectMeasurement(commonParent));\n this.selectedElement = commonParent;\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n }\n\n this.selectedMeasurement.set(getInspectMeasurement(target));\n this.selectedElement = target;\n this.selectedGuideId.set(\n this.findGuideAtPoint(event.clientX, event.clientY),\n );\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n\n private updateDistanceOverlay() {\n if (\n !this.altPressed() ||\n !this.selectedElement ||\n !this.hoverElement ||\n this.selectedElement === this.hoverElement ||\n this.selectedElement.contains(this.hoverElement) ||\n this.hoverElement.contains(this.selectedElement)\n ) {\n this.distanceOverlay.set(null);\n return;\n }\n\n this.distanceOverlay.set(\n getDistanceOverlay(\n getRectFromDom(this.selectedElement),\n getRectFromDom(this.hoverElement),\n ),\n );\n }\n\n private refreshTypographyBlocks() {\n if (!this.isBrowser || !this.enabled() || !this.showTypography()) {\n this.textBlocks.set([]);\n return;\n }\n\n const viewport = getViewportSize();\n this.textBlocks.set(\n getVisibleTextBlocks(this.overlayRoot()?.nativeElement ?? null)\n .filter(\n (block) =>\n block.rect.top >= 0 &&\n block.rect.top <= viewport.height &&\n block.rect.left >= 0 &&\n block.rect.left <= viewport.width,\n )\n .map((block) => ({\n ...block,\n rect: {\n ...block.rect,\n left: clamp(block.rect.left, 0, viewport.width - 12),\n top: clamp(block.rect.top, 14, viewport.height),\n },\n })),\n );\n }\n\n private addGuide(guide: Guide) {\n const nextGuides = [...this.guides(), guide];\n this.guides.set(nextGuides);\n this.selectedGuideId.set(guide.id);\n this.recordHistory(nextGuides);\n }\n\n private getGuidePreview(event: PointerEvent | MouseEvent): Guide {\n const viewport = getViewportSize();\n const orientation = this.guideOrientation();\n const rawPosition =\n orientation === 'vertical' ? event.clientX : event.clientY;\n const max = orientation === 'vertical' ? viewport.width : viewport.height;\n\n return {\n id: 'preview',\n orientation,\n position: this.snapGuide(clamp(rawPosition, 0, max)),\n };\n }\n\n private snapGuide(position: number) {\n for (const guide of this.guides()) {\n if (Math.abs(guide.position - position) <= GUIDE_SNAP_DISTANCE) {\n return guide.position;\n }\n }\n return position;\n }\n\n private findGuideAtPoint(x: number, y: number) {\n for (const guide of this.guides()) {\n if (\n guide.orientation === 'vertical' &&\n Math.abs(guide.position - x) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n if (\n guide.orientation === 'horizontal' &&\n Math.abs(guide.position - y) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n }\n return null;\n }\n\n private undo() {\n if (!this.canUndo()) {\n return;\n }\n const nextIndex = this.historyIndex() - 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private redo() {\n if (!this.canRedo()) {\n return;\n }\n const nextIndex = this.historyIndex() + 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private recordHistory(guides: Guide[]) {\n const base = this.history().slice(0, this.historyIndex() + 1);\n base.push(this.cloneGuides(guides));\n this.history.set(base);\n this.historyIndex.set(base.length - 1);\n }\n\n private cloneGuides(guides: Guide[]) {\n return guides.map((guide) => ({ ...guide }));\n }\n\n private findMinimumCommonParent(\n elementA: HTMLElement,\n elementB: HTMLElement,\n ): HTMLElement | null {\n // Build ancestor chain for element A\n const ancestorsA = new Set<Element>();\n let current: Element | null = elementA;\n while (current) {\n ancestorsA.add(current);\n current = current.parentElement;\n }\n\n // Walk up from elementB until we find a common ancestor\n current = elementB;\n while (current) {\n if (ancestorsA.has(current)) {\n return current as HTMLElement;\n }\n current = current.parentElement;\n }\n\n return null;\n }\n}\n","<div class=\"inspector-root\" #overlayRoot>\n @if (enabled()) {\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n aria-label=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Select</span>\n </button>\n\n @if (checkpointService) {\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n (click)=\"saveCheckpoint()\"\n [disabled]=\"checkpointService.busy()\"\n aria-label=\"Save checkpoint\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Save checkpoint</span>\n </button>\n }\n\n <div class=\"inspector-toolbar__secondary\">\n <div class=\"inspector-toolbar__reveal\">\n <div class=\"inspector-toolbar__reveal-inner\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n aria-label=\"Typography overlay\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Typography</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'vertical'\"\n (click)=\"activateGuideOrientation('vertical')\"\n aria-label=\"Vertical guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Vertical guides</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'horizontal'\"\n (click)=\"activateGuideOrientation('horizontal')\"\n aria-label=\"Horizontal guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Horizontal guides</span>\n </button>\n </div>\n </div>\n </div>\n\n <span class=\"inspector-toolbar__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--power\"\n (click)=\"disableInspector()\"\n aria-label=\"Disable inspector; press M to enable\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Disable</span>\n </button>\n </div>\n </div>\n }\n\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label id=\"inspector-command-title\" class=\"inspector-visually-hidden\" for=\"inspector-checkpoint-search\">\n Search checkpoints\n </label>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"Find a checkpoint…\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results'\"\n [attr.aria-activedescendant]=\"filteredCheckpoints().length ? 'inspector-checkpoint-' + filteredCheckpoints()[activeCheckpointIndex()].id : null\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p class=\"inspector-command__message inspector-command__message--error\" role=\"alert\">{{ error }}</p>\n }\n\n <div id=\"inspector-checkpoint-results\" class=\"inspector-command__results\" role=\"listbox\" aria-label=\"Saved checkpoints\">\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading checkpoints…</p>\n } @else if (!checkpointService.checkpoints().length) {\n <p class=\"inspector-command__message\" role=\"status\">No checkpoints yet. Save one from the Inspector toolbar.</p>\n } @else if (!filteredCheckpoints().length) {\n <p class=\"inspector-command__message\" role=\"status\">No checkpoint matches “{{ checkpointQuery() }}”.</p>\n } @else {\n @for (checkpoint of filteredCheckpoints(); track checkpoint.id; let index = $index) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-checkpoint-index]=\"index\"\n [attr.aria-selected]=\"activeCheckpointIndex() === index\"\n [class.is-active]=\"activeCheckpointIndex() === index\"\n [class.is-busy]=\"checkpointService.busy() && activeCheckpointIndex() === index\"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"deletingCheckpointId() === checkpoint.id || editingCheckpointId() === checkpoint.id ? null : restoreCheckpoint(checkpoint)\"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\">Delete “{{ checkpoint.name }}”?</span>\n <span class=\"inspector-command-row__confirm-actions\">\n <button type=\"button\" class=\"is-danger\" (click)=\"confirmDelete(checkpoint, $event)\">Delete checkpoint</button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">Keep checkpoint</button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__name\">\n @if (checkpointService.busy() && activeCheckpointIndex() === index) {\n Restoring “{{ checkpoint.name }}”…\n } @else {\n {{ checkpoint.name }}\n }\n </span>\n <span class=\"inspector-command-row__actions\">\n <button type=\"button\" (click)=\"beginRename(checkpoint, $event)\" [attr.aria-label]=\"'Rename ' + checkpoint.name\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\" /></svg>\n </button>\n <button type=\"button\" (click)=\"beginDelete(checkpoint, $event)\" [attr.aria-label]=\"'Delete ' + checkpoint.name\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\" /></svg>\n </button>\n </span>\n }\n </div>\n }\n }\n </div>\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >{{ toast }}</p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["newestFirst"],"mappings":";;;;;;;;;AAAO,MAAM,qBAAqB,GAAG;AAC9B,MAAM,uBAAuB,GAAG;AAChC,MAAM,mBAAmB,GAAG;AAC5B,MAAM,iBAAiB,GAAG;;AC+BjC,MAAM,kBAAkB,GAAG,iCAAiC;AAC5D,MAAM,aAAa,GAAG,cAAc;AACpC,MAAM,gBAAgB,GAAG,CAAC;AAC1B,MAAM,UAAU,GAAG,aAAa;AAEzB,MAAM,+BAA+B,GAC1C,IAAI,cAAc,CAAgC,iCAAiC,CAAC;AAEhF,SAAU,8BAA8B,CAC5C,OAAyB,EAAA;AAEzB,IAAA,OAAO,CAAC,KAAK,EAAE,MAAM,KAAI;AACvB,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE;YACtC,OAAQ,MAAkC,CAAC,KAAU;QACvD;AACA,QAAA,OAAO,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AAC/B,IAAA,CAAC;AACH;MAEsB,6BAA6B,CAAA;AAIlD;AAGK,MAAO,6BAA8B,SAAQ,6BAA6B,CAAA;AAG9E,IAAA,WAAA,CAAkD,UAAkB,EAAA;AAClE,QAAA,KAAK,EAAE;QADyC,IAAA,CAAA,UAAU,GAAV,UAAU;QAFpD,IAAA,CAAA,eAAe,GAAgC,IAAI;IAI3D;AAEA,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,QAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAC9E;AACD,QAAA,OAAO;aACJ,MAAM,CAAC,kBAAkB;aACzB,IAAI,CAACA,aAAW,CAAC;IACtB;IAEA,MAAM,GAAG,CAAC,UAAqC,EAAA;AAC7C,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;QACtC,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzF;IAEA,MAAM,MAAM,CAAC,EAAU,EAAA;AACrB,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;QACtC,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpF;IAEQ,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;YAC3E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjG;QACA,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC,eAAe;QAErD,IAAI,CAAC,eAAe,GAAG,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,KAAI;YAClE,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC;AAC/D,YAAA,OAAO,CAAC,eAAe,GAAG,MAAK;AAC7B,gBAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM;AAC/B,gBAAA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAAE;AACpD,gBAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvE,gBAAA,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC;AAC7C,YAAA,CAAC;AACD,YAAA,OAAO,CAAC,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AACjD,YAAA,OAAO,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AAC5F,YAAA,OAAO,CAAC,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC1F,QAAA,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,eAAe;IAC7B;AAEQ,IAAA,OAAO,CAAI,OAAsB,EAAA;QACvC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,KAAI;AACxC,YAAA,OAAO,CAAC,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AACjD,YAAA,OAAO,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AACzF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,mBAAmB,CACzB,QAAqB,EACrB,IAAwB,EACxB,SAAgD,EAAA;QAEhD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;YAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC;YAC1D,WAAW,CAAC,UAAU,GAAG,MAAM,OAAO,EAAE;AACxC,YAAA,WAAW,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;AACnG,YAAA,WAAW,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxG,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AAChD,QAAA,CAAC,CAAC;IACJ;AAnEW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,kBAGpB,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAHpB,6BAA6B,EAAA,CAAA,CAAA;;4FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBADzC;;0BAIc,MAAM;2BAAC,WAAW;;MAoEpB,0BAA0B,CAAA;AAMrC,IAAA,WAAA,CAEmB,UAAyC,EACd,KAAmB,EAClB,MAAqB,EAC5B,UAAkB,EAAA;QAHvC,IAAA,CAAA,UAAU,GAAV,UAAU;QACiB,IAAA,CAAA,KAAK,GAAL,KAAK;QACJ,IAAA,CAAA,MAAM,GAAN,MAAM;QACb,IAAA,CAAA,UAAU,GAAV,UAAU;AAVzC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAA8B,EAAE,CAAC;AACrD,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACvB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;AACpB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,CAAC;IAQzC;AAEH,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI;YACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,CAACA,aAAW,CAAC,CAAC;QACxE;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,gEAAgE,CAAC,CAAC;QAC1G;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;AAEA,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAC1C,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AAC9C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,YAAA,MAAM,UAAU,GAA8B;AAC5C,gBAAA,OAAO,EAAE,CAAC;gBACV,EAAE,EAAE,kBAAkB,EAAE;AACxB,gBAAA,IAAI,EAAE,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;gBACpE,KAAK;AACL,gBAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK;aACN;YACD,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;AACrC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAACA,aAAW,CAAC,CAAC;AAClE,YAAA,OAAO,UAAU;QACnB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,oCAAoC,CAAC,CAAC;AAChF,YAAA,OAAO,IAAI;QACb;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;IACF;IAEA,MAAM,OAAO,CAAC,EAAU,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAC1C,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI;YACF,MAAM,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AAChF,YAAA,IAAI,CAAC,UAAU;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC;AAClG,YAAA,MAAM,KAAK,GAAG,SAAS,CACrB,UAAU,CAAC,KAAK,EAChB,CAAA,CAAA,EAAI,UAAU,CAAC,IAAI,CAAA,4DAAA,CAA8D,CAClF;AACD,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAA6B,CAAC;AACnF,YAAA,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;gBACrE,MAAM,IAAI,KAAK,CAAC,CAAA,2CAAA,EAA8C,UAAU,CAAC,KAAK,CAAA,gBAAA,CAAkB,CAAC;YACnG;AACA,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,qEAAqE,CAAC,CAAC;AAC7G,YAAA,OAAO,KAAK;QACd;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;IACF;AAEA,IAAA,MAAM,MAAM,CAAC,EAAU,EAAE,IAAY,EAAA;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;QAC5B,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC;AACjD,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AAChD,YAAA,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE;AAChH,gBAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAA,0CAAA,CAA4C,CAAC;YAC9F;AACA,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AAC7D,YAAA,IAAI,CAAC,UAAU;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC;AAClG,YAAA,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5D,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAACA,aAAW,CAAC,CACjG;AACD,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,sCAAsC,CAAC,CAAC;AAClF,YAAA,OAAO,KAAK;QACd;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;IACF;IAEA,MAAM,MAAM,CAAC,EAAU,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACzE,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,sCAAsC,CAAC,CAAC;AAClF,YAAA,OAAO,KAAK;QACd;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AAAE,YAAA,OAAO,GAAG;AACnD,QAAA,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA,EAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;IACpF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AAAE,YAAA,OAAO,GAAG;AACnD,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,GAAG;IACxC;IAEQ,mBAAmB,GAAA;AACzB,QAAA,OAAO,kHAAkH;IAC3H;IAEQ,cAAc,CAAC,KAAc,EAAE,QAAgB,EAAA;AACrD,QAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,yEAAyE;QAClF;QACA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzC;IAEQ,UAAU,CAAC,KAAc,EAAE,QAAgB,EAAA;AACjD,QAAA,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,QAAQ;IAC3E;AA7JW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,kBAO3B,+BAA+B,EAAA,EAAA,EAAA,KAAA,EAEnB,KAAK,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EACL,MAAM,6BAClB,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAXV,0BAA0B,EAAA,CAAA,CAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC;;0BAQI,MAAM;2BAAC,+BAA+B;;0BAEtC;;0BAAY,MAAM;2BAAC,KAAK;;0BACxB;;0BAAY,MAAM;2BAAC,MAAM;;0BACzB,MAAM;2BAAC,WAAW;;SAqJP,2BAA2B,GAAA;AACzC,IAAA,OAAO,wBAAwB,CAAC;QAC9B,6BAA6B;AAC7B,QAAA;AACE,YAAA,OAAO,EAAE,+BAA+B;AACxC,YAAA,WAAW,EAAE,6BAA6B;AAC3C,SAAA;QACD,0BAA0B;AAC1B,QAAA;AACE,YAAA,OAAO,EAAE,aAAa;AACtB,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,QAAQ,EAAE,8BAA8B;AACzC,SAAA;AACF,KAAA,CAAC;AACJ;AAEM,SAAU,iBAAiB,CAAC,KAAa,EAAE,KAAe,EAAA;IAC9D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;AAAE,QAAA,OAAO,KAAK;IACtD,KAAK,IAAI,MAAM,GAAG,CAAC,GAAI,MAAM,IAAI,CAAC,EAAE;AAClC,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,MAAM,EAAE;QACtC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;AAAE,YAAA,OAAO,SAAS;IAChE;AACF;AAEA,SAAS,SAAS,CAChB,KAAc,EACd,cAAc,GAAG,oGAAoG,EAAA;AAErH,IAAA,IAAI;QACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACxC,IAAI,UAAU,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,EAAE;AAC/C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAY;IAC1C;AAAE,IAAA,MAAM;AACN,QAAA,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC;IACjC;AACF;AAEA,SAAS,kBAAkB,GAAA;AACzB,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE;AAC5E,QAAA,OAAO,MAAM,CAAC,UAAU,EAAE;IAC5B;IACA,OAAO,CAAA,WAAA,EAAc,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE;AAC7E;AAEA,SAAS,YAAY,CAAC,KAAc,EAAA;AAClC,IAAA,OAAO,KAAK,YAAY,YAAY,KAClC,KAAK,CAAC,IAAI,KAAK,oBAAoB,IAAI,KAAK,CAAC,IAAI,KAAK,4BAA4B,CACnF;AACH;AAEA,SAASA,aAAW,CAAC,CAA4B,EAAE,CAA4B,EAAA;IAC7E,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3E;AAEA,SAAS,kBAAkB,CAAC,KAAc,EAAA;AACxC,IAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IACrD,MAAM,UAAU,GAAG,KAA2C;AAC9D,IAAA,OAAO,UAAU,CAAC,OAAO,KAAK,CAAC;AAC7B,QAAA,OAAO,UAAU,CAAC,EAAE,KAAK,QAAQ;AACjC,QAAA,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ;AACnC,QAAA,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ;AACpC,QAAA,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ;QACxC,OAAO,IAAI,UAAU;AACzB;;ACjWO,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,KAC3D,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AAE7B,MAAM,eAAe,GAAG,OAAO;AACpC,IAAA,KAAK,EAAE,OAAO,MAAM,KAAK,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC;AACjE,IAAA,MAAM,EAAE,OAAO,MAAM,KAAK,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC;AACpE,CAAA;AAEM,MAAM,iBAAiB,GAAG,CAC/B,IAAU,EACV,KAA+B,KAE/B,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI;IACpB,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK;AACjC,IAAA,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG;IACnB,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;AAEtB,MAAM,UAAU,GAAG,CAAC,CAAc,EAAE,CAAc,EAAE,OAAO,GAAG,GAAG,KAAI;AAC1E,IAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACX,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;AACZ,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,QACE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO;AACnC,QAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO;AACjC,QAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO;AAE3C;;MC/Ba,kBAAkB,GAAG,CAAC,KAAW,EAAE,KAAW,KAAqB;IAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC;IAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;IAE7C,IAAI,UAAU,GAAkC,IAAI;IACpD,IAAI,QAAQ,GAAgC,IAAI;IAChD,MAAM,UAAU,GAAkC,EAAE;AAEpD,IAAA,MAAM,UAAU,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC,IAAI;AAC/D,IAAA,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,CAAC,GAAG,IAAI,OAAO,IAAI,KAAK,CAAC,GAAG;IAE/D,IAAI,UAAU,EAAE;AACd,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI;QACpC,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM;AACpC,QAAA,MAAM,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;QAC5C,MAAM,CAAC,GAAG,QAAQ;AAClB,QAAA,UAAU,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;AAEpD,QAAA,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,MAAM;AAC5C,QAAA,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE;YACjB,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACnE;AAAO,aAAA,IAAI,CAAC,GAAG,OAAO,EAAE;YACtB,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;QACjE;IACF;IAEA,IAAI,UAAU,EAAE;AACd,QAAA,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,CAAC,GAAG;QACnC,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO;AACrC,QAAA,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG;QACzC,MAAM,CAAC,GAAG,QAAQ;AAClB,QAAA,QAAQ,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;AAElD,QAAA,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,OAAO;AAC3C,QAAA,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE;YAClB,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACpE;AAAO,aAAA,IAAI,CAAC,GAAG,MAAM,EAAE;YACrB,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QAChE;IACF;AAEA,IAAA,MAAM,QAAQ,GAAG,eAAe,EAAE;IAElC,OAAO;QACL,KAAK;QACL,KAAK;QACL,UAAU;QACV,QAAQ;AACR,QAAA,UAAU,EAAE;AACT,aAAA,GAAG,CAAC,CAAC,OAAO,MAAM;AACjB,YAAA,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AACxC,YAAA,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC;AACzC,YAAA,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AACxC,YAAA,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC;AAC1C,SAAA,CAAC;AACD,aAAA,MAAM,CACL,CAAC,OAAO,KACN,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,GAAG,GAAG;AACvC,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,GAAG,GAAG,CAC1C;KACJ;AACH;;AClEO,MAAM,cAAc,GAAG,CAAC,OAAgB,KAAU;AACvD,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE;IAC5C,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB;AACH;AAEO,MAAM,eAAe,GAAG,CAAC,OAAoB,KAAI;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE;AACzC,IAAA,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,CAAA,CAAA,EAAI,OAAO,CAAC,EAAE,CAAA,CAAE,GAAG,EAAE;AAC7C,IAAA,MAAM,SAAS,GAAG,OAAO,CAAC;AACxB,UAAE,CAAA,CAAA,EAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;UAC9C,EAAE;AACN,IAAA,OAAO,GAAG,GAAG,CAAA,EAAG,EAAE,CAAA,EAAG,SAAS,EAAE;AAClC;AAEA,MAAM,KAAK,GAAG,CAAC,KAAa,KAAK,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAEpE,MAAM,mBAAmB,GAAG,CAAC,KAAa,KAAI;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAC1C,IAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC3B,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO,CAAA,CAAA,EAAI,OAAO,CAAC,CAAC,CAAC,CAAA,EAAG,OAAO,CAAC,CAAC,CAAC,CAAA,EAAG,OAAO,CAAC,CAAC,CAAC,CAAA,EAAG,OAAO,CAAC,CAAC,CAAC,CAAA,EAAG,OAAO,CAAC,CAAC,CAAC,CAAA,EAAG,OAAO,CAAC,CAAC,CAAC,EAAE;QAC1F;AACA,QAAA,OAAO,OAAO;IAChB;IAEA,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC5B,+EAA+E,CAChF;IACD,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,KAAK;IACd;IAEA,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ;AAC5B,IAAA,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACzG,CAAC;AAEM,MAAM,iBAAiB,GAAG,CAAC,OAAoB,KAAoB;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAC9C,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;AAClC,QAAA,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC;QACvC,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B;AACH;AAEA,MAAM,SAAS,GAAG,CAAC,KAAa,KAAK,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;AAE3D,MAAM,qBAAqB,GAAG,CAAC,OAAoB,KAAwB;AAChF,IAAA,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAC9C,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa;AAC3C,IAAA,MAAM,WAAW,GAAG,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,GAAG,IAAI;AACjF,IAAA,MAAM,OAAO,GAAG;AACd,QAAA,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;AAChC,QAAA,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC;AACpC,QAAA,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;AACtC,QAAA,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;KACnC;AACD,IAAA,MAAM,MAAM,GAAG;AACb,QAAA,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;AAC/B,QAAA,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;AACnC,QAAA,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC;AACrC,QAAA,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;KAClC;AACD,IAAA,MAAM,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9D,IAAA,MAAM,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC;AACpE,IAAA,MAAM,aAAa,GAAG,WAAW,EAAE,OAAO,IAAI,EAAE;AAChD,IAAA,MAAM,MAAM,GACV,CAAC,CAAC,aAAa;AACf,SAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACjE,MAAM,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC;IAE/B,OAAO;QACL,IAAI;AACJ,QAAA,WAAW,EAAE;AACX,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;AAC9B,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG;AAC3B,YAAA,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;AAC7D,YAAA,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;AAChE,SAAA;AACD,QAAA,UAAU,EAAE;AACV,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AAC7B,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK;YAC9C,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM;AACjD,SAAA;QACD,OAAO;QACP,MAAM;AACN,QAAA,GAAG,EAAE;AACH,YAAA,GAAG,EAAE,MAAM;AACX,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,MAAM,EAAE,MAAM;AACf,SAAA;AACD,QAAA,UAAU,EAAE,MAAM,IAAI,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC,GAAG,IAAI;AAC1E,QAAA,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC;AAC/B,QAAA,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC;KACnC;AACH;AAEA,MAAM,sBAAsB,GAAG,CAAC,OAAoB,KAAI;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;IAC5C,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,OAAO,KAAK;IACd;IAEA,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAC9C,IAAA,IACE,KAAK,CAAC,OAAO,KAAK,MAAM;QACxB,KAAK,CAAC,UAAU,KAAK,QAAQ;AAC7B,QAAA,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,EAC7C;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE;AAC5C,IAAA,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACrC,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAChD,QAAA,IAAI,EAAE,KAAK,YAAY,WAAW,CAAC,EAAE;YACnC;QACF;QACA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,qBAAqB,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/E,YAAA,OAAO,KAAK;QACd;IACF;AAEA,IAAA,OAAO,IAAI;AACb,CAAC;AAEM,MAAM,oBAAoB,GAAG,CAClC,cAAkC,EAClC,KAAK,GAAG,GAAG,KACc;AACzB,IAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AACnC,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,MAAM,GAA0B,EAAE;AAExC,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,EAAE,IAAI,YAAY,WAAW,CAAC,EAAE;YAClC;QACF;QACA,IAAI,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACnD;QACF;AACA,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE;YACjC;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QACjC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;QACnF,MAAM,CAAC,IAAI,CAAC;AACV,YAAA,EAAE,EAAE,CAAA,EAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA,CAAE;YACzG,IAAI;YACJ,IAAI;AACJ,YAAA,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC;AAChC,SAAA,CAAC;AAEF,QAAA,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,EAAE;YAC1B;QACF;IACF;AAEA,IAAA,OAAO,MAAM;AACf;MAEa,gBAAgB,GAAG,CAC9B,KAA+B,EAC/B,cAAkC,KAChC;AACF,IAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AACnC,QAAA,OAAO,IAAI;IACb;IAEA,IAAI,cAAc,EAAE;AAClB,QAAA,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,aAAa;AACnD,QAAA,cAAc,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;AAC3C,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7D,QAAA,cAAc,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ;AAE7C,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,YAAA,IAAI,EAAE,OAAO,YAAY,WAAW,CAAC,EAAE;gBACrC;YACF;AACA,YAAA,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBACpC;YACF;AACA,YAAA,IAAI,OAAO,KAAK,QAAQ,CAAC,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC,eAAe,EAAE;gBACrE;YACF;AACA,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE;AAC5C,YAAA,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;gBACvC;YACF;AACA,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAuB;AAC1E;;ACjNM,SAAU,gBAAgB,CAC9B,WAAwC,EACxC,KAAa,EAAA;IAEb,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAC/C,IAAA,IAAI,CAAC,eAAe;QAAE,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;AAE/D,IAAA,OAAO;AACJ,SAAA,GAAG,CAAC,CAAC,UAAU,KAA6B;QAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC;AAC1D,QAAA,OAAO,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE;AACtD,IAAA,CAAC;SACA,MAAM,CAAC,CAAC,IAAI,KAA+B,IAAI,KAAK,IAAI;SACxD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC;SAC3E,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC;AACxC;AAEM,SAAU,UAAU,CAAC,KAAa,EAAE,eAAuB,EAAA;AAC/D,IAAA,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;IAClC,IAAI,SAAS,KAAK,eAAe;AAAE,QAAA,OAAO,MAAM;AAChD,IAAA,IAAI,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC;AAAE,QAAA,OAAO,KAAK,GAAG,SAAS,CAAC,MAAM;IAE1E,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC;IACzD,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,KAAK,GAAG,cAAc,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM;IAE9E,IAAI,UAAU,GAAG,CAAC;AAClB,IAAA,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,IAAA,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC;IAClB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,IAAI,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;QAC/F,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,eAAe,CAAC,UAAU,CAAC;YAAE;QACtD,IAAI,UAAU,GAAG,CAAC;YAAE,UAAU,GAAG,KAAK;QACtC,IAAI,SAAS,IAAI,CAAC;AAAE,YAAA,UAAU,IAAI,KAAK,GAAG,SAAS,GAAG,CAAC;QACvD,SAAS,GAAG,KAAK;QACjB,UAAU,IAAI,CAAC;IACjB;AACA,IAAA,IAAI,UAAU,KAAK,eAAe,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI;AACtD,IAAA,OAAO,KAAK,GAAG,UAAU,GAAG,EAAE,GAAG,UAAU,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM;AACrE;AAEA,SAAS,SAAS,CAAC,KAAa,EAAA;AAC9B,IAAA,OAAO;SACJ,SAAS,CAAC,MAAM;AAChB,SAAA,OAAO,CAAC,kBAAkB,EAAE,EAAE;AAC9B,SAAA,iBAAiB,EAAE;AACxB;AAEA,SAAS,WAAW,CAAC,CAA4B,EAAE,CAA4B,EAAA;IAC7E,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3E;;ACxDO,MAAM,QAAQ,GAAG,MACtB,OAAO,MAAM,KAAK,WAAW,IAAI,YAAY,IAAI;AAC/C,MAAE,MAAM,CAAC,UAAU;AACnB,MAAE,CAAA,EAAG,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAA;AAE7B,MAAM,WAAW,GAAG,CAAC,KAAa,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK;;MCmDjD,kBAAkB,CAAA;AA+E7B,IAAA,WAAA,CAAiC,UAAkB,EAAA;QA9E1C,IAAA,CAAA,IAAI,GAAG,IAAI;QACX,IAAA,CAAA,WAAW,GAAG,WAAW;QACzB,IAAA,CAAA,eAAe,GAAG,iBAAiB;AACnC,QAAA,IAAA,CAAA,WAAW,GAAG,SAAS,CAA0B,aAAa,CAAC;AAC/D,QAAA,IAAA,CAAA,gBAAgB,GAAG,SAAS,CAAgC,kBAAkB,CAAC;AAC/E,QAAA,IAAA,CAAA,gBAAgB,GAAG,SAAS,CAA+B,kBAAkB,CAAC;QAE9E,IAAA,CAAA,cAAc,GAAG,SAAS;QAC1B,IAAA,CAAA,UAAU,GAAG,SAAS;QACtB,IAAA,CAAA,qBAAqB,GAAG,IAAI;QAC5B,IAAA,CAAA,eAAe,GAAG,KAAK;QAEvB,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC1E,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAC,CAAC,CAAC;AACjC,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAgB,IAAI,CAAC;AACjD,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAgB,IAAI,CAAC;AAClD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;AACxB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,CAAC;AAC7C,QAAA,IAAA,CAAA,sBAAsB,GAAG,MAAM,CAAC,KAAK,CAAC;QACtC,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MACtC,gBAAgB,CACd,IAAI,CAAC,iBAAiB,EAAE,WAAW,EAAE,IAAI,EAAE,EAC3C,IAAI,CAAC,eAAe,EAAE,CACvB,CACF;AAEQ,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;AACtB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAW,MAAM,CAAC;AACnC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAmB,UAAU,CAAC;AACvD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAU,EAAE,CAAC;AAC5B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAc,IAAI,CAAC;AACrC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,CAAC;AAC7C,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAA4B,IAAI,CAAC;AAC7D,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAyB,IAAI,CAAC;AACtD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAwB,EAAE,CAAC;AAC9C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAe,IAAI,CAAC;AAEzC,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,EAAE;YAC3C,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,OAAO,EAAE;YACX;AACA,YAAA,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAA,GAAA,EAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,GAAA,EAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE;AAClM,QAAA,CAAC,CAAC;AAGe,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;AACxB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAY,EAAE,CAAC;AAC/B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACzB,QAAA,IAAA,CAAA,mBAAmB,GAAG,CAAC,KAAiB,KAAI;YAC3D,IACE,CAAC,KAAK,CAAC,QAAQ;AACf,gBAAA,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC5B,gBAAA,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EACjC;gBACA;YACF;YAEA,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;YACvB,KAAK,CAAC,wBAAwB,EAAE;AAClC,QAAA,CAAC;QACO,IAAA,CAAA,eAAe,GAAkB,IAAI;QACrC,IAAA,CAAA,eAAe,GAAuB,IAAI;QAC1C,IAAA,CAAA,YAAY,GAAuB,IAAI;QACvC,IAAA,CAAA,UAAU,GAAyC,IAAI;AAEtD,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACjD,IAAA,CAAA,OAAO,GAAG,QAAQ,CACzB,MACE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAClD;QA4OD,IAAA,CAAA,UAAU,GAAG,CAAC,MAAc,EAAE,KAAY,KAAK,KAAK,CAAC,EAAE;QACvD,IAAA,CAAA,cAAc,GAAG,CAAC,MAAc,EAAE,KAA0B,KAAK,KAAK,CAAC,EAAE;QACzE,IAAA,CAAA,cAAc,GAAG,CACf,MAAc,EACd,SAAgD,KAC7C,CAAA,EAAG,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,EAAE,CAAA,CAAA,EAAI,SAAS,CAAC,EAAE,CAAA,CAAA,EAAI,SAAS,CAAC,EAAE,CAAA,CAAE;AA9OpE,QAAA,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC;QAE9C,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBAChE;YACF;AAEA,YAAA,MAAM,OAAO,GAA4B;AACvC,gBAAA,OAAO,EAAE,uBAAuB;AAChC,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,gBAAA,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE;AACzC,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,gBAAA,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;aACtC;AAED,YAAA,MAAM,CAAC,YAAY,CAAC,OAAO,CACzB,qBAAqB,EACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CACxB;AACH,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;QAEA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE;AACzD,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;QAEA,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,qBAAqB,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;AAEA,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAEC;AACjC,YAAA,IAAI,MAAM,CAAC,OAAO,KAAK,uBAAuB,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE;AACtE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAClC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;gBACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,MAAM,CAAC,OAAO,KAAK,CAAC,GAAG,KAAK,IAAI,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,CAChE;gBACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACzC;QACF;AAAE,QAAA,MAAM;;QAER;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,uBAAuB,EAAE;IAChC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;QAEA,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE;AAC5D,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC;QACF,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;IACpD;AAEA,IAAA,WAAW,CAAC,IAAc,EAAA;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;AACnB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB;QAEA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;AAC3D,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,uBAAuB,EAAE;IAChC;AAEA,IAAA,mBAAmB,CAAC,WAA6B,EAAA;AAC/C,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC;AACtC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,wBAAwB,CAAC,WAA6B,EAAA;AACpD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,WAAW;AACxF,QAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC;QACrC,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,EAAE;AAC5C,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC5B;IACF;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;QAC7C,IAAI,CAAC,uBAAuB,EAAE;IAChC;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;IACjC;AAEA,IAAA,MAAM,cAAc,GAAA;QAClB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE;QACvD,IAAI,UAAU,EAAE;YACd,IAAI,CAAC,mBAAmB,CAAC,CAAA,OAAA,EAAU,UAAU,CAAC,IAAI,CAAA,EAAA,CAAI,CAAC;QACzD;AAAO,aAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE;AAC1C,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAG,EAAE,IAAI,CAAC;QACjE;IACF;AAEA,IAAA,MAAM,wBAAwB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE;AACzE,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE;QACnC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,SAAS,EAAE;AAClD,QAAA,cAAc,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;AACpE,QAAA,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;QACnC,IAAI,CAAC,qBAAqB,EAAE;IAC9B;IAEA,yBAAyB,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE;YAAE;QACpC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;AAC9C,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC;AAEA,IAAA,qBAAqB,CAAC,KAAY,EAAA;QAChC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;AAClE,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,iBAAiB,EAAE,UAAU,EAAE;IACtC;AAEA,IAAA,mBAAmB,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;IACvC;IAEA,MAAM,iBAAiB,CAAC,UAAqC,EAAA;QAC3D,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;YAAE;AAC9D,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;AACpE,QAAA,IAAI,CAAC,QAAQ;YAAE;QACf,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;AAC9C,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,mBAAmB,CAAC,CAAA,UAAA,EAAa,UAAU,CAAC,IAAI,CAAA,EAAA,CAAI,CAAC;IAC5D;IAEA,WAAW,CAAC,UAAqC,EAAE,KAAa,EAAA;QAC9D,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE;YAAE;QACpC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QACrC,cAAc,CAAC,MAAK;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,aAAa,CAChE,gCAAgC,CACjC;YACD,KAAK,EAAE,KAAK,EAAE;YACd,KAAK,EAAE,MAAM,EAAE;AACjB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,iBAAiB,CAAC,KAAY,EAAA;QAC5B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;AAC9D,QAAA,IAAI,CAAC,iBAAiB,EAAE,UAAU,EAAE;IACtC;IAEA,MAAM,YAAY,CAAC,UAAqC,EAAA;AACtD,QAAA,IAAI,MAAM,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE;AAC3E,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;YAClC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;QAChD;IACF;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,iBAAiB,EAAE,UAAU,EAAE;QACpC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IAChD;IAEA,WAAW,CAAC,UAAqC,EAAE,KAAa,EAAA;QAC9D,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE;YAAE;QACpC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;AAC5C,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IAChD;AAEA,IAAA,MAAM,aAAa,CAAC,UAAqC,EAAE,KAAa,EAAA;QACtE,KAAK,EAAE,eAAe,EAAE;QACxB,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAAE;AAC1D,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IAChD;AAEA,IAAA,2BAA2B,CAAC,KAAiB,EAAA;QAC3C,IACE,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa;AACvD,YAAA,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE;AAC/B,YAAA,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAC5B;YACA,IAAI,CAAC,yBAAyB,EAAE;QAClC;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IACxB;IASA,cAAc,CAAC,KAAmB,EAAE,KAAY,EAAA;QAC9C,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,EAAE;QAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IACpC;AAEA,IAAA,WAAW,CAAC,KAAoC,EAAA;AAC9C,QAAA,OAAO,CAAA,EAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;IACxH;AAEA,IAAA,SAAS,CAAC,QAA4B,EAAA;AACpC,QAAA,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;IACjF;AAGA,IAAA,aAAa,CAAC,KAAoB,EAAA;QAChC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;QAEnC,IACE,IAAI,CAAC,iBAAiB;YACtB,CAAC,KAAK,CAAC,MAAM;AACb,aAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AAChC,YAAA,KAAK,CAAC,QAAQ;YACd,GAAG,KAAK,GAAG,EACX;YACA,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,yBAAyB,EAAE,GAAG,KAAK,IAAI,CAAC,wBAAwB,EAAE;YAC/F;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC;YACxC;QACF;AAEA,QAAA,IAAI,GAAG,KAAK,GAAG,EAAE;AACf,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B;AACjD,YAAA,IACE,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC;gBAC1C,MAAM,EAAE,iBAAiB,EACzB;gBACA;YACF;YACA,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,KAAK,GAAG,EAAE;YACnD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;YAC1C;QACF;AAEA,QAAA,IAAI,GAAG,KAAK,GAAG,EAAE;YACf,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YAC1B;QACF;AAEA,QAAA,IAAI,GAAG,KAAK,GAAG,EAAE;YACf,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YAC1B;QACF;AAEA,QAAA,IAAI,GAAG,KAAK,GAAG,EAAE;YACf,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;YACtC;QACF;AAEA,QAAA,IAAI,GAAG,KAAK,GAAG,EAAE;YACf,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;YACpC;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,qBAAqB,EAAE;YAC5B;QACF;AAEA,QAAA,IAAI,GAAG,KAAK,QAAQ,EAAE;YACpB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,uBAAuB,EAAE;YAC9B;QACF;AAEA,QAAA,IAAI,CAAC,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,QAAQ,KAAK,IAAI,CAAC,eAAe,EAAE,EAAE;YACvE,KAAK,CAAC,cAAc,EAAE;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CACrC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE,CAC/C;AACD,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;AAC3B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;QAChC;IACF;AAGA,IAAA,WAAW,CAAC,KAAoB,EAAA;AAC9B,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC;IACF;AAGA,IAAA,iBAAiB,CAAC,KAAmB,EAAA;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACtC;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,YAAA,MAAM,QAAQ,GAAG,eAAe,EAAE;AAClC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;gBAC1B,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE;AACrC,oBAAA,OAAO,KAAK;gBACd;AACA,gBAAA,MAAM,WAAW,GACf,KAAK,CAAC,WAAW,KAAK,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;AAClE,gBAAA,MAAM,GAAG,GACP,KAAK,CAAC,WAAW,KAAK,UAAU,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM;AACrE,gBAAA,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;YAC3D,CAAC,CAAC,CACH;YACD;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,EAAE;AAChC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAE9B,YAAA,IACE,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;AAChE,gBAAA,KAAK,EACL;AACA,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC3B;YACF;AAEA,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAClD;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAE3B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;AAC/D,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;gBACtB;YACF;QACF;QAEA,MAAM,MAAM,GAAG,gBAAgB,CAC7B,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,EACtC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,IAAI,IAAI,CAC1C;QACD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC;AACnC,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B;QACA,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,uBAAuB,EAAE;IAChC;IAGA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB;QACF;QACA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACtC;QACF;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,IAAI,IAAI;AAEzD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,EAAE;YAChC,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAAE;gBACrD;YACF;YACA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AACzC,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC3C,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B;QACF;QAEA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;IAClC;IAIA,oBAAoB,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;AACnE,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3E;QACA,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,uBAAuB,EAAE;IAChC;AAEQ,IAAA,eAAe,CAAC,KAAiB,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,EAAE;AACtE,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,IAAI,IAAI;AACzD,QAAA,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,CAAC;IAC7D;AAEQ,IAAA,mBAAmB,CAAC,OAAgB,EAAA;AAC1C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;AACzB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B;QACA,IAAI,CAAC,uBAAuB,EAAE;IAChC;IAEQ,uBAAuB,CAAC,KAAoB,EAAE,GAAW,EAAA;AAC/D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE;QAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AACxD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B;AACjD,QAAA,MAAM,aAAa,GAAG,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,+BAA+B,CAAC,IAAI,KAAK;AAE3F,QAAA,IAAI,GAAG,KAAK,QAAQ,EAAE;YACpB,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBAAE,IAAI,CAAC,YAAY,EAAE;iBAC9C,IAAI,IAAI,CAAC,oBAAoB,EAAE;gBAAE,IAAI,CAAC,YAAY,EAAE;;gBACpD,IAAI,CAAC,yBAAyB,EAAE;YACrC;QACF;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE;YAAE;QACpC,MAAM,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzF,IAAI,aAAa,IAAI,GAAG,KAAK,OAAO,IAAI,iBAAiB,EAAE;YACzD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,KAAK,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;YACzC;QACF;AACA,QAAA,IAAI,aAAa;YAAE;AACnB,QAAA,IAAI,GAAG,KAAK,WAAW,EAAE;YACvB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/G,IAAI,CAAC,8BAA8B,EAAE;YACrC;QACF;AACA,QAAA,IAAI,GAAG,KAAK,SAAS,EAAE;YACrB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7E,IAAI,CAAC,8BAA8B,EAAE;YACrC;QACF;AACA,QAAA,IAAI,GAAG,KAAK,OAAO,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;YAC7D,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,KAAK,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACnC;QACF;AACA,QAAA,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACxB;QACF;AACA,QAAA,IAAI,GAAG,KAAK,QAAQ,IAAI,MAAM,EAAE;YAC9B,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC1B;IACF;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAC3F;IACH;IAEQ,8BAA8B,GAAA;QACpC,cAAc,CAAC,MAAK;AAClB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,aAAa,CAC9D,2BAA2B,IAAI,CAAC,qBAAqB,EAAE,CAAA,EAAA,CAAI,CAC5D;YACD,GAAG,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC3C,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,mBAAmB,CAAC,OAAe,EAAE,OAAO,GAAG,KAAK,EAAA;QAC1D,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAClD,QAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC;AACxC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;AACjC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,MAAK;AAChC,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC;QACxC,CAAC,EAAE,IAAI,CAAC;IACV;AAEQ,IAAA,oBAAoB,CAAC,KAAiB,EAAA;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,IAAI,IAAI;QACzD,MAAM,MAAM,GAAG,gBAAgB,CAC7B,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,EACtC,OAAO,CACR;QACD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,uBAAuB,EAAE;AAC9B,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,eAAe,EAAE;AAC5D,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,uBAAuB,CAC/C,IAAI,CAAC,eAAe,EACpB,MAAM,CACP;AACD,YAAA,IACE,YAAY;gBACZ,YAAY,KAAK,QAAQ,CAAC,IAAI;AAC9B,gBAAA,YAAY,KAAK,QAAQ,CAAC,eAAe,EACzC;gBACA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;AACjE,gBAAA,IAAI,CAAC,eAAe,GAAG,YAAY;gBACnC,IAAI,CAAC,qBAAqB,EAAE;gBAC5B,IAAI,CAAC,uBAAuB,EAAE;AAC9B,gBAAA,OAAO,IAAI;YACb;QACF;QAEA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM;AAC7B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CACtB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CACpD;QACD,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,uBAAuB,EAAE;AAC9B,QAAA,OAAO,IAAI;IACb;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IACE,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,CAAC,IAAI,CAAC,eAAe;YACrB,CAAC,IAAI,CAAC,YAAY;AAClB,YAAA,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,YAAY;YAC1C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;YAChD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,EAChD;AACA,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B;QACF;QAEA,IAAI,CAAC,eAAe,CAAC,GAAG,CACtB,kBAAkB,CAChB,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,EACpC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAClC,CACF;IACH;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAChE,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,eAAe,EAAE;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CACjB,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,IAAI,IAAI;AAC3D,aAAA,MAAM,CACL,CAAC,KAAK,KACJ,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACnB,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,MAAM;AACjC,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK;AAEpC,aAAA,GAAG,CAAC,CAAC,KAAK,MAAM;AACf,YAAA,GAAG,KAAK;AACR,YAAA,IAAI,EAAE;gBACJ,GAAG,KAAK,CAAC,IAAI;AACb,gBAAA,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;AACpD,gBAAA,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC;AAChD,aAAA;SACF,CAAC,CAAC,CACN;IACH;AAEQ,IAAA,QAAQ,CAAC,KAAY,EAAA;QAC3B,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;AAC5C,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;IAChC;AAEQ,IAAA,eAAe,CAAC,KAAgC,EAAA;AACtD,QAAA,MAAM,QAAQ,GAAG,eAAe,EAAE;AAClC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC3C,QAAA,MAAM,WAAW,GACf,WAAW,KAAK,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;AAC5D,QAAA,MAAM,GAAG,GAAG,WAAW,KAAK,UAAU,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM;QAEzE,OAAO;AACL,YAAA,EAAE,EAAE,SAAS;YACb,WAAW;AACX,YAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;SACrD;IACH;AAEQ,IAAA,SAAS,CAAC,QAAgB,EAAA;QAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjC,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,mBAAmB,EAAE;gBAC9D,OAAO,KAAK,CAAC,QAAQ;YACvB;QACF;AACA,QAAA,OAAO,QAAQ;IACjB;IAEQ,gBAAgB,CAAC,CAAS,EAAE,CAAS,EAAA;QAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjC,YAAA,IACE,KAAK,CAAC,WAAW,KAAK,UAAU;AAChC,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,iBAAiB,EACjD;gBACA,OAAO,KAAK,CAAC,EAAE;YACjB;AACA,YAAA,IACE,KAAK,CAAC,WAAW,KAAK,YAAY;AAClC,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,iBAAiB,EACjD;gBACA,OAAO,KAAK,CAAC,EAAE;YACjB;QACF;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACnB;QACF;QACA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AAChC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D;IAEQ,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACnB;QACF;QACA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AAChC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D;AAEQ,IAAA,aAAa,CAAC,MAAe,EAAA;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACxC;AAEQ,IAAA,WAAW,CAAC,MAAe,EAAA;AACjC,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC9C;IAEQ,uBAAuB,CAC7B,QAAqB,EACrB,QAAqB,EAAA;;AAGrB,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAW;QACrC,IAAI,OAAO,GAAmB,QAAQ;QACtC,OAAO,OAAO,EAAE;AACd,YAAA,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;AACvB,YAAA,OAAO,GAAG,OAAO,CAAC,aAAa;QACjC;;QAGA,OAAO,GAAG,QAAQ;QAClB,OAAO,OAAO,EAAE;AACd,YAAA,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AAC3B,gBAAA,OAAO,OAAsB;YAC/B;AACA,YAAA,OAAO,GAAG,OAAO,CAAC,aAAa;QACjC;AAEA,QAAA,OAAO,IAAI;IACb;AAh1BW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,kBA+ET,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AA/EpB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,u5BCxD/B,uygBA+YA,EAAA,MAAA,EAAA,CAAA,6sWAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDvVa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAR9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,eAAA,EAGM,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uygBAAA,EAAA,MAAA,EAAA,CAAA,6sWAAA,CAAA,EAAA;;0BAiFlC,MAAM;2BAAC,WAAW;yCAvEtB,cAAc,EAAA,CAAA;sBAAtB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,qBAAqB,EAAA,CAAA;sBAA7B;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBAqUD,aAAa,EAAA,CAAA;sBADZ,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;gBAoG1C,WAAW,EAAA,CAAA;sBADV,YAAY;uBAAC,cAAc,EAAE,CAAC,QAAQ,CAAC;gBASxC,iBAAiB,EAAA,CAAA;sBADhB,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;gBAwE9C,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,kBAAkB;gBAUhC,WAAW,EAAA,CAAA;sBADV,YAAY;uBAAC,cAAc,EAAE,CAAC,QAAQ,CAAC;gBA2BxC,oBAAoB,EAAA,CAAA;sBAFnB,YAAY;uBAAC,eAAe;;sBAC5B,YAAY;uBAAC,eAAe;;;AE5lB/B;;AAEG;;;;"}
1
+ {"version":3,"file":"inspector-ng.mjs","sources":["../../../projects/inspector-ng/src/lib/constants.ts","../../../projects/inspector-ng/src/lib/checkpoints.ts","../../../projects/inspector-ng/src/lib/geometry.ts","../../../projects/inspector-ng/src/lib/distances.ts","../../../projects/inspector-ng/src/lib/dom.ts","../../../projects/inspector-ng/src/lib/checkpoint-search.ts","../../../projects/inspector-ng/src/lib/utils.ts","../../../projects/inspector-ng/src/lib/inspector.component.ts","../../../projects/inspector-ng/src/lib/inspector.component.html","../../../projects/inspector-ng/src/inspector-ng.ts"],"sourcesContent":["export const inspector_STORAGE_KEY = \"inspector-state\";\nexport const inspector_STATE_VERSION = 2;\nexport const GUIDE_SNAP_DISTANCE = 10;\nexport const GUIDE_HITBOX_SIZE = 14;\n","import {\n EnvironmentProviders,\n Inject,\n Injectable,\n InjectionToken,\n Optional,\n PLATFORM_ID,\n makeEnvironmentProviders,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router } from '@angular/router';\nimport {\n Action,\n ActionReducer,\n META_REDUCERS,\n Store,\n} from '@ngrx/store';\nimport { firstValueFrom, take } from 'rxjs';\n\nexport interface InspectorCheckpointRecord {\n version: 1;\n id: string;\n name: string;\n route: string;\n createdAt: string;\n state: unknown;\n}\n\ninterface RestoreCheckpointAction extends Action {\n type: typeof RESTORE_CHECKPOINT;\n state: unknown;\n}\n\nconst RESTORE_CHECKPOINT = '[Inspector Checkpoints] Restore';\nconst DATABASE_NAME = 'inspector-ng';\nconst DATABASE_VERSION = 1;\nconst STORE_NAME = 'checkpoints';\n\nexport const INSPECTOR_CHECKPOINT_REPOSITORY =\n new InjectionToken<InspectorCheckpointRepository>('INSPECTOR_CHECKPOINT_REPOSITORY');\n\nexport function inspectorCheckpointMetaReducer<T>(\n reducer: ActionReducer<T>,\n): ActionReducer<T> {\n return (state, action) => {\n if (action.type === RESTORE_CHECKPOINT) {\n return (action as RestoreCheckpointAction).state as T;\n }\n return reducer(state, action);\n };\n}\n\nexport abstract class InspectorCheckpointRepository {\n abstract list(): Promise<InspectorCheckpointRecord[]>;\n abstract put(checkpoint: InspectorCheckpointRecord): Promise<void>;\n abstract delete(id: string): Promise<void>;\n}\n\n@Injectable()\nexport class IndexedDbCheckpointRepository extends InspectorCheckpointRepository {\n private databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(@Inject(PLATFORM_ID) private readonly platformId: object) {\n super();\n }\n\n async list(): Promise<InspectorCheckpointRecord[]> {\n const database = await this.database();\n const values = await this.request<unknown[]>(\n database.transaction(STORE_NAME, 'readonly').objectStore(STORE_NAME).getAll(),\n );\n return values\n .filter(isCheckpointRecord)\n .sort(newestFirst);\n }\n\n async put(checkpoint: InspectorCheckpointRecord): Promise<void> {\n const database = await this.database();\n await this.transactionComplete(database, 'readwrite', (store) => store.put(checkpoint));\n }\n\n async delete(id: string): Promise<void> {\n const database = await this.database();\n await this.transactionComplete(database, 'readwrite', (store) => store.delete(id));\n }\n\n private database(): Promise<IDBDatabase> {\n if (!isPlatformBrowser(this.platformId) || typeof indexedDB === 'undefined') {\n return Promise.reject(new Error('Checkpoints are only available in a browser with IndexedDB.'));\n }\n if (this.databasePromise) return this.databasePromise;\n\n this.databasePromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n request.onupgradeneeded = () => {\n const database = request.result;\n if (database.objectStoreNames.contains(STORE_NAME)) return;\n const store = database.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('createdAt', 'createdAt');\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB could not be opened.'));\n request.onblocked = () => reject(new Error('IndexedDB is blocked by another open tab.'));\n });\n return this.databasePromise;\n }\n\n private request<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed.'));\n });\n }\n\n private transactionComplete(\n database: IDBDatabase,\n mode: IDBTransactionMode,\n operation: (store: IDBObjectStore) => IDBRequest,\n ): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, mode);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed.'));\n transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction was aborted.'));\n operation(transaction.objectStore(STORE_NAME));\n });\n }\n}\n\n@Injectable()\nexport class InspectorCheckpointService {\n readonly checkpoints = signal<InspectorCheckpointRecord[]>([]);\n readonly loading = signal(false);\n readonly busy = signal(false);\n readonly error = signal<string | null>(null);\n\n constructor(\n @Inject(INSPECTOR_CHECKPOINT_REPOSITORY)\n private readonly repository: InspectorCheckpointRepository,\n @Optional() @Inject(Store) private readonly store: Store | null,\n @Optional() @Inject(Router) private readonly router: Router | null,\n @Inject(PLATFORM_ID) private readonly platformId: object,\n ) {}\n\n async load(): Promise<void> {\n this.error.set(null);\n this.loading.set(true);\n try {\n this.checkpoints.set((await this.repository.list()).sort(newestFirst));\n } catch (error) {\n this.error.set(this.messageFor(error, 'Saved checkpoints could not be loaded. Try reloading the page.'));\n } finally {\n this.loading.set(false);\n }\n }\n\n async save(): Promise<InspectorCheckpointRecord | null> {\n this.error.set(null);\n if (!this.store) {\n this.error.set(this.missingStoreMessage());\n return null;\n }\n\n this.busy.set(true);\n try {\n const currentState = await firstValueFrom(this.store.pipe(take(1)));\n const state = cloneJson(currentState);\n const persisted = await this.repository.list();\n const route = this.currentRoute();\n const pathname = this.currentPathname();\n const checkpoint: InspectorCheckpointRecord = {\n version: 1,\n id: createCheckpointId(),\n name: nextAutomaticName(pathname, persisted.map(({ name }) => name)),\n route,\n createdAt: new Date().toISOString(),\n state,\n };\n await this.repository.put(checkpoint);\n this.checkpoints.set([checkpoint, ...persisted].sort(newestFirst));\n return checkpoint;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be saved.'));\n return null;\n } finally {\n this.busy.set(false);\n }\n }\n\n async restore(id: string): Promise<boolean> {\n this.error.set(null);\n if (!this.store) {\n this.error.set(this.missingStoreMessage());\n return false;\n }\n this.busy.set(true);\n try {\n const checkpoint = (await this.repository.list()).find((item) => item.id === id);\n if (!checkpoint) throw new Error('Checkpoint not found. It may have been deleted in another tab.');\n const state = cloneJson(\n checkpoint.state,\n `“${checkpoint.name}” could not be decoded. Delete it and save a new checkpoint.`,\n );\n this.store.dispatch({ type: RESTORE_CHECKPOINT, state } as RestoreCheckpointAction);\n if (this.router && !await this.router.navigateByUrl(checkpoint.route)) {\n throw new Error(`The state was restored, but navigation to “${checkpoint.route}” was cancelled.`);\n }\n return true;\n } catch (error) {\n this.error.set(this.messageFor(error, 'The checkpoint could not be restored. Delete it and save a new one.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n async rename(id: string, name: string): Promise<boolean> {\n this.error.set(null);\n const nextName = name.trim();\n if (!nextName) {\n this.error.set('Please enter a checkpoint name.');\n return false;\n }\n\n this.busy.set(true);\n try {\n const checkpoints = await this.repository.list();\n if (checkpoints.some((item) => item.id !== id && item.name.toLocaleLowerCase() === nextName.toLocaleLowerCase())) {\n throw new Error(`A checkpoint named “${nextName}” already exists. Choose a different name.`);\n }\n const checkpoint = checkpoints.find((item) => item.id === id);\n if (!checkpoint) throw new Error('Checkpoint not found. It may have been deleted in another tab.');\n await this.repository.put({ ...checkpoint, name: nextName });\n this.checkpoints.set(\n checkpoints.map((item) => item.id === id ? { ...item, name: nextName } : item).sort(newestFirst),\n );\n return true;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be renamed.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n async delete(id: string): Promise<boolean> {\n this.error.set(null);\n this.busy.set(true);\n try {\n await this.repository.delete(id);\n this.checkpoints.set(this.checkpoints().filter((item) => item.id !== id));\n return true;\n } catch (error) {\n this.error.set(this.storageMessage(error, 'The checkpoint could not be deleted.'));\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n clearError(): void {\n this.error.set(null);\n }\n\n private currentRoute(): string {\n if (!isPlatformBrowser(this.platformId)) return '/';\n return `${this.currentPathname()}${window.location.search}${window.location.hash}`;\n }\n\n private currentPathname(): string {\n if (!isPlatformBrowser(this.platformId)) return '/';\n return window.location.pathname || '/';\n }\n\n private missingStoreMessage(): string {\n return 'The NgRx root store is unavailable. Check that provideInspectorCheckpoints() is registered after provideStore().';\n }\n\n private storageMessage(error: unknown, fallback: string): string {\n if (isQuotaError(error)) {\n return 'Browser storage is full. Delete old checkpoints, then try saving again.';\n }\n return this.messageFor(error, fallback);\n }\n\n private messageFor(error: unknown, fallback: string): string {\n return error instanceof Error && error.message ? error.message : fallback;\n }\n}\n\nexport function provideInspectorCheckpoints(): EnvironmentProviders {\n return makeEnvironmentProviders([\n IndexedDbCheckpointRepository,\n {\n provide: INSPECTOR_CHECKPOINT_REPOSITORY,\n useExisting: IndexedDbCheckpointRepository,\n },\n InspectorCheckpointService,\n {\n provide: META_REDUCERS,\n multi: true,\n useValue: inspectorCheckpointMetaReducer,\n },\n ]);\n}\n\nexport function nextAutomaticName(route: string, names: string[]): string {\n const used = new Set(names.map((name) => name.toLocaleLowerCase()));\n if (!used.has(route.toLocaleLowerCase())) return route;\n for (let suffix = 2; ; suffix += 1) {\n const candidate = `${route} ${suffix}`;\n if (!used.has(candidate.toLocaleLowerCase())) return candidate;\n }\n}\n\nfunction cloneJson(\n value: unknown,\n failureMessage = 'The NgRx root state is not JSON-serializable. Remove circular or unsupported values and try again.',\n): unknown {\n try {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) throw new Error();\n return JSON.parse(serialized) as unknown;\n } catch {\n throw new Error(failureMessage);\n }\n}\n\nfunction createCheckpointId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `checkpoint-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction isQuotaError(error: unknown): boolean {\n return error instanceof DOMException && (\n error.name === 'QuotaExceededError' || error.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n );\n}\n\nfunction newestFirst(a: InspectorCheckpointRecord, b: InspectorCheckpointRecord): number {\n return b.createdAt.localeCompare(a.createdAt) || b.id.localeCompare(a.id);\n}\n\nfunction isCheckpointRecord(value: unknown): value is InspectorCheckpointRecord {\n if (!value || typeof value !== 'object') return false;\n const checkpoint = value as Partial<InspectorCheckpointRecord>;\n return checkpoint.version === 1 &&\n typeof checkpoint.id === 'string' &&\n typeof checkpoint.name === 'string' &&\n typeof checkpoint.route === 'string' &&\n typeof checkpoint.createdAt === 'string' &&\n 'state' in checkpoint;\n}\n","import { Rect } from './types';\n\nexport const clamp = (value: number, min: number, max: number) =>\n Math.max(min, Math.min(max, value));\n\nexport const getViewportSize = () => ({\n width: typeof window === 'undefined' ? 1 : window.innerWidth || 1,\n height: typeof window === 'undefined' ? 1 : window.innerHeight || 1,\n});\n\nexport const rectContainsPoint = (\n rect: Rect,\n point: { x: number; y: number },\n) =>\n point.x >= rect.left &&\n point.x <= rect.left + rect.width &&\n point.y >= rect.top &&\n point.y <= rect.top + rect.height;\n\nexport const rectsEqual = (a: Rect | null, b: Rect | null, epsilon = 0.5) => {\n if (a === b) {\n return true;\n }\n\n if (!a || !b) {\n return false;\n }\n\n return (\n Math.abs(a.left - b.left) < epsilon &&\n Math.abs(a.top - b.top) < epsilon &&\n Math.abs(a.width - b.width) < epsilon &&\n Math.abs(a.height - b.height) < epsilon\n );\n};\n","import { clamp, getViewportSize } from './geometry';\nimport { DistanceOverlay, Rect } from './types';\n\nexport const getDistanceOverlay = (rectA: Rect, rectB: Rect): DistanceOverlay => {\n const rightA = rectA.left + rectA.width;\n const bottomA = rectA.top + rectA.height;\n const rightB = rectB.left + rectB.width;\n const bottomB = rectB.top + rectB.height;\n const centerAX = rectA.left + rectA.width / 2;\n const centerAY = rectA.top + rectA.height / 2;\n\n let horizontal: DistanceOverlay['horizontal'] = null;\n let vertical: DistanceOverlay['vertical'] = null;\n const connectors: DistanceOverlay['connectors'] = [];\n\n const separatedX = rightA <= rectB.left || rightB <= rectA.left;\n const separatedY = bottomA <= rectB.top || bottomB <= rectA.top;\n\n if (separatedX) {\n const aIsLeft = rightA <= rectB.left;\n const x1 = aIsLeft ? rightA : rightB;\n const x2 = aIsLeft ? rectB.left : rectA.left;\n const y = centerAY;\n horizontal = { x1, x2, y, value: Math.abs(x2 - x1) };\n\n const edgeBX = aIsLeft ? rectB.left : rightB;\n if (y < rectB.top) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: rectB.top });\n } else if (y > bottomB) {\n connectors.push({ x1: edgeBX, y1: y, x2: edgeBX, y2: bottomB });\n }\n }\n\n if (separatedY) {\n const aIsTop = bottomA <= rectB.top;\n const y1 = aIsTop ? bottomA : bottomB;\n const y2 = aIsTop ? rectB.top : rectA.top;\n const x = centerAX;\n vertical = { y1, y2, x, value: Math.abs(y2 - y1) };\n\n const edgeBY = aIsTop ? rectB.top : bottomB;\n if (x < rectB.left) {\n connectors.push({ x1: x, y1: edgeBY, x2: rectB.left, y2: edgeBY });\n } else if (x > rightB) {\n connectors.push({ x1: x, y1: edgeBY, x2: rightB, y2: edgeBY });\n }\n }\n\n const viewport = getViewportSize();\n\n return {\n rectA,\n rectB,\n horizontal,\n vertical,\n connectors: connectors\n .map((segment) => ({\n x1: clamp(segment.x1, 0, viewport.width),\n y1: clamp(segment.y1, 0, viewport.height),\n x2: clamp(segment.x2, 0, viewport.width),\n y2: clamp(segment.y2, 0, viewport.height),\n }))\n .filter(\n (segment) =>\n Math.abs(segment.x1 - segment.x2) > 0.5 ||\n Math.abs(segment.y1 - segment.y2) > 0.5,\n ),\n };\n};\n","import { InspectMeasurement, Rect, TextBlockAnnotation, TextInspection } from './types';\n\nexport const getRectFromDom = (element: Element): Rect => {\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n};\n\nexport const getElementLabel = (element: HTMLElement) => {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const className = element.className\n ? `.${element.className.toString().split(' ')[0]}`\n : '';\n return `${tag}${id}${className}`;\n};\n\nconst toHex = (value: number) => value.toString(16).padStart(2, '0');\n\nconst normalizeColorToHex = (color: string) => {\n const trimmed = color.trim().toLowerCase();\n if (trimmed.startsWith('#')) {\n if (trimmed.length === 4) {\n return `#${trimmed[1]}${trimmed[1]}${trimmed[2]}${trimmed[2]}${trimmed[3]}${trimmed[3]}`;\n }\n return trimmed;\n }\n\n const rgbMatch = trimmed.match(\n /^rgba?\\(\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)(?:\\s*,\\s*[0-9.]+\\s*)?\\)$/,\n );\n if (!rgbMatch) {\n return color;\n }\n\n const [, r, g, b] = rgbMatch;\n return `#${toHex(Math.round(Number(r)))}${toHex(Math.round(Number(g)))}${toHex(Math.round(Number(b)))}`;\n};\n\nexport const getTextInspection = (element: HTMLElement): TextInspection => {\n const style = window.getComputedStyle(element);\n return {\n fontFamily: style.fontFamily,\n fontSize: style.fontSize,\n fontWeight: style.fontWeight,\n lineHeight: style.lineHeight,\n letterSpacing: style.letterSpacing,\n color: normalizeColorToHex(style.color),\n textAlign: style.textAlign,\n };\n};\n\nconst parseEdge = (value: string) => Number.parseFloat(value) || 0;\n\nexport const getInspectMeasurement = (element: HTMLElement): InspectMeasurement => {\n const rect = getRectFromDom(element);\n const style = window.getComputedStyle(element);\n const parentElement = element.parentElement;\n const parentStyle = parentElement ? window.getComputedStyle(parentElement) : null;\n const padding = {\n top: parseEdge(style.paddingTop),\n right: parseEdge(style.paddingRight),\n bottom: parseEdge(style.paddingBottom),\n left: parseEdge(style.paddingLeft),\n };\n const margin = {\n top: parseEdge(style.marginTop),\n right: parseEdge(style.marginRight),\n bottom: parseEdge(style.marginBottom),\n left: parseEdge(style.marginLeft),\n };\n const rowGap = parentStyle ? parseEdge(parentStyle.rowGap) : 0;\n const columnGap = parentStyle ? parseEdge(parentStyle.columnGap) : 0;\n const parentDisplay = parentStyle?.display ?? '';\n const hasGap =\n !!parentElement &&\n (parentDisplay.includes('flex') || parentDisplay.includes('grid')) &&\n (rowGap > 0 || columnGap > 0);\n\n return {\n rect,\n paddingRect: {\n left: rect.left + padding.left,\n top: rect.top + padding.top,\n width: Math.max(0, rect.width - padding.left - padding.right),\n height: Math.max(0, rect.height - padding.top - padding.bottom),\n },\n marginRect: {\n left: rect.left - margin.left,\n top: rect.top - margin.top,\n width: rect.width + margin.left + margin.right,\n height: rect.height + margin.top + margin.bottom,\n },\n padding,\n margin,\n gap: {\n row: rowGap,\n column: columnGap,\n active: hasGap,\n },\n parentRect: hasGap && parentElement ? getRectFromDom(parentElement) : null,\n label: getElementLabel(element),\n styles: getTextInspection(element),\n };\n};\n\nconst isVisibleTextCandidate = (element: HTMLElement) => {\n const text = element.innerText?.trim() ?? '';\n if (!text) {\n return false;\n }\n\n const style = window.getComputedStyle(element);\n if (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n Number.parseFloat(style.opacity || '1') === 0\n ) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n if (rect.width < 8 || rect.height < 8) {\n return false;\n }\n\n for (const child of Array.from(element.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if ((child.innerText?.trim() ?? '') && child.getBoundingClientRect().height > 0) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const getVisibleTextBlocks = (\n overlayElement: HTMLElement | null,\n limit = 160,\n): TextBlockAnnotation[] => {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const nodes = Array.from(document.querySelectorAll('body *'));\n const blocks: TextBlockAnnotation[] = [];\n\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement && overlayElement.contains(node)) {\n continue;\n }\n if (!isVisibleTextCandidate(node)) {\n continue;\n }\n\n const rect = getRectFromDom(node);\n const text = (node.innerText || node.textContent || '').replace(/\\s+/g, ' ').trim();\n blocks.push({\n id: `${node.tagName.toLowerCase()}-${Math.round(rect.left)}-${Math.round(rect.top)}-${text.slice(0, 24)}`,\n rect,\n text,\n styles: getTextInspection(node),\n });\n\n if (blocks.length >= limit) {\n break;\n }\n }\n\n return blocks;\n};\n\nexport const getTargetElement = (\n point: { x: number; y: number },\n overlayElement: HTMLElement | null,\n) => {\n if (typeof document === 'undefined') {\n return null;\n }\n\n if (overlayElement) {\n const previous = overlayElement.style.pointerEvents;\n overlayElement.style.pointerEvents = 'none';\n const elements = document.elementsFromPoint(point.x, point.y);\n overlayElement.style.pointerEvents = previous;\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (overlayElement.contains(element)) {\n continue;\n }\n if (element === document.body || element === document.documentElement) {\n continue;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 2 || rect.height <= 2) {\n continue;\n }\n return element;\n }\n\n return null;\n }\n\n return document.elementFromPoint(point.x, point.y) as HTMLElement | null;\n};\n","import { InspectorCheckpointRecord } from './checkpoints';\n\ninterface RankedCheckpoint {\n checkpoint: InspectorCheckpointRecord;\n score: number;\n}\n\nexport function fuzzyCheckpoints(\n checkpoints: InspectorCheckpointRecord[],\n query: string,\n): InspectorCheckpointRecord[] {\n const normalizedQuery = normalize(query.trim());\n if (!normalizedQuery) return [...checkpoints].sort(newestFirst);\n\n return checkpoints\n .map((checkpoint): RankedCheckpoint | null => {\n const score = fuzzyScore(checkpoint.name, normalizedQuery);\n return score === null ? null : { checkpoint, score };\n })\n .filter((item): item is RankedCheckpoint => item !== null)\n .sort((a, b) => b.score - a.score || newestFirst(a.checkpoint, b.checkpoint))\n .map(({ checkpoint }) => checkpoint);\n}\n\nexport function fuzzyScore(value: string, normalizedQuery: string): number | null {\n const candidate = normalize(value);\n if (candidate === normalizedQuery) return 10_000;\n if (candidate.startsWith(normalizedQuery)) return 8_000 - candidate.length;\n\n const substringIndex = candidate.indexOf(normalizedQuery);\n if (substringIndex >= 0) return 6_000 - substringIndex * 10 - candidate.length;\n\n let queryIndex = 0;\n let firstIndex = -1;\n let lastIndex = -1;\n let gapPenalty = 0;\n for (let index = 0; index < candidate.length && queryIndex < normalizedQuery.length; index += 1) {\n if (candidate[index] !== normalizedQuery[queryIndex]) continue;\n if (firstIndex < 0) firstIndex = index;\n if (lastIndex >= 0) gapPenalty += index - lastIndex - 1;\n lastIndex = index;\n queryIndex += 1;\n }\n if (queryIndex !== normalizedQuery.length) return null;\n return 4_000 - firstIndex * 10 - gapPenalty * 20 - candidate.length;\n}\n\nfunction normalize(value: string): string {\n return value\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLocaleLowerCase();\n}\n\nfunction newestFirst(a: InspectorCheckpointRecord, b: InspectorCheckpointRecord): number {\n return b.createdAt.localeCompare(a.createdAt) || b.id.localeCompare(a.id);\n}\n","export const createId = () =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n\nexport const formatValue = (value: number) => Math.round(value);\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n PLATFORM_ID,\n computed,\n effect,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n GUIDE_HITBOX_SIZE,\n GUIDE_SNAP_DISTANCE,\n inspector_STATE_VERSION,\n inspector_STORAGE_KEY,\n} from './constants';\nimport {\n getInspectMeasurement,\n getRectFromDom,\n getTargetElement,\n getVisibleTextBlocks,\n} from './dom';\nimport { getDistanceOverlay } from './distances';\nimport { clamp, getViewportSize, rectsEqual } from './geometry';\nimport {\n DistanceOverlay,\n Guide,\n GuideOrientation,\n InspectMeasurement,\n inspectorLegacyPersistedState,\n inspectorPersistedState,\n Rect,\n TextBlockAnnotation,\n ToolMode,\n} from './types';\nimport {\n InspectorCheckpointRecord,\n InspectorCheckpointService,\n} from './checkpoints';\nimport { fuzzyCheckpoints } from './checkpoint-search';\nimport { createId, formatValue } from './utils';\n\n@Component({\n selector: 'inspector-overlay',\n standalone: true,\n imports: [],\n templateUrl: './inspector.component.html',\n styleUrl: './inspector.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class inspectorComponent implements OnDestroy {\n readonly Math = Math;\n readonly formatValue = formatValue;\n readonly guideHitboxSize = GUIDE_HITBOX_SIZE;\n readonly overlayRoot = viewChild<ElementRef<HTMLElement>>('overlayRoot');\n readonly checkpointDialog = viewChild<ElementRef<HTMLDialogElement>>('checkpointDialog');\n readonly checkpointSearch = viewChild<ElementRef<HTMLInputElement>>('checkpointSearch');\n\n @Input() highlightColor = '#4f8cff';\n @Input() guideColor = '#ff7a00';\n @Input() hoverHighlightEnabled = true;\n @Input() persistOnReload = false;\n\n readonly checkpointService = inject(InspectorCheckpointService, { optional: true });\n readonly commandBarOpen = signal(false);\n readonly checkpointQuery = signal('');\n readonly activeCheckpointIndex = signal(0);\n readonly editingCheckpointId = signal<string | null>(null);\n readonly deletingCheckpointId = signal<string | null>(null);\n readonly renameDraft = signal('');\n readonly checkpointToast = signal<string | null>(null);\n readonly checkpointToastIsError = signal(false);\n readonly filteredCheckpoints = computed(() =>\n fuzzyCheckpoints(\n this.checkpointService?.checkpoints() ?? [],\n this.checkpointQuery(),\n ),\n );\n\n readonly enabled = signal(true);\n readonly toolMode = signal<ToolMode>('none');\n readonly guideOrientation = signal<GuideOrientation>('vertical');\n readonly guides = signal<Guide[]>([]);\n readonly hoverRect = signal<Rect | null>(null);\n readonly selectedGuideId = signal<string | null>(null);\n readonly selectedMeasurement = signal<InspectMeasurement | null>(null);\n readonly showTypography = signal(false);\n readonly altPressed = signal(false);\n readonly distanceOverlay = signal<DistanceOverlay | null>(null);\n readonly textBlocks = signal<TextBlockAnnotation[]>([]);\n readonly guidePreview = signal<Guide | null>(null);\n\n readonly selectedMetaLine = computed(() => {\n const selected = this.selectedMeasurement();\n if (!selected) {\n return '';\n }\n return `${selected.label} · ${formatValue(selected.rect.width)} x ${formatValue(selected.rect.height)} · ${selected.styles.fontSize} / ${selected.styles.lineHeight} / ${selected.styles.color}`;\n });\n\n private readonly isBrowser: boolean;\n private readonly hydrated = signal(false);\n private readonly history = signal<Guide[][]>([]);\n private readonly historyIndex = signal(-1);\n private readonly handleCapturedClick = (event: MouseEvent) => {\n if (\n !event.shiftKey ||\n !this.canInspectClick(event) ||\n !this.selectElementAtPoint(event)\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n };\n private draggingGuideId: string | null = null;\n private selectedElement: HTMLElement | null = null;\n private hoverElement: HTMLElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly canUndo = computed(() => this.historyIndex() > 0);\n readonly canRedo = computed(\n () =>\n this.historyIndex() >= 0 &&\n this.historyIndex() < this.history().length - 1,\n );\n\n constructor(@Inject(PLATFORM_ID) platformId: object) {\n this.isBrowser = isPlatformBrowser(platformId);\n\n effect(() => {\n if (!this.persistOnReload || !this.isBrowser || !this.hydrated()) {\n return;\n }\n\n const payload: inspectorPersistedState = {\n version: inspector_STATE_VERSION,\n enabled: this.enabled(),\n toolMode: this.toolMode(),\n guideOrientation: this.guideOrientation(),\n guides: this.guides(),\n showTypography: this.showTypography(),\n };\n\n window.localStorage.setItem(\n inspector_STORAGE_KEY,\n JSON.stringify(payload),\n );\n });\n }\n\n ngOnInit() {\n if (!this.isBrowser) {\n this.hydrated.set(true);\n return;\n }\n\n window.addEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n\n if (!this.persistOnReload) {\n this.hydrated.set(true);\n return;\n }\n\n const stored = window.localStorage.getItem(inspector_STORAGE_KEY);\n if (!stored) {\n this.hydrated.set(true);\n return;\n }\n\n try {\n const parsed = JSON.parse(stored) as\n | inspectorPersistedState\n | inspectorLegacyPersistedState;\n if (parsed.version === inspector_STATE_VERSION || parsed.version === 1) {\n this.enabled.set(true);\n this.toolMode.set(parsed.toolMode);\n this.guideOrientation.set(parsed.guideOrientation);\n this.guides.set(parsed.guides ?? []);\n this.showTypography.set(\n parsed.version === 1 ? false : (parsed.showTypography ?? false),\n );\n this.recordHistory(parsed.guides ?? []);\n }\n } catch {\n // ignore malformed state\n }\n\n this.hydrated.set(true);\n this.refreshTypographyBlocks();\n }\n\n ngOnDestroy() {\n if (!this.isBrowser) {\n return;\n }\n\n window.removeEventListener('click', this.handleCapturedClick, {\n capture: true,\n });\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n setToolMode(mode: ToolMode) {\n if (!this.enabled()) {\n this.enabled.set(true);\n }\n\n this.toolMode.set(this.toolMode() === mode ? 'none' : mode);\n this.hoverRect.set(null);\n this.guidePreview.set(null);\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n }\n\n setGuideOrientation(orientation: GuideOrientation) {\n this.guideOrientation.set(orientation);\n this.guidePreview.set(null);\n }\n\n activateGuideOrientation(orientation: GuideOrientation) {\n const isActive = this.toolMode() === 'guides' && this.guideOrientation() === orientation;\n this.setGuideOrientation(orientation);\n if (isActive || this.toolMode() !== 'guides') {\n this.setToolMode('guides');\n }\n }\n\n toggleTypography() {\n this.showTypography.update((value) => !value);\n this.refreshTypographyBlocks();\n }\n\n disableInspector() {\n this.setInspectorEnabled(false);\n }\n\n async saveCheckpoint() {\n const checkpoint = await this.checkpointService?.save();\n if (checkpoint) {\n this.showCheckpointToast(`Saved “${checkpoint.name}”.`);\n } else if (this.checkpointService?.error()) {\n this.showCheckpointToast(this.checkpointService.error()!, true);\n }\n }\n\n async openCheckpointCommandBar() {\n if (!this.checkpointService || !this.isBrowser || this.commandBarOpen()) return;\n this.commandBarOpen.set(true);\n this.checkpointQuery.set('');\n this.activeCheckpointIndex.set(0);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n this.checkpointService.clearError();\n this.checkpointDialog()?.nativeElement.showModal();\n queueMicrotask(() => this.checkpointSearch()?.nativeElement.focus());\n await this.checkpointService.load();\n this.clampActiveCheckpoint();\n }\n\n closeCheckpointCommandBar() {\n if (this.checkpointService?.busy()) return;\n this.checkpointDialog()?.nativeElement.close();\n this.commandBarOpen.set(false);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n }\n\n updateCheckpointQuery(event: Event) {\n this.checkpointQuery.set((event.target as HTMLInputElement).value);\n this.activeCheckpointIndex.set(0);\n this.editingCheckpointId.set(null);\n this.deletingCheckpointId.set(null);\n this.checkpointService?.clearError();\n }\n\n setActiveCheckpoint(index: number) {\n this.activeCheckpointIndex.set(index);\n }\n\n async restoreCheckpoint(checkpoint: InspectorCheckpointRecord) {\n if (!this.checkpointService || this.checkpointService.busy()) return;\n const restored = await this.checkpointService.restore(checkpoint.id);\n if (!restored) return;\n this.checkpointDialog()?.nativeElement.close();\n this.commandBarOpen.set(false);\n this.showCheckpointToast(`Restored “${checkpoint.name}”.`);\n }\n\n beginRename(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (this.checkpointService?.busy()) return;\n this.editingCheckpointId.set(checkpoint.id);\n this.deletingCheckpointId.set(null);\n this.renameDraft.set(checkpoint.name);\n queueMicrotask(() => {\n const input = this.checkpointDialog()?.nativeElement.querySelector<HTMLInputElement>(\n '.inspector-command-row__rename',\n );\n input?.focus();\n input?.select();\n });\n }\n\n updateRenameDraft(event: Event) {\n this.renameDraft.set((event.target as HTMLInputElement).value);\n this.checkpointService?.clearError();\n }\n\n async finishRename(checkpoint: InspectorCheckpointRecord) {\n if (await this.checkpointService?.rename(checkpoint.id, this.renameDraft())) {\n this.editingCheckpointId.set(null);\n this.checkpointSearch()?.nativeElement.focus();\n }\n }\n\n cancelRename() {\n this.editingCheckpointId.set(null);\n this.checkpointService?.clearError();\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n beginDelete(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (this.checkpointService?.busy()) return;\n this.deletingCheckpointId.set(checkpoint.id);\n this.editingCheckpointId.set(null);\n }\n\n cancelDelete(event?: Event) {\n event?.stopPropagation();\n this.deletingCheckpointId.set(null);\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n async confirmDelete(checkpoint: InspectorCheckpointRecord, event?: Event) {\n event?.stopPropagation();\n if (!await this.checkpointService?.delete(checkpoint.id)) return;\n this.deletingCheckpointId.set(null);\n this.clampActiveCheckpoint();\n this.checkpointSearch()?.nativeElement.focus();\n }\n\n handleCheckpointDialogClick(event: MouseEvent) {\n if (\n event.target === this.checkpointDialog()?.nativeElement &&\n !this.checkpointService?.busy() &&\n !this.deletingCheckpointId()\n ) {\n this.closeCheckpointCommandBar();\n }\n }\n\n clearGuides() {\n this.guides.set([]);\n this.selectedGuideId.set(null);\n this.recordHistory([]);\n }\n\n trackGuide = (_index: number, guide: Guide) => guide.id;\n trackTextBlock = (_index: number, block: TextBlockAnnotation) => block.id;\n trackConnector = (\n _index: number,\n connector: DistanceOverlay['connectors'][number],\n ) => `${connector.x1}:${connector.y1}:${connector.x2}:${connector.y2}`;\n\n startGuideDrag(event: PointerEvent, guide: Guide) {\n event.preventDefault();\n event.stopPropagation();\n this.draggingGuideId = guide.id;\n this.selectedGuideId.set(guide.id);\n }\n\n formatEdges(edges: InspectMeasurement['padding']) {\n return `${formatValue(edges.top)} ${formatValue(edges.right)} ${formatValue(edges.bottom)} ${formatValue(edges.left)}`;\n }\n\n formatGap(selected: InspectMeasurement) {\n return `${formatValue(selected.gap.row)} / ${formatValue(selected.gap.column)}`;\n }\n\n @HostListener('window:keydown', ['$event'])\n handleKeydown(event: KeyboardEvent) {\n const key = event.key.toLowerCase();\n\n if (\n this.checkpointService &&\n !event.repeat &&\n (event.metaKey || event.ctrlKey) &&\n event.shiftKey &&\n key === 'p'\n ) {\n event.preventDefault();\n this.commandBarOpen() ? this.closeCheckpointCommandBar() : void this.openCheckpointCommandBar();\n return;\n }\n\n if (this.commandBarOpen()) {\n this.handleCommandBarKeydown(event, key);\n return;\n }\n\n if (this.blocksInspectorShortcut(event.target) || event.repeat) {\n return;\n }\n\n const hasShortcutModifier = event.metaKey || event.ctrlKey || event.altKey || event.shiftKey;\n\n if (key === 'm' && !hasShortcutModifier) {\n event.preventDefault();\n this.setInspectorEnabled(!this.enabled());\n return;\n }\n\n if (!this.enabled()) {\n return;\n }\n\n if ((event.metaKey || event.ctrlKey) && key === 'z') {\n event.preventDefault();\n event.shiftKey ? this.redo() : this.undo();\n return;\n }\n\n if (event.key === 'Alt') {\n this.altPressed.set(true);\n this.updateDistanceOverlay();\n return;\n }\n\n if (hasShortcutModifier) {\n return;\n }\n\n if (key === 's') {\n event.preventDefault();\n this.setToolMode('select');\n return;\n }\n\n if (key === 'g') {\n event.preventDefault();\n this.setToolMode('guides');\n return;\n }\n\n if (key === 'h') {\n event.preventDefault();\n this.setGuideOrientation('horizontal');\n return;\n }\n\n if (key === 'v') {\n event.preventDefault();\n this.setGuideOrientation('vertical');\n return;\n }\n\n if (key === 'escape') {\n event.preventDefault();\n this.selectedMeasurement.set(null);\n this.selectedGuideId.set(null);\n this.hoverRect.set(null);\n this.distanceOverlay.set(null);\n this.selectedElement = null;\n this.hoverElement = null;\n this.guidePreview.set(null);\n this.clearGuides();\n this.refreshTypographyBlocks();\n return;\n }\n\n if ((key === 'backspace' || key === 'delete') && this.selectedGuideId()) {\n event.preventDefault();\n const nextGuides = this.guides().filter(\n (guide) => guide.id !== this.selectedGuideId(),\n );\n this.guides.set(nextGuides);\n this.selectedGuideId.set(null);\n this.recordHistory(nextGuides);\n }\n }\n\n @HostListener('window:keyup', ['$event'])\n handleKeyup(event: KeyboardEvent) {\n if (event.key === 'Alt') {\n this.altPressed.set(false);\n this.distanceOverlay.set(null);\n }\n }\n\n @HostListener('window:pointermove', ['$event'])\n handlePointerMove(event: PointerEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n if (this.draggingGuideId) {\n this.guidePreview.set(null);\n const viewport = getViewportSize();\n this.guides.set(\n this.guides().map((guide) => {\n if (guide.id !== this.draggingGuideId) {\n return guide;\n }\n const rawPosition =\n guide.orientation === 'vertical' ? event.clientX : event.clientY;\n const max =\n guide.orientation === 'vertical' ? viewport.width : viewport.height;\n return { ...guide, position: clamp(rawPosition, 0, max) };\n }),\n );\n return;\n }\n\n if (this.toolMode() === 'guides') {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n\n if (\n this.overlayRoot()?.nativeElement.contains(event.target as Node) ??\n false\n ) {\n this.guidePreview.set(null);\n return;\n }\n\n this.guidePreview.set(this.getGuidePreview(event));\n return;\n }\n\n this.guidePreview.set(null);\n\n if (this.toolMode() !== 'select' || !this.hoverHighlightEnabled) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n if (!this.altPressed()) {\n return;\n }\n }\n\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n this.overlayRoot()?.nativeElement ?? null,\n );\n if (!target) {\n this.hoverRect.set(null);\n this.hoverElement = null;\n this.distanceOverlay.set(null);\n return;\n }\n\n const rect = getRectFromDom(target);\n this.hoverElement = target;\n if (!rectsEqual(rect, this.hoverRect())) {\n this.hoverRect.set(rect);\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n @HostListener('window:pointerup')\n handlePointerUp() {\n if (!this.draggingGuideId) {\n return;\n }\n this.recordHistory(this.guides());\n this.draggingGuideId = null;\n }\n\n @HostListener('window:click', ['$event'])\n handleClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser) {\n return;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n\n if (this.toolMode() === 'guides') {\n if (overlay && overlay.contains(event.target as Node)) {\n return;\n }\n const guide = this.getGuidePreview(event);\n this.addGuide({ ...guide, id: createId() });\n this.guidePreview.set(guide);\n return;\n }\n\n if (!this.canInspectClick(event)) {\n return;\n }\n\n this.selectElementAtPoint(event);\n }\n\n @HostListener('window:resize')\n @HostListener('window:scroll')\n handleViewportChange() {\n if (this.selectedElement && document.contains(this.selectedElement)) {\n this.selectedMeasurement.set(getInspectMeasurement(this.selectedElement));\n }\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n }\n\n private canInspectClick(event: MouseEvent) {\n if (!this.enabled() || !this.isBrowser || this.toolMode() !== 'select') {\n return false;\n }\n\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n return !(overlay && overlay.contains(event.target as Node));\n }\n\n private setInspectorEnabled(enabled: boolean) {\n this.enabled.set(enabled);\n if (!enabled) {\n this.toolMode.set('none');\n this.hoverRect.set(null);\n this.selectedGuideId.set(null);\n this.selectedMeasurement.set(null);\n this.distanceOverlay.set(null);\n this.textBlocks.set([]);\n this.guidePreview.set(null);\n this.altPressed.set(false);\n this.selectedElement = null;\n this.hoverElement = null;\n this.draggingGuideId = null;\n }\n this.refreshTypographyBlocks();\n }\n\n private handleCommandBarKeydown(event: KeyboardEvent, key: string) {\n const checkpoints = this.filteredCheckpoints();\n const active = checkpoints[this.activeCheckpointIndex()];\n const target = event.target as HTMLElement | null;\n const isRenameInput = target?.classList?.contains('inspector-command-row__rename') ?? false;\n\n if (key === 'escape') {\n event.preventDefault();\n if (this.editingCheckpointId()) this.cancelRename();\n else if (this.deletingCheckpointId()) this.cancelDelete();\n else this.closeCheckpointCommandBar();\n return;\n }\n if (this.checkpointService?.busy()) return;\n const editingCheckpoint = checkpoints.find(({ id }) => id === this.editingCheckpointId());\n if (isRenameInput && key === 'enter' && editingCheckpoint) {\n event.preventDefault();\n void this.finishRename(editingCheckpoint);\n return;\n }\n if (isRenameInput) return;\n if (key === 'arrowdown') {\n event.preventDefault();\n this.activeCheckpointIndex.set(Math.min(this.activeCheckpointIndex() + 1, Math.max(0, checkpoints.length - 1)));\n this.scrollActiveCheckpointIntoView();\n return;\n }\n if (key === 'arrowup') {\n event.preventDefault();\n this.activeCheckpointIndex.set(Math.max(0, this.activeCheckpointIndex() - 1));\n this.scrollActiveCheckpointIntoView();\n return;\n }\n if (key === 'enter' && active && !this.deletingCheckpointId()) {\n event.preventDefault();\n void this.restoreCheckpoint(active);\n return;\n }\n if (key === 'f2' && active) {\n event.preventDefault();\n this.beginRename(active);\n return;\n }\n if (key === 'delete' && active) {\n event.preventDefault();\n this.beginDelete(active);\n }\n }\n\n private blocksInspectorShortcut(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return target.closest(\n 'form, input, textarea, select, option, [contenteditable]:not([contenteditable=\"false\"]), [role=\"textbox\"]',\n ) !== null;\n }\n\n private clampActiveCheckpoint() {\n this.activeCheckpointIndex.set(\n Math.min(this.activeCheckpointIndex(), Math.max(0, this.filteredCheckpoints().length - 1)),\n );\n }\n\n private scrollActiveCheckpointIntoView() {\n queueMicrotask(() => {\n const row = this.checkpointDialog()?.nativeElement.querySelector<HTMLElement>(\n `[data-checkpoint-index=\"${this.activeCheckpointIndex()}\"]`,\n );\n row?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n private showCheckpointToast(message: string, isError = false) {\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.checkpointToastIsError.set(isError);\n this.checkpointToast.set(message);\n this.toastTimer = setTimeout(() => {\n this.checkpointToast.set(null);\n this.checkpointToastIsError.set(false);\n }, 2500);\n }\n\n private selectElementAtPoint(event: MouseEvent) {\n const overlay = this.overlayRoot()?.nativeElement ?? null;\n const target = getTargetElement(\n { x: event.clientX, y: event.clientY },\n overlay,\n );\n if (!target) {\n this.selectedMeasurement.set(null);\n this.selectedElement = null;\n this.distanceOverlay.set(null);\n this.refreshTypographyBlocks();\n return false;\n }\n\n // Ctrl+click: select the minimum common parent of current selection and clicked element\n if ((event.ctrlKey || event.metaKey) && this.selectedElement) {\n const commonParent = this.findMinimumCommonParent(\n this.selectedElement,\n target,\n );\n if (\n commonParent &&\n commonParent !== document.body &&\n commonParent !== document.documentElement\n ) {\n this.selectedMeasurement.set(getInspectMeasurement(commonParent));\n this.selectedElement = commonParent;\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n }\n\n this.selectedMeasurement.set(getInspectMeasurement(target));\n this.selectedElement = target;\n this.selectedGuideId.set(\n this.findGuideAtPoint(event.clientX, event.clientY),\n );\n this.updateDistanceOverlay();\n this.refreshTypographyBlocks();\n return true;\n }\n\n private updateDistanceOverlay() {\n if (\n !this.altPressed() ||\n !this.selectedElement ||\n !this.hoverElement ||\n this.selectedElement === this.hoverElement ||\n this.selectedElement.contains(this.hoverElement) ||\n this.hoverElement.contains(this.selectedElement)\n ) {\n this.distanceOverlay.set(null);\n return;\n }\n\n this.distanceOverlay.set(\n getDistanceOverlay(\n getRectFromDom(this.selectedElement),\n getRectFromDom(this.hoverElement),\n ),\n );\n }\n\n private refreshTypographyBlocks() {\n if (!this.isBrowser || !this.enabled() || !this.showTypography()) {\n this.textBlocks.set([]);\n return;\n }\n\n const viewport = getViewportSize();\n this.textBlocks.set(\n getVisibleTextBlocks(this.overlayRoot()?.nativeElement ?? null)\n .filter(\n (block) =>\n block.rect.top >= 0 &&\n block.rect.top <= viewport.height &&\n block.rect.left >= 0 &&\n block.rect.left <= viewport.width,\n )\n .map((block) => ({\n ...block,\n rect: {\n ...block.rect,\n left: clamp(block.rect.left, 0, viewport.width - 12),\n top: clamp(block.rect.top, 14, viewport.height),\n },\n })),\n );\n }\n\n private addGuide(guide: Guide) {\n const nextGuides = [...this.guides(), guide];\n this.guides.set(nextGuides);\n this.selectedGuideId.set(guide.id);\n this.recordHistory(nextGuides);\n }\n\n private getGuidePreview(event: PointerEvent | MouseEvent): Guide {\n const viewport = getViewportSize();\n const orientation = this.guideOrientation();\n const rawPosition =\n orientation === 'vertical' ? event.clientX : event.clientY;\n const max = orientation === 'vertical' ? viewport.width : viewport.height;\n\n return {\n id: 'preview',\n orientation,\n position: this.snapGuide(clamp(rawPosition, 0, max)),\n };\n }\n\n private snapGuide(position: number) {\n for (const guide of this.guides()) {\n if (Math.abs(guide.position - position) <= GUIDE_SNAP_DISTANCE) {\n return guide.position;\n }\n }\n return position;\n }\n\n private findGuideAtPoint(x: number, y: number) {\n for (const guide of this.guides()) {\n if (\n guide.orientation === 'vertical' &&\n Math.abs(guide.position - x) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n if (\n guide.orientation === 'horizontal' &&\n Math.abs(guide.position - y) <= GUIDE_HITBOX_SIZE\n ) {\n return guide.id;\n }\n }\n return null;\n }\n\n private undo() {\n if (!this.canUndo()) {\n return;\n }\n const nextIndex = this.historyIndex() - 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private redo() {\n if (!this.canRedo()) {\n return;\n }\n const nextIndex = this.historyIndex() + 1;\n this.historyIndex.set(nextIndex);\n this.guides.set(this.cloneGuides(this.history()[nextIndex]));\n }\n\n private recordHistory(guides: Guide[]) {\n const base = this.history().slice(0, this.historyIndex() + 1);\n base.push(this.cloneGuides(guides));\n this.history.set(base);\n this.historyIndex.set(base.length - 1);\n }\n\n private cloneGuides(guides: Guide[]) {\n return guides.map((guide) => ({ ...guide }));\n }\n\n private findMinimumCommonParent(\n elementA: HTMLElement,\n elementB: HTMLElement,\n ): HTMLElement | null {\n // Build ancestor chain for element A\n const ancestorsA = new Set<Element>();\n let current: Element | null = elementA;\n while (current) {\n ancestorsA.add(current);\n current = current.parentElement;\n }\n\n // Walk up from elementB until we find a common ancestor\n current = elementB;\n while (current) {\n if (ancestorsA.has(current)) {\n return current as HTMLElement;\n }\n current = current.parentElement;\n }\n\n return null;\n }\n}\n","<div class=\"inspector-root\" #overlayRoot>\n @if (enabled()) {\n <div class=\"inspector-toolbar\">\n <div class=\"inspector-toolbar__rail\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'select'\"\n (click)=\"setToolMode('select')\"\n aria-label=\"Select mode\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 2l8 8-3 .7L6.7 13 6 10 3 2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Select</span>\n </button>\n\n @if (checkpointService) {\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n (click)=\"saveCheckpoint()\"\n [disabled]=\"checkpointService.busy()\"\n aria-label=\"Save checkpoint\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2.5 2h9.6l1.4 1.4V14h-11zm2 1.5v3h6v-3zm.5 6V12h6V9.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Save checkpoint</span>\n </button>\n }\n\n <div class=\"inspector-toolbar__secondary\">\n <div class=\"inspector-toolbar__reveal\">\n <div class=\"inspector-toolbar__reveal-inner\">\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"showTypography()\"\n (click)=\"toggleTypography()\"\n aria-label=\"Typography overlay\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M3 4V2h10v2h-4v10H7V4z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Typography</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'vertical'\"\n (click)=\"activateGuideOrientation('vertical')\"\n aria-label=\"Vertical guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 2h1.5v12h-1.5z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Vertical guides</span>\n </button>\n\n <button\n type=\"button\"\n class=\"inspector-icon-button\"\n [class.is-active]=\"toolMode() === 'guides' && guideOrientation() === 'horizontal'\"\n (click)=\"activateGuideOrientation('horizontal')\"\n aria-label=\"Horizontal guides\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M2 7.25h12v1.5H2z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Horizontal guides</span>\n </button>\n </div>\n </div>\n </div>\n\n <span class=\"inspector-toolbar__divider\" aria-hidden=\"true\"></span>\n <button\n type=\"button\"\n class=\"inspector-icon-button inspector-icon-button--power\"\n (click)=\"disableInspector()\"\n aria-label=\"Disable inspector; press M to enable\"\n >\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d=\"M7.25 1.5h1.5v6h-1.5zM4.1 3.35l.96 1.15A4.25 4.25 0 1 0 10.94 4.5l.96-1.15A5.75 5.75 0 1 1 4.1 3.35z\" />\n </svg>\n <span class=\"inspector-tooltip\" role=\"tooltip\">Disable</span>\n </button>\n </div>\n </div>\n }\n\n @if (checkpointService) {\n <dialog\n #checkpointDialog\n class=\"inspector-command-dialog\"\n aria-labelledby=\"inspector-command-title\"\n (cancel)=\"$event.preventDefault(); closeCheckpointCommandBar()\"\n (click)=\"handleCheckpointDialogClick($event)\"\n >\n <section class=\"inspector-command\" (click)=\"$event.stopPropagation()\">\n <header class=\"inspector-command__search\">\n <label id=\"inspector-command-title\" class=\"inspector-visually-hidden\" for=\"inspector-checkpoint-search\">\n Search checkpoints\n </label>\n <input\n #checkpointSearch\n id=\"inspector-checkpoint-search\"\n type=\"search\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n placeholder=\"Find a checkpoint…\"\n [value]=\"checkpointQuery()\"\n [attr.aria-controls]=\"'inspector-checkpoint-results'\"\n [attr.aria-activedescendant]=\"filteredCheckpoints().length ? 'inspector-checkpoint-' + filteredCheckpoints()[activeCheckpointIndex()].id : null\"\n (input)=\"updateCheckpointQuery($event)\"\n />\n </header>\n\n @if (checkpointService.error(); as error) {\n <p class=\"inspector-command__message inspector-command__message--error\" role=\"alert\">{{ error }}</p>\n }\n\n <div id=\"inspector-checkpoint-results\" class=\"inspector-command__results\" role=\"listbox\" aria-label=\"Saved checkpoints\">\n @if (checkpointService.loading()) {\n <p class=\"inspector-command__message\" role=\"status\">Loading checkpoints…</p>\n } @else if (!checkpointService.checkpoints().length) {\n <p class=\"inspector-command__message\" role=\"status\">No checkpoints yet. Save one from the Inspector toolbar.</p>\n } @else if (!filteredCheckpoints().length) {\n <p class=\"inspector-command__message\" role=\"status\">No checkpoint matches “{{ checkpointQuery() }}”.</p>\n } @else {\n @for (checkpoint of filteredCheckpoints(); track checkpoint.id; let index = $index) {\n <div\n class=\"inspector-command-row\"\n role=\"option\"\n [id]=\"'inspector-checkpoint-' + checkpoint.id\"\n [attr.data-checkpoint-index]=\"index\"\n [attr.aria-selected]=\"activeCheckpointIndex() === index\"\n [class.is-active]=\"activeCheckpointIndex() === index\"\n [class.is-busy]=\"checkpointService.busy() && activeCheckpointIndex() === index\"\n (mouseenter)=\"setActiveCheckpoint(index)\"\n (click)=\"deletingCheckpointId() === checkpoint.id || editingCheckpointId() === checkpoint.id ? null : restoreCheckpoint(checkpoint)\"\n >\n @if (deletingCheckpointId() === checkpoint.id) {\n <span class=\"inspector-command-row__confirm\">Delete “{{ checkpoint.name }}”?</span>\n <span class=\"inspector-command-row__confirm-actions\">\n <button type=\"button\" class=\"is-danger\" (click)=\"confirmDelete(checkpoint, $event)\">Delete checkpoint</button>\n <button type=\"button\" (click)=\"cancelDelete($event)\">Keep checkpoint</button>\n </span>\n } @else if (editingCheckpointId() === checkpoint.id) {\n <input\n class=\"inspector-command-row__rename\"\n aria-label=\"Checkpoint name\"\n [value]=\"renameDraft()\"\n (input)=\"updateRenameDraft($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n } @else {\n <span class=\"inspector-command-row__name\">\n @if (checkpointService.busy() && activeCheckpointIndex() === index) {\n Restoring “{{ checkpoint.name }}”…\n } @else {\n {{ checkpoint.name }}\n }\n </span>\n <span class=\"inspector-command-row__actions\">\n <button type=\"button\" (click)=\"beginRename(checkpoint, $event)\" [attr.aria-label]=\"'Rename ' + checkpoint.name\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"m11.8 1.8 2.4 2.4-8.3 8.3-3.1.7.7-3.1zm-8 10.4 1.5-.3-1.2-1.2z\" /></svg>\n </button>\n <button type=\"button\" (click)=\"beginDelete(checkpoint, $event)\" [attr.aria-label]=\"'Delete ' + checkpoint.name\">\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M5.5 2h5l.5 1H14v1.25H2V3h3zm-2 3.25h9L12 14H4z\" /></svg>\n </button>\n </span>\n }\n </div>\n }\n }\n </div>\n </section>\n </dialog>\n }\n\n @if (checkpointToast(); as toast) {\n <p\n class=\"inspector-checkpoint-toast\"\n [class.inspector-checkpoint-toast--error]=\"checkpointToastIsError()\"\n [attr.role]=\"checkpointToastIsError() ? 'alert' : 'status'\"\n >{{ toast }}</p>\n }\n\n @if (enabled() && toolMode() === \"select\") {\n @if (hoverRect() && hoverHighlightEnabled) {\n <div\n class=\"inspector-box inspector-box--hover\"\n [style.left.px]=\"hoverRect()!.left\"\n [style.top.px]=\"hoverRect()!.top\"\n [style.width.px]=\"hoverRect()!.width\"\n [style.height.px]=\"hoverRect()!.height\"\n [style.--inspector-accent]=\"highlightColor\"\n ></div>\n }\n\n @if (selectedMeasurement(); as selected) {\n @if (selected.gap.active && selected.parentRect) {\n <div\n class=\"inspector-box inspector-box--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top\"\n [style.width.px]=\"selected.parentRect.width\"\n [style.height.px]=\"selected.parentRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--gap\"\n [style.left.px]=\"selected.parentRect.left\"\n [style.top.px]=\"selected.parentRect.top - 8\"\n >\n G {{ formatGap(selected) }}\n </div>\n }\n\n <div\n class=\"inspector-box inspector-box--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top\"\n [style.width.px]=\"selected.marginRect.width\"\n [style.height.px]=\"selected.marginRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--margin\"\n [style.left.px]=\"selected.marginRect.left\"\n [style.top.px]=\"selected.marginRect.top - 8\"\n >\n M {{ formatEdges(selected.margin) }}\n </div>\n\n <div\n class=\"inspector-box inspector-box--selected\"\n [style.left.px]=\"selected.rect.left\"\n [style.top.px]=\"selected.rect.top\"\n [style.width.px]=\"selected.rect.width\"\n [style.height.px]=\"selected.rect.height\"\n [style.--inspector-accent]=\"highlightColor\"\n >\n <div class=\"inspector-label\">{{ selectedMetaLine() }}</div>\n </div>\n\n <div\n class=\"inspector-box inspector-box--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"selected.paddingRect.top\"\n [style.width.px]=\"selected.paddingRect.width\"\n [style.height.px]=\"selected.paddingRect.height\"\n ></div>\n <div\n class=\"inspector-box-tag inspector-box-tag--padding\"\n [style.left.px]=\"selected.paddingRect.left\"\n [style.top.px]=\"\n selected.paddingRect.top + selected.paddingRect.height + 8\n \"\n >\n P {{ formatEdges(selected.padding) }}\n </div>\n }\n }\n\n @if (enabled() && showTypography()) {\n @for (block of textBlocks(); track block.id) {\n <div\n class=\"inspector-text-chip\"\n [style.left.px]=\"block.rect.left\"\n [style.top.px]=\"block.rect.top - 8\"\n >\n <span\n class=\"inspector-text-chip__swatch\"\n [style.background]=\"block.styles.color\"\n ></span>\n <span>{{ block.styles.fontSize }}</span>\n <span>{{ block.styles.lineHeight }}</span>\n <span>{{ block.styles.color }}</span>\n </div>\n }\n }\n\n @if (enabled() && altPressed() && distanceOverlay(); as distance) {\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectA.left\"\n [style.top.px]=\"distance.rectA.top\"\n [style.width.px]=\"distance.rectA.width\"\n [style.height.px]=\"distance.rectA.height\"\n ></div>\n <div\n class=\"inspector-box inspector-box--distance\"\n [style.left.px]=\"distance.rectB.left\"\n [style.top.px]=\"distance.rectB.top\"\n [style.width.px]=\"distance.rectB.width\"\n [style.height.px]=\"distance.rectB.height\"\n ></div>\n\n @for (\n connector of distance.connectors;\n track trackConnector($index, connector)\n ) {\n <div\n class=\"inspector-connector\"\n [class.inspector-connector--vertical]=\"connector.x1 === connector.x2\"\n [class.inspector-connector--horizontal]=\"connector.y1 === connector.y2\"\n [style.left.px]=\"Math.min(connector.x1, connector.x2)\"\n [style.top.px]=\"Math.min(connector.y1, connector.y2)\"\n [style.width.px]=\"Math.max(1, Math.abs(connector.x2 - connector.x1))\"\n [style.height.px]=\"Math.max(1, Math.abs(connector.y2 - connector.y1))\"\n ></div>\n }\n\n @if (distance.horizontal && distance.horizontal.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--horizontal\"\n [style.left.px]=\"\n Math.min(distance.horizontal.x1!, distance.horizontal.x2!)\n \"\n [style.top.px]=\"distance.horizontal.y!\"\n [style.width.px]=\"\n Math.abs(distance.horizontal.x2! - distance.horizontal.x1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag\"\n [style.left.px]=\"\n (distance.horizontal.x1! + distance.horizontal.x2!) / 2\n \"\n [style.top.px]=\"distance.horizontal.y! + 10\"\n >\n {{ formatValue(distance.horizontal.value) }}\n </div>\n }\n\n @if (distance.vertical && distance.vertical.value > 0) {\n <div\n class=\"inspector-distance-line inspector-distance-line--vertical\"\n [style.left.px]=\"distance.vertical.x!\"\n [style.top.px]=\"Math.min(distance.vertical.y1!, distance.vertical.y2!)\"\n [style.height.px]=\"\n Math.abs(distance.vertical.y2! - distance.vertical.y1!)\n \"\n ></div>\n <div\n class=\"inspector-distance-tag inspector-distance-tag--vertical\"\n [style.left.px]=\"distance.vertical.x! + 10\"\n [style.top.px]=\"(distance.vertical.y1! + distance.vertical.y2!) / 2\"\n >\n {{ formatValue(distance.vertical.value) }}\n </div>\n }\n }\n\n @if (enabled()) {\n @if (toolMode() === \"guides\") {\n @if (guidePreview(); as preview) {\n <div\n class=\"inspector-guide inspector-guide--preview\"\n [class.inspector-guide--vertical]=\"preview.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"\n preview.orientation === 'horizontal'\n \"\n [style.left.px]=\"\n preview.orientation === 'vertical' ? preview.position : null\n \"\n [style.top.px]=\"\n preview.orientation === 'horizontal' ? preview.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n >\n <span class=\"inspector-guide-line\"></span>\n </div>\n }\n }\n\n @for (guide of guides(); track guide.id) {\n <button\n type=\"button\"\n class=\"inspector-guide\"\n [class.inspector-guide--vertical]=\"guide.orientation === 'vertical'\"\n [class.inspector-guide--horizontal]=\"guide.orientation === 'horizontal'\"\n [class.inspector-guide--selected]=\"selectedGuideId() === guide.id\"\n [style.left.px]=\"\n guide.orientation === 'vertical' ? guide.position : null\n \"\n [style.top.px]=\"\n guide.orientation === 'horizontal' ? guide.position : null\n \"\n [style.--inspector-guide]=\"guideColor\"\n (pointerdown)=\"startGuideDrag($event, guide)\"\n >\n <span class=\"inspector-guide-line\"></span>\n </button>\n }\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["newestFirst"],"mappings":"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"}
@@ -85,6 +85,7 @@ export declare class inspectorComponent implements OnDestroy {
85
85
  private canInspectClick;
86
86
  private setInspectorEnabled;
87
87
  private handleCommandBarKeydown;
88
+ private blocksInspectorShortcut;
88
89
  private clampActiveCheckpoint;
89
90
  private scrollActiveCheckpointIntoView;
90
91
  private showCheckpointToast;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inspector-ng",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^17.3.0",
6
6
  "@angular/core": "^17.3.0",