@loxia/imx-viewer 13.3.2 → 13.3.3
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 +3 -0
- package/components/imx-viewer.component.d.ts +5 -2
- package/esm2022/components/imx-viewer.component.mjs +27 -11
- package/esm2022/model/pan-event.mjs +2 -0
- package/fesm2022/loxia-imx-viewer.mjs +26 -10
- package/fesm2022/loxia-imx-viewer.mjs.map +1 -1
- package/model/pan-event.d.ts +4 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -104,6 +104,9 @@ Met de onderstaande css kan de default breedte van een clickarea aangepast worde
|
|
|
104
104
|
|
|
105
105
|
### <!--next.version--> <!--next.release-date-->
|
|
106
106
|
|
|
107
|
+
### 13.3.3 26-08-2024
|
|
108
|
+
* PITS-617 Pits needs to store and reset scroll position, so pan event emitted from imx-viewer.
|
|
109
|
+
|
|
107
110
|
### 13.3.2 13-08-2024
|
|
108
111
|
* add missing font size to dgn.css
|
|
109
112
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
2
|
import { ElementRef, EventEmitter, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges } from '@angular/core';
|
|
3
3
|
import SvgPanZoom from 'svg-pan-zoom';
|
|
4
|
+
import { PanEvent } from '../model/pan-event';
|
|
4
5
|
import { PopoverInfo } from '../model/popover-info';
|
|
5
6
|
import { SelectieEvent } from '../model/selectie-event';
|
|
6
7
|
import { SelectieInfo } from '../model/selectie-info';
|
|
@@ -39,9 +40,11 @@ export declare class ImxViewerComponent implements OnChanges, OnInit, OnDestroy
|
|
|
39
40
|
clickHandler: EventEmitter<SelectieEvent>;
|
|
40
41
|
rightClickHandler: EventEmitter<SelectieEvent>;
|
|
41
42
|
svgLoaded: EventEmitter<void>;
|
|
43
|
+
panned: EventEmitter<PanEvent>;
|
|
42
44
|
private svgGeladen;
|
|
43
45
|
private eventListeners;
|
|
44
46
|
private svgPanZoomRef;
|
|
47
|
+
private ignorePanEventBecauseReload;
|
|
45
48
|
constructor(document: any, http: HttpClient, clickAreaService: ClickareaService, puicHelper: PuicHelperService, renderer: Renderer2, svgCoordinatesService: SvgCoordinatesService);
|
|
46
49
|
ngOnInit(): void;
|
|
47
50
|
onResize(): void;
|
|
@@ -69,7 +72,7 @@ export declare class ImxViewerComponent implements OnChanges, OnInit, OnDestroy
|
|
|
69
72
|
private addMouseoverEventHandlerToElements;
|
|
70
73
|
private concatenateSvgs;
|
|
71
74
|
private flagErrors;
|
|
72
|
-
private
|
|
75
|
+
private removeOldListeners;
|
|
73
76
|
private selectElements;
|
|
74
77
|
private static setDefaultCursor;
|
|
75
78
|
private showPopup;
|
|
@@ -77,7 +80,7 @@ export declare class ImxViewerComponent implements OnChanges, OnInit, OnDestroy
|
|
|
77
80
|
private delayedClickAreaCreation;
|
|
78
81
|
private getSvgParent;
|
|
79
82
|
static ɵfac: i0.ɵɵFactoryDeclaration<ImxViewerComponent, never>;
|
|
80
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ImxViewerComponent, "imx-viewer", never, { "useClickArea": { "alias": "useClickArea"; "required": false; }; "inlineDgnCssImport": { "alias": "inlineDgnCssImport"; "required": false; }; "svgInfo": { "alias": "svgInfo"; "required": false; }; "selectieInfos": { "alias": "selectieInfos"; "required": false; }; "clickableIds": { "alias": "clickableIds"; "required": false; }; "rightClickableIds": { "alias": "rightClickableIds"; "required": false; }; "popoverInfos": { "alias": "popoverInfos"; "required": false; }; "zoomScaleSensitivity": { "alias": "zoomScaleSensitivity"; "required": false; }; "autoAlignSvgsHorizontally": { "alias": "autoAlignSvgsHorizontally"; "required": false; }; "initialPanAndZoom": { "alias": "initialPanAndZoom"; "required": false; }; }, { "clickHandler": "clickHandler"; "rightClickHandler": "rightClickHandler"; "svgLoaded": "svgLoaded"; }, never, never, false, never>;
|
|
83
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ImxViewerComponent, "imx-viewer", never, { "useClickArea": { "alias": "useClickArea"; "required": false; }; "inlineDgnCssImport": { "alias": "inlineDgnCssImport"; "required": false; }; "svgInfo": { "alias": "svgInfo"; "required": false; }; "selectieInfos": { "alias": "selectieInfos"; "required": false; }; "clickableIds": { "alias": "clickableIds"; "required": false; }; "rightClickableIds": { "alias": "rightClickableIds"; "required": false; }; "popoverInfos": { "alias": "popoverInfos"; "required": false; }; "zoomScaleSensitivity": { "alias": "zoomScaleSensitivity"; "required": false; }; "autoAlignSvgsHorizontally": { "alias": "autoAlignSvgsHorizontally"; "required": false; }; "initialPanAndZoom": { "alias": "initialPanAndZoom"; "required": false; }; }, { "clickHandler": "clickHandler"; "rightClickHandler": "rightClickHandler"; "svgLoaded": "svgLoaded"; "panned": "panned"; }, never, never, false, never>;
|
|
81
84
|
}
|
|
82
85
|
interface XandYEnabled {
|
|
83
86
|
x: boolean;
|
|
@@ -45,8 +45,11 @@ export class ImxViewerComponent {
|
|
|
45
45
|
this.clickHandler = new EventEmitter();
|
|
46
46
|
this.rightClickHandler = new EventEmitter();
|
|
47
47
|
this.svgLoaded = new EventEmitter();
|
|
48
|
+
//Be mindful that the pan-event occurs often. Catch it with a timeout if you do heavy processing
|
|
49
|
+
this.panned = new EventEmitter();
|
|
48
50
|
this.svgGeladen = false;
|
|
49
51
|
this.eventListeners = new Map();
|
|
52
|
+
this.ignorePanEventBecauseReload = false;
|
|
50
53
|
this.getSvgPanZoomInstance = () => this.svgPanZoomRef;
|
|
51
54
|
this.hidePopOver = () => this.popoverStyle.visibility = 'hidden';
|
|
52
55
|
this.getSvgParent = () => this.svgParentRef.nativeElement;
|
|
@@ -72,6 +75,7 @@ export class ImxViewerComponent {
|
|
|
72
75
|
this.delayedClickAreaCreation();
|
|
73
76
|
}
|
|
74
77
|
if (this.svgInfo && svgInfo) {
|
|
78
|
+
this.ignorePanEventBecauseReload = true;
|
|
75
79
|
this.loadSvgs();
|
|
76
80
|
}
|
|
77
81
|
if (this.clickableIds && clickableIds && this.svgGeladen) {
|
|
@@ -112,7 +116,15 @@ export class ImxViewerComponent {
|
|
|
112
116
|
center: true,
|
|
113
117
|
dblClickZoomEnabled: false,
|
|
114
118
|
onZoom: () => this.hidePopOver(),
|
|
115
|
-
onPan: () =>
|
|
119
|
+
onPan: () => {
|
|
120
|
+
this.hidePopOver();
|
|
121
|
+
if (this.ignorePanEventBecauseReload) {
|
|
122
|
+
this.ignorePanEventBecauseReload = false;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.panned.emit({ x: this.svgPanZoomRef.getPan().x, y: this.svgPanZoomRef.getPan().y });
|
|
126
|
+
}
|
|
127
|
+
},
|
|
116
128
|
onUpdatedCTM: () => this.updateClipPath(),
|
|
117
129
|
refreshRate: 'auto'
|
|
118
130
|
});
|
|
@@ -165,7 +177,7 @@ export class ImxViewerComponent {
|
|
|
165
177
|
}`;
|
|
166
178
|
defs.innerHTML =
|
|
167
179
|
`
|
|
168
|
-
<style
|
|
180
|
+
<style> ${style} </style>
|
|
169
181
|
<clipPath id="clip-path">
|
|
170
182
|
<rect x="0" x="0" width=${this.parentWidth} height=${this.parentHeight}>
|
|
171
183
|
</clipPath>
|
|
@@ -229,16 +241,19 @@ export class ImxViewerComponent {
|
|
|
229
241
|
}
|
|
230
242
|
}
|
|
231
243
|
addClickEventHandlersToElements(clickableIds, eventtype) {
|
|
232
|
-
|
|
244
|
+
this.removeOldListeners(eventtype);
|
|
245
|
+
const listeners = new Map();
|
|
233
246
|
if (clickableIds) {
|
|
234
247
|
clickableIds.forEach(puic => {
|
|
235
248
|
const elements = this.puicHelper.getAllElementsForPuic(puic);
|
|
236
249
|
elements.forEach((element) => this.addClickEventHandlersToElement(listeners, element, eventtype, puic));
|
|
237
250
|
});
|
|
238
251
|
}
|
|
252
|
+
this.eventListeners.set(eventtype, listeners);
|
|
239
253
|
}
|
|
240
254
|
addMouseoverEventHandlerToElements() {
|
|
241
|
-
|
|
255
|
+
this.removeOldListeners('mouseover');
|
|
256
|
+
const listeners = new Map();
|
|
242
257
|
if (this.popoverInfos) {
|
|
243
258
|
this.popoverInfos.forEach(popoverInfo => {
|
|
244
259
|
popoverInfo.puicArray.forEach(puic => {
|
|
@@ -256,6 +271,7 @@ export class ImxViewerComponent {
|
|
|
256
271
|
}
|
|
257
272
|
});
|
|
258
273
|
});
|
|
274
|
+
this.eventListeners.set('mouseover', listeners);
|
|
259
275
|
}
|
|
260
276
|
}
|
|
261
277
|
concatenateSvgs(svgs) {
|
|
@@ -282,8 +298,8 @@ export class ImxViewerComponent {
|
|
|
282
298
|
console.log(error);
|
|
283
299
|
this.errors = true;
|
|
284
300
|
}
|
|
285
|
-
|
|
286
|
-
|
|
301
|
+
removeOldListeners(eventType) {
|
|
302
|
+
const listeners = this.eventListeners.get(eventType);
|
|
287
303
|
if (listeners) {
|
|
288
304
|
listeners.forEach((fn, el) => {
|
|
289
305
|
el.removeEventListener(eventType, fn);
|
|
@@ -291,9 +307,7 @@ export class ImxViewerComponent {
|
|
|
291
307
|
el.setAttribute('style', ImxViewerComponent.setDefaultCursor(el));
|
|
292
308
|
});
|
|
293
309
|
}
|
|
294
|
-
|
|
295
|
-
this.eventListeners.set(eventType, listeners);
|
|
296
|
-
return listeners;
|
|
310
|
+
this.eventListeners.set(eventType, new Map());
|
|
297
311
|
}
|
|
298
312
|
selectElements() {
|
|
299
313
|
const allElems = this.getSvgParent().querySelectorAll('[class*=imxview-selected]');
|
|
@@ -346,7 +360,7 @@ export class ImxViewerComponent {
|
|
|
346
360
|
}
|
|
347
361
|
}
|
|
348
362
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ImxViewerComponent, deps: [{ token: DocumentToken }, { token: i1.HttpClient }, { token: i2.ClickareaService }, { token: i3.PuicHelperService }, { token: i0.Renderer2 }, { token: i4.SvgCoordinatesService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
349
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: ImxViewerComponent, selector: "imx-viewer", inputs: { useClickArea: "useClickArea", inlineDgnCssImport: "inlineDgnCssImport", svgInfo: "svgInfo", selectieInfos: "selectieInfos", clickableIds: "clickableIds", rightClickableIds: "rightClickableIds", popoverInfos: "popoverInfos", zoomScaleSensitivity: "zoomScaleSensitivity", autoAlignSvgsHorizontally: "autoAlignSvgsHorizontally", initialPanAndZoom: "initialPanAndZoom" }, outputs: { clickHandler: "clickHandler", rightClickHandler: "rightClickHandler", svgLoaded: "svgLoaded" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "svgParentRef", first: true, predicate: ["svgParent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\" data-test-id=\"svg-container\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"></svg>\n </div>\n <div id=\"popover\" class=\"popover top bs-popover-top\" [ngStyle]=\"popoverStyle\" (mouseleave)=\"hidePopOver()\" data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-header\" *ngIf=\"popoverTitleContent !== undefined\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n", styles: [".popover{top:0;left:0;z-index:1060;max-width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;visibility:hidden}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem;left:40%}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
|
|
363
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: ImxViewerComponent, selector: "imx-viewer", inputs: { useClickArea: "useClickArea", inlineDgnCssImport: "inlineDgnCssImport", svgInfo: "svgInfo", selectieInfos: "selectieInfos", clickableIds: "clickableIds", rightClickableIds: "rightClickableIds", popoverInfos: "popoverInfos", zoomScaleSensitivity: "zoomScaleSensitivity", autoAlignSvgsHorizontally: "autoAlignSvgsHorizontally", initialPanAndZoom: "initialPanAndZoom" }, outputs: { clickHandler: "clickHandler", rightClickHandler: "rightClickHandler", svgLoaded: "svgLoaded", panned: "panned" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "svgParentRef", first: true, predicate: ["svgParent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\" data-test-id=\"svg-container\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"></svg>\n </div>\n <div id=\"popover\" class=\"popover top bs-popover-top\" [ngStyle]=\"popoverStyle\" (mouseleave)=\"hidePopOver()\" data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-header\" *ngIf=\"popoverTitleContent !== undefined\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n", styles: [".popover{top:0;left:0;z-index:1060;max-width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;visibility:hidden}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem;left:40%}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
|
|
350
364
|
}
|
|
351
365
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ImxViewerComponent, decorators: [{
|
|
352
366
|
type: Component,
|
|
@@ -383,6 +397,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
|
|
|
383
397
|
type: Output
|
|
384
398
|
}], svgLoaded: [{
|
|
385
399
|
type: Output
|
|
400
|
+
}], panned: [{
|
|
401
|
+
type: Output
|
|
386
402
|
}], onResize: [{
|
|
387
403
|
type: HostListener,
|
|
388
404
|
args: ['window:resize']
|
|
@@ -412,4 +428,4 @@ export class ImxViewerBehaviourApi {
|
|
|
412
428
|
return this;
|
|
413
429
|
}
|
|
414
430
|
}
|
|
415
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW14LXZpZXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9pbXgtdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2lteC12aWV3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsTUFBTSxFQUdOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUUsVUFBVSxJQUFJLG9CQUFvQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLFVBQVUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUt4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVdoRCxNQUFNLE9BQU8sa0JBQWtCO0lBc0MzQixZQUM0QyxRQUFhLEVBQ3BDLElBQWdCLEVBQ2hCLGdCQUFrQyxFQUNsQyxVQUE2QixFQUM3QixRQUFtQixFQUNuQixxQkFBNEM7UUFMckIsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUNwQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDN0IsYUFB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QztJQUVNLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sVUFBVSxDQUFDLFdBQW9CO1FBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxTQUFTLENBQUMsVUFBa0M7UUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLEdBQUc7UUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxNQUFNO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIEluamVjdCxcclxuICAgIElucHV0LFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgUmVuZGVyZXIyLFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBvZiBhcyBvYnNlcnZhYmxlT2YsIHRocm93RXJyb3IgYXMgb2JzZXJ2YWJsZVRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IFN2Z1Bhblpvb20gZnJvbSAnc3ZnLXBhbi16b29tJztcclxuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9tb2RlbC9wb2ludCc7XHJcbmltcG9ydCB7IFBvcG92ZXJJbmZvIH0gZnJvbSAnLi4vbW9kZWwvcG9wb3Zlci1pbmZvJztcclxuaW1wb3J0IHsgU2VsZWN0aWVFdmVudCB9IGZyb20gJy4uL21vZGVsL3NlbGVjdGllLWV2ZW50JztcclxuaW1wb3J0IHsgU2VsZWN0aWVJbmZvIH0gZnJvbSAnLi4vbW9kZWwvc2VsZWN0aWUtaW5mbyc7XHJcbmltcG9ydCB7IFN2Z0luZm8gfSBmcm9tICcuLi9tb2RlbC9zdmctaW5mbyc7XHJcbmltcG9ydCB7IENsaWNrYXJlYVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jbGlja2FyZWEuc2VydmljZSc7XHJcbmltcG9ydCB7IFB1aWNIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHVpYy1oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENsYXNzZXNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvY2xhc3Nlcy11dGlsJztcclxuaW1wb3J0IHsgRG9jdW1lbnRUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2RvY3VtZW50LXRva2VuJztcclxuaW1wb3J0IHsgRm9jdXNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZm9jdXMtdXRpbCc7XHJcbmltcG9ydCB7IFN2Z0Nvb3JkaW5hdGVzU2VydmljZSB9IGZyb20gJy4vc3ZnLWNvb3JkaW5hdGVzLnNlcnZpY2UnO1xyXG5cclxuLy8gU3ZnUGFuWm9vbS5JbnN0YW5jZSBjYW5ub3QgYmUgdXNlZCBpbiBsaWJzIHRoYXQgdXNlIHRoaXMgaW14LXZpZXdlciBsaWIgYmVjYXVzZSBpdCBpcyBleHBvcnRlZCBpbiBhbiBvbGQsIG5vbiBhbmd1bGFyIDE2IGNvbXBhdGlibGUgd2F5LlxyXG5leHBvcnQgdHlwZSBTdmdJbnN0YW5jZSA9IHR5cGVvZiBTdmdQYW5ab29tO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2lteC12aWV3ZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2lteC12aWV3ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vaW14LXZpZXdlci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIElteFZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBTVkdfQkFTRTY0X1BSRUZJWCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCc7XHJcbiAgICBwcml2YXRlIFNWR19QUkVGSVggPSAnZGF0YTppbWFnZS9zdmcreG1sLCc7XHJcblxyXG4gICAgQElucHV0KCkgdXNlQ2xpY2tBcmVhID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBpbmxpbmVEZ25Dc3NJbXBvcnQgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHN2Z0luZm86IFN2Z0luZm9bXTtcclxuICAgIEBJbnB1dCgpIHNlbGVjdGllSW5mb3M6IFNlbGVjdGllSW5mb1tdID0gW107XHJcblxyXG4gICAgLy8gT25kZXJzdGFhbmRlIGlucHV0cyB3b3JkZW4gbWVlZ2Vub21lbiB2b29yIGNsaWNrYXJlYTpcclxuICAgIEBJbnB1dCgpIGNsaWNrYWJsZUlkczogc3RyaW5nW10gPSBbXTtcclxuICAgIEBJbnB1dCgpIHJpZ2h0Q2xpY2thYmxlSWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgQElucHV0KCkgcG9wb3ZlckluZm9zOiBQb3BvdmVySW5mb1tdID0gW107XHJcbiAgICBASW5wdXQoKSB6b29tU2NhbGVTZW5zaXRpdml0eSA9IDAuMjtcclxuICAgIEBJbnB1dCgpIGF1dG9BbGlnblN2Z3NIb3Jpem9udGFsbHkgPSBmYWxzZTtcclxuICAgIC8vVXNlIHRoaXMgaW5wdXQgdG8gY2hhbmdlIHRoZSBpbml0aWFsIHBhbiBhbmQgem9vbSBvZiB0aGUgc3ZnLiBEZWZhdWx0IGJlaGF2aW91ciBpcyAuZml0KCkgYW5kIC5jZW50ZXIoKS5cclxuICAgIEBJbnB1dCgpIGluaXRpYWxQYW5BbmRab29tID0gKGlteFZpZXdlckJlaGF2aW91ckFwaTogSW14Vmlld2VyQmVoYXZpb3VyQXBpKTogdm9pZCA9PiB7XHJcbiAgICAgICAgaW14Vmlld2VyQmVoYXZpb3VyQXBpLmZpdCgpO1xyXG4gICAgICAgIGlteFZpZXdlckJlaGF2aW91ckFwaS5jZW50ZXIoKTtcclxuICAgIH07XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc3ZnUGFyZW50JywgeyBzdGF0aWM6IHRydWUgfSkgc3ZnUGFyZW50UmVmOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIGVycm9ycyA9IGZhbHNlO1xyXG4gICAgcG9wb3ZlclN0eWxlOiBhbnkgPSB7IGRpc3BsYXk6ICdpbmxpbmUnIH07XHJcbiAgICBwb3BvdmVySHRtbENvbnRlbnQgPSAnJztcclxuICAgIHBvcG92ZXJUaXRsZUNvbnRlbnQ6IHN0cmluZztcclxuICAgIHBhcmVudFdpZHRoID0gMDtcclxuICAgIHBhcmVudEhlaWdodCA9IDA7XHJcblxyXG4gICAgQE91dHB1dCgpIGNsaWNrSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aWVFdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSByaWdodENsaWNrSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aWVFdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSBzdmdMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBzdmdHZWxhZGVuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGV2ZW50TGlzdGVuZXJzOiBNYXA8c3RyaW5nLCBNYXA8RWxlbWVudCwgYW55Pj4gPSBuZXcgTWFwKCk7XHJcbiAgICBwcml2YXRlIHN2Z1Bhblpvb21SZWY6IFN2Z0luc3RhbmNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIEBJbmplY3QoRG9jdW1lbnRUb2tlbikgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogYW55LFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWNrQXJlYVNlcnZpY2U6IENsaWNrYXJlYVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwdWljSGVscGVyOiBQdWljSGVscGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdmdDb29yZGluYXRlc1NlcnZpY2U6IFN2Z0Nvb3JkaW5hdGVzU2VydmljZSkge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk7XHJcbiAgICAgICAgdGhpcy5wdWljSGVscGVyLnNldFJvb3RTdmcodGhpcy5nZXRTdmdQYXJlbnQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcbiAgICBvblJlc2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZURpbWVuc2lvbnNGb3JDbGlwUGF0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlRGltZW5zaW9uc0ZvckNsaXBQYXRoKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFVwZGF0ZSBwYXJlbnRXaWR0aCBhbmQgcGFyZW50SGVpZ2h0IGJhc2VkIG9uIHRoZSBwYXJlbnQgZGl2IGRpbWVuc2lvbnNcclxuICAgICAgICB0aGlzLnBhcmVudFdpZHRoID0gdGhpcy5nZXRTdmdQYXJlbnQoKS5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIHRoaXMucGFyZW50SGVpZ2h0ID0gdGhpcy5nZXRTdmdQYXJlbnQoKS5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgICAgLy8gSWYgSW14LXZpZXdlciBpcyBpbml0aWFsaXplZCB3aXRoIHN2Z0luZm8sIG5nT25DaGFuZ2VzIGlzIGNhbGxlZCBiZWZvcmUgbmdPbkluaXQuXHJcbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIHN2Z1Bhblpvb21SZWYgaGVyZS5cclxuICAgICAgICB0aGlzLmNyZWF0ZVN2Z1Bhblpvb21SZWZJZk5vdEV4aXN0cygpO1xyXG5cclxuICAgICAgICBjb25zdCB7IHVzZUNsaWNrQXJlYSwgY2xpY2thYmxlSWRzLCByaWdodENsaWNrYWJsZUlkcywgcG9wb3ZlckluZm9zLCBzZWxlY3RpZUluZm9zLCBzdmdJbmZvIH0gPSBjaGFuZ2VzO1xyXG5cclxuICAgICAgICBpZiAodXNlQ2xpY2tBcmVhIHx8IGNsaWNrYWJsZUlkcyB8fCByaWdodENsaWNrYWJsZUlkcyB8fCBwb3BvdmVySW5mb3MpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWxheWVkQ2xpY2tBcmVhQ3JlYXRpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnN2Z0luZm8gJiYgc3ZnSW5mbykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTdmdzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jbGlja2FibGVJZHMgJiYgY2xpY2thYmxlSWRzICYmIHRoaXMuc3ZnR2VsYWRlbikge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHModGhpcy5jbGlja2FibGVJZHMsICdjbGljaycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHRDbGlja2FibGVJZHMgJiYgcmlnaHRDbGlja2FibGVJZHMgJiYgdGhpcy5zdmdHZWxhZGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2xpY2tFdmVudEhhbmRsZXJzVG9FbGVtZW50cyh0aGlzLnJpZ2h0Q2xpY2thYmxlSWRzLCAnY29udGV4dG1lbnUnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGllSW5mb3MgJiYgc2VsZWN0aWVJbmZvcyAmJiB0aGlzLnN2Z0dlbGFkZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RFbGVtZW50cygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckluZm9zICYmIHBvcG92ZXJJbmZvcyAmJiB0aGlzLnN2Z0dlbGFkZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRNb3VzZW92ZXJFdmVudEhhbmRsZXJUb0VsZW1lbnRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZj8uZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZm9jdXNPbklkcyhmb2N1c0lkczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgICAgICBGb2N1c1V0aWwuZm9jdXNPbklkcyhmb2N1c0lkcywgdGhpcy5zdmdQYW5ab29tUmVmLCB0aGlzLnB1aWNIZWxwZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTdmdQYW5ab29tSW5zdGFuY2U6ICgpID0+IFN2Z0luc3RhbmNlID0gKCkgPT4gdGhpcy5zdmdQYW5ab29tUmVmO1xyXG5cclxuICAgIC8vIEhlcmUgb25seSB1c2VkIGluIHRlc3QsIGJ1dCBhbHNvIHVzZWQgYnkgYXBwbGljYXRpb25zLiBEbyBub3QgcmVtb3ZlLlxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRYQ29vcmRpbmF0ZShkZWNvZGVkU3ZnRGF0YVVybDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZGl2LmlubmVySFRNTCA9IGRlY29kZWRTdmdEYXRhVXJsO1xyXG4gICAgICAgIC8vIERlIFNWRy13aWR0aCB3b3JkdCBpbiBkZSBzdmcgdGFnIGdlc3BlY2lmaWNlZXJkLlxyXG4gICAgICAgIGNvbnN0IHggPSBkaXYuZmlyc3RFbGVtZW50Q2hpbGQuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlRmxvYXQoeCk7XHJcbiAgICAgICAgZGl2ID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVQb3BPdmVyID0gKCk6IHN0cmluZyA9PiB0aGlzLnBvcG92ZXJTdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdmdQYW5ab29tUmVmSWZOb3RFeGlzdHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN2Z1Bhblpvb21SZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmID0gU3ZnUGFuWm9vbSh0aGlzLmdldFN2Z1BhcmVudCgpLCB7XHJcbiAgICAgICAgICAgICAgICB6b29tU2NhbGVTZW5zaXRpdml0eTogdGhpcy56b29tU2NhbGVTZW5zaXRpdml0eSxcclxuICAgICAgICAgICAgICAgIGZpdDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBjZW50ZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkYmxDbGlja1pvb21FbmFibGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG9uWm9vbTogKCkgPT4gdGhpcy5oaWRlUG9wT3ZlcigpLFxyXG4gICAgICAgICAgICAgICAgb25QYW46ICgpID0+IHRoaXMuaGlkZVBvcE92ZXIoKSxcclxuICAgICAgICAgICAgICAgIG9uVXBkYXRlZENUTTogKCkgPT4gdGhpcy51cGRhdGVDbGlwUGF0aCgpLFxyXG4gICAgICAgICAgICAgICAgcmVmcmVzaFJhdGU6ICdhdXRvJ1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkU3R5bGVUb1Jvb3RTdmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDbGlwUGF0aCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5nZXRWaXNpYmxlQXJlYSgpO1xyXG4gICAgICAgIGlmICghYXJlYSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB1cGRhdGUgdGhlIGNsaXBQYXRoXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2xpcFJlY3QgPSB0aGlzLmdldFN2Z1BhcmVudCgpLnF1ZXJ5U2VsZWN0b3IoJyNjbGlwLXBhdGggcmVjdCcpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShjbGlwUmVjdCwgJ3gnLCBTdHJpbmcoYXJlYS54KSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNsaXBSZWN0LCAneScsIFN0cmluZyhhcmVhLnkpKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoY2xpcFJlY3QsICd3aWR0aCcsIFN0cmluZyhhcmVhLndpZHRoKSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNsaXBSZWN0LCAnaGVpZ2h0JywgU3RyaW5nKGFyZWEuaGVpZ2h0KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlQXJlYSgpOiBBcmVhIHtcclxuICAgICAgICBjb25zdCB6b29tID0gdGhpcy5nZXRTdmdQYW5ab29tSW5zdGFuY2UoKT8uZ2V0Wm9vbSgpO1xyXG4gICAgICAgIGNvbnN0IHBhbiA9IHRoaXMuZ2V0U3ZnUGFuWm9vbUluc3RhbmNlKCk/LmdldFBhbigpO1xyXG5cclxuICAgICAgICBpZiAoIXpvb20gfHwgIXBhbikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBCZXBhYWwgZ3Jvb3R0ZSB2YW4gdmlzaWJsZSBhcmVhXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVdpZHRoID0gdGhpcy5wYXJlbnRXaWR0aCAvIHpvb207XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZUhlaWdodCA9IHRoaXMucGFyZW50SGVpZ2h0IC8gem9vbTtcclxuXHJcbiAgICAgICAgLy8gQmVwYWFsIGhldCBudWxwdW50IChsaW5rc2JvdmVuKSB2YW4gZGUgdmlzaWJsZSBhcmVhXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVggPSAtcGFuLnggLyB6b29tO1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVZID0gLXBhbi55IC8gem9vbTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgeDogdmlzaWJsZVgsIHk6IHZpc2libGVZLCB3aWR0aDogdmlzaWJsZVdpZHRoLCBoZWlnaHQ6IHZpc2libGVIZWlnaHQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0eWxlIHdvcmR0IHZhbnVpdCBqYXZhc2NyaXB0IHRvZWdldm9lZ2QgbmEgZGUgY3JlYXRlIHZhbiBTdmdab29tUGFuUmVmIGRlemUgbWFha3QgZWVuIHZpZXdwb3J0IGFhbi5cclxuICAgICAqIC0gQ2xpY2thcmVhIENTUyB3b3JkdCBkeW5hbWlzY2ggYWFuIGRlIFNWRyB0b2VnZXZvZWdkLCBkaXQgdm9vcmtvbXQgZGF0IGRhdCBlciBuZ2NvbnRlbnQgcHJvcGVydHkgb3AgZ2VwbGFhdHN0IHdvcmR0LlxyXG4gICAgICogICBEZSBTVkcncyB3b3JkZW4gbmlldCB2b29yemllbiB2YW4gbmdjb250ZW50IGF0dHJpYnV1dC5cclxuICAgICAqIC0gREdOLmNzcyBpbXBvcnQgd29yZHQgKG9wdGlvbmVlbCkgaW4gZGUgcm9vdCBTVkcgb3BnZW5vbWVuLCBkZXplIGlzIGVlcnN0IHZlcndpamRlcmQgdWl0IGRlIFNWRydzLiBPbSBtZWVyZGVyZSBpbXBvcnRzIHRlIHZvb3Jrb21lbi5cclxuICAgICAqICovXHJcbiAgICBwcml2YXRlIGFkZFN0eWxlVG9Sb290U3ZnKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmdldFN2Z1BhcmVudCgpLmZpcnN0RWxlbWVudENoaWxkLnRhZ05hbWUgIT09ICdkZWZzJykge1xyXG4gICAgICAgICAgICBjb25zdCBkZWZzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdkZWZzJyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmlubGluZURnbkNzc0ltcG9ydCA/ICdAaW1wb3J0IHVybChcImRnbi5jc3NcIik7XFxuJyA6ICcnO1xyXG4gICAgICAgICAgICBzdHlsZSArPVxyXG4gICAgICAgICAgICAgICAgYC5pbXh2aWV3LXNlbGVjdGVkID4gcG9seWxpbmUuaW14dmlldy1jbGlja2FyZWEsIHBvbHlsaW5lLmlteHZpZXctY2xpY2thcmVhIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IHZhcigtLWlteHZpZXctY2xpY2thcmVhLXN0cm9rZSwgdHJhbnNwYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aDogdmFyKC0taW14dmlldy1jbGlja2FyZWEtc3Ryb2tlLXdpZHRoLCAxMHB4KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lO1xyXG4gICAgICAgICAgICAgICAgfWA7XHJcbiAgICAgICAgICAgIGRlZnMuaW5uZXJIVE1MID1cclxuICAgICAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgICAgIDxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4gJHsgc3R5bGUgfSA8L3N0eWxlPlxyXG4gICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcC1wYXRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjBcIiB4PVwiMFwiIHdpZHRoPSR7IHRoaXMucGFyZW50V2lkdGggfSBoZWlnaHQ9JHsgdGhpcy5wYXJlbnRIZWlnaHQgfT5cclxuICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnRDaGlsZCA9IHRoaXMuZ2V0U3ZnUGFyZW50KCkuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3ZnUGFyZW50KCkuaW5zZXJ0QmVmb3JlKGRlZnMsIGZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZURpbWVuc2lvbnNGb3JDbGlwUGF0aCgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkU3ZncygpOiB2b2lkIHtcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuc3ZnSW5mby5tYXAoc3ZnSW5mbyA9PiB0aGlzLmxvYWRTdmcoc3ZnSW5mby5zdmcpKSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoc3ZncyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmNvbmNhdGVuYXRlU3ZncyhzdmdzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9tKHN2Zyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN2Z0dlbGFkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdmdMb2FkZWQuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxheWVkQ2xpY2tBcmVhQ3JlYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2xpY2tFdmVudEhhbmRsZXJzVG9FbGVtZW50cyh0aGlzLmNsaWNrYWJsZUlkcywgJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHModGhpcy5yaWdodENsaWNrYWJsZUlkcywgJ2NvbnRleHRtZW51Jyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEVsZW1lbnRzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE1vdXNlb3ZlckV2ZW50SGFuZGxlclRvRWxlbWVudHMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGltZW5zaW9uc0ZvckNsaXBQYXRoKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHRoaXMuZmxhZ0Vycm9ycyhlcnJvcilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZFN2ZyhzdmdTcmM6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKHN2Z1NyYy5zdGFydHNXaXRoKCdkYXRhOicpKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgICAgICAgIGlmIChzdmdTcmMuc3RhcnRzV2l0aCh0aGlzLlNWR19CQVNFNjRfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhdG9iKHN2Z1NyYy5zdWJzdHJpbmcodGhpcy5TVkdfQkFTRTY0X1BSRUZJWC5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVRocm93RXJyb3IoJ0RhdGEtdXJsIHBhcnNlIGVycm9yJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ZnU3JjLnN0YXJ0c1dpdGgodGhpcy5TVkdfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyc2VkID0gc3ZnU3JjLnN1YnN0cmluZyh0aGlzLlNWR19QUkVGSVgubGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVPZihwYXJzZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChzdmdTcmMsIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRDbGlja0V2ZW50SGFuZGxlcnNUb0VsZW1lbnQobGlzdGVuZXJzOiBNYXA8RWxlbWVudCwgYW55PiwgZWxlbSwgZXZlbnRUeXBlOiBzdHJpbmcsIHB1aWM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1BbHJlYWR5SGFzTGlzdGVuZXIgPSBsaXN0ZW5lcnMuZ2V0KGVsZW0pO1xyXG4gICAgICAgIGlmICghZWxlbUFscmVhZHlIYXNMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICBjb25zdCBmbiA9IGV2ZW50VHlwZSA9PT0gJ2NsaWNrJyA/XHJcbiAgICAgICAgICAgICAgICAoZSkgPT4gdGhpcy5jbGlja0hhbmRsZXIuZW1pdChuZXcgU2VsZWN0aWVFdmVudChwdWljLCBlKSkgOlxyXG4gICAgICAgICAgICAgICAgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodENsaWNrSGFuZGxlci5lbWl0KG5ldyBTZWxlY3RpZUV2ZW50KHB1aWMsIGUpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGVsZW0sIGZuKTtcclxuICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4pO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHMoY2xpY2thYmxlSWRzOiBzdHJpbmdbXSwgZXZlbnR0eXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLnJlbW92ZU9sZFN0YXRlKGV2ZW50dHlwZSk7XHJcblxyXG4gICAgICAgIGlmIChjbGlja2FibGVJZHMpIHtcclxuICAgICAgICAgICAgY2xpY2thYmxlSWRzLmZvckVhY2gocHVpYyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMucHVpY0hlbHBlci5nZXRBbGxFbGVtZW50c0ZvclB1aWMocHVpYyk7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLmFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudChsaXN0ZW5lcnMsIGVsZW1lbnQsIGV2ZW50dHlwZSwgcHVpYykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRNb3VzZW92ZXJFdmVudEhhbmRsZXJUb0VsZW1lbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMucmVtb3ZlT2xkU3RhdGUoJ21vdXNlb3ZlcicpO1xyXG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJJbmZvcykge1xyXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJJbmZvcy5mb3JFYWNoKHBvcG92ZXJJbmZvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwb3BvdmVySW5mby5wdWljQXJyYXkuZm9yRWFjaChwdWljID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1zID0gdGhpcy5wdWljSGVscGVyLmdldEFsbEVsZW1lbnRzRm9yUHVpYyhwdWljKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbiA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wb3Zlckh0bWxDb250ZW50ID0gcG9wb3ZlckluZm8ucG9wb3Zlckh0bWxDb250ZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcG92ZXJUaXRsZUNvbnRlbnQgPSBwb3BvdmVySW5mby5wb3BvdmVyVGl0bGVDb250ZW50O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRpbWVvdXQgdG8gaGF2ZSBjb250ZW50IHJlbmRlcmVkIGJlZm9yZSBnZXR0aW5nIHNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3dQb3B1cChlKSwgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1zLml0ZW0oaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNldChlbGVtLCBmbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbmNhdGVuYXRlU3ZncyhzdmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHN2Z0NvbnRlbnQgPSAnJztcclxuICAgICAgICBsZXQgc3ZnSW5mbyA9IHRoaXMuc3ZnSW5mbztcclxuICAgICAgICBpZiAodGhpcy5hdXRvQWxpZ25TdmdzSG9yaXpvbnRhbGx5KSB7XHJcbiAgICAgICAgICAgIHN2Z0luZm8gPSB0aGlzLnN2Z0Nvb3JkaW5hdGVzU2VydmljZS5zdmdJbmZvc1dpdGhDb29yZGluYXRlcyhzdmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN2Z0luZm8ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlQ29vcmRpbmF0ZXMgPSBzdmdJbmZvW2ldLmNvb3JkaW5hdGVzIHx8IG5ldyBQb2ludCgwLCAwKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICAgICAgLyoqIFZlcndpamRlciBkZ24uY3NzIGltcG9ydCB1aXQgZ2VsZXZlcmRlIFNWRydzLlxyXG4gICAgICAgICAgICAgKiAgRGUgaW1wb3J0IHdvcmR0IG9wdGlvbmVlbCAoc3RhbmRhYXJkIGFhbikgaW4gZGUgcm9vdCBTVkcgZ2VwbGFhdHMgb20gdGUgdm9vcmtvbWVuIGRhdCBkZSBpbXBvcnQgbWVlcm1hYWxzIGdlYmV1cmQuXHJcbiAgICAgICAgICAgICAqICB6aWUgYWRkU3R5bGVUb1Jvb3RTdmcoKVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IHN2Z3NbaV0ucmVwbGFjZSgnQGltcG9ydCB1cmwoXCJkZ24uY3NzXCIpOycsICcnKTtcclxuICAgICAgICAgICAgZGl2LmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZSgneCcsIHNvdXJjZUNvb3JkaW5hdGVzLngudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIGRpdi5maXJzdEVsZW1lbnRDaGlsZC5zZXRBdHRyaWJ1dGUoJ3knLCBzb3VyY2VDb29yZGluYXRlcy55LnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgc3ZnQ29udGVudCArPSBkaXYuaW5uZXJIVE1MO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN2Z0NvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmbGFnRXJyb3JzKGVycm9yKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuZXJyb3JzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZU9sZFN0YXRlKGV2ZW50VHlwZTogc3RyaW5nKTogTWFwPEVsZW1lbnQsIGFueT4ge1xyXG4gICAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzLmdldChldmVudFR5cGUpO1xyXG4gICAgICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGZuLCBlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGZuKTtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT09ICdjbGljaycpXHJcbiAgICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIElteFZpZXdlckNvbXBvbmVudC5zZXREZWZhdWx0Q3Vyc29yKGVsKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5zZXQoZXZlbnRUeXBlLCBsaXN0ZW5lcnMpO1xyXG4gICAgICAgIHJldHVybiBsaXN0ZW5lcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZWxlY3RFbGVtZW50cygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhbGxFbGVtcyA9IHRoaXMuZ2V0U3ZnUGFyZW50KCkucXVlcnlTZWxlY3RvckFsbCgnW2NsYXNzKj1pbXh2aWV3LXNlbGVjdGVkXScpO1xyXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBhbGxFbGVtcykge1xyXG4gICAgICAgICAgICBDbGFzc2VzVXRpbC5yZW1vdmVDbGFzc2VzU3RhcnRpbmdXaXRoKGVsZW1lbnQsICdpbXh2aWV3LXNlbGVjdGVkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RpZUluZm9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aWVJbmZvcy5mb3JFYWNoKHNlbGVjdGllSW5mbyA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RpZUluZm8uaWRzLmZvckVhY2goaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVpY0hlbHBlci5nZXRBbGxFbGVtZW50c0ZvclB1aWMoaWQpLmZvckVhY2goZWxlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzZXNVdGlsLmFkZENsYXNzKGVsZW0sICdpbXh2aWV3LXNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnJyAhPT0gc2VsZWN0aWVJbmZvLmNsYXp6KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2VzVXRpbC5hZGRDbGFzcyhlbGVtLCAnaW14dmlldy1zZWxlY3RlZC0nICsgc2VsZWN0aWVJbmZvLmNsYXp6KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBzZXREZWZhdWx0Q3Vyc29yKGVsOiBFbGVtZW50KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBvdWRlU3R5bGUgPSBlbC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XHJcbiAgICAgICAgcmV0dXJuIG91ZGVTdHlsZSA/IG91ZGVTdHlsZS5yZXBsYWNlKCdwb2ludGVyJywgJ2RlZmF1bHQnKSA6ICdjdXJzb3I6IGRlZmF1bHQnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2hvd1BvcHVwKGUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwb3BvdmVyRWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3BvdmVyJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3QgbGVmdCA9IGUubGF5ZXJYIC0gKHBvcG92ZXJFbGVtLndpZHRoIC8gMikgKyAncHgnO1xyXG4gICAgICAgIGNvbnN0IHRvcCA9IGUubGF5ZXJZIC0gKHBvcG92ZXJFbGVtLmhlaWdodCArIDgpICsgJ3B4JztcclxuICAgICAgICB0aGlzLnBvcG92ZXJTdHlsZSA9IHtcclxuICAgICAgICAgICAgbGVmdDogbGVmdCwgdG9wOiB0b3AsIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxyXG4gICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lJywgdmlzaWJpbGl0eTogJ3Zpc2libGUnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZURvbShzdmc6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZi5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNyZWF0ZVN2Z1Bhblpvb21SZWZJZk5vdEV4aXN0cygpO1xyXG5cclxuICAgICAgICBjb25zdCBzdmdQYW5ab29tVmlld3BvcnRFbGVtZW50ID0gdGhpcy5nZXRTdmdQYXJlbnQoKS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzdmctcGFuLXpvb21fdmlld3BvcnQnKVswXTtcclxuICAgICAgICBzdmdQYW5ab29tVmlld3BvcnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xpcC1wYXRoJywgJ3VybCgjY2xpcC1wYXRoKScpO1xyXG4gICAgICAgIHN2Z1Bhblpvb21WaWV3cG9ydEVsZW1lbnQuaW5uZXJIVE1MID0gc3ZnLnN1YnN0cmluZyhzdmcuaW5kZXhPZignPHN2ZycpKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLnVwZGF0ZUJCb3goKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLnJlc2l6ZSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbFBhbkFuZFpvb20obmV3IElteFZpZXdlckJlaGF2aW91ckFwaSh0aGlzLnN2Z1Bhblpvb21SZWYpKTtcclxuICAgICAgICB0aGlzLnB1aWNIZWxwZXIuc2V0Um9vdFN2Zyh0aGlzLmdldFN2Z1BhcmVudCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlbGF5ZWRDbGlja0FyZWFDcmVhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zdmdHZWxhZGVuICYmIHRoaXMudXNlQ2xpY2tBcmVhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsaWNrYXJlYUlkcyA9IG5ldyBTZXQoWy4uLnRoaXMuY2xpY2thYmxlSWRzLCAuLi50aGlzLnJpZ2h0Q2xpY2thYmxlSWRzLFxyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5wb3BvdmVySW5mb3MuZmxhdE1hcChwaSA9PiBwaS5wdWljQXJyYXkpXSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xpY2tBcmVhU2VydmljZS5kZWxheWVkQ2xpY2tBcmVhQ3JlYXRpb24oY2xpY2thcmVhSWRzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdmdQYXJlbnQgPSAoKSA9PiB0aGlzLnN2Z1BhcmVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQXJlYSB7XHJcbiAgICB4OiBudW1iZXI7XHJcbiAgICB5OiBudW1iZXI7XHJcbiAgICB3aWR0aDogbnVtYmVyO1xyXG4gICAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBYYW5kWUVuYWJsZWQge1xyXG4gICAgeDogYm9vbGVhbjtcclxuICAgIHk6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBJbXhWaWV3ZXJCZWhhdmlvdXJBcGkge1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzdmdQYW5ab29tUmVmOiBTdmdJbnN0YW5jZSkge1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwYW4oeDogbnVtYmVyLCB5OiBudW1iZXIpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYucGFuKG5ldyBQb2ludCh4LCB5KSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVuYWJsZVpvb20oem9vbUVuYWJsZWQ6IGJvb2xlYW4pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYuc2V0QmVmb3JlWm9vbSgoKSA9PiB6b29tRW5hYmxlZCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVuYWJsZVBhbihwYW5FbmFibGVkOiBib29sZWFuIHwgWGFuZFlFbmFibGVkKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLnNldEJlZm9yZVBhbigoKSA9PiBwYW5FbmFibGVkKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZml0KCk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZi5maXQoKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2VudGVyKCk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZi5jZW50ZXIoKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwiaW14dmlld2VyXCIgZGF0YS10ZXN0LWlkPVwiaW14LXZpZXdlclwiPlxuICAgIDxkaXYgaWQ9XCJzdmdDb250YWluZXJcIiBjbGFzcz1cImNvbC1tZC0xMiB0b3AxMFwiIFtoaWRkZW5dPVwiZXJyb3JzXCIgKGNsaWNrKT1cImhpZGVQb3BPdmVyKClcIiBkYXRhLXRlc3QtaWQ9XCJzdmctY29udGFpbmVyXCI+XG4gICAgICAgIDxzdmcgI3N2Z1BhcmVudCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cInBvcG92ZXJcIiBjbGFzcz1cInBvcG92ZXIgdG9wIGJzLXBvcG92ZXItdG9wXCIgW25nU3R5bGVdPVwicG9wb3ZlclN0eWxlXCIgKG1vdXNlbGVhdmUpPVwiaGlkZVBvcE92ZXIoKVwiIGRhdGEtdGVzdC1pZD1cInBvcG92ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+XG4gICAgICAgIDxoMyBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCIgKm5nSWY9XCJwb3BvdmVyVGl0bGVDb250ZW50ICE9PSB1bmRlZmluZWRcIiBbaW5uZXJIVE1MXT1cInBvcG92ZXJUaXRsZUNvbnRlbnRcIiBkYXRhLXRlc3QtaWQ9XCJwb3BvdmVyLWhlYWRlclwiPjwvaDM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIiBbaW5uZXJIVE1MXT1cInBvcG92ZXJIdG1sQ29udGVudFwiIGRhdGEtdGVzdC1pZD1cInBvcG92ZXItYm9keVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
431
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW14LXZpZXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9pbXgtdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2lteC12aWV3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNILFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsTUFBTSxFQUdOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUUsVUFBVSxJQUFJLG9CQUFvQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLFVBQVUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUt4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVdoRCxNQUFNLE9BQU8sa0JBQWtCO0lBeUMzQixZQUM0QyxRQUFhLEVBQ3BDLElBQWdCLEVBQ2hCLGdCQUFrQyxFQUNsQyxVQUE2QixFQUM3QixRQUFtQixFQUNuQixxQkFBNEM7UUFMckIsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUNwQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDN0IsYUFB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Q0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxHQUFHO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sTUFBTTtRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBIb3N0TGlzdGVuZXIsXHJcbiAgICBJbmplY3QsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mLCB0aHJvd0Vycm9yIGFzIG9ic2VydmFibGVUaHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCBTdmdQYW5ab29tIGZyb20gJ3N2Zy1wYW4tem9vbSc7XHJcbmltcG9ydCB7IFBhbkV2ZW50IH0gZnJvbSAnLi4vbW9kZWwvcGFuLWV2ZW50JztcclxuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9tb2RlbC9wb2ludCc7XHJcbmltcG9ydCB7IFBvcG92ZXJJbmZvIH0gZnJvbSAnLi4vbW9kZWwvcG9wb3Zlci1pbmZvJztcclxuaW1wb3J0IHsgU2VsZWN0aWVFdmVudCB9IGZyb20gJy4uL21vZGVsL3NlbGVjdGllLWV2ZW50JztcclxuaW1wb3J0IHsgU2VsZWN0aWVJbmZvIH0gZnJvbSAnLi4vbW9kZWwvc2VsZWN0aWUtaW5mbyc7XHJcbmltcG9ydCB7IFN2Z0luZm8gfSBmcm9tICcuLi9tb2RlbC9zdmctaW5mbyc7XHJcbmltcG9ydCB7IENsaWNrYXJlYVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jbGlja2FyZWEuc2VydmljZSc7XHJcbmltcG9ydCB7IFB1aWNIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHVpYy1oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENsYXNzZXNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvY2xhc3Nlcy11dGlsJztcclxuaW1wb3J0IHsgRG9jdW1lbnRUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2RvY3VtZW50LXRva2VuJztcclxuaW1wb3J0IHsgRm9jdXNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZm9jdXMtdXRpbCc7XHJcbmltcG9ydCB7IFN2Z0Nvb3JkaW5hdGVzU2VydmljZSB9IGZyb20gJy4vc3ZnLWNvb3JkaW5hdGVzLnNlcnZpY2UnO1xyXG5cclxuLy8gU3ZnUGFuWm9vbS5JbnN0YW5jZSBjYW5ub3QgYmUgdXNlZCBpbiBsaWJzIHRoYXQgdXNlIHRoaXMgaW14LXZpZXdlciBsaWIgYmVjYXVzZSBpdCBpcyBleHBvcnRlZCBpbiBhbiBvbGQsIG5vbiBhbmd1bGFyIDE2IGNvbXBhdGlibGUgd2F5LlxyXG5leHBvcnQgdHlwZSBTdmdJbnN0YW5jZSA9IHR5cGVvZiBTdmdQYW5ab29tO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2lteC12aWV3ZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2lteC12aWV3ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vaW14LXZpZXdlci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIElteFZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBTVkdfQkFTRTY0X1BSRUZJWCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCc7XHJcbiAgICBwcml2YXRlIFNWR19QUkVGSVggPSAnZGF0YTppbWFnZS9zdmcreG1sLCc7XHJcblxyXG4gICAgQElucHV0KCkgdXNlQ2xpY2tBcmVhID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBpbmxpbmVEZ25Dc3NJbXBvcnQgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHN2Z0luZm86IFN2Z0luZm9bXTtcclxuICAgIEBJbnB1dCgpIHNlbGVjdGllSW5mb3M6IFNlbGVjdGllSW5mb1tdID0gW107XHJcblxyXG4gICAgLy8gT25kZXJzdGFhbmRlIGlucHV0cyB3b3JkZW4gbWVlZ2Vub21lbiB2b29yIGNsaWNrYXJlYTpcclxuICAgIEBJbnB1dCgpIGNsaWNrYWJsZUlkczogc3RyaW5nW10gPSBbXTtcclxuICAgIEBJbnB1dCgpIHJpZ2h0Q2xpY2thYmxlSWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgQElucHV0KCkgcG9wb3ZlckluZm9zOiBQb3BvdmVySW5mb1tdID0gW107XHJcbiAgICBASW5wdXQoKSB6b29tU2NhbGVTZW5zaXRpdml0eSA9IDAuMjtcclxuICAgIEBJbnB1dCgpIGF1dG9BbGlnblN2Z3NIb3Jpem9udGFsbHkgPSBmYWxzZTtcclxuICAgIC8vVXNlIHRoaXMgaW5wdXQgdG8gY2hhbmdlIHRoZSBpbml0aWFsIHBhbiBhbmQgem9vbSBvZiB0aGUgc3ZnLiBEZWZhdWx0IGJlaGF2aW91ciBpcyAuZml0KCkgYW5kIC5jZW50ZXIoKS5cclxuICAgIEBJbnB1dCgpIGluaXRpYWxQYW5BbmRab29tID0gKGlteFZpZXdlckJlaGF2aW91ckFwaTogSW14Vmlld2VyQmVoYXZpb3VyQXBpKTogdm9pZCA9PiB7XHJcbiAgICAgICAgaW14Vmlld2VyQmVoYXZpb3VyQXBpLmZpdCgpO1xyXG4gICAgICAgIGlteFZpZXdlckJlaGF2aW91ckFwaS5jZW50ZXIoKTtcclxuICAgIH07XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc3ZnUGFyZW50JywgeyBzdGF0aWM6IHRydWUgfSkgc3ZnUGFyZW50UmVmOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIGVycm9ycyA9IGZhbHNlO1xyXG4gICAgcG9wb3ZlclN0eWxlOiBhbnkgPSB7IGRpc3BsYXk6ICdpbmxpbmUnIH07XHJcbiAgICBwb3BvdmVySHRtbENvbnRlbnQgPSAnJztcclxuICAgIHBvcG92ZXJUaXRsZUNvbnRlbnQ6IHN0cmluZztcclxuICAgIHBhcmVudFdpZHRoID0gMDtcclxuICAgIHBhcmVudEhlaWdodCA9IDA7XHJcblxyXG4gICAgQE91dHB1dCgpIGNsaWNrSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aWVFdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSByaWdodENsaWNrSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aWVFdmVudD4oKTtcclxuICAgIEBPdXRwdXQoKSBzdmdMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgICAvL0JlIG1pbmRmdWwgdGhhdCB0aGUgcGFuLWV2ZW50IG9jY3VycyBvZnRlbi4gQ2F0Y2ggaXQgd2l0aCBhIHRpbWVvdXQgaWYgeW91IGRvIGhlYXZ5IHByb2Nlc3NpbmdcclxuICAgIEBPdXRwdXQoKSBwYW5uZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFBhbkV2ZW50PigpO1xyXG5cclxuICAgIHByaXZhdGUgc3ZnR2VsYWRlbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBldmVudExpc3RlbmVyczogTWFwPHN0cmluZywgTWFwPEVsZW1lbnQsIGFueT4+ID0gbmV3IE1hcCgpO1xyXG4gICAgcHJpdmF0ZSBzdmdQYW5ab29tUmVmOiBTdmdJbnN0YW5jZTtcclxuICAgIHByaXZhdGUgaWdub3JlUGFuRXZlbnRCZWNhdXNlUmVsb2FkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEluamVjdChEb2N1bWVudFRva2VuKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBhbnksXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpY2tBcmVhU2VydmljZTogQ2xpY2thcmVhU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHB1aWNIZWxwZXI6IFB1aWNIZWxwZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN2Z0Nvb3JkaW5hdGVzU2VydmljZTogU3ZnQ29vcmRpbmF0ZXNTZXJ2aWNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdmdQYW5ab29tUmVmSWZOb3RFeGlzdHMoKTtcclxuICAgICAgICB0aGlzLnB1aWNIZWxwZXIuc2V0Um9vdFN2Zyh0aGlzLmdldFN2Z1BhcmVudCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICAgIG9uUmVzaXplKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlRGltZW5zaW9uc0ZvckNsaXBQYXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVEaW1lbnNpb25zRm9yQ2xpcFBhdGgoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gVXBkYXRlIHBhcmVudFdpZHRoIGFuZCBwYXJlbnRIZWlnaHQgYmFzZWQgb24gdGhlIHBhcmVudCBkaXYgZGltZW5zaW9uc1xyXG4gICAgICAgIHRoaXMucGFyZW50V2lkdGggPSB0aGlzLmdldFN2Z1BhcmVudCgpLnBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRIZWlnaHQgPSB0aGlzLmdldFN2Z1BhcmVudCgpLnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBJZiBJbXgtdmlld2VyIGlzIGluaXRpYWxpemVkIHdpdGggc3ZnSW5mbywgbmdPbkNoYW5nZXMgaXMgY2FsbGVkIGJlZm9yZSBuZ09uSW5pdC5cclxuICAgICAgICAvLyBJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byBjcmVhdGUgc3ZnUGFuWm9vbVJlZiBoZXJlLlxyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHsgdXNlQ2xpY2tBcmVhLCBjbGlja2FibGVJZHMsIHJpZ2h0Q2xpY2thYmxlSWRzLCBwb3BvdmVySW5mb3MsIHNlbGVjdGllSW5mb3MsIHN2Z0luZm8gfSA9IGNoYW5nZXM7XHJcblxyXG4gICAgICAgIGlmICh1c2VDbGlja0FyZWEgfHwgY2xpY2thYmxlSWRzIHx8IHJpZ2h0Q2xpY2thYmxlSWRzIHx8IHBvcG92ZXJJbmZvcykge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRDbGlja0FyZWFDcmVhdGlvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3ZnSW5mbyAmJiBzdmdJbmZvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaWdub3JlUGFuRXZlbnRCZWNhdXNlUmVsb2FkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkU3ZncygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xpY2thYmxlSWRzICYmIGNsaWNrYWJsZUlkcyAmJiB0aGlzLnN2Z0dlbGFkZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRDbGlja0V2ZW50SGFuZGxlcnNUb0VsZW1lbnRzKHRoaXMuY2xpY2thYmxlSWRzLCAnY2xpY2snKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJpZ2h0Q2xpY2thYmxlSWRzICYmIHJpZ2h0Q2xpY2thYmxlSWRzICYmIHRoaXMuc3ZnR2VsYWRlbikge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHModGhpcy5yaWdodENsaWNrYWJsZUlkcywgJ2NvbnRleHRtZW51Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RpZUluZm9zICYmIHNlbGVjdGllSW5mb3MgJiYgdGhpcy5zdmdHZWxhZGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RWxlbWVudHMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJJbmZvcyAmJiBwb3BvdmVySW5mb3MgJiYgdGhpcy5zdmdHZWxhZGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkTW91c2VvdmVyRXZlbnRIYW5kbGVyVG9FbGVtZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWY/LmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvY3VzT25JZHMoZm9jdXNJZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgRm9jdXNVdGlsLmZvY3VzT25JZHMoZm9jdXNJZHMsIHRoaXMuc3ZnUGFuWm9vbVJlZiwgdGhpcy5wdWljSGVscGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U3ZnUGFuWm9vbUluc3RhbmNlOiAoKSA9PiBTdmdJbnN0YW5jZSA9ICgpID0+IHRoaXMuc3ZnUGFuWm9vbVJlZjtcclxuXHJcbiAgICAvLyBIZXJlIG9ubHkgdXNlZCBpbiB0ZXN0LCBidXQgYWxzbyB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gRG8gbm90IHJlbW92ZS5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0WENvb3JkaW5hdGUoZGVjb2RlZFN2Z0RhdGFVcmw6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRpdi5pbm5lckhUTUwgPSBkZWNvZGVkU3ZnRGF0YVVybDtcclxuICAgICAgICAvLyBEZSBTVkctd2lkdGggd29yZHQgaW4gZGUgc3ZnIHRhZyBnZXNwZWNpZmljZWVyZC5cclxuICAgICAgICBjb25zdCB4ID0gZGl2LmZpcnN0RWxlbWVudENoaWxkLmdldEF0dHJpYnV0ZSgnd2lkdGgnKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZUZsb2F0KHgpO1xyXG4gICAgICAgIGRpdiA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlUG9wT3ZlciA9ICgpOiBzdHJpbmcgPT4gdGhpcy5wb3BvdmVyU3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5zdmdQYW5ab29tUmVmKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZiA9IFN2Z1Bhblpvb20odGhpcy5nZXRTdmdQYXJlbnQoKSwge1xyXG4gICAgICAgICAgICAgICAgem9vbVNjYWxlU2Vuc2l0aXZpdHk6IHRoaXMuem9vbVNjYWxlU2Vuc2l0aXZpdHksXHJcbiAgICAgICAgICAgICAgICBmaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgY2VudGVyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZGJsQ2xpY2tab29tRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBvblpvb206ICgpID0+IHRoaXMuaGlkZVBvcE92ZXIoKSxcclxuICAgICAgICAgICAgICAgIG9uUGFuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlUG9wT3ZlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZVBhbkV2ZW50QmVjYXVzZVJlbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlnbm9yZVBhbkV2ZW50QmVjYXVzZVJlbG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFubmVkLmVtaXQoeyB4OiB0aGlzLnN2Z1Bhblpvb21SZWYuZ2V0UGFuKCkueCwgeTogdGhpcy5zdmdQYW5ab29tUmVmLmdldFBhbigpLnkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uVXBkYXRlZENUTTogKCkgPT4gdGhpcy51cGRhdGVDbGlwUGF0aCgpLFxyXG4gICAgICAgICAgICAgICAgcmVmcmVzaFJhdGU6ICdhdXRvJ1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkU3R5bGVUb1Jvb3RTdmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDbGlwUGF0aCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5nZXRWaXNpYmxlQXJlYSgpO1xyXG4gICAgICAgIGlmICghYXJlYSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB1cGRhdGUgdGhlIGNsaXBQYXRoXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2xpcFJlY3QgPSB0aGlzLmdldFN2Z1BhcmVudCgpLnF1ZXJ5U2VsZWN0b3IoJyNjbGlwLXBhdGggcmVjdCcpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShjbGlwUmVjdCwgJ3gnLCBTdHJpbmcoYXJlYS54KSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNsaXBSZWN0LCAneScsIFN0cmluZyhhcmVhLnkpKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoY2xpcFJlY3QsICd3aWR0aCcsIFN0cmluZyhhcmVhLndpZHRoKSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNsaXBSZWN0LCAnaGVpZ2h0JywgU3RyaW5nKGFyZWEuaGVpZ2h0KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlQXJlYSgpOiBBcmVhIHtcclxuICAgICAgICBjb25zdCB6b29tID0gdGhpcy5nZXRTdmdQYW5ab29tSW5zdGFuY2UoKT8uZ2V0Wm9vbSgpO1xyXG4gICAgICAgIGNvbnN0IHBhbiA9IHRoaXMuZ2V0U3ZnUGFuWm9vbUluc3RhbmNlKCk/LmdldFBhbigpO1xyXG5cclxuICAgICAgICBpZiAoIXpvb20gfHwgIXBhbikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBCZXBhYWwgZ3Jvb3R0ZSB2YW4gdmlzaWJsZSBhcmVhXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVdpZHRoID0gdGhpcy5wYXJlbnRXaWR0aCAvIHpvb207XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZUhlaWdodCA9IHRoaXMucGFyZW50SGVpZ2h0IC8gem9vbTtcclxuXHJcbiAgICAgICAgLy8gQmVwYWFsIGhldCBudWxwdW50IChsaW5rc2JvdmVuKSB2YW4gZGUgdmlzaWJsZSBhcmVhXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVggPSAtcGFuLnggLyB6b29tO1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVZID0gLXBhbi55IC8gem9vbTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgeDogdmlzaWJsZVgsIHk6IHZpc2libGVZLCB3aWR0aDogdmlzaWJsZVdpZHRoLCBoZWlnaHQ6IHZpc2libGVIZWlnaHQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0eWxlIHdvcmR0IHZhbnVpdCBqYXZhc2NyaXB0IHRvZWdldm9lZ2QgbmEgZGUgY3JlYXRlIHZhbiBTdmdab29tUGFuUmVmIGRlemUgbWFha3QgZWVuIHZpZXdwb3J0IGFhbi5cclxuICAgICAqIC0gQ2xpY2thcmVhIENTUyB3b3JkdCBkeW5hbWlzY2ggYWFuIGRlIFNWRyB0b2VnZXZvZWdkLCBkaXQgdm9vcmtvbXQgZGF0IGRhdCBlciBuZ2NvbnRlbnQgcHJvcGVydHkgb3AgZ2VwbGFhdHN0IHdvcmR0LlxyXG4gICAgICogICBEZSBTVkcncyB3b3JkZW4gbmlldCB2b29yemllbiB2YW4gbmdjb250ZW50IGF0dHJpYnV1dC5cclxuICAgICAqIC0gREdOLmNzcyBpbXBvcnQgd29yZHQgKG9wdGlvbmVlbCkgaW4gZGUgcm9vdCBTVkcgb3BnZW5vbWVuLCBkZXplIGlzIGVlcnN0IHZlcndpamRlcmQgdWl0IGRlIFNWRydzLiBPbSBtZWVyZGVyZSBpbXBvcnRzIHRlIHZvb3Jrb21lbi5cclxuICAgICAqICovXHJcbiAgICBwcml2YXRlIGFkZFN0eWxlVG9Sb290U3ZnKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmdldFN2Z1BhcmVudCgpLmZpcnN0RWxlbWVudENoaWxkLnRhZ05hbWUgIT09ICdkZWZzJykge1xyXG4gICAgICAgICAgICBjb25zdCBkZWZzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdkZWZzJyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmlubGluZURnbkNzc0ltcG9ydCA/ICdAaW1wb3J0IHVybChcImRnbi5jc3NcIik7XFxuJyA6ICcnO1xyXG4gICAgICAgICAgICBzdHlsZSArPVxyXG4gICAgICAgICAgICAgICAgYC5pbXh2aWV3LXNlbGVjdGVkID4gcG9seWxpbmUuaW14dmlldy1jbGlja2FyZWEsIHBvbHlsaW5lLmlteHZpZXctY2xpY2thcmVhIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IHZhcigtLWlteHZpZXctY2xpY2thcmVhLXN0cm9rZSwgdHJhbnNwYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aDogdmFyKC0taW14dmlldy1jbGlja2FyZWEtc3Ryb2tlLXdpZHRoLCAxMHB4KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lO1xyXG4gICAgICAgICAgICAgICAgfWA7XHJcbiAgICAgICAgICAgIGRlZnMuaW5uZXJIVE1MID1cclxuICAgICAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgICAgIDxzdHlsZT4gJHsgc3R5bGUgfSA8L3N0eWxlPlxyXG4gICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcC1wYXRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjBcIiB4PVwiMFwiIHdpZHRoPSR7IHRoaXMucGFyZW50V2lkdGggfSBoZWlnaHQ9JHsgdGhpcy5wYXJlbnRIZWlnaHQgfT5cclxuICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnRDaGlsZCA9IHRoaXMuZ2V0U3ZnUGFyZW50KCkuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3ZnUGFyZW50KCkuaW5zZXJ0QmVmb3JlKGRlZnMsIGZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZURpbWVuc2lvbnNGb3JDbGlwUGF0aCgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkU3ZncygpOiB2b2lkIHtcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuc3ZnSW5mby5tYXAoc3ZnSW5mbyA9PiB0aGlzLmxvYWRTdmcoc3ZnSW5mby5zdmcpKSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoc3ZncyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmNvbmNhdGVuYXRlU3ZncyhzdmdzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9tKHN2Zyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN2Z0dlbGFkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdmdMb2FkZWQuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxheWVkQ2xpY2tBcmVhQ3JlYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2xpY2tFdmVudEhhbmRsZXJzVG9FbGVtZW50cyh0aGlzLmNsaWNrYWJsZUlkcywgJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHModGhpcy5yaWdodENsaWNrYWJsZUlkcywgJ2NvbnRleHRtZW51Jyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEVsZW1lbnRzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE1vdXNlb3ZlckV2ZW50SGFuZGxlclRvRWxlbWVudHMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGltZW5zaW9uc0ZvckNsaXBQYXRoKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHRoaXMuZmxhZ0Vycm9ycyhlcnJvcilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZFN2ZyhzdmdTcmM6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKHN2Z1NyYy5zdGFydHNXaXRoKCdkYXRhOicpKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgICAgICAgIGlmIChzdmdTcmMuc3RhcnRzV2l0aCh0aGlzLlNWR19CQVNFNjRfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhdG9iKHN2Z1NyYy5zdWJzdHJpbmcodGhpcy5TVkdfQkFTRTY0X1BSRUZJWC5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVRocm93RXJyb3IoJ0RhdGEtdXJsIHBhcnNlIGVycm9yJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ZnU3JjLnN0YXJ0c1dpdGgodGhpcy5TVkdfUFJFRklYKSkge1xyXG4gICAgICAgICAgICAgICAgcGFyc2VkID0gc3ZnU3JjLnN1YnN0cmluZyh0aGlzLlNWR19QUkVGSVgubGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVPZihwYXJzZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChzdmdTcmMsIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRDbGlja0V2ZW50SGFuZGxlcnNUb0VsZW1lbnQobGlzdGVuZXJzOiBNYXA8RWxlbWVudCwgYW55PiwgZWxlbSwgZXZlbnRUeXBlOiBzdHJpbmcsIHB1aWM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1BbHJlYWR5SGFzTGlzdGVuZXIgPSBsaXN0ZW5lcnMuZ2V0KGVsZW0pO1xyXG4gICAgICAgIGlmICghZWxlbUFscmVhZHlIYXNMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICBjb25zdCBmbiA9IGV2ZW50VHlwZSA9PT0gJ2NsaWNrJyA/XHJcbiAgICAgICAgICAgICAgICAoZSkgPT4gdGhpcy5jbGlja0hhbmRsZXIuZW1pdChuZXcgU2VsZWN0aWVFdmVudChwdWljLCBlKSkgOlxyXG4gICAgICAgICAgICAgICAgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodENsaWNrSGFuZGxlci5lbWl0KG5ldyBTZWxlY3RpZUV2ZW50KHB1aWMsIGUpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGVsZW0sIGZuKTtcclxuICAgICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4pO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZENsaWNrRXZlbnRIYW5kbGVyc1RvRWxlbWVudHMoY2xpY2thYmxlSWRzOiBzdHJpbmdbXSwgZXZlbnR0eXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlbW92ZU9sZExpc3RlbmVycyhldmVudHR5cGUpO1xyXG5cclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgaWYgKGNsaWNrYWJsZUlkcykge1xyXG4gICAgICAgICAgICBjbGlja2FibGVJZHMuZm9yRWFjaChwdWljID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5wdWljSGVscGVyLmdldEFsbEVsZW1lbnRzRm9yUHVpYyhwdWljKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHRoaXMuYWRkQ2xpY2tFdmVudEhhbmRsZXJzVG9FbGVtZW50KGxpc3RlbmVycywgZWxlbWVudCwgZXZlbnR0eXBlLCBwdWljKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnNldChldmVudHR5cGUsIGxpc3RlbmVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRNb3VzZW92ZXJFdmVudEhhbmRsZXJUb0VsZW1lbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlT2xkTGlzdGVuZXJzKCdtb3VzZW92ZXInKTtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckluZm9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckluZm9zLmZvckVhY2gocG9wb3ZlckluZm8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcG92ZXJJbmZvLnB1aWNBcnJheS5mb3JFYWNoKHB1aWMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbXMgPSB0aGlzLnB1aWNIZWxwZXIuZ2V0QWxsRWxlbWVudHNGb3JQdWljKHB1aWMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVySHRtbENvbnRlbnQgPSBwb3BvdmVySW5mby5wb3BvdmVySHRtbENvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wb3ZlclRpdGxlQ29udGVudCA9IHBvcG92ZXJJbmZvLnBvcG92ZXJUaXRsZUNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGltZW91dCB0byBoYXZlIGNvbnRlbnQgcmVuZGVyZWQgYmVmb3JlIGdldHRpbmcgc2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2hvd1BvcHVwKGUpLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbXMuaXRlbShpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGVsZW0sIGZuKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZuKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuc2V0KCdtb3VzZW92ZXInLCBsaXN0ZW5lcnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbmNhdGVuYXRlU3ZncyhzdmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHN2Z0NvbnRlbnQgPSAnJztcclxuICAgICAgICBsZXQgc3ZnSW5mbyA9IHRoaXMuc3ZnSW5mbztcclxuICAgICAgICBpZiAodGhpcy5hdXRvQWxpZ25TdmdzSG9yaXpvbnRhbGx5KSB7XHJcbiAgICAgICAgICAgIHN2Z0luZm8gPSB0aGlzLnN2Z0Nvb3JkaW5hdGVzU2VydmljZS5zdmdJbmZvc1dpdGhDb29yZGluYXRlcyhzdmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN2Z0luZm8ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlQ29vcmRpbmF0ZXMgPSBzdmdJbmZvW2ldLmNvb3JkaW5hdGVzIHx8IG5ldyBQb2ludCgwLCAwKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICAgICAgLyoqIFZlcndpamRlciBkZ24uY3NzIGltcG9ydCB1aXQgZ2VsZXZlcmRlIFNWRydzLlxyXG4gICAgICAgICAgICAgKiAgRGUgaW1wb3J0IHdvcmR0IG9wdGlvbmVlbCAoc3RhbmRhYXJkIGFhbikgaW4gZGUgcm9vdCBTVkcgZ2VwbGFhdHMgb20gdGUgdm9vcmtvbWVuIGRhdCBkZSBpbXBvcnQgbWVlcm1hYWxzIGdlYmV1cmQuXHJcbiAgICAgICAgICAgICAqICB6aWUgYWRkU3R5bGVUb1Jvb3RTdmcoKVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IHN2Z3NbaV0ucmVwbGFjZSgnQGltcG9ydCB1cmwoXCJkZ24uY3NzXCIpOycsICcnKTtcclxuICAgICAgICAgICAgZGl2LmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZSgneCcsIHNvdXJjZUNvb3JkaW5hdGVzLngudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIGRpdi5maXJzdEVsZW1lbnRDaGlsZC5zZXRBdHRyaWJ1dGUoJ3knLCBzb3VyY2VDb29yZGluYXRlcy55LnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgc3ZnQ29udGVudCArPSBkaXYuaW5uZXJIVE1MO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN2Z0NvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmbGFnRXJyb3JzKGVycm9yKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuZXJyb3JzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZU9sZExpc3RlbmVycyhldmVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50VHlwZSk7XHJcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoZm4sIGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ2NsaWNrJylcclxuICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgSW14Vmlld2VyQ29tcG9uZW50LnNldERlZmF1bHRDdXJzb3IoZWwpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50VHlwZSwgbmV3IE1hcCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdEVsZW1lbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFsbEVsZW1zID0gdGhpcy5nZXRTdmdQYXJlbnQoKS5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3MqPWlteHZpZXctc2VsZWN0ZWRdJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFsbEVsZW1zKSB7XHJcbiAgICAgICAgICAgIENsYXNzZXNVdGlsLnJlbW92ZUNsYXNzZXNTdGFydGluZ1dpdGgoZWxlbWVudCwgJ2lteHZpZXctc2VsZWN0ZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGllSW5mb3MpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RpZUluZm9zLmZvckVhY2goc2VsZWN0aWVJbmZvID0+IHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGllSW5mby5pZHMuZm9yRWFjaChpZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdWljSGVscGVyLmdldEFsbEVsZW1lbnRzRm9yUHVpYyhpZCkuZm9yRWFjaChlbGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Nlc1V0aWwuYWRkQ2xhc3MoZWxlbSwgJ2lteHZpZXctc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcnICE9PSBzZWxlY3RpZUluZm8uY2xhenopIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzZXNVdGlsLmFkZENsYXNzKGVsZW0sICdpbXh2aWV3LXNlbGVjdGVkLScgKyBzZWxlY3RpZUluZm8uY2xhenopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHNldERlZmF1bHRDdXJzb3IoZWw6IEVsZW1lbnQpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IG91ZGVTdHlsZSA9IGVsLmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcclxuICAgICAgICByZXR1cm4gb3VkZVN0eWxlID8gb3VkZVN0eWxlLnJlcGxhY2UoJ3BvaW50ZXInLCAnZGVmYXVsdCcpIDogJ2N1cnNvcjogZGVmYXVsdCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93UG9wdXAoZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHBvcG92ZXJFbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvcG92ZXInKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBsZWZ0ID0gZS5sYXllclggLSAocG9wb3ZlckVsZW0ud2lkdGggLyAyKSArICdweCc7XHJcbiAgICAgICAgY29uc3QgdG9wID0gZS5sYXllclkgLSAocG9wb3ZlckVsZW0uaGVpZ2h0ICsgOCkgKyAncHgnO1xyXG4gICAgICAgIHRoaXMucG9wb3ZlclN0eWxlID0ge1xyXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0LCB0b3A6IHRvcCwgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUnLCB2aXNpYmlsaXR5OiAndmlzaWJsZSdcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlRG9tKHN2Zzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnUGFuWm9vbVJlZklmTm90RXhpc3RzKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN2Z1Bhblpvb21WaWV3cG9ydEVsZW1lbnQgPSB0aGlzLmdldFN2Z1BhcmVudCgpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3N2Zy1wYW4tem9vbV92aWV3cG9ydCcpWzBdO1xyXG4gICAgICAgIHN2Z1Bhblpvb21WaWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGlwLXBhdGgnLCAndXJsKCNjbGlwLXBhdGgpJyk7XHJcbiAgICAgICAgc3ZnUGFuWm9vbVZpZXdwb3J0RWxlbWVudC5pbm5lckhUTUwgPSBzdmcuc3Vic3RyaW5nKHN2Zy5pbmRleE9mKCc8c3ZnJykpO1xyXG5cclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYudXBkYXRlQkJveCgpO1xyXG5cclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYucmVzaXplKCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsUGFuQW5kWm9vbShuZXcgSW14Vmlld2VyQmVoYXZpb3VyQXBpKHRoaXMuc3ZnUGFuWm9vbVJlZikpO1xyXG4gICAgICAgIHRoaXMucHVpY0hlbHBlci5zZXRSb290U3ZnKHRoaXMuZ2V0U3ZnUGFyZW50KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVsYXllZENsaWNrQXJlYUNyZWF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnN2Z0dlbGFkZW4gJiYgdGhpcy51c2VDbGlja0FyZWEpIHtcclxuICAgICAgICAgICAgY29uc3QgY2xpY2thcmVhSWRzID0gbmV3IFNldChbLi4udGhpcy5jbGlja2FibGVJZHMsIC4uLnRoaXMucmlnaHRDbGlja2FibGVJZHMsXHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLnBvcG92ZXJJbmZvcy5mbGF0TWFwKHBpID0+IHBpLnB1aWNBcnJheSldKTtcclxuICAgICAgICAgICAgdGhpcy5jbGlja0FyZWFTZXJ2aWNlLmRlbGF5ZWRDbGlja0FyZWFDcmVhdGlvbihjbGlja2FyZWFJZHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN2Z1BhcmVudCA9ICgpID0+IHRoaXMuc3ZnUGFyZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBBcmVhIHtcclxuICAgIHg6IG51bWJlcjtcclxuICAgIHk6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIFhhbmRZRW5hYmxlZCB7XHJcbiAgICB4OiBib29sZWFuO1xyXG4gICAgeTogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIElteFZpZXdlckJlaGF2aW91ckFwaSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN2Z1Bhblpvb21SZWY6IFN2Z0luc3RhbmNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBhbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZi5wYW4obmV3IFBvaW50KHgsIHkpKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlWm9vbSh6b29tRW5hYmxlZDogYm9vbGVhbik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuc3ZnUGFuWm9vbVJlZi5zZXRCZWZvcmVab29tKCgpID0+IHpvb21FbmFibGVkKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlUGFuKHBhbkVuYWJsZWQ6IGJvb2xlYW4gfCBYYW5kWUVuYWJsZWQpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLnN2Z1Bhblpvb21SZWYuc2V0QmVmb3JlUGFuKCgpID0+IHBhbkVuYWJsZWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmaXQoKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLmZpdCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjZW50ZXIoKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5zdmdQYW5ab29tUmVmLmNlbnRlcigpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgaWQ9XCJpbXh2aWV3ZXJcIiBkYXRhLXRlc3QtaWQ9XCJpbXgtdmlld2VyXCI+XG4gICAgPGRpdiBpZD1cInN2Z0NvbnRhaW5lclwiIGNsYXNzPVwiY29sLW1kLTEyIHRvcDEwXCIgW2hpZGRlbl09XCJlcnJvcnNcIiAoY2xpY2spPVwiaGlkZVBvcE92ZXIoKVwiIGRhdGEtdGVzdC1pZD1cInN2Zy1jb250YWluZXJcIj5cbiAgICAgICAgPHN2ZyAjc3ZnUGFyZW50IHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwicG9wb3ZlclwiIGNsYXNzPVwicG9wb3ZlciB0b3AgYnMtcG9wb3Zlci10b3BcIiBbbmdTdHlsZV09XCJwb3BvdmVyU3R5bGVcIiAobW91c2VsZWF2ZSk9XCJoaWRlUG9wT3ZlcigpXCIgZGF0YS10ZXN0LWlkPVwicG9wb3ZlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj5cbiAgICAgICAgPGgzIGNsYXNzPVwicG9wb3Zlci1oZWFkZXJcIiAqbmdJZj1cInBvcG92ZXJUaXRsZUNvbnRlbnQgIT09IHVuZGVmaW5lZFwiIFtpbm5lckhUTUxdPVwicG9wb3ZlclRpdGxlQ29udGVudFwiIGRhdGEtdGVzdC1pZD1cInBvcG92ZXItaGVhZGVyXCI+PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiIFtpbm5lckhUTUxdPVwicG9wb3Zlckh0bWxDb250ZW50XCIgZGF0YS10ZXN0LWlkPVwicG9wb3Zlci1ib2R5XCI+PC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFuLWV2ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGVsL3Bhbi1ldmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgaW50ZXJmYWNlIFBhbkV2ZW50IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xufVxuIl19
|
|
@@ -298,8 +298,11 @@ class ImxViewerComponent {
|
|
|
298
298
|
this.clickHandler = new EventEmitter();
|
|
299
299
|
this.rightClickHandler = new EventEmitter();
|
|
300
300
|
this.svgLoaded = new EventEmitter();
|
|
301
|
+
//Be mindful that the pan-event occurs often. Catch it with a timeout if you do heavy processing
|
|
302
|
+
this.panned = new EventEmitter();
|
|
301
303
|
this.svgGeladen = false;
|
|
302
304
|
this.eventListeners = new Map();
|
|
305
|
+
this.ignorePanEventBecauseReload = false;
|
|
303
306
|
this.getSvgPanZoomInstance = () => this.svgPanZoomRef;
|
|
304
307
|
this.hidePopOver = () => this.popoverStyle.visibility = 'hidden';
|
|
305
308
|
this.getSvgParent = () => this.svgParentRef.nativeElement;
|
|
@@ -325,6 +328,7 @@ class ImxViewerComponent {
|
|
|
325
328
|
this.delayedClickAreaCreation();
|
|
326
329
|
}
|
|
327
330
|
if (this.svgInfo && svgInfo) {
|
|
331
|
+
this.ignorePanEventBecauseReload = true;
|
|
328
332
|
this.loadSvgs();
|
|
329
333
|
}
|
|
330
334
|
if (this.clickableIds && clickableIds && this.svgGeladen) {
|
|
@@ -365,7 +369,15 @@ class ImxViewerComponent {
|
|
|
365
369
|
center: true,
|
|
366
370
|
dblClickZoomEnabled: false,
|
|
367
371
|
onZoom: () => this.hidePopOver(),
|
|
368
|
-
onPan: () =>
|
|
372
|
+
onPan: () => {
|
|
373
|
+
this.hidePopOver();
|
|
374
|
+
if (this.ignorePanEventBecauseReload) {
|
|
375
|
+
this.ignorePanEventBecauseReload = false;
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
this.panned.emit({ x: this.svgPanZoomRef.getPan().x, y: this.svgPanZoomRef.getPan().y });
|
|
379
|
+
}
|
|
380
|
+
},
|
|
369
381
|
onUpdatedCTM: () => this.updateClipPath(),
|
|
370
382
|
refreshRate: 'auto'
|
|
371
383
|
});
|
|
@@ -418,7 +430,7 @@ class ImxViewerComponent {
|
|
|
418
430
|
}`;
|
|
419
431
|
defs.innerHTML =
|
|
420
432
|
`
|
|
421
|
-
<style
|
|
433
|
+
<style> ${style} </style>
|
|
422
434
|
<clipPath id="clip-path">
|
|
423
435
|
<rect x="0" x="0" width=${this.parentWidth} height=${this.parentHeight}>
|
|
424
436
|
</clipPath>
|
|
@@ -482,16 +494,19 @@ class ImxViewerComponent {
|
|
|
482
494
|
}
|
|
483
495
|
}
|
|
484
496
|
addClickEventHandlersToElements(clickableIds, eventtype) {
|
|
485
|
-
|
|
497
|
+
this.removeOldListeners(eventtype);
|
|
498
|
+
const listeners = new Map();
|
|
486
499
|
if (clickableIds) {
|
|
487
500
|
clickableIds.forEach(puic => {
|
|
488
501
|
const elements = this.puicHelper.getAllElementsForPuic(puic);
|
|
489
502
|
elements.forEach((element) => this.addClickEventHandlersToElement(listeners, element, eventtype, puic));
|
|
490
503
|
});
|
|
491
504
|
}
|
|
505
|
+
this.eventListeners.set(eventtype, listeners);
|
|
492
506
|
}
|
|
493
507
|
addMouseoverEventHandlerToElements() {
|
|
494
|
-
|
|
508
|
+
this.removeOldListeners('mouseover');
|
|
509
|
+
const listeners = new Map();
|
|
495
510
|
if (this.popoverInfos) {
|
|
496
511
|
this.popoverInfos.forEach(popoverInfo => {
|
|
497
512
|
popoverInfo.puicArray.forEach(puic => {
|
|
@@ -509,6 +524,7 @@ class ImxViewerComponent {
|
|
|
509
524
|
}
|
|
510
525
|
});
|
|
511
526
|
});
|
|
527
|
+
this.eventListeners.set('mouseover', listeners);
|
|
512
528
|
}
|
|
513
529
|
}
|
|
514
530
|
concatenateSvgs(svgs) {
|
|
@@ -535,8 +551,8 @@ class ImxViewerComponent {
|
|
|
535
551
|
console.log(error);
|
|
536
552
|
this.errors = true;
|
|
537
553
|
}
|
|
538
|
-
|
|
539
|
-
|
|
554
|
+
removeOldListeners(eventType) {
|
|
555
|
+
const listeners = this.eventListeners.get(eventType);
|
|
540
556
|
if (listeners) {
|
|
541
557
|
listeners.forEach((fn, el) => {
|
|
542
558
|
el.removeEventListener(eventType, fn);
|
|
@@ -544,9 +560,7 @@ class ImxViewerComponent {
|
|
|
544
560
|
el.setAttribute('style', ImxViewerComponent.setDefaultCursor(el));
|
|
545
561
|
});
|
|
546
562
|
}
|
|
547
|
-
|
|
548
|
-
this.eventListeners.set(eventType, listeners);
|
|
549
|
-
return listeners;
|
|
563
|
+
this.eventListeners.set(eventType, new Map());
|
|
550
564
|
}
|
|
551
565
|
selectElements() {
|
|
552
566
|
const allElems = this.getSvgParent().querySelectorAll('[class*=imxview-selected]');
|
|
@@ -599,7 +613,7 @@ class ImxViewerComponent {
|
|
|
599
613
|
}
|
|
600
614
|
}
|
|
601
615
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ImxViewerComponent, deps: [{ token: DocumentToken }, { token: i1.HttpClient }, { token: ClickareaService }, { token: PuicHelperService }, { token: i0.Renderer2 }, { token: SvgCoordinatesService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
602
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: ImxViewerComponent, selector: "imx-viewer", inputs: { useClickArea: "useClickArea", inlineDgnCssImport: "inlineDgnCssImport", svgInfo: "svgInfo", selectieInfos: "selectieInfos", clickableIds: "clickableIds", rightClickableIds: "rightClickableIds", popoverInfos: "popoverInfos", zoomScaleSensitivity: "zoomScaleSensitivity", autoAlignSvgsHorizontally: "autoAlignSvgsHorizontally", initialPanAndZoom: "initialPanAndZoom" }, outputs: { clickHandler: "clickHandler", rightClickHandler: "rightClickHandler", svgLoaded: "svgLoaded" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "svgParentRef", first: true, predicate: ["svgParent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\" data-test-id=\"svg-container\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"></svg>\n </div>\n <div id=\"popover\" class=\"popover top bs-popover-top\" [ngStyle]=\"popoverStyle\" (mouseleave)=\"hidePopOver()\" data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-header\" *ngIf=\"popoverTitleContent !== undefined\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n", styles: [".popover{top:0;left:0;z-index:1060;max-width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;visibility:hidden}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem;left:40%}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
|
|
616
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: ImxViewerComponent, selector: "imx-viewer", inputs: { useClickArea: "useClickArea", inlineDgnCssImport: "inlineDgnCssImport", svgInfo: "svgInfo", selectieInfos: "selectieInfos", clickableIds: "clickableIds", rightClickableIds: "rightClickableIds", popoverInfos: "popoverInfos", zoomScaleSensitivity: "zoomScaleSensitivity", autoAlignSvgsHorizontally: "autoAlignSvgsHorizontally", initialPanAndZoom: "initialPanAndZoom" }, outputs: { clickHandler: "clickHandler", rightClickHandler: "rightClickHandler", svgLoaded: "svgLoaded", panned: "panned" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "svgParentRef", first: true, predicate: ["svgParent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\" data-test-id=\"svg-container\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"></svg>\n </div>\n <div id=\"popover\" class=\"popover top bs-popover-top\" [ngStyle]=\"popoverStyle\" (mouseleave)=\"hidePopOver()\" data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-header\" *ngIf=\"popoverTitleContent !== undefined\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n", styles: [".popover{top:0;left:0;z-index:1060;max-width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;visibility:hidden}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem;left:40%}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:#00000040}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:#00000040}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:#00000040}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:#00000040}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
|
|
603
617
|
}
|
|
604
618
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ImxViewerComponent, decorators: [{
|
|
605
619
|
type: Component,
|
|
@@ -636,6 +650,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
|
|
|
636
650
|
type: Output
|
|
637
651
|
}], svgLoaded: [{
|
|
638
652
|
type: Output
|
|
653
|
+
}], panned: [{
|
|
654
|
+
type: Output
|
|
639
655
|
}], onResize: [{
|
|
640
656
|
type: HostListener,
|
|
641
657
|
args: ['window:resize']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loxia-imx-viewer.mjs","sources":["../../src/model/point.ts","../../src/model/selectie-event.ts","../../src/utils/classes-util.ts","../../src/utils/document-token.ts","../../src/utils/svg-rect-util.ts","../../src/utils/focus-util.ts","../../src/services/puic-helper.service.ts","../../src/services/clickarea.service.ts","../../src/model/svg-info.ts","../../src/components/svg-coordinates.service.ts","../../src/components/imx-viewer.component.ts","../../src/components/imx-viewer.component.html","../../src/imx-viewer.module.ts","../../src/model/popover-info.ts","../../src/model/selectie-info.ts","../../src/loxia-imx-viewer.ts"],"sourcesContent":["export class Point {\r\n constructor(public x: number, public y: number) {\r\n }\r\n}\r\n","export class SelectieEvent {\r\n constructor(public id: string, public event: MouseEvent) {\r\n }\r\n}\r\n","export class ClassesUtil {\n static addClass(elem: Element, cls: string) {\n if ('' === cls) {\n return;\n }\n const classAttr = elem.getAttribute('class');\n const classes = classAttr ? classAttr.split(' ') : [];\n for (let j = 0; j < classes.length; j++) {\n if (classes[j] === cls) {\n return;\n }\n }\n elem.setAttribute('class', classAttr ? classAttr + ' ' + cls : cls);\n }\n\n static removeClassesStartingWith(elem: Element, cls: string) {\n const classAttr = elem.getAttribute('class');\n if (!classAttr) {\n return;\n }\n const classes = classAttr.split(' ');\n let j = classes.length;\n while (j--) {\n if (classes[j].indexOf(cls) === 0) {\n classes.splice(j, 1);\n }\n }\n\n if (classes.length === 0) {\n elem.removeAttribute('class');\n } else {\n elem.setAttribute('class', classes.join(' '));\n }\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const DocumentToken = new InjectionToken('Document');\nexport function documentProvider(): Document {\n return document;\n}\n","export class SvgRectUtil {\n\n // copied from java.awt.Rectangle\n public static rectUnion(r1: SVGRect, r2: SVGRect): SVGRect {\n if (!r1) {\n return r2;\n }\n\n let tx2 = r1.width;\n let ty2 = r1.height;\n if ((tx2 | ty2) < 0) { // tslint:disable-line\n // This rectangle has negative dimensions...\n // If r has non-negative dimensions then it is the answer.\n // If r is non-existant (has a negative dimension), then both\n // are non-existant and we can return any non-existant rectangle\n // as an answer. Thus, returning r meets that criterion.\n // Either way, r is our answer.\n return r2;\n }\n let rx2 = r2.width;\n let ry2 = r2.height;\n if ((rx2 | ry2) < 0) { // tslint:disable-line\n return r1;\n }\n let tx1 = r1.x;\n let ty1 = r1.y;\n tx2 += tx1;\n ty2 += ty1;\n const rx1 = r2.x;\n const ry1 = r2.y;\n rx2 += rx1;\n ry2 += ry1;\n if (tx1 > rx1) {\n tx1 = rx1;\n }\n if (ty1 > ry1) {\n ty1 = ry1;\n }\n if (tx2 < rx2) {\n tx2 = rx2;\n }\n if (ty2 < ry2) {\n ty2 = ry2;\n }\n tx2 -= tx1;\n ty2 -= ty1;\n\n return new DOMRect(tx1, ty1, tx2, ty2);\n }\n}\n","import { SvgInstance } from '../components/imx-viewer.component';\nimport { PuicHelperService } from '../services/puic-helper.service';\nimport { SvgRectUtil } from './svg-rect-util';\n\nexport class FocusUtil {\n\n public static focusOnIds(focusIds: string[], svgPanZoomRef: SvgInstance, puicHelper: PuicHelperService) {\n if (focusIds && focusIds.length > 0) {\n\n // calculate the union rectangle of elements with ids\n const svgContainer = document.getElementById('svgContainer');\n const rootSvgDoc = svgContainer.firstChild as SVGSVGElement;\n let resultRect: SVGRect;\n if (rootSvgDoc && rootSvgDoc.nodeName === 'svg') {\n focusIds.forEach(puic => {\n const elems: NodeListOf<HTMLElement> = puicHelper.getAllElementsForPuic(puic);\n for (let i = 0; i < elems.length; i++) {\n const elementRect = FocusUtil.getElementRectangleWithNestedSvgOffset(elems[i]);\n resultRect = SvgRectUtil.rectUnion(resultRect, elementRect);\n }\n });\n }\n FocusUtil.focusOnRect(resultRect, svgContainer.getBoundingClientRect(), rootSvgDoc, svgPanZoomRef);\n }\n }\n\n static focusOnRect(rect: SVGRect, elementRect: ClientRect, rootSvgDoc: SVGSVGElement, svgPanZoomRef: any) {\n if (rect) {\n // make sure we are in the svgpanzoom transformed area\n const matrix = (rootSvgDoc.getElementsByClassName('svg-pan-zoom_viewport')[0] as SVGGElement).getScreenCTM();\n\n // get from svg coordinate system to webpage coordinate system\n const location = rootSvgDoc.createSVGPoint();\n location.x = rect.x + (rect.width / 2);\n location.y = rect.y + (rect.height / 2);\n const transformedLocation = location.matrixTransform(matrix);\n\n // transform the rectangle dimension (we have to use a SVGPoint since there is no SVGDimension)\n const size = rootSvgDoc.createSVGPoint();\n size.x = rect.width;\n size.y = rect.height;\n const transformedSize = size.matrixTransform(matrix.inverse());\n\n // tel the svgPanZoom to zoom on the rectangle in relation to the total view size\n const zoomFactor = Math.min(5, elementRect.height / Math.abs(transformedSize.y));\n svgPanZoomRef.zoomAtPoint(zoomFactor,\n { x: transformedLocation.x - elementRect.left, y: transformedLocation.y - elementRect.top });\n // tel the svgPanZoom to pan to the middel of the rectangle\n svgPanZoomRef.panBy({\n x: (elementRect.width / 2) - transformedLocation.x,\n y: ((elementRect.height + elementRect.top) / 2) - transformedLocation.y\n });\n }\n }\n\n private static getElementRectangleWithNestedSvgOffset(elem: Element): SVGRect {\n const svgElem = (<SVGGraphicsElement> elem);\n const rect = svgElem.getBBox();\n\n while (elem.parentElement.nodeName !== 'svg') {\n elem = elem.parentElement;\n }\n elem = elem.parentElement;\n rect.x = rect.x + parseInt(elem.getAttribute('x'), 10);\n rect.y = rect.y + parseInt(elem.getAttribute('y'), 10);\n const viewBox = elem.getAttribute('viewBox');\n if (viewBox) {\n const viewBoxCoordinates = viewBox.split(' ');\n rect.x = rect.x - parseInt(viewBoxCoordinates[0], 10);\n rect.y = rect.y - parseInt(viewBoxCoordinates[1], 10);\n }\n return rect;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PuicHelperService {\n private rootSvg: any;\n\n public setRootSvg = (svgParent: SVGSVGElement) => this.rootSvg = svgParent;\n public getAllElementsForPuic = (puic: string) => this.rootSvg.querySelectorAll(`.p${ puic }, #p${ puic }`) as NodeListOf<HTMLElement>;\n}\n","import { Injectable } from '@angular/core';\nimport { PuicHelperService } from './puic-helper.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ClickareaService {\n private timer: number;\n timeout = 250;\n\n constructor(private puicHelper: PuicHelperService) {\n }\n\n delayedClickAreaCreation(ids: Set<string>) {\n if (ids.size === 0) {\n return;\n }\n\n window.clearTimeout(this.timer);\n this.timer = window.setTimeout(() => this.createClickareas(ids), this.timeout);\n }\n\n /**\n * Mogelijke optimalisatie is om de delta te bepalen van de te verwerken ids\n */\n private createClickareas(ids: Set<string>) {\n Array.from(document.getElementsByClassName('imxview-clickarea')).forEach(x => x.remove());\n\n ids.forEach(id => {\n this.puicHelper.getAllElementsForPuic(id).forEach(element => {\n if (element) {\n const polylines = Array.from(element.getElementsByTagName('polyline'));\n polylines.forEach(p => {\n const clone = p.cloneNode(true) as Element;\n clone.setAttribute('class', 'imxview-clickarea');\n clone.removeAttribute('id');\n element.insertBefore(clone, p);\n });\n }\n });\n });\n }\n}\n","import { Point } from './point';\r\n\r\nexport class SvgInfo {\r\n constructor(public svg: string, public coordinates?: Point) {\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { Point } from '../model/point';\nimport { SvgInfo } from '../model/svg-info';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SvgCoordinatesService {\n svgInfosWithCoordinates(svgs: string[]): SvgInfo[] {\n let nextCoords = new Point(0, 0);\n const infos: SvgInfo[] = [];\n svgs.forEach(svg => {\n if (svg) {\n infos.push(new SvgInfo('data:image/svg+xml,' + svg, nextCoords));\n nextCoords = new Point(nextCoords.x + this.getXCoordinate(svg), 0);\n }\n });\n return infos;\n }\n\n private getXCoordinate(decodedSvgDataUrl: string) {\n let div = document.createElement('div');\n div.innerHTML = decodedSvgDataUrl;\n // De SVG-width wordt in de eerste group gespecificeerd.\n const x = div.firstElementChild.querySelector('g').getAttribute('width');\n const result = parseFloat(x);\n div = null;\n return result;\n }\n}\n","import { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n SimpleChanges,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { combineLatest, Observable, of as observableOf, throwError as observableThrowError } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\nimport SvgPanZoom from 'svg-pan-zoom';\r\nimport { Point } from '../model/point';\r\nimport { PopoverInfo } from '../model/popover-info';\r\nimport { SelectieEvent } from '../model/selectie-event';\r\nimport { SelectieInfo } from '../model/selectie-info';\r\nimport { SvgInfo } from '../model/svg-info';\r\nimport { ClickareaService } from '../services/clickarea.service';\r\nimport { PuicHelperService } from '../services/puic-helper.service';\r\nimport { ClassesUtil } from '../utils/classes-util';\r\nimport { DocumentToken } from '../utils/document-token';\r\nimport { FocusUtil } from '../utils/focus-util';\r\nimport { SvgCoordinatesService } from './svg-coordinates.service';\r\n\r\n// SvgPanZoom.Instance cannot be used in libs that use this imx-viewer lib because it is exported in an old, non angular 16 compatible way.\r\nexport type SvgInstance = typeof SvgPanZoom;\r\n\r\n@Component({\r\n selector: 'imx-viewer',\r\n templateUrl: './imx-viewer.component.html',\r\n styleUrls: ['./imx-viewer.component.css']\r\n})\r\nexport class ImxViewerComponent implements OnChanges, OnInit, OnDestroy {\r\n private SVG_BASE64_PREFIX = 'data:image/svg+xml;base64,';\r\n private SVG_PREFIX = 'data:image/svg+xml,';\r\n\r\n @Input() useClickArea = false;\r\n @Input() inlineDgnCssImport = false;\r\n @Input() svgInfo: SvgInfo[];\r\n @Input() selectieInfos: SelectieInfo[] = [];\r\n\r\n // Onderstaande inputs worden meegenomen voor clickarea:\r\n @Input() clickableIds: string[] = [];\r\n @Input() rightClickableIds: string[] = [];\r\n @Input() popoverInfos: PopoverInfo[] = [];\r\n @Input() zoomScaleSensitivity = 0.2;\r\n @Input() autoAlignSvgsHorizontally = false;\r\n //Use this input to change the initial pan and zoom of the svg. Default behaviour is .fit() and .center().\r\n @Input() initialPanAndZoom = (imxViewerBehaviourApi: ImxViewerBehaviourApi): void => {\r\n imxViewerBehaviourApi.fit();\r\n imxViewerBehaviourApi.center();\r\n };\r\n\r\n @ViewChild('svgParent', { static: true }) svgParentRef: ElementRef;\r\n\r\n errors = false;\r\n popoverStyle: any = { display: 'inline' };\r\n popoverHtmlContent = '';\r\n popoverTitleContent: string;\r\n parentWidth = 0;\r\n parentHeight = 0;\r\n\r\n @Output() clickHandler = new EventEmitter<SelectieEvent>();\r\n @Output() rightClickHandler = new EventEmitter<SelectieEvent>();\r\n @Output() svgLoaded = new EventEmitter<void>();\r\n\r\n private svgGeladen = false;\r\n private eventListeners: Map<string, Map<Element, any>> = new Map();\r\n private svgPanZoomRef: SvgInstance;\r\n\r\n constructor(\r\n @Inject(DocumentToken) private readonly document: any,\r\n private readonly http: HttpClient,\r\n private readonly clickAreaService: ClickareaService,\r\n private readonly puicHelper: PuicHelperService,\r\n private readonly renderer: Renderer2,\r\n private readonly svgCoordinatesService: SvgCoordinatesService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createSvgPanZoomRefIfNotExists();\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize(): void {\r\n this.updateDimensionsForClipPath();\r\n }\r\n\r\n private updateDimensionsForClipPath(): void {\r\n // Update parentWidth and parentHeight based on the parent div dimensions\r\n this.parentWidth = this.getSvgParent().parentElement.offsetWidth;\r\n this.parentHeight = this.getSvgParent().parentElement.offsetHeight;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // If Imx-viewer is initialized with svgInfo, ngOnChanges is called before ngOnInit.\r\n // In that case we need to create svgPanZoomRef here.\r\n this.createSvgPanZoomRefIfNotExists();\r\n\r\n const { useClickArea, clickableIds, rightClickableIds, popoverInfos, selectieInfos, svgInfo } = changes;\r\n\r\n if (useClickArea || clickableIds || rightClickableIds || popoverInfos) {\r\n this.delayedClickAreaCreation();\r\n }\r\n\r\n if (this.svgInfo && svgInfo) {\r\n this.loadSvgs();\r\n }\r\n\r\n if (this.clickableIds && clickableIds && this.svgGeladen) {\r\n this.addClickEventHandlersToElements(this.clickableIds, 'click');\r\n }\r\n\r\n if (this.rightClickableIds && rightClickableIds && this.svgGeladen) {\r\n this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');\r\n }\r\n\r\n if (this.selectieInfos && selectieInfos && this.svgGeladen) {\r\n this.selectElements();\r\n }\r\n\r\n if (this.popoverInfos && popoverInfos && this.svgGeladen) {\r\n this.addMouseoverEventHandlerToElements();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.svgPanZoomRef?.destroy();\r\n this.svgPanZoomRef = undefined;\r\n }\r\n\r\n public focusOnIds(focusIds: string[]): void {\r\n FocusUtil.focusOnIds(focusIds, this.svgPanZoomRef, this.puicHelper);\r\n }\r\n\r\n public getSvgPanZoomInstance: () => SvgInstance = () => this.svgPanZoomRef;\r\n\r\n // Here only used in test, but also used by applications. Do not remove.\r\n public static getXCoordinate(decodedSvgDataUrl: string): number {\r\n let div = document.createElement('div');\r\n div.innerHTML = decodedSvgDataUrl;\r\n // De SVG-width wordt in de svg tag gespecificeerd.\r\n const x = div.firstElementChild.getAttribute('width');\r\n const result = parseFloat(x);\r\n div = null;\r\n return result;\r\n }\r\n\r\n hidePopOver = (): string => this.popoverStyle.visibility = 'hidden';\r\n\r\n private createSvgPanZoomRefIfNotExists(): void {\r\n if (!this.svgPanZoomRef) {\r\n this.svgPanZoomRef = SvgPanZoom(this.getSvgParent(), {\r\n zoomScaleSensitivity: this.zoomScaleSensitivity,\r\n fit: false,\r\n center: true,\r\n dblClickZoomEnabled: false,\r\n onZoom: () => this.hidePopOver(),\r\n onPan: () => this.hidePopOver(),\r\n onUpdatedCTM: () => this.updateClipPath(),\r\n refreshRate: 'auto'\r\n });\r\n\r\n this.addStyleToRootSvg();\r\n }\r\n }\r\n\r\n private updateClipPath(): void {\r\n const area = this.getVisibleArea();\r\n if (!area) {\r\n return;\r\n }\r\n\r\n // update the clipPath\r\n requestAnimationFrame(() => {\r\n const clipRect = this.getSvgParent().querySelector('#clip-path rect');\r\n this.renderer.setAttribute(clipRect, 'x', String(area.x));\r\n this.renderer.setAttribute(clipRect, 'y', String(area.y));\r\n this.renderer.setAttribute(clipRect, 'width', String(area.width));\r\n this.renderer.setAttribute(clipRect, 'height', String(area.height));\r\n });\r\n }\r\n\r\n private getVisibleArea(): Area {\r\n const zoom = this.getSvgPanZoomInstance()?.getZoom();\r\n const pan = this.getSvgPanZoomInstance()?.getPan();\r\n\r\n if (!zoom || !pan) {\r\n return;\r\n }\r\n\r\n // Bepaal grootte van visible area\r\n const visibleWidth = this.parentWidth / zoom;\r\n const visibleHeight = this.parentHeight / zoom;\r\n\r\n // Bepaal het nulpunt (linksboven) van de visible area\r\n const visibleX = -pan.x / zoom;\r\n const visibleY = -pan.y / zoom;\r\n\r\n return { x: visibleX, y: visibleY, width: visibleWidth, height: visibleHeight };\r\n }\r\n\r\n /**\r\n * Style wordt vanuit javascript toegevoegd na de create van SvgZoomPanRef deze maakt een viewport aan.\r\n * - Clickarea CSS wordt dynamisch aan de SVG toegevoegd, dit voorkomt dat dat er ngcontent property op geplaatst wordt.\r\n * De SVG's worden niet voorzien van ngcontent attribuut.\r\n * - DGN.css import wordt (optioneel) in de root SVG opgenomen, deze is eerst verwijderd uit de SVG's. Om meerdere imports te voorkomen.\r\n * */\r\n private addStyleToRootSvg(): void {\r\n if (this.getSvgParent().firstElementChild.tagName !== 'defs') {\r\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\r\n\r\n let style = this.inlineDgnCssImport ? '@import url(\"dgn.css\");\\n' : '';\r\n style +=\r\n `.imxview-selected > polyline.imxview-clickarea, polyline.imxview-clickarea {\r\n stroke: var(--imxview-clickarea-stroke, transparent);\r\n stroke-width: var(--imxview-clickarea-stroke-width, 10px);\r\n stroke-dasharray: none;\r\n }`;\r\n defs.innerHTML =\r\n `\r\n <style type=\"text/css\"> ${ style } </style>\r\n <clipPath id=\"clip-path\">\r\n <rect x=\"0\" x=\"0\" width=${ this.parentWidth } height=${ this.parentHeight }>\r\n </clipPath>\r\n `;\r\n const firstElementChild = this.getSvgParent().firstElementChild;\r\n this.getSvgParent().insertBefore(defs, firstElementChild);\r\n setTimeout(() => this.updateDimensionsForClipPath());\r\n }\r\n }\r\n\r\n private loadSvgs(): void {\r\n combineLatest(this.svgInfo.map(svgInfo => this.loadSvg(svgInfo.svg)))\r\n .pipe(take(1))\r\n .subscribe(svgs => {\r\n const svg = this.concatenateSvgs(svgs);\r\n this.updateDom(svg);\r\n this.svgGeladen = true;\r\n this.svgLoaded.emit();\r\n this.delayedClickAreaCreation();\r\n this.addClickEventHandlersToElements(this.clickableIds, 'click');\r\n this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');\r\n this.selectElements();\r\n this.addMouseoverEventHandlerToElements();\r\n this.updateDimensionsForClipPath();\r\n },\r\n error => this.flagErrors(error)\r\n );\r\n }\r\n\r\n private loadSvg(svgSrc: string): Observable<string> {\r\n if (svgSrc.startsWith('data:')) {\r\n let parsed;\r\n if (svgSrc.startsWith(this.SVG_BASE64_PREFIX)) {\r\n try {\r\n parsed = atob(svgSrc.substring(this.SVG_BASE64_PREFIX.length));\r\n } catch (e) {\r\n return observableThrowError('Data-url parse error');\r\n }\r\n } else if (svgSrc.startsWith(this.SVG_PREFIX)) {\r\n parsed = svgSrc.substring(this.SVG_PREFIX.length);\r\n }\r\n\r\n if (parsed) {\r\n return observableOf(parsed);\r\n }\r\n }\r\n\r\n return this.http.get(svgSrc, { responseType: 'text' });\r\n }\r\n\r\n private addClickEventHandlersToElement(listeners: Map<Element, any>, elem, eventType: string, puic: string): void {\r\n const elemAlreadyHasListener = listeners.get(elem);\r\n if (!elemAlreadyHasListener) {\r\n const fn = eventType === 'click' ?\r\n (e) => this.clickHandler.emit(new SelectieEvent(puic, e)) :\r\n (e) => {\r\n e.preventDefault();\r\n this.rightClickHandler.emit(new SelectieEvent(puic, e));\r\n return false;\r\n };\r\n listeners.set(elem, fn);\r\n elem.addEventListener(eventType, fn);\r\n if (eventType === 'click') {\r\n elem.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n\r\n private addClickEventHandlersToElements(clickableIds: string[], eventtype: string): void {\r\n const listeners = this.removeOldState(eventtype);\r\n\r\n if (clickableIds) {\r\n clickableIds.forEach(puic => {\r\n const elements = this.puicHelper.getAllElementsForPuic(puic);\r\n elements.forEach((element) => this.addClickEventHandlersToElement(listeners, element, eventtype, puic));\r\n });\r\n }\r\n }\r\n\r\n private addMouseoverEventHandlerToElements(): void {\r\n const listeners = this.removeOldState('mouseover');\r\n if (this.popoverInfos) {\r\n this.popoverInfos.forEach(popoverInfo => {\r\n popoverInfo.puicArray.forEach(puic => {\r\n const elems = this.puicHelper.getAllElementsForPuic(puic);\r\n for (let i = 0; i < elems.length; i++) {\r\n const fn = (e) => {\r\n this.popoverHtmlContent = popoverInfo.popoverHtmlContent;\r\n this.popoverTitleContent = popoverInfo.popoverTitleContent;\r\n\r\n // use timeout to have content rendered before getting size\r\n setTimeout(() => this.showPopup(e), 0);\r\n };\r\n\r\n const elem = elems.item(i);\r\n listeners.set(elem, fn);\r\n elem.addEventListener('mouseover', fn);\r\n }\r\n }\r\n );\r\n }\r\n );\r\n }\r\n }\r\n\r\n private concatenateSvgs(svgs: string[]): string {\r\n let svgContent = '';\r\n let svgInfo = this.svgInfo;\r\n if (this.autoAlignSvgsHorizontally) {\r\n svgInfo = this.svgCoordinatesService.svgInfosWithCoordinates(svgs);\r\n }\r\n for (let i = 0, len = svgInfo.length; i < len; i++) {\r\n const sourceCoordinates = svgInfo[i].coordinates || new Point(0, 0);\r\n\r\n const div = document.createElement('div');\r\n\r\n /** Verwijder dgn.css import uit geleverde SVG's.\r\n * De import wordt optioneel (standaard aan) in de root SVG geplaats om te voorkomen dat de import meermaals gebeurd.\r\n * zie addStyleToRootSvg()\r\n */\r\n div.innerHTML = svgs[i].replace('@import url(\"dgn.css\");', '');\r\n div.firstElementChild.setAttribute('x', sourceCoordinates.x.toString());\r\n div.firstElementChild.setAttribute('y', sourceCoordinates.y.toString());\r\n\r\n svgContent += div.innerHTML;\r\n }\r\n\r\n return svgContent;\r\n }\r\n\r\n private flagErrors(error): void {\r\n console.log(error);\r\n this.errors = true;\r\n }\r\n\r\n private removeOldState(eventType: string): Map<Element, any> {\r\n let listeners = this.eventListeners.get(eventType);\r\n if (listeners) {\r\n listeners.forEach((fn, el) => {\r\n el.removeEventListener(eventType, fn);\r\n if (eventType === 'click')\r\n el.setAttribute('style', ImxViewerComponent.setDefaultCursor(el));\r\n });\r\n }\r\n listeners = new Map();\r\n this.eventListeners.set(eventType, listeners);\r\n return listeners;\r\n }\r\n\r\n private selectElements(): void {\r\n const allElems = this.getSvgParent().querySelectorAll('[class*=imxview-selected]');\r\n for (const element of allElems) {\r\n ClassesUtil.removeClassesStartingWith(element, 'imxview-selected');\r\n }\r\n\r\n if (this.selectieInfos) {\r\n this.selectieInfos.forEach(selectieInfo => {\r\n selectieInfo.ids.forEach(id => {\r\n this.puicHelper.getAllElementsForPuic(id).forEach(elem => {\r\n ClassesUtil.addClass(elem, 'imxview-selected');\r\n if ('' !== selectieInfo.clazz) {\r\n ClassesUtil.addClass(elem, 'imxview-selected-' + selectieInfo.clazz);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n private static setDefaultCursor(el: Element): string {\r\n const oudeStyle = el.getAttribute('style');\r\n return oudeStyle ? oudeStyle.replace('pointer', 'default') : 'cursor: default';\r\n }\r\n\r\n private showPopup(e): void {\r\n const popoverElem = document.getElementById('popover').getBoundingClientRect();\r\n const left = e.layerX - (popoverElem.width / 2) + 'px';\r\n const top = e.layerY - (popoverElem.height + 8) + 'px';\r\n this.popoverStyle = {\r\n left: left, top: top, position: 'absolute',\r\n display: 'inline', visibility: 'visible'\r\n };\r\n }\r\n\r\n private updateDom(svg: string): void {\r\n this.svgPanZoomRef.destroy();\r\n this.svgPanZoomRef = null;\r\n this.createSvgPanZoomRefIfNotExists();\r\n\r\n const svgPanZoomViewportElement = this.getSvgParent().getElementsByClassName('svg-pan-zoom_viewport')[0];\r\n svgPanZoomViewportElement.setAttribute('clip-path', 'url(#clip-path)');\r\n svgPanZoomViewportElement.innerHTML = svg.substring(svg.indexOf('<svg'));\r\n\r\n this.svgPanZoomRef.updateBBox();\r\n\r\n this.svgPanZoomRef.resize();\r\n this.initialPanAndZoom(new ImxViewerBehaviourApi(this.svgPanZoomRef));\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n private delayedClickAreaCreation(): void {\r\n if (this.svgGeladen && this.useClickArea) {\r\n const clickareaIds = new Set([...this.clickableIds, ...this.rightClickableIds,\r\n ...this.popoverInfos.flatMap(pi => pi.puicArray)]);\r\n this.clickAreaService.delayedClickAreaCreation(clickareaIds);\r\n }\r\n }\r\n\r\n private getSvgParent = () => this.svgParentRef.nativeElement;\r\n}\r\n\r\ninterface Area {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\ninterface XandYEnabled {\r\n x: boolean;\r\n y: boolean;\r\n}\r\n\r\nexport class ImxViewerBehaviourApi {\r\n constructor(private readonly svgPanZoomRef: SvgInstance) {\r\n }\r\n\r\n public pan(x: number, y: number): this {\r\n this.svgPanZoomRef.pan(new Point(x, y));\r\n return this;\r\n }\r\n\r\n public enableZoom(zoomEnabled: boolean): this {\r\n this.svgPanZoomRef.setBeforeZoom(() => zoomEnabled);\r\n return this;\r\n }\r\n\r\n public enablePan(panEnabled: boolean | XandYEnabled): this {\r\n this.svgPanZoomRef.setBeforePan(() => panEnabled);\r\n return this;\r\n }\r\n\r\n public fit(): this {\r\n this.svgPanZoomRef.fit();\r\n return this;\r\n }\r\n\r\n public center(): this {\r\n this.svgPanZoomRef.center();\r\n return this;\r\n }\r\n}\r\n","<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\" data-test-id=\"svg-container\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"></svg>\n </div>\n <div id=\"popover\" class=\"popover top bs-popover-top\" [ngStyle]=\"popoverStyle\" (mouseleave)=\"hidePopOver()\" data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-header\" *ngIf=\"popoverTitleContent !== undefined\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { ImxViewerComponent } from './components/imx-viewer.component';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { documentProvider, DocumentToken } from './utils/document-token';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule\r\n ],\r\n declarations: [\r\n ImxViewerComponent\r\n ],\r\n exports: [\r\n ImxViewerComponent\r\n ],\r\n providers: [\r\n { provide: DocumentToken, useFactory: documentProvider }\r\n ]\r\n})\r\nexport class ImxViewerModule {\r\n}\r\n","export class PopoverInfo {\r\n public popoverTitleContent: string;\r\n constructor (public puicArray: string[], public popoverHtmlContent: string) {\r\n }\r\n}\r\n","export class SelectieInfo {\n constructor(public ids: string[], public clazz: string) {\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.PuicHelperService","observableThrowError","observableOf","i2.ClickareaService","i3.PuicHelperService","i4.SvgCoordinatesService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"loxia-imx-viewer.mjs","sources":["../../src/model/point.ts","../../src/model/selectie-event.ts","../../src/utils/classes-util.ts","../../src/utils/document-token.ts","../../src/utils/svg-rect-util.ts","../../src/utils/focus-util.ts","../../src/services/puic-helper.service.ts","../../src/services/clickarea.service.ts","../../src/model/svg-info.ts","../../src/components/svg-coordinates.service.ts","../../src/components/imx-viewer.component.ts","../../src/components/imx-viewer.component.html","../../src/imx-viewer.module.ts","../../src/model/popover-info.ts","../../src/model/selectie-info.ts","../../src/loxia-imx-viewer.ts"],"sourcesContent":["export class Point {\r\n constructor(public x: number, public y: number) {\r\n }\r\n}\r\n","export class SelectieEvent {\r\n constructor(public id: string, public event: MouseEvent) {\r\n }\r\n}\r\n","export class ClassesUtil {\n static addClass(elem: Element, cls: string) {\n if ('' === cls) {\n return;\n }\n const classAttr = elem.getAttribute('class');\n const classes = classAttr ? classAttr.split(' ') : [];\n for (let j = 0; j < classes.length; j++) {\n if (classes[j] === cls) {\n return;\n }\n }\n elem.setAttribute('class', classAttr ? classAttr + ' ' + cls : cls);\n }\n\n static removeClassesStartingWith(elem: Element, cls: string) {\n const classAttr = elem.getAttribute('class');\n if (!classAttr) {\n return;\n }\n const classes = classAttr.split(' ');\n let j = classes.length;\n while (j--) {\n if (classes[j].indexOf(cls) === 0) {\n classes.splice(j, 1);\n }\n }\n\n if (classes.length === 0) {\n elem.removeAttribute('class');\n } else {\n elem.setAttribute('class', classes.join(' '));\n }\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const DocumentToken = new InjectionToken('Document');\nexport function documentProvider(): Document {\n return document;\n}\n","export class SvgRectUtil {\n\n // copied from java.awt.Rectangle\n public static rectUnion(r1: SVGRect, r2: SVGRect): SVGRect {\n if (!r1) {\n return r2;\n }\n\n let tx2 = r1.width;\n let ty2 = r1.height;\n if ((tx2 | ty2) < 0) { // tslint:disable-line\n // This rectangle has negative dimensions...\n // If r has non-negative dimensions then it is the answer.\n // If r is non-existant (has a negative dimension), then both\n // are non-existant and we can return any non-existant rectangle\n // as an answer. Thus, returning r meets that criterion.\n // Either way, r is our answer.\n return r2;\n }\n let rx2 = r2.width;\n let ry2 = r2.height;\n if ((rx2 | ry2) < 0) { // tslint:disable-line\n return r1;\n }\n let tx1 = r1.x;\n let ty1 = r1.y;\n tx2 += tx1;\n ty2 += ty1;\n const rx1 = r2.x;\n const ry1 = r2.y;\n rx2 += rx1;\n ry2 += ry1;\n if (tx1 > rx1) {\n tx1 = rx1;\n }\n if (ty1 > ry1) {\n ty1 = ry1;\n }\n if (tx2 < rx2) {\n tx2 = rx2;\n }\n if (ty2 < ry2) {\n ty2 = ry2;\n }\n tx2 -= tx1;\n ty2 -= ty1;\n\n return new DOMRect(tx1, ty1, tx2, ty2);\n }\n}\n","import { SvgInstance } from '../components/imx-viewer.component';\nimport { PuicHelperService } from '../services/puic-helper.service';\nimport { SvgRectUtil } from './svg-rect-util';\n\nexport class FocusUtil {\n\n public static focusOnIds(focusIds: string[], svgPanZoomRef: SvgInstance, puicHelper: PuicHelperService) {\n if (focusIds && focusIds.length > 0) {\n\n // calculate the union rectangle of elements with ids\n const svgContainer = document.getElementById('svgContainer');\n const rootSvgDoc = svgContainer.firstChild as SVGSVGElement;\n let resultRect: SVGRect;\n if (rootSvgDoc && rootSvgDoc.nodeName === 'svg') {\n focusIds.forEach(puic => {\n const elems: NodeListOf<HTMLElement> = puicHelper.getAllElementsForPuic(puic);\n for (let i = 0; i < elems.length; i++) {\n const elementRect = FocusUtil.getElementRectangleWithNestedSvgOffset(elems[i]);\n resultRect = SvgRectUtil.rectUnion(resultRect, elementRect);\n }\n });\n }\n FocusUtil.focusOnRect(resultRect, svgContainer.getBoundingClientRect(), rootSvgDoc, svgPanZoomRef);\n }\n }\n\n static focusOnRect(rect: SVGRect, elementRect: ClientRect, rootSvgDoc: SVGSVGElement, svgPanZoomRef: any) {\n if (rect) {\n // make sure we are in the svgpanzoom transformed area\n const matrix = (rootSvgDoc.getElementsByClassName('svg-pan-zoom_viewport')[0] as SVGGElement).getScreenCTM();\n\n // get from svg coordinate system to webpage coordinate system\n const location = rootSvgDoc.createSVGPoint();\n location.x = rect.x + (rect.width / 2);\n location.y = rect.y + (rect.height / 2);\n const transformedLocation = location.matrixTransform(matrix);\n\n // transform the rectangle dimension (we have to use a SVGPoint since there is no SVGDimension)\n const size = rootSvgDoc.createSVGPoint();\n size.x = rect.width;\n size.y = rect.height;\n const transformedSize = size.matrixTransform(matrix.inverse());\n\n // tel the svgPanZoom to zoom on the rectangle in relation to the total view size\n const zoomFactor = Math.min(5, elementRect.height / Math.abs(transformedSize.y));\n svgPanZoomRef.zoomAtPoint(zoomFactor,\n { x: transformedLocation.x - elementRect.left, y: transformedLocation.y - elementRect.top });\n // tel the svgPanZoom to pan to the middel of the rectangle\n svgPanZoomRef.panBy({\n x: (elementRect.width / 2) - transformedLocation.x,\n y: ((elementRect.height + elementRect.top) / 2) - transformedLocation.y\n });\n }\n }\n\n private static getElementRectangleWithNestedSvgOffset(elem: Element): SVGRect {\n const svgElem = (<SVGGraphicsElement> elem);\n const rect = svgElem.getBBox();\n\n while (elem.parentElement.nodeName !== 'svg') {\n elem = elem.parentElement;\n }\n elem = elem.parentElement;\n rect.x = rect.x + parseInt(elem.getAttribute('x'), 10);\n rect.y = rect.y + parseInt(elem.getAttribute('y'), 10);\n const viewBox = elem.getAttribute('viewBox');\n if (viewBox) {\n const viewBoxCoordinates = viewBox.split(' ');\n rect.x = rect.x - parseInt(viewBoxCoordinates[0], 10);\n rect.y = rect.y - parseInt(viewBoxCoordinates[1], 10);\n }\n return rect;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PuicHelperService {\n private rootSvg: any;\n\n public setRootSvg = (svgParent: SVGSVGElement) => this.rootSvg = svgParent;\n public getAllElementsForPuic = (puic: string) => this.rootSvg.querySelectorAll(`.p${ puic }, #p${ puic }`) as NodeListOf<HTMLElement>;\n}\n","import { Injectable } from '@angular/core';\nimport { PuicHelperService } from './puic-helper.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ClickareaService {\n private timer: number;\n timeout = 250;\n\n constructor(private puicHelper: PuicHelperService) {\n }\n\n delayedClickAreaCreation(ids: Set<string>) {\n if (ids.size === 0) {\n return;\n }\n\n window.clearTimeout(this.timer);\n this.timer = window.setTimeout(() => this.createClickareas(ids), this.timeout);\n }\n\n /**\n * Mogelijke optimalisatie is om de delta te bepalen van de te verwerken ids\n */\n private createClickareas(ids: Set<string>) {\n Array.from(document.getElementsByClassName('imxview-clickarea')).forEach(x => x.remove());\n\n ids.forEach(id => {\n this.puicHelper.getAllElementsForPuic(id).forEach(element => {\n if (element) {\n const polylines = Array.from(element.getElementsByTagName('polyline'));\n polylines.forEach(p => {\n const clone = p.cloneNode(true) as Element;\n clone.setAttribute('class', 'imxview-clickarea');\n clone.removeAttribute('id');\n element.insertBefore(clone, p);\n });\n }\n });\n });\n }\n}\n","import { Point } from './point';\r\n\r\nexport class SvgInfo {\r\n constructor(public svg: string, public coordinates?: Point) {\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { Point } from '../model/point';\nimport { SvgInfo } from '../model/svg-info';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SvgCoordinatesService {\n svgInfosWithCoordinates(svgs: string[]): SvgInfo[] {\n let nextCoords = new Point(0, 0);\n const infos: SvgInfo[] = [];\n svgs.forEach(svg => {\n if (svg) {\n infos.push(new SvgInfo('data:image/svg+xml,' + svg, nextCoords));\n nextCoords = new Point(nextCoords.x + this.getXCoordinate(svg), 0);\n }\n });\n return infos;\n }\n\n private getXCoordinate(decodedSvgDataUrl: string) {\n let div = document.createElement('div');\n div.innerHTML = decodedSvgDataUrl;\n // De SVG-width wordt in de eerste group gespecificeerd.\n const x = div.firstElementChild.querySelector('g').getAttribute('width');\n const result = parseFloat(x);\n div = null;\n return result;\n }\n}\n","import { HttpClient } from '@angular/common/http';\r\nimport {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n SimpleChanges,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { combineLatest, Observable, of as observableOf, throwError as observableThrowError } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\nimport SvgPanZoom from 'svg-pan-zoom';\r\nimport { PanEvent } from '../model/pan-event';\r\nimport { Point } from '../model/point';\r\nimport { PopoverInfo } from '../model/popover-info';\r\nimport { SelectieEvent } from '../model/selectie-event';\r\nimport { SelectieInfo } from '../model/selectie-info';\r\nimport { SvgInfo } from '../model/svg-info';\r\nimport { ClickareaService } from '../services/clickarea.service';\r\nimport { PuicHelperService } from '../services/puic-helper.service';\r\nimport { ClassesUtil } from '../utils/classes-util';\r\nimport { DocumentToken } from '../utils/document-token';\r\nimport { FocusUtil } from '../utils/focus-util';\r\nimport { SvgCoordinatesService } from './svg-coordinates.service';\r\n\r\n// SvgPanZoom.Instance cannot be used in libs that use this imx-viewer lib because it is exported in an old, non angular 16 compatible way.\r\nexport type SvgInstance = typeof SvgPanZoom;\r\n\r\n@Component({\r\n selector: 'imx-viewer',\r\n templateUrl: './imx-viewer.component.html',\r\n styleUrls: ['./imx-viewer.component.css']\r\n})\r\nexport class ImxViewerComponent implements OnChanges, OnInit, OnDestroy {\r\n private SVG_BASE64_PREFIX = 'data:image/svg+xml;base64,';\r\n private SVG_PREFIX = 'data:image/svg+xml,';\r\n\r\n @Input() useClickArea = false;\r\n @Input() inlineDgnCssImport = false;\r\n @Input() svgInfo: SvgInfo[];\r\n @Input() selectieInfos: SelectieInfo[] = [];\r\n\r\n // Onderstaande inputs worden meegenomen voor clickarea:\r\n @Input() clickableIds: string[] = [];\r\n @Input() rightClickableIds: string[] = [];\r\n @Input() popoverInfos: PopoverInfo[] = [];\r\n @Input() zoomScaleSensitivity = 0.2;\r\n @Input() autoAlignSvgsHorizontally = false;\r\n //Use this input to change the initial pan and zoom of the svg. Default behaviour is .fit() and .center().\r\n @Input() initialPanAndZoom = (imxViewerBehaviourApi: ImxViewerBehaviourApi): void => {\r\n imxViewerBehaviourApi.fit();\r\n imxViewerBehaviourApi.center();\r\n };\r\n\r\n @ViewChild('svgParent', { static: true }) svgParentRef: ElementRef;\r\n\r\n errors = false;\r\n popoverStyle: any = { display: 'inline' };\r\n popoverHtmlContent = '';\r\n popoverTitleContent: string;\r\n parentWidth = 0;\r\n parentHeight = 0;\r\n\r\n @Output() clickHandler = new EventEmitter<SelectieEvent>();\r\n @Output() rightClickHandler = new EventEmitter<SelectieEvent>();\r\n @Output() svgLoaded = new EventEmitter<void>();\r\n //Be mindful that the pan-event occurs often. Catch it with a timeout if you do heavy processing\r\n @Output() panned = new EventEmitter<PanEvent>();\r\n\r\n private svgGeladen = false;\r\n private eventListeners: Map<string, Map<Element, any>> = new Map();\r\n private svgPanZoomRef: SvgInstance;\r\n private ignorePanEventBecauseReload: boolean = false;\r\n\r\n constructor(\r\n @Inject(DocumentToken) private readonly document: any,\r\n private readonly http: HttpClient,\r\n private readonly clickAreaService: ClickareaService,\r\n private readonly puicHelper: PuicHelperService,\r\n private readonly renderer: Renderer2,\r\n private readonly svgCoordinatesService: SvgCoordinatesService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.createSvgPanZoomRefIfNotExists();\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize(): void {\r\n this.updateDimensionsForClipPath();\r\n }\r\n\r\n private updateDimensionsForClipPath(): void {\r\n // Update parentWidth and parentHeight based on the parent div dimensions\r\n this.parentWidth = this.getSvgParent().parentElement.offsetWidth;\r\n this.parentHeight = this.getSvgParent().parentElement.offsetHeight;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // If Imx-viewer is initialized with svgInfo, ngOnChanges is called before ngOnInit.\r\n // In that case we need to create svgPanZoomRef here.\r\n this.createSvgPanZoomRefIfNotExists();\r\n\r\n const { useClickArea, clickableIds, rightClickableIds, popoverInfos, selectieInfos, svgInfo } = changes;\r\n\r\n if (useClickArea || clickableIds || rightClickableIds || popoverInfos) {\r\n this.delayedClickAreaCreation();\r\n }\r\n\r\n if (this.svgInfo && svgInfo) {\r\n this.ignorePanEventBecauseReload = true;\r\n this.loadSvgs();\r\n }\r\n\r\n if (this.clickableIds && clickableIds && this.svgGeladen) {\r\n this.addClickEventHandlersToElements(this.clickableIds, 'click');\r\n }\r\n\r\n if (this.rightClickableIds && rightClickableIds && this.svgGeladen) {\r\n this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');\r\n }\r\n\r\n if (this.selectieInfos && selectieInfos && this.svgGeladen) {\r\n this.selectElements();\r\n }\r\n\r\n if (this.popoverInfos && popoverInfos && this.svgGeladen) {\r\n this.addMouseoverEventHandlerToElements();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.svgPanZoomRef?.destroy();\r\n this.svgPanZoomRef = undefined;\r\n }\r\n\r\n public focusOnIds(focusIds: string[]): void {\r\n FocusUtil.focusOnIds(focusIds, this.svgPanZoomRef, this.puicHelper);\r\n }\r\n\r\n public getSvgPanZoomInstance: () => SvgInstance = () => this.svgPanZoomRef;\r\n\r\n // Here only used in test, but also used by applications. Do not remove.\r\n public static getXCoordinate(decodedSvgDataUrl: string): number {\r\n let div = document.createElement('div');\r\n div.innerHTML = decodedSvgDataUrl;\r\n // De SVG-width wordt in de svg tag gespecificeerd.\r\n const x = div.firstElementChild.getAttribute('width');\r\n const result = parseFloat(x);\r\n div = null;\r\n return result;\r\n }\r\n\r\n hidePopOver = (): string => this.popoverStyle.visibility = 'hidden';\r\n\r\n private createSvgPanZoomRefIfNotExists(): void {\r\n if (!this.svgPanZoomRef) {\r\n this.svgPanZoomRef = SvgPanZoom(this.getSvgParent(), {\r\n zoomScaleSensitivity: this.zoomScaleSensitivity,\r\n fit: false,\r\n center: true,\r\n dblClickZoomEnabled: false,\r\n onZoom: () => this.hidePopOver(),\r\n onPan: () => {\r\n this.hidePopOver();\r\n if (this.ignorePanEventBecauseReload) {\r\n this.ignorePanEventBecauseReload = false;\r\n } else {\r\n this.panned.emit({ x: this.svgPanZoomRef.getPan().x, y: this.svgPanZoomRef.getPan().y });\r\n }\r\n },\r\n onUpdatedCTM: () => this.updateClipPath(),\r\n refreshRate: 'auto'\r\n });\r\n\r\n this.addStyleToRootSvg();\r\n }\r\n }\r\n\r\n private updateClipPath(): void {\r\n const area = this.getVisibleArea();\r\n if (!area) {\r\n return;\r\n }\r\n\r\n // update the clipPath\r\n requestAnimationFrame(() => {\r\n const clipRect = this.getSvgParent().querySelector('#clip-path rect');\r\n this.renderer.setAttribute(clipRect, 'x', String(area.x));\r\n this.renderer.setAttribute(clipRect, 'y', String(area.y));\r\n this.renderer.setAttribute(clipRect, 'width', String(area.width));\r\n this.renderer.setAttribute(clipRect, 'height', String(area.height));\r\n });\r\n }\r\n\r\n private getVisibleArea(): Area {\r\n const zoom = this.getSvgPanZoomInstance()?.getZoom();\r\n const pan = this.getSvgPanZoomInstance()?.getPan();\r\n\r\n if (!zoom || !pan) {\r\n return;\r\n }\r\n\r\n // Bepaal grootte van visible area\r\n const visibleWidth = this.parentWidth / zoom;\r\n const visibleHeight = this.parentHeight / zoom;\r\n\r\n // Bepaal het nulpunt (linksboven) van de visible area\r\n const visibleX = -pan.x / zoom;\r\n const visibleY = -pan.y / zoom;\r\n\r\n return { x: visibleX, y: visibleY, width: visibleWidth, height: visibleHeight };\r\n }\r\n\r\n /**\r\n * Style wordt vanuit javascript toegevoegd na de create van SvgZoomPanRef deze maakt een viewport aan.\r\n * - Clickarea CSS wordt dynamisch aan de SVG toegevoegd, dit voorkomt dat dat er ngcontent property op geplaatst wordt.\r\n * De SVG's worden niet voorzien van ngcontent attribuut.\r\n * - DGN.css import wordt (optioneel) in de root SVG opgenomen, deze is eerst verwijderd uit de SVG's. Om meerdere imports te voorkomen.\r\n * */\r\n private addStyleToRootSvg(): void {\r\n if (this.getSvgParent().firstElementChild.tagName !== 'defs') {\r\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\r\n\r\n let style = this.inlineDgnCssImport ? '@import url(\"dgn.css\");\\n' : '';\r\n style +=\r\n `.imxview-selected > polyline.imxview-clickarea, polyline.imxview-clickarea {\r\n stroke: var(--imxview-clickarea-stroke, transparent);\r\n stroke-width: var(--imxview-clickarea-stroke-width, 10px);\r\n stroke-dasharray: none;\r\n }`;\r\n defs.innerHTML =\r\n `\r\n <style> ${ style } </style>\r\n <clipPath id=\"clip-path\">\r\n <rect x=\"0\" x=\"0\" width=${ this.parentWidth } height=${ this.parentHeight }>\r\n </clipPath>\r\n `;\r\n const firstElementChild = this.getSvgParent().firstElementChild;\r\n this.getSvgParent().insertBefore(defs, firstElementChild);\r\n setTimeout(() => this.updateDimensionsForClipPath());\r\n }\r\n }\r\n\r\n private loadSvgs(): void {\r\n combineLatest(this.svgInfo.map(svgInfo => this.loadSvg(svgInfo.svg)))\r\n .pipe(take(1))\r\n .subscribe(svgs => {\r\n const svg = this.concatenateSvgs(svgs);\r\n this.updateDom(svg);\r\n this.svgGeladen = true;\r\n this.svgLoaded.emit();\r\n this.delayedClickAreaCreation();\r\n this.addClickEventHandlersToElements(this.clickableIds, 'click');\r\n this.addClickEventHandlersToElements(this.rightClickableIds, 'contextmenu');\r\n this.selectElements();\r\n this.addMouseoverEventHandlerToElements();\r\n this.updateDimensionsForClipPath();\r\n },\r\n error => this.flagErrors(error)\r\n );\r\n }\r\n\r\n private loadSvg(svgSrc: string): Observable<string> {\r\n if (svgSrc.startsWith('data:')) {\r\n let parsed;\r\n if (svgSrc.startsWith(this.SVG_BASE64_PREFIX)) {\r\n try {\r\n parsed = atob(svgSrc.substring(this.SVG_BASE64_PREFIX.length));\r\n } catch (e) {\r\n return observableThrowError('Data-url parse error');\r\n }\r\n } else if (svgSrc.startsWith(this.SVG_PREFIX)) {\r\n parsed = svgSrc.substring(this.SVG_PREFIX.length);\r\n }\r\n\r\n if (parsed) {\r\n return observableOf(parsed);\r\n }\r\n }\r\n\r\n return this.http.get(svgSrc, { responseType: 'text' });\r\n }\r\n\r\n private addClickEventHandlersToElement(listeners: Map<Element, any>, elem, eventType: string, puic: string): void {\r\n const elemAlreadyHasListener = listeners.get(elem);\r\n if (!elemAlreadyHasListener) {\r\n const fn = eventType === 'click' ?\r\n (e) => this.clickHandler.emit(new SelectieEvent(puic, e)) :\r\n (e) => {\r\n e.preventDefault();\r\n this.rightClickHandler.emit(new SelectieEvent(puic, e));\r\n return false;\r\n };\r\n listeners.set(elem, fn);\r\n elem.addEventListener(eventType, fn);\r\n if (eventType === 'click') {\r\n elem.style.cursor = 'pointer';\r\n }\r\n }\r\n }\r\n\r\n private addClickEventHandlersToElements(clickableIds: string[], eventtype: string): void {\r\n this.removeOldListeners(eventtype);\r\n\r\n const listeners = new Map();\r\n if (clickableIds) {\r\n clickableIds.forEach(puic => {\r\n const elements = this.puicHelper.getAllElementsForPuic(puic);\r\n elements.forEach((element) => this.addClickEventHandlersToElement(listeners, element, eventtype, puic));\r\n });\r\n }\r\n this.eventListeners.set(eventtype, listeners);\r\n }\r\n\r\n private addMouseoverEventHandlerToElements(): void {\r\n this.removeOldListeners('mouseover');\r\n const listeners = new Map();\r\n if (this.popoverInfos) {\r\n this.popoverInfos.forEach(popoverInfo => {\r\n popoverInfo.puicArray.forEach(puic => {\r\n const elems = this.puicHelper.getAllElementsForPuic(puic);\r\n for (let i = 0; i < elems.length; i++) {\r\n const fn = (e) => {\r\n this.popoverHtmlContent = popoverInfo.popoverHtmlContent;\r\n this.popoverTitleContent = popoverInfo.popoverTitleContent;\r\n\r\n // use timeout to have content rendered before getting size\r\n setTimeout(() => this.showPopup(e), 0);\r\n };\r\n\r\n const elem = elems.item(i);\r\n listeners.set(elem, fn);\r\n elem.addEventListener('mouseover', fn);\r\n }\r\n }\r\n );\r\n }\r\n );\r\n this.eventListeners.set('mouseover', listeners);\r\n }\r\n }\r\n\r\n private concatenateSvgs(svgs: string[]): string {\r\n let svgContent = '';\r\n let svgInfo = this.svgInfo;\r\n if (this.autoAlignSvgsHorizontally) {\r\n svgInfo = this.svgCoordinatesService.svgInfosWithCoordinates(svgs);\r\n }\r\n for (let i = 0, len = svgInfo.length; i < len; i++) {\r\n const sourceCoordinates = svgInfo[i].coordinates || new Point(0, 0);\r\n\r\n const div = document.createElement('div');\r\n\r\n /** Verwijder dgn.css import uit geleverde SVG's.\r\n * De import wordt optioneel (standaard aan) in de root SVG geplaats om te voorkomen dat de import meermaals gebeurd.\r\n * zie addStyleToRootSvg()\r\n */\r\n div.innerHTML = svgs[i].replace('@import url(\"dgn.css\");', '');\r\n div.firstElementChild.setAttribute('x', sourceCoordinates.x.toString());\r\n div.firstElementChild.setAttribute('y', sourceCoordinates.y.toString());\r\n\r\n svgContent += div.innerHTML;\r\n }\r\n\r\n return svgContent;\r\n }\r\n\r\n private flagErrors(error): void {\r\n console.log(error);\r\n this.errors = true;\r\n }\r\n\r\n private removeOldListeners(eventType: string): void {\r\n const listeners = this.eventListeners.get(eventType);\r\n if (listeners) {\r\n listeners.forEach((fn, el) => {\r\n el.removeEventListener(eventType, fn);\r\n if (eventType === 'click')\r\n el.setAttribute('style', ImxViewerComponent.setDefaultCursor(el));\r\n });\r\n }\r\n this.eventListeners.set(eventType, new Map());\r\n }\r\n\r\n private selectElements(): void {\r\n const allElems = this.getSvgParent().querySelectorAll('[class*=imxview-selected]');\r\n for (const element of allElems) {\r\n ClassesUtil.removeClassesStartingWith(element, 'imxview-selected');\r\n }\r\n\r\n if (this.selectieInfos) {\r\n this.selectieInfos.forEach(selectieInfo => {\r\n selectieInfo.ids.forEach(id => {\r\n this.puicHelper.getAllElementsForPuic(id).forEach(elem => {\r\n ClassesUtil.addClass(elem, 'imxview-selected');\r\n if ('' !== selectieInfo.clazz) {\r\n ClassesUtil.addClass(elem, 'imxview-selected-' + selectieInfo.clazz);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n private static setDefaultCursor(el: Element): string {\r\n const oudeStyle = el.getAttribute('style');\r\n return oudeStyle ? oudeStyle.replace('pointer', 'default') : 'cursor: default';\r\n }\r\n\r\n private showPopup(e): void {\r\n const popoverElem = document.getElementById('popover').getBoundingClientRect();\r\n const left = e.layerX - (popoverElem.width / 2) + 'px';\r\n const top = e.layerY - (popoverElem.height + 8) + 'px';\r\n this.popoverStyle = {\r\n left: left, top: top, position: 'absolute',\r\n display: 'inline', visibility: 'visible'\r\n };\r\n }\r\n\r\n private updateDom(svg: string): void {\r\n this.svgPanZoomRef.destroy();\r\n this.svgPanZoomRef = null;\r\n this.createSvgPanZoomRefIfNotExists();\r\n\r\n const svgPanZoomViewportElement = this.getSvgParent().getElementsByClassName('svg-pan-zoom_viewport')[0];\r\n svgPanZoomViewportElement.setAttribute('clip-path', 'url(#clip-path)');\r\n svgPanZoomViewportElement.innerHTML = svg.substring(svg.indexOf('<svg'));\r\n\r\n this.svgPanZoomRef.updateBBox();\r\n\r\n this.svgPanZoomRef.resize();\r\n this.initialPanAndZoom(new ImxViewerBehaviourApi(this.svgPanZoomRef));\r\n this.puicHelper.setRootSvg(this.getSvgParent());\r\n }\r\n\r\n private delayedClickAreaCreation(): void {\r\n if (this.svgGeladen && this.useClickArea) {\r\n const clickareaIds = new Set([...this.clickableIds, ...this.rightClickableIds,\r\n ...this.popoverInfos.flatMap(pi => pi.puicArray)]);\r\n this.clickAreaService.delayedClickAreaCreation(clickareaIds);\r\n }\r\n }\r\n\r\n private getSvgParent = () => this.svgParentRef.nativeElement;\r\n}\r\n\r\ninterface Area {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\ninterface XandYEnabled {\r\n x: boolean;\r\n y: boolean;\r\n}\r\n\r\nexport class ImxViewerBehaviourApi {\r\n constructor(private readonly svgPanZoomRef: SvgInstance) {\r\n }\r\n\r\n public pan(x: number, y: number): this {\r\n this.svgPanZoomRef.pan(new Point(x, y));\r\n return this;\r\n }\r\n\r\n public enableZoom(zoomEnabled: boolean): this {\r\n this.svgPanZoomRef.setBeforeZoom(() => zoomEnabled);\r\n return this;\r\n }\r\n\r\n public enablePan(panEnabled: boolean | XandYEnabled): this {\r\n this.svgPanZoomRef.setBeforePan(() => panEnabled);\r\n return this;\r\n }\r\n\r\n public fit(): this {\r\n this.svgPanZoomRef.fit();\r\n return this;\r\n }\r\n\r\n public center(): this {\r\n this.svgPanZoomRef.center();\r\n return this;\r\n }\r\n}\r\n","<div id=\"imxviewer\" data-test-id=\"imx-viewer\">\n <div id=\"svgContainer\" class=\"col-md-12 top10\" [hidden]=\"errors\" (click)=\"hidePopOver()\" data-test-id=\"svg-container\">\n <svg #svgParent xmlns=\"http://www.w3.org/2000/svg\"></svg>\n </div>\n <div id=\"popover\" class=\"popover top bs-popover-top\" [ngStyle]=\"popoverStyle\" (mouseleave)=\"hidePopOver()\" data-test-id=\"popover\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-header\" *ngIf=\"popoverTitleContent !== undefined\" [innerHTML]=\"popoverTitleContent\" data-test-id=\"popover-header\"></h3>\n <div class=\"popover-body\" [innerHTML]=\"popoverHtmlContent\" data-test-id=\"popover-body\"></div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { ImxViewerComponent } from './components/imx-viewer.component';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { documentProvider, DocumentToken } from './utils/document-token';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule\r\n ],\r\n declarations: [\r\n ImxViewerComponent\r\n ],\r\n exports: [\r\n ImxViewerComponent\r\n ],\r\n providers: [\r\n { provide: DocumentToken, useFactory: documentProvider }\r\n ]\r\n})\r\nexport class ImxViewerModule {\r\n}\r\n","export class PopoverInfo {\r\n public popoverTitleContent: string;\r\n constructor (public puicArray: string[], public popoverHtmlContent: string) {\r\n }\r\n}\r\n","export class SelectieInfo {\n constructor(public ids: string[], public clazz: string) {\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.PuicHelperService","observableThrowError","observableOf","i2.ClickareaService","i3.PuicHelperService","i4.SvgCoordinatesService"],"mappings":"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"}
|