@ethlete/core 4.2.2 → 4.3.0

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.
Files changed (46) hide show
  1. package/esm2022/lib/components/structured-data/structured-data.component.mjs +3 -3
  2. package/esm2022/lib/directives/animatable/animatable.directive.mjs +3 -3
  3. package/esm2022/lib/directives/animated-if/animated-if.directive.mjs +3 -3
  4. package/esm2022/lib/directives/animated-lifecycle/animated-lifecycle.directive.mjs +3 -3
  5. package/esm2022/lib/directives/animated-overlay/animated-overlay.directive.mjs +3 -3
  6. package/esm2022/lib/directives/click-outside/click-outside.directive.mjs +3 -3
  7. package/esm2022/lib/directives/cursor-drag-scroll/cursor-drag-scroll.directive.mjs +3 -3
  8. package/esm2022/lib/directives/debug/debug.directive.mjs +3 -3
  9. package/esm2022/lib/directives/delayable/delayable.directive.mjs +3 -3
  10. package/esm2022/lib/directives/is-active-element/is-active-element.directive.mjs +3 -3
  11. package/esm2022/lib/directives/is-element/is-element.directive.mjs +3 -3
  12. package/esm2022/lib/directives/let/let.directive.mjs +3 -3
  13. package/esm2022/lib/directives/observe-content/observe-content.directive.mjs +3 -3
  14. package/esm2022/lib/directives/observe-resize/observe-resize.directive.mjs +3 -3
  15. package/esm2022/lib/directives/observe-scroll-state/observe-scroll-state.directive.mjs +3 -3
  16. package/esm2022/lib/directives/observe-visibility/observe-visibility.directive.mjs +3 -3
  17. package/esm2022/lib/directives/repeat/repeat.directive.mjs +3 -3
  18. package/esm2022/lib/directives/root-boundary/root-boundary.directive.mjs +3 -3
  19. package/esm2022/lib/directives/scroll-observer-first-element/scroll-observer-first-element.directive.mjs +3 -3
  20. package/esm2022/lib/directives/scroll-observer-ignore-target/scroll-observer-ignore-target.directive.mjs +3 -3
  21. package/esm2022/lib/directives/scroll-observer-last-element/scroll-observer-last-element.directive.mjs +3 -3
  22. package/esm2022/lib/directives/seo/seo.directive.mjs +3 -3
  23. package/esm2022/lib/pipes/infer-mime-type/infer-mime-type.pipe.mjs +3 -3
  24. package/esm2022/lib/pipes/normalize-game-result-type/normalize-game-result-type.pipe.mjs +3 -3
  25. package/esm2022/lib/pipes/normalize-match-participants/normalize-match-participants.pipe.mjs +3 -3
  26. package/esm2022/lib/pipes/normalize-match-score/normalize-match-score.pipe.mjs +3 -3
  27. package/esm2022/lib/pipes/normalize-match-state/normalize-match-state.pipe.mjs +3 -3
  28. package/esm2022/lib/pipes/normalize-match-type/normalize-match-type.pipe.mjs +3 -3
  29. package/esm2022/lib/pipes/to-array/to-array.pipe.mjs +3 -3
  30. package/esm2022/lib/services/click-observer.service.mjs +6 -6
  31. package/esm2022/lib/services/content-observer.service.mjs +6 -6
  32. package/esm2022/lib/services/focus-visible.service.mjs +3 -3
  33. package/esm2022/lib/services/intersection-observer.service.mjs +6 -6
  34. package/esm2022/lib/services/resize-observer.service.mjs +6 -6
  35. package/esm2022/lib/services/router-state.service.mjs +3 -3
  36. package/esm2022/lib/services/viewport.service.mjs +3 -3
  37. package/esm2022/lib/utils/intersection-observer.utils.mjs +27 -0
  38. package/esm2022/lib/utils/public-api.mjs +2 -1
  39. package/esm2022/lib/utils/scrollable.utils.mjs +67 -36
  40. package/esm2022/lib/utils/signal.utils.mjs +65 -21
  41. package/fesm2022/ethlete-core.mjs +280 -178
  42. package/fesm2022/ethlete-core.mjs.map +1 -1
  43. package/lib/utils/intersection-observer.utils.d.ts +14 -0
  44. package/lib/utils/public-api.d.ts +1 -0
  45. package/lib/utils/signal.utils.d.ts +7 -3
  46. package/package.json +6 -6
@@ -22,10 +22,10 @@ export class FocusVisibleService {
22
22
  onPointerDown() {
23
23
  this._hadKeyboardEvent = false;
24
24
  }
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: FocusVisibleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
26
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: FocusVisibleService, providedIn: 'root' }); }
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: FocusVisibleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
26
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: FocusVisibleService, providedIn: 'root' }); }
27
27
  }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: FocusVisibleService, decorators: [{
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: FocusVisibleService, decorators: [{
29
29
  type: Injectable,
30
30
  args: [{
31
31
  providedIn: 'root',
@@ -7,10 +7,10 @@ export class IntersectionObserverFactory {
7
7
  create(callback) {
8
8
  return typeof IntersectionObserver === 'undefined' ? null : new IntersectionObserver(callback);
9
9
  }
10
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: IntersectionObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
11
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: IntersectionObserverFactory, providedIn: 'root' }); }
10
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: IntersectionObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
11
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: IntersectionObserverFactory, providedIn: 'root' }); }
12
12
  }
13
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: IntersectionObserverFactory, decorators: [{
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: IntersectionObserverFactory, decorators: [{
14
14
  type: Injectable,
15
15
  args: [{ providedIn: 'root' }]
16
16
  }] });
@@ -65,10 +65,10 @@ export class IntersectionObserverService {
65
65
  this._observedElements.delete(element);
66
66
  }
67
67
  }
68
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: IntersectionObserverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
69
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: IntersectionObserverService, providedIn: 'root' }); }
68
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: IntersectionObserverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
69
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: IntersectionObserverService, providedIn: 'root' }); }
70
70
  }
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: IntersectionObserverService, decorators: [{
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: IntersectionObserverService, decorators: [{
72
72
  type: Injectable,
73
73
  args: [{ providedIn: 'root' }]
74
74
  }] });
@@ -7,10 +7,10 @@ export class ResizeObserverFactory {
7
7
  create(callback) {
8
8
  return typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(callback);
9
9
  }
10
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ResizeObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
11
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ResizeObserverFactory, providedIn: 'root' }); }
10
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ResizeObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
11
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ResizeObserverFactory, providedIn: 'root' }); }
12
12
  }
13
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ResizeObserverFactory, decorators: [{
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ResizeObserverFactory, decorators: [{
14
14
  type: Injectable,
15
15
  args: [{ providedIn: 'root' }]
16
16
  }] });
@@ -65,10 +65,10 @@ export class ResizeObserverService {
65
65
  this._observedElements.delete(element);
66
66
  }
67
67
  }
68
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ResizeObserverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
69
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ResizeObserverService, providedIn: 'root' }); }
68
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ResizeObserverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
69
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ResizeObserverService, providedIn: 'root' }); }
70
70
  }
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ResizeObserverService, decorators: [{
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ResizeObserverService, decorators: [{
72
72
  type: Injectable,
73
73
  args: [{ providedIn: 'root' }]
74
74
  }] });
@@ -193,10 +193,10 @@ export class RouterStateService {
193
193
  fragment,
194
194
  };
195
195
  }
196
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: RouterStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
197
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: RouterStateService, providedIn: 'root' }); }
196
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: RouterStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
197
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: RouterStateService, providedIn: 'root' }); }
198
198
  }
199
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: RouterStateService, decorators: [{
199
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: RouterStateService, decorators: [{
200
200
  type: Injectable,
201
201
  args: [{
202
202
  providedIn: 'root',
@@ -216,8 +216,8 @@ export class ViewportService {
216
216
  }
217
217
  return 'xs';
218
218
  }
219
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ViewportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
220
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ViewportService, providedIn: 'root' }); }
219
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ViewportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
220
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ViewportService, providedIn: 'root' }); }
221
221
  }
222
222
  __decorate([
223
223
  Memo(),
@@ -235,7 +235,7 @@ __decorate([
235
235
  __metadata("design:paramtypes", [Object]),
236
236
  __metadata("design:returntype", void 0)
237
237
  ], ViewportService.prototype, "_buildMediaQuery", null);
238
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.2", ngImport: i0, type: ViewportService, decorators: [{
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ViewportService, decorators: [{
239
239
  type: Injectable,
240
240
  args: [{
241
241
  providedIn: 'root',
@@ -0,0 +1,27 @@
1
+ export const getFirstAndLastPartialIntersection = (intersections) => {
2
+ const firstIntersecting = intersections.find((i) => i.intersectionRatio > 0);
3
+ const lastIntersecting = [...intersections].reverse().find((i) => i.intersectionRatio > 0);
4
+ const firstIntersectingIndex = intersections.findIndex((i) => i === firstIntersecting);
5
+ const lastIntersectingIndex = intersections.findIndex((i) => i === lastIntersecting);
6
+ if (!firstIntersecting || !lastIntersecting)
7
+ return null;
8
+ const greaterIntersecting = firstIntersecting.intersectionRatio > lastIntersecting.intersectionRatio ? firstIntersecting : lastIntersecting;
9
+ const greaterIntersectingIndex = firstIntersecting.intersectionRatio > lastIntersecting.intersectionRatio
10
+ ? firstIntersectingIndex
11
+ : lastIntersectingIndex;
12
+ return {
13
+ first: {
14
+ intersection: firstIntersecting,
15
+ index: firstIntersectingIndex,
16
+ },
17
+ last: {
18
+ intersection: lastIntersecting,
19
+ index: lastIntersectingIndex,
20
+ },
21
+ biggest: {
22
+ intersection: greaterIntersecting,
23
+ index: greaterIntersectingIndex,
24
+ },
25
+ };
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJzZWN0aW9uLW9ic2VydmVyLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvaW50ZXJzZWN0aW9uLW9ic2VydmVyLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLENBQUMsYUFBMEMsRUFBRSxFQUFFO0lBQy9GLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRTNGLE1BQU0sc0JBQXNCLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLGlCQUFpQixDQUFDLENBQUM7SUFDdkYsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsQ0FBQztJQUVyRixJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV6RCxNQUFNLG1CQUFtQixHQUN2QixpQkFBaUIsQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO0lBRWxILE1BQU0sd0JBQXdCLEdBQzVCLGlCQUFpQixDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLGlCQUFpQjtRQUN0RSxDQUFDLENBQUMsc0JBQXNCO1FBQ3hCLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQztJQUU1QixPQUFPO1FBQ0wsS0FBSyxFQUFFO1lBQ0wsWUFBWSxFQUFFLGlCQUFpQjtZQUMvQixLQUFLLEVBQUUsc0JBQXNCO1NBQzlCO1FBQ0QsSUFBSSxFQUFFO1lBQ0osWUFBWSxFQUFFLGdCQUFnQjtZQUM5QixLQUFLLEVBQUUscUJBQXFCO1NBQzdCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsWUFBWSxFQUFFLG1CQUFtQjtZQUNqQyxLQUFLLEVBQUUsd0JBQXdCO1NBQ2hDO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBnZXRGaXJzdEFuZExhc3RQYXJ0aWFsSW50ZXJzZWN0aW9uID0gKGludGVyc2VjdGlvbnM6IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlbXSkgPT4ge1xuICBjb25zdCBmaXJzdEludGVyc2VjdGluZyA9IGludGVyc2VjdGlvbnMuZmluZCgoaSkgPT4gaS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApO1xuICBjb25zdCBsYXN0SW50ZXJzZWN0aW5nID0gWy4uLmludGVyc2VjdGlvbnNdLnJldmVyc2UoKS5maW5kKChpKSA9PiBpLmludGVyc2VjdGlvblJhdGlvID4gMCk7XG5cbiAgY29uc3QgZmlyc3RJbnRlcnNlY3RpbmdJbmRleCA9IGludGVyc2VjdGlvbnMuZmluZEluZGV4KChpKSA9PiBpID09PSBmaXJzdEludGVyc2VjdGluZyk7XG4gIGNvbnN0IGxhc3RJbnRlcnNlY3RpbmdJbmRleCA9IGludGVyc2VjdGlvbnMuZmluZEluZGV4KChpKSA9PiBpID09PSBsYXN0SW50ZXJzZWN0aW5nKTtcblxuICBpZiAoIWZpcnN0SW50ZXJzZWN0aW5nIHx8ICFsYXN0SW50ZXJzZWN0aW5nKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBncmVhdGVySW50ZXJzZWN0aW5nID1cbiAgICBmaXJzdEludGVyc2VjdGluZy5pbnRlcnNlY3Rpb25SYXRpbyA+IGxhc3RJbnRlcnNlY3RpbmcuaW50ZXJzZWN0aW9uUmF0aW8gPyBmaXJzdEludGVyc2VjdGluZyA6IGxhc3RJbnRlcnNlY3Rpbmc7XG5cbiAgY29uc3QgZ3JlYXRlckludGVyc2VjdGluZ0luZGV4ID1cbiAgICBmaXJzdEludGVyc2VjdGluZy5pbnRlcnNlY3Rpb25SYXRpbyA+IGxhc3RJbnRlcnNlY3RpbmcuaW50ZXJzZWN0aW9uUmF0aW9cbiAgICAgID8gZmlyc3RJbnRlcnNlY3RpbmdJbmRleFxuICAgICAgOiBsYXN0SW50ZXJzZWN0aW5nSW5kZXg7XG5cbiAgcmV0dXJuIHtcbiAgICBmaXJzdDoge1xuICAgICAgaW50ZXJzZWN0aW9uOiBmaXJzdEludGVyc2VjdGluZyxcbiAgICAgIGluZGV4OiBmaXJzdEludGVyc2VjdGluZ0luZGV4LFxuICAgIH0sXG4gICAgbGFzdDoge1xuICAgICAgaW50ZXJzZWN0aW9uOiBsYXN0SW50ZXJzZWN0aW5nLFxuICAgICAgaW5kZXg6IGxhc3RJbnRlcnNlY3RpbmdJbmRleCxcbiAgICB9LFxuICAgIGJpZ2dlc3Q6IHtcbiAgICAgIGludGVyc2VjdGlvbjogZ3JlYXRlckludGVyc2VjdGluZyxcbiAgICAgIGluZGV4OiBncmVhdGVySW50ZXJzZWN0aW5nSW5kZXgsXG4gICAgfSxcbiAgfTtcbn07XG4iXX0=
@@ -7,6 +7,7 @@ export * from './cookie.util';
7
7
  export * from './destroy.utils';
8
8
  export * from './equal.util';
9
9
  export * from './form.utils';
10
+ export * from './intersection-observer.utils';
10
11
  export * from './key-press-manager.utils';
11
12
  export * from './media-query-observable.util';
12
13
  export * from './mutation-observable.util';
@@ -20,4 +21,4 @@ export * from './signal.utils';
20
21
  export * from './smart-block-scroll-strategy.utils';
21
22
  export * from './value.utils';
22
23
  export * from './viewport.util';
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3V0aWxzL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FjdGl2ZS1zZWxlY3Rpb24tbW9kZWwudXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9hbmd1bGFyLnV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vYW5pbWF0aW9uLnV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY2xhbXAudXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2Nsb25lLnV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jb29raWUudXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2Rlc3Ryb3kudXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9lcXVhbC51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL2tleS1wcmVzcy1tYW5hZ2VyLnV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVkaWEtcXVlcnktb2JzZXJ2YWJsZS51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vbXV0YXRpb24tb2JzZXJ2YWJsZS51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vcmVhY3RpdmUtYmluZGluZy51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vcmVzaXplLW9ic2VydmFibGUudXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3JvdW5kLnV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS1lcnJvci51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3Njcm9sbGFibGUudXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWxlY3Rpb24tbW9kZWwudXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zaWduYWwudXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zbWFydC1ibG9jay1zY3JvbGwtc3RyYXRlZ3kudXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi92YWx1ZS51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3ZpZXdwb3J0LnV0aWwnO1xuIl19
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3V0aWxzL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYWN0aXZlLXNlbGVjdGlvbi1tb2RlbC51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL2FuZ3VsYXIudXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9hbmltYXRpb24udXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jbGFtcC51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vY2xvbmUudXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2Nvb2tpZS51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vZGVzdHJveS51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL2VxdWFsLnV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtLnV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJzZWN0aW9uLW9ic2VydmVyLnV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4va2V5LXByZXNzLW1hbmFnZXIudXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZWRpYS1xdWVyeS1vYnNlcnZhYmxlLnV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9tdXRhdGlvbi1vYnNlcnZhYmxlLnV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWFjdGl2ZS1iaW5kaW5nLnV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNpemUtb2JzZXJ2YWJsZS51dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vcm91bmQudXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9ydW50aW1lLWVycm9yLnV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vc2Nyb2xsYWJsZS51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3NlbGVjdGlvbi1tb2RlbC51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3NpZ25hbC51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3NtYXJ0LWJsb2NrLXNjcm9sbC1zdHJhdGVneS51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3ZhbHVlLnV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vdmlld3BvcnQudXRpbCc7XG4iXX0=
@@ -57,46 +57,77 @@ export const scrollToElement = (options) => {
57
57
  }
58
58
  const elementRect = element.getBoundingClientRect();
59
59
  const containerRect = container.getBoundingClientRect();
60
- const elementInlineSize = elementRect.width;
61
- const elementBlockSize = elementRect.height;
62
- const containerInlineSize = containerRect.width;
63
- const containerBlockSize = containerRect.height;
64
- const elementInlineStart = elementRect.left;
65
- const elementBlockStart = elementRect.top;
66
- const containerInlineStart = containerRect.left;
67
- const containerBlockStart = containerRect.top;
68
- const elementInlineEnd = elementInlineStart + elementInlineSize;
69
- const elementBlockEnd = elementBlockStart + elementBlockSize;
70
- const containerInlineEnd = containerInlineStart + containerInlineSize;
71
- const containerBlockEnd = containerBlockStart + containerBlockSize;
72
- const elementInlineCenter = elementInlineStart + elementInlineSize / 2;
73
- const elementBlockCenter = elementBlockStart + elementBlockSize / 2;
74
- const containerInlineCenter = containerInlineStart + containerInlineSize / 2;
75
- const containerBlockCenter = containerBlockStart + containerBlockSize / 2;
76
- const elementInlineOrigin = origin === 'center' ? elementInlineCenter : origin === 'end' ? elementInlineEnd : elementInlineStart;
77
- const elementBlockOrigin = origin === 'center' ? elementBlockCenter : origin === 'end' ? elementBlockEnd : elementBlockStart;
78
- const containerInlineOrigin = origin === 'center' ? containerInlineCenter : origin === 'end' ? containerInlineEnd : containerInlineStart;
79
- const containerBlockOrigin = origin === 'center' ? containerBlockCenter : origin === 'end' ? containerBlockEnd : containerBlockStart;
80
- const inlineOffset = elementInlineOrigin - containerInlineOrigin - scrollInlineMargin;
81
- const blockOffset = elementBlockOrigin - containerBlockOrigin - scrollBlockMargin;
82
- let inlineScroll = direction === 'block' ? undefined : inlineOffset;
83
- let blockScroll = direction === 'inline' ? undefined : blockOffset;
84
- if (origin === 'nearest') {
85
- const elVisible = isElementVisible({ element, container, containerRect });
86
- if (elVisible?.inline && elVisible?.block) {
87
- return;
88
- }
89
- if (elVisible?.inline) {
90
- inlineScroll = undefined;
60
+ const { scrollLeft, scrollTop } = container;
61
+ const { width: elementWidth, height: elementHeight, left: elementLeft, top: elementTop } = elementRect;
62
+ const { width: containerWidth, height: containerHeight, left: containerLeft, top: containerTop } = containerRect;
63
+ const shouldScrollLeft = direction === 'inline' || direction === 'both' || !direction;
64
+ const shouldScrollTop = direction === 'block' || direction === 'both' || !direction;
65
+ let scrollLeftTo = scrollLeft;
66
+ let scrollTopTo = scrollTop;
67
+ const scrollToElementStart = () => {
68
+ const relativeTop = elementTop - containerTop;
69
+ const relativeLeft = elementLeft - containerLeft;
70
+ const amountToScrollTop = relativeTop;
71
+ const amountToScrollLeft = relativeLeft;
72
+ const scrollTopPosition = scrollTop + amountToScrollTop;
73
+ const scrollLeftPosition = scrollLeft + amountToScrollLeft;
74
+ scrollLeftTo = scrollLeftPosition - scrollInlineMargin;
75
+ scrollTopTo = scrollTopPosition - scrollBlockMargin;
76
+ };
77
+ const scrollToElementEnd = () => {
78
+ const relativeTop = elementTop - containerTop;
79
+ const relativeLeft = elementLeft - containerLeft;
80
+ const amountToScrollTop = relativeTop - containerHeight + elementHeight;
81
+ const amountToScrollLeft = relativeLeft - containerWidth + elementWidth;
82
+ const scrollTopPosition = scrollTop + amountToScrollTop;
83
+ const scrollLeftPosition = scrollLeft + amountToScrollLeft;
84
+ scrollLeftTo = scrollLeftPosition + scrollInlineMargin;
85
+ scrollTopTo = scrollTopPosition + scrollBlockMargin;
86
+ };
87
+ const scrollToElementCenter = () => {
88
+ const relativeTop = elementTop - containerTop;
89
+ const relativeLeft = elementLeft - containerLeft;
90
+ const amountToScrollTop = relativeTop - containerHeight / 2 + elementHeight / 2;
91
+ const amountToScrollLeft = relativeLeft - containerWidth / 2 + elementWidth / 2;
92
+ const scrollTopPosition = scrollTop + amountToScrollTop;
93
+ const scrollLeftPosition = scrollLeft + amountToScrollLeft;
94
+ scrollLeftTo = scrollLeftPosition;
95
+ scrollTopTo = scrollTopPosition;
96
+ };
97
+ const scrollToElementNearest = () => {
98
+ const isAbove = elementRect.bottom < containerRect.top;
99
+ const isPartialAbove = elementRect.top < containerRect.top && elementRect.bottom > containerRect.top;
100
+ const isBelow = elementRect.top > containerRect.bottom;
101
+ const isPartialBelow = elementRect.top < containerRect.bottom && elementRect.bottom > containerRect.bottom;
102
+ const isLeft = elementRect.right < containerRect.left;
103
+ const isPartialLeft = elementRect.left < containerRect.left && elementRect.right > containerRect.left;
104
+ const isRight = elementRect.left > containerRect.right;
105
+ const isPartialRight = elementRect.left < containerRect.right && elementRect.right > containerRect.right;
106
+ if (isAbove || isPartialAbove || isLeft || isPartialLeft) {
107
+ scrollToElementStart();
91
108
  }
92
- if (elVisible?.block) {
93
- blockScroll = undefined;
109
+ else if (isBelow || isPartialBelow || isRight || isPartialRight) {
110
+ scrollToElementEnd();
94
111
  }
112
+ };
113
+ switch (origin) {
114
+ case 'start':
115
+ scrollToElementStart();
116
+ break;
117
+ case 'end':
118
+ scrollToElementEnd();
119
+ break;
120
+ case 'center':
121
+ scrollToElementCenter();
122
+ break;
123
+ case 'nearest':
124
+ scrollToElementNearest();
125
+ break;
95
126
  }
96
127
  container.scrollTo({
97
- left: container.scrollLeft + (inlineScroll || 0),
98
- top: container.scrollTop + (blockScroll || 0),
99
128
  behavior,
129
+ left: shouldScrollLeft ? scrollLeftTo : undefined,
130
+ top: shouldScrollTop ? scrollTopTo : undefined,
100
131
  });
101
132
  };
102
133
  export const getElementVisibleStates = (options) => {
@@ -113,4 +144,4 @@ export const getElementVisibleStates = (options) => {
113
144
  .filter(Boolean);
114
145
  return elementVisibleStates;
115
146
  };
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3V0aWxzL3Njcm9sbGFibGUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQW9CLEVBQUUsU0FBcUIsRUFBRSxFQUFFO0lBQzlFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFekUsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUFFO1FBQ3JCLE9BQU8sV0FBVyxHQUFHLFdBQVcsQ0FBQztLQUNsQztTQUFNLElBQUksU0FBUyxLQUFLLEdBQUcsRUFBRTtRQUM1QixPQUFPLFlBQVksR0FBRyxZQUFZLENBQUM7S0FDcEM7SUFFRCxPQUFPLFlBQVksR0FBRyxZQUFZLElBQUksV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUNsRSxDQUFDLENBQUM7QUFnREYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxPQUFnQyxFQUFtQyxFQUFFO0lBQ3BHLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDNUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUU1QixJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7UUFDbEMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELFNBQVMsS0FBSyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBRXZDLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFB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QUFZLEdBQUcsU0FBUyxDQUFDO1NBQzFCO1FBRUQsSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFO1lBQ3BCLFdBQVcsR0FBRyxTQUFTLENBQUM7U0FDekI7S0FDRjtJQUVELFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDakIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO1FBQ2hELEdBQUcsRUFBRSxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUM3QyxRQUFRO0tBQ1QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBZUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxPQUFrQyxFQUFFLEVBQUU7SUFDNUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUM1QixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTdCLFNBQVMsS0FBSyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBRXZDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBRS9DLE1BQU0sb0JBQW9CLEdBQUcsUUFBUTtTQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNULElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFbEMsT0FBTyxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQztTQUNELE1BQU0sQ0FBQyxPQUFPLENBQStCLENBQUM7SUFFakQsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vY2xhbXAudXRpbCc7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50Q2FuU2Nyb2xsID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb24/OiAneCcgfCAneScpID0+IHtcbiAgY29uc3QgeyBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCwgc2Nyb2xsV2lkdGgsIGNsaWVudFdpZHRoIH0gPSBlbGVtZW50O1xuXG4gIGlmIChkaXJlY3Rpb24gPT09ICd4Jykge1xuICAgIHJldHVybiBzY3JvbGxXaWR0aCA+IGNsaWVudFdpZHRoO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3knKSB7XG4gICAgcmV0dXJuIHNjcm9sbEhlaWdodCA+IGNsaWVudEhlaWdodDtcbiAgfVxuXG4gIHJldHVybiBzY3JvbGxIZWlnaHQgPiBjbGllbnRIZWlnaHQgfHwgc2Nyb2xsV2lkdGggPiBjbGllbnRXaWR0aDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXNFbGVtZW50VmlzaWJsZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gY2hlY2sgaWYgaXQgaXMgdmlzaWJsZSBpbnNpZGUgYSBjb250YWluZXIuXG4gICAqL1xuICBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRvIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW5zaWRlLlxuICAgKiBAZGVmYXVsdCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcbiAgICovXG4gIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lcidzIHJlY3QgdG8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbnNpZGUuIENhbiBiZSBzdXBwbGllZCB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBET00gcmVhZHMuXG4gICAqIEBkZWZhdWx0IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgKi9cbiAgY29udGFpbmVyUmVjdD86IERPTVJlY3QgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIGlubGluZSBkaXJlY3Rpb24uXG4gICAqL1xuICBpbmxpbmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgYmxvY2sgZGlyZWN0aW9uLlxuICAgKi9cbiAgYmxvY2s6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgdmlzaWJsZSBpbiB0aGUgaW5saW5lIGRpcmVjdGlvbi5cbiAgICovXG4gIGlubGluZUludGVyc2VjdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgZWxlbWVudCB0aGF0IGlzIHZpc2libGUgaW4gdGhlIGJsb2NrIGRpcmVjdGlvbi5cbiAgICovXG4gIGJsb2NrSW50ZXJzZWN0aW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgaXMgYmVpbmcgY2hlY2tlZCBmb3IgdmlzaWJpbGl0eS5cbiAgICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgaXNFbGVtZW50VmlzaWJsZSA9IChvcHRpb25zOiBJc0VsZW1lbnRWaXNpYmxlT3B0aW9ucyk6IEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eSB8IG51bGwgPT4ge1xuICBsZXQgeyBjb250YWluZXIgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHsgZWxlbWVudCB9ID0gb3B0aW9ucztcblxuICBpZiAoIWVsZW1lbnQgfHwgY29udGFpbmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb250YWluZXIgfHw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICBjb25zdCBjYW5TY3JvbGwgPSBlbGVtZW50Q2FuU2Nyb2xsKGNvbnRhaW5lcik7XG5cbiAgaWYgKCFjYW5TY3JvbGwpIHtcbiAgICByZXR1cm4geyBpbmxpbmU6IHRydWUsIGJsb2NrOiB0cnVlLCBibG9ja0ludGVyc2VjdGlvbjogMTAwLCBpbmxpbmVJbnRlcnNlY3Rpb246IDEwMCwgZWxlbWVudCB9O1xuICB9XG5cbiAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBjb250YWluZXJSZWN0ID0gb3B0aW9ucy5jb250YWluZXJSZWN0IHx8IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICBjb25zdCBlbGVtZW50SW5saW5lU3RhcnQgPSBlbGVtZW50UmVjdC5sZWZ0O1xuICBjb25zdCBlbGVtZW50QmxvY2tTdGFydCA9IGVsZW1lbnRSZWN0LnRvcDtcblxuICBjb25zdCBjb250YWluZXJJbmxpbmVTdGFydCA9IGNvbnRhaW5lclJlY3QubGVmdDtcbiAgY29uc3QgY29udGFpbmVyQmxvY2tTdGFydCA9IGNvbnRhaW5lclJlY3QudG9wO1xuXG4gIGNvbnN0IGVsZW1lbnRJbmxpbmVFbmQgPSBlbGVtZW50SW5saW5lU3RhcnQgKyBlbGVtZW50UmVjdC53aWR0aDtcbiAgY29uc3QgZWxlbWVudEJsb2NrRW5kID0gZWxlbWVudEJsb2NrU3RhcnQgKyBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgY29uc3QgY29udGFpbmVySW5saW5lRW5kID0gY29udGFpbmVySW5saW5lU3RhcnQgKyBjb250YWluZXJSZWN0LndpZHRoO1xuICBjb25zdCBjb250YWluZXJCbG9ja0VuZCA9IGNvbnRhaW5lckJsb2NrU3RhcnQgKyBjb250YWluZXJSZWN0LmhlaWdodDtcblxuICBjb25zdCBpc0VsZW1lbnRJbmxpbmVWaXNpYmxlID0gZWxlbWVudElubGluZVN0YXJ0ID49IGNvbnRhaW5lcklubGluZVN0YXJ0ICYmIGVsZW1lbnRJbmxpbmVFbmQgPD0gY29udGFpbmVySW5saW5lRW5kO1xuICBjb25zdCBpc0VsZW1lbnRCbG9ja1Zpc2libGUgPSBlbGVtZW50QmxvY2tTdGFydCA+PSBjb250YWluZXJCbG9ja1N0YXJ0ICYmIGVsZW1lbnRCbG9ja0VuZCA8PSBjb250YWluZXJCbG9ja0VuZDtcblxuICBjb25zdCBpbmxpbmVJbnRlcnNlY3Rpb24gPVxuICAgIE1hdGgubWluKGVsZW1lbnRJbmxpbmVFbmQsIGNvbnRhaW5lcklubGluZUVuZCkgLSBNYXRoLm1heChlbGVtZW50SW5saW5lU3RhcnQsIGNvbnRhaW5lcklubGluZVN0YXJ0KTtcbiAgY29uc3QgYmxvY2tJbnRlcnNlY3Rpb24gPVxuICAgIE1hdGgubWluKGVsZW1lbnRCbG9ja0VuZCwgY29udGFpbmVyQmxvY2tFbmQpIC0gTWF0aC5tYXgoZWxlbWVudEJsb2NrU3RhcnQsIGNvbnRhaW5lckJsb2NrU3RhcnQpO1xuXG4gIGNvbnN0IGlubGluZUludGVyc2VjdGlvblBlcmNlbnRhZ2UgPSBjbGFtcCgoaW5saW5lSW50ZXJzZWN0aW9uIC8gZWxlbWVudFJlY3Qud2lkdGgpICogMTAwKTtcbiAgY29uc3QgYmxvY2tJbnRlcnNlY3Rpb25QZXJjZW50YWdlID0gY2xhbXAoKGJsb2NrSW50ZXJzZWN0aW9uIC8gZWxlbWVudFJlY3QuaGVpZ2h0KSAqIDEwMCk7XG5cbiAgcmV0dXJuIHtcbiAgICBpbmxpbmU6IGlzRWxlbWVudElubGluZVZpc2libGUsXG4gICAgYmxvY2s6IGlzRWxlbWVudEJsb2NrVmlzaWJsZSxcbiAgICBpbmxpbmVJbnRlcnNlY3Rpb246IGlubGluZUludGVyc2VjdGlvblBlcmNlbnRhZ2UsXG4gICAgYmxvY2tJbnRlcnNlY3Rpb246IGJsb2NrSW50ZXJzZWN0aW9uUGVyY2VudGFnZSxcbiAgICBlbGVtZW50LFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxUb0VsZW1lbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIHNjcm9sbCB0by5cbiAgICovXG4gIGVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzY3JvbGwgY29udGFpbmVyIHRvIHNjcm9sbCB0byB0aGUgZWxlbWVudCBpbi5cbiAgICogQGRlZmF1bHQgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAqL1xuICBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rpb24gdG8gc2Nyb2xsIGluLlxuICAgKiBAZGVmYXVsdCAnYm90aCdcbiAgICovXG4gIGRpcmVjdGlvbj86ICdpbmxpbmUnIHwgJ2Jsb2NrJyB8ICdib3RoJztcblxuICAvKipcbiAgICogVGhlIG9yaWdpbiBvZiB0aGUgZWxlbWVudCB0byBzY3JvbGwgdG8uXG4gICAqIEBkZWZhdWx0ICduZWFyZXN0J1xuICAgKi9cbiAgb3JpZ2luPzogJ3N0YXJ0JyB8ICdlbmQnIHwgJ2NlbnRlcicgfCAnbmVhcmVzdCc7XG5cbiAgLyoqXG4gICAqIFRoZSBzY3JvbGwgYmVoYXZpb3IuXG4gICAqIEBkZWZhdWx0ICdzbW9vdGgnXG4gICAqL1xuICBiZWhhdmlvcj86IFNjcm9sbEJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Nyb2xsIGlubGluZS1tYXJnaW5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgc2Nyb2xsSW5saW5lTWFyZ2luPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Nyb2xsIGJsb2NrLW1hcmdpblxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBzY3JvbGxCbG9ja01hcmdpbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IHNjcm9sbFRvRWxlbWVudCA9IChvcHRpb25zOiBTY3JvbGxUb0VsZW1lbnRPcHRpb25zKSA9PiB7XG4gIGxldCB7IGNvbnRhaW5lciB9ID0gb3B0aW9ucztcbiAgY29uc3Qge1xuICAgIGVsZW1lbnQsXG4gICAgZGlyZWN0aW9uLFxuICAgIGJlaGF2aW9yID0gJ3Ntb290aCcsXG4gICAgb3JpZ2luID0gJ25lYXJlc3QnLFxuICAgIHNjcm9sbEJsb2NrTWFyZ2luID0gMCxcbiAgICBzY3JvbGxJbmxpbmVNYXJnaW4gPSAwLFxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIWVsZW1lbnQgfHwgY29udGFpbmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29udGFpbmVyIHx8PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgY29uc3QgY2FuU2Nyb2xsID0gZWxlbWVudENhblNjcm9sbChjb250YWluZXIpO1xuXG4gIGlmICghY2FuU2Nyb2xsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIGNvbnN0IGVsZW1lbnRJbmxpbmVTaXplID0gZWxlbWVudFJlY3Qud2lkdGg7XG4gIGNvbnN0IGVsZW1lbnRCbG9ja1NpemUgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgY29uc3QgY29udGFpbmVySW5saW5lU2l6ZSA9IGNvbnRhaW5lclJlY3Qud2lkdGg7XG4gIGNvbnN0IGNvbnRhaW5lckJsb2NrU2l6ZSA9IGNvbnRhaW5lclJlY3QuaGVpZ2h0O1xuXG4gIGNvbnN0IGVsZW1lbnRJbmxpbmVTdGFydCA9IGVsZW1lbnRSZWN0LmxlZnQ7XG4gIGNvbnN0IGVsZW1lbnRCbG9ja1N0YXJ0ID0gZWxlbWVudFJlY3QudG9wO1xuXG4gIGNvbnN0IGNvbnRhaW5lcklubGluZVN0YXJ0ID0gY29udGFpbmVyUmVjdC5sZWZ0O1xuICBjb25zdCBjb250YWluZXJCbG9ja1N0YXJ0ID0gY29udGFpbmVyUmVjdC50b3A7XG5cbiAgY29uc3QgZWxlbWVudElubGluZUVuZCA9IGVsZW1lbnRJbmxpbmVTdGFydCArIGVsZW1lbnRJbmxpbmVTaXplO1xuICBjb25zdCBlbGVtZW50QmxvY2tFbmQgPSBlbGVtZW50QmxvY2tTdGFydCArIGVsZW1lbnRCbG9ja1NpemU7XG5cbiAgY29uc3QgY29udGFpbmVySW5saW5lRW5kID0gY29udGFpbmVySW5saW5lU3RhcnQgKyBjb250YWluZXJJbmxpbmVTaXplO1xuICBjb25zdCBjb250YWluZXJCbG9ja0VuZCA9IGNvbnRhaW5lckJsb2NrU3RhcnQgKyBjb250YWluZXJCbG9ja1NpemU7XG5cbiAgY29uc3QgZWxlbWVudElubGluZUNlbnRlciA9IGVsZW1lbnRJbmxpbmVTdGFydCArIGVsZW1lbnRJbmxpbmVTaXplIC8gMjtcbiAgY29uc3QgZWxlbWVudEJsb2NrQ2VudGVyID0gZWxlbWVudEJsb2NrU3RhcnQgKyBlbGVtZW50QmxvY2tTaXplIC8gMjtcblxuICBjb25zdCBjb250YWluZXJJbmxpbmVDZW50ZXIgPSBjb250YWluZXJJbmxpbmVTdGFydCArIGNvbnRhaW5lcklubGluZVNpemUgLyAyO1xuICBjb25zdCBjb250YWluZXJCbG9ja0NlbnRlciA9IGNvbnRhaW5lckJsb2NrU3RhcnQgKyBjb250YWluZXJCbG9ja1NpemUgLyAyO1xuXG4gIGNvbnN0IGVsZW1lbnRJbmxpbmVPcmlnaW4gPVxuICAgIG9yaWdpbiA9PT0gJ2NlbnRlcicgPyBlbGVtZW50SW5saW5lQ2VudGVyIDogb3JpZ2luID09PSAnZW5kJyA/IGVsZW1lbnRJbmxpbmVFbmQgOiBlbGVtZW50SW5saW5lU3RhcnQ7XG4gIGNvbnN0IGVsZW1lbnRCbG9ja09yaWdpbiA9XG4gICAgb3JpZ2luID09PSAnY2VudGVyJyA/IGVsZW1lbnRCbG9ja0NlbnRlciA6IG9yaWdpbiA9PT0gJ2VuZCcgPyBlbGVtZW50QmxvY2tFbmQgOiBlbGVtZW50QmxvY2tTdGFydDtcblxuICBjb25zdCBjb250YWluZXJJbmxpbmVPcmlnaW4gPVxuICAgIG9yaWdpbiA9PT0gJ2NlbnRlcicgPyBjb250YWluZXJJbmxpbmVDZW50ZXIgOiBvcmlnaW4gPT09ICdlbmQnID8gY29udGFpbmVySW5saW5lRW5kIDogY29udGFpbmVySW5saW5lU3RhcnQ7XG4gIGNvbnN0IGNvbnRhaW5lckJsb2NrT3JpZ2luID1cbiAgICBvcmlnaW4gPT09ICdjZW50ZXInID8gY29udGFpbmVyQmxvY2tDZW50ZXIgOiBvcmlnaW4gPT09ICdlbmQnID8gY29udGFpbmVyQmxvY2tFbmQgOiBjb250YWluZXJCbG9ja1N0YXJ0O1xuXG4gIGNvbnN0IGlubGluZU9mZnNldCA9IGVsZW1lbnRJbmxpbmVPcmlnaW4gLSBjb250YWluZXJJbmxpbmVPcmlnaW4gLSBzY3JvbGxJbmxpbmVNYXJnaW47XG4gIGNvbnN0IGJsb2NrT2Zmc2V0ID0gZWxlbWVudEJsb2NrT3JpZ2luIC0gY29udGFpbmVyQmxvY2tPcmlnaW4gLSBzY3JvbGxCbG9ja01hcmdpbjtcblxuICBsZXQgaW5saW5lU2Nyb2xsOiBudW1iZXIgfCB1bmRlZmluZWQgPSBkaXJlY3Rpb24gPT09ICdibG9jaycgPyB1bmRlZmluZWQgOiBpbmxpbmVPZmZzZXQ7XG4gIGxldCBibG9ja1Njcm9sbDogbnVtYmVyIHwgdW5kZWZpbmVkID0gZGlyZWN0aW9uID09PSAnaW5saW5lJyA/IHVuZGVmaW5lZCA6IGJsb2NrT2Zmc2V0O1xuXG4gIGlmIChvcmlnaW4gPT09ICduZWFyZXN0Jykge1xuICAgIGNvbnN0IGVsVmlzaWJsZSA9IGlzRWxlbWVudFZpc2libGUoeyBlbGVtZW50LCBjb250YWluZXIsIGNvbnRhaW5lclJlY3QgfSk7XG5cbiAgICBpZiAoZWxWaXNpYmxlPy5pbmxpbmUgJiYgZWxWaXNpYmxlPy5ibG9jaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbFZpc2libGU/LmlubGluZSkge1xuICAgICAgaW5saW5lU2Nyb2xsID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChlbFZpc2libGU/LmJsb2NrKSB7XG4gICAgICBibG9ja1Njcm9sbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBjb250YWluZXIuc2Nyb2xsVG8oe1xuICAgIGxlZnQ6IGNvbnRhaW5lci5zY3JvbGxMZWZ0ICsgKGlubGluZVNjcm9sbCB8fCAwKSxcbiAgICB0b3A6IGNvbnRhaW5lci5zY3JvbGxUb3AgKyAoYmxvY2tTY3JvbGwgfHwgMCksXG4gICAgYmVoYXZpb3IsXG4gIH0pO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBHZXRWaXNpYmxlRWxlbWVudHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIgdG8gY2hlY2sgZm9yIHZpc2libGUgZWxlbWVudHMuXG4gICAqIEBkZWZhdWx0IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgKi9cbiAgY29udGFpbmVyPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudHMgdG8gY2hlY2sgaWYgdGhleSBhcmUgdmlzaWJsZSBpbnNpZGUgYSBjb250YWluZXIuXG4gICAqL1xuICBlbGVtZW50czogSFRNTEVsZW1lbnRbXTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRWaXNpYmxlU3RhdGVzID0gKG9wdGlvbnM6IEdldFZpc2libGVFbGVtZW50c09wdGlvbnMpID0+IHtcbiAgbGV0IHsgY29udGFpbmVyIH0gPSBvcHRpb25zO1xuICBjb25zdCB7IGVsZW1lbnRzIH0gPSBvcHRpb25zO1xuXG4gIGNvbnRhaW5lciB8fD0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gIGNvbnN0IHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgY29uc3QgZWxlbWVudFZpc2libGVTdGF0ZXMgPSBlbGVtZW50c1xuICAgIC5tYXAoKGUpID0+IHtcbiAgICAgIGlmICghZSB8fCAhY29udGFpbmVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgcmV0dXJuIGlzRWxlbWVudFZpc2libGUoeyBjb250YWluZXIsIGVsZW1lbnQ6IGUsIGNvbnRhaW5lclJlY3Q6IHJlY3QgfSk7XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eVtdO1xuXG4gIHJldHVybiBlbGVtZW50VmlzaWJsZVN0YXRlcztcbn07XG4iXX0=
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3V0aWxzL3Njcm9sbGFibGUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQW9CLEVBQUUsU0FBcUIsRUFBRSxFQUFFO0lBQzlFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFekUsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUFFO1FBQ3JCLE9BQU8sV0FBVyxHQUFHLFdBQVcsQ0FBQztLQUNsQztTQUFNLElBQUksU0FBUyxLQUFLLEdBQUcsRUFBRTtRQUM1QixPQUFPLFlBQVksR0FBRyxZQUFZLENBQUM7S0FDcEM7SUFFRCxPQUFPLFlBQVksR0FBRyxZQUFZLElBQUksV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUNsRSxDQUFDLENBQUM7QUFnREYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxPQUFnQyxFQUFtQyxFQUFFO0lBQ3BHLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDNUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUU1QixJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7UUFDbEMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELFNBQVMsS0FBSyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBRXZDLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFB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S0FBSyxTQUFTO1lBQ1osc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixNQUFNO0tBQ1Q7SUFFRCxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ2pCLFFBQVE7UUFDUixJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNqRCxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDL0MsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBZUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxPQUFrQyxFQUFFLEVBQUU7SUFDNUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUM1QixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTdCLFNBQVMsS0FBSyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBRXZDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBRS9DLE1BQU0sb0JBQW9CLEdBQUcsUUFBUTtTQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNULElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFbEMsT0FBTyxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQztTQUNELE1BQU0sQ0FBQyxPQUFPLENBQStCLENBQUM7SUFFakQsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vY2xhbXAudXRpbCc7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50Q2FuU2Nyb2xsID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb24/OiAneCcgfCAneScpID0+IHtcbiAgY29uc3QgeyBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCwgc2Nyb2xsV2lkdGgsIGNsaWVudFdpZHRoIH0gPSBlbGVtZW50O1xuXG4gIGlmIChkaXJlY3Rpb24gPT09ICd4Jykge1xuICAgIHJldHVybiBzY3JvbGxXaWR0aCA+IGNsaWVudFdpZHRoO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3knKSB7XG4gICAgcmV0dXJuIHNjcm9sbEhlaWdodCA+IGNsaWVudEhlaWdodDtcbiAgfVxuXG4gIHJldHVybiBzY3JvbGxIZWlnaHQgPiBjbGllbnRIZWlnaHQgfHwgc2Nyb2xsV2lkdGggPiBjbGllbnRXaWR0aDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXNFbGVtZW50VmlzaWJsZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gY2hlY2sgaWYgaXQgaXMgdmlzaWJsZSBpbnNpZGUgYSBjb250YWluZXIuXG4gICAqL1xuICBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRvIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW5zaWRlLlxuICAgKiBAZGVmYXVsdCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcbiAgICovXG4gIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lcidzIHJlY3QgdG8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbnNpZGUuIENhbiBiZSBzdXBwbGllZCB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBET00gcmVhZHMuXG4gICAqIEBkZWZhdWx0IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgKi9cbiAgY29udGFpbmVyUmVjdD86IERPTVJlY3QgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIGlubGluZSBkaXJlY3Rpb24uXG4gICAqL1xuICBpbmxpbmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgYmxvY2sgZGlyZWN0aW9uLlxuICAgKi9cbiAgYmxvY2s6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgdmlzaWJsZSBpbiB0aGUgaW5saW5lIGRpcmVjdGlvbi5cbiAgICovXG4gIGlubGluZUludGVyc2VjdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgZWxlbWVudCB0aGF0IGlzIHZpc2libGUgaW4gdGhlIGJsb2NrIGRpcmVjdGlvbi5cbiAgICovXG4gIGJsb2NrSW50ZXJzZWN0aW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRoYXQgaXMgYmVpbmcgY2hlY2tlZCBmb3IgdmlzaWJpbGl0eS5cbiAgICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgaXNFbGVtZW50VmlzaWJsZSA9IChvcHRpb25zOiBJc0VsZW1lbnRWaXNpYmxlT3B0aW9ucyk6IEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eSB8IG51bGwgPT4ge1xuICBsZXQgeyBjb250YWluZXIgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHsgZWxlbWVudCB9ID0gb3B0aW9ucztcblxuICBpZiAoIWVsZW1lbnQgfHwgY29udGFpbmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb250YWluZXIgfHw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICBjb25zdCBjYW5TY3JvbGwgPSBlbGVtZW50Q2FuU2Nyb2xsKGNvbnRhaW5lcik7XG5cbiAgaWYgKCFjYW5TY3JvbGwpIHtcbiAgICByZXR1cm4geyBpbmxpbmU6IHRydWUsIGJsb2NrOiB0cnVlLCBibG9ja0ludGVyc2VjdGlvbjogMTAwLCBpbmxpbmVJbnRlcnNlY3Rpb246IDEwMCwgZWxlbWVudCB9O1xuICB9XG5cbiAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBjb250YWluZXJSZWN0ID0gb3B0aW9ucy5jb250YWluZXJSZWN0IHx8IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICBjb25zdCBlbGVtZW50SW5saW5lU3RhcnQgPSBlbGVtZW50UmVjdC5sZWZ0O1xuICBjb25zdCBlbGVtZW50QmxvY2tTdGFydCA9IGVsZW1lbnRSZWN0LnRvcDtcblxuICBjb25zdCBjb250YWluZXJJbmxpbmVTdGFydCA9IGNvbnRhaW5lclJlY3QubGVmdDtcbiAgY29uc3QgY29udGFpbmVyQmxvY2tTdGFydCA9IGNvbnRhaW5lclJlY3QudG9wO1xuXG4gIGNvbnN0IGVsZW1lbnRJbmxpbmVFbmQgPSBlbGVtZW50SW5saW5lU3RhcnQgKyBlbGVtZW50UmVjdC53aWR0aDtcbiAgY29uc3QgZWxlbWVudEJsb2NrRW5kID0gZWxlbWVudEJsb2NrU3RhcnQgKyBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgY29uc3QgY29udGFpbmVySW5saW5lRW5kID0gY29udGFpbmVySW5saW5lU3RhcnQgKyBjb250YWluZXJSZWN0LndpZHRoO1xuICBjb25zdCBjb250YWluZXJCbG9ja0VuZCA9IGNvbnRhaW5lckJsb2NrU3RhcnQgKyBjb250YWluZXJSZWN0LmhlaWdodDtcblxuICBjb25zdCBpc0VsZW1lbnRJbmxpbmVWaXNpYmxlID0gZWxlbWVudElubGluZVN0YXJ0ID49IGNvbnRhaW5lcklubGluZVN0YXJ0ICYmIGVsZW1lbnRJbmxpbmVFbmQgPD0gY29udGFpbmVySW5saW5lRW5kO1xuICBjb25zdCBpc0VsZW1lbnRCbG9ja1Zpc2libGUgPSBlbGVtZW50QmxvY2tTdGFydCA+PSBjb250YWluZXJCbG9ja1N0YXJ0ICYmIGVsZW1lbnRCbG9ja0VuZCA8PSBjb250YWluZXJCbG9ja0VuZDtcblxuICBjb25zdCBpbmxpbmVJbnRlcnNlY3Rpb24gPVxuICAgIE1hdGgubWluKGVsZW1lbnRJbmxpbmVFbmQsIGNvbnRhaW5lcklubGluZUVuZCkgLSBNYXRoLm1heChlbGVtZW50SW5saW5lU3RhcnQsIGNvbnRhaW5lcklubGluZVN0YXJ0KTtcbiAgY29uc3QgYmxvY2tJbnRlcnNlY3Rpb24gPVxuICAgIE1hdGgubWluKGVsZW1lbnRCbG9ja0VuZCwgY29udGFpbmVyQmxvY2tFbmQpIC0gTWF0aC5tYXgoZWxlbWVudEJsb2NrU3RhcnQsIGNvbnRhaW5lckJsb2NrU3RhcnQpO1xuXG4gIGNvbnN0IGlubGluZUludGVyc2VjdGlvblBlcmNlbnRhZ2UgPSBjbGFtcCgoaW5saW5lSW50ZXJzZWN0aW9uIC8gZWxlbWVudFJlY3Qud2lkdGgpICogMTAwKTtcbiAgY29uc3QgYmxvY2tJbnRlcnNlY3Rpb25QZXJjZW50YWdlID0gY2xhbXAoKGJsb2NrSW50ZXJzZWN0aW9uIC8gZWxlbWVudFJlY3QuaGVpZ2h0KSAqIDEwMCk7XG5cbiAgcmV0dXJuIHtcbiAgICBpbmxpbmU6IGlzRWxlbWVudElubGluZVZpc2libGUsXG4gICAgYmxvY2s6IGlzRWxlbWVudEJsb2NrVmlzaWJsZSxcbiAgICBpbmxpbmVJbnRlcnNlY3Rpb246IGlubGluZUludGVyc2VjdGlvblBlcmNlbnRhZ2UsXG4gICAgYmxvY2tJbnRlcnNlY3Rpb246IGJsb2NrSW50ZXJzZWN0aW9uUGVyY2VudGFnZSxcbiAgICBlbGVtZW50LFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxUb0VsZW1lbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIHNjcm9sbCB0by5cbiAgICovXG4gIGVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzY3JvbGwgY29udGFpbmVyIHRvIHNjcm9sbCB0byB0aGUgZWxlbWVudCBpbi5cbiAgICogQGRlZmF1bHQgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAqL1xuICBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rpb24gdG8gc2Nyb2xsIGluLlxuICAgKiBAZGVmYXVsdCAnYm90aCdcbiAgICovXG4gIGRpcmVjdGlvbj86ICdpbmxpbmUnIHwgJ2Jsb2NrJyB8ICdib3RoJztcblxuICAvKipcbiAgICogVGhlIG9yaWdpbiBvZiB0aGUgZWxlbWVudCB0byBzY3JvbGwgdG8uXG4gICAqIEBkZWZhdWx0ICduZWFyZXN0J1xuICAgKi9cbiAgb3JpZ2luPzogJ3N0YXJ0JyB8ICdlbmQnIHwgJ2NlbnRlcicgfCAnbmVhcmVzdCc7XG5cbiAgLyoqXG4gICAqIFRoZSBzY3JvbGwgYmVoYXZpb3IuXG4gICAqIEBkZWZhdWx0ICdzbW9vdGgnXG4gICAqL1xuICBiZWhhdmlvcj86IFNjcm9sbEJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Nyb2xsIGlubGluZS1tYXJnaW5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgc2Nyb2xsSW5saW5lTWFyZ2luPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Nyb2xsIGJsb2NrLW1hcmdpblxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBzY3JvbGxCbG9ja01hcmdpbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IHNjcm9sbFRvRWxlbWVudCA9IChvcHRpb25zOiBTY3JvbGxUb0VsZW1lbnRPcHRpb25zKSA9PiB7XG4gIGxldCB7IGNvbnRhaW5lciB9ID0gb3B0aW9ucztcbiAgY29uc3Qge1xuICAgIGVsZW1lbnQsXG4gICAgZGlyZWN0aW9uLFxuICAgIGJlaGF2aW9yID0gJ3Ntb290aCcsXG4gICAgb3JpZ2luID0gJ25lYXJlc3QnLFxuICAgIHNjcm9sbEJsb2NrTWFyZ2luID0gMCxcbiAgICBzY3JvbGxJbmxpbmVNYXJnaW4gPSAwLFxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIWVsZW1lbnQgfHwgY29udGFpbmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29udGFpbmVyIHx8PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgY29uc3QgY2FuU2Nyb2xsID0gZWxlbWVudENhblNjcm9sbChjb250YWluZXIpO1xuXG4gIGlmICghY2FuU2Nyb2xsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIGNvbnN0IHsgc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wIH0gPSBjb250YWluZXI7XG4gIGNvbnN0IHsgd2lkdGg6IGVsZW1lbnRXaWR0aCwgaGVpZ2h0OiBlbGVtZW50SGVpZ2h0LCBsZWZ0OiBlbGVtZW50TGVmdCwgdG9wOiBlbGVtZW50VG9wIH0gPSBlbGVtZW50UmVjdDtcbiAgY29uc3QgeyB3aWR0aDogY29udGFpbmVyV2lkdGgsIGhlaWdodDogY29udGFpbmVySGVpZ2h0LCBsZWZ0OiBjb250YWluZXJMZWZ0LCB0b3A6IGNvbnRhaW5lclRvcCB9ID0gY29udGFpbmVyUmVjdDtcblxuICBjb25zdCBzaG91bGRTY3JvbGxMZWZ0ID0gZGlyZWN0aW9uID09PSAnaW5saW5lJyB8fCBkaXJlY3Rpb24gPT09ICdib3RoJyB8fCAhZGlyZWN0aW9uO1xuICBjb25zdCBzaG91bGRTY3JvbGxUb3AgPSBkaXJlY3Rpb24gPT09ICdibG9jaycgfHwgZGlyZWN0aW9uID09PSAnYm90aCcgfHwgIWRpcmVjdGlvbjtcblxuICBsZXQgc2Nyb2xsTGVmdFRvID0gc2Nyb2xsTGVmdDtcbiAgbGV0IHNjcm9sbFRvcFRvID0gc2Nyb2xsVG9wO1xuXG4gIGNvbnN0IHNjcm9sbFRvRWxlbWVudFN0YXJ0ID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlVG9wID0gZWxlbWVudFRvcCAtIGNvbnRhaW5lclRvcDtcbiAgICBjb25zdCByZWxhdGl2ZUxlZnQgPSBlbGVtZW50TGVmdCAtIGNvbnRhaW5lckxlZnQ7XG5cbiAgICBjb25zdCBhbW91bnRUb1Njcm9sbFRvcCA9IHJlbGF0aXZlVG9wO1xuICAgIGNvbnN0IGFtb3VudFRvU2Nyb2xsTGVmdCA9IHJlbGF0aXZlTGVmdDtcblxuICAgIGNvbnN0IHNjcm9sbFRvcFBvc2l0aW9uID0gc2Nyb2xsVG9wICsgYW1vdW50VG9TY3JvbGxUb3A7XG4gICAgY29uc3Qgc2Nyb2xsTGVmdFBvc2l0aW9uID0gc2Nyb2xsTGVmdCArIGFtb3VudFRvU2Nyb2xsTGVmdDtcblxuICAgIHNjcm9sbExlZnRUbyA9IHNjcm9sbExlZnRQb3NpdGlvbiAtIHNjcm9sbElubGluZU1hcmdpbjtcbiAgICBzY3JvbGxUb3BUbyA9IHNjcm9sbFRvcFBvc2l0aW9uIC0gc2Nyb2xsQmxvY2tNYXJnaW47XG4gIH07XG5cbiAgY29uc3Qgc2Nyb2xsVG9FbGVtZW50RW5kID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlVG9wID0gZWxlbWVudFRvcCAtIGNvbnRhaW5lclRvcDtcbiAgICBjb25zdCByZWxhdGl2ZUxlZnQgPSBlbGVtZW50TGVmdCAtIGNvbnRhaW5lckxlZnQ7XG5cbiAgICBjb25zdCBhbW91bnRUb1Njcm9sbFRvcCA9IHJlbGF0aXZlVG9wIC0gY29udGFpbmVySGVpZ2h0ICsgZWxlbWVudEhlaWdodDtcbiAgICBjb25zdCBhbW91bnRUb1Njcm9sbExlZnQgPSByZWxhdGl2ZUxlZnQgLSBjb250YWluZXJXaWR0aCArIGVsZW1lbnRXaWR0aDtcblxuICAgIGNvbnN0IHNjcm9sbFRvcFBvc2l0aW9uID0gc2Nyb2xsVG9wICsgYW1vdW50VG9TY3JvbGxUb3A7XG4gICAgY29uc3Qgc2Nyb2xsTGVmdFBvc2l0aW9uID0gc2Nyb2xsTGVmdCArIGFtb3VudFRvU2Nyb2xsTGVmdDtcblxuICAgIHNjcm9sbExlZnRUbyA9IHNjcm9sbExlZnRQb3NpdGlvbiArIHNjcm9sbElubGluZU1hcmdpbjtcbiAgICBzY3JvbGxUb3BUbyA9IHNjcm9sbFRvcFBvc2l0aW9uICsgc2Nyb2xsQmxvY2tNYXJnaW47XG4gIH07XG5cbiAgY29uc3Qgc2Nyb2xsVG9FbGVtZW50Q2VudGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlVG9wID0gZWxlbWVudFRvcCAtIGNvbnRhaW5lclRvcDtcbiAgICBjb25zdCByZWxhdGl2ZUxlZnQgPSBlbGVtZW50TGVmdCAtIGNvbnRhaW5lckxlZnQ7XG5cbiAgICBjb25zdCBhbW91bnRUb1Njcm9sbFRvcCA9IHJlbGF0aXZlVG9wIC0gY29udGFpbmVySGVpZ2h0IC8gMiArIGVsZW1lbnRIZWlnaHQgLyAyO1xuICAgIGNvbnN0IGFtb3VudFRvU2Nyb2xsTGVmdCA9IHJlbGF0aXZlTGVmdCAtIGNvbnRhaW5lcldpZHRoIC8gMiArIGVsZW1lbnRXaWR0aCAvIDI7XG5cbiAgICBjb25zdCBzY3JvbGxUb3BQb3NpdGlvbiA9IHNjcm9sbFRvcCArIGFtb3VudFRvU2Nyb2xsVG9wO1xuICAgIGNvbnN0IHNjcm9sbExlZnRQb3NpdGlvbiA9IHNjcm9sbExlZnQgKyBhbW91bnRUb1Njcm9sbExlZnQ7XG5cbiAgICBzY3JvbGxMZWZ0VG8gPSBzY3JvbGxMZWZ0UG9zaXRpb247XG4gICAgc2Nyb2xsVG9wVG8gPSBzY3JvbGxUb3BQb3NpdGlvbjtcbiAgfTtcblxuICBjb25zdCBzY3JvbGxUb0VsZW1lbnROZWFyZXN0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGlzQWJvdmUgPSBlbGVtZW50UmVjdC5ib3R0b20gPCBjb250YWluZXJSZWN0LnRvcDtcbiAgICBjb25zdCBpc1BhcnRpYWxBYm92ZSA9IGVsZW1lbnRSZWN0LnRvcCA8IGNvbnRhaW5lclJlY3QudG9wICYmIGVsZW1lbnRSZWN0LmJvdHRvbSA+IGNvbnRhaW5lclJlY3QudG9wO1xuXG4gICAgY29uc3QgaXNCZWxvdyA9IGVsZW1lbnRSZWN0LnRvcCA+IGNvbnRhaW5lclJlY3QuYm90dG9tO1xuICAgIGNvbnN0IGlzUGFydGlhbEJlbG93ID0gZWxlbWVudFJlY3QudG9wIDwgY29udGFpbmVyUmVjdC5ib3R0b20gJiYgZWxlbWVudFJlY3QuYm90dG9tID4gY29udGFpbmVyUmVjdC5ib3R0b207XG5cbiAgICBjb25zdCBpc0xlZnQgPSBlbGVtZW50UmVjdC5yaWdodCA8IGNvbnRhaW5lclJlY3QubGVmdDtcbiAgICBjb25zdCBpc1BhcnRpYWxMZWZ0ID0gZWxlbWVudFJlY3QubGVmdCA8IGNvbnRhaW5lclJlY3QubGVmdCAmJiBlbGVtZW50UmVjdC5yaWdodCA+IGNvbnRhaW5lclJlY3QubGVmdDtcblxuICAgIGNvbnN0IGlzUmlnaHQgPSBlbGVtZW50UmVjdC5sZWZ0ID4gY29udGFpbmVyUmVjdC5yaWdodDtcbiAgICBjb25zdCBpc1BhcnRpYWxSaWdodCA9IGVsZW1lbnRSZWN0LmxlZnQgPCBjb250YWluZXJSZWN0LnJpZ2h0ICYmIGVsZW1lbnRSZWN0LnJpZ2h0ID4gY29udGFpbmVyUmVjdC5yaWdodDtcblxuICAgIGlmIChpc0Fib3ZlIHx8IGlzUGFydGlhbEFib3ZlIHx8IGlzTGVmdCB8fCBpc1BhcnRpYWxMZWZ0KSB7XG4gICAgICBzY3JvbGxUb0VsZW1lbnRTdGFydCgpO1xuICAgIH0gZWxzZSBpZiAoaXNCZWxvdyB8fCBpc1BhcnRpYWxCZWxvdyB8fCBpc1JpZ2h0IHx8IGlzUGFydGlhbFJpZ2h0KSB7XG4gICAgICBzY3JvbGxUb0VsZW1lbnRFbmQoKTtcbiAgICB9XG4gIH07XG5cbiAgc3dpdGNoIChvcmlnaW4pIHtcbiAgICBjYXNlICdzdGFydCc6XG4gICAgICBzY3JvbGxUb0VsZW1lbnRTdGFydCgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5kJzpcbiAgICAgIHNjcm9sbFRvRWxlbWVudEVuZCgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIHNjcm9sbFRvRWxlbWVudENlbnRlcigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbmVhcmVzdCc6XG4gICAgICBzY3JvbGxUb0VsZW1lbnROZWFyZXN0KCk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnRhaW5lci5zY3JvbGxUbyh7XG4gICAgYmVoYXZpb3IsXG4gICAgbGVmdDogc2hvdWxkU2Nyb2xsTGVmdCA/IHNjcm9sbExlZnRUbyA6IHVuZGVmaW5lZCxcbiAgICB0b3A6IHNob3VsZFNjcm9sbFRvcCA/IHNjcm9sbFRvcFRvIDogdW5kZWZpbmVkLFxuICB9KTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmlzaWJsZUVsZW1lbnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRvIGNoZWNrIGZvciB2aXNpYmxlIGVsZW1lbnRzLlxuICAgKiBAZGVmYXVsdCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcbiAgICovXG4gIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGVsZW1lbnRzIHRvIGNoZWNrIGlmIHRoZXkgYXJlIHZpc2libGUgaW5zaWRlIGEgY29udGFpbmVyLlxuICAgKi9cbiAgZWxlbWVudHM6IEhUTUxFbGVtZW50W107XG59XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50VmlzaWJsZVN0YXRlcyA9IChvcHRpb25zOiBHZXRWaXNpYmxlRWxlbWVudHNPcHRpb25zKSA9PiB7XG4gIGxldCB7IGNvbnRhaW5lciB9ID0gb3B0aW9ucztcbiAgY29uc3QgeyBlbGVtZW50cyB9ID0gb3B0aW9ucztcblxuICBjb250YWluZXIgfHw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICBjb25zdCByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIGNvbnN0IGVsZW1lbnRWaXNpYmxlU3RhdGVzID0gZWxlbWVudHNcbiAgICAubWFwKChlKSA9PiB7XG4gICAgICBpZiAoIWUgfHwgIWNvbnRhaW5lcikgcmV0dXJuIG51bGw7XG5cbiAgICAgIHJldHVybiBpc0VsZW1lbnRWaXNpYmxlKHsgY29udGFpbmVyLCBlbGVtZW50OiBlLCBjb250YWluZXJSZWN0OiByZWN0IH0pO1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKSBhcyBDdXJyZW50RWxlbWVudFZpc2liaWxpdHlbXTtcblxuICByZXR1cm4gZWxlbWVudFZpc2libGVTdGF0ZXM7XG59O1xuIl19