@tetacom/svg-charts 1.2.30 → 1.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 (32) hide show
  1. package/chart/chart/chart.component.d.ts +5 -2
  2. package/chart/chart-container/chart-container.component.d.ts +1 -1
  3. package/chart/chart-container/series/linear-series-base.d.ts +0 -1
  4. package/chart/core/axis/axis.d.ts +2 -2
  5. package/chart/directives/brushable.directive.d.ts +15 -5
  6. package/chart/directives/zoomable.directive.d.ts +6 -11
  7. package/chart/model/i-broadcast-message.d.ts +18 -19
  8. package/chart/model/marker-options.d.ts +1 -1
  9. package/chart/service/broadcast.service.d.ts +1 -4
  10. package/chart/service/brush.service.d.ts +6 -13
  11. package/chart/service/chart.service.d.ts +0 -4
  12. package/chart/service/scale.service.d.ts +1 -1
  13. package/chart/service/zoom.service.d.ts +15 -15
  14. package/esm2020/chart/chart/chart.component.mjs +17 -17
  15. package/esm2020/chart/chart-container/chart-container.component.mjs +3 -3
  16. package/esm2020/chart/chart-container/crosshair/crosshair.component.mjs +1 -2
  17. package/esm2020/chart/chart-container/series/linear-series-base.mjs +1 -68
  18. package/esm2020/chart/core/axis/axis.mjs +2 -2
  19. package/esm2020/chart/directives/brushable.directive.mjs +120 -10
  20. package/esm2020/chart/directives/zoomable.directive.mjs +90 -197
  21. package/esm2020/chart/model/i-broadcast-message.mjs +4 -6
  22. package/esm2020/chart/model/marker-options.mjs +1 -1
  23. package/esm2020/chart/service/broadcast.service.mjs +4 -17
  24. package/esm2020/chart/service/brush.service.mjs +11 -147
  25. package/esm2020/chart/service/chart.service.mjs +17 -9
  26. package/esm2020/chart/service/scale.service.mjs +19 -21
  27. package/esm2020/chart/service/zoom.service.mjs +48 -53
  28. package/fesm2015/tetacom-svg-charts.mjs +363 -578
  29. package/fesm2015/tetacom-svg-charts.mjs.map +1 -1
  30. package/fesm2020/tetacom-svg-charts.mjs +346 -558
  31. package/fesm2020/tetacom-svg-charts.mjs.map +1 -1
  32. package/package.json +1 -1
@@ -1,34 +1,144 @@
1
1
  import { Directive, Input, } from '@angular/core';
2
+ import { BrushType } from '../model/enum/brush-type';
3
+ import * as d3 from 'd3';
4
+ import { BrushMessage } from '../model/i-broadcast-message';
5
+ import { filter, takeWhile } from 'rxjs';
2
6
  import * as i0 from "@angular/core";
3
7
  import * as i1 from "../service/brush.service";
4
8
  import * as i2 from "../service/chart.service";
5
9
  export class BrushableDirective {
6
- constructor(brushService, chartService, element) {
10
+ constructor(brushService, chartService, element, zone) {
7
11
  this.brushService = brushService;
8
12
  this.chartService = chartService;
9
13
  this.element = element;
14
+ this.zone = zone;
15
+ this.brushMap = new Map()
16
+ .set(BrushType.x, d3.brushX())
17
+ .set(BrushType.y, d3.brushY());
18
+ this._alive = true;
19
+ this._container = d3.select(this.element.nativeElement);
20
+ }
21
+ ngOnInit() {
22
+ this.brushService.brushDomain.pipe(takeWhile(() => this._alive), filter((brush) => brush.chartId !== this.config.id)).subscribe((brush) => {
23
+ this._container.call(this.brush.move, [
24
+ Math.floor(brush.selection[0]),
25
+ Math.floor(brush.selection[1]),
26
+ ].map(this.axis.scale));
27
+ });
28
+ }
29
+ ngOnDestroy() {
30
+ this._alive = false;
31
+ }
32
+ ngAfterViewInit() {
10
33
  }
11
- ngOnInit() { }
12
- ngAfterViewInit() { }
13
34
  ngOnChanges(changes) {
14
35
  if (changes.hasOwnProperty('config')) {
15
- this.brushService.clearPreviousSelection();
36
+ this.clearPreviousSelection();
16
37
  }
17
38
  if (this.config?.brush?.enable) {
18
- this.brushService.applyBrush(this.element, this.config, this.brushScale);
39
+ this.applyBrush(this.config, this.axis.scale);
19
40
  }
20
41
  }
42
+ applyBrush(config, brushScale) {
43
+ this.brush?.on('start brush end', null);
44
+ if (config.brush?.enable) {
45
+ this.brush = this.brushMap.get(config?.brush?.type ?? BrushType.x);
46
+ this.brush.on('start brush end', (_) => {
47
+ if (_.sourceEvent) {
48
+ if (!_.selection)
49
+ return;
50
+ const [from, to] = _.selection;
51
+ if (to - from === 0) {
52
+ const selection = this.selection?.map(brushScale) ??
53
+ [config.brush?.from, config.brush?.to].map(brushScale);
54
+ const halfBrushHeight = (selection[1] - selection[0]) / 2;
55
+ const invertedSelection = [
56
+ from - halfBrushHeight,
57
+ to + halfBrushHeight,
58
+ ].map(brushScale.invert);
59
+ if (invertedSelection[1] - invertedSelection[0] >
60
+ config.brush?.max) {
61
+ this._container.call(this.brush.move, [
62
+ Math.floor(invertedSelection[0]),
63
+ Math.floor(invertedSelection[0] + config.brush?.max),
64
+ ].map(brushScale));
65
+ return;
66
+ }
67
+ if (invertedSelection[1] - invertedSelection[0] <
68
+ config.brush?.min) {
69
+ this._container.call(this.brush.move, [
70
+ Math.floor(invertedSelection[0]),
71
+ Math.ceil(invertedSelection[0] + config.brush?.min),
72
+ ].map(brushScale));
73
+ return;
74
+ }
75
+ this._container.call(this.brush.move, [
76
+ from - halfBrushHeight,
77
+ to + halfBrushHeight,
78
+ ]);
79
+ return;
80
+ }
81
+ if (brushScale.invert(to) - brushScale.invert(from) >
82
+ config.brush?.max) {
83
+ this._container.call(this.brush.move, this.selection
84
+ ? [
85
+ this.selection[0],
86
+ this.selection[0] + config.brush?.max,
87
+ ].map(brushScale)
88
+ : [config.brush?.from, config.brush?.to].map(brushScale));
89
+ return;
90
+ }
91
+ if (brushScale.invert(to) - brushScale.invert(from) <
92
+ config.brush?.min) {
93
+ this._container.call(this.brush.move, this.selection
94
+ ? [
95
+ this.selection[0],
96
+ this.selection[0] + config.brush?.min,
97
+ ].map(brushScale)
98
+ : [config.brush?.from, config.brush?.to].map(brushScale));
99
+ return;
100
+ }
101
+ if (_.sourceEvent instanceof MouseEvent) {
102
+ this.selection = _.selection.map(brushScale.invert);
103
+ }
104
+ const brushMessage = new BrushMessage({
105
+ chartId: this.config.id,
106
+ selection: [brushScale.invert(from), brushScale.invert(to)],
107
+ });
108
+ this.brushService.setBrush(brushMessage);
109
+ }
110
+ });
111
+ this.zone.runOutsideAngular(() => {
112
+ setTimeout(() => {
113
+ this._container.call(this.brush);
114
+ let domain = brushScale.domain();
115
+ if (config?.brush?.from) {
116
+ domain[0] = config.brush.from;
117
+ }
118
+ if (config?.brush?.to) {
119
+ domain[1] = config.brush.to;
120
+ }
121
+ this._container.call(this.brush.move, this.selection
122
+ ? this.selection.map(brushScale)
123
+ : domain.map(brushScale), {});
124
+ }, 0);
125
+ });
126
+ }
127
+ }
128
+ clearPreviousSelection() {
129
+ this.selection = null;
130
+ }
21
131
  }
22
- BrushableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: BrushableDirective, deps: [{ token: i1.BrushService }, { token: i2.ChartService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
23
- BrushableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.2", type: BrushableDirective, selector: "[tetaBrushable]", inputs: { config: "config", brushScale: "brushScale" }, usesOnChanges: true, ngImport: i0 });
132
+ BrushableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: BrushableDirective, deps: [{ token: i1.BrushService }, { token: i2.ChartService }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
133
+ BrushableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.2", type: BrushableDirective, selector: "[tetaBrushable]", inputs: { config: "config", axis: "axis" }, usesOnChanges: true, ngImport: i0 });
24
134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: BrushableDirective, decorators: [{
25
135
  type: Directive,
26
136
  args: [{
27
137
  selector: '[tetaBrushable]',
28
138
  }]
29
- }], ctorParameters: function () { return [{ type: i1.BrushService }, { type: i2.ChartService }, { type: i0.ElementRef }]; }, propDecorators: { config: [{
139
+ }], ctorParameters: function () { return [{ type: i1.BrushService }, { type: i2.ChartService }, { type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { config: [{
30
140
  type: Input
31
- }], brushScale: [{
141
+ }], axis: [{
32
142
  type: Input
33
143
  }] } });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ1c2hhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9kaXJlY3RpdmVzL2JydXNoYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxLQUFLLEdBR04sTUFBTSxlQUFlLENBQUM7Ozs7QUFRdkIsTUFBTSxPQUFPLGtCQUFrQjtJQUk3QixZQUNVLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLE9BQW1CO1FBRm5CLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFlBQU8sR0FBUCxPQUFPLENBQVk7SUFDMUIsQ0FBQztJQUVKLFFBQVEsS0FBSSxDQUFDO0lBQ2IsZUFBZSxLQUFJLENBQUM7SUFFcEIsV0FBVyxDQUFDLE9BQXNCO1FBRWhDLElBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDNUM7UUFFRCxJQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDMUIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7U0FDSDtJQUNILENBQUM7OytHQTFCVSxrQkFBa0I7bUdBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUg5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7aUJBQzVCO3VKQUVVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDaGFydENvbmZpZyB9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtY29uZmlnJztcbmltcG9ydCB7IEJydXNoU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvYnJ1c2guc2VydmljZSc7XG5pbXBvcnQgeyBDaGFydFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2NoYXJ0LnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdGV0YUJydXNoYWJsZV0nLFxufSlcbmV4cG9ydCBjbGFzcyBCcnVzaGFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBjb25maWc6IElDaGFydENvbmZpZztcbiAgQElucHV0KCkgYnJ1c2hTY2FsZTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYnJ1c2hTZXJ2aWNlOiBCcnVzaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFydFNlcnZpY2U6IENoYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge31cbiAgbmdBZnRlclZpZXdJbml0KCkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG5cbiAgICBpZihjaGFuZ2VzLmhhc093blByb3BlcnR5KCdjb25maWcnKSkge1xuICAgICAgdGhpcy5icnVzaFNlcnZpY2UuY2xlYXJQcmV2aW91c1NlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIGlmKHRoaXMuY29uZmlnPy5icnVzaD8uZW5hYmxlKSB7XG4gICAgICB0aGlzLmJydXNoU2VydmljZS5hcHBseUJydXNoKFxuICAgICAgICB0aGlzLmVsZW1lbnQsXG4gICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICB0aGlzLmJydXNoU2NhbGVcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ1c2hhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9kaXJlY3RpdmVzL2JydXNoYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxLQUFLLEdBR04sTUFBTSxlQUFlLENBQUM7QUFLdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7OztBQUt2QyxNQUFNLE9BQU8sa0JBQWtCO0lBWTdCLFlBQ1UsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsT0FBbUIsRUFDbkIsSUFBWTtRQUhaLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQVZkLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBb0M7YUFDM0QsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQzdCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFTcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ2hDLFNBQVMsQ0FB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QUFDLENBQUMsQ0FBQztZQUNSLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7OytHQXJMVSxrQkFBa0I7bUdBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUg5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7aUJBQzVCOzRLQUVVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtJQ2hhcnRDb25maWd9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtY29uZmlnJztcbmltcG9ydCB7QnJ1c2hTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlL2JydXNoLnNlcnZpY2UnO1xuaW1wb3J0IHtDaGFydFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2UvY2hhcnQuc2VydmljZSc7XG5pbXBvcnQge0F4aXN9IGZyb20gJy4uL2NvcmUvYXhpcy9heGlzJztcbmltcG9ydCB7QnJ1c2hUeXBlfSBmcm9tICcuLi9tb2RlbC9lbnVtL2JydXNoLXR5cGUnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHtCcnVzaE1lc3NhZ2V9IGZyb20gJy4uL21vZGVsL2ktYnJvYWRjYXN0LW1lc3NhZ2UnO1xuaW1wb3J0IHtmaWx0ZXIsIHRha2VXaGlsZX0gZnJvbSAncnhqcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1t0ZXRhQnJ1c2hhYmxlXScsXG59KVxuZXhwb3J0IGNsYXNzIEJydXNoYWJsZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWc6IElDaGFydENvbmZpZztcbiAgQElucHV0KCkgYXhpczogQXhpcztcblxuICBwcml2YXRlIHNlbGVjdGlvbjogbnVtYmVyW107XG4gIHByaXZhdGUgYnJ1c2g6IGQzLkJydXNoQmVoYXZpb3I8YW55PjtcbiAgcHJpdmF0ZSBicnVzaE1hcCA9IG5ldyBNYXA8QnJ1c2hUeXBlLCBkMy5CcnVzaEJlaGF2aW9yPGFueT4+KClcbiAgICAuc2V0KEJydXNoVHlwZS54LCBkMy5icnVzaFgoKSlcbiAgICAuc2V0KEJydXNoVHlwZS55LCBkMy5icnVzaFkoKSk7XG4gIHByaXZhdGUgX2FsaXZlID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfY29udGFpbmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYnJ1c2hTZXJ2aWNlOiBCcnVzaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFydFNlcnZpY2U6IENoYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgdGhpcy5fY29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYnJ1c2hTZXJ2aWNlLmJydXNoRG9tYWluLnBpcGUoXG4gICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpLFxuICAgICAgZmlsdGVyKChicnVzaCkgPT4gYnJ1c2guY2hhcnRJZCAhPT0gdGhpcy5jb25maWcuaWQpXG4gICAgKS5zdWJzY3JpYmUoKGJydXNoKSA9PiB7XG4gICAgICB0aGlzLl9jb250YWluZXIuY2FsbChcbiAgICAgICAgdGhpcy5icnVzaC5tb3ZlLFxuICAgICAgICBbXG4gICAgICAgICAgTWF0aC5mbG9vcihicnVzaC5zZWxlY3Rpb25bMF0pLFxuICAgICAgICAgIE1hdGguZmxvb3IoYnJ1c2guc2VsZWN0aW9uWzFdKSxcbiAgICAgICAgXS5tYXAodGhpcy5heGlzLnNjYWxlKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2FsaXZlID0gZmFsc2U7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2NvbmZpZycpKSB7XG4gICAgICB0aGlzLmNsZWFyUHJldmlvdXNTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWc/LmJydXNoPy5lbmFibGUpIHtcbiAgICAgIHRoaXMuYXBwbHlCcnVzaChcbiAgICAgICAgdGhpcy5jb25maWcsXG4gICAgICAgIHRoaXMuYXhpcy5zY2FsZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUJydXNoKGNvbmZpZzogSUNoYXJ0Q29uZmlnLCBicnVzaFNjYWxlOiBhbnkpIHtcbiAgICB0aGlzLmJydXNoPy5vbignc3RhcnQgYnJ1c2ggZW5kJywgbnVsbCk7XG4gICAgaWYgKGNvbmZpZy5icnVzaD8uZW5hYmxlKSB7XG4gICAgICB0aGlzLmJydXNoID0gdGhpcy5icnVzaE1hcC5nZXQoY29uZmlnPy5icnVzaD8udHlwZSA/PyBCcnVzaFR5cGUueCk7XG4gICAgICB0aGlzLmJydXNoLm9uKCdzdGFydCBicnVzaCBlbmQnLCAoXzogZDMuRDNCcnVzaEV2ZW50PGFueT4pID0+IHtcbiAgICAgICAgaWYgKF8uc291cmNlRXZlbnQpIHtcbiAgICAgICAgICBpZiAoIV8uc2VsZWN0aW9uKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgW2Zyb20sIHRvXSA9IF8uc2VsZWN0aW9uIGFzIG51bWJlcltdO1xuICAgICAgICAgIGlmICh0byAtIGZyb20gPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbjogbnVtYmVyW10gPVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbj8ubWFwKGJydXNoU2NhbGUpID8/XG4gICAgICAgICAgICAgIFtjb25maWcuYnJ1c2g/LmZyb20sIGNvbmZpZy5icnVzaD8udG9dLm1hcChicnVzaFNjYWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGhhbGZCcnVzaEhlaWdodCA9IChzZWxlY3Rpb25bMV0gLSBzZWxlY3Rpb25bMF0pIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IGludmVydGVkU2VsZWN0aW9uOiBudW1iZXJbXSA9IFtcbiAgICAgICAgICAgICAgZnJvbSAtIGhhbGZCcnVzaEhlaWdodCxcbiAgICAgICAgICAgICAgdG8gKyBoYWxmQnJ1c2hIZWlnaHQsXG4gICAgICAgICAgICBdLm1hcChicnVzaFNjYWxlLmludmVydCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgaW52ZXJ0ZWRTZWxlY3Rpb25bMV0gLSBpbnZlcnRlZFNlbGVjdGlvblswXSA+XG4gICAgICAgICAgICAgIGNvbmZpZy5icnVzaD8ubWF4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNhbGwoXG4gICAgICAgICAgICAgICAgdGhpcy5icnVzaC5tb3ZlLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoaW52ZXJ0ZWRTZWxlY3Rpb25bMF0pLFxuICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihpbnZlcnRlZFNlbGVjdGlvblswXSArIGNvbmZpZy5icnVzaD8ubWF4KSxcbiAgICAgICAgICAgICAgICBdLm1hcChicnVzaFNjYWxlKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgaW52ZXJ0ZWRTZWxlY3Rpb25bMV0gLSBpbnZlcnRlZFNlbGVjdGlvblswXSA8XG4gICAgICAgICAgICAgIGNvbmZpZy5icnVzaD8ubWluXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNhbGwoXG4gICAgICAgICAgICAgICAgdGhpcy5icnVzaC5tb3ZlLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoaW52ZXJ0ZWRTZWxlY3Rpb25bMF0pLFxuICAgICAgICAgICAgICAgICAgTWF0aC5jZWlsKGludmVydGVkU2VsZWN0aW9uWzBdICsgY29uZmlnLmJydXNoPy5taW4pLFxuICAgICAgICAgICAgICAgIF0ubWFwKGJydXNoU2NhbGUpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNhbGwodGhpcy5icnVzaC5tb3ZlLCBbXG4gICAgICAgICAgICAgIGZyb20gLSBoYWxmQnJ1c2hIZWlnaHQsXG4gICAgICAgICAgICAgIHRvICsgaGFsZkJydXNoSGVpZ2h0LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYnJ1c2hTY2FsZS5pbnZlcnQodG8pIC0gYnJ1c2hTY2FsZS5pbnZlcnQoZnJvbSkgPlxuICAgICAgICAgICAgY29uZmlnLmJydXNoPy5tYXhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jYWxsKFxuICAgICAgICAgICAgICB0aGlzLmJydXNoLm1vdmUsXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblswXSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uWzBdICsgY29uZmlnLmJydXNoPy5tYXgsXG4gICAgICAgICAgICAgICAgXS5tYXAoYnJ1c2hTY2FsZSlcbiAgICAgICAgICAgICAgICA6IFtjb25maWcuYnJ1c2g/LmZyb20sIGNvbmZpZy5icnVzaD8udG9dLm1hcChicnVzaFNjYWxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBicnVzaFNjYWxlLmludmVydCh0bykgLSBicnVzaFNjYWxlLmludmVydChmcm9tKSA8XG4gICAgICAgICAgICBjb25maWcuYnJ1c2g/Lm1pblxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNhbGwoXG4gICAgICAgICAgICAgIHRoaXMuYnJ1c2gubW92ZSxcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25cbiAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uWzBdLFxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25bMF0gKyBjb25maWcuYnJ1c2g/Lm1pbixcbiAgICAgICAgICAgICAgICBdLm1hcChicnVzaFNjYWxlKVxuICAgICAgICAgICAgICAgIDogW2NvbmZpZy5icnVzaD8uZnJvbSwgY29uZmlnLmJydXNoPy50b10ubWFwKGJydXNoU2NhbGUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfLnNvdXJjZUV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBfLnNlbGVjdGlvbi5tYXAoYnJ1c2hTY2FsZS5pbnZlcnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJydXNoTWVzc2FnZSA9IG5ldyBCcnVzaE1lc3NhZ2Uoe1xuICAgICAgICAgICAgY2hhcnRJZDogdGhpcy5jb25maWcuaWQsXG4gICAgICAgICAgICBzZWxlY3Rpb246IFticnVzaFNjYWxlLmludmVydChmcm9tKSwgYnJ1c2hTY2FsZS5pbnZlcnQodG8pXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmJydXNoU2VydmljZS5zZXRCcnVzaChicnVzaE1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNhbGwodGhpcy5icnVzaCk7XG5cbiAgICAgICAgICBsZXQgZG9tYWluID0gYnJ1c2hTY2FsZS5kb21haW4oKTtcblxuICAgICAgICAgIGlmIChjb25maWc/LmJydXNoPy5mcm9tKSB7XG4gICAgICAgICAgICBkb21haW5bMF0gPSBjb25maWcuYnJ1c2guZnJvbTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29uZmlnPy5icnVzaD8udG8pIHtcbiAgICAgICAgICAgIGRvbWFpblsxXSA9IGNvbmZpZy5icnVzaC50bztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMuYnJ1c2gubW92ZSxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uXG4gICAgICAgICAgICAgID8gdGhpcy5zZWxlY3Rpb24ubWFwKGJydXNoU2NhbGUpXG4gICAgICAgICAgICAgIDogZG9tYWluLm1hcChicnVzaFNjYWxlKSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjbGVhclByZXZpb3VzU2VsZWN0aW9uKCkge1xuICAgIHRoaXMuc2VsZWN0aW9uID0gbnVsbDtcbiAgfVxufVxuIl19