@smarterplan/ngx-smarterplan-core 1.4.6 → 1.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/esm2022/lib/helpers.service.mjs +27 -20
  2. package/esm2022/lib/mattertagData.mjs +84 -84
  3. package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +3 -8
  4. package/esm2022/lib/services/locale.service.mjs +3 -5
  5. package/esm2022/lib/services/matterport-import.service.mjs +3 -3
  6. package/esm2022/lib/services/matterport-measurement.service.mjs +78 -0
  7. package/esm2022/lib/services/matterport-navigation.service.mjs +157 -0
  8. package/esm2022/lib/services/matterport-object3d.service.mjs +234 -0
  9. package/esm2022/lib/services/matterport-pointer.service.mjs +130 -0
  10. package/esm2022/lib/services/matterport-tag.service.mjs +458 -0
  11. package/esm2022/lib/services/matterport.service.mjs +427 -988
  12. package/esm2022/lib/services/models/equipment.service.mjs +3 -4
  13. package/esm2022/lib/services/models/feature.service.mjs +3 -3
  14. package/esm2022/lib/services/models/measurement.service.mjs +3 -3
  15. package/esm2022/lib/services/models/ticket.service.mjs +3 -4
  16. package/esm2022/lib/services/navigator.service.mjs +10 -2
  17. package/esm2022/lib/services/tag.service.mjs +45 -19
  18. package/esm2022/lib/services/viewer.service.mjs +51 -16
  19. package/esm2022/lib/types.service.mjs +1 -1
  20. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +2028 -1490
  21. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  22. package/lib/helpers.service.d.ts +6 -0
  23. package/lib/mattertagData.d.ts +52 -10
  24. package/lib/services/matterport-measurement.service.d.ts +35 -0
  25. package/lib/services/matterport-navigation.service.d.ts +38 -0
  26. package/lib/services/matterport-object3d.service.d.ts +31 -0
  27. package/lib/services/matterport-pointer.service.d.ts +31 -0
  28. package/lib/services/matterport-tag.service.d.ts +104 -0
  29. package/lib/services/matterport.service.d.ts +91 -92
  30. package/lib/services/models/equipment.service.d.ts +2 -2
  31. package/lib/services/models/feature.service.d.ts +2 -2
  32. package/lib/services/models/measurement.service.d.ts +2 -2
  33. package/lib/services/models/ticket.service.d.ts +2 -2
  34. package/lib/services/tag.service.d.ts +4 -0
  35. package/lib/services/viewer.service.d.ts +1 -1
  36. package/lib/types.service.d.ts +2 -0
  37. package/package.json +1 -1
  38. package/esm2022/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +0 -66
  39. package/esm2022/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +0 -63
  40. package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts +0 -26
  41. package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts +0 -26
@@ -0,0 +1,234 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { PoiType } from '../types.service';
3
+ import { Object3D } from 'three';
4
+ import { NestThermostat } from '../matterport-extensions/nest-thermostat/NestThermostat';
5
+ import { PlaneRenderer } from '../matterport-extensions/nest-thermostat/PlaneRenderer';
6
+ import { CanvasRenderer } from "../matterport-extensions/nest-thermostat/CanvasRenderer";
7
+ import { TvPlayer } from "../matterport-extensions/tv-player/TvPlayer";
8
+ import * as i0 from "@angular/core";
9
+ export class MatterportObject3DService {
10
+ dictionnaryObjects3D = new Map();
11
+ dictionnarySceneObjects3D = new Map();
12
+ lastObject3D; // Three JS object
13
+ objectControl;
14
+ securityCameraAnimator;
15
+ azimuthalCrown;
16
+ threeJSScene;
17
+ noLightForObjects = true;
18
+ constructor() { }
19
+ async init3DObjectViewer(sdk) {
20
+ const [sceneObject] = await sdk.Scene.createObjects(1);
21
+ const node = sceneObject.addNode();
22
+ node.start();
23
+ this.threeJSScene = node.obj3D.parent;
24
+ const nodeControl = sceneObject.addNode();
25
+ this.objectControl = nodeControl.addComponent('mp.transformControls');
26
+ nodeControl.start();
27
+ }
28
+ async add3DObject(sdk, obj, mode) {
29
+ return new Promise(async (resolve) => {
30
+ const [sceneObject] = await sdk.Scene.createObjects(1);
31
+ let isAnimatedSecurityCamera = (obj.object === "security_camera");
32
+ let isNestThermostat = (obj.object === "nest_thermostat");
33
+ let isSmarterplanPromotionalVideo = (obj.object === 'video');
34
+ let isAzimuthalCrown = (obj.object === 'azimuth');
35
+ const modelNode = sceneObject.addNode();
36
+ let component = null;
37
+ const initial = {
38
+ url: `/assets/3Dobjects/objects/${obj.object}${obj.format.indexOf('.') === -1 ? '.' + obj.format : obj.format}`,
39
+ localRotation: { "x": 0, "y": 0, "z": 0 },
40
+ localPosition: { "x": 0, "y": 0, "z": 0 },
41
+ visible: true,
42
+ colliderEnabled: true
43
+ };
44
+ switch (obj.format) {
45
+ case '.obj':
46
+ case 'obj':
47
+ component = modelNode.addComponent('mp.objLoader', initial);
48
+ break;
49
+ case '.fbx':
50
+ case 'fbx':
51
+ component = modelNode.addComponent('mp.fbxLoader', initial);
52
+ break;
53
+ case '.gltf':
54
+ case 'gltf':
55
+ case '.glb':
56
+ case 'glb':
57
+ component = modelNode.addComponent('mp.gltfLoader', initial);
58
+ break;
59
+ case '.dae':
60
+ case 'dae':
61
+ component = modelNode.addComponent('mp.daeLoader', initial);
62
+ break;
63
+ default:
64
+ console.log('Format not supported');
65
+ break;
66
+ }
67
+ if (this.noLightForObjects) {
68
+ const lightsNode = sceneObject.addNode();
69
+ lightsNode.addComponent('mp.ambientLight', {
70
+ intensity: 1,
71
+ color: { r: 1.0, g: 1.0, b: 1.0 },
72
+ });
73
+ this.noLightForObjects = false;
74
+ }
75
+ modelNode.obj3D.position.set(obj.position.x, obj.position.y, obj.position.z);
76
+ modelNode.obj3D.rotation.set(obj.rotation.x, obj.rotation.y, obj.rotation.z);
77
+ modelNode.obj3D.scale.set(obj.scale.x, obj.scale.y, obj.scale.z);
78
+ if (isAzimuthalCrown) {
79
+ this.azimuthalCrown = modelNode;
80
+ }
81
+ if (mode && !isNestThermostat) {
82
+ this.attachGizmoControlTo3DObject(sdk, modelNode, sceneObject, mode, true, true).catch((e) => console.log(e));
83
+ }
84
+ if (this.lastObject3D && typeof this.lastObject3D.id === 'string') {
85
+ modelNode.obj3D.uuid = this.lastObject3D.id;
86
+ }
87
+ else if (obj.id) {
88
+ modelNode.obj3D.uuid = obj.id;
89
+ }
90
+ this.lastObject3D = modelNode.obj3D;
91
+ this.dictionnaryObjects3D.set(modelNode.obj3D.uuid, modelNode);
92
+ this.dictionnarySceneObjects3D.set(modelNode.obj3D.uuid, sceneObject);
93
+ if (isAnimatedSecurityCamera) {
94
+ const animator = modelNode.addComponent('mp.securityCamera', {
95
+ "nearPlane": 0.1, "farPlane": 10, "horizontalFOV": 52, "aspect": 1.7777777777777777,
96
+ "localPosition": { "x": 0.3, "y": 0.18, "z": 0 },
97
+ "localRotation": { "x": -15, "y": -90, "z": 0 },
98
+ "color": 65280, "panPeriod": 5, "panAngle": -45
99
+ });
100
+ this.securityCameraAnimator = animator;
101
+ if (!obj.viewFrustum) {
102
+ setTimeout(() => { animator.toggleViewFrustum(); }, 1000);
103
+ }
104
+ }
105
+ if (isNestThermostat) {
106
+ const cv = new CanvasRenderer();
107
+ cv.onInit();
108
+ const plane = new PlaneRenderer();
109
+ plane.outputs = { objectRoot: new Object3D(), collider: new Object3D() };
110
+ const inputTexture = cv.outputs.texture;
111
+ plane.setRootScene(this.threeJSScene);
112
+ plane.onInit(modelNode, inputTexture);
113
+ const sc = new NestThermostat();
114
+ sc.setComponent(component, plane, cv);
115
+ sc.setRootScene(this.threeJSScene);
116
+ sc.onInit(modelNode, plane, inputTexture);
117
+ cv.setCanvasNestThermostatPainter(sc);
118
+ setTimeout(() => { sc.inputs.loadingState = "Loaded"; sc.onInputsUpdated(); }, 5000);
119
+ }
120
+ if (isSmarterplanPromotionalVideo) {
121
+ const sc = new TvPlayer();
122
+ sc.setComponent(component);
123
+ sc.onInit(modelNode);
124
+ setTimeout(() => { sc.inputs.loadingState = "Loaded"; sc.onInputsUpdated(); }, 5000);
125
+ }
126
+ sceneObject.start();
127
+ resolve(this.lastObject3D);
128
+ });
129
+ }
130
+ async deleteObject3D(uuid) {
131
+ const obj = this.dictionnaryObjects3D.get(uuid);
132
+ if (obj)
133
+ obj.obj3D.visible = false;
134
+ }
135
+ getObject3DModelNodeFromDictionnary(uuid) {
136
+ let obj = this.dictionnaryObjects3D.get(uuid);
137
+ if (!obj)
138
+ return null;
139
+ if (obj.obj3D.uuid != uuid) {
140
+ obj.obj3D.uuid = uuid;
141
+ }
142
+ return obj;
143
+ }
144
+ toggleObjectVisibility(objectId) {
145
+ let obj = this.dictionnaryObjects3D.get(objectId);
146
+ if (obj)
147
+ obj.obj3D.visible = !obj.obj3D.visible;
148
+ }
149
+ isObjectVisible(objectId) {
150
+ let obj = this.dictionnaryObjects3D.get(objectId);
151
+ return obj ? obj.obj3D.visible : false;
152
+ }
153
+ async pointCameraTo3DObject(sdk, objectId, createTagCallback, goToTagCallback, deleteLastTagCallback, getTagFromElementId) {
154
+ let obj = this.dictionnaryObjects3D.get(objectId);
155
+ const poiObject = {
156
+ coordinate: JSON.stringify(obj.obj3D.position),
157
+ type: PoiType.OBJECT3D,
158
+ elementID: objectId,
159
+ };
160
+ const objectDb = { id: objectId };
161
+ try {
162
+ await createTagCallback(PoiType.OBJECT3D, objectDb, poiObject);
163
+ }
164
+ catch (err) { }
165
+ let result = getTagFromElementId(objectId);
166
+ await goToTagCallback(result.tag);
167
+ deleteLastTagCallback();
168
+ }
169
+ getSceneNodeFromObject3DId(uuid) {
170
+ return this.dictionnarySceneObjects3D.get(uuid);
171
+ }
172
+ async displayAzimutalCrown(poseCamera) {
173
+ if (this.azimuthalCrown && poseCamera) {
174
+ this.azimuthalCrown.obj3D.position.set(poseCamera.position.x, poseCamera.position.y, poseCamera.position.z);
175
+ }
176
+ }
177
+ async attachGizmoControlTo3DObject(sdk, modelNode, sceneObject, mode, visible, isNewObject) {
178
+ let node = sceneObject.addNode();
179
+ if (!node) {
180
+ const [newSceneObject] = await sdk.Scene.createObjects(1);
181
+ node = newSceneObject.addNode();
182
+ }
183
+ const myControl = node.addComponent('mp.transformControls');
184
+ node.start();
185
+ myControl.transformControls.visible = visible;
186
+ myControl.inputs.selection = modelNode;
187
+ myControl.inputs.mode = mode;
188
+ modelNode.obj3D.controls = myControl;
189
+ if (isNewObject) {
190
+ if (!this.lastObject3D || !this.lastObject3D.controls) {
191
+ try {
192
+ modelNode.obj3D.uuid = this.lastObject3D.uuid || this.lastObject3D.id;
193
+ }
194
+ catch (e) {
195
+ console.log(`id obj in Scene was not assigned to id from DB`);
196
+ }
197
+ this.lastObject3D = modelNode.obj3D;
198
+ }
199
+ }
200
+ else {
201
+ this.lastObject3D = modelNode.obj3D;
202
+ }
203
+ return modelNode;
204
+ }
205
+ removeGizmoFromLastObject() {
206
+ if (this.lastObject3D && this.lastObject3D.controls) {
207
+ this.lastObject3D.controls.transformControls.visible = false;
208
+ this.lastObject3D.controls.transformControls.dispose();
209
+ this.lastObject3D.controls = null;
210
+ }
211
+ }
212
+ toggleViewFrustum() {
213
+ if (this.securityCameraAnimator) {
214
+ this.securityCameraAnimator.toggleViewFrustum();
215
+ }
216
+ }
217
+ clear() {
218
+ this.dictionnaryObjects3D.clear();
219
+ this.dictionnarySceneObjects3D.clear();
220
+ this.lastObject3D = null;
221
+ this.azimuthalCrown = null;
222
+ this.securityCameraAnimator = null;
223
+ this.noLightForObjects = true;
224
+ }
225
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportObject3DService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
226
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportObject3DService, providedIn: 'root' });
227
+ }
228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportObject3DService, decorators: [{
229
+ type: Injectable,
230
+ args: [{
231
+ providedIn: 'root',
232
+ }]
233
+ }], ctorParameters: () => [] });
234
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC1vYmplY3QzZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tYXR0ZXJwb3J0LW9iamVjdDNkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWEsT0FBTyxFQUFxQixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seURBQXlELENBQUM7QUFDekYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOztBQUt2RSxNQUFNLE9BQU8seUJBQXlCO0lBQzdCLG9CQUFvQixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25ELHlCQUF5QixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3hELFlBQVksQ0FBTSxDQUFDLGtCQUFrQjtJQUNyQyxhQUFhLENBQU07SUFDbkIsc0JBQXNCLENBQU07SUFDNUIsY0FBYyxDQUFNO0lBQ3BCLFlBQVksQ0FBTTtJQUNsQixpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFFaEMsZ0JBQWdCLENBQUM7SUFFakIsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEdBQVE7UUFDL0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FB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QUcsSUFBSSxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNoQyxDQUFDO3dHQXJPVSx5QkFBeUI7NEdBQXpCLHlCQUF5QixjQUZ4QixNQUFNOzs0RkFFUCx5QkFBeUI7a0JBSHJDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJT2JqZWN0M0QsIFBvaVR5cGUsIFBPSSwgRGJPYmplY3RUeXBlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQgeyBOZXN0VGhlcm1vc3RhdCB9IGZyb20gJy4uL21hdHRlcnBvcnQtZXh0ZW5zaW9ucy9uZXN0LXRoZXJtb3N0YXQvTmVzdFRoZXJtb3N0YXQnO1xyXG5pbXBvcnQgeyBQbGFuZVJlbmRlcmVyIH0gZnJvbSAnLi4vbWF0dGVycG9ydC1leHRlbnNpb25zL25lc3QtdGhlcm1vc3RhdC9QbGFuZVJlbmRlcmVyJztcclxuaW1wb3J0IHsgQ2FudmFzUmVuZGVyZXIgfSBmcm9tIFwiLi4vbWF0dGVycG9ydC1leHRlbnNpb25zL25lc3QtdGhlcm1vc3RhdC9DYW52YXNSZW5kZXJlclwiO1xyXG5pbXBvcnQgeyBUdlBsYXllciB9IGZyb20gXCIuLi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvdHYtcGxheWVyL1R2UGxheWVyXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWF0dGVycG9ydE9iamVjdDNEU2VydmljZSB7XHJcbiAgcHVibGljIGRpY3Rpb25uYXJ5T2JqZWN0czNEOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xyXG4gIHB1YmxpYyBkaWN0aW9ubmFyeVNjZW5lT2JqZWN0czNEOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xyXG4gIHB1YmxpYyBsYXN0T2JqZWN0M0Q6IGFueTsgLy8gVGhyZWUgSlMgb2JqZWN0XHJcbiAgcHVibGljIG9iamVjdENvbnRyb2w6IGFueTtcclxuICBwdWJsaWMgc2VjdXJpdHlDYW1lcmFBbmltYXRvcjogYW55O1xyXG4gIHB1YmxpYyBhemltdXRoYWxDcm93bjogYW55O1xyXG4gIHB1YmxpYyB0aHJlZUpTU2NlbmU6IGFueTtcclxuICBwdWJsaWMgbm9MaWdodEZvck9iamVjdHMgPSB0cnVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBhc3luYyBpbml0M0RPYmplY3RWaWV3ZXIoc2RrOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IFtzY2VuZU9iamVjdF0gPSBhd2FpdCBzZGsuU2NlbmUuY3JlYXRlT2JqZWN0cygxKTtcclxuICAgIGNvbnN0IG5vZGUgPSBzY2VuZU9iamVjdC5hZGROb2RlKCk7XHJcbiAgICBub2RlLnN0YXJ0KCk7XHJcbiAgICB0aGlzLnRocmVlSlNTY2VuZSA9IG5vZGUub2JqM0QucGFyZW50O1xyXG5cclxuICAgIGNvbnN0IG5vZGVDb250cm9sID0gc2NlbmVPYmplY3QuYWRkTm9kZSgpO1xyXG4gICAgdGhpcy5vYmplY3RDb250cm9sID0gbm9kZUNvbnRyb2wuYWRkQ29tcG9uZW50KCdtcC50cmFuc2Zvcm1Db250cm9scycpO1xyXG4gICAgbm9kZUNvbnRyb2wuc3RhcnQoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZDNET2JqZWN0KFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBvYmo6IElPYmplY3QzRCxcclxuICAgIG1vZGU/OiAndHJhbnNsYXRlJyB8ICdyb3RhdGUnXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCBbc2NlbmVPYmplY3RdID0gYXdhaXQgc2RrLlNjZW5lLmNyZWF0ZU9iamVjdHMoMSk7XHJcblxyXG4gICAgICBsZXQgaXNBbmltYXRlZFNlY3VyaXR5Q2FtZXJhID0gKG9iai5vYmplY3QgPT09IFwic2VjdXJpdHlfY2FtZXJhXCIpO1xyXG4gICAgICBsZXQgaXNOZXN0VGhlcm1vc3RhdCA9IChvYmoub2JqZWN0ID09PSBcIm5lc3RfdGhlcm1vc3RhdFwiKTtcclxuICAgICAgbGV0IGlzU21hcnRlcnBsYW5Qcm9tb3Rpb25hbFZpZGVvID0gKG9iai5vYmplY3QgPT09ICd2aWRlbycpO1xyXG4gICAgICBsZXQgaXNBemltdXRoYWxDcm93biA9IChvYmoub2JqZWN0ID09PSAnYXppbXV0aCcpO1xyXG5cclxuICAgICAgY29uc3QgbW9kZWxOb2RlID0gc2NlbmVPYmplY3QuYWRkTm9kZSgpO1xyXG4gICAgICBsZXQgY29tcG9uZW50ID0gbnVsbDtcclxuICAgICAgY29uc3QgaW5pdGlhbCA9IHtcclxuICAgICAgICB1cmw6IGAvYXNzZXRzLzNEb2JqZWN0cy9vYmplY3RzLyR7b2JqLm9iamVjdH0ke29iai5mb3JtYXQuaW5kZXhPZignLicpID09PSAtMSA/ICcuJyArIG9iai5mb3JtYXQgOiBvYmouZm9ybWF0fWAsXHJcbiAgICAgICAgbG9jYWxSb3RhdGlvbjogeyBcInhcIjogMCwgXCJ5XCI6IDAsIFwielwiOiAwIH0sXHJcbiAgICAgICAgbG9jYWxQb3NpdGlvbjogeyBcInhcIjogMCwgXCJ5XCI6IDAsIFwielwiOiAwIH0sXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBjb2xsaWRlckVuYWJsZWQ6IHRydWVcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHN3aXRjaCAob2JqLmZvcm1hdCkge1xyXG4gICAgICAgIGNhc2UgJy5vYmonOiBjYXNlICdvYmonOiBjb21wb25lbnQgPSBtb2RlbE5vZGUuYWRkQ29tcG9uZW50KCdtcC5vYmpMb2FkZXInLCBpbml0aWFsKTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnLmZieCc6IGNhc2UgJ2ZieCc6IGNvbXBvbmVudCA9IG1vZGVsTm9kZS5hZGRDb21wb25lbnQoJ21wLmZieExvYWRlcicsIGluaXRpYWwpOyBicmVhaztcclxuICAgICAgICBjYXNlICcuZ2x0Zic6IGNhc2UgJ2dsdGYnOiBjYXNlICcuZ2xiJzogY2FzZSAnZ2xiJzogY29tcG9uZW50ID0gbW9kZWxOb2RlLmFkZENvbXBvbmVudCgnbXAuZ2x0ZkxvYWRlcicsIGluaXRpYWwpOyBicmVhaztcclxuICAgICAgICBjYXNlICcuZGFlJzogY2FzZSAnZGFlJzogY29tcG9uZW50ID0gbW9kZWxOb2RlLmFkZENvbXBvbmVudCgnbXAuZGFlTG9hZGVyJywgaW5pdGlhbCk7IGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6IGNvbnNvbGUubG9nKCdGb3JtYXQgbm90IHN1cHBvcnRlZCcpOyBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMubm9MaWdodEZvck9iamVjdHMpIHtcclxuICAgICAgICBjb25zdCBsaWdodHNOb2RlID0gc2NlbmVPYmplY3QuYWRkTm9kZSgpO1xyXG4gICAgICAgIGxpZ2h0c05vZGUuYWRkQ29tcG9uZW50KCdtcC5hbWJpZW50TGlnaHQnLCB7XHJcbiAgICAgICAgICBpbnRlbnNpdHk6IDEsXHJcbiAgICAgICAgICBjb2xvcjogeyByOiAxLjAsIGc6IDEuMCwgYjogMS4wIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5ub0xpZ2h0Rm9yT2JqZWN0cyA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBtb2RlbE5vZGUub2JqM0QucG9zaXRpb24uc2V0KG9iai5wb3NpdGlvbi54LCBvYmoucG9zaXRpb24ueSwgb2JqLnBvc2l0aW9uLnopO1xyXG4gICAgICBtb2RlbE5vZGUub2JqM0Qucm90YXRpb24uc2V0KG9iai5yb3RhdGlvbi54LCBvYmoucm90YXRpb24ueSwgb2JqLnJvdGF0aW9uLnopO1xyXG4gICAgICBtb2RlbE5vZGUub2JqM0Quc2NhbGUuc2V0KG9iai5zY2FsZS54LCBvYmouc2NhbGUueSwgb2JqLnNjYWxlLnopO1xyXG5cclxuICAgICAgaWYgKGlzQXppbXV0aGFsQ3Jvd24pIHtcclxuICAgICAgICB0aGlzLmF6aW11dGhhbENyb3duID0gbW9kZWxOb2RlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobW9kZSAmJiAhaXNOZXN0VGhlcm1vc3RhdCkge1xyXG4gICAgICAgIHRoaXMuYXR0YWNoR2l6bW9Db250cm9sVG8zRE9iamVjdChzZGssIG1vZGVsTm9kZSwgc2NlbmVPYmplY3QsIG1vZGUsIHRydWUsIHRydWUpLmNhdGNoKChlKSA9PiBjb25zb2xlLmxvZyhlKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmxhc3RPYmplY3QzRCAmJiB0eXBlb2YgdGhpcy5sYXN0T2JqZWN0M0QuaWQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgbW9kZWxOb2RlLm9iajNELnV1aWQgPSB0aGlzLmxhc3RPYmplY3QzRC5pZDtcclxuICAgICAgfSBlbHNlIGlmIChvYmouaWQpIHtcclxuICAgICAgICBtb2RlbE5vZGUub2JqM0QudXVpZCA9IG9iai5pZDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxhc3RPYmplY3QzRCA9IG1vZGVsTm9kZS5vYmozRDtcclxuXHJcbiAgICAgIHRoaXMuZGljdGlvbm5hcnlPYmplY3RzM0Quc2V0KG1vZGVsTm9kZS5vYmozRC51dWlkLCBtb2RlbE5vZGUpO1xyXG4gICAgICB0aGlzLmRpY3Rpb25uYXJ5U2NlbmVPYmplY3RzM0Quc2V0KG1vZGVsTm9kZS5vYmozRC51dWlkLCBzY2VuZU9iamVjdCk7XHJcblxyXG4gICAgICBpZiAoaXNBbmltYXRlZFNlY3VyaXR5Q2FtZXJhKSB7XHJcbiAgICAgICAgY29uc3QgYW5pbWF0b3IgPSBtb2RlbE5vZGUuYWRkQ29tcG9uZW50KCdtcC5zZWN1cml0eUNhbWVyYScsIHtcclxuICAgICAgICAgIFwibmVhclBsYW5lXCI6IDAuMSwgXCJmYXJQbGFuZVwiOiAxMCwgXCJob3Jpem9udGFsRk9WXCI6IDUyLCBcImFzcGVjdFwiOiAxLjc3Nzc3Nzc3Nzc3Nzc3NzcsXHJcbiAgICAgICAgICBcImxvY2FsUG9zaXRpb25cIjogeyBcInhcIjogMC4zLCBcInlcIjogMC4xOCwgXCJ6XCI6IDAgfSxcclxuICAgICAgICAgIFwibG9jYWxSb3RhdGlvblwiOiB7IFwieFwiOiAtMTUsIFwieVwiOiAtOTAsIFwielwiOiAwIH0sXHJcbiAgICAgICAgICBcImNvbG9yXCI6IDY1MjgwLCBcInBhblBlcmlvZFwiOiA1LCBcInBhbkFuZ2xlXCI6IC00NVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2VjdXJpdHlDYW1lcmFBbmltYXRvciA9IGFuaW1hdG9yO1xyXG4gICAgICAgIGlmICghb2JqLnZpZXdGcnVzdHVtKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYW5pbWF0b3IudG9nZ2xlVmlld0ZydXN0dW0oKTsgfSwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNOZXN0VGhlcm1vc3RhdCkge1xyXG4gICAgICAgIGNvbnN0IGN2ID0gbmV3IENhbnZhc1JlbmRlcmVyKCk7IGN2Lm9uSW5pdCgpO1xyXG4gICAgICAgIGNvbnN0IHBsYW5lID0gbmV3IFBsYW5lUmVuZGVyZXIoKTtcclxuICAgICAgICBwbGFuZS5vdXRwdXRzID0geyBvYmplY3RSb290OiBuZXcgT2JqZWN0M0QoKSwgY29sbGlkZXI6IG5ldyBPYmplY3QzRCgpIH07XHJcbiAgICAgICAgY29uc3QgaW5wdXRUZXh0dXJlID0gY3Yub3V0cHV0cy50ZXh0dXJlO1xyXG4gICAgICAgIHBsYW5lLnNldFJvb3RTY2VuZSh0aGlzLnRocmVlSlNTY2VuZSk7XHJcbiAgICAgICAgcGxhbmUub25Jbml0KG1vZGVsTm9kZSwgaW5wdXRUZXh0dXJlKTtcclxuICAgICAgICBjb25zdCBzYyA9IG5ldyBOZXN0VGhlcm1vc3RhdCgpO1xyXG4gICAgICAgIHNjLnNldENvbXBvbmVudChjb21wb25lbnQsIHBsYW5lLCBjdik7XHJcbiAgICAgICAgc2Muc2V0Um9vdFNjZW5lKHRoaXMudGhyZWVKU1NjZW5lKTtcclxuICAgICAgICBzYy5vbkluaXQobW9kZWxOb2RlLCBwbGFuZSwgaW5wdXRUZXh0dXJlKTtcclxuICAgICAgICBjdi5zZXRDYW52YXNOZXN0VGhlcm1vc3RhdFBhaW50ZXIoc2MpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBzYy5pbnB1dHMubG9hZGluZ1N0YXRlID0gXCJMb2FkZWRcIjsgc2Mub25JbnB1dHNVcGRhdGVkKCk7IH0sIDUwMDApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNTbWFydGVycGxhblByb21vdGlvbmFsVmlkZW8pIHtcclxuICAgICAgICBjb25zdCBzYyA9IG5ldyBUdlBsYXllcigpOyBzYy5zZXRDb21wb25lbnQoY29tcG9uZW50KTsgc2Mub25Jbml0KG1vZGVsTm9kZSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHNjLmlucHV0cy5sb2FkaW5nU3RhdGUgPSBcIkxvYWRlZFwiOyBzYy5vbklucHV0c1VwZGF0ZWQoKTsgfSwgNTAwMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNjZW5lT2JqZWN0LnN0YXJ0KCk7XHJcbiAgICAgIHJlc29sdmUodGhpcy5sYXN0T2JqZWN0M0QpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGVPYmplY3QzRCh1dWlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG9iaiA9IHRoaXMuZGljdGlvbm5hcnlPYmplY3RzM0QuZ2V0KHV1aWQpO1xyXG4gICAgaWYgKG9iaikgb2JqLm9iajNELnZpc2libGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldE9iamVjdDNETW9kZWxOb2RlRnJvbURpY3Rpb25uYXJ5KHV1aWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICBsZXQgb2JqID0gdGhpcy5kaWN0aW9ubmFyeU9iamVjdHMzRC5nZXQodXVpZCk7XHJcbiAgICBpZiAoIW9iaikgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAob2JqLm9iajNELnV1aWQgIT0gdXVpZCkge1xyXG4gICAgICBvYmoub2JqM0QudXVpZCA9IHV1aWQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlT2JqZWN0VmlzaWJpbGl0eShvYmplY3RJZDogYW55KSB7XHJcbiAgICBsZXQgb2JqID0gdGhpcy5kaWN0aW9ubmFyeU9iamVjdHMzRC5nZXQob2JqZWN0SWQpO1xyXG4gICAgaWYgKG9iaikgb2JqLm9iajNELnZpc2libGUgPSAhb2JqLm9iajNELnZpc2libGU7XHJcbiAgfVxyXG5cclxuICBpc09iamVjdFZpc2libGUob2JqZWN0SWQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IG9iaiA9IHRoaXMuZGljdGlvbm5hcnlPYmplY3RzM0QuZ2V0KG9iamVjdElkKTtcclxuICAgIHJldHVybiBvYmogPyBvYmoub2JqM0QudmlzaWJsZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcG9pbnRDYW1lcmFUbzNET2JqZWN0KHNkazogYW55LCBvYmplY3RJZDogYW55LCBjcmVhdGVUYWdDYWxsYmFjazogKHRhZ1R5cGU6IFBvaVR5cGUsIG9iamVjdDogRGJPYmplY3RUeXBlLCBwb2k6IFBPSSkgPT4gUHJvbWlzZTxhbnk+LCBnb1RvVGFnQ2FsbGJhY2s6IChzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTxhbnk+LCBkZWxldGVMYXN0VGFnQ2FsbGJhY2s6ICgpID0+IHZvaWQsIGdldFRhZ0Zyb21FbGVtZW50SWQ6IChpZDogc3RyaW5nKSA9PiB7IHRhZzogc3RyaW5nLCBzd2VlcDogc3RyaW5nIH0pIHtcclxuICAgIGxldCBvYmogPSB0aGlzLmRpY3Rpb25uYXJ5T2JqZWN0czNELmdldChvYmplY3RJZCk7XHJcbiAgICBjb25zdCBwb2lPYmplY3QgPSB7XHJcbiAgICAgIGNvb3JkaW5hdGU6IEpTT04uc3RyaW5naWZ5KG9iai5vYmozRC5wb3NpdGlvbiksXHJcbiAgICAgIHR5cGU6IFBvaVR5cGUuT0JKRUNUM0QsXHJcbiAgICAgIGVsZW1lbnRJRDogb2JqZWN0SWQsXHJcbiAgICB9IGFzIFBPSTtcclxuICAgIGNvbnN0IG9iamVjdERiID0geyBpZDogb2JqZWN0SWQgfSBhcyBEYk9iamVjdFR5cGU7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCBjcmVhdGVUYWdDYWxsYmFjayhQb2lUeXBlLk9CSkVDVDNELCBvYmplY3REYiwgcG9pT2JqZWN0KTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7IH1cclxuXHJcbiAgICBsZXQgcmVzdWx0ID0gZ2V0VGFnRnJvbUVsZW1lbnRJZChvYmplY3RJZCk7XHJcbiAgICBhd2FpdCBnb1RvVGFnQ2FsbGJhY2socmVzdWx0LnRhZyk7XHJcbiAgICBkZWxldGVMYXN0VGFnQ2FsbGJhY2soKTtcclxuICB9XHJcblxyXG4gIGdldFNjZW5lTm9kZUZyb21PYmplY3QzRElkKHV1aWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaWN0aW9ubmFyeVNjZW5lT2JqZWN0czNELmdldCh1dWlkKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRpc3BsYXlBemltdXRhbENyb3duKHBvc2VDYW1lcmE6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuYXppbXV0aGFsQ3Jvd24gJiYgcG9zZUNhbWVyYSkge1xyXG4gICAgICB0aGlzLmF6aW11dGhhbENyb3duLm9iajNELnBvc2l0aW9uLnNldChwb3NlQ2FtZXJhLnBvc2l0aW9uLngsIHBvc2VDYW1lcmEucG9zaXRpb24ueSwgcG9zZUNhbWVyYS5wb3NpdGlvbi56KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYXR0YWNoR2l6bW9Db250cm9sVG8zRE9iamVjdChcclxuICAgIHNkazogYW55LFxyXG4gICAgbW9kZWxOb2RlOiBhbnksXHJcbiAgICBzY2VuZU9iamVjdDogYW55LFxyXG4gICAgbW9kZTogJ3RyYW5zbGF0ZScgfCAncm90YXRlJyB8ICdzY2FsZScsXHJcbiAgICB2aXNpYmxlOiBib29sZWFuLFxyXG4gICAgaXNOZXdPYmplY3Q6IGJvb2xlYW5cclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IG5vZGUgPSBzY2VuZU9iamVjdC5hZGROb2RlKCk7XHJcbiAgICBpZiAoIW5vZGUpIHtcclxuICAgICAgY29uc3QgW25ld1NjZW5lT2JqZWN0XSA9IGF3YWl0IHNkay5TY2VuZS5jcmVhdGVPYmplY3RzKDEpO1xyXG4gICAgICBub2RlID0gbmV3U2NlbmVPYmplY3QuYWRkTm9kZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbXlDb250cm9sID0gbm9kZS5hZGRDb21wb25lbnQoJ21wLnRyYW5zZm9ybUNvbnRyb2xzJyk7XHJcbiAgICBub2RlLnN0YXJ0KCk7XHJcbiAgICBteUNvbnRyb2wudHJhbnNmb3JtQ29udHJvbHMudmlzaWJsZSA9IHZpc2libGU7XHJcbiAgICBteUNvbnRyb2wuaW5wdXRzLnNlbGVjdGlvbiA9IG1vZGVsTm9kZTtcclxuICAgIG15Q29udHJvbC5pbnB1dHMubW9kZSA9IG1vZGU7XHJcbiAgICBtb2RlbE5vZGUub2JqM0QuY29udHJvbHMgPSBteUNvbnRyb2w7XHJcbiAgICBpZiAoaXNOZXdPYmplY3QpIHtcclxuICAgICAgaWYgKCF0aGlzLmxhc3RPYmplY3QzRCB8fCAhdGhpcy5sYXN0T2JqZWN0M0QuY29udHJvbHMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbW9kZWxOb2RlLm9iajNELnV1aWQgPSB0aGlzLmxhc3RPYmplY3QzRC51dWlkIHx8IHRoaXMubGFzdE9iamVjdDNELmlkO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBpZCBvYmogaW4gU2NlbmUgd2FzIG5vdCBhc3NpZ25lZCB0byBpZCBmcm9tIERCYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGFzdE9iamVjdDNEID0gbW9kZWxOb2RlLm9iajNEO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxhc3RPYmplY3QzRCA9IG1vZGVsTm9kZS5vYmozRDtcclxuICAgIH1cclxuICAgIHJldHVybiBtb2RlbE5vZGU7XHJcbiAgfVxyXG5cclxuICByZW1vdmVHaXptb0Zyb21MYXN0T2JqZWN0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubGFzdE9iamVjdDNEICYmIHRoaXMubGFzdE9iamVjdDNELmNvbnRyb2xzKSB7XHJcbiAgICAgIHRoaXMubGFzdE9iamVjdDNELmNvbnRyb2xzLnRyYW5zZm9ybUNvbnRyb2xzLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5sYXN0T2JqZWN0M0QuY29udHJvbHMudHJhbnNmb3JtQ29udHJvbHMuZGlzcG9zZSgpO1xyXG4gICAgICB0aGlzLmxhc3RPYmplY3QzRC5jb250cm9scyA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVWaWV3RnJ1c3R1bSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlY3VyaXR5Q2FtZXJhQW5pbWF0b3IpIHtcclxuICAgICAgdGhpcy5zZWN1cml0eUNhbWVyYUFuaW1hdG9yLnRvZ2dsZVZpZXdGcnVzdHVtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuZGljdGlvbm5hcnlPYmplY3RzM0QuY2xlYXIoKTtcclxuICAgIHRoaXMuZGljdGlvbm5hcnlTY2VuZU9iamVjdHMzRC5jbGVhcigpO1xyXG4gICAgdGhpcy5sYXN0T2JqZWN0M0QgPSBudWxsO1xyXG4gICAgdGhpcy5hemltdXRoYWxDcm93biA9IG51bGw7XHJcbiAgICB0aGlzLnNlY3VyaXR5Q2FtZXJhQW5pbWF0b3IgPSBudWxsO1xyXG4gICAgdGhpcy5ub0xpZ2h0Rm9yT2JqZWN0cyA9IHRydWU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,130 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { pointToString } from '../helpers.service';
3
+ import * as i0 from "@angular/core";
4
+ export class MatterportPointerService {
5
+ pointerButton = null;
6
+ getCursorPositionButton = null;
7
+ textDisplayCursorPositionPanel = null;
8
+ cursorPositionButtonDisplayed = false;
9
+ intervalCursorPointerPosition;
10
+ timerPointer;
11
+ oldPoseMatterportPosition;
12
+ constructor() { }
13
+ init(container, pointerButton, getCursorPositionButton, textDisplayCursorPositionPanel, callbacks) {
14
+ this.pointerButton = pointerButton;
15
+ this.getCursorPositionButton = getCursorPositionButton;
16
+ this.textDisplayCursorPositionPanel = textDisplayCursorPositionPanel;
17
+ if (this.pointerButton) {
18
+ this.pointerButton.addEventListener('click', callbacks.onLeftClick);
19
+ this.pointerButton.addEventListener('contextmenu', callbacks.onRightClick);
20
+ }
21
+ if (this.getCursorPositionButton) {
22
+ this.getCursorPositionButton.addEventListener('click', callbacks.onMiddleClick);
23
+ }
24
+ }
25
+ startPointerTrick(sdk, container, getPose, getPoseCamera, getInteractionMode, getMattertagToFollow) {
26
+ this.timerPointer = setInterval(() => {
27
+ this.updatePointerTrick(sdk, container, getPose(), getPoseCamera(), getInteractionMode(), getMattertagToFollow());
28
+ }, 50);
29
+ }
30
+ stopPointerTrick() {
31
+ clearInterval(this.timerPointer);
32
+ }
33
+ startAdminCursorTracker(sdk, container, getPose, getPoseCamera) {
34
+ if (!!this.getCursorPositionButton &&
35
+ (document.location.href.indexOf('dev') !== -1 || document.location.href.indexOf('localhost') !== -1)) {
36
+ this.intervalCursorPointerPosition = setInterval(() => {
37
+ const poseMatterport = getPose();
38
+ if (!poseMatterport)
39
+ return;
40
+ const nextShow = poseMatterport.time + 1000;
41
+ if (new Date().getTime() > nextShow) {
42
+ if (this.cursorPositionButtonDisplayed)
43
+ return;
44
+ const size = {
45
+ w: container.clientWidth,
46
+ h: container.clientHeight,
47
+ };
48
+ const coord = sdk.Conversion.worldToScreen(poseMatterport.position, getPoseCamera(), size);
49
+ this.getCursorPositionButton.style.left = `${coord.x - 25}px`;
50
+ this.getCursorPositionButton.style.top = `${coord.y - 22}px`;
51
+ this.getCursorPositionButton.style.display = 'block';
52
+ this.cursorPositionButtonDisplayed = true;
53
+ }
54
+ }, 500);
55
+ }
56
+ }
57
+ stopAdminCursorTracker() {
58
+ clearInterval(this.intervalCursorPointerPosition);
59
+ }
60
+ updatePointerTrick(sdk, container, poseMatterport, poseCamera, interactionMode, mattertagToFollow) {
61
+ if (!this.pointerButton)
62
+ return;
63
+ if (interactionMode !== 0 && // ViewerInteractions.DEFAULT
64
+ mattertagToFollow &&
65
+ poseMatterport &&
66
+ this.getDistPosition(sdk, container, poseCamera, poseMatterport.position, this.oldPoseMatterportPosition) > 25) {
67
+ this.pointerButton.style.display = 'none';
68
+ const size = {
69
+ w: container.clientWidth,
70
+ h: container.clientHeight,
71
+ };
72
+ const coords = sdk.Conversion.worldToScreen(poseMatterport.position, poseCamera, size);
73
+ this.pointerButton.style.left = `${coords.x * Math.sign(coords.x) - 25}px`;
74
+ this.pointerButton.style.top = `${coords.y * Math.sign(coords.x) - 25}px`;
75
+ this.oldPoseMatterportPosition = {
76
+ ...poseMatterport.position,
77
+ };
78
+ }
79
+ else {
80
+ this.pointerButton.style.display = 'block';
81
+ }
82
+ }
83
+ getDistPosition(sdk, container, poseCamera, pos1, pos2) {
84
+ if (!pos1 || !pos2)
85
+ return 100; // Force update if one is missing
86
+ const size = {
87
+ w: container.clientWidth,
88
+ h: container.clientHeight,
89
+ };
90
+ const coords1 = sdk.Conversion.worldToScreen(pos1, poseCamera, size);
91
+ const coords2 = sdk.Conversion.worldToScreen(pos2, poseCamera, size);
92
+ return Math.sqrt((coords1.x - coords2.x) ** 2 + (coords1.y - coords2.y) ** 2);
93
+ }
94
+ updateCursorDisplay(poseMatterport) {
95
+ if (this.textDisplayCursorPositionPanel && poseMatterport) {
96
+ this.textDisplayCursorPositionPanel.innerHTML = `position:
97
+ ${pointToString(poseMatterport.position)}\n
98
+ normal:
99
+ ${pointToString(poseMatterport.normal)}\n
100
+ floorId:
101
+ ${poseMatterport.floorId}`;
102
+ if (this.getCursorPositionButton) {
103
+ this.getCursorPositionButton.style.display = 'none';
104
+ }
105
+ }
106
+ }
107
+ clear(callbacks) {
108
+ if (this.pointerButton) {
109
+ this.pointerButton.removeEventListener('click', callbacks.onLeftClick);
110
+ this.pointerButton.removeEventListener('contextmenu', callbacks.onRightClick);
111
+ }
112
+ if (this.getCursorPositionButton) {
113
+ this.getCursorPositionButton.removeEventListener('click', callbacks.onMiddleClick);
114
+ }
115
+ this.stopPointerTrick();
116
+ this.stopAdminCursorTracker();
117
+ }
118
+ setCursorPositionButtonDisplayed(value) {
119
+ this.cursorPositionButtonDisplayed = value;
120
+ }
121
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportPointerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
122
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportPointerService, providedIn: 'root' });
123
+ }
124
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportPointerService, decorators: [{
125
+ type: Injectable,
126
+ args: [{
127
+ providedIn: 'root',
128
+ }]
129
+ }], ctorParameters: () => [] });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC1wb2ludGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL21hdHRlcnBvcnQtcG9pbnRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQUtuRCxNQUFNLE9BQU8sd0JBQXdCO0lBQzNCLGFBQWEsR0FBdUIsSUFBSSxDQUFDO0lBQ3pDLHVCQUF1QixHQUF1QixJQUFJLENBQUM7SUFDbkQsOEJBQThCLEdBQXVCLElBQUksQ0FBQztJQUUxRCw2QkFBNkIsR0FBRyxLQUFLLENBQUM7SUFDdEMsNkJBQTZCLENBQU07SUFDbkMsWUFBWSxDQUFNO0lBQ2xCLHlCQUF5QixDQUFNO0lBRXZDLGdCQUFnQixDQUFDO0lBRWpCLElBQUksQ0FDRixTQUFzQixFQUN0QixhQUEwQixFQUMxQix1QkFBb0MsRUFDcEMsOEJBQTJDLEVBQzNDLFNBSUM7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsdUJBQXVCLENBQUM7UUFDdkQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLDhCQUE4QixDQUFDO1FBRXJFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENB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Q0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0NBQWdDLENBQUMsS0FBYztRQUM3QyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsS0FBSyxDQUFDO0lBQzdDLENBQUM7d0dBdkpVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCLGNBRnZCLE1BQU07OzRGQUVQLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHBvaW50VG9TdHJpbmcgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdHRlcnBvcnRQb2ludGVyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBwb2ludGVyQnV0dG9uOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZ2V0Q3Vyc29yUG9zaXRpb25CdXR0b246IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSB0ZXh0RGlzcGxheUN1cnNvclBvc2l0aW9uUGFuZWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgY3Vyc29yUG9zaXRpb25CdXR0b25EaXNwbGF5ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGludGVydmFsQ3Vyc29yUG9pbnRlclBvc2l0aW9uOiBhbnk7XHJcbiAgcHJpdmF0ZSB0aW1lclBvaW50ZXI6IGFueTtcclxuICBwcml2YXRlIG9sZFBvc2VNYXR0ZXJwb3J0UG9zaXRpb246IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgaW5pdChcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBwb2ludGVyQnV0dG9uOiBIVE1MRWxlbWVudCxcclxuICAgIGdldEN1cnNvclBvc2l0aW9uQnV0dG9uOiBIVE1MRWxlbWVudCxcclxuICAgIHRleHREaXNwbGF5Q3Vyc29yUG9zaXRpb25QYW5lbDogSFRNTEVsZW1lbnQsXHJcbiAgICBjYWxsYmFja3M6IHtcclxuICAgICAgb25MZWZ0Q2xpY2s6IChldnQ6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAgIG9uUmlnaHRDbGljazogKGV2dDogTW91c2VFdmVudCkgPT4gdm9pZDtcclxuICAgICAgb25NaWRkbGVDbGljazogKGV2dDogTW91c2VFdmVudCkgPT4gdm9pZDtcclxuICAgIH1cclxuICApIHtcclxuICAgIHRoaXMucG9pbnRlckJ1dHRvbiA9IHBvaW50ZXJCdXR0b247XHJcbiAgICB0aGlzLmdldEN1cnNvclBvc2l0aW9uQnV0dG9uID0gZ2V0Q3Vyc29yUG9zaXRpb25CdXR0b247XHJcbiAgICB0aGlzLnRleHREaXNwbGF5Q3Vyc29yUG9zaXRpb25QYW5lbCA9IHRleHREaXNwbGF5Q3Vyc29yUG9zaXRpb25QYW5lbDtcclxuXHJcbiAgICBpZiAodGhpcy5wb2ludGVyQnV0dG9uKSB7XHJcbiAgICAgIHRoaXMucG9pbnRlckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNhbGxiYWNrcy5vbkxlZnRDbGljayk7XHJcbiAgICAgIHRoaXMucG9pbnRlckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGNhbGxiYWNrcy5vblJpZ2h0Q2xpY2spO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdldEN1cnNvclBvc2l0aW9uQnV0dG9uKSB7XHJcbiAgICAgIHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjYWxsYmFja3Mub25NaWRkbGVDbGljayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydFBvaW50ZXJUcmljayhzZGs6IGFueSwgY29udGFpbmVyOiBhbnksIGdldFBvc2U6ICgpID0+IGFueSwgZ2V0UG9zZUNhbWVyYTogKCkgPT4gYW55LCBnZXRJbnRlcmFjdGlvbk1vZGU6ICgpID0+IG51bWJlciwgZ2V0TWF0dGVydGFnVG9Gb2xsb3c6ICgpID0+IHN0cmluZyB8IG51bGwpIHtcclxuICAgIHRoaXMudGltZXJQb2ludGVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBvaW50ZXJUcmljayhzZGssIGNvbnRhaW5lciwgZ2V0UG9zZSgpLCBnZXRQb3NlQ2FtZXJhKCksIGdldEludGVyYWN0aW9uTW9kZSgpLCBnZXRNYXR0ZXJ0YWdUb0ZvbGxvdygpKTtcclxuICAgIH0sIDUwKTtcclxuICB9XHJcblxyXG4gIHN0b3BQb2ludGVyVHJpY2soKSB7XHJcbiAgICBjbGVhckludGVydmFsKHRoaXMudGltZXJQb2ludGVyKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0QWRtaW5DdXJzb3JUcmFja2VyKHNkazogYW55LCBjb250YWluZXI6IGFueSwgZ2V0UG9zZTogKCkgPT4gYW55LCBnZXRQb3NlQ2FtZXJhOiAoKSA9PiBhbnkpIHtcclxuICAgIGlmICghIXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25CdXR0b24gJiZcclxuICAgICAgKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignZGV2JykgIT09IC0xIHx8IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignbG9jYWxob3N0JykgIT09IC0xKSkge1xyXG4gICAgICB0aGlzLmludGVydmFsQ3Vyc29yUG9pbnRlclBvc2l0aW9uID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBvc2VNYXR0ZXJwb3J0ID0gZ2V0UG9zZSgpO1xyXG4gICAgICAgIGlmICghcG9zZU1hdHRlcnBvcnQpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgbmV4dFNob3cgPSBwb3NlTWF0dGVycG9ydC50aW1lICsgMTAwMDtcclxuICAgICAgICBpZiAobmV3IERhdGUoKS5nZXRUaW1lKCkgPiBuZXh0U2hvdykge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY3Vyc29yUG9zaXRpb25CdXR0b25EaXNwbGF5ZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgICBjb25zdCBzaXplID0ge1xyXG4gICAgICAgICAgICB3OiBjb250YWluZXIuY2xpZW50V2lkdGgsXHJcbiAgICAgICAgICAgIGg6IGNvbnRhaW5lci5jbGllbnRIZWlnaHQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgY29uc3QgY29vcmQgPSBzZGsuQ29udmVyc2lvbi53b3JsZFRvU2NyZWVuKHBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uLCBnZXRQb3NlQ2FtZXJhKCksIHNpemUpO1xyXG4gICAgICAgICAgdGhpcy5nZXRDdXJzb3JQb3NpdGlvbkJ1dHRvbiEuc3R5bGUubGVmdCA9IGAke2Nvb3JkLnggLSAyNX1weGA7XHJcbiAgICAgICAgICB0aGlzLmdldEN1cnNvclBvc2l0aW9uQnV0dG9uIS5zdHlsZS50b3AgPSBgJHtjb29yZC55IC0gMjJ9cHhgO1xyXG4gICAgICAgICAgdGhpcy5nZXRDdXJzb3JQb3NpdGlvbkJ1dHRvbiEuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICB0aGlzLmN1cnNvclBvc2l0aW9uQnV0dG9uRGlzcGxheWVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9wQWRtaW5DdXJzb3JUcmFja2VyKCkge1xyXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsQ3Vyc29yUG9pbnRlclBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVBvaW50ZXJUcmljayhzZGs6IGFueSwgY29udGFpbmVyOiBhbnksIHBvc2VNYXR0ZXJwb3J0OiBhbnksIHBvc2VDYW1lcmE6IGFueSwgaW50ZXJhY3Rpb25Nb2RlOiBudW1iZXIsIG1hdHRlcnRhZ1RvRm9sbG93OiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICBpZiAoIXRoaXMucG9pbnRlckJ1dHRvbikgcmV0dXJuO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgaW50ZXJhY3Rpb25Nb2RlICE9PSAwICYmIC8vIFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXHJcbiAgICAgIG1hdHRlcnRhZ1RvRm9sbG93ICYmXHJcbiAgICAgIHBvc2VNYXR0ZXJwb3J0ICYmXHJcbiAgICAgIHRoaXMuZ2V0RGlzdFBvc2l0aW9uKHNkaywgY29udGFpbmVyLCBwb3NlQ2FtZXJhLCBwb3NlTWF0dGVycG9ydC5wb3NpdGlvbiwgdGhpcy5vbGRQb3NlTWF0dGVycG9ydFBvc2l0aW9uKSA+IDI1XHJcbiAgICApIHtcclxuICAgICAgdGhpcy5wb2ludGVyQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICBjb25zdCBzaXplID0ge1xyXG4gICAgICAgIHc6IGNvbnRhaW5lci5jbGllbnRXaWR0aCxcclxuICAgICAgICBoOiBjb250YWluZXIuY2xpZW50SGVpZ2h0LFxyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBjb29yZHMgPSBzZGsuQ29udmVyc2lvbi53b3JsZFRvU2NyZWVuKFxyXG4gICAgICAgIHBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uLFxyXG4gICAgICAgIHBvc2VDYW1lcmEsXHJcbiAgICAgICAgc2l6ZVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnBvaW50ZXJCdXR0b24uc3R5bGUubGVmdCA9IGAke2Nvb3Jkcy54ICogTWF0aC5zaWduKGNvb3Jkcy54KSAtIDI1fXB4YDtcclxuICAgICAgdGhpcy5wb2ludGVyQnV0dG9uLnN0eWxlLnRvcCA9IGAke2Nvb3Jkcy55ICogTWF0aC5zaWduKGNvb3Jkcy54KSAtIDI1fXB4YDtcclxuICAgICAgdGhpcy5vbGRQb3NlTWF0dGVycG9ydFBvc2l0aW9uID0ge1xyXG4gICAgICAgIC4uLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wb2ludGVyQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RGlzdFBvc2l0aW9uKHNkazogYW55LCBjb250YWluZXI6IGFueSwgcG9zZUNhbWVyYTogYW55LCBwb3MxOiBhbnksIHBvczI6IGFueSkge1xyXG4gICAgaWYgKCFwb3MxIHx8ICFwb3MyKSByZXR1cm4gMTAwOyAvLyBGb3JjZSB1cGRhdGUgaWYgb25lIGlzIG1pc3NpbmdcclxuICAgIGNvbnN0IHNpemUgPSB7XHJcbiAgICAgIHc6IGNvbnRhaW5lci5jbGllbnRXaWR0aCxcclxuICAgICAgaDogY29udGFpbmVyLmNsaWVudEhlaWdodCxcclxuICAgIH07XHJcbiAgICBjb25zdCBjb29yZHMxID0gc2RrLkNvbnZlcnNpb24ud29ybGRUb1NjcmVlbihwb3MxLCBwb3NlQ2FtZXJhLCBzaXplKTtcclxuICAgIGNvbnN0IGNvb3JkczIgPSBzZGsuQ29udmVyc2lvbi53b3JsZFRvU2NyZWVuKHBvczIsIHBvc2VDYW1lcmEsIHNpemUpO1xyXG4gICAgcmV0dXJuIE1hdGguc3FydChcclxuICAgICAgKGNvb3JkczEueCAtIGNvb3JkczIueCkgKiogMiArIChjb29yZHMxLnkgLSBjb29yZHMyLnkpICoqIDJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVDdXJzb3JEaXNwbGF5KHBvc2VNYXR0ZXJwb3J0OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnRleHREaXNwbGF5Q3Vyc29yUG9zaXRpb25QYW5lbCAmJiBwb3NlTWF0dGVycG9ydCkge1xyXG4gICAgICB0aGlzLnRleHREaXNwbGF5Q3Vyc29yUG9zaXRpb25QYW5lbC5pbm5lckhUTUwgPSBgcG9zaXRpb246XHJcbiAgICAgICAgICAgJHtwb2ludFRvU3RyaW5nKHBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uKX1cXG5cclxuICAgICAgICAgICBub3JtYWw6XHJcbiAgICAgICAgICAgJHtwb2ludFRvU3RyaW5nKHBvc2VNYXR0ZXJwb3J0Lm5vcm1hbCl9XFxuXHJcbiAgICAgICAgICAgZmxvb3JJZDpcclxuICAgICAgICAgICAke3Bvc2VNYXR0ZXJwb3J0LmZsb29ySWR9YDtcclxuICAgICAgaWYgKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25CdXR0b24pIHtcclxuICAgICAgICB0aGlzLmdldEN1cnNvclBvc2l0aW9uQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyKGNhbGxiYWNrczoge1xyXG4gICAgb25MZWZ0Q2xpY2s6IChldnQ6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbiAgICBvblJpZ2h0Q2xpY2s6IChldnQ6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbiAgICBvbk1pZGRsZUNsaWNrOiAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xyXG4gIH0pIHtcclxuICAgIGlmICh0aGlzLnBvaW50ZXJCdXR0b24pIHtcclxuICAgICAgdGhpcy5wb2ludGVyQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsbGJhY2tzLm9uTGVmdENsaWNrKTtcclxuICAgICAgdGhpcy5wb2ludGVyQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgY2FsbGJhY2tzLm9uUmlnaHRDbGljayk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5nZXRDdXJzb3JQb3NpdGlvbkJ1dHRvbikge1xyXG4gICAgICB0aGlzLmdldEN1cnNvclBvc2l0aW9uQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsbGJhY2tzLm9uTWlkZGxlQ2xpY2spO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9wUG9pbnRlclRyaWNrKCk7XHJcbiAgICB0aGlzLnN0b3BBZG1pbkN1cnNvclRyYWNrZXIoKTtcclxuICB9XHJcblxyXG4gIHNldEN1cnNvclBvc2l0aW9uQnV0dG9uRGlzcGxheWVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uQnV0dG9uRGlzcGxheWVkID0gdmFsdWU7XHJcbiAgfVxyXG59XHJcbiJdfQ==