@smarterplan/ngx-smarterplan-locations 0.2.44 → 0.2.45
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/esm2020/lib/components/carousel/carousel.component.mjs +28 -0
- package/esm2020/lib/components/chevron/chevron.component.mjs +18 -0
- package/esm2020/lib/components/detail-location/detail-location.component.mjs +168 -0
- package/esm2020/lib/components/form-location/form-location.component.mjs +237 -0
- package/esm2020/lib/components/images/images.component.mjs +107 -0
- package/esm2020/lib/components/locations/locations.component.mjs +145 -0
- package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +66 -0
- package/esm2020/lib/components/locations/map/map.component.mjs +91 -0
- package/esm2020/lib/components/plan-legend/plan-legend.component.mjs +47 -0
- package/esm2020/lib/components/plans/calibration/calibration.component.mjs +468 -0
- package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +324 -0
- package/esm2020/lib/components/plans/plans.component.mjs +225 -0
- package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +41 -0
- package/esm2020/lib/components/visits/visits.component.mjs +283 -0
- package/esm2020/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +230 -0
- package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +315 -0
- package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +77 -0
- package/esm2020/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +502 -0
- package/esm2020/lib/components/zones/zones.component.mjs +268 -0
- package/esm2020/lib/helper.service.mjs +134 -0
- package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +49 -0
- package/esm2020/lib/ngx-smarterplan-locations.module.mjs +125 -0
- package/esm2020/lib/ngx-smarterplan-locations.service.mjs +14 -0
- package/esm2020/lib/pipes/count-audio-sweeps.pipe.mjs +27 -0
- package/esm2020/lib/radio-button/radio-button.component.mjs +26 -0
- package/esm2020/public-api.mjs +9 -0
- package/esm2020/smarterplan-ngx-smarterplan-locations.mjs +5 -0
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +3991 -0
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs +3828 -0
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/lib/components/carousel/carousel.component.d.ts +12 -0
- package/lib/components/chevron/chevron.component.d.ts +9 -0
- package/lib/components/detail-location/detail-location.component.d.ts +55 -0
- package/lib/components/form-location/form-location.component.d.ts +45 -0
- package/lib/components/images/images.component.d.ts +33 -0
- package/lib/components/locations/locations.component.d.ts +51 -0
- package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -0
- package/lib/components/locations/map/map.component.d.ts +22 -0
- package/lib/components/plan-legend/plan-legend.component.d.ts +14 -0
- package/lib/components/plans/calibration/calibration.component.d.ts +140 -0
- package/lib/components/plans/edit-plan/edit-plan.component.d.ts +55 -0
- package/lib/components/plans/plans.component.d.ts +63 -0
- package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -0
- package/lib/components/visits/visits.component.d.ts +62 -0
- package/lib/components/zones/add-audio-zone/add-audio-zone.component.d.ts +63 -0
- package/lib/components/zones/add-zone/add-zone.component.d.ts +69 -0
- package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -0
- package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +107 -0
- package/lib/components/zones/zones.component.d.ts +73 -0
- package/lib/helper.service.d.ts +53 -0
- package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -0
- package/lib/ngx-smarterplan-locations.module.d.ts +36 -0
- package/lib/ngx-smarterplan-locations.service.d.ts +6 -0
- package/lib/pipes/count-audio-sweeps.pipe.d.ts +10 -0
- package/lib/radio-button/radio-button.component.d.ts +12 -0
- package/package.json +22 -5
- package/{src/public-api.ts → public-api.d.ts} +4 -11
- package/smarterplan-ngx-smarterplan-locations.d.ts +5 -0
- package/.browserslistrc +0 -16
- package/karma.conf.js +0 -44
- package/ng-package.json +0 -7
- package/src/lib/components/carousel/carousel.component.html +0 -13
- package/src/lib/components/carousel/carousel.component.scss +0 -0
- package/src/lib/components/carousel/carousel.component.spec.ts +0 -25
- package/src/lib/components/carousel/carousel.component.ts +0 -31
- package/src/lib/components/chevron/chevron.component.html +0 -5
- package/src/lib/components/chevron/chevron.component.scss +0 -16
- package/src/lib/components/chevron/chevron.component.spec.ts +0 -25
- package/src/lib/components/chevron/chevron.component.ts +0 -17
- package/src/lib/components/detail-location/detail-location.component.html +0 -108
- package/src/lib/components/detail-location/detail-location.component.scss +0 -0
- package/src/lib/components/detail-location/detail-location.component.spec.ts +0 -25
- package/src/lib/components/detail-location/detail-location.component.ts +0 -215
- package/src/lib/components/form-location/form-location.component.html +0 -160
- package/src/lib/components/form-location/form-location.component.scss +0 -62
- package/src/lib/components/form-location/form-location.component.spec.ts +0 -25
- package/src/lib/components/form-location/form-location.component.ts +0 -274
- package/src/lib/components/images/images.component.html +0 -27
- package/src/lib/components/images/images.component.scss +0 -0
- package/src/lib/components/images/images.component.spec.ts +0 -25
- package/src/lib/components/images/images.component.ts +0 -133
- package/src/lib/components/locations/locations.component.html +0 -63
- package/src/lib/components/locations/locations.component.scss +0 -121
- package/src/lib/components/locations/locations.component.spec.ts +0 -25
- package/src/lib/components/locations/locations.component.ts +0 -186
- package/src/lib/components/locations/map/map-popup/map-popup.component.html +0 -11
- package/src/lib/components/locations/map/map-popup/map-popup.component.scss +0 -51
- package/src/lib/components/locations/map/map-popup/map-popup.component.spec.ts +0 -25
- package/src/lib/components/locations/map/map-popup/map-popup.component.ts +0 -79
- package/src/lib/components/locations/map/map.component.html +0 -2
- package/src/lib/components/locations/map/map.component.scss +0 -0
- package/src/lib/components/locations/map/map.component.spec.ts +0 -25
- package/src/lib/components/locations/map/map.component.ts +0 -111
- package/src/lib/components/plan-legend/plan-legend.component.html +0 -9
- package/src/lib/components/plan-legend/plan-legend.component.scss +0 -38
- package/src/lib/components/plan-legend/plan-legend.component.spec.ts +0 -25
- package/src/lib/components/plan-legend/plan-legend.component.ts +0 -50
- package/src/lib/components/plans/calibration/calibration.component.html +0 -98
- package/src/lib/components/plans/calibration/calibration.component.scss +0 -136
- package/src/lib/components/plans/calibration/calibration.component.spec.ts +0 -25
- package/src/lib/components/plans/calibration/calibration.component.ts +0 -603
- package/src/lib/components/plans/edit-plan/edit-plan.component.html +0 -77
- package/src/lib/components/plans/edit-plan/edit-plan.component.scss +0 -9
- package/src/lib/components/plans/edit-plan/edit-plan.component.spec.ts +0 -25
- package/src/lib/components/plans/edit-plan/edit-plan.component.ts +0 -421
- package/src/lib/components/plans/plans.component.html +0 -102
- package/src/lib/components/plans/plans.component.scss +0 -24
- package/src/lib/components/plans/plans.component.spec.ts +0 -25
- package/src/lib/components/plans/plans.component.ts +0 -305
- package/src/lib/components/tab-navigation/tab-navigation.component.html +0 -7
- package/src/lib/components/tab-navigation/tab-navigation.component.scss +0 -27
- package/src/lib/components/tab-navigation/tab-navigation.component.spec.ts +0 -25
- package/src/lib/components/tab-navigation/tab-navigation.component.ts +0 -35
- package/src/lib/components/visits/visits.component.html +0 -134
- package/src/lib/components/visits/visits.component.scss +0 -24
- package/src/lib/components/visits/visits.component.spec.ts +0 -25
- package/src/lib/components/visits/visits.component.ts +0 -357
- package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.html +0 -73
- package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.scss +0 -14
- package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.spec.ts +0 -25
- package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.ts +0 -269
- package/src/lib/components/zones/add-zone/add-zone.component.html +0 -153
- package/src/lib/components/zones/add-zone/add-zone.component.scss +0 -44
- package/src/lib/components/zones/add-zone/add-zone.component.spec.ts +0 -25
- package/src/lib/components/zones/add-zone/add-zone.component.ts +0 -377
- package/src/lib/components/zones/add-zone/selection/selection.component.html +0 -3
- package/src/lib/components/zones/add-zone/selection/selection.component.scss +0 -16
- package/src/lib/components/zones/add-zone/selection/selection.component.spec.ts +0 -25
- package/src/lib/components/zones/add-zone/selection/selection.component.ts +0 -95
- package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.html +0 -73
- package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.scss +0 -23
- package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.spec.ts +0 -25
- package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.ts +0 -595
- package/src/lib/components/zones/zones.component.html +0 -181
- package/src/lib/components/zones/zones.component.scss +0 -36
- package/src/lib/components/zones/zones.component.spec.ts +0 -25
- package/src/lib/components/zones/zones.component.ts +0 -339
- package/src/lib/helper.service.ts +0 -161
- package/src/lib/ngx-smarterplan-location-routing.module.ts +0 -41
- package/src/lib/ngx-smarterplan-locations.module.ts +0 -74
- package/src/lib/ngx-smarterplan-locations.service.spec.ts +0 -16
- package/src/lib/ngx-smarterplan-locations.service.ts +0 -9
- package/src/lib/pipes/count-audio-sweeps.pipe.ts +0 -21
- package/src/lib/radio-button/radio-button.component.html +0 -9
- package/src/lib/radio-button/radio-button.component.scss +0 -152
- package/src/lib/radio-button/radio-button.component.spec.ts +0 -25
- package/src/lib/radio-button/radio-button.component.ts +0 -26
- package/src/test.ts +0 -27
- package/tsconfig.lib.json +0 -15
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -17
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { Validators, } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/forms";
|
|
5
|
+
import * as i2 from "@smarterplan/ngx-smarterplan-core";
|
|
6
|
+
import * as i3 from "../../carousel/carousel.component";
|
|
7
|
+
import * as i4 from "./sweep-plan-selection/sweep-plan-selection.component";
|
|
8
|
+
import * as i5 from "@angular/common";
|
|
9
|
+
import * as i6 from "@ngx-translate/core";
|
|
10
|
+
export class AddZoneComponent {
|
|
11
|
+
constructor(fb, zoneService, layerService, userService, navigationService) {
|
|
12
|
+
this.fb = fb;
|
|
13
|
+
this.zoneService = zoneService;
|
|
14
|
+
this.layerService = layerService;
|
|
15
|
+
this.userService = userService;
|
|
16
|
+
this.navigationService = navigationService;
|
|
17
|
+
this.updatedZone = new EventEmitter();
|
|
18
|
+
this.isMuseumVisit = false;
|
|
19
|
+
this.parentZones = [];
|
|
20
|
+
this.carouselIsVisible = false;
|
|
21
|
+
this.isSubmitted = false;
|
|
22
|
+
this.chosenScans = [];
|
|
23
|
+
this.fromPlan = false;
|
|
24
|
+
this.chosenScansOnPlan = [];
|
|
25
|
+
this.zoneInitialNavCount = 0;
|
|
26
|
+
this.zoneIsMatterportFloor = false;
|
|
27
|
+
this.multipleFloors = false;
|
|
28
|
+
}
|
|
29
|
+
async ngOnInit() {
|
|
30
|
+
this.parentZones = this.zones.filter((zone) => zone.layer && zone.layer.name === 'FLOOR');
|
|
31
|
+
if (!this.defaultZone) {
|
|
32
|
+
this.defaultZone = this.getDefaultZone();
|
|
33
|
+
}
|
|
34
|
+
this.parentZones.unshift(this.defaultZone);
|
|
35
|
+
await this.updateLayers();
|
|
36
|
+
this.initZoneForm();
|
|
37
|
+
}
|
|
38
|
+
async updateLayers() {
|
|
39
|
+
this.currentOrgId = this.userService.currentOrganisation(this.spaceID).id;
|
|
40
|
+
const layers = await this.layerService.getLayerForOrganisation(this.currentOrgId);
|
|
41
|
+
// filter out layers created by the system
|
|
42
|
+
this.layers = layers.filter((l) => l.name !== 'BUILDING' && l.name !== 'FLOOR');
|
|
43
|
+
}
|
|
44
|
+
async initZoneForm() {
|
|
45
|
+
if (this.zoneEdit) {
|
|
46
|
+
if (this.zoneEdit.metadata) {
|
|
47
|
+
const metadata = JSON.parse(this.zoneEdit.metadata);
|
|
48
|
+
this.zoneIsMatterportFloor = metadata.hasOwnProperty('matterportFloorSequence');
|
|
49
|
+
}
|
|
50
|
+
const isVirtual = this.zoneService.zoneIsVirtual(this.zoneEdit);
|
|
51
|
+
if (!isVirtual) {
|
|
52
|
+
await this.loadNavigations();
|
|
53
|
+
}
|
|
54
|
+
this.isMuseumVisit = this.zoneEdit.isMuseumVisitZone === true;
|
|
55
|
+
this.multipleFloors = this.zoneEdit.isMultipleFloorZone === true;
|
|
56
|
+
this.zoneForm = this.fb.group({
|
|
57
|
+
id: this.zoneEdit.id,
|
|
58
|
+
name: [this.zoneEdit.name, [Validators.required]],
|
|
59
|
+
code_ref: this.zoneEdit.code_ref ? this.zoneEdit.code_ref : null,
|
|
60
|
+
layerID: this.zoneEdit.layer ? this.zoneEdit.layer.id : null,
|
|
61
|
+
surface: this.zoneEdit.surface ? this.zoneEdit.surface : 0,
|
|
62
|
+
parentID: this.zoneEdit.parentID,
|
|
63
|
+
parent: { value: this.zoneEdit.parent.name, disabled: true },
|
|
64
|
+
newLayer: [null, [this.layerNameValidator()]],
|
|
65
|
+
isMuseumVisitZone: this.isMuseumVisit,
|
|
66
|
+
startSweepID: this.zoneEdit.startSweepID,
|
|
67
|
+
});
|
|
68
|
+
this.onChangeMultipleFloors();
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.zoneForm = this.fb.group({
|
|
72
|
+
name: [
|
|
73
|
+
this.newZoneDataFromEditor ? this.newZoneDataFromEditor.name : '',
|
|
74
|
+
[Validators.required],
|
|
75
|
+
],
|
|
76
|
+
code_ref: null,
|
|
77
|
+
layerID: null,
|
|
78
|
+
surface: 0,
|
|
79
|
+
parentID: this.defaultZone.id,
|
|
80
|
+
newLayer: [null, [this.layerNameValidator()]],
|
|
81
|
+
isMuseumVisitZone: this.isMuseumVisit,
|
|
82
|
+
startSweepID: null,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async onSubmitZone() {
|
|
87
|
+
this.isSubmitted = true;
|
|
88
|
+
if (!this.zoneForm.valid) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const formValue = this.zoneForm.getRawValue(); //because we need values of disables controls as well
|
|
92
|
+
if (formValue.newLayer) {
|
|
93
|
+
await this.createLayer(formValue.newLayer).then((layer) => {
|
|
94
|
+
formValue.layerID = layer.id;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const zoneInput = {
|
|
98
|
+
name: formValue.name,
|
|
99
|
+
surface: Math.round(formValue.surface * 100) / 100,
|
|
100
|
+
spaceID: this.spaceID,
|
|
101
|
+
layerID: formValue.layerID,
|
|
102
|
+
parentID: formValue.parentID,
|
|
103
|
+
isMuseumVisitZone: this.isMuseumVisit,
|
|
104
|
+
isMultipleFloorZone: this.multipleFloors,
|
|
105
|
+
sweepIDs: [],
|
|
106
|
+
startSweepID: formValue.startSweepID,
|
|
107
|
+
};
|
|
108
|
+
if (formValue.code_ref) {
|
|
109
|
+
zoneInput.code_ref = formValue.code_ref;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
this.zoneForm = null;
|
|
113
|
+
this.isSubmitted = false;
|
|
114
|
+
if (this.zoneEdit) {
|
|
115
|
+
const zoneUpdate = zoneInput;
|
|
116
|
+
zoneUpdate.sweepIDs = this.zoneEdit.sweepIDs;
|
|
117
|
+
zoneUpdate.id = formValue.id;
|
|
118
|
+
await this.setSweepsAndNodeForZoneInput(zoneUpdate);
|
|
119
|
+
await this.zoneService.updateZone(zoneUpdate);
|
|
120
|
+
this.zoneEdit = null;
|
|
121
|
+
this.updatedZone.emit(zoneUpdate.id);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
await this.setSweepsAndNodeForZoneInput(zoneInput);
|
|
125
|
+
if (!zoneInput.parentID) {
|
|
126
|
+
// set building as parent
|
|
127
|
+
zoneInput.parentID = this.defaultZone.id;
|
|
128
|
+
}
|
|
129
|
+
await this.zoneService.create(zoneInput).then((zoneCreated) => {
|
|
130
|
+
this.updatedZone.emit(zoneCreated.id);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.error(error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
onCancel() {
|
|
139
|
+
this.isSubmitted = false;
|
|
140
|
+
this.zoneForm = null;
|
|
141
|
+
this.chosenScansOnPlan = [];
|
|
142
|
+
this.chosenScans = [];
|
|
143
|
+
this.updatedZone.emit(false);
|
|
144
|
+
}
|
|
145
|
+
get name() {
|
|
146
|
+
return this.zoneForm.get('name');
|
|
147
|
+
}
|
|
148
|
+
get newLayer() {
|
|
149
|
+
return this.zoneForm.get('newLayer');
|
|
150
|
+
}
|
|
151
|
+
toggleCarousel() {
|
|
152
|
+
this.carouselIsVisible = true;
|
|
153
|
+
this.chosenScansOnPlan = [];
|
|
154
|
+
}
|
|
155
|
+
togglePlan() {
|
|
156
|
+
this.fromPlan = true;
|
|
157
|
+
this.chosenScans = [];
|
|
158
|
+
}
|
|
159
|
+
onAddScan() {
|
|
160
|
+
if (!this.chosenScans.includes(this.currentScanShowing)) {
|
|
161
|
+
// console.log("adding scan", this.currentScanShowing);
|
|
162
|
+
this.chosenScans.push(this.currentScanShowing);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
alert('Scan already added!');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
onRemoveScanImage(scan) {
|
|
169
|
+
const index = this.chosenScans.indexOf(scan);
|
|
170
|
+
this.chosenScans.splice(index, 1);
|
|
171
|
+
}
|
|
172
|
+
onRemoveScanPlan(scan) {
|
|
173
|
+
const index = this.chosenScansOnPlan.indexOf(scan);
|
|
174
|
+
this.chosenScansOnPlan.splice(index, 1);
|
|
175
|
+
}
|
|
176
|
+
async setSweepsAndNodeForZoneInput(zoneInput) {
|
|
177
|
+
if (this.chosenScans.length > 0 &&
|
|
178
|
+
this.chosenScans.length !== this.zoneInitialNavCount &&
|
|
179
|
+
!this.fromPlan) {
|
|
180
|
+
// if we chose scans from the carousel
|
|
181
|
+
const sweepIDs = [];
|
|
182
|
+
this.chosenScans.map(async (scan) => {
|
|
183
|
+
const imageUuid = this.images360[scan].filename.split('_')[0];
|
|
184
|
+
const sweepID = this.navigationIDs.find((nav) => {
|
|
185
|
+
return nav.includes(imageUuid);
|
|
186
|
+
});
|
|
187
|
+
if (sweepID) {
|
|
188
|
+
sweepIDs.push(sweepID);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
zoneInput.sweepIDs = sweepIDs;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// we are not coming from gallery choice
|
|
195
|
+
if (this.chosenScansOnPlan.length > 0) {
|
|
196
|
+
zoneInput.sweepIDs = this.chosenScansOnPlan;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {
|
|
200
|
+
const navForSweep = await this.navigationService.getNavigationsForMatterportIDForSpace(zoneInput.sweepIDs[0], this.spaceID);
|
|
201
|
+
zoneInput.nodeIDs = [navForSweep[0].nodeID];
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async createLayer(name) {
|
|
205
|
+
return this.layerService.createLayerForOrganisation(name, this.currentOrgId);
|
|
206
|
+
}
|
|
207
|
+
async loadNavigations() {
|
|
208
|
+
if (this.zoneEdit.sweepIDs.length > 0) {
|
|
209
|
+
this.zoneInitialNavCount = this.zoneEdit.sweepIDs.length;
|
|
210
|
+
const navList = [];
|
|
211
|
+
const scansZoneEdit = [];
|
|
212
|
+
await Promise.all(this.zoneEdit.sweepIDs.map(async (sweepID) => {
|
|
213
|
+
scansZoneEdit.push(sweepID);
|
|
214
|
+
const index = this.images360.findIndex((im) => {
|
|
215
|
+
return im.filename.includes(sweepID.slice(0, 8));
|
|
216
|
+
});
|
|
217
|
+
if (index !== -1) {
|
|
218
|
+
navList.push(index);
|
|
219
|
+
}
|
|
220
|
+
}));
|
|
221
|
+
this.chosenScans = navList;
|
|
222
|
+
this.chosenScansOnPlan = scansZoneEdit;
|
|
223
|
+
return Promise.resolve();
|
|
224
|
+
}
|
|
225
|
+
return Promise.resolve();
|
|
226
|
+
}
|
|
227
|
+
// iniPlanForDraw() {
|
|
228
|
+
// this.togglePlan();
|
|
229
|
+
// setTimeout(() => {
|
|
230
|
+
// this.onPlanClick();
|
|
231
|
+
// }, 500);
|
|
232
|
+
// }
|
|
233
|
+
/**
|
|
234
|
+
* Adds all sweeps of the space
|
|
235
|
+
*/
|
|
236
|
+
onAddAll() {
|
|
237
|
+
const defaultZone = this.getDefaultZone();
|
|
238
|
+
if (defaultZone) {
|
|
239
|
+
this.chosenScansOnPlan = defaultZone.sweepIDs;
|
|
240
|
+
this.zoneForm.get('parentID').setValue(defaultZone.id);
|
|
241
|
+
this.zoneForm.get('parentID').disable();
|
|
242
|
+
this.multipleFloors = true;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
getDefaultZone() {
|
|
246
|
+
return this.zones.find((zone) => zone.layer &&
|
|
247
|
+
zone.layer.name === 'BUILDING' &&
|
|
248
|
+
zone.sweepIDs &&
|
|
249
|
+
zone.sweepIDs.length > 0);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Multiple floors
|
|
253
|
+
*/
|
|
254
|
+
onChangeMultipleFloors() {
|
|
255
|
+
if (this.multipleFloors) {
|
|
256
|
+
const defaultZone = this.getDefaultZone();
|
|
257
|
+
if (defaultZone) {
|
|
258
|
+
this.zoneForm.get('parentID').setValue(defaultZone.id);
|
|
259
|
+
this.zoneForm.get('parentID').disable();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
this.zoneForm.get('parentID').enable();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
onSelectedSweepsFromPlan(result) {
|
|
267
|
+
if (result) {
|
|
268
|
+
if (result.sweeps) {
|
|
269
|
+
this.chosenScansOnPlan = result.sweeps;
|
|
270
|
+
}
|
|
271
|
+
if (result.startSweepID) {
|
|
272
|
+
this.zoneForm.controls.startSweepID.setValue(result.startSweepID);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
this.fromPlan = false;
|
|
276
|
+
}
|
|
277
|
+
layerNameValidator() {
|
|
278
|
+
return (control) => {
|
|
279
|
+
if (!control.value) {
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
const forbidden = this.layers
|
|
283
|
+
.map((l) => l.name.toLowerCase())
|
|
284
|
+
.includes(control.value.toLowerCase());
|
|
285
|
+
return forbidden ? { forbiddenName: { value: control.value } } : null;
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
AddZoneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AddZoneComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ZoneService }, { token: i2.LayerService }, { token: i2.BaseUserService }, { token: i2.NavigationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
290
|
+
AddZoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AddZoneComponent, selector: "lib-add-zone", inputs: { zoneEdit: "zoneEdit", spaceID: "spaceID", images360: "images360", navigationIDs: "navigationIDs", zones: "zones", newZoneDataFromEditor: "newZoneDataFromEditor", chosenPlan: "chosenPlan", isMuseumVisit: "isMuseumVisit", defaultZone: "defaultZone" }, outputs: { updatedZone: "updatedZone" }, ngImport: i0, template: "<div class=\"main-container\" *ngIf=\"zoneForm\">\n <div class=\"col-7\">\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\n <!-- <div class=\"invalid-feedback\">\n {{'A name is required' | translate}}\n </div> -->\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"code_ref\">\n </div>\n </div>\n <div class=\"mb-3 row\" *ngIf=\"!isMuseumVisit && !zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Type of zone' | translate}}</label>\n <div class=\"col-sm-10\">\n <select class=\"form-control\" formControlName=\"layerID\">\n <option value=\"null\" selected disabled hidden> {{ zoneEdit && zoneEdit.layer ?\n zoneEdit.layer.name : 'Choose type'}}</option>\n <option *ngFor=\"let layer of layers\" [value]=\"layer.id\">\n {{ layer.name }}\n </option>\n </select>\n <p class=\"mt-1 new-type-text\">{{'or add new type of zone' | translate }}</p>\n <input type=\"text\" class=\"form-control new-type-input\" formControlName=\"newLayer\">\n <div *ngIf=\"newLayer.invalid && (newLayer.dirty || newLayer.touched)\" class=\"text-danger\">\n <div *ngIf=\"newLayer.errors?.['forbiddenName']\">\n {{'Layer exists already' | translate}}\n </div>\n </div>\n </div>\n </div>\n <!--If Editing Zone possibility to assign it to museum itinerary-->\n <div class=\"mb-3 row\" *ngIf=\"zoneEdit && !zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{ 'Museum Itinerary' | translate }}</label>\n <div class=\"col-sm-10\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"isMuseumVisit\"\n [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"!zoneEdit || zoneEdit.isMultipleFloorZone\">\n <label class=\"col-sm-2 col-form-label\">{{ 'Multiple Floors' | translate }}</label>\n <div class=\"col-sm-10\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"multipleFloors\"\n [disabled]=\"zoneEdit !== undefined && zoneEdit !== null\" (change)=\"onChangeMultipleFloors()\"\n [ngModelOptions]=\"{standalone: true}\">\n <div class='text-danger' *ngIf=\"zoneEdit\">\n {{'cannotChangeMultifloor' | translate}}\n </div>\n </div>\n\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"!zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Parent zone' | translate}}</label>\n <div class=\"col-sm-10\">\n <input *ngIf=\"zoneEdit\" type=\"text\" class=\"form-control\" formControlName=\"parent\">\n <div class=\"text-danger\" *ngIf=\"zoneEdit\">\n {{'cannotChangeParent' | translate}}\n </div>\n <select *ngIf=\"!zoneEdit\" class=\"form-control\" formControlName=\"parentID\">\n <option *ngFor=\"let zone of parentZones\" [ngValue]=\"zone.id\">\n {{ zone.name }}\n </option>\n </select>\n\n </div>\n </div>\n\n <div class=\"mb-3 row\" style=\"max-height: 200px; overflow: auto;\" *ngIf=\"!zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Scan Points' | translate}}</label>\n <!-- <p class=\"col-sm-2\" *ngIf=\"zoneEdit\">{{ zoneEdit.sweepIDs.length }} scans</p> -->\n <p class=\"col\" *ngIf=\"chosenScansOnPlan.length === 0 && chosenScans.length === 0\">\n {{'No scan points chosen' | translate}}</p>\n <div class=\"col-sm-5\" *ngIf=\"chosenScansOnPlan && chosenScansOnPlan.length > 0\">\n <p>{{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}}</p>\n <!-- <div *ngFor=\"let scan of chosenScansOnPlan\">\n <div class=\"row\">\n <p class=\"me-2\">{{ scan | slice:0:8 }}</p>\n <div (click)=\"onRemoveScanPlan(scan)\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n </div> -->\n </div>\n <div class=\"col-sm-5\" *ngIf=\"carouselIsVisible && chosenScans && chosenScans.length > 0\">\n <p>{{ chosenScans.length }} {{'scan points chosen' | translate}}</p>\n <div *ngFor=\"let scan of chosenScans\">\n <div class=\"row\">\n <p class=\"me-2\">{{ images360[scan].filename }}</p>\n <div (click)=\"onRemoveScanImage(scan)\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"row mb-3 mt-3\" *ngIf=\"!zoneIsMatterportFloor\">\n <div class=\"col\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"togglePlan()\">{{'Choose scan points on plan' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"toggleCarousel()\"\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\n {{'Choose scan points from gallery' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAll()\"\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\n {{'add-all-scans' | translate}}</button>\n </div>\n </div>\n\n <!-- <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'No visible scan points' | translate}}</label>\n <div class=\"col-sm-3\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"noScanPoints\"\n [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div> -->\n\n <div *ngIf=\"carouselIsVisible\" class=\"mb-2\">\n <lib-carousel *ngIf=\"images360 && images360.length > 0\" [images]=\"images360\"\n (currentScan)=\"currentScanShowing=$event\"></lib-carousel>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2 mt-3\"\n (click)=\"onAddScan()\">{{'Add to zone' | translate}}</button>\n </div>\n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\"\n [disabled]=\"fromPlan || !zoneForm.valid\">{{'Save' | translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [newZoneData]=\"newZoneDataFromEditor\" [spaceID]=\"spaceID\"\n [multipleFloors]=\"multipleFloors\" [inputZone]=\"zoneEdit\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>", styles: [".main-container{display:flex;flex-direction:column}.edit-plan{display:flex;margin:8px 0}.form-range{width:100%}h2{color:var(--smarterplan-primary);padding:0}.col-form-label{margin-bottom:1rem}.btn-outline-primary{margin-right:1rem}.new-type-input{margin-bottom:1rem}.new-type-text{margin-bottom:.5rem}.row{margin:0}p{margin:0;padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px)}button{min-width:80px}\n"], components: [{ type: i3.CarouselComponent, selector: "lib-carousel", inputs: ["images"], outputs: ["currentScan"] }, { type: i4.SweepPlanSelectionComponent, selector: "lib-sweep-plan-selection", inputs: ["spaceID", "chosenScansOnPlan", "newZoneData", "occupiedSweeps", "unavailableSweeps", "editingAudioZone", "inputZone", "multipleFloors"], outputs: ["sweepsSelected"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i6.TranslatePipe } });
|
|
291
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AddZoneComponent, decorators: [{
|
|
292
|
+
type: Component,
|
|
293
|
+
args: [{ selector: 'lib-add-zone', template: "<div class=\"main-container\" *ngIf=\"zoneForm\">\n <div class=\"col-7\">\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\n <!-- <div class=\"invalid-feedback\">\n {{'A name is required' | translate}}\n </div> -->\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"code_ref\">\n </div>\n </div>\n <div class=\"mb-3 row\" *ngIf=\"!isMuseumVisit && !zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Type of zone' | translate}}</label>\n <div class=\"col-sm-10\">\n <select class=\"form-control\" formControlName=\"layerID\">\n <option value=\"null\" selected disabled hidden> {{ zoneEdit && zoneEdit.layer ?\n zoneEdit.layer.name : 'Choose type'}}</option>\n <option *ngFor=\"let layer of layers\" [value]=\"layer.id\">\n {{ layer.name }}\n </option>\n </select>\n <p class=\"mt-1 new-type-text\">{{'or add new type of zone' | translate }}</p>\n <input type=\"text\" class=\"form-control new-type-input\" formControlName=\"newLayer\">\n <div *ngIf=\"newLayer.invalid && (newLayer.dirty || newLayer.touched)\" class=\"text-danger\">\n <div *ngIf=\"newLayer.errors?.['forbiddenName']\">\n {{'Layer exists already' | translate}}\n </div>\n </div>\n </div>\n </div>\n <!--If Editing Zone possibility to assign it to museum itinerary-->\n <div class=\"mb-3 row\" *ngIf=\"zoneEdit && !zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{ 'Museum Itinerary' | translate }}</label>\n <div class=\"col-sm-10\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"isMuseumVisit\"\n [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"!zoneEdit || zoneEdit.isMultipleFloorZone\">\n <label class=\"col-sm-2 col-form-label\">{{ 'Multiple Floors' | translate }}</label>\n <div class=\"col-sm-10\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"multipleFloors\"\n [disabled]=\"zoneEdit !== undefined && zoneEdit !== null\" (change)=\"onChangeMultipleFloors()\"\n [ngModelOptions]=\"{standalone: true}\">\n <div class='text-danger' *ngIf=\"zoneEdit\">\n {{'cannotChangeMultifloor' | translate}}\n </div>\n </div>\n\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\n </div>\n </div>\n\n <div class=\"mb-3 row\" *ngIf=\"!zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Parent zone' | translate}}</label>\n <div class=\"col-sm-10\">\n <input *ngIf=\"zoneEdit\" type=\"text\" class=\"form-control\" formControlName=\"parent\">\n <div class=\"text-danger\" *ngIf=\"zoneEdit\">\n {{'cannotChangeParent' | translate}}\n </div>\n <select *ngIf=\"!zoneEdit\" class=\"form-control\" formControlName=\"parentID\">\n <option *ngFor=\"let zone of parentZones\" [ngValue]=\"zone.id\">\n {{ zone.name }}\n </option>\n </select>\n\n </div>\n </div>\n\n <div class=\"mb-3 row\" style=\"max-height: 200px; overflow: auto;\" *ngIf=\"!zoneIsMatterportFloor\">\n <label class=\"col-sm-2 col-form-label\">{{'Scan Points' | translate}}</label>\n <!-- <p class=\"col-sm-2\" *ngIf=\"zoneEdit\">{{ zoneEdit.sweepIDs.length }} scans</p> -->\n <p class=\"col\" *ngIf=\"chosenScansOnPlan.length === 0 && chosenScans.length === 0\">\n {{'No scan points chosen' | translate}}</p>\n <div class=\"col-sm-5\" *ngIf=\"chosenScansOnPlan && chosenScansOnPlan.length > 0\">\n <p>{{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}}</p>\n <!-- <div *ngFor=\"let scan of chosenScansOnPlan\">\n <div class=\"row\">\n <p class=\"me-2\">{{ scan | slice:0:8 }}</p>\n <div (click)=\"onRemoveScanPlan(scan)\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n </div> -->\n </div>\n <div class=\"col-sm-5\" *ngIf=\"carouselIsVisible && chosenScans && chosenScans.length > 0\">\n <p>{{ chosenScans.length }} {{'scan points chosen' | translate}}</p>\n <div *ngFor=\"let scan of chosenScans\">\n <div class=\"row\">\n <p class=\"me-2\">{{ images360[scan].filename }}</p>\n <div (click)=\"onRemoveScanImage(scan)\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"row mb-3 mt-3\" *ngIf=\"!zoneIsMatterportFloor\">\n <div class=\"col\">\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"togglePlan()\">{{'Choose scan points on plan' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"toggleCarousel()\"\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\n {{'Choose scan points from gallery' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAll()\"\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\n {{'add-all-scans' | translate}}</button>\n </div>\n </div>\n\n <!-- <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'No visible scan points' | translate}}</label>\n <div class=\"col-sm-3\">\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"noScanPoints\"\n [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div> -->\n\n <div *ngIf=\"carouselIsVisible\" class=\"mb-2\">\n <lib-carousel *ngIf=\"images360 && images360.length > 0\" [images]=\"images360\"\n (currentScan)=\"currentScanShowing=$event\"></lib-carousel>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2 mt-3\"\n (click)=\"onAddScan()\">{{'Add to zone' | translate}}</button>\n </div>\n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\"\n [disabled]=\"fromPlan || !zoneForm.valid\">{{'Save' | translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [newZoneData]=\"newZoneDataFromEditor\" [spaceID]=\"spaceID\"\n [multipleFloors]=\"multipleFloors\" [inputZone]=\"zoneEdit\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>", styles: [".main-container{display:flex;flex-direction:column}.edit-plan{display:flex;margin:8px 0}.form-range{width:100%}h2{color:var(--smarterplan-primary);padding:0}.col-form-label{margin-bottom:1rem}.btn-outline-primary{margin-right:1rem}.new-type-input{margin-bottom:1rem}.new-type-text{margin-bottom:.5rem}.row{margin:0}p{margin:0;padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px)}button{min-width:80px}\n"] }]
|
|
294
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.ZoneService }, { type: i2.LayerService }, { type: i2.BaseUserService }, { type: i2.NavigationService }]; }, propDecorators: { zoneEdit: [{
|
|
295
|
+
type: Input
|
|
296
|
+
}], spaceID: [{
|
|
297
|
+
type: Input
|
|
298
|
+
}], images360: [{
|
|
299
|
+
type: Input
|
|
300
|
+
}], navigationIDs: [{
|
|
301
|
+
type: Input
|
|
302
|
+
}], zones: [{
|
|
303
|
+
type: Input
|
|
304
|
+
}], newZoneDataFromEditor: [{
|
|
305
|
+
type: Input
|
|
306
|
+
}], updatedZone: [{
|
|
307
|
+
type: Output
|
|
308
|
+
}], chosenPlan: [{
|
|
309
|
+
type: Input
|
|
310
|
+
}], isMuseumVisit: [{
|
|
311
|
+
type: Input
|
|
312
|
+
}], defaultZone: [{
|
|
313
|
+
type: Input
|
|
314
|
+
}] } });
|
|
315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXpvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLXpvbmUvYWRkLXpvbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLXpvbmUvYWRkLXpvbmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBR0wsVUFBVSxHQUlYLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBZXhCLE1BQU0sT0FBTyxnQkFBZ0I7SUErQzNCLFlBQ1UsRUFBZSxFQUNmLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLFdBQTRCLEVBQzVCLGlCQUFvQztRQUpwQyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUF2Q3BDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUl2QyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUl4QyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUV6QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFJMUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFJcEIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFJM0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQixzQkFBaUIsR0FBYSxFQUFFLENBQUM7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QUM7WUFDekMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEUsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7NkdBaFdVLGdCQUFnQjtpR0FBaEIsZ0JBQWdCLGlXQ3ZCN0IsaThSQXdKTTsyRkRqSU8sZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGNBQWM7cU5BS2YsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFFRSxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1Hcm91cCxcbiAgRm9ybUJ1aWxkZXIsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbCxcbiAgVmFsaWRhdG9yRm4sXG4gIFZhbGlkYXRpb25FcnJvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIFpvbmUsXG4gIFBsYW4sXG4gIExheWVyLFxuICBab25lU2VydmljZSxcbiAgTGF5ZXJTZXJ2aWNlLFxuICBCYXNlVXNlclNlcnZpY2UsXG4gIE5hdmlnYXRpb25TZXJ2aWNlLFxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWFkZC16b25lJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC16b25lLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWRkLXpvbmUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQWRkWm9uZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHpvbmVFZGl0OiBab25lO1xuXG4gIEBJbnB1dCgpIHNwYWNlSUQ6IHN0cmluZztcblxuICBASW5wdXQoKSBpbWFnZXMzNjA6IHsgcGF0aDogc3RyaW5nOyBmaWxlbmFtZTogc3RyaW5nIH1bXTtcblxuICBASW5wdXQoKSBuYXZpZ2F0aW9uSURzOiBzdHJpbmdbXTtcblxuICBASW5wdXQoKSB6b25lczogWm9uZVtdO1xuXG4gIEBJbnB1dCgpIG5ld1pvbmVEYXRhRnJvbUVkaXRvcjogYW55O1xuXG4gIEBPdXRwdXQoKSB1cGRhdGVkWm9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBJbnB1dCgpIGNob3NlblBsYW46IFBsYW47XG5cbiAgQElucHV0KCkgaXNNdXNldW1WaXNpdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGRlZmF1bHRab25lOiBab25lO1xuXG4gIHBhcmVudFpvbmVzOiBab25lW10gPSBbXTtcblxuICBjYXJvdXNlbElzVmlzaWJsZSA9IGZhbHNlO1xuXG4gIHpvbmVGb3JtOiBGb3JtR3JvdXA7XG5cbiAgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcblxuICBjdXJyZW50U2NhblNob3dpbmc6IG51bWJlcjtcblxuICBjaG9zZW5TY2FuczogbnVtYmVyW10gPSBbXTtcblxuICBsYXllcnM6IExheWVyW107XG5cbiAgZnJvbVBsYW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjaG9zZW5TY2Fuc09uUGxhbjogc3RyaW5nW10gPSBbXTtcblxuICBjdXJyZW50T3JnSWQ6IHN0cmluZztcblxuICB6b25lSW5pdGlhbE5hdkNvdW50ID0gMDtcblxuICB6b25lSXNNYXR0ZXJwb3J0Rmxvb3IgPSBmYWxzZTtcblxuICBtdWx0aXBsZUZsb29ycyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhcmVudFpvbmVzID0gdGhpcy56b25lcy5maWx0ZXIoXG4gICAgICAoem9uZSkgPT4gem9uZS5sYXllciAmJiB6b25lLmxheWVyLm5hbWUgPT09ICdGTE9PUidcbiAgICApO1xuICAgIGlmICghdGhpcy5kZWZhdWx0Wm9uZSkge1xuICAgICAgdGhpcy5kZWZhdWx0Wm9uZSA9IHRoaXMuZ2V0RGVmYXVsdFpvbmUoKTtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnRab25lcy51bnNoaWZ0KHRoaXMuZGVmYXVsdFpvbmUpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlTGF5ZXJzKCk7XG4gICAgdGhpcy5pbml0Wm9uZUZvcm0oKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUxheWVycygpIHtcbiAgICB0aGlzLmN1cnJlbnRPcmdJZCA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE9yZ2FuaXNhdGlvbih0aGlzLnNwYWNlSUQpLmlkO1xuICAgIGNvbnN0IGxheWVycyA9IGF3YWl0IHRoaXMubGF5ZXJTZXJ2aWNlLmdldExheWVyRm9yT3JnYW5pc2F0aW9uKFxuICAgICAgdGhpcy5jdXJyZW50T3JnSWRcbiAgICApO1xuICAgIC8vIGZpbHRlciBvdXQgbGF5ZXJzIGNyZWF0ZWQgYnkgdGhlIHN5c3RlbVxuICAgIHRoaXMubGF5ZXJzID0gbGF5ZXJzLmZpbHRlcihcbiAgICAgIChsKSA9PiBsLm5hbWUgIT09ICdCVUlMRElORycgJiYgbC5uYW1lICE9PSAnRkxPT1InXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRab25lRm9ybSgpIHtcbiAgICBpZiAodGhpcy56b25lRWRpdCkge1xuICAgICAgaWYgKHRoaXMuem9uZUVkaXQubWV0YWRhdGEpIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKHRoaXMuem9uZUVkaXQubWV0YWRhdGEpO1xuICAgICAgICB0aGlzLnpvbmVJc01hdHRlcnBvcnRGbG9vciA9IG1ldGFkYXRhLmhhc093blByb3BlcnR5KFxuICAgICAgICAgICdtYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzVmlydHVhbCA9IHRoaXMuem9uZVNlcnZpY2Uuem9uZUlzVmlydHVhbCh0aGlzLnpvbmVFZGl0KTtcbiAgICAgIGlmICghaXNWaXJ0dWFsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZE5hdmlnYXRpb25zKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmlzTXVzZXVtVmlzaXQgPSB0aGlzLnpvbmVFZGl0LmlzTXVzZXVtVmlzaXRab25lID09PSB0cnVlO1xuICAgICAgdGhpcy5tdWx0aXBsZUZsb29ycyA9IHRoaXMuem9uZUVkaXQuaXNNdWx0aXBsZUZsb29yWm9uZSA9PT0gdHJ1ZTtcbiAgICAgIHRoaXMuem9uZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgaWQ6IHRoaXMuem9uZUVkaXQuaWQsXG4gICAgICAgIG5hbWU6IFt0aGlzLnpvbmVFZGl0Lm5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICAgIGNvZGVfcmVmOiB0aGlzLnpvbmVFZGl0LmNvZGVfcmVmID8gdGhpcy56b25lRWRpdC5jb2RlX3JlZiA6IG51bGwsXG4gICAgICAgIGxheWVySUQ6IHRoaXMuem9uZUVkaXQubGF5ZXIgPyB0aGlzLnpvbmVFZGl0LmxheWVyLmlkIDogbnVsbCxcbiAgICAgICAgc3VyZmFjZTogdGhpcy56b25lRWRpdC5zdXJmYWNlID8gdGhpcy56b25lRWRpdC5zdXJmYWNlIDogMCxcbiAgICAgICAgcGFyZW50SUQ6IHRoaXMuem9uZUVkaXQucGFyZW50SUQsXG4gICAgICAgIHBhcmVudDogeyB2YWx1ZTogdGhpcy56b25lRWRpdC5wYXJlbnQubmFtZSwgZGlzYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgbmV3TGF5ZXI6IFtudWxsLCBbdGhpcy5sYXllck5hbWVWYWxpZGF0b3IoKV1dLFxuICAgICAgICBpc011c2V1bVZpc2l0Wm9uZTogdGhpcy5pc011c2V1bVZpc2l0LFxuICAgICAgICBzdGFydFN3ZWVwSUQ6IHRoaXMuem9uZUVkaXQuc3RhcnRTd2VlcElELFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlTXVsdGlwbGVGbG9vcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy56b25lRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbXG4gICAgICAgICAgdGhpcy5uZXdab25lRGF0YUZyb21FZGl0b3IgPyB0aGlzLm5ld1pvbmVEYXRhRnJvbUVkaXRvci5uYW1lIDogJycsXG4gICAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBdLFxuICAgICAgICBjb2RlX3JlZjogbnVsbCxcbiAgICAgICAgbGF5ZXJJRDogbnVsbCxcbiAgICAgICAgc3VyZmFjZTogMCxcbiAgICAgICAgcGFyZW50SUQ6IHRoaXMuZGVmYXVsdFpvbmUuaWQsXG4gICAgICAgIG5ld0xheWVyOiBbbnVsbCwgW3RoaXMubGF5ZXJOYW1lVmFsaWRhdG9yKCldXSxcbiAgICAgICAgaXNNdXNldW1WaXNpdFpvbmU6IHRoaXMuaXNNdXNldW1WaXNpdCxcbiAgICAgICAgc3RhcnRTd2VlcElEOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TdWJtaXRab25lKCkge1xuICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSB0cnVlO1xuICAgIGlmICghdGhpcy56b25lRm9ybS52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLnpvbmVGb3JtLmdldFJhd1ZhbHVlKCk7IC8vYmVjYXVzZSB3ZSBuZWVkIHZhbHVlcyBvZiBkaXNhYmxlcyBjb250cm9scyBhcyB3ZWxsXG4gICAgaWYgKGZvcm1WYWx1ZS5uZXdMYXllcikge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVMYXllcihmb3JtVmFsdWUubmV3TGF5ZXIpLnRoZW4oKGxheWVyKSA9PiB7XG4gICAgICAgIGZvcm1WYWx1ZS5sYXllcklEID0gbGF5ZXIuaWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB6b25lSW5wdXQgPSB7XG4gICAgICBuYW1lOiBmb3JtVmFsdWUubmFtZSxcbiAgICAgIHN1cmZhY2U6IE1hdGgucm91bmQoZm9ybVZhbHVlLnN1cmZhY2UgKiAxMDApIC8gMTAwLFxuICAgICAgc3BhY2VJRDogdGhpcy5zcGFjZUlELFxuICAgICAgbGF5ZXJJRDogZm9ybVZhbHVlLmxheWVySUQsXG4gICAgICBwYXJlbnRJRDogZm9ybVZhbHVlLnBhcmVudElELFxuICAgICAgaXNNdXNldW1WaXNpdFpvbmU6IHRoaXMuaXNNdXNldW1WaXNpdCxcbiAgICAgIGlzTXVsdGlwbGVGbG9vclpvbmU6IHRoaXMubXVsdGlwbGVGbG9vcnMsXG4gICAgICBzd2VlcElEczogW10sXG4gICAgICBzdGFydFN3ZWVwSUQ6IGZvcm1WYWx1ZS5zdGFydFN3ZWVwSUQsXG4gICAgfSBhcyBab25lO1xuXG4gICAgaWYgKGZvcm1WYWx1ZS5jb2RlX3JlZikge1xuICAgICAgem9uZUlucHV0LmNvZGVfcmVmID0gZm9ybVZhbHVlLmNvZGVfcmVmO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnpvbmVGb3JtID0gbnVsbDtcbiAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnpvbmVFZGl0KSB7XG4gICAgICAgIGNvbnN0IHpvbmVVcGRhdGUgPSB6b25lSW5wdXQ7XG4gICAgICAgIHpvbmVVcGRhdGUuc3dlZXBJRHMgPSB0aGlzLnpvbmVFZGl0LnN3ZWVwSURzO1xuICAgICAgICB6b25lVXBkYXRlLmlkID0gZm9ybVZhbHVlLmlkO1xuICAgICAgICBhd2FpdCB0aGlzLnNldFN3ZWVwc0FuZE5vZGVGb3Jab25lSW5wdXQoem9uZVVwZGF0ZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuem9uZVNlcnZpY2UudXBkYXRlWm9uZSh6b25lVXBkYXRlKTtcbiAgICAgICAgdGhpcy56b25lRWRpdCA9IG51bGw7XG4gICAgICAgIHRoaXMudXBkYXRlZFpvbmUuZW1pdCh6b25lVXBkYXRlLmlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0U3dlZXBzQW5kTm9kZUZvclpvbmVJbnB1dCh6b25lSW5wdXQpO1xuICAgICAgICBpZiAoIXpvbmVJbnB1dC5wYXJlbnRJRCkge1xuICAgICAgICAgIC8vIHNldCBidWlsZGluZyBhcyBwYXJlbnRcbiAgICAgICAgICB6b25lSW5wdXQucGFyZW50SUQgPSB0aGlzLmRlZmF1bHRab25lLmlkO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuem9uZVNlcnZpY2UuY3JlYXRlKHpvbmVJbnB1dCkudGhlbigoem9uZUNyZWF0ZWQpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZWRab25lLmVtaXQoem9uZUNyZWF0ZWQuaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb25DYW5jZWwoKSB7XG4gICAgdGhpcy5pc1N1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIHRoaXMuem9uZUZvcm0gPSBudWxsO1xuICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4gPSBbXTtcbiAgICB0aGlzLmNob3NlblNjYW5zID0gW107XG4gICAgdGhpcy51cGRhdGVkWm9uZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIGdldCBuYW1lKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuem9uZUZvcm0uZ2V0KCduYW1lJyk7XG4gIH1cblxuICBnZXQgbmV3TGF5ZXIoKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy56b25lRm9ybS5nZXQoJ25ld0xheWVyJyk7XG4gIH1cblxuICB0b2dnbGVDYXJvdXNlbCgpIHtcbiAgICB0aGlzLmNhcm91c2VsSXNWaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmNob3NlblNjYW5zT25QbGFuID0gW107XG4gIH1cblxuICB0b2dnbGVQbGFuKCkge1xuICAgIHRoaXMuZnJvbVBsYW4gPSB0cnVlO1xuICAgIHRoaXMuY2hvc2VuU2NhbnMgPSBbXTtcbiAgfVxuXG4gIG9uQWRkU2NhbigpIHtcbiAgICBpZiAoIXRoaXMuY2hvc2VuU2NhbnMuaW5jbHVkZXModGhpcy5jdXJyZW50U2NhblNob3dpbmcpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcImFkZGluZyBzY2FuXCIsIHRoaXMuY3VycmVudFNjYW5TaG93aW5nKTtcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnMucHVzaCh0aGlzLmN1cnJlbnRTY2FuU2hvd2luZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsZXJ0KCdTY2FuIGFscmVhZHkgYWRkZWQhJyk7XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVTY2FuSW1hZ2Uoc2NhbjogYW55KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmNob3NlblNjYW5zLmluZGV4T2Yoc2Nhbik7XG4gICAgdGhpcy5jaG9zZW5TY2Fucy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgb25SZW1vdmVTY2FuUGxhbihzY2FuOiBhbnkpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuY2hvc2VuU2NhbnNPblBsYW4uaW5kZXhPZihzY2FuKTtcbiAgICB0aGlzLmNob3NlblNjYW5zT25QbGFuLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICBhc3luYyBzZXRTd2VlcHNBbmROb2RlRm9yWm9uZUlucHV0KHpvbmVJbnB1dDogWm9uZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5jaG9zZW5TY2Fucy5sZW5ndGggIT09IHRoaXMuem9uZUluaXRpYWxOYXZDb3VudCAmJlxuICAgICAgIXRoaXMuZnJvbVBsYW5cbiAgICApIHtcbiAgICAgIC8vIGlmIHdlIGNob3NlIHNjYW5zIGZyb20gdGhlIGNhcm91c2VsXG4gICAgICBjb25zdCBzd2VlcElEczogc3RyaW5nW10gPSBbXTtcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnMubWFwKGFzeW5jIChzY2FuKSA9PiB7XG4gICAgICAgIGNvbnN0IGltYWdlVXVpZCA9IHRoaXMuaW1hZ2VzMzYwW3NjYW5dLmZpbGVuYW1lLnNwbGl0KCdfJylbMF07XG4gICAgICAgIGNvbnN0IHN3ZWVwSUQgPSB0aGlzLm5hdmlnYXRpb25JRHMuZmluZCgobmF2KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5hdi5pbmNsdWRlcyhpbWFnZVV1aWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN3ZWVwSUQpIHtcbiAgICAgICAgICBzd2VlcElEcy5wdXNoKHN3ZWVwSUQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHpvbmVJbnB1dC5zd2VlcElEcyA9IHN3ZWVwSURzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB3ZSBhcmUgbm90IGNvbWluZyBmcm9tIGdhbGxlcnkgY2hvaWNlXG4gICAgICBpZiAodGhpcy5jaG9zZW5TY2Fuc09uUGxhbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHpvbmVJbnB1dC5zd2VlcElEcyA9IHRoaXMuY2hvc2VuU2NhbnNPblBsYW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHpvbmVJbnB1dC5zd2VlcElEcyAmJiB6b25lSW5wdXQuc3dlZXBJRHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmF2Rm9yU3dlZXAgPVxuICAgICAgICBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldE5hdmlnYXRpb25zRm9yTWF0dGVycG9ydElERm9yU3BhY2UoXG4gICAgICAgICAgem9uZUlucHV0LnN3ZWVwSURzWzBdLFxuICAgICAgICAgIHRoaXMuc3BhY2VJRFxuICAgICAgICApO1xuICAgICAgem9uZUlucHV0Lm5vZGVJRHMgPSBbbmF2Rm9yU3dlZXBbMF0ubm9kZUlEXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVMYXllcihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPExheWVyPiB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXJTZXJ2aWNlLmNyZWF0ZUxheWVyRm9yT3JnYW5pc2F0aW9uKFxuICAgICAgbmFtZSxcbiAgICAgIHRoaXMuY3VycmVudE9yZ0lkXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWROYXZpZ2F0aW9ucygpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLnpvbmVFZGl0LnN3ZWVwSURzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuem9uZUluaXRpYWxOYXZDb3VudCA9IHRoaXMuem9uZUVkaXQuc3dlZXBJRHMubGVuZ3RoO1xuICAgICAgY29uc3QgbmF2TGlzdDogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IHNjYW5zWm9uZUVkaXQ6IHN0cmluZ1tdID0gW107XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGhpcy56b25lRWRpdC5zd2VlcElEcy5tYXAoYXN5bmMgKHN3ZWVwSUQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHNjYW5zWm9uZUVkaXQucHVzaChzd2VlcElEKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW1hZ2VzMzYwLmZpbmRJbmRleCgoaW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpbS5maWxlbmFtZS5pbmNsdWRlcyhzd2VlcElELnNsaWNlKDAsIDgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBuYXZMaXN0LnB1c2goaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmNob3NlblNjYW5zID0gbmF2TGlzdDtcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4gPSBzY2Fuc1pvbmVFZGl0O1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICAvLyBpbmlQbGFuRm9yRHJhdygpIHtcbiAgLy8gICAgIHRoaXMudG9nZ2xlUGxhbigpO1xuICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5vblBsYW5DbGljaygpO1xuICAvLyAgICAgfSwgNTAwKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsbCBzd2VlcHMgb2YgdGhlIHNwYWNlXG4gICAqL1xuICBvbkFkZEFsbCgpIHtcbiAgICBjb25zdCBkZWZhdWx0Wm9uZSA9IHRoaXMuZ2V0RGVmYXVsdFpvbmUoKTtcbiAgICBpZiAoZGVmYXVsdFpvbmUpIHtcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4gPSBkZWZhdWx0Wm9uZS5zd2VlcElEcztcbiAgICAgIHRoaXMuem9uZUZvcm0uZ2V0KCdwYXJlbnRJRCcpLnNldFZhbHVlKGRlZmF1bHRab25lLmlkKTtcbiAgICAgIHRoaXMuem9uZUZvcm0uZ2V0KCdwYXJlbnRJRCcpLmRpc2FibGUoKTtcbiAgICAgIHRoaXMubXVsdGlwbGVGbG9vcnMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGdldERlZmF1bHRab25lKCk6IFpvbmUge1xuICAgIHJldHVybiB0aGlzLnpvbmVzLmZpbmQoXG4gICAgICAoem9uZSkgPT5cbiAgICAgICAgem9uZS5sYXllciAmJlxuICAgICAgICB6b25lLmxheWVyLm5hbWUgPT09ICdCVUlMRElORycgJiZcbiAgICAgICAgem9uZS5zd2VlcElEcyAmJlxuICAgICAgICB6b25lLnN3ZWVwSURzLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBNdWx0aXBsZSBmbG9vcnNcbiAgICovXG4gIG9uQ2hhbmdlTXVsdGlwbGVGbG9vcnMoKSB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGVGbG9vcnMpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRab25lID0gdGhpcy5nZXREZWZhdWx0Wm9uZSgpO1xuICAgICAgaWYgKGRlZmF1bHRab25lKSB7XG4gICAgICAgIHRoaXMuem9uZUZvcm0uZ2V0KCdwYXJlbnRJRCcpLnNldFZhbHVlKGRlZmF1bHRab25lLmlkKTtcbiAgICAgICAgdGhpcy56b25lRm9ybS5nZXQoJ3BhcmVudElEJykuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnpvbmVGb3JtLmdldCgncGFyZW50SUQnKS5lbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICBvblNlbGVjdGVkU3dlZXBzRnJvbVBsYW4ocmVzdWx0OiB7IHN3ZWVwczogc3RyaW5nW107IHN0YXJ0U3dlZXBJRDogc3RyaW5nIH0pIHtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LnN3ZWVwcykge1xuICAgICAgICB0aGlzLmNob3NlblNjYW5zT25QbGFuID0gcmVzdWx0LnN3ZWVwcztcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuc3RhcnRTd2VlcElEKSB7XG4gICAgICAgIHRoaXMuem9uZUZvcm0uY29udHJvbHMuc3RhcnRTd2VlcElELnNldFZhbHVlKHJlc3VsdC5zdGFydFN3ZWVwSUQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZyb21QbGFuID0gZmFsc2U7XG4gIH1cblxuICBsYXllck5hbWVWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9yYmlkZGVuID0gdGhpcy5sYXllcnNcbiAgICAgICAgLm1hcCgobCkgPT4gbC5uYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgIC5pbmNsdWRlcyhjb250cm9sLnZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgcmV0dXJuIGZvcmJpZGRlbiA/IHsgZm9yYmlkZGVuTmFtZTogeyB2YWx1ZTogY29udHJvbC52YWx1ZSB9IH0gOiBudWxsO1xuICAgIH07XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYWluLWNvbnRhaW5lclwiICpuZ0lmPVwiem9uZUZvcm1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj5cbiAgICAgICAgPGZvcm0gKG5nU3VibWl0KT1cIm9uU3VibWl0Wm9uZSgpXCIgW2Zvcm1Hcm91cF09XCJ6b25lRm9ybVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eydOYW1lJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0EgbmFtZSBpcyByZXF1aXJlZCcgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbC1mb3JtLWxhYmVsXCI+e3snY29kZVJlZicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImNvZGVfcmVmXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiICpuZ0lmPVwiIWlzTXVzZXVtVmlzaXQgJiYgIXpvbmVJc01hdHRlcnBvcnRGbG9vclwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbC1mb3JtLWxhYmVsXCI+e3snVHlwZSBvZiB6b25lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsYXllcklEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibnVsbFwiIHNlbGVjdGVkIGRpc2FibGVkIGhpZGRlbj4ge3sgem9uZUVkaXQgJiYgem9uZUVkaXQubGF5ZXIgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVFZGl0LmxheWVyLm5hbWUgOiAnQ2hvb3NlIHR5cGUnfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxheWVyIG9mIGxheWVyc1wiIFt2YWx1ZV09XCJsYXllci5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxheWVyLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0xIG5ldy10eXBlLXRleHRcIj57eydvciBhZGQgbmV3IHR5cGUgb2Ygem9uZScgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG5ldy10eXBlLWlucHV0XCIgZm9ybUNvbnRyb2xOYW1lPVwibmV3TGF5ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm5ld0xheWVyLmludmFsaWQgJiYgKG5ld0xheWVyLmRpcnR5IHx8IG5ld0xheWVyLnRvdWNoZWQpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm5ld0xheWVyLmVycm9ycz8uWydmb3JiaWRkZW5OYW1lJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydMYXllciBleGlzdHMgYWxyZWFkeScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tSWYgRWRpdGluZyBab25lIHBvc3NpYmlsaXR5IHRvIGFzc2lnbiBpdCB0byBtdXNldW0gaXRpbmVyYXJ5LS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIiAqbmdJZj1cInpvbmVFZGl0ICYmICF6b25lSXNNYXR0ZXJwb3J0Rmxvb3JcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7ICdNdXNldW0gSXRpbmVyYXJ5JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJjaGVja2JveC1hcHBseSBtdC0zXCIgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJpc011c2V1bVZpc2l0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIiAqbmdJZj1cIiF6b25lRWRpdCB8fCB6b25lRWRpdC5pc011bHRpcGxlRmxvb3Jab25lXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eyAnTXVsdGlwbGUgRmxvb3JzJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJjaGVja2JveC1hcHBseSBtdC0zXCIgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJtdWx0aXBsZUZsb29yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiem9uZUVkaXQgIT09IHVuZGVmaW5lZCAmJiB6b25lRWRpdCAhPT0gbnVsbFwiIChjaGFuZ2UpPVwib25DaGFuZ2VNdWx0aXBsZUZsb29ycygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ndGV4dC1kYW5nZXInICpuZ0lmPVwiem9uZUVkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2Nhbm5vdENoYW5nZU11bHRpZmxvb3InIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7J1N1cmZhY2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJzdXJmYWNlXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCIgKm5nSWY9XCIhem9uZUlzTWF0dGVycG9ydEZsb29yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eydQYXJlbnQgem9uZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJ6b25lRWRpdFwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXJlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ6b25lRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snY2Fubm90Q2hhbmdlUGFyZW50JyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwiIXpvbmVFZGl0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXJlbnRJRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgem9uZSBvZiBwYXJlbnRab25lc1wiIFtuZ1ZhbHVlXT1cInpvbmUuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB6b25lLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiIHN0eWxlPVwibWF4LWhlaWdodDogMjAwcHg7IG92ZXJmbG93OiBhdXRvO1wiICpuZ0lmPVwiIXpvbmVJc01hdHRlcnBvcnRGbG9vclwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbC1mb3JtLWxhYmVsXCI+e3snU2NhbiBQb2ludHMnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS0gPHAgY2xhc3M9XCJjb2wtc20tMlwiICpuZ0lmPVwiem9uZUVkaXRcIj57eyB6b25lRWRpdC5zd2VlcElEcy5sZW5ndGggfX0gc2NhbnM8L3A+IC0tPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29sXCIgKm5nSWY9XCJjaG9zZW5TY2Fuc09uUGxhbi5sZW5ndGggPT09IDAgJiYgY2hvc2VuU2NhbnMubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J05vIHNjYW4gcG9pbnRzIGNob3NlbicgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIiAqbmdJZj1cImNob3NlblNjYW5zT25QbGFuICYmIGNob3NlblNjYW5zT25QbGFuLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+e3sgY2hvc2VuU2NhbnNPblBsYW4ubGVuZ3RoIH19IHt7J3NjYW4gcG9pbnRzIGNob3NlbicgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0Zvcj1cImxldCBzY2FuIG9mIGNob3NlblNjYW5zT25QbGFuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtZS0yXCI+e3sgc2NhbiB8IHNsaWNlOjA6OCB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblJlbW92ZVNjYW5QbGFuKHNjYW4pXCIgW3N0eWxlLmN1cnNvcl09XCIncG9pbnRlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOnRyYXNoLWNhbi1vdXRsaW5lXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIiAqbmdJZj1cImNhcm91c2VsSXNWaXNpYmxlICYmIGNob3NlblNjYW5zICYmIGNob3NlblNjYW5zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+e3sgY2hvc2VuU2NhbnMubGVuZ3RoIH19IHt7J3NjYW4gcG9pbnRzIGNob3NlbicgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2NhbiBvZiBjaG9zZW5TY2Fuc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWUtMlwiPnt7IGltYWdlczM2MFtzY2FuXS5maWxlbmFtZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblJlbW92ZVNjYW5JbWFnZShzY2FuKVwiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbmlmeVwiIGRhdGEtaWNvbj1cIm1kaTp0cmFzaC1jYW4tb3V0bGluZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTMgbXQtM1wiICpuZ0lmPVwiIXpvbmVJc01hdHRlcnBvcnRGbG9vclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxhbigpXCI+e3snQ2hvb3NlIHNjYW4gcG9pbnRzIG9uIHBsYW4nIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwidG9nZ2xlQ2Fyb3VzZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZnJvbVBsYW4gfHwgIWltYWdlczM2MCB8fCBpbWFnZXMzNjAubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydDaG9vc2Ugc2NhbiBwb2ludHMgZnJvbSBnYWxsZXJ5JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25BZGRBbGwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZnJvbVBsYW4gfHwgIWltYWdlczM2MCB8fCBpbWFnZXMzNjAubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydhZGQtYWxsLXNjYW5zJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J05vIHZpc2libGUgc2NhbiBwb2ludHMnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tM1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJjaGVja2JveC1hcHBseSBtdC0zXCIgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJub1NjYW5Qb2ludHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2Fyb3VzZWxJc1Zpc2libGVcIiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICA8bGliLWNhcm91c2VsICpuZ0lmPVwiaW1hZ2VzMzYwICYmIGltYWdlczM2MC5sZW5ndGggPiAwXCIgW2ltYWdlc109XCJpbWFnZXMzNjBcIlxuICAgICAgICAgICAgICAgICAgICAoY3VycmVudFNjYW4pPVwiY3VycmVudFNjYW5TaG93aW5nPSRldmVudFwiPjwvbGliLWNhcm91c2VsPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTIgbXQtM1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkFkZFNjYW4oKVwiPnt7J0FkZCB0byB6b25lJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZnJvbVBsYW4gfHwgIXpvbmVGb3JtLnZhbGlkXCI+e3snU2F2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiPlxuICAgICAgICAgICAgICAgICAgICB7eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImVkaXQtcGxhblwiICpuZ0lmPVwiZnJvbVBsYW5cIj5cbiAgICAgICAgPGxpYi1zd2VlcC1wbGFuLXNlbGVjdGlvbiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIFtuZXdab25lRGF0YV09XCJuZXdab25lRGF0YUZyb21FZGl0b3JcIiBbc3BhY2VJRF09XCJzcGFjZUlEXCJcbiAgICAgICAgICAgIFttdWx0aXBsZUZsb29yc109XCJtdWx0aXBsZUZsb29yc1wiIFtpbnB1dFpvbmVdPVwiem9uZUVkaXRcIlxuICAgICAgICAgICAgKHN3ZWVwc1NlbGVjdGVkKT1cIm9uU2VsZWN0ZWRTd2VlcHNGcm9tUGxhbigkZXZlbnQpXCI+PC9saWItc3dlZXAtcGxhbi1zZWxlY3Rpb24+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Component, EventEmitter, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class SelectionComponent {
|
|
4
|
+
constructor() {
|
|
5
|
+
/**Emit a new selection */
|
|
6
|
+
this.onSelectionChanged = new EventEmitter();
|
|
7
|
+
this.isMousedown = false;
|
|
8
|
+
this.selection = { startX: 0, startY: 0, endX: 0, endY: 0 };
|
|
9
|
+
this.selectionRectangle = { top: 0, left: 0, width: 0, height: 0 };
|
|
10
|
+
}
|
|
11
|
+
ngOnInit() {
|
|
12
|
+
this.selectionableZone = document.querySelector(".selectZone");
|
|
13
|
+
this.selectionElement = document.querySelector("#selection");
|
|
14
|
+
this.selectionableZone.addEventListener("mousedown", this.mousedown.bind(this));
|
|
15
|
+
this.selectionableZone.addEventListener("mousemove", this.mousemove.bind(this));
|
|
16
|
+
this.selectionableZone.addEventListener("mouseup", this.mouseup.bind(this));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Update the current selection
|
|
20
|
+
* Will update the selectionRectangle and Selection HTML element
|
|
21
|
+
* @param shouldEmit if true an event will be emitted through onSelectionChanged (true by default)
|
|
22
|
+
*/
|
|
23
|
+
updateSelectionElement(shouldEmit = true) {
|
|
24
|
+
this.selectionRectangle.width = Math.abs(this.selection.endX - this.selection.startX);
|
|
25
|
+
this.selectionRectangle.height = Math.abs(this.selection.endY - this.selection.startY);
|
|
26
|
+
this.selectionRectangle.top = Math.min(this.selection.endY, this.selection.startY);
|
|
27
|
+
this.selectionRectangle.left = Math.min(this.selection.endX, this.selection.startX);
|
|
28
|
+
this.selectionElement.style.top = `${this.selectionRectangle.top}px`;
|
|
29
|
+
this.selectionElement.style.left = `${this.selectionRectangle.left}px`;
|
|
30
|
+
this.selectionElement.style.width = `${this.selectionRectangle.width}px`;
|
|
31
|
+
this.selectionElement.style.height = `${this.selectionRectangle.height}px`;
|
|
32
|
+
if (shouldEmit) {
|
|
33
|
+
this.onSelectionChanged.emit(this.selectionRectangle);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Trigger when mouse is press down on selectionableZone
|
|
38
|
+
* @param event
|
|
39
|
+
*/
|
|
40
|
+
mousedown(event) {
|
|
41
|
+
if (event.button !== 2) { /**Selection with the right click, so ignore all other event */
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.isMousedown = true;
|
|
45
|
+
this.selection = { startY: event.clientY, startX: event.clientX, endX: event.clientX, endY: event.clientY };
|
|
46
|
+
this.updateSelectionElement();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Trigger when mouse is release on selectionableZone
|
|
50
|
+
* @param event
|
|
51
|
+
*/
|
|
52
|
+
mouseup(event) {
|
|
53
|
+
this.isMousedown = false;
|
|
54
|
+
this.selection = { startX: 0, startY: 0, endX: 0, endY: 0 };
|
|
55
|
+
this.updateSelectionElement(false);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Trigger when mouse is moving on selectionableZone
|
|
59
|
+
* @param event
|
|
60
|
+
*/
|
|
61
|
+
mousemove(event) {
|
|
62
|
+
if (this.isMousedown) {
|
|
63
|
+
this.selection.endX = event.clientX;
|
|
64
|
+
this.selection.endY = event.clientY;
|
|
65
|
+
this.updateSelectionElement();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
SelectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SelectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
70
|
+
SelectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SelectionComponent, selector: "lib-selection", outputs: { onSelectionChanged: "onSelectionChanged" }, ngImport: i0, template: "<ng-content></ng-content>\n\n<div id=\"selection\"></div>", styles: ["#selection{will-change:top,left,width,height;top:0px;left:0px;position:fixed;display:block;margin-top:0;margin-left:0;width:0px;height:0px;background:rgba(83,182,187,.3);border-radius:.15em;border:.15em solid rgba(83,182,187,.8);pointer-events:none}\n"] });
|
|
71
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SelectionComponent, decorators: [{
|
|
72
|
+
type: Component,
|
|
73
|
+
args: [{ selector: 'lib-selection', template: "<ng-content></ng-content>\n\n<div id=\"selection\"></div>", styles: ["#selection{will-change:top,left,width,height;top:0px;left:0px;position:fixed;display:block;margin-top:0;margin-left:0;width:0px;height:0px;background:rgba(83,182,187,.3);border-radius:.15em;border:.15em solid rgba(83,182,187,.8);pointer-events:none}\n"] }]
|
|
74
|
+
}], ctorParameters: function () { return []; }, propDecorators: { onSelectionChanged: [{
|
|
75
|
+
type: Output
|
|
76
|
+
}] } });
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL3pvbmVzL2FkZC16b25lL3NlbGVjdGlvbi9zZWxlY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLXpvbmUvc2VsZWN0aW9uL3NlbGVjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBUXhFLE1BQU0sT0FBTyxrQkFBa0I7SUFDM0I7UUFFQSwwQkFBMEI7UUFDaEIsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQVE3RCxnQkFBVyxHQUFhLEtBQUssQ0FBQztRQUU5QixjQUFTLEdBQUcsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUM7UUFFckQsdUJBQWtCLEdBQWUsRUFBQyxHQUFHLEVBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFmM0QsQ0FBQztJQWlCZixRQUFRO1FBQ0osSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFL0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLGlC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QUMsRUFBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLEtBQWtCO1FBQ3hCLElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQztZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDcEMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDakM7SUFDTCxDQUFDOzsrR0FwRlEsa0JBQWtCO21HQUFsQixrQkFBa0IsNEdDUi9CLDJEQUUwQjsyRkRNYixrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZUFBZTswRUFRYixrQkFBa0I7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uLy4uLy4uL2hlbHBlci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXNlbGVjdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3Rpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIGNvbnN0cnVjdG9yKCl7fVxuXG4gICAgLyoqRW1pdCBhIG5ldyBzZWxlY3Rpb24gKi9cbiAgICBAT3V0cHV0KCkgb25TZWxlY3Rpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxSZWN0YW5nbGU+KCk7XG5cbiAgICAvKipab25lIHdpY2ggeW91IGNhbiB1c2UgYSBzZWxlY3Rpb24gaW5zaWRlLCBtdXN0IGhhdmUgdGhlIGNsYXNzIFwiLnNlbGVjdFpvbmVcIiAqL1xuICAgIHNlbGVjdGlvbmFibGVab25lIDogSFRNTEVsZW1lbnQ7XG5cbiAgICAvKipIdG1sRWxlbWVudCB1c2UgdG8gZGlzcGxheSB0aGUgc2VsZWN0ZWQgem9uZSAoYmx1ZSkgKi9cbiAgICBzZWxlY3Rpb25FbGVtZW50IDogSFRNTEVsZW1lbnQ7XG5cbiAgICBpc01vdXNlZG93biA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHNlbGVjdGlvbiA9IHtzdGFydFg6IDAsIHN0YXJ0WTogMCwgZW5kWDogMCwgZW5kWTogMH07XG5cbiAgICBzZWxlY3Rpb25SZWN0YW5nbGUgOiBSZWN0YW5nbGUgPSB7dG9wIDogMCwgbGVmdDogMCwgd2lkdGg6IDAsIGhlaWdodDogMH07XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25hYmxlWm9uZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2VsZWN0Wm9uZVwiKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3NlbGVjdGlvblwiKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbmFibGVab25lLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIix0aGlzLm1vdXNlZG93bi5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbmFibGVab25lLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLm1vdXNlbW92ZS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbmFibGVab25lLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5tb3VzZXVwLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICogV2lsbCB1cGRhdGUgdGhlIHNlbGVjdGlvblJlY3RhbmdsZSBhbmQgU2VsZWN0aW9uIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSBzaG91bGRFbWl0IGlmIHRydWUgYW4gZXZlbnQgd2lsbCBiZSBlbWl0dGVkIHRocm91Z2ggb25TZWxlY3Rpb25DaGFuZ2VkICh0cnVlIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgdXBkYXRlU2VsZWN0aW9uRWxlbWVudChzaG91bGRFbWl0PXRydWUpe1xuICAgICAgICB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZS53aWR0aCA9IE1hdGguYWJzKHRoaXMuc2VsZWN0aW9uLmVuZFggLSB0aGlzLnNlbGVjdGlvbi5zdGFydFgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZS5oZWlnaHQgPSBNYXRoLmFicyh0aGlzLnNlbGVjdGlvbi5lbmRZIC0gdGhpcy5zZWxlY3Rpb24uc3RhcnRZKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGUudG9wID0gTWF0aC5taW4odGhpcy5zZWxlY3Rpb24uZW5kWSwgdGhpcy5zZWxlY3Rpb24uc3RhcnRZKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGUubGVmdCA9IE1hdGgubWluKHRoaXMuc2VsZWN0aW9uLmVuZFgsIHRoaXMuc2VsZWN0aW9uLnN0YXJ0WCk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25FbGVtZW50LnN0eWxlLnRvcCA9IGAke3RoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlLnRvcH1weGA7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7dGhpcy5zZWxlY3Rpb25SZWN0YW5nbGUubGVmdH1weGA7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlLndpZHRofXB4YDtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25FbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3RoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlLmhlaWdodH1weGA7XG5cbiAgICAgICAgaWYoc2hvdWxkRW1pdCl7XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgd2hlbiBtb3VzZSBpcyBwcmVzcyBkb3duIG9uIHNlbGVjdGlvbmFibGVab25lXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqL1xuICAgIG1vdXNlZG93bihldmVudCA6IE1vdXNlRXZlbnQpe1xuICAgICAgICBpZihldmVudC5idXR0b24gIT09IDIpeyAvKipTZWxlY3Rpb24gd2l0aCB0aGUgcmlnaHQgY2xpY2ssIHNvIGlnbm9yZSBhbGwgb3RoZXIgZXZlbnQgKi9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTW91c2Vkb3duID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB7c3RhcnRZIDogZXZlbnQuY2xpZW50WSwgc3RhcnRYIDogZXZlbnQuY2xpZW50WCwgZW5kWDpldmVudC5jbGllbnRYLCBlbmRZOmV2ZW50LmNsaWVudFl9O1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkVsZW1lbnQoKTsgICAgICAgIFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgd2hlbiBtb3VzZSBpcyByZWxlYXNlIG9uIHNlbGVjdGlvbmFibGVab25lXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqL1xuICAgIG1vdXNldXAoZXZlbnQgOiBNb3VzZUV2ZW50KXtcbiAgICAgICAgdGhpcy5pc01vdXNlZG93biA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHtzdGFydFggOjAsIHN0YXJ0WSA6IDAsIGVuZFg6MCwgZW5kWTowfTtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25FbGVtZW50KGZhbHNlKTsgICAgICAgIFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgd2hlbiBtb3VzZSBpcyBtb3Zpbmcgb24gc2VsZWN0aW9uYWJsZVpvbmVcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICovXG4gICAgbW91c2Vtb3ZlKGV2ZW50IDogTW91c2VFdmVudCl7XG4gICAgICAgIGlmKHRoaXMuaXNNb3VzZWRvd24pe1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZW5kWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5lbmRZID0gZXZlbnQuY2xpZW50WTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbjxkaXYgaWQ9XCJzZWxlY3Rpb25cIj48L2Rpdj4iXX0=
|