@smarterplan/ngx-smarterplan-locations 0.2.21 → 0.2.22
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 +27 -27
- package/esm2020/lib/components/chevron/chevron.component.mjs +17 -17
- package/esm2020/lib/components/detail-location/detail-location.component.mjs +154 -154
- package/esm2020/lib/components/form-location/form-location.component.mjs +237 -237
- package/esm2020/lib/components/images/images.component.mjs +90 -90
- package/esm2020/lib/components/locations/locations.component.mjs +141 -141
- package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +65 -65
- package/esm2020/lib/components/locations/map/map.component.mjs +90 -90
- package/esm2020/lib/components/plan-legend/plan-legend.component.mjs +47 -0
- package/esm2020/lib/components/plans/calibration/calibration.component.mjs +468 -468
- package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +324 -324
- package/esm2020/lib/components/plans/plans.component.mjs +210 -210
- package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +41 -41
- package/esm2020/lib/components/visits/visits.component.mjs +235 -235
- package/esm2020/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +230 -230
- package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +294 -294
- package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +76 -76
- package/esm2020/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +414 -413
- package/esm2020/lib/components/zones/zones.component.mjs +236 -232
- package/esm2020/lib/helper.service.mjs +134 -134
- package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +49 -49
- package/esm2020/lib/ngx-smarterplan-locations.module.mjs +125 -122
- package/esm2020/lib/ngx-smarterplan-locations.service.mjs +13 -13
- package/esm2020/lib/pipes/count-audio-sweeps.pipe.mjs +26 -26
- package/esm2020/lib/radio-button/radio-button.component.mjs +26 -26
- package/esm2020/public-api.mjs +8 -8
- package/esm2020/smarterplan-ngx-smarterplan-locations.mjs +4 -4
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +3676 -3624
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs +3520 -3472
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
- package/lib/components/carousel/carousel.component.d.ts +12 -12
- package/lib/components/chevron/chevron.component.d.ts +9 -9
- package/lib/components/detail-location/detail-location.component.d.ts +51 -51
- package/lib/components/form-location/form-location.component.d.ts +45 -45
- package/lib/components/images/images.component.d.ts +28 -28
- package/lib/components/locations/locations.component.d.ts +50 -50
- package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -22
- package/lib/components/locations/map/map.component.d.ts +22 -22
- package/lib/components/plan-legend/plan-legend.component.d.ts +14 -0
- package/lib/components/plans/calibration/calibration.component.d.ts +140 -140
- package/lib/components/plans/edit-plan/edit-plan.component.d.ts +55 -55
- package/lib/components/plans/plans.component.d.ts +59 -59
- package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -13
- package/lib/components/visits/visits.component.d.ts +51 -51
- package/lib/components/zones/add-audio-zone/add-audio-zone.component.d.ts +63 -63
- package/lib/components/zones/add-zone/add-zone.component.d.ts +67 -67
- package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -44
- package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +96 -96
- package/lib/components/zones/zones.component.d.ts +67 -67
- package/lib/helper.service.d.ts +53 -53
- package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -7
- package/lib/ngx-smarterplan-locations.module.d.ts +36 -35
- package/lib/ngx-smarterplan-locations.service.d.ts +6 -6
- package/lib/pipes/count-audio-sweeps.pipe.d.ts +10 -10
- package/lib/radio-button/radio-button.component.d.ts +12 -12
- package/package.json +1 -1
- package/public-api.d.ts +4 -4
- package/smarterplan-ngx-smarterplan-locations.d.ts +5 -5
|
@@ -1,237 +1,237 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
-
import { Validators } from '@angular/forms';
|
|
3
|
-
import { LevelStatus, enumToArray, uploadFileToS3, PropertyType, getSignedImageUrlForSpace, deleteFromS3 } from '@smarterplan/ngx-smarterplan-core';
|
|
4
|
-
import { textValidator, noEmptyValidator, floatValidator } from "@smarterplan/ngx-smarterplan-core";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@smarterplan/ngx-smarterplan-core";
|
|
7
|
-
import * as i2 from "@angular/forms";
|
|
8
|
-
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
-
import * as i4 from "@angular/common";
|
|
10
|
-
import * as i5 from "@ngx-translate/core";
|
|
11
|
-
export class FormLocationComponent {
|
|
12
|
-
constructor(spaceService, propertyService, userService, fb, missionService, layerService, validatorsService) {
|
|
13
|
-
this.spaceService = spaceService;
|
|
14
|
-
this.propertyService = propertyService;
|
|
15
|
-
this.userService = userService;
|
|
16
|
-
this.fb = fb;
|
|
17
|
-
this.missionService = missionService;
|
|
18
|
-
this.layerService = layerService;
|
|
19
|
-
this.validatorsService = validatorsService;
|
|
20
|
-
this.isSubmitted = false;
|
|
21
|
-
this.addMissionForNewSpace = true;
|
|
22
|
-
this.imageToBeDeleted = false;
|
|
23
|
-
this.errorForm = false;
|
|
24
|
-
this.onChange = new EventEmitter();
|
|
25
|
-
this.levels = enumToArray(LevelStatus);
|
|
26
|
-
}
|
|
27
|
-
ngOnInit() {
|
|
28
|
-
if (this.location) {
|
|
29
|
-
this.initEditForm();
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
this.initForm();
|
|
33
|
-
}
|
|
34
|
-
this.handleInputImageText();
|
|
35
|
-
}
|
|
36
|
-
initForm() {
|
|
37
|
-
this.form = this.fb.group({
|
|
38
|
-
name: ["", [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
39
|
-
addresses: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
40
|
-
latitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],
|
|
41
|
-
longitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],
|
|
42
|
-
level: LevelStatus.LOW,
|
|
43
|
-
classGes: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
44
|
-
classEnergyConsumption: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
45
|
-
constructionYear: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
initEditForm() {
|
|
49
|
-
this.form = this.fb.group({
|
|
50
|
-
id: this.location.id,
|
|
51
|
-
name: [this.location.name, [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
52
|
-
addresses: [this.location.addresses, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
53
|
-
latitude: [this.location.latitude, [Validators.maxLength(255), floatValidator()]],
|
|
54
|
-
longitude: [this.location.longitude, [Validators.maxLength(255), floatValidator()]],
|
|
55
|
-
level: this.location.level,
|
|
56
|
-
classGes: [this.location.classGes, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
57
|
-
classEnergyConsumption: [this.location.classEnergyConsumption, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
58
|
-
constructionYear: [this.location.constructionYear, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
handleImageInput(target) {
|
|
62
|
-
this.imageToUpload = target.files[0];
|
|
63
|
-
if (this.imageToUpload) {
|
|
64
|
-
this.imageInputContainer.nativeElement.style.display = "none";
|
|
65
|
-
const reader = new FileReader();
|
|
66
|
-
reader.addEventListener("load", () => {
|
|
67
|
-
this.currentImage = reader.result;
|
|
68
|
-
});
|
|
69
|
-
reader.readAsDataURL(this.imageToUpload);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
async uploadImage(spaceID) {
|
|
73
|
-
if (this.imageToUpload) {
|
|
74
|
-
uploadFileToS3("locations/", this.imageToUpload, spaceID).then(async (url) => {
|
|
75
|
-
if (url) {
|
|
76
|
-
await this.spaceService.updateSpace({
|
|
77
|
-
id: spaceID,
|
|
78
|
-
annexes: url,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
else if (this.imageToBeDeleted) {
|
|
84
|
-
await this.spaceService.updateSpace({
|
|
85
|
-
id: spaceID,
|
|
86
|
-
annexes: null,
|
|
87
|
-
});
|
|
88
|
-
await deleteFromS3(this.location.annexes);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
clearImageFile() {
|
|
92
|
-
this.imageToUpload = null;
|
|
93
|
-
this.currentImage = null;
|
|
94
|
-
this.imageInputContainer.nativeElement.style.display = "flex";
|
|
95
|
-
this.imageInput.nativeElement.value = "";
|
|
96
|
-
this.imageInputText = "Add picture";
|
|
97
|
-
}
|
|
98
|
-
async getLayerByName(name) {
|
|
99
|
-
const currentOrgId = this.userService.currentOrganisation().id;
|
|
100
|
-
const layers = await this.layerService.getLayerByNameForOrganisation(name, currentOrgId);
|
|
101
|
-
if (layers) {
|
|
102
|
-
return layers[0];
|
|
103
|
-
}
|
|
104
|
-
// create then
|
|
105
|
-
return this.layerService.createLayerForOrganisation(name, currentOrgId);
|
|
106
|
-
}
|
|
107
|
-
async onSubmit() {
|
|
108
|
-
this.isSubmitted = true;
|
|
109
|
-
if (!this.form.valid) {
|
|
110
|
-
this.errorForm = true;
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
try {
|
|
114
|
-
this.errorForm = false;
|
|
115
|
-
let space;
|
|
116
|
-
if (this.location) {
|
|
117
|
-
this.changeCommaToDot();
|
|
118
|
-
space = await this.spaceService.updateSpace(this.form.value);
|
|
119
|
-
if (space) {
|
|
120
|
-
await this.uploadImage(space.id);
|
|
121
|
-
this.location = space;
|
|
122
|
-
this.onChange.emit(space);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
this.changeCommaToDot();
|
|
127
|
-
const spaceInput = this.form.value;
|
|
128
|
-
const currentOrgID = this.userService.currentOrganisation().id;
|
|
129
|
-
spaceInput.organisationID = currentOrgID;
|
|
130
|
-
let layer = await this.getLayerByName("BUILDING");
|
|
131
|
-
if (!layer) {
|
|
132
|
-
layer = await this.layerService.createLayerForOrganisation("BUILDING", currentOrgID);
|
|
133
|
-
}
|
|
134
|
-
space = await this.spaceService.createSpace(spaceInput, layer);
|
|
135
|
-
const missions = this.userService.getManagerMissions();
|
|
136
|
-
if (space && missions.length > 0) {
|
|
137
|
-
const exampleMission = missions[0];
|
|
138
|
-
await this.uploadImage(space.id);
|
|
139
|
-
try {
|
|
140
|
-
await this.propertyService.createProperty({
|
|
141
|
-
type: PropertyType.PROPERTY,
|
|
142
|
-
spaceID: space.id,
|
|
143
|
-
organisationID: currentOrgID,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
catch (e) {
|
|
147
|
-
console.log("API Service does not have Property requests");
|
|
148
|
-
}
|
|
149
|
-
// add directly a mission for this space
|
|
150
|
-
if (this.addMissionForNewSpace) {
|
|
151
|
-
await this.missionService.create({
|
|
152
|
-
spaceID: space.id,
|
|
153
|
-
userID: exampleMission.userID,
|
|
154
|
-
role: exampleMission.role,
|
|
155
|
-
level: exampleMission.level,
|
|
156
|
-
organisationID: exampleMission.organisationID,
|
|
157
|
-
orderedOrganisationID: exampleMission.organisationID,
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
this.onChange.emit(space);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
this.onChange.emit(null);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
catch (error) {
|
|
168
|
-
console.error(error);
|
|
169
|
-
this.onChange.emit(null);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
onCancel() {
|
|
173
|
-
this.form.reset();
|
|
174
|
-
this.onChange.emit(null);
|
|
175
|
-
}
|
|
176
|
-
get name() {
|
|
177
|
-
return this.form.get("name");
|
|
178
|
-
}
|
|
179
|
-
changeCommaToDot() {
|
|
180
|
-
const updatedSpace = this.form.value;
|
|
181
|
-
if (updatedSpace.latitude &&
|
|
182
|
-
updatedSpace.latitude.toString().includes(",")) {
|
|
183
|
-
updatedSpace.latitude = updatedSpace.latitude
|
|
184
|
-
.toString()
|
|
185
|
-
.replace(",", ".");
|
|
186
|
-
Number.parseFloat(updatedSpace.latitude);
|
|
187
|
-
}
|
|
188
|
-
if (updatedSpace.longitude &&
|
|
189
|
-
updatedSpace.longitude.toString().includes(",")) {
|
|
190
|
-
updatedSpace.longitude = updatedSpace.longitude
|
|
191
|
-
.toString()
|
|
192
|
-
.replace(",", ".");
|
|
193
|
-
Number.parseFloat(updatedSpace.longitude);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
handleInputImageText() {
|
|
197
|
-
if (this.location && this.location.annexes) {
|
|
198
|
-
this.imageInputText = "Change picture";
|
|
199
|
-
getSignedImageUrlForSpace(this.location).then((url) => {
|
|
200
|
-
if (url) {
|
|
201
|
-
this.currentImage = url;
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
this.imageInputText = "Add picture";
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
isFormError(control) {
|
|
210
|
-
return control && control.invalid && this.errorForm;
|
|
211
|
-
}
|
|
212
|
-
onFormChange() {
|
|
213
|
-
if (this.errorForm && this.form.valid) {
|
|
214
|
-
this.errorForm = false;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
FormLocationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormLocationComponent, deps: [{ token: i1.SpaceService }, { token: i1.PropertyService }, { token: i1.BaseUserService }, { token: i2.FormBuilder }, { token: i1.MissionService }, { token: i1.LayerService }, { token: i1.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
219
|
-
FormLocationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: FormLocationComponent, selector: "lib-form-location", inputs: { location: "location" }, outputs: { onChange: "onChange" }, viewQueries: [{ propertyName: "imageInputContainer", first: true, predicate: ["imageInputContainer"], descendants: true }, { propertyName: "imageInput", first: true, predicate: ["imageInput"], descendants: true }, { propertyName: "imageBasePreview", first: true, predicate: ["imageBasePreview"], descendants: true }], ngImport: i0, template: "<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-location-name\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['name'])|| isFormError(form.controls['name'])}\"\r\n required formControlName=\"name\">\r\n\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['name']) \r\n || isFormError(form.controls['name'])\">\r\n {{validatorsService.getError(form.controls['name']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"addresses\" data-testid=\"new-location-address\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['addresses']) || isFormError(form.controls['addresses'])}\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"\" [translate]=\"validatorsService.getError(form.controls['addresses'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['addresses'])\"></span>\r\n\r\n <ngb-alert data-testid=\"new-location-address-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['addresses']) \">\r\n\r\n {{validatorsService.getError(form.controls['addresses']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Construction year' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"constructionYear\"\r\n data-testid=\"new-location-constructionYear\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-constructionYear-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])\">\r\n {{validatorsService.getError(form.controls['constructionYear']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Latitude' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"latitude\" data-testid=\"new-location-latitude\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['latitude'])|| isFormError(form.controls['latitude'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-latitude-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['latitude']) || isFormError(form.controls['latitude'])\">\r\n {{validatorsService.getError(form.controls['latitude']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Longitude' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"longitude\" data-testid=\"new-location-longitude\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['longitude'])|| isFormError(form.controls['longitude'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-longitude-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['longitude']) || isFormError(form.controls['longitude'])\">\r\n {{validatorsService.getError(form.controls['longitude']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <select class=\"d-inline-block custom-select rounded-pill\" formControlName=\"level\">\r\n <option *ngFor=\"let level of levels\" [value]=\"level\">{{level | translate}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Energy Class' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"classEnergyConsumption\"\r\n data-testid=\"new-location-classEnergyConsumption\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-classEnergyConsumption-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])\">\r\n {{validatorsService.getError(form.controls['classEnergyConsumption']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Greenhouse gas emission Class' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"classGes\" data-testid=\"new-location-classGes\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classGes'])|| isFormError(form.controls['classGes'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-classGes-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['classGes']) || isFormError(form.controls['classGes'])\">\r\n {{validatorsService.getError(form.controls['classGes']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Cover picture' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <img #imageBasePreview *ngIf=\"currentImage\" class=\"image-preview\" [src]=\"currentImage\">\r\n <label #imageInputContainer for=\"image\"\r\n class=\"btn btn-label-file btn-outline-primary rounded-pill imageInputContainer\">\r\n <input #imageInput type=\"file\" id=\"image\" (change)=\"handleImageInput($event.target)\" />\r\n {{ imageInputText | translate}}</label>\r\n <button *ngIf=\"currentImage && !imageToUpload\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"imageToBeDeleted=true;clearImageFile()\">{{'Delete picture' | translate }}</button>\r\n <div class=\"image-name\" *ngIf=\"imageToUpload\">\r\n <p>{{ imageToUpload.name}}</p>\r\n <div (click)=\"clearImageFile()\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\" *ngIf=\"!location\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Create mission for this space' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"addMissionForNewSpace\" [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n\r\n <button data-testid=\"new-location-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\" type=\"submit\"\r\n class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\r\n\r\n <button data-testid=\"new-location-close-btn\" type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n\r\n </ngb-alert>\r\n </div>\r\n </form>\r\n</div>", styles: ["input[type=file]{display:none}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}.image-preview{object-fit:cover;max-height:400px;max-width:400px;display:flex;margin-bottom:15px}.imageInputContainer{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content}.image-name{display:flex}.col-form-label{margin-bottom:1rem;width:230px}.form-new-loc{background-color:#d3d3d3;margin-bottom:15px;padding:10px;width:80%;border-radius:10px}.col-sm-9 select{width:100%;height:31.25px;padding-left:10px}.btn-outline-primary{width:200px;margin-bottom:1rem;margin-right:1rem}.is-invalid,.btn-outline-primary.is-invalid{border-color:red!important}\n"], components: [{ type: i3.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.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: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
|
|
220
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormLocationComponent, decorators: [{
|
|
221
|
-
type: Component,
|
|
222
|
-
args: [{ selector: 'lib-form-location', template: "<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-location-name\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['name'])|| isFormError(form.controls['name'])}\"\r\n required formControlName=\"name\">\r\n\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['name']) \r\n || isFormError(form.controls['name'])\">\r\n {{validatorsService.getError(form.controls['name']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"addresses\" data-testid=\"new-location-address\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['addresses']) || isFormError(form.controls['addresses'])}\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"\" [translate]=\"validatorsService.getError(form.controls['addresses'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['addresses'])\"></span>\r\n\r\n <ngb-alert data-testid=\"new-location-address-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['addresses']) \">\r\n\r\n {{validatorsService.getError(form.controls['addresses']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Construction year' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"constructionYear\"\r\n data-testid=\"new-location-constructionYear\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-constructionYear-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])\">\r\n {{validatorsService.getError(form.controls['constructionYear']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Latitude' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"latitude\" data-testid=\"new-location-latitude\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['latitude'])|| isFormError(form.controls['latitude'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-latitude-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['latitude']) || isFormError(form.controls['latitude'])\">\r\n {{validatorsService.getError(form.controls['latitude']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Longitude' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"longitude\" data-testid=\"new-location-longitude\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['longitude'])|| isFormError(form.controls['longitude'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-longitude-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['longitude']) || isFormError(form.controls['longitude'])\">\r\n {{validatorsService.getError(form.controls['longitude']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <select class=\"d-inline-block custom-select rounded-pill\" formControlName=\"level\">\r\n <option *ngFor=\"let level of levels\" [value]=\"level\">{{level | translate}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Energy Class' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"classEnergyConsumption\"\r\n data-testid=\"new-location-classEnergyConsumption\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-classEnergyConsumption-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])\">\r\n {{validatorsService.getError(form.controls['classEnergyConsumption']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Greenhouse gas emission Class' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"classGes\" data-testid=\"new-location-classGes\" (ngModelChange)=\"onFormChange()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classGes'])|| isFormError(form.controls['classGes'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-location-classGes-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"validatorsService.isControlError(form.controls['classGes']) || isFormError(form.controls['classGes'])\">\r\n {{validatorsService.getError(form.controls['classGes']) | translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Cover picture' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <img #imageBasePreview *ngIf=\"currentImage\" class=\"image-preview\" [src]=\"currentImage\">\r\n <label #imageInputContainer for=\"image\"\r\n class=\"btn btn-label-file btn-outline-primary rounded-pill imageInputContainer\">\r\n <input #imageInput type=\"file\" id=\"image\" (change)=\"handleImageInput($event.target)\" />\r\n {{ imageInputText | translate}}</label>\r\n <button *ngIf=\"currentImage && !imageToUpload\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"imageToBeDeleted=true;clearImageFile()\">{{'Delete picture' | translate }}</button>\r\n <div class=\"image-name\" *ngIf=\"imageToUpload\">\r\n <p>{{ imageToUpload.name}}</p>\r\n <div (click)=\"clearImageFile()\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\" *ngIf=\"!location\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Create mission for this space' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"addMissionForNewSpace\" [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n\r\n <button data-testid=\"new-location-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\" type=\"submit\"\r\n class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\r\n\r\n <button data-testid=\"new-location-close-btn\" type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n\r\n </ngb-alert>\r\n </div>\r\n </form>\r\n</div>", styles: ["input[type=file]{display:none}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}.image-preview{object-fit:cover;max-height:400px;max-width:400px;display:flex;margin-bottom:15px}.imageInputContainer{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content}.image-name{display:flex}.col-form-label{margin-bottom:1rem;width:230px}.form-new-loc{background-color:#d3d3d3;margin-bottom:15px;padding:10px;width:80%;border-radius:10px}.col-sm-9 select{width:100%;height:31.25px;padding-left:10px}.btn-outline-primary{width:200px;margin-bottom:1rem;margin-right:1rem}.is-invalid,.btn-outline-primary.is-invalid{border-color:red!important}\n"] }]
|
|
223
|
-
}], ctorParameters: function () { return [{ type: i1.SpaceService }, { type: i1.PropertyService }, { type: i1.BaseUserService }, { type: i2.FormBuilder }, { type: i1.MissionService }, { type: i1.LayerService }, { type: i1.ValidatorsService }]; }, propDecorators: { imageInputContainer: [{
|
|
224
|
-
type: ViewChild,
|
|
225
|
-
args: ["imageInputContainer"]
|
|
226
|
-
}], imageInput: [{
|
|
227
|
-
type: ViewChild,
|
|
228
|
-
args: ["imageInput"]
|
|
229
|
-
}], imageBasePreview: [{
|
|
230
|
-
type: ViewChild,
|
|
231
|
-
args: ["imageBasePreview"]
|
|
232
|
-
}], location: [{
|
|
233
|
-
type: Input
|
|
234
|
-
}], onChange: [{
|
|
235
|
-
type: Output
|
|
236
|
-
}] } });
|
|
237
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1sb2NhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tbG9jYXRpb25zL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWxvY2F0aW9uL2Zvcm0tbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1sb2NhdGlvbi9mb3JtLWxvY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBMEIsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JGLE9BQU8sRUFBUyxXQUFXLEVBQWtFLFdBQVcsRUFBRSxjQUFjLEVBQVMsWUFBWSxFQUFFLHlCQUF5QixFQUFnQixZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoUCxPQUFPLEVBQXFCLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7OztBQU92SCxNQUFNLE9BQU8scUJBQXFCO0lBa0M5QixZQUNZLFlBQTBCLEVBQzFCLGVBQWdDLEVBQ2hDLFdBQTRCLEVBQzVCLEVBQWUsRUFDZixjQUE4QixFQUM5QixZQUEwQixFQUMzQixpQkFBb0M7UUFObkMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFj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QUFyQixxQkFBcUIsNGJDVmxDLDBxU0ErSk07MkZEckpPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDSSxtQkFBbUI7aVJBUzdCLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBSWhDLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxZQUFZO2dCQUl2QixnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBSTdCLFFBQVE7c0JBRFAsS0FBSztnQkFtQkksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNwYWNlLCBMZXZlbFN0YXR1cywgU3BhY2VTZXJ2aWNlLCBQcm9wZXJ0eVNlcnZpY2UsIEJhc2VVc2VyU2VydmljZSwgTWlzc2lvblNlcnZpY2UsIGVudW1Ub0FycmF5LCB1cGxvYWRGaWxlVG9TMywgTGF5ZXIsIFByb3BlcnR5VHlwZSwgZ2V0U2lnbmVkSW1hZ2VVcmxGb3JTcGFjZSwgTGF5ZXJTZXJ2aWNlLCBkZWxldGVGcm9tUzMgfSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzU2VydmljZSwgdGV4dFZhbGlkYXRvciwgbm9FbXB0eVZhbGlkYXRvciwgZmxvYXRWYWxpZGF0b3IgfSBmcm9tIFwiQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLWZvcm0tbG9jYXRpb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tbG9jYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZm9ybS1sb2NhdGlvbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtTG9jYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiaW1hZ2VJbnB1dENvbnRhaW5lclwiKVxyXG4gICAgaW1hZ2VJbnB1dENvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiaW1hZ2VJbnB1dFwiKVxyXG4gICAgaW1hZ2VJbnB1dDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiaW1hZ2VCYXNlUHJldmlld1wiKVxyXG4gICAgaW1hZ2VCYXNlUHJldmlldzogRWxlbWVudFJlZjtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgbG9jYXRpb246IFNwYWNlO1xyXG5cclxuICAgIGltYWdlVG9VcGxvYWQ6IGFueTtcclxuXHJcbiAgICBpc1N1Ym1pdHRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGxldmVsczogQXJyYXk8TGV2ZWxTdGF0dXM+O1xyXG5cclxuICAgIGFkZE1pc3Npb25Gb3JOZXdTcGFjZSA9IHRydWU7XHJcblxyXG4gICAgaW1hZ2VJbnB1dFRleHQ6IHN0cmluZztcclxuXHJcbiAgICBjdXJyZW50SW1hZ2U6IHN0cmluZztcclxuXHJcbiAgICBpbWFnZVRvQmVEZWxldGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZXJyb3JGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTcGFjZSB8IG51bGw+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHByb3BlcnR5U2VydmljZTogUHJvcGVydHlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIG1pc3Npb25TZXJ2aWNlOiBNaXNzaW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyB2YWxpZGF0b3JzU2VydmljZTogVmFsaWRhdG9yc1NlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMubGV2ZWxzID0gZW51bVRvQXJyYXkoTGV2ZWxTdGF0dXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEVkaXRGb3JtKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZUlucHV0SW1hZ2VUZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdEZvcm0oKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIG5hbWU6IFtcIlwiLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgYWRkcmVzc2VzOiBbXCJcIiwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGxhdGl0dWRlOiBbbnVsbCwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIG5vRW1wdHlWYWxpZGF0b3IoKSwgZmxvYXRWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBsb25naXR1ZGU6IFtudWxsLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgbm9FbXB0eVZhbGlkYXRvcigpLCBmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGxldmVsOiBMZXZlbFN0YXR1cy5MT1csXHJcbiAgICAgICAgICAgIGNsYXNzR2VzOiBbXCJcIiwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGNsYXNzRW5lcmd5Q29uc3VtcHRpb246IFtcIlwiLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgY29uc3RydWN0aW9uWWVhcjogW1wiXCIsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRFZGl0Rm9ybSgpIHtcclxuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMubG9jYXRpb24uaWQsXHJcbiAgICAgICAgICAgIG5hbWU6IFt0aGlzLmxvY2F0aW9uLm5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBhZGRyZXNzZXM6IFt0aGlzLmxvY2F0aW9uLmFkZHJlc3NlcywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGxhdGl0dWRlOiBbdGhpcy5sb2NhdGlvbi5sYXRpdHVkZSwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIGZsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgbG9uZ2l0dWRlOiBbdGhpcy5sb2NhdGlvbi5sb25naXR1ZGUsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCBmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGxldmVsOiB0aGlzLmxvY2F0aW9uLmxldmVsLFxyXG4gICAgICAgICAgICBjbGFzc0dlczogW3RoaXMubG9jYXRpb24uY2xhc3NHZXMsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBjbGFzc0VuZXJneUNvbnN1bXB0aW9uOiBbdGhpcy5sb2NhdGlvbi5jbGFzc0VuZXJneUNvbnN1bXB0aW9uLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgY29uc3RydWN0aW9uWWVhcjogW3RoaXMubG9jYXRpb24uY29uc3RydWN0aW9uWWVhciwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlSW1hZ2VJbnB1dCh0YXJnZXQ6IEV2ZW50VGFyZ2V0KSB7XHJcbiAgICAgICAgdGhpcy5pbWFnZVRvVXBsb2FkID0gKHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlc1swXTtcclxuICAgICAgICBpZiAodGhpcy5pbWFnZVRvVXBsb2FkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VJbnB1dENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEltYWdlID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh0aGlzLmltYWdlVG9VcGxvYWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGxvYWRJbWFnZShzcGFjZUlEOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5pbWFnZVRvVXBsb2FkKSB7XHJcbiAgICAgICAgICAgIHVwbG9hZEZpbGVUb1MzKFwibG9jYXRpb25zL1wiLCB0aGlzLmltYWdlVG9VcGxvYWQsIHNwYWNlSUQpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICBhc3luYyAodXJsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS51cGRhdGVTcGFjZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc3BhY2VJRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubmV4ZXM6IHVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW1hZ2VUb0JlRGVsZXRlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS51cGRhdGVTcGFjZSh7XHJcbiAgICAgICAgICAgICAgICBpZDogc3BhY2VJRCxcclxuICAgICAgICAgICAgICAgIGFubmV4ZXM6IG51bGwsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhd2FpdCBkZWxldGVGcm9tUzModGhpcy5sb2NhdGlvbi5hbm5leGVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJJbWFnZUZpbGUoKSB7XHJcbiAgICAgICAgdGhpcy5pbWFnZVRvVXBsb2FkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5pbWFnZUlucHV0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gXCJcIjtcclxuICAgICAgICB0aGlzLmltYWdlSW5wdXRUZXh0ID0gXCJBZGQgcGljdHVyZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldExheWVyQnlOYW1lKG5hbWU6IHN0cmluZyk6IFByb21pc2U8TGF5ZXI+IHtcclxuICAgICAgICBjb25zdCBjdXJyZW50T3JnSWQgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRPcmdhbmlzYXRpb24oKS5pZDtcclxuICAgICAgICBjb25zdCBsYXllcnMgPSBhd2FpdCB0aGlzLmxheWVyU2VydmljZS5nZXRMYXllckJ5TmFtZUZvck9yZ2FuaXNhdGlvbihcclxuICAgICAgICAgICAgbmFtZSxcclxuICAgICAgICAgICAgY3VycmVudE9yZ0lkLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGxheWVycykge1xyXG4gICAgICAgICAgICByZXR1cm4gbGF5ZXJzWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjcmVhdGUgdGhlblxyXG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllckZvck9yZ2FuaXNhdGlvbihuYW1lLCBjdXJyZW50T3JnSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VibWl0KCkge1xyXG4gICAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JGb3JtID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkgeyBcclxuICAgICAgICAgICAgdGhpcy5lcnJvckZvcm0gPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHNwYWNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb21tYVRvRG90KCk7XHJcbiAgICAgICAgICAgICAgICBzcGFjZSA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLnVwZGF0ZVNwYWNlKHRoaXMuZm9ybS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZEltYWdlKHNwYWNlLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uID0gc3BhY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ29tbWFUb0RvdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BhY2VJbnB1dCA9IHRoaXMuZm9ybS52YWx1ZSBhcyBTcGFjZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRPcmdJRCA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE9yZ2FuaXNhdGlvbigpLmlkO1xyXG4gICAgICAgICAgICAgICAgc3BhY2VJbnB1dC5vcmdhbmlzYXRpb25JRCA9IGN1cnJlbnRPcmdJRDtcclxuICAgICAgICAgICAgICAgIGxldCBsYXllciA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJCeU5hbWUoXCJCVUlMRElOR1wiKTtcclxuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXllciA9IGF3YWl0IHRoaXMubGF5ZXJTZXJ2aWNlLmNyZWF0ZUxheWVyRm9yT3JnYW5pc2F0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkJVSUxESU5HXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPcmdJRCxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc3BhY2UgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5jcmVhdGVTcGFjZShcclxuICAgICAgICAgICAgICAgICAgICBzcGFjZUlucHV0LFxyXG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW9ucyA9IHRoaXMudXNlclNlcnZpY2UuZ2V0TWFuYWdlck1pc3Npb25zKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2UgJiYgbWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4YW1wbGVNaXNzaW9uID0gbWlzc2lvbnNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRJbWFnZShzcGFjZS5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9wZXJ0eVNlcnZpY2UuY3JlYXRlUHJvcGVydHkoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcGVydHlUeXBlLlBST1BFUlRZLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VJRDogc3BhY2UuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogY3VycmVudE9yZ0lELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQVBJIFNlcnZpY2UgZG9lcyBub3QgaGF2ZSBQcm9wZXJ0eSByZXF1ZXN0c1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBkaXJlY3RseSBhIG1pc3Npb24gZm9yIHRoaXMgc3BhY2VcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGRNaXNzaW9uRm9yTmV3U3BhY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5jcmVhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VJRDogc3BhY2UuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySUQ6IGV4YW1wbGVNaXNzaW9uLnVzZXJJRCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IGV4YW1wbGVNaXNzaW9uLnJvbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogZXhhbXBsZU1pc3Npb24ubGV2ZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogZXhhbXBsZU1pc3Npb24ub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZU1pc3Npb24ub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5hbWUoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldChcIm5hbWVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQ29tbWFUb0RvdCgpIHtcclxuICAgICAgICBjb25zdCB1cGRhdGVkU3BhY2UgPSB0aGlzLmZvcm0udmFsdWU7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB1cGRhdGVkU3BhY2UubGF0aXR1ZGUgJiZcclxuICAgICAgICAgICAgdXBkYXRlZFNwYWNlLmxhdGl0dWRlLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCIsXCIpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZWRTcGFjZS5sYXRpdHVkZSA9IHVwZGF0ZWRTcGFjZS5sYXRpdHVkZVxyXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiLFwiLCBcIi5cIik7XHJcbiAgICAgICAgICAgIE51bWJlci5wYXJzZUZsb2F0KHVwZGF0ZWRTcGFjZS5sYXRpdHVkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdXBkYXRlZFNwYWNlLmxvbmdpdHVkZSAmJlxyXG4gICAgICAgICAgICB1cGRhdGVkU3BhY2UubG9uZ2l0dWRlLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCIsXCIpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZWRTcGFjZS5sb25naXR1ZGUgPSB1cGRhdGVkU3BhY2UubG9uZ2l0dWRlXHJcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIsXCIsIFwiLlwiKTtcclxuICAgICAgICAgICAgTnVtYmVyLnBhcnNlRmxvYXQodXBkYXRlZFNwYWNlLmxvbmdpdHVkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUlucHV0SW1hZ2VUZXh0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxvY2F0aW9uICYmIHRoaXMubG9jYXRpb24uYW5uZXhlcykge1xyXG4gICAgICAgICAgICB0aGlzLmltYWdlSW5wdXRUZXh0ID0gXCJDaGFuZ2UgcGljdHVyZVwiO1xyXG4gICAgICAgICAgICBnZXRTaWduZWRJbWFnZVVybEZvclNwYWNlKHRoaXMubG9jYXRpb24pLnRoZW4oKHVybCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEltYWdlID0gdXJsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmltYWdlSW5wdXRUZXh0ID0gXCJBZGQgcGljdHVyZVwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIGlzRm9ybUVycm9yKGNvbnRyb2wpIHtcclxuICAgICAgICByZXR1cm4gY29udHJvbCAmJiBjb250cm9sLmludmFsaWQgJiYgdGhpcy5lcnJvckZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICBvbkZvcm1DaGFuZ2UoKXtcclxuICAgICAgICBpZiAodGhpcy5lcnJvckZvcm0gJiYgdGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29sLW1kLTYgZm9ybS1uZXctbG9jXCIgKm5nSWY9XCJmb3JtXCI+XHJcbiAgPGZvcm0gKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydOYW1lJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLW5hbWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkZvcm1DaGFuZ2UoKVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbmFtZSddKXx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWyduYW1lJ10pfVwiXHJcbiAgICAgICAgICByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLW5hbWUtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ25hbWUnXSkgXHJcbiAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbmFtZSddKVwiPlxyXG4gICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ25hbWUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgPC9uZ2ItYWxlcnQ+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc2VzXCIgZGF0YS10ZXN0aWQ9XCJuZXctbG9jYXRpb24tYWRkcmVzc1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgpXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydhZGRyZXNzZXMnXSkgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2FkZHJlc3NlcyddKX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJcIiBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ2FkZHJlc3NlcyddKVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2FkZHJlc3NlcyddKVwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLWFkZHJlc3MtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2FkZHJlc3NlcyddKSBcIj5cclxuXHJcbiAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snYWRkcmVzc2VzJ10pIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydDb25zdHJ1Y3Rpb24geWVhcicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29uc3RydWN0aW9uWWVhclwiXHJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1jb25zdHJ1Y3Rpb25ZZWFyXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKClcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2NvbnN0cnVjdGlvblllYXInXSkgfHwgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snY29uc3RydWN0aW9uWWVhciddKX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1jb25zdHJ1Y3Rpb25ZZWFyLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydjb25zdHJ1Y3Rpb25ZZWFyJ10pIHx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydjb25zdHJ1Y3Rpb25ZZWFyJ10pXCI+XHJcbiAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snY29uc3RydWN0aW9uWWVhciddKSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydMYXRpdHVkZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibGF0aXR1ZGVcIiBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1sYXRpdHVkZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgpXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydsYXRpdHVkZSddKXx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydsYXRpdHVkZSddKX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1sYXRpdHVkZS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbGF0aXR1ZGUnXSkgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2xhdGl0dWRlJ10pXCI+XHJcbiAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snbGF0aXR1ZGUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgPC9uZ2ItYWxlcnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snTG9uZ2l0dWRlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsb25naXR1ZGVcIiBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1sb25naXR1ZGVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkZvcm1DaGFuZ2UoKVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbG9uZ2l0dWRlJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2xvbmdpdHVkZSddKX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1sb25naXR1ZGUtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2xvbmdpdHVkZSddKSB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbG9uZ2l0dWRlJ10pXCI+XHJcbiAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snbG9uZ2l0dWRlJ10pIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0FjY2VzcyBsZXZlbCcgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJkLWlubGluZS1ibG9jayBjdXN0b20tc2VsZWN0IHJvdW5kZWQtcGlsbFwiIGZvcm1Db250cm9sTmFtZT1cImxldmVsXCI+XHJcbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsZXZlbCBvZiBsZXZlbHNcIiBbdmFsdWVdPVwibGV2ZWxcIj57e2xldmVsIHwgdHJhbnNsYXRlfX08L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydFbmVyZ3kgQ2xhc3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImNsYXNzRW5lcmd5Q29uc3VtcHRpb25cIlxyXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJuZXctbG9jYXRpb24tY2xhc3NFbmVyZ3lDb25zdW1wdGlvblwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgpXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydjbGFzc0VuZXJneUNvbnN1bXB0aW9uJ10pIHx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydjbGFzc0VuZXJneUNvbnN1bXB0aW9uJ10pfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLWNsYXNzRW5lcmd5Q29uc3VtcHRpb24taW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2NsYXNzRW5lcmd5Q29uc3VtcHRpb24nXSkgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2NsYXNzRW5lcmd5Q29uc3VtcHRpb24nXSlcIj5cclxuICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydjbGFzc0VuZXJneUNvbnN1bXB0aW9uJ10pIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0dyZWVuaG91c2UgZ2FzIGVtaXNzaW9uIENsYXNzJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjbGFzc0dlc1wiIGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLWNsYXNzR2VzXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKClcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2NsYXNzR2VzJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2NsYXNzR2VzJ10pfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLWNsYXNzR2VzLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydjbGFzc0dlcyddKSB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snY2xhc3NHZXMnXSlcIj5cclxuICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydjbGFzc0dlcyddKSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydDb3ZlciBwaWN0dXJlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgPGltZyAjaW1hZ2VCYXNlUHJldmlldyAqbmdJZj1cImN1cnJlbnRJbWFnZVwiIGNsYXNzPVwiaW1hZ2UtcHJldmlld1wiIFtzcmNdPVwiY3VycmVudEltYWdlXCI+XHJcbiAgICAgICAgPGxhYmVsICNpbWFnZUlucHV0Q29udGFpbmVyIGZvcj1cImltYWdlXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1sYWJlbC1maWxlIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGltYWdlSW5wdXRDb250YWluZXJcIj5cclxuICAgICAgICAgIDxpbnB1dCAjaW1hZ2VJbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiaW1hZ2VcIiAoY2hhbmdlKT1cImhhbmRsZUltYWdlSW5wdXQoJGV2ZW50LnRhcmdldClcIiAvPlxyXG4gICAgICAgICAge3sgaW1hZ2VJbnB1dFRleHQgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImN1cnJlbnRJbWFnZSAmJiAhaW1hZ2VUb1VwbG9hZFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsXCJcclxuICAgICAgICAgIChjbGljayk9XCJpbWFnZVRvQmVEZWxldGVkPXRydWU7Y2xlYXJJbWFnZUZpbGUoKVwiPnt7J0RlbGV0ZSBwaWN0dXJlJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1uYW1lXCIgKm5nSWY9XCJpbWFnZVRvVXBsb2FkXCI+XHJcbiAgICAgICAgICA8cD57eyBpbWFnZVRvVXBsb2FkLm5hbWV9fTwvcD5cclxuICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImNsZWFySW1hZ2VGaWxlKClcIiBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6dHJhc2gtY2FuLW91dGxpbmVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIiAqbmdJZj1cIiFsb2NhdGlvblwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0NyZWF0ZSBtaXNzaW9uIGZvciB0aGlzIHNwYWNlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0zXCI+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiYWRkTWlzc2lvbkZvck5ld1NwYWNlXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJuZXctbG9jYXRpb24tc3VibWl0LWJ0blwiIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiBlcnJvckZvcm0gfVwiIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0zXCI+e3snU2F2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG5cclxuICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJuZXctbG9jYXRpb24tY2xvc2UtYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCJcclxuICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIj57eydDYW5jZWwnIHxcclxuICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwiZXJyb3JGb3JtXCI+XHJcbiAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJuZXctbG9jYXRpb24tZm9ybS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiPlxyXG4gICAgICAgIHt7J2Vycm9yRm9ybS5pbmZvQnRuJyB8dHJhbnNsYXRlfX1cclxuXHJcbiAgICAgIDwvbmdiLWFsZXJ0PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9mb3JtPlxyXG48L2Rpdj4iXX0=
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { LevelStatus, enumToArray, uploadFileToS3, PropertyType, getSignedImageUrlForSpace, deleteFromS3 } from '@smarterplan/ngx-smarterplan-core';
|
|
4
|
+
import { textValidator, noEmptyValidator, floatValidator } from "@smarterplan/ngx-smarterplan-core";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@smarterplan/ngx-smarterplan-core";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
+
import * as i4 from "@angular/common";
|
|
10
|
+
import * as i5 from "@ngx-translate/core";
|
|
11
|
+
export class FormLocationComponent {
|
|
12
|
+
constructor(spaceService, propertyService, userService, fb, missionService, layerService, validatorsService) {
|
|
13
|
+
this.spaceService = spaceService;
|
|
14
|
+
this.propertyService = propertyService;
|
|
15
|
+
this.userService = userService;
|
|
16
|
+
this.fb = fb;
|
|
17
|
+
this.missionService = missionService;
|
|
18
|
+
this.layerService = layerService;
|
|
19
|
+
this.validatorsService = validatorsService;
|
|
20
|
+
this.isSubmitted = false;
|
|
21
|
+
this.addMissionForNewSpace = true;
|
|
22
|
+
this.imageToBeDeleted = false;
|
|
23
|
+
this.errorForm = false;
|
|
24
|
+
this.onChange = new EventEmitter();
|
|
25
|
+
this.levels = enumToArray(LevelStatus);
|
|
26
|
+
}
|
|
27
|
+
ngOnInit() {
|
|
28
|
+
if (this.location) {
|
|
29
|
+
this.initEditForm();
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.initForm();
|
|
33
|
+
}
|
|
34
|
+
this.handleInputImageText();
|
|
35
|
+
}
|
|
36
|
+
initForm() {
|
|
37
|
+
this.form = this.fb.group({
|
|
38
|
+
name: ["", [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
39
|
+
addresses: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
40
|
+
latitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],
|
|
41
|
+
longitude: [null, [Validators.maxLength(255), noEmptyValidator(), floatValidator()]],
|
|
42
|
+
level: LevelStatus.LOW,
|
|
43
|
+
classGes: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
44
|
+
classEnergyConsumption: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
45
|
+
constructionYear: ["", [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
initEditForm() {
|
|
49
|
+
this.form = this.fb.group({
|
|
50
|
+
id: this.location.id,
|
|
51
|
+
name: [this.location.name, [Validators.required, Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
52
|
+
addresses: [this.location.addresses, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
53
|
+
latitude: [this.location.latitude, [Validators.maxLength(255), floatValidator()]],
|
|
54
|
+
longitude: [this.location.longitude, [Validators.maxLength(255), floatValidator()]],
|
|
55
|
+
level: this.location.level,
|
|
56
|
+
classGes: [this.location.classGes, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
57
|
+
classEnergyConsumption: [this.location.classEnergyConsumption, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
58
|
+
constructionYear: [this.location.constructionYear, [Validators.maxLength(255), textValidator(), noEmptyValidator()]],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
handleImageInput(target) {
|
|
62
|
+
this.imageToUpload = target.files[0];
|
|
63
|
+
if (this.imageToUpload) {
|
|
64
|
+
this.imageInputContainer.nativeElement.style.display = "none";
|
|
65
|
+
const reader = new FileReader();
|
|
66
|
+
reader.addEventListener("load", () => {
|
|
67
|
+
this.currentImage = reader.result;
|
|
68
|
+
});
|
|
69
|
+
reader.readAsDataURL(this.imageToUpload);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async uploadImage(spaceID) {
|
|
73
|
+
if (this.imageToUpload) {
|
|
74
|
+
uploadFileToS3("locations/", this.imageToUpload, spaceID).then(async (url) => {
|
|
75
|
+
if (url) {
|
|
76
|
+
await this.spaceService.updateSpace({
|
|
77
|
+
id: spaceID,
|
|
78
|
+
annexes: url,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else if (this.imageToBeDeleted) {
|
|
84
|
+
await this.spaceService.updateSpace({
|
|
85
|
+
id: spaceID,
|
|
86
|
+
annexes: null,
|
|
87
|
+
});
|
|
88
|
+
await deleteFromS3(this.location.annexes);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
clearImageFile() {
|
|
92
|
+
this.imageToUpload = null;
|
|
93
|
+
this.currentImage = null;
|
|
94
|
+
this.imageInputContainer.nativeElement.style.display = "flex";
|
|
95
|
+
this.imageInput.nativeElement.value = "";
|
|
96
|
+
this.imageInputText = "Add picture";
|
|
97
|
+
}
|
|
98
|
+
async getLayerByName(name) {
|
|
99
|
+
const currentOrgId = this.userService.currentOrganisation().id;
|
|
100
|
+
const layers = await this.layerService.getLayerByNameForOrganisation(name, currentOrgId);
|
|
101
|
+
if (layers) {
|
|
102
|
+
return layers[0];
|
|
103
|
+
}
|
|
104
|
+
// create then
|
|
105
|
+
return this.layerService.createLayerForOrganisation(name, currentOrgId);
|
|
106
|
+
}
|
|
107
|
+
async onSubmit() {
|
|
108
|
+
this.isSubmitted = true;
|
|
109
|
+
if (!this.form.valid) {
|
|
110
|
+
this.errorForm = true;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
this.errorForm = false;
|
|
115
|
+
let space;
|
|
116
|
+
if (this.location) {
|
|
117
|
+
this.changeCommaToDot();
|
|
118
|
+
space = await this.spaceService.updateSpace(this.form.value);
|
|
119
|
+
if (space) {
|
|
120
|
+
await this.uploadImage(space.id);
|
|
121
|
+
this.location = space;
|
|
122
|
+
this.onChange.emit(space);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
this.changeCommaToDot();
|
|
127
|
+
const spaceInput = this.form.value;
|
|
128
|
+
const currentOrgID = this.userService.currentOrganisation().id;
|
|
129
|
+
spaceInput.organisationID = currentOrgID;
|
|
130
|
+
let layer = await this.getLayerByName("BUILDING");
|
|
131
|
+
if (!layer) {
|
|
132
|
+
layer = await this.layerService.createLayerForOrganisation("BUILDING", currentOrgID);
|
|
133
|
+
}
|
|
134
|
+
space = await this.spaceService.createSpace(spaceInput, layer);
|
|
135
|
+
const missions = this.userService.getManagerMissions();
|
|
136
|
+
if (space && missions.length > 0) {
|
|
137
|
+
const exampleMission = missions[0];
|
|
138
|
+
await this.uploadImage(space.id);
|
|
139
|
+
try {
|
|
140
|
+
await this.propertyService.createProperty({
|
|
141
|
+
type: PropertyType.PROPERTY,
|
|
142
|
+
spaceID: space.id,
|
|
143
|
+
organisationID: currentOrgID,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
console.log("API Service does not have Property requests");
|
|
148
|
+
}
|
|
149
|
+
// add directly a mission for this space
|
|
150
|
+
if (this.addMissionForNewSpace) {
|
|
151
|
+
await this.missionService.create({
|
|
152
|
+
spaceID: space.id,
|
|
153
|
+
userID: exampleMission.userID,
|
|
154
|
+
role: exampleMission.role,
|
|
155
|
+
level: exampleMission.level,
|
|
156
|
+
organisationID: exampleMission.organisationID,
|
|
157
|
+
orderedOrganisationID: exampleMission.organisationID,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
this.onChange.emit(space);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
this.onChange.emit(null);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
console.error(error);
|
|
169
|
+
this.onChange.emit(null);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
onCancel() {
|
|
173
|
+
this.form.reset();
|
|
174
|
+
this.onChange.emit(null);
|
|
175
|
+
}
|
|
176
|
+
get name() {
|
|
177
|
+
return this.form.get("name");
|
|
178
|
+
}
|
|
179
|
+
changeCommaToDot() {
|
|
180
|
+
const updatedSpace = this.form.value;
|
|
181
|
+
if (updatedSpace.latitude &&
|
|
182
|
+
updatedSpace.latitude.toString().includes(",")) {
|
|
183
|
+
updatedSpace.latitude = updatedSpace.latitude
|
|
184
|
+
.toString()
|
|
185
|
+
.replace(",", ".");
|
|
186
|
+
Number.parseFloat(updatedSpace.latitude);
|
|
187
|
+
}
|
|
188
|
+
if (updatedSpace.longitude &&
|
|
189
|
+
updatedSpace.longitude.toString().includes(",")) {
|
|
190
|
+
updatedSpace.longitude = updatedSpace.longitude
|
|
191
|
+
.toString()
|
|
192
|
+
.replace(",", ".");
|
|
193
|
+
Number.parseFloat(updatedSpace.longitude);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
handleInputImageText() {
|
|
197
|
+
if (this.location && this.location.annexes) {
|
|
198
|
+
this.imageInputText = "Change picture";
|
|
199
|
+
getSignedImageUrlForSpace(this.location).then((url) => {
|
|
200
|
+
if (url) {
|
|
201
|
+
this.currentImage = url;
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
this.imageInputText = "Add picture";
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
isFormError(control) {
|
|
210
|
+
return control && control.invalid && this.errorForm;
|
|
211
|
+
}
|
|
212
|
+
onFormChange() {
|
|
213
|
+
if (this.errorForm && this.form.valid) {
|
|
214
|
+
this.errorForm = false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
FormLocationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormLocationComponent, deps: [{ token: i1.SpaceService }, { token: i1.PropertyService }, { token: i1.BaseUserService }, { token: i2.FormBuilder }, { token: i1.MissionService }, { token: i1.LayerService }, { token: i1.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
219
|
+
FormLocationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: FormLocationComponent, selector: "lib-form-location", inputs: { location: "location" }, outputs: { onChange: "onChange" }, viewQueries: [{ propertyName: "imageInputContainer", first: true, predicate: ["imageInputContainer"], descendants: true }, { propertyName: "imageInput", first: true, predicate: ["imageInput"], descendants: true }, { propertyName: "imageBasePreview", first: true, predicate: ["imageBasePreview"], descendants: true }], ngImport: i0, template: "<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" data-testid=\"new-location-name\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['name'])|| isFormError(form.controls['name'])}\"\n required formControlName=\"name\">\n\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['name']) \n || isFormError(form.controls['name'])\">\n {{validatorsService.getError(form.controls['name']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"addresses\" data-testid=\"new-location-address\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['addresses']) || isFormError(form.controls['addresses'])}\">\n <div class=\"invalid-feedback\">\n <span data-testid=\"\" [translate]=\"validatorsService.getError(form.controls['addresses'])\"\n *ngIf=\" validatorsService.isControlError(form.controls['addresses'])\"></span>\n\n <ngb-alert data-testid=\"new-location-address-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['addresses']) \">\n\n {{validatorsService.getError(form.controls['addresses']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Construction year' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"constructionYear\"\n data-testid=\"new-location-constructionYear\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-constructionYear-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])\">\n {{validatorsService.getError(form.controls['constructionYear']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Latitude' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"latitude\" data-testid=\"new-location-latitude\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['latitude'])|| isFormError(form.controls['latitude'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-latitude-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['latitude']) || isFormError(form.controls['latitude'])\">\n {{validatorsService.getError(form.controls['latitude']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Longitude' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"longitude\" data-testid=\"new-location-longitude\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['longitude'])|| isFormError(form.controls['longitude'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-longitude-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['longitude']) || isFormError(form.controls['longitude'])\">\n {{validatorsService.getError(form.controls['longitude']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Access level' | translate}}</label>\n <div class=\"col-sm-9\">\n <select class=\"d-inline-block custom-select rounded-pill\" formControlName=\"level\">\n <option *ngFor=\"let level of levels\" [value]=\"level\">{{level | translate}}</option>\n </select>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Energy Class' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"classEnergyConsumption\"\n data-testid=\"new-location-classEnergyConsumption\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-classEnergyConsumption-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])\">\n {{validatorsService.getError(form.controls['classEnergyConsumption']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Greenhouse gas emission Class' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"classGes\" data-testid=\"new-location-classGes\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classGes'])|| isFormError(form.controls['classGes'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-classGes-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['classGes']) || isFormError(form.controls['classGes'])\">\n {{validatorsService.getError(form.controls['classGes']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Cover picture' | translate}}</label>\n <div class=\"col-sm-9\">\n <img #imageBasePreview *ngIf=\"currentImage\" class=\"image-preview\" [src]=\"currentImage\">\n <label #imageInputContainer for=\"image\"\n class=\"btn btn-label-file btn-outline-primary rounded-pill imageInputContainer\">\n <input #imageInput type=\"file\" id=\"image\" (change)=\"handleImageInput($event.target)\" />\n {{ imageInputText | translate}}</label>\n <button *ngIf=\"currentImage && !imageToUpload\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"imageToBeDeleted=true;clearImageFile()\">{{'Delete picture' | translate }}</button>\n <div class=\"image-name\" *ngIf=\"imageToUpload\">\n <p>{{ imageToUpload.name}}</p>\n <div (click)=\"clearImageFile()\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"mb-3 row\" *ngIf=\"!location\">\n <label class=\"col-sm-3 col-form-label\">{{'Create mission for this space' | translate}}</label>\n <div class=\"col-sm-3\">\n <input type=\"checkbox\" [(ngModel)]=\"addMissionForNewSpace\" [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n\n <button data-testid=\"new-location-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\" type=\"submit\"\n class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\n\n <button data-testid=\"new-location-close-btn\" type=\"button\" (click)=\"onCancel()\"\n class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\n translate}}</button>\n\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n\n </ngb-alert>\n </div>\n </form>\n</div>", styles: ["input[type=file]{display:none}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}.image-preview{object-fit:cover;max-height:400px;max-width:400px;display:flex;margin-bottom:15px}.imageInputContainer{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content}.image-name{display:flex}.col-form-label{margin-bottom:1rem;width:230px}.form-new-loc{background-color:#d3d3d3;margin-bottom:15px;padding:10px;width:80%;border-radius:10px}.col-sm-9 select{width:100%;height:31.25px;padding-left:10px}.btn-outline-primary{width:200px;margin-bottom:1rem;margin-right:1rem}.is-invalid,.btn-outline-primary.is-invalid{border-color:red!important}\n"], components: [{ type: i3.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.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: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
|
|
220
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormLocationComponent, decorators: [{
|
|
221
|
+
type: Component,
|
|
222
|
+
args: [{ selector: 'lib-form-location', template: "<div class=\"col-md-6 form-new-loc\" *ngIf=\"form\">\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" data-testid=\"new-location-name\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['name'])|| isFormError(form.controls['name'])}\"\n required formControlName=\"name\">\n\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-name-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['name']) \n || isFormError(form.controls['name'])\">\n {{validatorsService.getError(form.controls['name']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"addresses\" data-testid=\"new-location-address\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['addresses']) || isFormError(form.controls['addresses'])}\">\n <div class=\"invalid-feedback\">\n <span data-testid=\"\" [translate]=\"validatorsService.getError(form.controls['addresses'])\"\n *ngIf=\" validatorsService.isControlError(form.controls['addresses'])\"></span>\n\n <ngb-alert data-testid=\"new-location-address-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['addresses']) \">\n\n {{validatorsService.getError(form.controls['addresses']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Construction year' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"constructionYear\"\n data-testid=\"new-location-constructionYear\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-constructionYear-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['constructionYear']) || isFormError(form.controls['constructionYear'])\">\n {{validatorsService.getError(form.controls['constructionYear']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Latitude' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"latitude\" data-testid=\"new-location-latitude\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['latitude'])|| isFormError(form.controls['latitude'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-latitude-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['latitude']) || isFormError(form.controls['latitude'])\">\n {{validatorsService.getError(form.controls['latitude']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Longitude' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"longitude\" data-testid=\"new-location-longitude\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['longitude'])|| isFormError(form.controls['longitude'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-longitude-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['longitude']) || isFormError(form.controls['longitude'])\">\n {{validatorsService.getError(form.controls['longitude']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Access level' | translate}}</label>\n <div class=\"col-sm-9\">\n <select class=\"d-inline-block custom-select rounded-pill\" formControlName=\"level\">\n <option *ngFor=\"let level of levels\" [value]=\"level\">{{level | translate}}</option>\n </select>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Energy Class' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"classEnergyConsumption\"\n data-testid=\"new-location-classEnergyConsumption\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-classEnergyConsumption-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['classEnergyConsumption']) || isFormError(form.controls['classEnergyConsumption'])\">\n {{validatorsService.getError(form.controls['classEnergyConsumption']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Greenhouse gas emission Class' | translate}}</label>\n <div class=\"col-sm-9\">\n <input type=\"text\" class=\"form-control\" formControlName=\"classGes\" data-testid=\"new-location-classGes\" (ngModelChange)=\"onFormChange()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['classGes'])|| isFormError(form.controls['classGes'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-location-classGes-invalid\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"validatorsService.isControlError(form.controls['classGes']) || isFormError(form.controls['classGes'])\">\n {{validatorsService.getError(form.controls['classGes']) | translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 row\">\n <label class=\"col-sm-3 col-form-label\">{{'Cover picture' | translate}}</label>\n <div class=\"col-sm-9\">\n <img #imageBasePreview *ngIf=\"currentImage\" class=\"image-preview\" [src]=\"currentImage\">\n <label #imageInputContainer for=\"image\"\n class=\"btn btn-label-file btn-outline-primary rounded-pill imageInputContainer\">\n <input #imageInput type=\"file\" id=\"image\" (change)=\"handleImageInput($event.target)\" />\n {{ imageInputText | translate}}</label>\n <button *ngIf=\"currentImage && !imageToUpload\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"imageToBeDeleted=true;clearImageFile()\">{{'Delete picture' | translate }}</button>\n <div class=\"image-name\" *ngIf=\"imageToUpload\">\n <p>{{ imageToUpload.name}}</p>\n <div (click)=\"clearImageFile()\" [style.cursor]=\"'pointer'\">\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"mb-3 row\" *ngIf=\"!location\">\n <label class=\"col-sm-3 col-form-label\">{{'Create mission for this space' | translate}}</label>\n <div class=\"col-sm-3\">\n <input type=\"checkbox\" [(ngModel)]=\"addMissionForNewSpace\" [ngModelOptions]=\"{standalone: true}\">\n </div>\n </div>\n\n <button data-testid=\"new-location-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\" type=\"submit\"\n class=\"btn btn-outline-primary rounded-pill me-3\">{{'Save' | translate}}</button>\n\n <button data-testid=\"new-location-close-btn\" type=\"button\" (click)=\"onCancel()\"\n class=\"btn btn-outline-primary rounded-pill\">{{'Cancel' |\n translate}}</button>\n\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"new-location-form-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n\n </ngb-alert>\n </div>\n </form>\n</div>", styles: ["input[type=file]{display:none}.custom-select{border-color:var(--smarterplan-primary);width:auto}.form-new-loc{background-color:#d3d3d3;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.btn-outline-primary{background-color:#fff}h4{color:var(--smarterplan-primary)}.image-preview{object-fit:cover;max-height:400px;max-width:400px;display:flex;margin-bottom:15px}.imageInputContainer{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content}.image-name{display:flex}.col-form-label{margin-bottom:1rem;width:230px}.form-new-loc{background-color:#d3d3d3;margin-bottom:15px;padding:10px;width:80%;border-radius:10px}.col-sm-9 select{width:100%;height:31.25px;padding-left:10px}.btn-outline-primary{width:200px;margin-bottom:1rem;margin-right:1rem}.is-invalid,.btn-outline-primary.is-invalid{border-color:red!important}\n"] }]
|
|
223
|
+
}], ctorParameters: function () { return [{ type: i1.SpaceService }, { type: i1.PropertyService }, { type: i1.BaseUserService }, { type: i2.FormBuilder }, { type: i1.MissionService }, { type: i1.LayerService }, { type: i1.ValidatorsService }]; }, propDecorators: { imageInputContainer: [{
|
|
224
|
+
type: ViewChild,
|
|
225
|
+
args: ["imageInputContainer"]
|
|
226
|
+
}], imageInput: [{
|
|
227
|
+
type: ViewChild,
|
|
228
|
+
args: ["imageInput"]
|
|
229
|
+
}], imageBasePreview: [{
|
|
230
|
+
type: ViewChild,
|
|
231
|
+
args: ["imageBasePreview"]
|
|
232
|
+
}], location: [{
|
|
233
|
+
type: Input
|
|
234
|
+
}], onChange: [{
|
|
235
|
+
type: Output
|
|
236
|
+
}] } });
|
|
237
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1sb2NhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tbG9jYXRpb25zL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWxvY2F0aW9uL2Zvcm0tbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1sb2NhdGlvbi9mb3JtLWxvY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBMEIsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JGLE9BQU8sRUFBUyxXQUFXLEVBQWtFLFdBQVcsRUFBRSxjQUFjLEVBQVMsWUFBWSxFQUFFLHlCQUF5QixFQUFnQixZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoUCxPQUFPLEVBQXFCLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7OztBQU92SCxNQUFNLE9BQU8scUJBQXFCO0lBa0M5QixZQUNZLFlBQTBCLEVBQzFCLGVBQWdDLEVBQ2hDLFdBQTRCLEVBQzVCLEVBQWUsRUFDZixjQUE4QixFQUM5QixZQUEwQixFQUMzQixpQkFBb0M7UUFObkMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFj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QUFyQixxQkFBcUIsNGJDVmxDLDQyUkErSk07MkZEckpPLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDSSxtQkFBbUI7aVJBUzdCLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBSWhDLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxZQUFZO2dCQUl2QixnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBSTdCLFFBQVE7c0JBRFAsS0FBSztnQkFtQkksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3BhY2UsIExldmVsU3RhdHVzLCBTcGFjZVNlcnZpY2UsIFByb3BlcnR5U2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBNaXNzaW9uU2VydmljZSwgZW51bVRvQXJyYXksIHVwbG9hZEZpbGVUb1MzLCBMYXllciwgUHJvcGVydHlUeXBlLCBnZXRTaWduZWRJbWFnZVVybEZvclNwYWNlLCBMYXllclNlcnZpY2UsIGRlbGV0ZUZyb21TMyB9IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JzU2VydmljZSwgdGV4dFZhbGlkYXRvciwgbm9FbXB0eVZhbGlkYXRvciwgZmxvYXRWYWxpZGF0b3IgfSBmcm9tIFwiQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWZvcm0tbG9jYXRpb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWxvY2F0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9mb3JtLWxvY2F0aW9uLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUxvY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIGZvcm06IEZvcm1Hcm91cDtcblxuICAgIEBWaWV3Q2hpbGQoXCJpbWFnZUlucHV0Q29udGFpbmVyXCIpXG4gICAgaW1hZ2VJbnB1dENvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoXCJpbWFnZUlucHV0XCIpXG4gICAgaW1hZ2VJbnB1dDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoXCJpbWFnZUJhc2VQcmV2aWV3XCIpXG4gICAgaW1hZ2VCYXNlUHJldmlldzogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpXG4gICAgbG9jYXRpb246IFNwYWNlO1xuXG4gICAgaW1hZ2VUb1VwbG9hZDogYW55O1xuXG4gICAgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcblxuICAgIGxldmVsczogQXJyYXk8TGV2ZWxTdGF0dXM+O1xuXG4gICAgYWRkTWlzc2lvbkZvck5ld1NwYWNlID0gdHJ1ZTtcblxuICAgIGltYWdlSW5wdXRUZXh0OiBzdHJpbmc7XG5cbiAgICBjdXJyZW50SW1hZ2U6IHN0cmluZztcblxuICAgIGltYWdlVG9CZURlbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGVycm9yRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTcGFjZSB8IG51bGw+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwcm9wZXJ0eVNlcnZpY2U6IFByb3BlcnR5U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHJpdmF0ZSBtaXNzaW9uU2VydmljZTogTWlzc2lvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyB2YWxpZGF0b3JzU2VydmljZTogVmFsaWRhdG9yc1NlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5sZXZlbHMgPSBlbnVtVG9BcnJheShMZXZlbFN0YXR1cyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRFZGl0Rm9ybSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFuZGxlSW5wdXRJbWFnZVRleHQoKTtcbiAgICB9XG5cbiAgICBpbml0Rm9ybSgpIHtcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBuYW1lOiBbXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXG4gICAgICAgICAgICBhZGRyZXNzZXM6IFtcIlwiLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcbiAgICAgICAgICAgIGxhdGl0dWRlOiBbbnVsbCwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIG5vRW1wdHlWYWxpZGF0b3IoKSwgZmxvYXRWYWxpZGF0b3IoKV1dLFxuICAgICAgICAgICAgbG9uZ2l0dWRlOiBbbnVsbCwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIG5vRW1wdHlWYWxpZGF0b3IoKSwgZmxvYXRWYWxpZGF0b3IoKV1dLFxuICAgICAgICAgICAgbGV2ZWw6IExldmVsU3RhdHVzLkxPVyxcbiAgICAgICAgICAgIGNsYXNzR2VzOiBbXCJcIiwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXG4gICAgICAgICAgICBjbGFzc0VuZXJneUNvbnN1bXB0aW9uOiBbXCJcIiwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXG4gICAgICAgICAgICBjb25zdHJ1Y3Rpb25ZZWFyOiBbXCJcIiwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXRFZGl0Rm9ybSgpIHtcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBpZDogdGhpcy5sb2NhdGlvbi5pZCxcbiAgICAgICAgICAgIG5hbWU6IFt0aGlzLmxvY2F0aW9uLm5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxuICAgICAgICAgICAgYWRkcmVzc2VzOiBbdGhpcy5sb2NhdGlvbi5hZGRyZXNzZXMsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxuICAgICAgICAgICAgbGF0aXR1ZGU6IFt0aGlzLmxvY2F0aW9uLmxhdGl0dWRlLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgZmxvYXRWYWxpZGF0b3IoKV1dLFxuICAgICAgICAgICAgbG9uZ2l0dWRlOiBbdGhpcy5sb2NhdGlvbi5sb25naXR1ZGUsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCBmbG9hdFZhbGlkYXRvcigpXV0sXG4gICAgICAgICAgICBsZXZlbDogdGhpcy5sb2NhdGlvbi5sZXZlbCxcbiAgICAgICAgICAgIGNsYXNzR2VzOiBbdGhpcy5sb2NhdGlvbi5jbGFzc0dlcywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXG4gICAgICAgICAgICBjbGFzc0VuZXJneUNvbnN1bXB0aW9uOiBbdGhpcy5sb2NhdGlvbi5jbGFzc0VuZXJneUNvbnN1bXB0aW9uLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcbiAgICAgICAgICAgIGNvbnN0cnVjdGlvblllYXI6IFt0aGlzLmxvY2F0aW9uLmNvbnN0cnVjdGlvblllYXIsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVJbWFnZUlucHV0KHRhcmdldDogRXZlbnRUYXJnZXQpIHtcbiAgICAgICAgdGhpcy5pbWFnZVRvVXBsb2FkID0gKHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlc1swXTtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VUb1VwbG9hZCkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUlucHV0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2UgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwodGhpcy5pbWFnZVRvVXBsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHVwbG9hZEltYWdlKHNwYWNlSUQ6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5pbWFnZVRvVXBsb2FkKSB7XG4gICAgICAgICAgICB1cGxvYWRGaWxlVG9TMyhcImxvY2F0aW9ucy9cIiwgdGhpcy5pbWFnZVRvVXBsb2FkLCBzcGFjZUlEKS50aGVuKFxuICAgICAgICAgICAgICAgIGFzeW5jICh1cmwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UudXBkYXRlU3BhY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzcGFjZUlELFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubmV4ZXM6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZVRvQmVEZWxldGVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS51cGRhdGVTcGFjZSh7XG4gICAgICAgICAgICAgICAgaWQ6IHNwYWNlSUQsXG4gICAgICAgICAgICAgICAgYW5uZXhlczogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZGVsZXRlRnJvbVMzKHRoaXMubG9jYXRpb24uYW5uZXhlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckltYWdlRmlsZSgpIHtcbiAgICAgICAgdGhpcy5pbWFnZVRvVXBsb2FkID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLmltYWdlSW5wdXRDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XG4gICAgICAgIHRoaXMuaW1hZ2VJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5pbWFnZUlucHV0VGV4dCA9IFwiQWRkIHBpY3R1cmVcIjtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRMYXllckJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPExheWVyPiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRPcmdJZCA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE9yZ2FuaXNhdGlvbigpLmlkO1xuICAgICAgICBjb25zdCBsYXllcnMgPSBhd2FpdCB0aGlzLmxheWVyU2VydmljZS5nZXRMYXllckJ5TmFtZUZvck9yZ2FuaXNhdGlvbihcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjdXJyZW50T3JnSWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYXllcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXllcnNbMF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gY3JlYXRlIHRoZW5cbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJTZXJ2aWNlLmNyZWF0ZUxheWVyRm9yT3JnYW5pc2F0aW9uKG5hbWUsIGN1cnJlbnRPcmdJZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckZvcm0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7IFxuICAgICAgICAgICAgdGhpcy5lcnJvckZvcm0gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBzcGFjZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb21tYVRvRG90KCk7XG4gICAgICAgICAgICAgICAgc3BhY2UgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS51cGRhdGVTcGFjZSh0aGlzLmZvcm0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZEltYWdlKHNwYWNlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHNwYWNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb21tYVRvRG90KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BhY2VJbnB1dCA9IHRoaXMuZm9ybS52YWx1ZSBhcyBTcGFjZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50T3JnSUQgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRPcmdhbmlzYXRpb24oKS5pZDtcbiAgICAgICAgICAgICAgICBzcGFjZUlucHV0Lm9yZ2FuaXNhdGlvbklEID0gY3VycmVudE9yZ0lEO1xuICAgICAgICAgICAgICAgIGxldCBsYXllciA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJCeU5hbWUoXCJCVUlMRElOR1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyID0gYXdhaXQgdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXJGb3JPcmdhbmlzYXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkJVSUxESU5HXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3JnSUQsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuY3JlYXRlU3BhY2UoXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW9ucyA9IHRoaXMudXNlclNlcnZpY2UuZ2V0TWFuYWdlck1pc3Npb25zKCk7XG4gICAgICAgICAgICAgICAgaWYgKHNwYWNlICYmIG1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhhbXBsZU1pc3Npb24gPSBtaXNzaW9uc1swXTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRJbWFnZShzcGFjZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb3BlcnR5U2VydmljZS5jcmVhdGVQcm9wZXJ0eSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcGVydHlUeXBlLlBST1BFUlRZLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlSUQ6IHNwYWNlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiBjdXJyZW50T3JnSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJBUEkgU2VydmljZSBkb2VzIG5vdCBoYXZlIFByb3BlcnR5IHJlcXVlc3RzXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGRpcmVjdGx5IGEgbWlzc2lvbiBmb3IgdGhpcyBzcGFjZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGRNaXNzaW9uRm9yTmV3U3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUlEOiBzcGFjZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySUQ6IGV4YW1wbGVNaXNzaW9uLnVzZXJJRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBleGFtcGxlTWlzc2lvbi5yb2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBleGFtcGxlTWlzc2lvbi5sZXZlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogZXhhbXBsZU1pc3Npb24ub3JnYW5pc2F0aW9uSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZE9yZ2FuaXNhdGlvbklEOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlTWlzc2lvbi5vcmdhbmlzYXRpb25JRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChzcGFjZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XG4gICAgfVxuXG4gICAgZ2V0IG5hbWUoKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJuYW1lXCIpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvbW1hVG9Eb3QoKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRTcGFjZSA9IHRoaXMuZm9ybS52YWx1ZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdXBkYXRlZFNwYWNlLmxhdGl0dWRlICYmXG4gICAgICAgICAgICB1cGRhdGVkU3BhY2UubGF0aXR1ZGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcIixcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB1cGRhdGVkU3BhY2UubGF0aXR1ZGUgPSB1cGRhdGVkU3BhY2UubGF0aXR1ZGVcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiLFwiLCBcIi5cIik7XG4gICAgICAgICAgICBOdW1iZXIucGFyc2VGbG9hdCh1cGRhdGVkU3BhY2UubGF0aXR1ZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHVwZGF0ZWRTcGFjZS5sb25naXR1ZGUgJiZcbiAgICAgICAgICAgIHVwZGF0ZWRTcGFjZS5sb25naXR1ZGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcIixcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB1cGRhdGVkU3BhY2UubG9uZ2l0dWRlID0gdXBkYXRlZFNwYWNlLmxvbmdpdHVkZVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIsXCIsIFwiLlwiKTtcbiAgICAgICAgICAgIE51bWJlci5wYXJzZUZsb2F0KHVwZGF0ZWRTcGFjZS5sb25naXR1ZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlSW5wdXRJbWFnZVRleHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvY2F0aW9uICYmIHRoaXMubG9jYXRpb24uYW5uZXhlcykge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUlucHV0VGV4dCA9IFwiQ2hhbmdlIHBpY3R1cmVcIjtcbiAgICAgICAgICAgIGdldFNpZ25lZEltYWdlVXJsRm9yU3BhY2UodGhpcy5sb2NhdGlvbikudGhlbigodXJsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbWFnZSA9IHVybDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VJbnB1dFRleHQgPSBcIkFkZCBwaWN0dXJlXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcbiAgICBpc0Zvcm1FcnJvcihjb250cm9sKSB7XG4gICAgICAgIHJldHVybiBjb250cm9sICYmIGNvbnRyb2wuaW52YWxpZCAmJiB0aGlzLmVycm9yRm9ybTtcbiAgICB9XG5cbiAgICBcbiAgICBvbkZvcm1DaGFuZ2UoKXtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JGb3JtICYmIHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckZvcm0gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbC1tZC02IGZvcm0tbmV3LWxvY1wiICpuZ0lmPVwiZm9ybVwiPlxuICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1uYW1lXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKClcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWyduYW1lJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ25hbWUnXSl9XCJcbiAgICAgICAgICByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cbiAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLW5hbWUtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ25hbWUnXSkgXG4gICAgICAgICAgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ25hbWUnXSlcIj5cbiAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snbmFtZSddKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9uZ2ItYWxlcnQ+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzZXNcIiBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1hZGRyZXNzXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKClcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydhZGRyZXNzZXMnXSkgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2FkZHJlc3NlcyddKX1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cbiAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cIlwiIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snYWRkcmVzc2VzJ10pXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2FkZHJlc3NlcyddKVwiPjwvc3Bhbj5cblxuICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJuZXctbG9jYXRpb24tYWRkcmVzcy1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiXG4gICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2FkZHJlc3NlcyddKSBcIj5cblxuICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydhZGRyZXNzZXMnXSkgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgIDwvbmdiLWFsZXJ0PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQ29uc3RydWN0aW9uIHllYXInIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29uc3RydWN0aW9uWWVhclwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJuZXctbG9jYXRpb24tY29uc3RydWN0aW9uWWVhclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snY29uc3RydWN0aW9uWWVhciddKSB8fCBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydjb25zdHJ1Y3Rpb25ZZWFyJ10pfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxuICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJuZXctbG9jYXRpb24tY29uc3RydWN0aW9uWWVhci1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiXG4gICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2NvbnN0cnVjdGlvblllYXInXSkgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2NvbnN0cnVjdGlvblllYXInXSlcIj5cbiAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snY29uc3RydWN0aW9uWWVhciddKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9uZ2ItYWxlcnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snTGF0aXR1ZGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibGF0aXR1ZGVcIiBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1sYXRpdHVkZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbGF0aXR1ZGUnXSl8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGF0aXR1ZGUnXSl9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XG4gICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1sYXRpdHVkZS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiXG4gICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2xhdGl0dWRlJ10pIHx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydsYXRpdHVkZSddKVwiPlxuICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydsYXRpdHVkZSddKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9uZ2ItYWxlcnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snTG9uZ2l0dWRlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImxvbmdpdHVkZVwiIGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLWxvbmdpdHVkZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbG9uZ2l0dWRlJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2xvbmdpdHVkZSddKX1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cbiAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLWxvbmdpdHVkZS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiXG4gICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2xvbmdpdHVkZSddKSB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbG9uZ2l0dWRlJ10pXCI+XG4gICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ2xvbmdpdHVkZSddKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9uZ2ItYWxlcnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQWNjZXNzIGxldmVsJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgY3VzdG9tLXNlbGVjdCByb3VuZGVkLXBpbGxcIiBmb3JtQ29udHJvbE5hbWU9XCJsZXZlbFwiPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxldmVsIG9mIGxldmVsc1wiIFt2YWx1ZV09XCJsZXZlbFwiPnt7bGV2ZWwgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0VuZXJneSBDbGFzcycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjbGFzc0VuZXJneUNvbnN1bXB0aW9uXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1jbGFzc0VuZXJneUNvbnN1bXB0aW9uXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlKClcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydjbGFzc0VuZXJneUNvbnN1bXB0aW9uJ10pIHx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydjbGFzc0VuZXJneUNvbnN1bXB0aW9uJ10pfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxuICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJuZXctbG9jYXRpb24tY2xhc3NFbmVyZ3lDb25zdW1wdGlvbi1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiXG4gICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2NsYXNzRW5lcmd5Q29uc3VtcHRpb24nXSkgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2NsYXNzRW5lcmd5Q29uc3VtcHRpb24nXSlcIj5cbiAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snY2xhc3NFbmVyZ3lDb25zdW1wdGlvbiddKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9uZ2ItYWxlcnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snR3JlZW5ob3VzZSBnYXMgZW1pc3Npb24gQ2xhc3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2xhc3NHZXNcIiBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1jbGFzc0dlc1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZSgpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snY2xhc3NHZXMnXSl8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snY2xhc3NHZXMnXSl9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XG4gICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1jbGFzc0dlcy1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiXG4gICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2NsYXNzR2VzJ10pIHx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydjbGFzc0dlcyddKVwiPlxuICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydjbGFzc0dlcyddKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9uZ2ItYWxlcnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQ292ZXIgcGljdHVyZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cbiAgICAgICAgPGltZyAjaW1hZ2VCYXNlUHJldmlldyAqbmdJZj1cImN1cnJlbnRJbWFnZVwiIGNsYXNzPVwiaW1hZ2UtcHJldmlld1wiIFtzcmNdPVwiY3VycmVudEltYWdlXCI+XG4gICAgICAgIDxsYWJlbCAjaW1hZ2VJbnB1dENvbnRhaW5lciBmb3I9XCJpbWFnZVwiXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxhYmVsLWZpbGUgYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgaW1hZ2VJbnB1dENvbnRhaW5lclwiPlxuICAgICAgICAgIDxpbnB1dCAjaW1hZ2VJbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiaW1hZ2VcIiAoY2hhbmdlKT1cImhhbmRsZUltYWdlSW5wdXQoJGV2ZW50LnRhcmdldClcIiAvPlxuICAgICAgICAgIHt7IGltYWdlSW5wdXRUZXh0IHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY3VycmVudEltYWdlICYmICFpbWFnZVRvVXBsb2FkXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIlxuICAgICAgICAgIChjbGljayk9XCJpbWFnZVRvQmVEZWxldGVkPXRydWU7Y2xlYXJJbWFnZUZpbGUoKVwiPnt7J0RlbGV0ZSBwaWN0dXJlJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtbmFtZVwiICpuZ0lmPVwiaW1hZ2VUb1VwbG9hZFwiPlxuICAgICAgICAgIDxwPnt7IGltYWdlVG9VcGxvYWQubmFtZX19PC9wPlxuICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImNsZWFySW1hZ2VGaWxlKClcIiBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOnRyYXNoLWNhbi1vdXRsaW5lXCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCIgKm5nSWY9XCIhbG9jYXRpb25cIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQ3JlYXRlIG1pc3Npb24gZm9yIHRoaXMgc3BhY2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0zXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImFkZE1pc3Npb25Gb3JOZXdTcGFjZVwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1zdWJtaXQtYnRuXCIgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IGVycm9yRm9ybSB9XCIgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0zXCI+e3snU2F2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cIm5ldy1sb2NhdGlvbi1jbG9zZS1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIj57eydDYW5jZWwnIHxcbiAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwiZXJyb3JGb3JtXCI+XG4gICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LWxvY2F0aW9uLWZvcm0taW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIj5cbiAgICAgICAge3snZXJyb3JGb3JtLmluZm9CdG4nIHx0cmFuc2xhdGV9fVxuXG4gICAgICA8L25nYi1hbGVydD5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9kaXY+Il19
|