tas-uell-sdk 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +17 -15
- package/esm2020/lib/components/tas-feedback-modal/tas-feedback-modal.component.mjs +229 -0
- package/esm2020/lib/components/tas-floating-call/tas-floating-call.component.mjs +38 -3
- package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs +46 -8
- package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +163 -43
- package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +150 -34
- package/esm2020/lib/icons/tas-icons.mjs +17 -0
- package/esm2020/lib/interfaces/tas.interfaces.mjs +13 -1
- package/esm2020/lib/services/tas.service.mjs +127 -26
- package/esm2020/lib/tas-uell-sdk.module.mjs +8 -3
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/tas-uell-sdk.mjs +794 -124
- package/fesm2015/tas-uell-sdk.mjs.map +1 -1
- package/fesm2020/tas-uell-sdk.mjs +787 -123
- package/fesm2020/tas-uell-sdk.mjs.map +1 -1
- package/lib/components/tas-btn/tas-btn.component.d.ts +1 -0
- package/lib/components/tas-feedback-modal/tas-feedback-modal.component.d.ts +101 -0
- package/lib/components/tas-floating-call/tas-floating-call.component.d.ts +5 -0
- package/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.d.ts +12 -1
- package/lib/components/tas-videocall/tas-videocall.component.d.ts +49 -6
- package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +40 -12
- package/lib/icons/tas-icons.d.ts +8 -0
- package/lib/interfaces/tas.interfaces.d.ts +36 -3
- package/lib/services/tas.service.d.ts +27 -2
- package/lib/tas-uell-sdk.module.d.ts +5 -4
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/src/lib/styles/tas-global.scss +17 -0
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
import { Component, Input, ViewChild, } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { TasFeedbackModalComponent } from '../tas-feedback-modal/tas-feedback-modal.component';
|
|
3
|
+
import { CallState, ViewMode, TasBusinessRole, UserCallAction, GeoStatus, } from '../../interfaces/tas.interfaces';
|
|
4
|
+
import { TAS_ICONS } from '../../icons/tas-icons';
|
|
3
5
|
import { Subscription } from 'rxjs';
|
|
4
6
|
import interact from 'interactjs';
|
|
5
7
|
import * as i0 from "@angular/core";
|
|
6
8
|
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
7
9
|
import * as i2 from "../../services/tas.service";
|
|
8
10
|
import * as i3 from "../../services/geolocation.service";
|
|
9
|
-
import * as i4 from "
|
|
10
|
-
import * as i5 from "
|
|
11
|
+
import * as i4 from "@angular/platform-browser";
|
|
12
|
+
import * as i5 from "../tas-avatar/tas-avatar.component";
|
|
13
|
+
import * as i6 from "@angular/common";
|
|
14
|
+
/** User geolocation panel view states */
|
|
15
|
+
export var UserGeoViewState;
|
|
16
|
+
(function (UserGeoViewState) {
|
|
17
|
+
UserGeoViewState["HIDDEN"] = "HIDDEN";
|
|
18
|
+
UserGeoViewState["INITIAL"] = "INITIAL";
|
|
19
|
+
UserGeoViewState["VERIFYING"] = "VERIFYING";
|
|
20
|
+
UserGeoViewState["VERIFIED"] = "VERIFIED";
|
|
21
|
+
UserGeoViewState["DENIED"] = "DENIED";
|
|
22
|
+
})(UserGeoViewState || (UserGeoViewState = {}));
|
|
11
23
|
export class TasVideocallComponent {
|
|
12
|
-
constructor(activeModal, tasService, geolocationService) {
|
|
24
|
+
constructor(activeModal, tasService, geolocationService, sanitizer, modalService) {
|
|
13
25
|
this.activeModal = activeModal;
|
|
14
26
|
this.tasService = tasService;
|
|
15
27
|
this.geolocationService = geolocationService;
|
|
28
|
+
this.sanitizer = sanitizer;
|
|
29
|
+
this.modalService = modalService;
|
|
16
30
|
this.participantName = '';
|
|
17
31
|
this.tenant = '';
|
|
18
32
|
this.businessRole = TasBusinessRole.USER;
|
|
@@ -30,11 +44,23 @@ export class TasVideocallComponent {
|
|
|
30
44
|
// Geo panel states for owner
|
|
31
45
|
this.geoRequestActive = false; // Owner sent request, waiting for user
|
|
32
46
|
this.allGeoGranted = false; // All users responded with geo
|
|
47
|
+
this.userGeoInfo = []; // Individual user geo status
|
|
48
|
+
// User geo panel state (for owners)
|
|
49
|
+
this.userGeoViewState = UserGeoViewState.HIDDEN;
|
|
50
|
+
this.UserGeoViewState = UserGeoViewState; // Expose enum to template
|
|
51
|
+
this.devModeEnabled = false; // Enable dev controls for testing
|
|
52
|
+
this.geoPanelDismissed = false; // Track if owner manually closed the panel
|
|
53
|
+
this.feedbackShown = false; // Track if feedback modal has been shown
|
|
33
54
|
this.subscriptions = new Subscription();
|
|
55
|
+
this.homeIcon = this.sanitizer.bypassSecurityTrustHtml(TAS_ICONS.home);
|
|
34
56
|
}
|
|
35
57
|
ngOnInit() {
|
|
36
58
|
this.setupSubscriptions();
|
|
37
59
|
this.initializeCall();
|
|
60
|
+
// For owners: show the geo panel to request user location (unless dismissed)
|
|
61
|
+
if (this.canAdmitUsers && !this.geoPanelDismissed) {
|
|
62
|
+
this.userGeoViewState = UserGeoViewState.INITIAL;
|
|
63
|
+
}
|
|
38
64
|
}
|
|
39
65
|
ngAfterViewInit() {
|
|
40
66
|
this.initInteract();
|
|
@@ -52,6 +78,37 @@ export class TasVideocallComponent {
|
|
|
52
78
|
hangUp() {
|
|
53
79
|
this.tasService.disconnectSession();
|
|
54
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Open feedback modal when call ends
|
|
83
|
+
*/
|
|
84
|
+
openFeedbackModal() {
|
|
85
|
+
// Prevent opening feedback modal multiple times
|
|
86
|
+
if (this.feedbackShown) {
|
|
87
|
+
this.activeModal.close('hangup');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Get videoCallId from input or service
|
|
91
|
+
const videoCallId = this.videoCallId ?? this.tasService.videoCallId;
|
|
92
|
+
// If no videoCallId, skip feedback and close directly
|
|
93
|
+
if (!videoCallId) {
|
|
94
|
+
this.activeModal.close('hangup');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.feedbackShown = true;
|
|
98
|
+
const modalRef = this.modalService.open(TasFeedbackModalComponent, {
|
|
99
|
+
centered: true,
|
|
100
|
+
backdrop: true,
|
|
101
|
+
keyboard: true,
|
|
102
|
+
windowClass: 'tas-feedback-modal-wrapper',
|
|
103
|
+
});
|
|
104
|
+
modalRef.componentInstance.videoCallId = videoCallId;
|
|
105
|
+
modalRef.componentInstance.tenant = this.tenant;
|
|
106
|
+
modalRef.componentInstance.businessRole = this.businessRole;
|
|
107
|
+
// Close videocall modal after feedback modal is closed/dismissed
|
|
108
|
+
modalRef.result.finally(() => {
|
|
109
|
+
this.activeModal.close('hangup');
|
|
110
|
+
});
|
|
111
|
+
}
|
|
55
112
|
toggleMute() {
|
|
56
113
|
this.tasService.toggleMute();
|
|
57
114
|
}
|
|
@@ -76,6 +133,43 @@ export class TasVideocallComponent {
|
|
|
76
133
|
this.businessRole === TasBusinessRole.ADMIN_MANAGER ||
|
|
77
134
|
this.businessRole === TasBusinessRole.MANAGER);
|
|
78
135
|
}
|
|
136
|
+
/** Users with pending geo status */
|
|
137
|
+
get pendingUsers() {
|
|
138
|
+
return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.PENDING);
|
|
139
|
+
}
|
|
140
|
+
/** Users who granted geo */
|
|
141
|
+
get grantedUsers() {
|
|
142
|
+
return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.GRANTED);
|
|
143
|
+
}
|
|
144
|
+
/** Users who denied geo */
|
|
145
|
+
get deniedUsers() {
|
|
146
|
+
return this.userGeoInfo.filter(u => u.geoStatus === GeoStatus.DENIED);
|
|
147
|
+
}
|
|
148
|
+
/** Show location panel only if owner and there are users who haven't granted */
|
|
149
|
+
get shouldShowLocationPanel() {
|
|
150
|
+
if (!this.canAdmitUsers || this.userGeoInfo.length === 0) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
// Hide if all users have granted
|
|
154
|
+
const allGranted = this.userGeoInfo.every(u => u.geoStatus === GeoStatus.GRANTED);
|
|
155
|
+
return !allGranted;
|
|
156
|
+
}
|
|
157
|
+
/** Check if any user has denied geo */
|
|
158
|
+
get hasAnyDenied() {
|
|
159
|
+
return this.deniedUsers.length > 0;
|
|
160
|
+
}
|
|
161
|
+
/** Show user geo panel for owners when not hidden */
|
|
162
|
+
get shouldShowUserGeoPanel() {
|
|
163
|
+
return this.canAdmitUsers && this.userGeoViewState !== UserGeoViewState.HIDDEN;
|
|
164
|
+
}
|
|
165
|
+
/** Set user geo view state (for dev controls or close button) */
|
|
166
|
+
setUserGeoViewState(state) {
|
|
167
|
+
this.userGeoViewState = state;
|
|
168
|
+
// Track if owner manually dismissed the panel
|
|
169
|
+
if (state === UserGeoViewState.HIDDEN) {
|
|
170
|
+
this.geoPanelDismissed = true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
79
173
|
/**
|
|
80
174
|
* Admit a user from the waiting room
|
|
81
175
|
*/
|
|
@@ -114,7 +208,7 @@ export class TasVideocallComponent {
|
|
|
114
208
|
this.showLocationPanel = false;
|
|
115
209
|
}
|
|
116
210
|
/**
|
|
117
|
-
* Request the user to share their location
|
|
211
|
+
* Request the user to share their location (called by owner)
|
|
118
212
|
*/
|
|
119
213
|
requestUserLocation() {
|
|
120
214
|
if (!this.videoCallId) {
|
|
@@ -125,9 +219,12 @@ export class TasVideocallComponent {
|
|
|
125
219
|
videoCallId: this.videoCallId,
|
|
126
220
|
action: UserCallAction.REQUEST_GEOLOCALIZATION,
|
|
127
221
|
};
|
|
128
|
-
// TODO: Send location request action to backend when endpoint is ready
|
|
129
222
|
this.tasService.modifyProxyVideoUser(body).subscribe({
|
|
130
|
-
next: () =>
|
|
223
|
+
next: () => {
|
|
224
|
+
console.log('Location request sent');
|
|
225
|
+
// Set panel to verifying state while waiting for user response
|
|
226
|
+
this.userGeoViewState = UserGeoViewState.VERIFYING;
|
|
227
|
+
},
|
|
131
228
|
error: (err) => console.error('Error requesting location:', err),
|
|
132
229
|
});
|
|
133
230
|
}
|
|
@@ -137,7 +234,7 @@ export class TasVideocallComponent {
|
|
|
137
234
|
this.subscriptions.add(this.tasService.callState$.subscribe((state) => {
|
|
138
235
|
this.callState = state;
|
|
139
236
|
if (state === CallState.DISCONNECTED) {
|
|
140
|
-
this.
|
|
237
|
+
this.openFeedbackModal();
|
|
141
238
|
}
|
|
142
239
|
// Track if we have an active video stream
|
|
143
240
|
this.hasVideoStream = state === CallState.CONNECTED;
|
|
@@ -164,69 +261,82 @@ export class TasVideocallComponent {
|
|
|
164
261
|
// Owner left subscription - disconnect non-owners
|
|
165
262
|
this.subscriptions.add(this.tasService.ownerHasLeft$.subscribe((hasLeft) => {
|
|
166
263
|
if (hasLeft && !this.canAdmitUsers) { // Non-owner user
|
|
167
|
-
|
|
264
|
+
// hangUp() triggers DISCONNECTED state, which opens feedback modal
|
|
265
|
+
// then closes videocall modal after feedback is done
|
|
168
266
|
this.hangUp();
|
|
169
|
-
this.activeModal.close('owner_left');
|
|
170
267
|
}
|
|
171
268
|
}));
|
|
172
269
|
// ActivateGeo subscription - only for non-owners (users)
|
|
173
270
|
this.subscriptions.add(this.tasService.activateGeo$.subscribe((activateGeo) => {
|
|
174
271
|
if (activateGeo && !this.canAdmitUsers) {
|
|
175
|
-
console.log('[TAS DEBUG] activateGeo=true, checking geo status for user...');
|
|
176
272
|
this.handleActivateGeo();
|
|
177
273
|
}
|
|
178
274
|
}));
|
|
179
275
|
// GeoRequestActive subscription - for owners
|
|
180
276
|
this.subscriptions.add(this.tasService.geoRequestActive$.subscribe((active) => {
|
|
181
|
-
console.log('[TAS DEBUG] geoRequestActive changed:', active);
|
|
182
277
|
this.geoRequestActive = active;
|
|
183
278
|
}));
|
|
184
|
-
// AllGeoGranted subscription - for owners
|
|
279
|
+
// AllGeoGranted subscription - for owners to update panel state
|
|
185
280
|
this.subscriptions.add(this.tasService.allGeoGranted$.subscribe((granted) => {
|
|
186
|
-
console.log('[TAS DEBUG] allGeoGranted changed:', granted);
|
|
187
281
|
this.allGeoGranted = granted;
|
|
282
|
+
// For owners: update panel state based on geo status
|
|
283
|
+
if (this.canAdmitUsers && granted) {
|
|
284
|
+
this.userGeoViewState = UserGeoViewState.VERIFIED;
|
|
285
|
+
}
|
|
286
|
+
}));
|
|
287
|
+
// UserGeoInfo subscription - for owner geo panel
|
|
288
|
+
this.subscriptions.add(this.tasService.userGeoInfo$.subscribe((info) => {
|
|
289
|
+
this.userGeoInfo = info;
|
|
290
|
+
// Note: We don't auto-switch to DENIED here - that only happens
|
|
291
|
+
// after owner requests and user denies (via geoRequestActive flow)
|
|
188
292
|
}));
|
|
189
293
|
}
|
|
190
294
|
/**
|
|
191
295
|
* Handle activateGeo request from backend (for non-owner users).
|
|
192
|
-
*
|
|
296
|
+
* Directly prompts browser for geolocation - no panel for users.
|
|
193
297
|
*/
|
|
194
298
|
async handleActivateGeo() {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
299
|
+
// Clear any cached position to force re-prompting
|
|
300
|
+
this.geolocationService.clearCache();
|
|
301
|
+
// Request geolocation from user (browser will prompt)
|
|
302
|
+
const position = await this.geolocationService.getCurrentPosition();
|
|
303
|
+
if (position) {
|
|
200
304
|
this.geoLocationStatus = 'active';
|
|
201
|
-
this.reportGeoStatus(
|
|
202
|
-
return;
|
|
305
|
+
this.reportGeoStatus(position.latitude, position.longitude);
|
|
203
306
|
}
|
|
204
|
-
|
|
205
|
-
|
|
307
|
+
else {
|
|
308
|
+
this.geoLocationStatus = 'denied';
|
|
309
|
+
this.denyGeoLocation();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/** Start geolocation verification (called from template button) */
|
|
313
|
+
async startGeoVerification() {
|
|
314
|
+
this.userGeoViewState = UserGeoViewState.VERIFYING;
|
|
315
|
+
// Clear any cached position to force re-prompting
|
|
316
|
+
this.geolocationService.clearCache();
|
|
317
|
+
// Request geolocation from user (browser will prompt)
|
|
206
318
|
const position = await this.geolocationService.getCurrentPosition();
|
|
207
319
|
if (position) {
|
|
208
|
-
console.log('[TAS DEBUG] Geolocation obtained:', position);
|
|
209
320
|
this.geoLocationStatus = 'active';
|
|
321
|
+
this.userGeoViewState = UserGeoViewState.VERIFIED;
|
|
210
322
|
this.reportGeoStatus(position.latitude, position.longitude);
|
|
211
323
|
}
|
|
212
324
|
else {
|
|
213
|
-
console.log('[TAS DEBUG] Geolocation denied or unavailable');
|
|
214
325
|
this.geoLocationStatus = 'denied';
|
|
215
|
-
|
|
216
|
-
this.
|
|
326
|
+
this.userGeoViewState = UserGeoViewState.DENIED;
|
|
327
|
+
this.denyGeoLocation();
|
|
217
328
|
}
|
|
218
329
|
}
|
|
219
330
|
/**
|
|
220
|
-
* Report geolocation
|
|
331
|
+
* Report granted geolocation to backend.
|
|
332
|
+
* IMPORTANT: Only call with valid coordinates.
|
|
221
333
|
*/
|
|
222
334
|
reportGeoStatus(latitude, longitude) {
|
|
223
335
|
if (!this.videoCallId) {
|
|
224
|
-
console.error('[TAS DEBUG] Cannot report geo status: videoCallId not set');
|
|
225
336
|
return;
|
|
226
337
|
}
|
|
227
|
-
//
|
|
228
|
-
if (
|
|
229
|
-
console.error('[TAS DEBUG] Cannot report geo status: geoLocationStatus not set');
|
|
338
|
+
// Validate coordinates are present
|
|
339
|
+
if (latitude === undefined || latitude === null || longitude === undefined || longitude === null) {
|
|
230
340
|
return;
|
|
231
341
|
}
|
|
232
342
|
const body = {
|
|
@@ -236,11 +346,21 @@ export class TasVideocallComponent {
|
|
|
236
346
|
latitude,
|
|
237
347
|
longitude,
|
|
238
348
|
};
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
349
|
+
this.tasService.modifyProxyVideoUser(body).subscribe({});
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Report denied geolocation to backend.
|
|
353
|
+
*/
|
|
354
|
+
denyGeoLocation() {
|
|
355
|
+
if (!this.videoCallId) {
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
const body = {
|
|
359
|
+
userId: this.userId,
|
|
360
|
+
videoCallId: this.videoCallId,
|
|
361
|
+
action: UserCallAction.DENY_GEOLOCATION,
|
|
362
|
+
};
|
|
363
|
+
this.tasService.modifyProxyVideoUser(body).subscribe({});
|
|
244
364
|
}
|
|
245
365
|
initializeCall() {
|
|
246
366
|
if (this.isReturningFromPip) {
|
|
@@ -329,12 +449,12 @@ export class TasVideocallComponent {
|
|
|
329
449
|
});
|
|
330
450
|
}
|
|
331
451
|
}
|
|
332
|
-
TasVideocallComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasVideocallComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TasService }, { token: i3.GeolocationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
333
|
-
TasVideocallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasVideocallComponent, selector: "tas-videocall", inputs: { sessionId: "sessionId", token: "token", appointmentId: "appointmentId", videoCallId: "videoCallId", userId: "userId", participantName: "participantName", tenant: "tenant", businessRole: "businessRole", isReturningFromPip: "isReturningFromPip" }, viewQueries: [{ propertyName: "publisherContainer", first: true, predicate: ["publisherContainer"], descendants: true }, { propertyName: "subscriberContainer", first: true, predicate: ["subscriberContainer"], descendants: true }], ngImport: i0, template: "<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} est\u00E1 en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificaci\u00F3n\"\n >\n \u00D7\n </button>\n </div>\n </div>\n\n <!-- Location panel (shown for owners when user hasn't allowed location) -->\n <div class=\"location-panel\" *ngIf=\"showLocationPanel && canAdmitUsers\">\n <div class=\"location-header\">\n <i class=\"fa fa-map-marker header-icon\"></i>\n <h3>Ubicaci\u00F3n del colaborador</h3>\n <button class=\"close-btn\" (click)=\"closeLocationPanel()\" aria-label=\"Cerrar\">\u00D7</button>\n </div>\n <div class=\"location-description\">\n <p>El colaborador tiene la ubicaci\u00F3n desactivada, solicita que la active.</p>\n <p>Esta acci\u00F3n nos permitir\u00E1 disponibilizar algunas alertas.</p>\n </div>\n <div class=\"location-content\">\n <!-- Initial state: Show verify button -->\n <ng-container *ngIf=\"!geoRequestActive && !allGeoGranted\">\n <button class=\"verify-location-btn\" (click)=\"requestUserLocation()\">\n Verificar ubicaci\u00F3n\n </button>\n </ng-container>\n\n <!-- Loading state: Spinner while waiting for user response -->\n <ng-container *ngIf=\"geoRequestActive && !allGeoGranted\">\n <div class=\"geo-loading-container\">\n <div class=\"geo-spinner\"></div>\n <p class=\"loading-title\">Verificando ubicaci\u00F3n...</p>\n <p class=\"loading-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n <button class=\"verify-location-btn disabled\" disabled>\n Verificar ubicaci\u00F3n\n </button>\n </ng-container>\n\n <!-- Success state: Location verified -->\n <ng-container *ngIf=\"allGeoGranted\">\n <div class=\"geo-success-container\">\n <div class=\"success-icon\">\n <i class=\"fa fa-check\"></i>\n </div>\n <p class=\"success-title\">La ubicaci\u00F3n fue verificada</p>\n </div>\n </ng-container>\n </div>\n <div class=\"location-footer\">\n <span class=\"footer-icon\"><i class=\"fa fa-clock-o\"></i></span>\n <span class=\"footer-icon location-icon\"><i class=\"fa fa-map-marker\"></i></span>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:flex;width:100vw;height:100vh;box-sizing:border-box;padding:2rem;background:linear-gradient(281deg,rgba(29,164,177,.2) 6.96%,rgba(0,0,0,0) 70.44%),#212532}.tas-videocall-wrapper{display:flex;flex:1;gap:1rem;height:100%}.tas-videocall-container{position:relative;flex:1;height:100%;overflow:hidden;border-radius:8px;border:1px solid var(--Neutral-GreyLight, #dadfe9);background:linear-gradient(180deg,#e5f1f7 0%,#0072ac 100%)}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#0000004d;overflow:hidden}.tas-videocall-container .avatar-container{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;display:flex;align-items:center;justify-content:center}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:12px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#33475bb3;padding:12px 20px;border-radius:30px;backdrop-filter:blur(8px)}.tas-videocall-container .controls-container .control-btn{width:44px;height:44px;border-radius:20px;display:flex;align-items:center;justify-content:center;font-size:18px;border:none;background:transparent;cursor:pointer;transition:all .2s ease}.tas-videocall-container .controls-container .control-btn i{color:#fff}.tas-videocall-container .controls-container .control-btn:hover{transform:scale(1.05);filter:brightness(1.1)}.tas-videocall-container .controls-container .control-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .controls-container .hangup-btn{background:#f44336}.tas-videocall-container .controls-container .hangup-btn i{transform:rotate(135deg)}.tas-videocall-container .controls-container .hangup-btn:hover{background:#d32f2f}.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{background:transparent}.tas-videocall-container .controls-container .swap-btn:hover,.tas-videocall-container .controls-container .pip-btn:hover,.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.15)}.tas-videocall-container .waiting-notification{position:absolute;bottom:100px;left:16px;display:flex;align-items:center;gap:12px;background-color:#33475be6;padding:10px 16px;border-radius:8px;z-index:4;backdrop-filter:blur(4px);max-width:calc(100% - 32px)}.tas-videocall-container .waiting-notification .waiting-text{color:#fff;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tas-videocall-container .waiting-notification .admit-btn{background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:4px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;white-space:nowrap}.tas-videocall-container .waiting-notification .admit-btn:hover{background:#178e99}.tas-videocall-container .waiting-notification .admit-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .waiting-notification .dismiss-btn{background:transparent;color:#fff;border:none;font-size:20px;line-height:1;cursor:pointer;padding:0 4px;opacity:.7;transition:opacity .2s ease}.tas-videocall-container .waiting-notification .dismiss-btn:hover{opacity:1}.tas-videocall-container .waiting-notification .dismiss-btn:focus{outline:2px solid #fff;outline-offset:2px}.location-panel{width:280px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.location-panel .location-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.location-panel .location-header h3{font-size:16px;font-weight:600;margin:0;color:#fff}.location-panel .location-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.location-panel .location-header .close-btn:hover{opacity:1}.location-panel .location-description{font-size:14px;color:#fffc;line-height:1.5;margin-bottom:.5rem}.location-panel .location-description p{margin:0 0 .5rem}.location-panel .location-content{flex:1;display:flex;flex-direction:column;justify-content:flex-end}.location-panel .verify-location-btn{width:100%;padding:12px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;margin-bottom:1rem}.location-panel .verify-location-btn:hover{background:#178e99}.location-panel .verify-location-btn:disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.location-panel .location-footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.5rem;border-top:1px solid rgba(255,255,255,.1)}.location-panel .location-footer .footer-icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff;font-size:14px}.location-panel .location-footer .footer-icon.location-icon{background:var(--Primary-Uell, #1da4b1)}.location-panel .header-icon{color:#fff;font-size:16px}.location-panel .geo-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-loading-container .geo-spinner{width:64px;height:64px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite}.location-panel .geo-loading-container .loading-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 .25rem}.location-panel .geo-loading-container .loading-subtitle{color:#ffffffb3;font-size:14px;margin:0}.location-panel .geo-success-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-success-container .success-icon{width:80px;height:80px;border-radius:50%;background:var(--Primary-Uell, #1da4b1);display:flex;align-items:center;justify-content:center;position:relative}.location-panel .geo-success-container .success-icon i{color:#fff;font-size:32px}.location-panel .geo-success-container .success-icon:before,.location-panel .geo-success-container .success-icon:after{content:\"\\2726\";position:absolute;color:#fff;font-size:10px}.location-panel .geo-success-container .success-icon:before{top:-8px;right:-4px}.location-panel .geo-success-container .success-icon:after{bottom:-4px;left:-8px}.location-panel .geo-success-container .success-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 0}.location-panel .verify-location-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}@keyframes geo-spin{to{transform:rotate(360deg)}}\n"], components: [{ type: i4.TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
452
|
+
TasVideocallComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasVideocallComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TasService }, { token: i3.GeolocationService }, { token: i4.DomSanitizer }, { token: i1.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
453
|
+
TasVideocallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasVideocallComponent, selector: "tas-videocall", inputs: { sessionId: "sessionId", token: "token", appointmentId: "appointmentId", videoCallId: "videoCallId", userId: "userId", participantName: "participantName", tenant: "tenant", businessRole: "businessRole", isReturningFromPip: "isReturningFromPip" }, viewQueries: [{ propertyName: "publisherContainer", first: true, predicate: ["publisherContainer"], descendants: true }, { propertyName: "subscriberContainer", first: true, predicate: ["subscriberContainer"], descendants: true }], ngImport: i0, template: "<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} est\u00E1 en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificaci\u00F3n\"\n >\n \u00D7\n </button>\n </div>\n </div>\n\n <!-- Owner geolocation panel (for owners to request user location) -->\n <div class=\"user-geo-panel\" *ngIf=\"shouldShowUserGeoPanel || devModeEnabled\">\n <div class=\"user-geo-header\">\n <div class=\"header-title-row\">\n <i class=\"fa fa-map-marker header-icon\" *ngIf=\"userGeoViewState !== UserGeoViewState.INITIAL\"></i>\n <h3>Ubicaci\u00F3n del colaborador</h3>\n </div>\n <button class=\"close-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\" aria-label=\"Cerrar\">\u00D7</button>\n </div>\n\n <div class=\"user-geo-description\" *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\">\n <p>El colaborador tiene la ubicaci\u00F3n desactivada, solicita que la active.</p>\n <p>Esta acci\u00F3n nos permitir\u00E1 disponibilizar algunas alertas.</p>\n </div>\n\n <div class=\"user-geo-content\">\n <!-- INITIAL state: just the button -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.INITIAL\">\n <!-- spacer -->\n </ng-container>\n\n <!-- VERIFYING state: spinner + loading message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFYING\">\n <div class=\"user-geo-verifying\">\n <div class=\"geo-spinner-large\"></div>\n <p class=\"verifying-title\">Verificando ubicaci\u00F3n...</p>\n <p class=\"verifying-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n </ng-container>\n\n <!-- VERIFIED state: home icon with sparkles -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFIED\">\n <div class=\"user-geo-verified\">\n <div class=\"verified-icon-container\">\n <span class=\"home-icon\" [innerHTML]=\"homeIcon\"></span>\n </div>\n <p class=\"verified-title\">La ubicaci\u00F3n fue verificada</p>\n </div>\n </ng-container>\n\n <!-- DENIED state: error icon and message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.DENIED\">\n <div class=\"user-geo-denied\">\n <div class=\"denied-icon-container\">\n <i class=\"fa fa-times-circle\"></i>\n </div>\n <p class=\"denied-title\">La ubicaci\u00F3n fue rechazada</p>\n <p class=\"denied-subtitle\">El colaborador no permiti\u00F3 el acceso a su ubicaci\u00F3n.</p>\n </div>\n </ng-container>\n </div>\n\n <!-- Button (hidden in verified and denied states) -->\n <button \n class=\"user-geo-btn\" \n *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\"\n [class.disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n [disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n (click)=\"requestUserLocation()\">\n Verificar ubicaci\u00F3n\n </button>\n\n <!-- Dev controls -->\n <div class=\"dev-controls\" *ngIf=\"devModeEnabled\">\n <span class=\"dev-label\">Dev:</span>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.INITIAL)\">Initial</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFYING)\">Verifying</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFIED)\">Verified</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.DENIED)\">Denied</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\">Hide</button>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";:host{display:flex;width:100vw;height:100vh;box-sizing:border-box;padding:2rem;background:linear-gradient(281deg,rgba(29,164,177,.2) 6.96%,rgba(0,0,0,0) 70.44%),#212532}.tas-videocall-wrapper{display:flex;flex:1;gap:1rem;height:100%}.tas-videocall-container{position:relative;flex:1;height:100%;overflow:hidden;border-radius:8px;border:1px solid var(--Neutral-GreyLight, #dadfe9);background:linear-gradient(180deg,#e5f1f7 0%,#0072ac 100%)}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#0000004d;overflow:hidden}.tas-videocall-container .avatar-container{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;display:flex;align-items:center;justify-content:center}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:12px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#33475bb3;padding:12px 20px;border-radius:30px;backdrop-filter:blur(8px)}.tas-videocall-container .controls-container .control-btn{width:44px;height:44px;border-radius:20px;display:flex;align-items:center;justify-content:center;font-size:18px;border:none;background:transparent;cursor:pointer;transition:all .2s ease}.tas-videocall-container .controls-container .control-btn i{color:#fff}.tas-videocall-container .controls-container .control-btn:hover{transform:scale(1.05);filter:brightness(1.1)}.tas-videocall-container .controls-container .control-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .controls-container .hangup-btn{background:#f44336}.tas-videocall-container .controls-container .hangup-btn i{transform:rotate(135deg)}.tas-videocall-container .controls-container .hangup-btn:hover{background:#d32f2f}.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{background:transparent}.tas-videocall-container .controls-container .swap-btn:hover,.tas-videocall-container .controls-container .pip-btn:hover,.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.15)}.tas-videocall-container .waiting-notification{position:absolute;bottom:100px;left:16px;display:flex;align-items:center;gap:12px;background-color:#33475be6;padding:10px 16px;border-radius:8px;z-index:4;backdrop-filter:blur(4px);max-width:calc(100% - 32px)}.tas-videocall-container .waiting-notification .waiting-text{color:#fff;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tas-videocall-container .waiting-notification .admit-btn{background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:4px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;white-space:nowrap}.tas-videocall-container .waiting-notification .admit-btn:hover{background:#178e99}.tas-videocall-container .waiting-notification .admit-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .waiting-notification .dismiss-btn{background:transparent;color:#fff;border:none;font-size:20px;line-height:1;cursor:pointer;padding:0 4px;opacity:.7;transition:opacity .2s ease}.tas-videocall-container .waiting-notification .dismiss-btn:hover{opacity:1}.tas-videocall-container .waiting-notification .dismiss-btn:focus{outline:2px solid #fff;outline-offset:2px}.location-panel{width:280px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.location-panel .location-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.location-panel .location-header h3{font-size:16px;font-weight:600;margin:0;color:#fff}.location-panel .location-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.location-panel .location-header .close-btn:hover{opacity:1}.location-panel .location-description{font-size:14px;color:#fffc;line-height:1.5;margin-bottom:.5rem}.location-panel .location-description p{margin:0 0 .5rem}.location-panel .location-user-list{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem;max-height:200px;overflow-y:auto}.location-panel .location-user-list .user-geo-item{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:rgba(255,255,255,.05);border-radius:6px}.location-panel .location-user-list .user-geo-item .user-icon{color:#fff9;font-size:14px}.location-panel .location-user-list .user-geo-item .user-name{flex:1;font-size:14px;color:#fff}.location-panel .location-user-list .user-geo-item .geo-status{display:flex;align-items:center;gap:.35rem;font-size:12px;padding:2px 8px;border-radius:12px}.location-panel .location-user-list .user-geo-item .geo-status.pending{color:#ffc107;background:rgba(255,193,7,.15)}.location-panel .location-user-list .user-geo-item .geo-status.granted{color:#4caf50;background:rgba(76,175,80,.15)}.location-panel .location-user-list .user-geo-item .geo-status.denied{color:#f44336;background:rgba(244,67,54,.15)}.location-panel .location-user-list .user-geo-item .geo-status i{font-size:10px}.location-panel .geo-denied-warning{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:rgba(244,67,54,.15);border-radius:6px;margin-bottom:1rem;color:#f44336;font-size:13px}.location-panel .geo-denied-warning i{font-size:14px}.location-panel .location-content{flex:1;display:flex;flex-direction:column;justify-content:flex-end}.location-panel .verify-location-btn{width:100%;padding:12px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;margin-bottom:1rem}.location-panel .verify-location-btn:hover{background:#178e99}.location-panel .verify-location-btn:disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.location-panel .location-footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.5rem;border-top:1px solid rgba(255,255,255,.1)}.location-panel .location-footer .footer-icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff;font-size:14px}.location-panel .location-footer .footer-icon.location-icon{background:var(--Primary-Uell, #1da4b1)}.location-panel .header-icon{color:#fff;font-size:16px}.location-panel .geo-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-loading-container .geo-spinner{width:64px;height:64px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite}.location-panel .geo-loading-container .loading-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 .25rem}.location-panel .geo-loading-container .loading-subtitle{color:#ffffffb3;font-size:14px;margin:0}.location-panel .geo-success-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-success-container .success-icon{width:80px;height:80px;border-radius:50%;background:var(--Primary-Uell, #1da4b1);display:flex;align-items:center;justify-content:center;position:relative}.location-panel .geo-success-container .success-icon i{color:#fff;font-size:32px}.location-panel .geo-success-container .success-icon:before,.location-panel .geo-success-container .success-icon:after{content:\"\\2726\";position:absolute;color:#fff;font-size:10px}.location-panel .geo-success-container .success-icon:before{top:-8px;right:-4px}.location-panel .geo-success-container .success-icon:after{bottom:-4px;left:-8px}.location-panel .geo-success-container .success-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 0}.location-panel .verify-location-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}@keyframes geo-spin{to{transform:rotate(360deg)}}.user-geo-panel{width:360px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.user-geo-panel .user-geo-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:2.5rem;padding-top:2rem}.user-geo-panel .user-geo-header .header-title-row{display:flex;align-items:center;gap:.5rem}.user-geo-panel .user-geo-header .header-title-row .header-icon{font-size:16px;color:#fff}.user-geo-panel .user-geo-header .header-title-row h3{font-size:18px;font-weight:600;margin:0;color:#fff}.user-geo-panel .user-geo-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.user-geo-panel .user-geo-header .close-btn:hover{opacity:1}.user-geo-panel .user-geo-description{font-size:14px;color:#fffc;line-height:1.6;margin-bottom:1rem}.user-geo-panel .user-geo-description p{margin:0 0 .75rem}.user-geo-panel .user-geo-content{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.user-geo-panel .user-geo-verifying{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-verifying .geo-spinner-large{width:80px;height:80px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite;margin-bottom:1.5rem}.user-geo-panel .user-geo-verifying .verifying-title{color:#fff;font-size:16px;font-weight:600;margin:0 0 .25rem}.user-geo-panel .user-geo-verifying .verifying-subtitle{color:#fff9;font-size:14px;margin:0}.user-geo-panel .user-geo-verified{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-verified .verified-icon-container{margin-bottom:1rem}.user-geo-panel .user-geo-verified .verified-icon-container .home-icon{display:block}.user-geo-panel .user-geo-verified .verified-icon-container .home-icon svg{width:120px;height:100px}.user-geo-panel .user-geo-verified .verified-title{color:#fff;font-size:16px;font-weight:600;margin:0}.user-geo-panel .user-geo-denied{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-denied .denied-icon-container{width:100px;height:100px;border-radius:50%;background:rgba(244,67,54,.2);display:flex;align-items:center;justify-content:center;margin-bottom:1.5rem}.user-geo-panel .user-geo-denied .denied-icon-container i{font-size:48px;color:#f44336}.user-geo-panel .user-geo-denied .denied-title{color:#fff;font-size:16px;font-weight:600;margin:0 0 .5rem}.user-geo-panel .user-geo-denied .denied-subtitle{color:#fff9;font-size:14px;margin:0}.user-geo-panel .user-geo-btn{width:100%;padding:14px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:24px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;margin-top:auto;margin-bottom:1rem}.user-geo-panel .user-geo-btn:hover:not(.disabled){background:#178e99}.user-geo-panel .user-geo-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.user-geo-panel .dev-controls{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:rgba(0,0,0,.3);border-radius:6px;margin-bottom:1rem;flex-wrap:wrap}.user-geo-panel .dev-controls .dev-label{font-size:12px;color:#fff9;font-weight:600}.user-geo-panel .dev-controls .dev-btn{padding:4px 8px;font-size:11px;background:rgba(255,255,255,.1);color:#fff;border:1px solid rgba(255,255,255,.2);border-radius:4px;cursor:pointer;transition:all .2s ease}.user-geo-panel .dev-controls .dev-btn:hover{background:rgba(255,255,255,.2)}.user-geo-panel .user-geo-footer{display:flex;justify-content:center;gap:.75rem;padding-top:.5rem}.user-geo-panel .user-geo-footer .footer-icon{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff9;font-size:16px}.user-geo-panel .user-geo-footer .footer-icon.active{background:var(--Primary-Uell, #1da4b1);color:#fff}\n"], components: [{ type: i5.TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
334
454
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasVideocallComponent, decorators: [{
|
|
335
455
|
type: Component,
|
|
336
|
-
args: [{ selector: 'tas-videocall', template: "<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} est\u00E1 en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificaci\u00F3n\"\n >\n \u00D7\n </button>\n </div>\n </div>\n\n <!-- Location panel (shown for owners when user hasn't allowed location) -->\n <div class=\"location-panel\" *ngIf=\"showLocationPanel && canAdmitUsers\">\n <div class=\"location-header\">\n <i class=\"fa fa-map-marker header-icon\"></i>\n <h3>Ubicaci\u00F3n del colaborador</h3>\n <button class=\"close-btn\" (click)=\"closeLocationPanel()\" aria-label=\"Cerrar\">\u00D7</button>\n </div>\n <div class=\"location-description\">\n <p>El colaborador tiene la ubicaci\u00F3n desactivada, solicita que la active.</p>\n <p>Esta acci\u00F3n nos permitir\u00E1 disponibilizar algunas alertas.</p>\n </div>\n <div class=\"location-content\">\n <!-- Initial state: Show verify button -->\n <ng-container *ngIf=\"!geoRequestActive && !allGeoGranted\">\n <button class=\"verify-location-btn\" (click)=\"requestUserLocation()\">\n Verificar ubicaci\u00F3n\n </button>\n </ng-container>\n\n <!-- Loading state: Spinner while waiting for user response -->\n <ng-container *ngIf=\"geoRequestActive && !allGeoGranted\">\n <div class=\"geo-loading-container\">\n <div class=\"geo-spinner\"></div>\n <p class=\"loading-title\">Verificando ubicaci\u00F3n...</p>\n <p class=\"loading-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n <button class=\"verify-location-btn disabled\" disabled>\n Verificar ubicaci\u00F3n\n </button>\n </ng-container>\n\n <!-- Success state: Location verified -->\n <ng-container *ngIf=\"allGeoGranted\">\n <div class=\"geo-success-container\">\n <div class=\"success-icon\">\n <i class=\"fa fa-check\"></i>\n </div>\n <p class=\"success-title\">La ubicaci\u00F3n fue verificada</p>\n </div>\n </ng-container>\n </div>\n <div class=\"location-footer\">\n <span class=\"footer-icon\"><i class=\"fa fa-clock-o\"></i></span>\n <span class=\"footer-icon location-icon\"><i class=\"fa fa-map-marker\"></i></span>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:flex;width:100vw;height:100vh;box-sizing:border-box;padding:2rem;background:linear-gradient(281deg,rgba(29,164,177,.2) 6.96%,rgba(0,0,0,0) 70.44%),#212532}.tas-videocall-wrapper{display:flex;flex:1;gap:1rem;height:100%}.tas-videocall-container{position:relative;flex:1;height:100%;overflow:hidden;border-radius:8px;border:1px solid var(--Neutral-GreyLight, #dadfe9);background:linear-gradient(180deg,#e5f1f7 0%,#0072ac 100%)}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#0000004d;overflow:hidden}.tas-videocall-container .avatar-container{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;display:flex;align-items:center;justify-content:center}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:12px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#33475bb3;padding:12px 20px;border-radius:30px;backdrop-filter:blur(8px)}.tas-videocall-container .controls-container .control-btn{width:44px;height:44px;border-radius:20px;display:flex;align-items:center;justify-content:center;font-size:18px;border:none;background:transparent;cursor:pointer;transition:all .2s ease}.tas-videocall-container .controls-container .control-btn i{color:#fff}.tas-videocall-container .controls-container .control-btn:hover{transform:scale(1.05);filter:brightness(1.1)}.tas-videocall-container .controls-container .control-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .controls-container .hangup-btn{background:#f44336}.tas-videocall-container .controls-container .hangup-btn i{transform:rotate(135deg)}.tas-videocall-container .controls-container .hangup-btn:hover{background:#d32f2f}.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{background:transparent}.tas-videocall-container .controls-container .swap-btn:hover,.tas-videocall-container .controls-container .pip-btn:hover,.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.15)}.tas-videocall-container .waiting-notification{position:absolute;bottom:100px;left:16px;display:flex;align-items:center;gap:12px;background-color:#33475be6;padding:10px 16px;border-radius:8px;z-index:4;backdrop-filter:blur(4px);max-width:calc(100% - 32px)}.tas-videocall-container .waiting-notification .waiting-text{color:#fff;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tas-videocall-container .waiting-notification .admit-btn{background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:4px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;white-space:nowrap}.tas-videocall-container .waiting-notification .admit-btn:hover{background:#178e99}.tas-videocall-container .waiting-notification .admit-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .waiting-notification .dismiss-btn{background:transparent;color:#fff;border:none;font-size:20px;line-height:1;cursor:pointer;padding:0 4px;opacity:.7;transition:opacity .2s ease}.tas-videocall-container .waiting-notification .dismiss-btn:hover{opacity:1}.tas-videocall-container .waiting-notification .dismiss-btn:focus{outline:2px solid #fff;outline-offset:2px}.location-panel{width:280px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.location-panel .location-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.location-panel .location-header h3{font-size:16px;font-weight:600;margin:0;color:#fff}.location-panel .location-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.location-panel .location-header .close-btn:hover{opacity:1}.location-panel .location-description{font-size:14px;color:#fffc;line-height:1.5;margin-bottom:.5rem}.location-panel .location-description p{margin:0 0 .5rem}.location-panel .location-content{flex:1;display:flex;flex-direction:column;justify-content:flex-end}.location-panel .verify-location-btn{width:100%;padding:12px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;margin-bottom:1rem}.location-panel .verify-location-btn:hover{background:#178e99}.location-panel .verify-location-btn:disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.location-panel .location-footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.5rem;border-top:1px solid rgba(255,255,255,.1)}.location-panel .location-footer .footer-icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff;font-size:14px}.location-panel .location-footer .footer-icon.location-icon{background:var(--Primary-Uell, #1da4b1)}.location-panel .header-icon{color:#fff;font-size:16px}.location-panel .geo-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-loading-container .geo-spinner{width:64px;height:64px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite}.location-panel .geo-loading-container .loading-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 .25rem}.location-panel .geo-loading-container .loading-subtitle{color:#ffffffb3;font-size:14px;margin:0}.location-panel .geo-success-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-success-container .success-icon{width:80px;height:80px;border-radius:50%;background:var(--Primary-Uell, #1da4b1);display:flex;align-items:center;justify-content:center;position:relative}.location-panel .geo-success-container .success-icon i{color:#fff;font-size:32px}.location-panel .geo-success-container .success-icon:before,.location-panel .geo-success-container .success-icon:after{content:\"\\2726\";position:absolute;color:#fff;font-size:10px}.location-panel .geo-success-container .success-icon:before{top:-8px;right:-4px}.location-panel .geo-success-container .success-icon:after{bottom:-4px;left:-8px}.location-panel .geo-success-container .success-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 0}.location-panel .verify-location-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}@keyframes geo-spin{to{transform:rotate(360deg)}}\n"] }]
|
|
337
|
-
}], ctorParameters: function () { return [{ type: i1.NgbActiveModal }, { type: i2.TasService }, { type: i3.GeolocationService }]; }, propDecorators: { sessionId: [{
|
|
456
|
+
args: [{ selector: 'tas-videocall', template: "<div class=\"tas-videocall-wrapper\">\n <div class=\"tas-videocall-container\">\n <!-- Subscriber video (large, background) -->\n <div\n id=\"subscriber-container\"\n [class.subscriber-view]=\"isPublisherSmall\"\n [class.publisher-view]=\"!isPublisherSmall\"\n #subscriberContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Publisher video (small, overlay) -->\n <div\n id=\"publisher-container\"\n [class.publisher-view]=\"isPublisherSmall\"\n [class.subscriber-view]=\"!isPublisherSmall\"\n #publisherContainer\n (dblclick)=\"onDoubleClick()\"\n ></div>\n\n <!-- Centered avatar (shown when no video stream) -->\n <div class=\"avatar-container\" *ngIf=\"!hasVideoStream\">\n <tas-avatar [name]=\"participantName\" [size]=\"80\"></tas-avatar>\n </div>\n\n <!-- Controls -->\n <div class=\"controls-container\">\n <button\n class=\"btn control-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n [attr.aria-label]=\"isMuted ? 'Activar micr\u00F3fono' : 'Silenciar micr\u00F3fono'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button\n class=\"btn control-btn swap-btn\"\n (click)=\"toggleSwap()\"\n title=\"Intercambiar vista\"\n aria-label=\"Intercambiar vista\"\n >\n <i class=\"fa fa-refresh\"></i>\n </button>\n <button\n class=\"btn control-btn pip-btn\"\n (click)=\"minimize()\"\n title=\"Minimizar (Picture in Picture)\"\n aria-label=\"Minimizar videollamada\"\n >\n <i class=\"fa fa-compress\"></i>\n </button>\n <button\n class=\"btn control-btn hangup-btn\"\n (click)=\"hangUp()\"\n title=\"Finalizar llamada\"\n aria-label=\"Finalizar llamada\"\n >\n <i class=\"fa fa-phone\"></i>\n </button>\n </div>\n\n <!-- Waiting room notification (shown for OWNER/BACKOFFICE only) -->\n <div\n class=\"waiting-notification\"\n *ngIf=\"waitingRoomUsers.length > 0 && canAdmitUsers\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <span class=\"waiting-text\">\n {{ waitingRoomUsers[0].name }} est\u00E1 en la sala de espera.\n </span>\n <button\n class=\"admit-btn\"\n (click)=\"admitUser(waitingRoomUsers[0].userId)\"\n aria-label=\"Admitir usuario\"\n >\n Admitir\n </button>\n <button\n class=\"dismiss-btn\"\n (click)=\"dismissWaitingNotification(waitingRoomUsers[0].userId)\"\n aria-label=\"Cerrar notificaci\u00F3n\"\n >\n \u00D7\n </button>\n </div>\n </div>\n\n <!-- Owner geolocation panel (for owners to request user location) -->\n <div class=\"user-geo-panel\" *ngIf=\"shouldShowUserGeoPanel || devModeEnabled\">\n <div class=\"user-geo-header\">\n <div class=\"header-title-row\">\n <i class=\"fa fa-map-marker header-icon\" *ngIf=\"userGeoViewState !== UserGeoViewState.INITIAL\"></i>\n <h3>Ubicaci\u00F3n del colaborador</h3>\n </div>\n <button class=\"close-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\" aria-label=\"Cerrar\">\u00D7</button>\n </div>\n\n <div class=\"user-geo-description\" *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\">\n <p>El colaborador tiene la ubicaci\u00F3n desactivada, solicita que la active.</p>\n <p>Esta acci\u00F3n nos permitir\u00E1 disponibilizar algunas alertas.</p>\n </div>\n\n <div class=\"user-geo-content\">\n <!-- INITIAL state: just the button -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.INITIAL\">\n <!-- spacer -->\n </ng-container>\n\n <!-- VERIFYING state: spinner + loading message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFYING\">\n <div class=\"user-geo-verifying\">\n <div class=\"geo-spinner-large\"></div>\n <p class=\"verifying-title\">Verificando ubicaci\u00F3n...</p>\n <p class=\"verifying-subtitle\">Esto puede tardar unos segundos.</p>\n </div>\n </ng-container>\n\n <!-- VERIFIED state: home icon with sparkles -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.VERIFIED\">\n <div class=\"user-geo-verified\">\n <div class=\"verified-icon-container\">\n <span class=\"home-icon\" [innerHTML]=\"homeIcon\"></span>\n </div>\n <p class=\"verified-title\">La ubicaci\u00F3n fue verificada</p>\n </div>\n </ng-container>\n\n <!-- DENIED state: error icon and message -->\n <ng-container *ngIf=\"userGeoViewState === UserGeoViewState.DENIED\">\n <div class=\"user-geo-denied\">\n <div class=\"denied-icon-container\">\n <i class=\"fa fa-times-circle\"></i>\n </div>\n <p class=\"denied-title\">La ubicaci\u00F3n fue rechazada</p>\n <p class=\"denied-subtitle\">El colaborador no permiti\u00F3 el acceso a su ubicaci\u00F3n.</p>\n </div>\n </ng-container>\n </div>\n\n <!-- Button (hidden in verified and denied states) -->\n <button \n class=\"user-geo-btn\" \n *ngIf=\"userGeoViewState !== UserGeoViewState.VERIFIED && userGeoViewState !== UserGeoViewState.DENIED\"\n [class.disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n [disabled]=\"userGeoViewState === UserGeoViewState.VERIFYING\"\n (click)=\"requestUserLocation()\">\n Verificar ubicaci\u00F3n\n </button>\n\n <!-- Dev controls -->\n <div class=\"dev-controls\" *ngIf=\"devModeEnabled\">\n <span class=\"dev-label\">Dev:</span>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.INITIAL)\">Initial</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFYING)\">Verifying</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.VERIFIED)\">Verified</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.DENIED)\">Denied</button>\n <button class=\"dev-btn\" (click)=\"setUserGeoViewState(UserGeoViewState.HIDDEN)\">Hide</button>\n </div>\n </div>\n</div>\n\n", styles: ["@charset \"UTF-8\";:host{display:flex;width:100vw;height:100vh;box-sizing:border-box;padding:2rem;background:linear-gradient(281deg,rgba(29,164,177,.2) 6.96%,rgba(0,0,0,0) 70.44%),#212532}.tas-videocall-wrapper{display:flex;flex:1;gap:1rem;height:100%}.tas-videocall-container{position:relative;flex:1;height:100%;overflow:hidden;border-radius:8px;border:1px solid var(--Neutral-GreyLight, #dadfe9);background:linear-gradient(180deg,#e5f1f7 0%,#0072ac 100%)}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#0000004d;overflow:hidden}.tas-videocall-container .avatar-container{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:1;display:flex;align-items:center;justify-content:center}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:12px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#33475bb3;padding:12px 20px;border-radius:30px;backdrop-filter:blur(8px)}.tas-videocall-container .controls-container .control-btn{width:44px;height:44px;border-radius:20px;display:flex;align-items:center;justify-content:center;font-size:18px;border:none;background:transparent;cursor:pointer;transition:all .2s ease}.tas-videocall-container .controls-container .control-btn i{color:#fff}.tas-videocall-container .controls-container .control-btn:hover{transform:scale(1.05);filter:brightness(1.1)}.tas-videocall-container .controls-container .control-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .controls-container .hangup-btn{background:#f44336}.tas-videocall-container .controls-container .hangup-btn i{transform:rotate(135deg)}.tas-videocall-container .controls-container .hangup-btn:hover{background:#d32f2f}.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{background:transparent}.tas-videocall-container .controls-container .swap-btn:hover,.tas-videocall-container .controls-container .pip-btn:hover,.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.15)}.tas-videocall-container .waiting-notification{position:absolute;bottom:100px;left:16px;display:flex;align-items:center;gap:12px;background-color:#33475be6;padding:10px 16px;border-radius:8px;z-index:4;backdrop-filter:blur(4px);max-width:calc(100% - 32px)}.tas-videocall-container .waiting-notification .waiting-text{color:#fff;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tas-videocall-container .waiting-notification .admit-btn{background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:4px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;white-space:nowrap}.tas-videocall-container .waiting-notification .admit-btn:hover{background:#178e99}.tas-videocall-container .waiting-notification .admit-btn:focus{outline:2px solid #fff;outline-offset:2px}.tas-videocall-container .waiting-notification .dismiss-btn{background:transparent;color:#fff;border:none;font-size:20px;line-height:1;cursor:pointer;padding:0 4px;opacity:.7;transition:opacity .2s ease}.tas-videocall-container .waiting-notification .dismiss-btn:hover{opacity:1}.tas-videocall-container .waiting-notification .dismiss-btn:focus{outline:2px solid #fff;outline-offset:2px}.location-panel{width:280px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.location-panel .location-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.location-panel .location-header h3{font-size:16px;font-weight:600;margin:0;color:#fff}.location-panel .location-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.location-panel .location-header .close-btn:hover{opacity:1}.location-panel .location-description{font-size:14px;color:#fffc;line-height:1.5;margin-bottom:.5rem}.location-panel .location-description p{margin:0 0 .5rem}.location-panel .location-user-list{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem;max-height:200px;overflow-y:auto}.location-panel .location-user-list .user-geo-item{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:rgba(255,255,255,.05);border-radius:6px}.location-panel .location-user-list .user-geo-item .user-icon{color:#fff9;font-size:14px}.location-panel .location-user-list .user-geo-item .user-name{flex:1;font-size:14px;color:#fff}.location-panel .location-user-list .user-geo-item .geo-status{display:flex;align-items:center;gap:.35rem;font-size:12px;padding:2px 8px;border-radius:12px}.location-panel .location-user-list .user-geo-item .geo-status.pending{color:#ffc107;background:rgba(255,193,7,.15)}.location-panel .location-user-list .user-geo-item .geo-status.granted{color:#4caf50;background:rgba(76,175,80,.15)}.location-panel .location-user-list .user-geo-item .geo-status.denied{color:#f44336;background:rgba(244,67,54,.15)}.location-panel .location-user-list .user-geo-item .geo-status i{font-size:10px}.location-panel .geo-denied-warning{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:rgba(244,67,54,.15);border-radius:6px;margin-bottom:1rem;color:#f44336;font-size:13px}.location-panel .geo-denied-warning i{font-size:14px}.location-panel .location-content{flex:1;display:flex;flex-direction:column;justify-content:flex-end}.location-panel .verify-location-btn{width:100%;padding:12px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s ease;margin-bottom:1rem}.location-panel .verify-location-btn:hover{background:#178e99}.location-panel .verify-location-btn:disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.location-panel .location-footer{display:flex;justify-content:flex-end;gap:.5rem;padding-top:.5rem;border-top:1px solid rgba(255,255,255,.1)}.location-panel .location-footer .footer-icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff;font-size:14px}.location-panel .location-footer .footer-icon.location-icon{background:var(--Primary-Uell, #1da4b1)}.location-panel .header-icon{color:#fff;font-size:16px}.location-panel .geo-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-loading-container .geo-spinner{width:64px;height:64px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite}.location-panel .geo-loading-container .loading-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 .25rem}.location-panel .geo-loading-container .loading-subtitle{color:#ffffffb3;font-size:14px;margin:0}.location-panel .geo-success-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 0}.location-panel .geo-success-container .success-icon{width:80px;height:80px;border-radius:50%;background:var(--Primary-Uell, #1da4b1);display:flex;align-items:center;justify-content:center;position:relative}.location-panel .geo-success-container .success-icon i{color:#fff;font-size:32px}.location-panel .geo-success-container .success-icon:before,.location-panel .geo-success-container .success-icon:after{content:\"\\2726\";position:absolute;color:#fff;font-size:10px}.location-panel .geo-success-container .success-icon:before{top:-8px;right:-4px}.location-panel .geo-success-container .success-icon:after{bottom:-4px;left:-8px}.location-panel .geo-success-container .success-title{color:#fff;font-size:16px;font-weight:600;margin:1.5rem 0 0}.location-panel .verify-location-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}@keyframes geo-spin{to{transform:rotate(360deg)}}.user-geo-panel{width:360px;height:100%;background:#212532;border-radius:8px;padding:1.5rem;display:flex;flex-direction:column;color:#fff}.user-geo-panel .user-geo-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:2.5rem;padding-top:2rem}.user-geo-panel .user-geo-header .header-title-row{display:flex;align-items:center;gap:.5rem}.user-geo-panel .user-geo-header .header-title-row .header-icon{font-size:16px;color:#fff}.user-geo-panel .user-geo-header .header-title-row h3{font-size:18px;font-weight:600;margin:0;color:#fff}.user-geo-panel .user-geo-header .close-btn{background:transparent;border:none;color:#fff;font-size:20px;cursor:pointer;padding:0;line-height:1;opacity:.7}.user-geo-panel .user-geo-header .close-btn:hover{opacity:1}.user-geo-panel .user-geo-description{font-size:14px;color:#fffc;line-height:1.6;margin-bottom:1rem}.user-geo-panel .user-geo-description p{margin:0 0 .75rem}.user-geo-panel .user-geo-content{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.user-geo-panel .user-geo-verifying{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-verifying .geo-spinner-large{width:80px;height:80px;border:4px solid rgba(29,164,177,.2);border-top-color:var(--Primary-Uell, #1da4b1);border-radius:50%;animation:geo-spin 1s linear infinite;margin-bottom:1.5rem}.user-geo-panel .user-geo-verifying .verifying-title{color:#fff;font-size:16px;font-weight:600;margin:0 0 .25rem}.user-geo-panel .user-geo-verifying .verifying-subtitle{color:#fff9;font-size:14px;margin:0}.user-geo-panel .user-geo-verified{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-verified .verified-icon-container{margin-bottom:1rem}.user-geo-panel .user-geo-verified .verified-icon-container .home-icon{display:block}.user-geo-panel .user-geo-verified .verified-icon-container .home-icon svg{width:120px;height:100px}.user-geo-panel .user-geo-verified .verified-title{color:#fff;font-size:16px;font-weight:600;margin:0}.user-geo-panel .user-geo-denied{display:flex;flex-direction:column;align-items:center;text-align:center}.user-geo-panel .user-geo-denied .denied-icon-container{width:100px;height:100px;border-radius:50%;background:rgba(244,67,54,.2);display:flex;align-items:center;justify-content:center;margin-bottom:1.5rem}.user-geo-panel .user-geo-denied .denied-icon-container i{font-size:48px;color:#f44336}.user-geo-panel .user-geo-denied .denied-title{color:#fff;font-size:16px;font-weight:600;margin:0 0 .5rem}.user-geo-panel .user-geo-denied .denied-subtitle{color:#fff9;font-size:14px;margin:0}.user-geo-panel .user-geo-btn{width:100%;padding:14px 24px;background:var(--Primary-Uell, #1da4b1);color:#fff;border:none;border-radius:24px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;margin-top:auto;margin-bottom:1rem}.user-geo-panel .user-geo-btn:hover:not(.disabled){background:#178e99}.user-geo-panel .user-geo-btn.disabled{background:rgba(29,164,177,.5);cursor:not-allowed}.user-geo-panel .dev-controls{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:rgba(0,0,0,.3);border-radius:6px;margin-bottom:1rem;flex-wrap:wrap}.user-geo-panel .dev-controls .dev-label{font-size:12px;color:#fff9;font-weight:600}.user-geo-panel .dev-controls .dev-btn{padding:4px 8px;font-size:11px;background:rgba(255,255,255,.1);color:#fff;border:1px solid rgba(255,255,255,.2);border-radius:4px;cursor:pointer;transition:all .2s ease}.user-geo-panel .dev-controls .dev-btn:hover{background:rgba(255,255,255,.2)}.user-geo-panel .user-geo-footer{display:flex;justify-content:center;gap:.75rem;padding-top:.5rem}.user-geo-panel .user-geo-footer .footer-icon{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.1);color:#fff9;font-size:16px}.user-geo-panel .user-geo-footer .footer-icon.active{background:var(--Primary-Uell, #1da4b1);color:#fff}\n"] }]
|
|
457
|
+
}], ctorParameters: function () { return [{ type: i1.NgbActiveModal }, { type: i2.TasService }, { type: i3.GeolocationService }, { type: i4.DomSanitizer }, { type: i1.NgbModal }]; }, propDecorators: { sessionId: [{
|
|
338
458
|
type: Input
|
|
339
459
|
}], token: [{
|
|
340
460
|
type: Input
|
|
@@ -359,4 +479,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
359
479
|
type: ViewChild,
|
|
360
480
|
args: ['subscriberContainer']
|
|
361
481
|
}] } });
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXZpZGVvY2FsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULEtBQUssRUFDTCxTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUdmLGNBQWMsR0FFZixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxRQUFRLE1BQU0sWUFBWSxDQUFDOzs7Ozs7O0FBT2xDLE1BQU0sT0FBTyxxQkFBcUI7SUErQmhDLFlBQ1MsV0FBMkIsRUFDMUIsVUFBc0IsRUFDdEIsa0JBQXNDO1FBRnZDLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUE1QnZDLG9CQUFlLEdBQVcsRUFBRSxDQUFDO1FBQzdCLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDcEIsaUJBQVksR0FBb0IsZUFBZSxDQUFDLElBQUksQ0FBQztRQUNyRCx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFLdEMscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQzNCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIscUJBQWdCLEdBQXNCLEVB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QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFMkIsa0JBQWtCO3NCQUFsRCxTQUFTO3VCQUFDLG9CQUFvQjtnQkFDRyxtQkFBbUI7c0JBQXBELFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQgeyBHZW9sb2NhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9nZW9sb2NhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENhbGxTdGF0ZSxcbiAgVmlld01vZGUsXG4gIFRhc0J1c2luZXNzUm9sZSxcbiAgV2FpdGluZ1Jvb21Vc2VyLFxuICBSb29tVXNlclN0YXR1cyxcbiAgVXNlckNhbGxBY3Rpb24sXG4gIFByb3h5VmlkZW9Vc2VyTW9kaWZ5UmVxdWVzdCxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCBpbnRlcmFjdCBmcm9tICdpbnRlcmFjdGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLXZpZGVvY2FsbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXMtdmlkZW9jYWxsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNWaWRlb2NhbGxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIHNlc3Npb25JZCE6IHN0cmluZztcbiAgQElucHV0KCkgdG9rZW4hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwcG9pbnRtZW50SWQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHZpZGVvQ2FsbElkPzogbnVtYmVyO1xuICBASW5wdXQoKSB1c2VySWQ/OiBudW1iZXI7IC8vIEN1cnJlbnQgdXNlcidzIElEIGZvciBnZW8gcmVwb3J0aW5nXG4gIEBJbnB1dCgpIHBhcnRpY2lwYW50TmFtZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRlbmFudDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlID0gVGFzQnVzaW5lc3NSb2xlLlVTRVI7XG4gIEBJbnB1dCgpIGlzUmV0dXJuaW5nRnJvbVBpcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ3B1Ymxpc2hlckNvbnRhaW5lcicpIHB1Ymxpc2hlckNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3N1YnNjcmliZXJDb250YWluZXInKSBzdWJzY3JpYmVyQ29udGFpbmVyITogRWxlbWVudFJlZjtcblxuICBwdWJsaWMgaXNQdWJsaXNoZXJTbWFsbCA9IHRydWU7XG4gIHB1YmxpYyBjYWxsU3RhdGUgPSBDYWxsU3RhdGUuSURMRTtcbiAgcHVibGljIGlzTXV0ZWQgPSBmYWxzZTtcbiAgcHVibGljIHdhaXRpbmdSb29tVXNlcnM6IFdhaXRpbmdSb29tVXNlcltdID0gW107XG4gIHB1YmxpYyBvd25lckhhc0pvaW5lZCA9IGZhbHNlO1xuICBwdWJsaWMgaGFzVmlkZW9TdHJlYW0gPSBmYWxzZTtcbiAgcHVibGljIGRpc21pc3NlZFVzZXJzOiBudW1iZXJbXSA9IFtdO1xuICBwdWJsaWMgc2hvd0xvY2F0aW9uUGFuZWwgPSB0cnVlOyAvLyBTaG93IGJ5IGRlZmF1bHQgZm9yIG93bmVycywgd2lsbCBiZSB1cGRhdGVkIGJhc2VkIG9uIHVzZXIncyBsb2NhdGlvbiBzdGF0dXNcbiAgcHVibGljIHVzZXJIYXNMb2NhdGlvbiA9IGZhbHNlOyAvLyBUcmFja3MgaWYgdGhlIHVzZXIgaGFzIHNoYXJlZCB0aGVpciBsb2NhdGlvblxuICBwdWJsaWMgZ2VvTG9jYXRpb25TdGF0dXM6ICd1bmtub3duJyB8ICdhY3RpdmUnIHwgJ2RlbmllZCcgPSAndW5rbm93bic7XG4gIFxuICAvLyBHZW8gcGFuZWwgc3RhdGVzIGZvciBvd25lclxuICBwdWJsaWMgZ2VvUmVxdWVzdEFjdGl2ZSA9IGZhbHNlOyAvLyBPd25lciBzZW50IHJlcXVlc3QsIHdhaXRpbmcgZm9yIHVzZXJcbiAgcHVibGljIGFsbEdlb0dyYW50ZWQgPSBmYWxzZTsgLy8gQWxsIHVzZXJzIHJlc3BvbmRlZCB3aXRoIGdlb1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgdGFzU2VydmljZTogVGFzU2VydmljZSxcbiAgICBwcml2YXRlIGdlb2xvY2F0aW9uU2VydmljZTogR2VvbG9jYXRpb25TZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldHVwU3Vic2NyaXB0aW9ucygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNhbGwoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRJbnRlcmFjdCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy50YXNTZXJ2aWNlLnJlc2V0UG9sbGluZ1N0YXRlKCk7XG5cbiAgICAvLyBPbmx5IGRpc2Nvbm5lY3QgaWYgbm90IGluIFBpUCBtb2RlIChrZWVwIHNlc3Npb24gYWxpdmUgZm9yIGZsb2F0aW5nIHdpbmRvdylcbiAgICBpZiAoIXRoaXMudGFzU2VydmljZS5pc1BpcE1vZGUoKSkge1xuICAgICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgaW50ZXJhY3QoJy5wdWJsaXNoZXItdmlldycpLnVuc2V0KCk7XG4gIH1cblxuICAvLyBQdWJsaWMgTWV0aG9kc1xuICBoYW5nVXAoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gIH1cblxuICB0b2dnbGVNdXRlKCk6IHZvaWQge1xuICAgIHRoaXMudGFzU2VydmljZS50b2dnbGVNdXRlKCk7XG4gIH1cblxuICBtaW5pbWl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhc1NlcnZpY2UubW92ZU1haW5WaWRlb1RvKCdwaXAtbWFpbi12aWRlbycpO1xuICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSB2aWRlbyBpcyBtb3ZlZCBiZWZvcmUgY2xvc2luZyBtb2RhbFxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50YXNTZXJ2aWNlLmVudGVyUGlwTW9kZSgpLCA1MCk7XG4gIH1cblxuICB0b2dnbGVTd2FwKCk6IHZvaWQge1xuICAgIHRoaXMuaXNQdWJsaXNoZXJTbWFsbCA9ICF0aGlzLmlzUHVibGlzaGVyU21hbGw7XG4gICAgdGhpcy5yZXNldFZpZGVvUG9zaXRpb25zKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmluaXRJbnRlcmFjdCgpKTtcbiAgfVxuXG4gIG9uRG91YmxlQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVTd2FwKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCB1c2VyIGNhbiBhZG1pdCBvdGhlcnMgKE9XTkVSLCBCQUNLT0ZGSUNFLCBvciBNT0RFUkFUT1IpXG4gICAqL1xuICBnZXQgY2FuQWRtaXRVc2VycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5CQUNLT0ZGSUNFIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLkFETUlOX01BTkFHRVIgfHxcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuTUFOQUdFUlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRtaXQgYSB1c2VyIGZyb20gdGhlIHdhaXRpbmcgcm9vbVxuICAgKi9cbiAgYWRtaXRVc2VyKHVzZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbElkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgYWRtaXQgdXNlcjogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudGFzU2VydmljZVxuICAgICAgLm1vZGlmeVByb3h5VmlkZW9Vc2VyKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgICAgYWN0aW9uOiBVc2VyQ2FsbEFjdGlvbi5XQUlUSU5HX1JPT01fTEVBVkUsXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvLyBSZW1vdmUgdXNlciBmcm9tIHdhaXRpbmcgbGlzdCBhZnRlciBzdWNjZXNzZnVsIGFkbWl0XG4gICAgICAgICAgdGhpcy53YWl0aW5nUm9vbVVzZXJzID0gdGhpcy53YWl0aW5nUm9vbVVzZXJzLmZpbHRlcihcbiAgICAgICAgICAgICh1KSA9PiB1LnVzZXJJZCAhPT0gdXNlcklkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZG1pdHRpbmcgdXNlcjonLCBlcnIpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzcyB0aGUgd2FpdGluZyByb29tIG5vdGlmaWNhdGlvbiBmb3IgYSB1c2VyXG4gICAqL1xuICBkaXNtaXNzV2FpdGluZ05vdGlmaWNhdGlvbih1c2VySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGlzbWlzc2VkVXNlcnMucHVzaCh1c2VySWQpO1xuICAgIHRoaXMud2FpdGluZ1Jvb21Vc2VycyA9IHRoaXMud2FpdGluZ1Jvb21Vc2Vycy5maWx0ZXIoXG4gICAgICAodSkgPT4gdS51c2VySWQgIT09IHVzZXJJZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGxvY2F0aW9uIHBhbmVsXG4gICAqL1xuICBjbG9zZUxvY2F0aW9uUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TG9jYXRpb25QYW5lbCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHVzZXIgdG8gc2hhcmUgdGhlaXIgbG9jYXRpb25cbiAgICovXG4gIHJlcXVlc3RVc2VyTG9jYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbElkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcmVxdWVzdCBsb2NhdGlvbjogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBib2R5OiBQcm94eVZpZGVvVXNlck1vZGlmeVJlcXVlc3QgPSB7XG4gICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgIGFjdGlvbjogVXNlckNhbGxBY3Rpb24uUkVRVUVTVF9HRU9MT0NBTElaQVRJT04sXG4gICAgfTtcblxuICAgIC8vIFRPRE86IFNlbmQgbG9jYXRpb24gcmVxdWVzdCBhY3Rpb24gdG8gYmFja2VuZCB3aGVuIGVuZHBvaW50IGlzIHJlYWR5XG4gICAgdGhpcy50YXNTZXJ2aWNlLm1vZGlmeVByb3h5VmlkZW9Vc2VyKGJvZHkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiBjb25zb2xlLmxvZygnTG9jYXRpb24gcmVxdWVzdCBzZW50JyksXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignRXJyb3IgcmVxdWVzdGluZyBsb2NhdGlvbjonLCBlcnIpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBNZXRob2RzXG4gIHByaXZhdGUgc2V0dXBTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIENhbGwgc3RhdGUgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5jYWxsU3RhdGUkLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSBDYWxsU3RhdGUuRElTQ09OTkVDVEVEKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnaGFuZ3VwJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhY2sgaWYgd2UgaGF2ZSBhbiBhY3RpdmUgdmlkZW8gc3RyZWFtXG4gICAgICAgIHRoaXMuaGFzVmlkZW9TdHJlYW0gPSBzdGF0ZSA9PT0gQ2FsbFN0YXRlLkNPTk5FQ1RFRDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFZpZXcgbW9kZSBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLnZpZXdNb2RlJC5zdWJzY3JpYmUoKG1vZGUpID0+IHtcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3BpcCcpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBNdXRlIHN0YXRlIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2UuaXNNdXRlZCQuc3Vic2NyaWJlKChtdXRlZCkgPT4ge1xuICAgICAgICB0aGlzLmlzTXV0ZWQgPSBtdXRlZDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFdhaXRpbmcgcm9vbSB1c2VycyBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLndhaXRpbmdSb29tVXNlcnMkLnN1YnNjcmliZSgodXNlcnMpID0+IHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBkaXNtaXNzZWQgdXNlcnNcbiAgICAgICAgdGhpcy53YWl0aW5nUm9vbVVzZXJzID0gdXNlcnMuZmlsdGVyKFxuICAgICAgICAgICh1KSA9PiAhdGhpcy5kaXNtaXNzZWRVc2Vycy5pbmNsdWRlcyh1LnVzZXJJZClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIE93bmVyIGpvaW4gc3RhdHVzIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uub3duZXJIYXNKb2luZWQkLnN1YnNjcmliZSgoam9pbmVkKSA9PiB7XG4gICAgICAgIHRoaXMub3duZXJIYXNKb2luZWQgPSBqb2luZWQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBPd25lciBsZWZ0IHN1YnNjcmlwdGlvbiAtIGRpc2Nvbm5lY3Qgbm9uLW93bmVyc1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uub3duZXJIYXNMZWZ0JC5zdWJzY3JpYmUoKGhhc0xlZnQpID0+IHtcbiAgICAgICAgaWYgKGhhc0xlZnQgJiYgIXRoaXMuY2FuQWRtaXRVc2VycykgeyAvLyBOb24tb3duZXIgdXNlclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBPd25lciBsZWZ0LCBkaXNjb25uZWN0aW5nIHVzZXInKTtcbiAgICAgICAgICB0aGlzLmhhbmdVcCgpO1xuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ293bmVyX2xlZnQnKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gQWN0aXZhdGVHZW8gc3Vic2NyaXB0aW9uIC0gb25seSBmb3Igbm9uLW93bmVycyAodXNlcnMpXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5hY3RpdmF0ZUdlbyQuc3Vic2NyaWJlKChhY3RpdmF0ZUdlbykgPT4ge1xuICAgICAgICBpZiAoYWN0aXZhdGVHZW8gJiYgIXRoaXMuY2FuQWRtaXRVc2Vycykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBhY3RpdmF0ZUdlbz10cnVlLCBjaGVja2luZyBnZW8gc3RhdHVzIGZvciB1c2VyLi4uJyk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVBY3RpdmF0ZUdlbygpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBHZW9SZXF1ZXN0QWN0aXZlIHN1YnNjcmlwdGlvbiAtIGZvciBvd25lcnNcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmdlb1JlcXVlc3RBY3RpdmUkLnN1YnNjcmliZSgoYWN0aXZlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBnZW9SZXF1ZXN0QWN0aXZlIGNoYW5nZWQ6JywgYWN0aXZlKTtcbiAgICAgICAgdGhpcy5nZW9SZXF1ZXN0QWN0aXZlID0gYWN0aXZlO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gQWxsR2VvR3JhbnRlZCBzdWJzY3JpcHRpb24gLSBmb3Igb3duZXJzXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5hbGxHZW9HcmFudGVkJC5zdWJzY3JpYmUoKGdyYW50ZWQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIGFsbEdlb0dyYW50ZWQgY2hhbmdlZDonLCBncmFudGVkKTtcbiAgICAgICAgdGhpcy5hbGxHZW9HcmFudGVkID0gZ3JhbnRlZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYWN0aXZhdGVHZW8gcmVxdWVzdCBmcm9tIGJhY2tlbmQgKGZvciBub24tb3duZXIgdXNlcnMpLlxuICAgKiBJZiBnZW8gaXMgYWxyZWFkeSBhY3RpdmUsIHJlcG9ydCBpdC4gSWYgbm90LCBwcm9tcHQgdXNlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQWN0aXZhdGVHZW8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIGhhbmRsZUFjdGl2YXRlR2VvIC0gY3VycmVudCBzdGF0dXM6JywgdGhpcy5nZW9Mb2NhdGlvblN0YXR1cyk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBjYWNoZWQgcG9zaXRpb25cbiAgICBjb25zdCBjYWNoZWRQb3NpdGlvbiA9IHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldENhY2hlZFBvc2l0aW9uKCk7XG4gICAgaWYgKGNhY2hlZFBvc2l0aW9uKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gR2VvbG9jYXRpb24gYWxyZWFkeSBhY3RpdmUsIHJlcG9ydGluZyB0byBiYWNrZW5kOicsIGNhY2hlZFBvc2l0aW9uKTtcbiAgICAgIHRoaXMuZ2VvTG9jYXRpb25TdGF0dXMgPSAnYWN0aXZlJztcbiAgICAgIHRoaXMucmVwb3J0R2VvU3RhdHVzKGNhY2hlZFBvc2l0aW9uLmxhdGl0dWRlLCBjYWNoZWRQb3NpdGlvbi5sb25naXR1ZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBnZXQgcG9zaXRpb25cbiAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gUmVxdWVzdGluZyBnZW9sb2NhdGlvbiBmcm9tIHVzZXIuLi4nKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IGF3YWl0IHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRQb3NpdGlvbigpO1xuICAgIFxuICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIEdlb2xvY2F0aW9uIG9idGFpbmVkOicsIHBvc2l0aW9uKTtcbiAgICAgIHRoaXMuZ2VvTG9jYXRpb25TdGF0dXMgPSAnYWN0aXZlJztcbiAgICAgIHRoaXMucmVwb3J0R2VvU3RhdHVzKHBvc2l0aW9uLmxhdGl0dWRlLCBwb3NpdGlvbi5sb25naXR1ZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gR2VvbG9jYXRpb24gZGVuaWVkIG9yIHVuYXZhaWxhYmxlJyk7XG4gICAgICB0aGlzLmdlb0xvY2F0aW9uU3RhdHVzID0gJ2RlbmllZCc7XG4gICAgICAvLyBSZXBvcnQgdGhhdCBnZW8gaXMgbm90IGF2YWlsYWJsZSAod2l0aCBubyBjb29yZGluYXRlcylcbiAgICAgIHRoaXMucmVwb3J0R2VvU3RhdHVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBnZW9sb2NhdGlvbiBzdGF0dXMgdG8gYmFja2VuZC5cbiAgICovXG4gIHByaXZhdGUgcmVwb3J0R2VvU3RhdHVzKGxhdGl0dWRlPzogbnVtYmVyLCBsb25naXR1ZGU/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlkZW9DYWxsSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIENhbm5vdCByZXBvcnQgZ2VvIHN0YXR1czogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRPRE86IElmIHRoZSBwZXJtaXNzaW9uIGZvciBnZW8gbG9jYXRpb24gaXMgbm90IGdyYW50ZWQsIHdlIHNob3VsZCBub3QgcmVwb3J0IGl0IHRvIHRoZSBiYWNrZW5kXG4gICAgaWYgKCF0aGlzLmdlb0xvY2F0aW9uU3RhdHVzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBDYW5ub3QgcmVwb3J0IGdlbyBzdGF0dXM6IGdlb0xvY2F0aW9uU3RhdHVzIG5vdCBzZXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5OiBQcm94eVZpZGVvVXNlck1vZGlmeVJlcXVlc3QgPSB7XG4gICAgICB1c2VySWQ6IHRoaXMudXNlcklkLFxuICAgICAgdmlkZW9DYWxsSWQ6IHRoaXMudmlkZW9DYWxsSWQsXG4gICAgICBhY3Rpb246IFVzZXJDYWxsQWN0aW9uLkFDVElWQVRFX0dFT0xPQ0FUSU9OLFxuICAgICAgbGF0aXR1ZGUsXG4gICAgICBsb25naXR1ZGUsXG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBSZXBvcnRpbmcgZ2VvIHN0YXR1cyB0byBiYWNrZW5kOicsIGJvZHkpO1xuICAgIHRoaXMudGFzU2VydmljZS5tb2RpZnlQcm94eVZpZGVvVXNlcihib2R5KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4gY29uc29sZS5sb2coJ1tUQVMgREVCVUddIEdlbyBzdGF0dXMgcmVwb3J0ZWQgc3VjY2Vzc2Z1bGx5JyksXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gRXJyb3IgcmVwb3J0aW5nIGdlbyBzdGF0dXM6JywgZXJyKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNhbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSZXR1cm5pbmdGcm9tUGlwKSB7XG4gICAgICAvLyBSZXR1cm5pbmcgZnJvbSBQaVAgLSBqdXN0IG1vdmUgdmlkZW9zIGJhY2tcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50YXNTZXJ2aWNlLm1vdmVWaWRlb3NUb0Z1bGxzY3JlZW4oKSwgMTAwKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2Vzc2lvbklkICYmIHRoaXMudG9rZW4pIHtcbiAgICAgIC8vIE5ldyBjYWxsIC0gY29ubmVjdCB0byBzZXNzaW9uXG4gICAgICB0aGlzLnRhc1NlcnZpY2VcbiAgICAgICAgLmNvbm5lY3RTZXNzaW9uKFxuICAgICAgICAgIHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIHRoaXMudG9rZW4sXG4gICAgICAgICAgJ3B1Ymxpc2hlci1jb250YWluZXInLFxuICAgICAgICAgICdzdWJzY3JpYmVyLWNvbnRhaW5lcicsXG4gICAgICAgICAgdGhpcy5idXNpbmVzc1JvbGVcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNvbm5lY3RpbmcgdG8gdmlkZW8gY2FsbDonLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gU3RhcnQgc3RhdHVzIHBvbGxpbmcgd2l0aCBzaG9ydGVyIGludGVydmFsICg1cykgdG8gZGV0ZWN0IG93bmVyIGxlYXZpbmcvbG9jYXRpb24gcmVxdWVzdHNcbiAgICAgIGlmICh0aGlzLmFwcG9pbnRtZW50SWQpIHtcbiAgICAgICAgdGhpcy50YXNTZXJ2aWNlLnN0YXJ0U3RhdHVzUG9sbGluZyh7XG4gICAgICAgICAgYXBwb2ludG1lbnRJZDogdGhpcy5hcHBvaW50bWVudElkLFxuICAgICAgICAgIHRlbmFudDogdGhpcy50ZW5hbnQsXG4gICAgICAgICAgYnVzaW5lc3NSb2xlOiB0aGlzLmJ1c2luZXNzUm9sZSxcbiAgICAgICAgICByb29tVHlwZTogdW5kZWZpbmVkLCAvLyBSb29tVHlwZSBtaWdodCBiZSBuZWVkZWQgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgZW50aXR5SWQ6IHVuZGVmaW5lZCwgLy8gRW50aXR5SWQgbWlnaHQgYmUgbmVlZGVkIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWRcbiAgICAgICAgfSwgNTAwMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldFZpZGVvUG9zaXRpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IHB1Ymxpc2hlckVsID0gdGhpcy5wdWJsaXNoZXJDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgc3Vic2NyaWJlckVsID0gdGhpcy5zdWJzY3JpYmVyQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKHB1Ymxpc2hlckVsKSB7XG4gICAgICBwdWJsaXNoZXJFbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICBwdWJsaXNoZXJFbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEteCcpO1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXknKTtcbiAgICB9XG5cbiAgICBpZiAoc3Vic2NyaWJlckVsKSB7XG4gICAgICBzdWJzY3JpYmVyRWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgc3Vic2NyaWJlckVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS14Jyk7XG4gICAgICBzdWJzY3JpYmVyRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXknKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRJbnRlcmFjdCgpOiB2b2lkIHtcbiAgICBpbnRlcmFjdCgnLnB1Ymxpc2hlci12aWV3JykudW5zZXQoKTtcblxuICAgIGludGVyYWN0KCcucHVibGlzaGVyLXZpZXcnKVxuICAgICAgLmRyYWdnYWJsZSh7XG4gICAgICAgIGluZXJ0aWE6IHRydWUsXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdFJlY3Qoe1xuICAgICAgICAgICAgcmVzdHJpY3Rpb246ICdwYXJlbnQnLFxuICAgICAgICAgICAgZW5kT25seTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgYXV0b1Njcm9sbDogdHJ1ZSxcbiAgICAgICAgbGlzdGVuZXJzOiB7XG4gICAgICAgICAgbW92ZTogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBjb25zdCB4ID0gKHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS14JykpIHx8IDApICsgZXZlbnQuZHg7XG4gICAgICAgICAgICBjb25zdCB5ID0gKHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS15JykpIHx8IDApICsgZXZlbnQuZHk7XG5cbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXgnLCBTdHJpbmcoeCkpO1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS15JywgU3RyaW5nKHkpKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5yZXNpemFibGUoe1xuICAgICAgICBlZGdlczogeyBsZWZ0OiBmYWxzZSwgcmlnaHQ6IHRydWUsIGJvdHRvbTogdHJ1ZSwgdG9wOiBmYWxzZSB9LFxuICAgICAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgICBtb3ZlOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGxldCB4ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXgnKSkgfHwgMDtcbiAgICAgICAgICAgIGxldCB5ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXknKSkgfHwgMDtcblxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLndpZHRoID0gYCR7ZXZlbnQucmVjdC53aWR0aH1weGA7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gYCR7ZXZlbnQucmVjdC5oZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICB4ICs9IGV2ZW50LmRlbHRhUmVjdC5sZWZ0O1xuICAgICAgICAgICAgeSArPSBldmVudC5kZWx0YVJlY3QudG9wO1xuXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3h9cHgsICR7eX1weClgO1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS14JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteScsIFN0cmluZyh5KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0RWRnZXMoeyBvdXRlcjogJ3BhcmVudCcgfSksXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0U2l6ZSh7IG1pbjogeyB3aWR0aDogMTUwLCBoZWlnaHQ6IDEwMCB9IH0pLFxuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5hc3BlY3RSYXRpbyh7IHJhdGlvOiAncHJlc2VydmUnIH0pLFxuICAgICAgICBdLFxuICAgICAgICBpbmVydGlhOiB0cnVlLFxuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YXMtdmlkZW9jYWxsLXdyYXBwZXJcIj5cbiAgPGRpdiBjbGFzcz1cInRhcy12aWRlb2NhbGwtY29udGFpbmVyXCI+XG4gICAgPCEtLSBTdWJzY3JpYmVyIHZpZGVvIChsYXJnZSwgYmFja2dyb3VuZCkgLS0+XG4gICAgPGRpdlxuICAgICAgaWQ9XCJzdWJzY3JpYmVyLWNvbnRhaW5lclwiXG4gICAgICBbY2xhc3Muc3Vic2NyaWJlci12aWV3XT1cImlzUHVibGlzaGVyU21hbGxcIlxuICAgICAgW2NsYXNzLnB1Ymxpc2hlci12aWV3XT1cIiFpc1B1Ymxpc2hlclNtYWxsXCJcbiAgICAgICNzdWJzY3JpYmVyQ29udGFpbmVyXG4gICAgICAoZGJsY2xpY2spPVwib25Eb3VibGVDbGljaygpXCJcbiAgICA+PC9kaXY+XG5cbiAgICA8IS0tIFB1Ymxpc2hlciB2aWRlbyAoc21hbGwsIG92ZXJsYXkpIC0tPlxuICAgIDxkaXZcbiAgICAgIGlkPVwicHVibGlzaGVyLWNvbnRhaW5lclwiXG4gICAgICBbY2xhc3MucHVibGlzaGVyLXZpZXddPVwiaXNQdWJsaXNoZXJTbWFsbFwiXG4gICAgICBbY2xhc3Muc3Vic2NyaWJlci12aWV3XT1cIiFpc1B1Ymxpc2hlclNtYWxsXCJcbiAgICAgICNwdWJsaXNoZXJDb250YWluZXJcbiAgICAgIChkYmxjbGljayk9XCJvbkRvdWJsZUNsaWNrKClcIlxuICAgID48L2Rpdj5cblxuICAgIDwhLS0gQ2VudGVyZWQgYXZhdGFyIChzaG93biB3aGVuIG5vIHZpZGVvIHN0cmVhbSkgLS0+XG4gICAgPGRpdiBjbGFzcz1cImF2YXRhci1jb250YWluZXJcIiAqbmdJZj1cIiFoYXNWaWRlb1N0cmVhbVwiPlxuICAgICAgPHRhcy1hdmF0YXIgW25hbWVdPVwicGFydGljaXBhbnROYW1lXCIgW3NpemVdPVwiODBcIj48L3Rhcy1hdmF0YXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENvbnRyb2xzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9scy1jb250YWluZXJcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gY29udHJvbC1idG4gbXV0ZS1idG5cIlxuICAgICAgICBbY2xhc3MubXV0ZWRdPVwiaXNNdXRlZFwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIlxuICAgICAgICBbdGl0bGVdPVwiaXNNdXRlZCA/ICdBY3RpdmFyIG1pY3LDs2Zvbm8nIDogJ1NpbGVuY2lhciBtaWNyw7Nmb25vJ1wiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXNNdXRlZCA/ICdBY3RpdmFyIG1pY3LDs2Zvbm8nIDogJ1NpbGVuY2lhciBtaWNyw7Nmb25vJ1wiXG4gICAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJmYVwiXG4gICAgICAgICAgW2NsYXNzLmZhLW1pY3JvcGhvbmVdPVwiIWlzTXV0ZWRcIlxuICAgICAgICAgIFtjbGFzcy5mYS1taWNyb3Bob25lLXNsYXNoXT1cImlzTXV0ZWRcIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGNvbnRyb2wtYnRuIHN3YXAtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVN3YXAoKVwiXG4gICAgICAgIHRpdGxlPVwiSW50ZXJjYW1iaWFyIHZpc3RhXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkludGVyY2FtYmlhciB2aXN0YVwiXG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcmVmcmVzaFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBjb250cm9sLWJ0biBwaXAtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cIm1pbmltaXplKClcIlxuICAgICAgICB0aXRsZT1cIk1pbmltaXphciAoUGljdHVyZSBpbiBQaWN0dXJlKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJNaW5pbWl6YXIgdmlkZW9sbGFtYWRhXCJcbiAgICAgID5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jb21wcmVzc1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBjb250cm9sLWJ0biBoYW5ndXAtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmdVcCgpXCJcbiAgICAgICAgdGl0bGU9XCJGaW5hbGl6YXIgbGxhbWFkYVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJGaW5hbGl6YXIgbGxhbWFkYVwiXG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGhvbmVcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gV2FpdGluZyByb29tIG5vdGlmaWNhdGlvbiAoc2hvd24gZm9yIE9XTkVSL0JBQ0tPRkZJQ0Ugb25seSkgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ3YWl0aW5nLW5vdGlmaWNhdGlvblwiXG4gICAgICAqbmdJZj1cIndhaXRpbmdSb29tVXNlcnMubGVuZ3RoID4gMCAmJiBjYW5BZG1pdFVzZXJzXCJcbiAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwid2FpdGluZy10ZXh0XCI+XG4gICAgICAgIHt7IHdhaXRpbmdSb29tVXNlcnNbMF0ubmFtZSB9fSBlc3TDoSBlbiBsYSBzYWxhIGRlIGVzcGVyYS5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJhZG1pdC1idG5cIlxuICAgICAgICAoY2xpY2spPVwiYWRtaXRVc2VyKHdhaXRpbmdSb29tVXNlcnNbMF0udXNlcklkKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJBZG1pdGlyIHVzdWFyaW9cIlxuICAgICAgPlxuICAgICAgICBBZG1pdGlyXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJkaXNtaXNzLWJ0blwiXG4gICAgICAgIChjbGljayk9XCJkaXNtaXNzV2FpdGluZ05vdGlmaWNhdGlvbih3YWl0aW5nUm9vbVVzZXJzWzBdLnVzZXJJZClcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQ2VycmFyIG5vdGlmaWNhY2nDs25cIlxuICAgICAgPlxuICAgICAgICDDl1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTG9jYXRpb24gcGFuZWwgKHNob3duIGZvciBvd25lcnMgd2hlbiB1c2VyIGhhc24ndCBhbGxvd2VkIGxvY2F0aW9uKSAtLT5cbiAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLXBhbmVsXCIgKm5nSWY9XCJzaG93TG9jYXRpb25QYW5lbCAmJiBjYW5BZG1pdFVzZXJzXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWhlYWRlclwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1tYXAtbWFya2VyIGhlYWRlci1pY29uXCI+PC9pPlxuICAgICAgPGgzPlViaWNhY2nDs24gZGVsIGNvbGFib3JhZG9yPC9oMz5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1idG5cIiAoY2xpY2spPVwiY2xvc2VMb2NhdGlvblBhbmVsKClcIiBhcmlhLWxhYmVsPVwiQ2VycmFyXCI+w5c8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tZGVzY3JpcHRpb25cIj5cbiAgICAgIDxwPkVsIGNvbGFib3JhZG9yIHRpZW5lIGxhIHViaWNhY2nDs24gZGVzYWN0aXZhZGEsIHNvbGljaXRhIHF1ZSBsYSBhY3RpdmUuPC9wPlxuICAgICAgPHA+RXN0YSBhY2Npw7NuIG5vcyBwZXJtaXRpcsOhIGRpc3BvbmliaWxpemFyIGFsZ3VuYXMgYWxlcnRhcy48L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWNvbnRlbnRcIj5cbiAgICAgIDwhLS0gSW5pdGlhbCBzdGF0ZTogU2hvdyB2ZXJpZnkgYnV0dG9uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFnZW9SZXF1ZXN0QWN0aXZlICYmICFhbGxHZW9HcmFudGVkXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJ2ZXJpZnktbG9jYXRpb24tYnRuXCIgKGNsaWNrKT1cInJlcXVlc3RVc2VyTG9jYXRpb24oKVwiPlxuICAgICAgICAgIFZlcmlmaWNhciB1YmljYWNpw7NuXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gTG9hZGluZyBzdGF0ZTogU3Bpbm5lciB3aGlsZSB3YWl0aW5nIGZvciB1c2VyIHJlc3BvbnNlIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdlb1JlcXVlc3RBY3RpdmUgJiYgIWFsbEdlb0dyYW50ZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdlby1sb2FkaW5nLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tc3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwibG9hZGluZy10aXRsZVwiPlZlcmlmaWNhbmRvIHViaWNhY2nDs24uLi48L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJsb2FkaW5nLXN1YnRpdGxlXCI+RXN0byBwdWVkZSB0YXJkYXIgdW5vcyBzZWd1bmRvcy48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidmVyaWZ5LWxvY2F0aW9uLWJ0biBkaXNhYmxlZFwiIGRpc2FibGVkPlxuICAgICAgICAgIFZlcmlmaWNhciB1YmljYWNpw7NuXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU3VjY2VzcyBzdGF0ZTogTG9jYXRpb24gdmVyaWZpZWQgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWxsR2VvR3JhbnRlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvLXN1Y2Nlc3MtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1Y2Nlc3MtaWNvblwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGVja1wiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cInN1Y2Nlc3MtdGl0bGVcIj5MYSB1YmljYWNpw7NuIGZ1ZSB2ZXJpZmljYWRhPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1mb290ZXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZm9vdGVyLWljb25cIj48aSBjbGFzcz1cImZhIGZhLWNsb2NrLW9cIj48L2k+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJmb290ZXItaWNvbiBsb2NhdGlvbi1pY29uXCI+PGkgY2xhc3M9XCJmYSBmYS1tYXAtbWFya2VyXCI+PC9pPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
482
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXZpZGVvY2FsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULEtBQUssRUFDTCxTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFHL0YsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUdmLGNBQWMsRUFHZCxTQUFTLEdBQ1YsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVVwQyxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7O0FBUmxDLHlDQUF5QztBQUN6QyxNQUFNLENBQU4sSUFBWSxnQkFNWDtBQU5ELFdBQVksZ0JBQWdCO0lBQzFCLHFDQUFpQixDQUFBO0lBQ2pCLHVDQUFtQixDQUFBO0lBQ25CLDJDQUF1QixDQUFBO0lBQ3ZCLHlDQUFxQixDQUFBO0lBQ3JCLHFDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFOVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBTTNCO0FBUUQsTUFBTSxPQUFPLHFCQUFxQjtJQXdDaEMsWUFDUyxXQUEyQixFQUMxQixVQUFzQixFQUN0QixrQkFBc0MsRUFDdEMsU0FBdUIsRUFDdkIsWUFBc0I7UUFKdkIsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzFCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBdkN2QixvQkFBZSxHQUFXLEVBQUUsQ0FBQztRQUM3QixXQUFNLEdBQVcsRUFBRSxDQUFDO1FBQ3BCLGlCQUFZLEdBQW9CLGVBQWUsQ0FBQyxJQUFJLENBQUM7UUFDckQsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBS3RDLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixjQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztRQUMzQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLHFCQUFnQixHQUFzQixFQUFFLENBQUM7UUFDekMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFDOUIsc0JBQWlCLEdBQUcsSUFBSSxDQUFDLENBQUMsOEVBQThFO1FBQ3hHLG9CQUFlLEdBQUcsS0FBSyxDQUFDLENBQUMsK0NBQStDO1FBQ3hFLHNCQUFpQixHQUFvQyxTQUFTLENBQUM7UUFFdEUsNkJBQTZCO1FBQ3RCLHFCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLHVDQUF1QztRQUNqRSxrQkFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLCtCQUErQjtRQUN0RCxnQkFBVyxHQUFrQixFQUFFLENBQUMsQ0FBQyw2QkFBNkI7UUFFckUsb0NBQW9DO1FBQzdCLHFCQUFnQixHQUFxQixnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7UUFDN0QscUJBQWdCLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQywwQkFBMEI7UUFFL0QsbUJBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxrQ0FBa0M7UUFDekQsc0JBQWlCLEdBQUcsS0FBSyxDQUFDLENBQUMsMkNBQTJDO1FBQ3RFLGtCQUFhLEdBQUcsS0FBSyxDQUFDLENBQUMseUNBQXlDO1FBRWhFLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLDZFQUE2RTtRQUM3RSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFcEMsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQztRQUVELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUI7UUFDdkIsZ0RBQWdEO1FBQ2hELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxPQUFPO1NBQ1I7UUFFRCx3Q0FBd0M7UUFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUVwRSxzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUUxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtZQUNqRSxRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxJQUFJO1lBQ2QsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsNEJBQTRCO1NBQzFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ3JELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNoRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFFNUQsaUVBQWlFO1FBQ2pFLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsNERBQTREO1FBQzVELFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGFBQWE7UUFDZixPQUFPLENBQ0wsSUFBSSxDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsVUFBVTtZQUNoRCxJQUFJLENBQUMsWUFBWSxLQUFLLGVBQWUsQ0FBQyxhQUFhO1lBQ25ELElBQUksQ0FBQyxZQUFZLEtBQUssZUFBZSxDQUFDLE9BQU8sQ0FDOUMsQ0FBQztJQUNKLENBQUM7SUFFRCxvQ0FBb0M7SUFDcEMsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsSUFBSSx1QkFBdUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxpQ0FBaUM7UUFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRixPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ3JCLENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztJQUNqRixDQUFDO0lBRUQsaUVBQWlFO0lBQ2pFLG1CQUFtQixDQUFDLEtBQXVCO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsOENBQThDO1FBQzlDLElBQUksS0FBSyxLQUFLLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtZQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLE1BQWM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQ3hELE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxVQUFVO2FBQ1osb0JBQW9CLENBQUM7WUFDcEIsTUFBTTtZQUNOLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixNQUFNLEVBQUUsY0FBYyxDQUFDLGtCQUFrQjtTQUMxQyxDQUFDO2FBQ0QsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDVCx1REFBdUQ7Z0JBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUNsRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQzNCLENBQUM7WUFDSixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0gsMEJBQTBCLENBQUMsTUFBYztRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDbEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUMzQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM5RCxPQUFPO1NBQ1I7UUFDRCxNQUFNLElBQUksR0FBZ0M7WUFDeEMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLE1BQU0sRUFBRSxjQUFjLENBQUMsdUJBQXVCO1NBQy9DLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRCxJQUFJLEVBQUUsR0FBRyxFQUFFO2dCQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQztnQkFDckMsK0RBQStEO2dCQUMvRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1lBQ3JELENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxDQUFDO1NBQ2pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0I7SUFDVixrQkFBa0I7UUFDeEIsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsWUFBWSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzthQUMxQjtZQUNELDBDQUEwQztZQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssS0FBSyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRix5QkFBeUI7UUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzNDLElBQUksSUFBSSxLQUFLLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQy9CO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNwRCw2QkFBNkI7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQ2xDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FDL0MsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ25ELElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2xELElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLGlCQUFpQjtnQkFDckQsbUVBQW1FO2dCQUNuRSxxREFBcUQ7Z0JBQ3JELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNmO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDckQsSUFBSSxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUV0QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzthQUMxQjtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRiw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFFckQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztZQUU3QixxREFBcUQ7WUFDckQsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLE9BQU8sRUFBRTtnQkFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQzthQUNuRDtRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixpREFBaUQ7UUFDakQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLGlFQUFpRTtZQUNqRSxtRUFBbUU7UUFDckUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsaUJBQWlCO1FBQzdCLGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFckMsc0RBQXNEO1FBQ3RELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFcEUsSUFBSSxRQUFRLEVBQUU7WUFDWixJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDN0Q7YUFBTTtZQUNMLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVELG1FQUFtRTtJQUM1RCxLQUFLLENBQUMsb0JBQW9CO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFFbkQsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVyQyxzREFBc0Q7UUFDdEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUVwRSxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztZQUNsRCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzdEO2FBQU07WUFDTCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7WUFDaEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGVBQWUsQ0FBQyxRQUFnQixFQUFFLFNBQWlCO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBRXJCLE9BQU87U0FDUjtRQUVELG1DQUFtQztRQUNuQyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7WUFFaEcsT0FBTztTQUNSO1FBRUQsTUFBTSxJQUFJLEdBQWdDO1lBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsTUFBTSxFQUFFLGNBQWMsQ0FBQyxvQkFBb0I7WUFDM0MsUUFBUTtZQUNSLFNBQVM7U0FDVixDQUFDO1FBR0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFFcEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUVyQixPQUFPO1NBQ1I7UUFFRCxNQUFNLElBQUksR0FBZ0M7WUFDeEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixNQUFNLEVBQUUsY0FBYyxDQUFDLGdCQUFnQjtTQUN4QyxDQUFDO1FBR0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFFcEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsNkNBQTZDO1lBQzdDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDakU7YUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN2QyxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLFVBQVU7aUJBQ1osY0FBYyxDQUNiLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLEtBQUssRUFDVixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLElBQUksQ0FBQyxZQUFZLENBQ2xCO2lCQUNBLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7WUFFTCw0RkFBNEY7WUFDNUYsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDO29CQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7b0JBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO29CQUMvQixRQUFRLEVBQUUsU0FBUztvQkFDbkIsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDMUIsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNWO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxhQUE0QixDQUFDO1FBQzFFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxhQUE0QixDQUFDO1FBRTVFLElBQUksV0FBVyxFQUFFO1lBQ2YsV0FBVyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxXQUFXLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RDLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdkM7UUFFRCxJQUFJLFlBQVksRUFBRTtZQUNoQixZQUFZLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLFlBQVksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXBDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzthQUN4QixTQUFTLENBQUM7WUFDVCxPQUFPLEVBQUUsSUFBSTtZQUNiLFNBQVMsRUFBRTtnQkFDVCxRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFDOUIsV0FBVyxFQUFFLFFBQVE7b0JBQ3JCLE9BQU8sRUFBRSxJQUFJO2lCQUNkLENBQUM7YUFDSDtZQUNELFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFNBQVMsRUFBRTtnQkFDVCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO29CQUM1QixNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBRXRFLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNyRCxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUM7YUFDRjtTQUNGLENBQUM7YUFDRCxTQUFTLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQzdELFNBQVMsRUFBRTtnQkFDVCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO29CQUM1QixJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRXZELE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQztvQkFDN0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDO29CQUUvQyxDQUFDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQzFCLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztvQkFFekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ3JELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsQ0FBQzthQUNGO1lBQ0QsU0FBUyxFQUFFO2dCQUNULFFBQVEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUNyRCxRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ3JFLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDO2FBQ3REO1lBQ0QsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUM7SUFDUCxDQUFDOzttSEF4aUJVLHFCQUFxQjt1R0FBckIscUJBQXFCLDRoQkMzQ2xDLDY2TUF1S0E7NEZENUhhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxlQUFlO2lOQUtoQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUUyQixrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQUNHLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBJbnB1dCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBBZnRlclZpZXdJbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsLCBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRhc0ZlZWRiYWNrTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtZmVlZGJhY2stbW9kYWwvdGFzLWZlZWRiYWNrLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2VvbG9jYXRpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBDYWxsU3RhdGUsXG4gIFZpZXdNb2RlLFxuICBUYXNCdXNpbmVzc1JvbGUsXG4gIFdhaXRpbmdSb29tVXNlcixcbiAgUm9vbVVzZXJTdGF0dXMsXG4gIFVzZXJDYWxsQWN0aW9uLFxuICBQcm94eVZpZGVvVXNlck1vZGlmeVJlcXVlc3QsXG4gIFVzZXJHZW9JbmZvLFxuICBHZW9TdGF0dXMsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGFzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgVEFTX0lDT05TIH0gZnJvbSAnLi4vLi4vaWNvbnMvdGFzLWljb25zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKiogVXNlciBnZW9sb2NhdGlvbiBwYW5lbCB2aWV3IHN0YXRlcyAqL1xuZXhwb3J0IGVudW0gVXNlckdlb1ZpZXdTdGF0ZSB7XG4gIEhJRERFTiA9ICdISURERU4nLFxuICBJTklUSUFMID0gJ0lOSVRJQUwnLFxuICBWRVJJRllJTkcgPSAnVkVSSUZZSU5HJyxcbiAgVkVSSUZJRUQgPSAnVkVSSUZJRUQnLFxuICBERU5JRUQgPSAnREVOSUVEJyxcbn1cbmltcG9ydCBpbnRlcmFjdCBmcm9tICdpbnRlcmFjdGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLXZpZGVvY2FsbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXMtdmlkZW9jYWxsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNWaWRlb2NhbGxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIHNlc3Npb25JZCE6IHN0cmluZztcbiAgQElucHV0KCkgdG9rZW4hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwcG9pbnRtZW50SWQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHZpZGVvQ2FsbElkPzogbnVtYmVyO1xuICBASW5wdXQoKSB1c2VySWQ/OiBudW1iZXI7IC8vIEN1cnJlbnQgdXNlcidzIElEIGZvciBnZW8gcmVwb3J0aW5nXG4gIEBJbnB1dCgpIHBhcnRpY2lwYW50TmFtZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRlbmFudDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlID0gVGFzQnVzaW5lc3NSb2xlLlVTRVI7XG4gIEBJbnB1dCgpIGlzUmV0dXJuaW5nRnJvbVBpcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ3B1Ymxpc2hlckNvbnRhaW5lcicpIHB1Ymxpc2hlckNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3N1YnNjcmliZXJDb250YWluZXInKSBzdWJzY3JpYmVyQ29udGFpbmVyITogRWxlbWVudFJlZjtcblxuICBwdWJsaWMgaXNQdWJsaXNoZXJTbWFsbCA9IHRydWU7XG4gIHB1YmxpYyBjYWxsU3RhdGUgPSBDYWxsU3RhdGUuSURMRTtcbiAgcHVibGljIGlzTXV0ZWQgPSBmYWxzZTtcbiAgcHVibGljIHdhaXRpbmdSb29tVXNlcnM6IFdhaXRpbmdSb29tVXNlcltdID0gW107XG4gIHB1YmxpYyBvd25lckhhc0pvaW5lZCA9IGZhbHNlO1xuICBwdWJsaWMgaGFzVmlkZW9TdHJlYW0gPSBmYWxzZTtcbiAgcHVibGljIGRpc21pc3NlZFVzZXJzOiBudW1iZXJbXSA9IFtdO1xuICBwdWJsaWMgc2hvd0xvY2F0aW9uUGFuZWwgPSB0cnVlOyAvLyBTaG93IGJ5IGRlZmF1bHQgZm9yIG93bmVycywgd2lsbCBiZSB1cGRhdGVkIGJhc2VkIG9uIHVzZXIncyBsb2NhdGlvbiBzdGF0dXNcbiAgcHVibGljIHVzZXJIYXNMb2NhdGlvbiA9IGZhbHNlOyAvLyBUcmFja3MgaWYgdGhlIHVzZXIgaGFzIHNoYXJlZCB0aGVpciBsb2NhdGlvblxuICBwdWJsaWMgZ2VvTG9jYXRpb25TdGF0dXM6ICd1bmtub3duJyB8ICdhY3RpdmUnIHwgJ2RlbmllZCcgPSAndW5rbm93bic7XG4gIFxuICAvLyBHZW8gcGFuZWwgc3RhdGVzIGZvciBvd25lclxuICBwdWJsaWMgZ2VvUmVxdWVzdEFjdGl2ZSA9IGZhbHNlOyAvLyBPd25lciBzZW50IHJlcXVlc3QsIHdhaXRpbmcgZm9yIHVzZXJcbiAgcHVibGljIGFsbEdlb0dyYW50ZWQgPSBmYWxzZTsgLy8gQWxsIHVzZXJzIHJlc3BvbmRlZCB3aXRoIGdlb1xuICBwdWJsaWMgdXNlckdlb0luZm86IFVzZXJHZW9JbmZvW10gPSBbXTsgLy8gSW5kaXZpZHVhbCB1c2VyIGdlbyBzdGF0dXNcblxuICAvLyBVc2VyIGdlbyBwYW5lbCBzdGF0ZSAoZm9yIG93bmVycylcbiAgcHVibGljIHVzZXJHZW9WaWV3U3RhdGU6IFVzZXJHZW9WaWV3U3RhdGUgPSBVc2VyR2VvVmlld1N0YXRlLkhJRERFTjtcbiAgcHVibGljIFVzZXJHZW9WaWV3U3RhdGUgPSBVc2VyR2VvVmlld1N0YXRlOyAvLyBFeHBvc2UgZW51bSB0byB0ZW1wbGF0ZVxuICBwdWJsaWMgaG9tZUljb246IFNhZmVIdG1sO1xuICBwdWJsaWMgZGV2TW9kZUVuYWJsZWQgPSBmYWxzZTsgLy8gRW5hYmxlIGRldiBjb250cm9scyBmb3IgdGVzdGluZ1xuICBwcml2YXRlIGdlb1BhbmVsRGlzbWlzc2VkID0gZmFsc2U7IC8vIFRyYWNrIGlmIG93bmVyIG1hbnVhbGx5IGNsb3NlZCB0aGUgcGFuZWxcbiAgcHJpdmF0ZSBmZWVkYmFja1Nob3duID0gZmFsc2U7IC8vIFRyYWNrIGlmIGZlZWRiYWNrIG1vZGFsIGhhcyBiZWVuIHNob3duXG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXG4gICAgcHJpdmF0ZSB0YXNTZXJ2aWNlOiBUYXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ2VvbG9jYXRpb25TZXJ2aWNlOiBHZW9sb2NhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWxcbiAgKSB7XG4gICAgdGhpcy5ob21lSWNvbiA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKFRBU19JQ09OUy5ob21lKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBTdWJzY3JpcHRpb25zKCk7XG4gICAgdGhpcy5pbml0aWFsaXplQ2FsbCgpO1xuICAgIFxuICAgIC8vIEZvciBvd25lcnM6IHNob3cgdGhlIGdlbyBwYW5lbCB0byByZXF1ZXN0IHVzZXIgbG9jYXRpb24gKHVubGVzcyBkaXNtaXNzZWQpXG4gICAgaWYgKHRoaXMuY2FuQWRtaXRVc2VycyAmJiAhdGhpcy5nZW9QYW5lbERpc21pc3NlZCkge1xuICAgICAgdGhpcy51c2VyR2VvVmlld1N0YXRlID0gVXNlckdlb1ZpZXdTdGF0ZS5JTklUSUFMO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRJbnRlcmFjdCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy50YXNTZXJ2aWNlLnJlc2V0UG9sbGluZ1N0YXRlKCk7XG5cbiAgICAvLyBPbmx5IGRpc2Nvbm5lY3QgaWYgbm90IGluIFBpUCBtb2RlIChrZWVwIHNlc3Npb24gYWxpdmUgZm9yIGZsb2F0aW5nIHdpbmRvdylcbiAgICBpZiAoIXRoaXMudGFzU2VydmljZS5pc1BpcE1vZGUoKSkge1xuICAgICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgaW50ZXJhY3QoJy5wdWJsaXNoZXItdmlldycpLnVuc2V0KCk7XG4gIH1cblxuICAvLyBQdWJsaWMgTWV0aG9kc1xuICBoYW5nVXAoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBmZWVkYmFjayBtb2RhbCB3aGVuIGNhbGwgZW5kc1xuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRmVlZGJhY2tNb2RhbCgpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG9wZW5pbmcgZmVlZGJhY2sgbW9kYWwgbXVsdGlwbGUgdGltZXNcbiAgICBpZiAodGhpcy5mZWVkYmFja1Nob3duKSB7XG4gICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdoYW5ndXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdmlkZW9DYWxsSWQgZnJvbSBpbnB1dCBvciBzZXJ2aWNlXG4gICAgY29uc3QgdmlkZW9DYWxsSWQgPSB0aGlzLnZpZGVvQ2FsbElkID8/IHRoaXMudGFzU2VydmljZS52aWRlb0NhbGxJZDtcblxuICAgIC8vIElmIG5vIHZpZGVvQ2FsbElkLCBza2lwIGZlZWRiYWNrIGFuZCBjbG9zZSBkaXJlY3RseVxuICAgIGlmICghdmlkZW9DYWxsSWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2hhbmd1cCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmVlZGJhY2tTaG93biA9IHRydWU7XG5cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGFzRmVlZGJhY2tNb2RhbENvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICBiYWNrZHJvcDogdHJ1ZSxcbiAgICAgIGtleWJvYXJkOiB0cnVlLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtZmVlZGJhY2stbW9kYWwtd3JhcHBlcicsXG4gICAgfSk7XG5cbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS52aWRlb0NhbGxJZCA9IHZpZGVvQ2FsbElkO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRlbmFudCA9IHRoaXMudGVuYW50O1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuXG4gICAgLy8gQ2xvc2UgdmlkZW9jYWxsIG1vZGFsIGFmdGVyIGZlZWRiYWNrIG1vZGFsIGlzIGNsb3NlZC9kaXNtaXNzZWRcbiAgICBtb2RhbFJlZi5yZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdoYW5ndXAnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZU11dGUoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLnRvZ2dsZU11dGUoKTtcbiAgfVxuXG4gIG1pbmltaXplKCk6IHZvaWQge1xuICAgIHRoaXMudGFzU2VydmljZS5tb3ZlTWFpblZpZGVvVG8oJ3BpcC1tYWluLXZpZGVvJyk7XG4gICAgLy8gU21hbGwgZGVsYXkgdG8gZW5zdXJlIHZpZGVvIGlzIG1vdmVkIGJlZm9yZSBjbG9zaW5nIG1vZGFsXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRhc1NlcnZpY2UuZW50ZXJQaXBNb2RlKCksIDUwKTtcbiAgfVxuXG4gIHRvZ2dsZVN3YXAoKTogdm9pZCB7XG4gICAgdGhpcy5pc1B1Ymxpc2hlclNtYWxsID0gIXRoaXMuaXNQdWJsaXNoZXJTbWFsbDtcbiAgICB0aGlzLnJlc2V0VmlkZW9Qb3NpdGlvbnMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdEludGVyYWN0KCkpO1xuICB9XG5cbiAgb25Eb3VibGVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVN3YXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IHVzZXIgY2FuIGFkbWl0IG90aGVycyAoT1dORVIsIEJBQ0tPRkZJQ0UsIG9yIE1PREVSQVRPUilcbiAgICovXG4gIGdldCBjYW5BZG1pdFVzZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLkJBQ0tPRkZJQ0UgfHxcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuQURNSU5fTUFOQUdFUiB8fFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5NQU5BR0VSXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBVc2VycyB3aXRoIHBlbmRpbmcgZ2VvIHN0YXR1cyAqL1xuICBnZXQgcGVuZGluZ1VzZXJzKCk6IFVzZXJHZW9JbmZvW10ge1xuICAgIHJldHVybiB0aGlzLnVzZXJHZW9JbmZvLmZpbHRlcih1ID0+IHUuZ2VvU3RhdHVzID09PSBHZW9TdGF0dXMuUEVORElORyk7XG4gIH1cblxuICAvKiogVXNlcnMgd2hvIGdyYW50ZWQgZ2VvICovXG4gIGdldCBncmFudGVkVXNlcnMoKTogVXNlckdlb0luZm9bXSB7XG4gICAgcmV0dXJuIHRoaXMudXNlckdlb0luZm8uZmlsdGVyKHUgPT4gdS5nZW9TdGF0dXMgPT09IEdlb1N0YXR1cy5HUkFOVEVEKTtcbiAgfVxuXG4gIC8qKiBVc2VycyB3aG8gZGVuaWVkIGdlbyAqL1xuICBnZXQgZGVuaWVkVXNlcnMoKTogVXNlckdlb0luZm9bXSB7XG4gICAgcmV0dXJuIHRoaXMudXNlckdlb0luZm8uZmlsdGVyKHUgPT4gdS5nZW9TdGF0dXMgPT09IEdlb1N0YXR1cy5ERU5JRUQpO1xuICB9XG5cbiAgLyoqIFNob3cgbG9jYXRpb24gcGFuZWwgb25seSBpZiBvd25lciBhbmQgdGhlcmUgYXJlIHVzZXJzIHdobyBoYXZlbid0IGdyYW50ZWQgKi9cbiAgZ2V0IHNob3VsZFNob3dMb2NhdGlvblBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jYW5BZG1pdFVzZXJzIHx8IHRoaXMudXNlckdlb0luZm8ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEhpZGUgaWYgYWxsIHVzZXJzIGhhdmUgZ3JhbnRlZFxuICAgIGNvbnN0IGFsbEdyYW50ZWQgPSB0aGlzLnVzZXJHZW9JbmZvLmV2ZXJ5KHUgPT4gdS5nZW9TdGF0dXMgPT09IEdlb1N0YXR1cy5HUkFOVEVEKTtcbiAgICByZXR1cm4gIWFsbEdyYW50ZWQ7XG4gIH1cblxuICAvKiogQ2hlY2sgaWYgYW55IHVzZXIgaGFzIGRlbmllZCBnZW8gKi9cbiAgZ2V0IGhhc0FueURlbmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZW5pZWRVc2Vycy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIFNob3cgdXNlciBnZW8gcGFuZWwgZm9yIG93bmVycyB3aGVuIG5vdCBoaWRkZW4gKi9cbiAgZ2V0IHNob3VsZFNob3dVc2VyR2VvUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuQWRtaXRVc2VycyAmJiB0aGlzLnVzZXJHZW9WaWV3U3RhdGUgIT09IFVzZXJHZW9WaWV3U3RhdGUuSElEREVOO1xuICB9XG5cbiAgLyoqIFNldCB1c2VyIGdlbyB2aWV3IHN0YXRlIChmb3IgZGV2IGNvbnRyb2xzIG9yIGNsb3NlIGJ1dHRvbikgKi9cbiAgc2V0VXNlckdlb1ZpZXdTdGF0ZShzdGF0ZTogVXNlckdlb1ZpZXdTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMudXNlckdlb1ZpZXdTdGF0ZSA9IHN0YXRlO1xuICAgIC8vIFRyYWNrIGlmIG93bmVyIG1hbnVhbGx5IGRpc21pc3NlZCB0aGUgcGFuZWxcbiAgICBpZiAoc3RhdGUgPT09IFVzZXJHZW9WaWV3U3RhdGUuSElEREVOKSB7XG4gICAgICB0aGlzLmdlb1BhbmVsRGlzbWlzc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRtaXQgYSB1c2VyIGZyb20gdGhlIHdhaXRpbmcgcm9vbVxuICAgKi9cbiAgYWRtaXRVc2VyKHVzZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbElkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgYWRtaXQgdXNlcjogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudGFzU2VydmljZVxuICAgICAgLm1vZGlmeVByb3h5VmlkZW9Vc2VyKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgICAgYWN0aW9uOiBVc2VyQ2FsbEFjdGlvbi5XQUlUSU5HX1JPT01fTEVBVkUsXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvLyBSZW1vdmUgdXNlciBmcm9tIHdhaXRpbmcgbGlzdCBhZnRlciBzdWNjZXNzZnVsIGFkbWl0XG4gICAgICAgICAgdGhpcy53YWl0aW5nUm9vbVVzZXJzID0gdGhpcy53YWl0aW5nUm9vbVVzZXJzLmZpbHRlcihcbiAgICAgICAgICAgICh1KSA9PiB1LnVzZXJJZCAhPT0gdXNlcklkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhZG1pdHRpbmcgdXNlcjonLCBlcnIpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzcyB0aGUgd2FpdGluZyByb29tIG5vdGlmaWNhdGlvbiBmb3IgYSB1c2VyXG4gICAqL1xuICBkaXNtaXNzV2FpdGluZ05vdGlmaWNhdGlvbih1c2VySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGlzbWlzc2VkVXNlcnMucHVzaCh1c2VySWQpO1xuICAgIHRoaXMud2FpdGluZ1Jvb21Vc2VycyA9IHRoaXMud2FpdGluZ1Jvb21Vc2Vycy5maWx0ZXIoXG4gICAgICAodSkgPT4gdS51c2VySWQgIT09IHVzZXJJZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGxvY2F0aW9uIHBhbmVsXG4gICAqL1xuICBjbG9zZUxvY2F0aW9uUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TG9jYXRpb25QYW5lbCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHVzZXIgdG8gc2hhcmUgdGhlaXIgbG9jYXRpb24gKGNhbGxlZCBieSBvd25lcilcbiAgICovXG4gIHJlcXVlc3RVc2VyTG9jYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZGVvQ2FsbElkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgcmVxdWVzdCBsb2NhdGlvbjogdmlkZW9DYWxsSWQgbm90IHNldCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBib2R5OiBQcm94eVZpZGVvVXNlck1vZGlmeVJlcXVlc3QgPSB7XG4gICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgIGFjdGlvbjogVXNlckNhbGxBY3Rpb24uUkVRVUVTVF9HRU9MT0NBTElaQVRJT04sXG4gICAgfTtcblxuICAgIHRoaXMudGFzU2VydmljZS5tb2RpZnlQcm94eVZpZGVvVXNlcihib2R5KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnTG9jYXRpb24gcmVxdWVzdCBzZW50Jyk7XG4gICAgICAgIC8vIFNldCBwYW5lbCB0byB2ZXJpZnlpbmcgc3RhdGUgd2hpbGUgd2FpdGluZyBmb3IgdXNlciByZXNwb25zZVxuICAgICAgICB0aGlzLnVzZXJHZW9WaWV3U3RhdGUgPSBVc2VyR2VvVmlld1N0YXRlLlZFUklGWUlORztcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignRXJyb3IgcmVxdWVzdGluZyBsb2NhdGlvbjonLCBlcnIpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBNZXRob2RzXG4gIHByaXZhdGUgc2V0dXBTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIENhbGwgc3RhdGUgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5jYWxsU3RhdGUkLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSBDYWxsU3RhdGUuRElTQ09OTkVDVEVEKSB7XG4gICAgICAgICAgdGhpcy5vcGVuRmVlZGJhY2tNb2RhbCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyYWNrIGlmIHdlIGhhdmUgYW4gYWN0aXZlIHZpZGVvIHN0cmVhbVxuICAgICAgICB0aGlzLmhhc1ZpZGVvU3RyZWFtID0gc3RhdGUgPT09IENhbGxTdGF0ZS5DT05ORUNURUQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBWaWV3IG1vZGUgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS52aWV3TW9kZSQuc3Vic2NyaWJlKChtb2RlKSA9PiB7XG4gICAgICAgIGlmIChtb2RlID09PSBWaWV3TW9kZS5QSVApIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdwaXAnKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gTXV0ZSBzdGF0ZSBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmlzTXV0ZWQkLnN1YnNjcmliZSgobXV0ZWQpID0+IHtcbiAgICAgICAgdGhpcy5pc011dGVkID0gbXV0ZWQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBXYWl0aW5nIHJvb20gdXNlcnMgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS53YWl0aW5nUm9vbVVzZXJzJC5zdWJzY3JpYmUoKHVzZXJzKSA9PiB7XG4gICAgICAgIC8vIEZpbHRlciBvdXQgZGlzbWlzc2VkIHVzZXJzXG4gICAgICAgIHRoaXMud2FpdGluZ1Jvb21Vc2VycyA9IHVzZXJzLmZpbHRlcihcbiAgICAgICAgICAodSkgPT4gIXRoaXMuZGlzbWlzc2VkVXNlcnMuaW5jbHVkZXModS51c2VySWQpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBPd25lciBqb2luIHN0YXR1cyBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLm93bmVySGFzSm9pbmVkJC5zdWJzY3JpYmUoKGpvaW5lZCkgPT4ge1xuICAgICAgICB0aGlzLm93bmVySGFzSm9pbmVkID0gam9pbmVkO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gT3duZXIgbGVmdCBzdWJzY3JpcHRpb24gLSBkaXNjb25uZWN0IG5vbi1vd25lcnNcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLm93bmVySGFzTGVmdCQuc3Vic2NyaWJlKChoYXNMZWZ0KSA9PiB7XG4gICAgICAgIGlmIChoYXNMZWZ0ICYmICF0aGlzLmNhbkFkbWl0VXNlcnMpIHsgLy8gTm9uLW93bmVyIHVzZXJcbiAgICAgICAgICAvLyBoYW5nVXAoKSB0cmlnZ2VycyBESVNDT05ORUNURUQgc3RhdGUsIHdoaWNoIG9wZW5zIGZlZWRiYWNrIG1vZGFsXG4gICAgICAgICAgLy8gdGhlbiBjbG9zZXMgdmlkZW9jYWxsIG1vZGFsIGFmdGVyIGZlZWRiYWNrIGlzIGRvbmVcbiAgICAgICAgICB0aGlzLmhhbmdVcCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBBY3RpdmF0ZUdlbyBzdWJzY3JpcHRpb24gLSBvbmx5IGZvciBub24tb3duZXJzICh1c2VycylcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmFjdGl2YXRlR2VvJC5zdWJzY3JpYmUoKGFjdGl2YXRlR2VvKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmF0ZUdlbyAmJiAhdGhpcy5jYW5BZG1pdFVzZXJzKSB7XG5cbiAgICAgICAgICB0aGlzLmhhbmRsZUFjdGl2YXRlR2VvKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIEdlb1JlcXVlc3RBY3RpdmUgc3Vic2NyaXB0aW9uIC0gZm9yIG93bmVyc1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2UuZ2VvUmVxdWVzdEFjdGl2ZSQuc3Vic2NyaWJlKChhY3RpdmUpID0+IHtcblxuICAgICAgICB0aGlzLmdlb1JlcXVlc3RBY3RpdmUgPSBhY3RpdmU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBBbGxHZW9HcmFudGVkIHN1YnNjcmlwdGlvbiAtIGZvciBvd25lcnMgdG8gdXBkYXRlIHBhbmVsIHN0YXRlXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS5hbGxHZW9HcmFudGVkJC5zdWJzY3JpYmUoKGdyYW50ZWQpID0+IHtcbiAgICAgICAgdGhpcy5hbGxHZW9HcmFudGVkID0gZ3JhbnRlZDtcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciBvd25lcnM6IHVwZGF0ZSBwYW5lbCBzdGF0ZSBiYXNlZCBvbiBnZW8gc3RhdHVzXG4gICAgICAgIGlmICh0aGlzLmNhbkFkbWl0VXNlcnMgJiYgZ3JhbnRlZCkge1xuICAgICAgICAgIHRoaXMudXNlckdlb1ZpZXdTdGF0ZSA9IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZJRUQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFVzZXJHZW9JbmZvIHN1YnNjcmlwdGlvbiAtIGZvciBvd25lciBnZW8gcGFuZWxcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLnVzZXJHZW9JbmZvJC5zdWJzY3JpYmUoKGluZm8pID0+IHtcbiAgICAgICAgdGhpcy51c2VyR2VvSW5mbyA9IGluZm87XG4gICAgICAgIC8vIE5vdGU6IFdlIGRvbid0IGF1dG8tc3dpdGNoIHRvIERFTklFRCBoZXJlIC0gdGhhdCBvbmx5IGhhcHBlbnMgXG4gICAgICAgIC8vIGFmdGVyIG93bmVyIHJlcXVlc3RzIGFuZCB1c2VyIGRlbmllcyAodmlhIGdlb1JlcXVlc3RBY3RpdmUgZmxvdylcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYWN0aXZhdGVHZW8gcmVxdWVzdCBmcm9tIGJhY2tlbmQgKGZvciBub24tb3duZXIgdXNlcnMpLlxuICAgKiBEaXJlY3RseSBwcm9tcHRzIGJyb3dzZXIgZm9yIGdlb2xvY2F0aW9uIC0gbm8gcGFuZWwgZm9yIHVzZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVBY3RpdmF0ZUdlbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDbGVhciBhbnkgY2FjaGVkIHBvc2l0aW9uIHRvIGZvcmNlIHJlLXByb21wdGluZ1xuICAgIHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmNsZWFyQ2FjaGUoKTtcbiAgICBcbiAgICAvLyBSZXF1ZXN0IGdlb2xvY2F0aW9uIGZyb20gdXNlciAoYnJvd3NlciB3aWxsIHByb21wdClcbiAgICBjb25zdCBwb3NpdGlvbiA9IGF3YWl0IHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRQb3NpdGlvbigpO1xuICAgIFxuICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgdGhpcy5nZW9Mb2NhdGlvblN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgdGhpcy5yZXBvcnRHZW9TdGF0dXMocG9zaXRpb24ubGF0aXR1ZGUsIHBvc2l0aW9uLmxvbmdpdHVkZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2VvTG9jYXRpb25TdGF0dXMgPSAnZGVuaWVkJztcbiAgICAgIHRoaXMuZGVueUdlb0xvY2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0YXJ0IGdlb2xvY2F0aW9uIHZlcmlmaWNhdGlvbiAoY2FsbGVkIGZyb20gdGVtcGxhdGUgYnV0dG9uKSAqL1xuICBwdWJsaWMgYXN5bmMgc3RhcnRHZW9WZXJpZmljYXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy51c2VyR2VvVmlld1N0YXRlID0gVXNlckdlb1ZpZXdTdGF0ZS5WRVJJRllJTkc7XG5cbiAgICAvLyBDbGVhciBhbnkgY2FjaGVkIHBvc2l0aW9uIHRvIGZvcmNlIHJlLXByb21wdGluZ1xuICAgIHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmNsZWFyQ2FjaGUoKTtcbiAgICBcbiAgICAvLyBSZXF1ZXN0IGdlb2xvY2F0aW9uIGZyb20gdXNlciAoYnJvd3NlciB3aWxsIHByb21wdClcbiAgICBjb25zdCBwb3NpdGlvbiA9IGF3YWl0IHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRQb3NpdGlvbigpO1xuICAgIFxuICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgdGhpcy5nZW9Mb2NhdGlvblN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgdGhpcy51c2VyR2VvVmlld1N0YXRlID0gVXNlckdlb1ZpZXdTdGF0ZS5WRVJJRklFRDtcbiAgICAgIHRoaXMucmVwb3J0R2VvU3RhdHVzKHBvc2l0aW9uLmxhdGl0dWRlLCBwb3NpdGlvbi5sb25naXR1ZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdlb0xvY2F0aW9uU3RhdHVzID0gJ2RlbmllZCc7XG4gICAgICB0aGlzLnVzZXJHZW9WaWV3U3RhdGUgPSBVc2VyR2VvVmlld1N0YXRlLkRFTklFRDtcbiAgICAgIHRoaXMuZGVueUdlb0xvY2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBncmFudGVkIGdlb2xvY2F0aW9uIHRvIGJhY2tlbmQuXG4gICAqIElNUE9SVEFOVDogT25seSBjYWxsIHdpdGggdmFsaWQgY29vcmRpbmF0ZXMuXG4gICAqL1xuICBwcml2YXRlIHJlcG9ydEdlb1N0YXR1cyhsYXRpdHVkZTogbnVtYmVyLCBsb25naXR1ZGU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWRlb0NhbGxJZCkge1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY29vcmRpbmF0ZXMgYXJlIHByZXNlbnRcbiAgICBpZiAobGF0aXR1ZGUgPT09IHVuZGVmaW5lZCB8fCBsYXRpdHVkZSA9PT0gbnVsbCB8fCBsb25naXR1ZGUgPT09IHVuZGVmaW5lZCB8fCBsb25naXR1ZGUgPT09IG51bGwpIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHk6IFByb3h5VmlkZW9Vc2VyTW9kaWZ5UmVxdWVzdCA9IHtcbiAgICAgIHVzZXJJZDogdGhpcy51c2VySWQsXG4gICAgICB2aWRlb0NhbGxJZDogdGhpcy52aWRlb0NhbGxJZCxcbiAgICAgIGFjdGlvbjogVXNlckNhbGxBY3Rpb24uQUNUSVZBVEVfR0VPTE9DQVRJT04sXG4gICAgICBsYXRpdHVkZSxcbiAgICAgIGxvbmdpdHVkZSxcbiAgICB9O1xuXG5cbiAgICB0aGlzLnRhc1NlcnZpY2UubW9kaWZ5UHJveHlWaWRlb1VzZXIoYm9keSkuc3Vic2NyaWJlKHtcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBkZW5pZWQgZ2VvbG9jYXRpb24gdG8gYmFja2VuZC5cbiAgICovXG4gIHByaXZhdGUgZGVueUdlb0xvY2F0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWRlb0NhbGxJZCkge1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm9keTogUHJveHlWaWRlb1VzZXJNb2RpZnlSZXF1ZXN0ID0ge1xuICAgICAgdXNlcklkOiB0aGlzLnVzZXJJZCxcbiAgICAgIHZpZGVvQ2FsbElkOiB0aGlzLnZpZGVvQ2FsbElkLFxuICAgICAgYWN0aW9uOiBVc2VyQ2FsbEFjdGlvbi5ERU5ZX0dFT0xPQ0FUSU9OLFxuICAgIH07XG5cblxuICAgIHRoaXMudGFzU2VydmljZS5tb2RpZnlQcm94eVZpZGVvVXNlcihib2R5KS5zdWJzY3JpYmUoe1xuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVDYWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUmV0dXJuaW5nRnJvbVBpcCkge1xuICAgICAgLy8gUmV0dXJuaW5nIGZyb20gUGlQIC0ganVzdCBtb3ZlIHZpZGVvcyBiYWNrXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGFzU2VydmljZS5tb3ZlVmlkZW9zVG9GdWxsc2NyZWVuKCksIDEwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlc3Npb25JZCAmJiB0aGlzLnRva2VuKSB7XG4gICAgICAvLyBOZXcgY2FsbCAtIGNvbm5lY3QgdG8gc2Vzc2lvblxuICAgICAgdGhpcy50YXNTZXJ2aWNlXG4gICAgICAgIC5jb25uZWN0U2Vzc2lvbihcbiAgICAgICAgICB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgICB0aGlzLnRva2VuLFxuICAgICAgICAgICdwdWJsaXNoZXItY29udGFpbmVyJyxcbiAgICAgICAgICAnc3Vic2NyaWJlci1jb250YWluZXInLFxuICAgICAgICAgIHRoaXMuYnVzaW5lc3NSb2xlXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjb25uZWN0aW5nIHRvIHZpZGVvIGNhbGw6JywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFN0YXJ0IHN0YXR1cyBwb2xsaW5nIHdpdGggc2hvcnRlciBpbnRlcnZhbCAoNXMpIHRvIGRldGVjdCBvd25lciBsZWF2aW5nL2xvY2F0aW9uIHJlcXVlc3RzXG4gICAgICBpZiAodGhpcy5hcHBvaW50bWVudElkKSB7XG4gICAgICAgIHRoaXMudGFzU2VydmljZS5zdGFydFN0YXR1c1BvbGxpbmcoe1xuICAgICAgICAgIGFwcG9pbnRtZW50SWQ6IHRoaXMuYXBwb2ludG1lbnRJZCxcbiAgICAgICAgICB0ZW5hbnQ6IHRoaXMudGVuYW50LFxuICAgICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICAgICAgcm9vbVR5cGU6IHVuZGVmaW5lZCwgLy8gUm9vbVR5cGUgbWlnaHQgYmUgbmVlZGVkIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGVudGl0eUlkOiB1bmRlZmluZWQsIC8vIEVudGl0eUlkIG1pZ2h0IGJlIG5lZWRlZCBpZiBhdmFpbGFibGVcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkXG4gICAgICAgIH0sIDUwMDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRWaWRlb1Bvc2l0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBwdWJsaXNoZXJFbCA9IHRoaXMucHVibGlzaGVyQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHN1YnNjcmliZXJFbCA9IHRoaXMuc3Vic2NyaWJlckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmIChwdWJsaXNoZXJFbCkge1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXgnKTtcbiAgICAgIHB1Ymxpc2hlckVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS15Jyk7XG4gICAgfVxuXG4gICAgaWYgKHN1YnNjcmliZXJFbCkge1xuICAgICAgc3Vic2NyaWJlckVsLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgIHN1YnNjcmliZXJFbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEteCcpO1xuICAgICAgc3Vic2NyaWJlckVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS15Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0SW50ZXJhY3QoKTogdm9pZCB7XG4gICAgaW50ZXJhY3QoJy5wdWJsaXNoZXItdmlldycpLnVuc2V0KCk7XG5cbiAgICBpbnRlcmFjdCgnLnB1Ymxpc2hlci12aWV3JylcbiAgICAgIC5kcmFnZ2FibGUoe1xuICAgICAgICBpbmVydGlhOiB0cnVlLFxuICAgICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAgICBpbnRlcmFjdC5tb2RpZmllcnMucmVzdHJpY3RSZWN0KHtcbiAgICAgICAgICAgIHJlc3RyaWN0aW9uOiAncGFyZW50JyxcbiAgICAgICAgICAgIGVuZE9ubHk6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICAgIGF1dG9TY3JvbGw6IHRydWUsXG4gICAgICAgIGxpc3RlbmVyczoge1xuICAgICAgICAgIG1vdmU6IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgY29uc3QgeCA9IChwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEteCcpKSB8fCAwKSArIGV2ZW50LmR4O1xuICAgICAgICAgICAgY29uc3QgeSA9IChwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEteScpKSB8fCAwKSArIGV2ZW50LmR5O1xuXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3h9cHgsICR7eX1weClgO1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS14JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteScsIFN0cmluZyh5KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAucmVzaXphYmxlKHtcbiAgICAgICAgZWRnZXM6IHsgbGVmdDogZmFsc2UsIHJpZ2h0OiB0cnVlLCBib3R0b206IHRydWUsIHRvcDogZmFsc2UgfSxcbiAgICAgICAgbGlzdGVuZXJzOiB7XG4gICAgICAgICAgbW92ZTogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBsZXQgeCA9IHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS14JykpIHx8IDA7XG4gICAgICAgICAgICBsZXQgeSA9IHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS15JykpIHx8IDA7XG5cbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS53aWR0aCA9IGAke2V2ZW50LnJlY3Qud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IGAke2V2ZW50LnJlY3QuaGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgeCArPSBldmVudC5kZWx0YVJlY3QubGVmdDtcbiAgICAgICAgICAgIHkgKz0gZXZlbnQuZGVsdGFSZWN0LnRvcDtcblxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHt4fXB4LCAke3l9cHgpYDtcbiAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteCcsIFN0cmluZyh4KSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXknLCBTdHJpbmcoeSkpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdEVkZ2VzKHsgb3V0ZXI6ICdwYXJlbnQnIH0pLFxuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdFNpemUoeyBtaW46IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxMDAgfSB9KSxcbiAgICAgICAgICBpbnRlcmFjdC5tb2RpZmllcnMuYXNwZWN0UmF0aW8oeyByYXRpbzogJ3ByZXNlcnZlJyB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5lcnRpYTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFzLXZpZGVvY2FsbC13cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ0YXMtdmlkZW9jYWxsLWNvbnRhaW5lclwiPlxuICAgIDwhLS0gU3Vic2NyaWJlciB2aWRlbyAobGFyZ2UsIGJhY2tncm91bmQpIC0tPlxuICAgIDxkaXZcbiAgICAgIGlkPVwic3Vic2NyaWJlci1jb250YWluZXJcIlxuICAgICAgW2NsYXNzLnN1YnNjcmliZXItdmlld109XCJpc1B1Ymxpc2hlclNtYWxsXCJcbiAgICAgIFtjbGFzcy5wdWJsaXNoZXItdmlld109XCIhaXNQdWJsaXNoZXJTbWFsbFwiXG4gICAgICAjc3Vic2NyaWJlckNvbnRhaW5lclxuICAgICAgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2soKVwiXG4gICAgPjwvZGl2PlxuXG4gICAgPCEtLSBQdWJsaXNoZXIgdmlkZW8gKHNtYWxsLCBvdmVybGF5KSAtLT5cbiAgICA8ZGl2XG4gICAgICBpZD1cInB1Ymxpc2hlci1jb250YWluZXJcIlxuICAgICAgW2NsYXNzLnB1Ymxpc2hlci12aWV3XT1cImlzUHVibGlzaGVyU21hbGxcIlxuICAgICAgW2NsYXNzLnN1YnNjcmliZXItdmlld109XCIhaXNQdWJsaXNoZXJTbWFsbFwiXG4gICAgICAjcHVibGlzaGVyQ29udGFpbmVyXG4gICAgICAoZGJsY2xpY2spPVwib25Eb3VibGVDbGljaygpXCJcbiAgICA+PC9kaXY+XG5cbiAgICA8IS0tIENlbnRlcmVkIGF2YXRhciAoc2hvd24gd2hlbiBubyB2aWRlbyBzdHJlYW0pIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItY29udGFpbmVyXCIgKm5nSWY9XCIhaGFzVmlkZW9TdHJlYW1cIj5cbiAgICAgIDx0YXMtYXZhdGFyIFtuYW1lXT1cInBhcnRpY2lwYW50TmFtZVwiIFtzaXplXT1cIjgwXCI+PC90YXMtYXZhdGFyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDb250cm9scyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbHMtY29udGFpbmVyXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGNvbnRyb2wtYnRuIG11dGUtYnRuXCJcbiAgICAgICAgW2NsYXNzLm11dGVkXT1cImlzTXV0ZWRcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlTXV0ZSgpXCJcbiAgICAgICAgW3RpdGxlXT1cImlzTXV0ZWQgPyAnQWN0aXZhciBtaWNyw7Nmb25vJyA6ICdTaWxlbmNpYXIgbWljcsOzZm9ubydcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImlzTXV0ZWQgPyAnQWN0aXZhciBtaWNyw7Nmb25vJyA6ICdTaWxlbmNpYXIgbWljcsOzZm9ubydcIlxuICAgICAgPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiZmFcIlxuICAgICAgICAgIFtjbGFzcy5mYS1taWNyb3Bob25lXT1cIiFpc011dGVkXCJcbiAgICAgICAgICBbY2xhc3MuZmEtbWljcm9waG9uZS1zbGFzaF09XCJpc011dGVkXCJcbiAgICAgICAgPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBjb250cm9sLWJ0biBzd2FwLWJ0blwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVTd2FwKClcIlxuICAgICAgICB0aXRsZT1cIkludGVyY2FtYmlhciB2aXN0YVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJJbnRlcmNhbWJpYXIgdmlzdGFcIlxuICAgICAgPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXJlZnJlc2hcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gY29udHJvbC1idG4gcGlwLWJ0blwiXG4gICAgICAgIChjbGljayk9XCJtaW5pbWl6ZSgpXCJcbiAgICAgICAgdGl0bGU9XCJNaW5pbWl6YXIgKFBpY3R1cmUgaW4gUGljdHVyZSlcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiTWluaW1pemFyIHZpZGVvbGxhbWFkYVwiXG4gICAgICA+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29tcHJlc3NcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gY29udHJvbC1idG4gaGFuZ3VwLWJ0blwiXG4gICAgICAgIChjbGljayk9XCJoYW5nVXAoKVwiXG4gICAgICAgIHRpdGxlPVwiRmluYWxpemFyIGxsYW1hZGFcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiRmluYWxpemFyIGxsYW1hZGFcIlxuICAgICAgPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBob25lXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFdhaXRpbmcgcm9vbSBub3RpZmljYXRpb24gKHNob3duIGZvciBPV05FUi9CQUNLT0ZGSUNFIG9ubHkpIC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwid2FpdGluZy1ub3RpZmljYXRpb25cIlxuICAgICAgKm5nSWY9XCJ3YWl0aW5nUm9vbVVzZXJzLmxlbmd0aCA+IDAgJiYgY2FuQWRtaXRVc2Vyc1wiXG4gICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cIndhaXRpbmctdGV4dFwiPlxuICAgICAgICB7eyB3YWl0aW5nUm9vbVVzZXJzWzBdLm5hbWUgfX0gZXN0w6EgZW4gbGEgc2FsYSBkZSBlc3BlcmEuXG4gICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYWRtaXQtYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cImFkbWl0VXNlcih3YWl0aW5nUm9vbVVzZXJzWzBdLnVzZXJJZClcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQWRtaXRpciB1c3VhcmlvXCJcbiAgICAgID5cbiAgICAgICAgQWRtaXRpclxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiZGlzbWlzcy1idG5cIlxuICAgICAgICAoY2xpY2spPVwiZGlzbWlzc1dhaXRpbmdOb3RpZmljYXRpb24od2FpdGluZ1Jvb21Vc2Vyc1swXS51c2VySWQpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNlcnJhciBub3RpZmljYWNpw7NuXCJcbiAgICAgID5cbiAgICAgICAgw5dcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIE93bmVyIGdlb2xvY2F0aW9uIHBhbmVsIChmb3Igb3duZXJzIHRvIHJlcXVlc3QgdXNlciBsb2NhdGlvbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJ1c2VyLWdlby1wYW5lbFwiICpuZ0lmPVwic2hvdWxkU2hvd1VzZXJHZW9QYW5lbCB8fCBkZXZNb2RlRW5hYmxlZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWdlby1oZWFkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItdGl0bGUtcm93XCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbWFwLW1hcmtlciBoZWFkZXItaWNvblwiICpuZ0lmPVwidXNlckdlb1ZpZXdTdGF0ZSAhPT0gVXNlckdlb1ZpZXdTdGF0ZS5JTklUSUFMXCI+PC9pPlxuICAgICAgICA8aDM+VWJpY2FjacOzbiBkZWwgY29sYWJvcmFkb3I8L2gzPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNldFVzZXJHZW9WaWV3U3RhdGUoVXNlckdlb1ZpZXdTdGF0ZS5ISURERU4pXCIgYXJpYS1sYWJlbD1cIkNlcnJhclwiPsOXPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1nZW8tZGVzY3JpcHRpb25cIiAqbmdJZj1cInVzZXJHZW9WaWV3U3RhdGUgIT09IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZJRUQgJiYgdXNlckdlb1ZpZXdTdGF0ZSAhPT0gVXNlckdlb1ZpZXdTdGF0ZS5ERU5JRURcIj5cbiAgICAgIDxwPkVsIGNvbGFib3JhZG9yIHRpZW5lIGxhIHViaWNhY2nDs24gZGVzYWN0aXZhZGEsIHNvbGljaXRhIHF1ZSBsYSBhY3RpdmUuPC9wPlxuICAgICAgPHA+RXN0YSBhY2Npw7NuIG5vcyBwZXJtaXRpcsOhIGRpc3BvbmliaWxpemFyIGFsZ3VuYXMgYWxlcnRhcy48L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1nZW8tY29udGVudFwiPlxuICAgICAgPCEtLSBJTklUSUFMIHN0YXRlOiBqdXN0IHRoZSBidXR0b24gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlckdlb1ZpZXdTdGF0ZSA9PT0gVXNlckdlb1ZpZXdTdGF0ZS5JTklUSUFMXCI+XG4gICAgICAgIDwhLS0gc3BhY2VyIC0tPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gVkVSSUZZSU5HIHN0YXRlOiBzcGlubmVyICsgbG9hZGluZyBtZXNzYWdlIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZXJHZW9WaWV3U3RhdGUgPT09IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZZSU5HXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWdlby12ZXJpZnlpbmdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvLXNwaW5uZXItbGFyZ2VcIj48L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cInZlcmlmeWluZy10aXRsZVwiPlZlcmlmaWNhbmRvIHViaWNhY2nDs24uLi48L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ2ZXJpZnlpbmctc3VidGl0bGVcIj5Fc3RvIHB1ZWRlIHRhcmRhciB1bm9zIHNlZ3VuZG9zLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBWRVJJRklFRCBzdGF0ZTogaG9tZSBpY29uIHdpdGggc3BhcmtsZXMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlckdlb1ZpZXdTdGF0ZSA9PT0gVXNlckdlb1ZpZXdTdGF0ZS5WRVJJRklFRFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1nZW8tdmVyaWZpZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVyaWZpZWQtaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaG9tZS1pY29uXCIgW2lubmVySFRNTF09XCJob21lSWNvblwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cInZlcmlmaWVkLXRpdGxlXCI+TGEgdWJpY2FjacOzbiBmdWUgdmVyaWZpY2FkYTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBERU5JRUQgc3RhdGU6IGVycm9yIGljb24gYW5kIG1lc3NhZ2UgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlckdlb1ZpZXdTdGF0ZSA9PT0gVXNlckdlb1ZpZXdTdGF0ZS5ERU5JRURcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItZ2VvLWRlbmllZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZW5pZWQtaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZGVuaWVkLXRpdGxlXCI+TGEgdWJpY2FjacOzbiBmdWUgcmVjaGF6YWRhPC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwiZGVuaWVkLXN1YnRpdGxlXCI+RWwgY29sYWJvcmFkb3Igbm8gcGVybWl0acOzIGVsIGFjY2VzbyBhIHN1IHViaWNhY2nDs24uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBCdXR0b24gKGhpZGRlbiBpbiB2ZXJpZmllZCBhbmQgZGVuaWVkIHN0YXRlcykgLS0+XG4gICAgPGJ1dHRvbiBcbiAgICAgIGNsYXNzPVwidXNlci1nZW8tYnRuXCIgXG4gICAgICAqbmdJZj1cInVzZXJHZW9WaWV3U3RhdGUgIT09IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZJRUQgJiYgdXNlckdlb1ZpZXdTdGF0ZSAhPT0gVXNlckdlb1ZpZXdTdGF0ZS5ERU5JRURcIlxuICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInVzZXJHZW9WaWV3U3RhdGUgPT09IFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZZSU5HXCJcbiAgICAgIFtkaXNhYmxlZF09XCJ1c2VyR2VvVmlld1N0YXRlID09PSBVc2VyR2VvVmlld1N0YXRlLlZFUklGWUlOR1wiXG4gICAgICAoY2xpY2spPVwicmVxdWVzdFVzZXJMb2NhdGlvbigpXCI+XG4gICAgICBWZXJpZmljYXIgdWJpY2FjacOzblxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBEZXYgY29udHJvbHMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImRldi1jb250cm9sc1wiICpuZ0lmPVwiZGV2TW9kZUVuYWJsZWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZGV2LWxhYmVsXCI+RGV2Ojwvc3Bhbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJkZXYtYnRuXCIgKGNsaWNrKT1cInNldFVzZXJHZW9WaWV3U3RhdGUoVXNlckdlb1ZpZXdTdGF0ZS5JTklUSUFMKVwiPkluaXRpYWw8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJkZXYtYnRuXCIgKGNsaWNrKT1cInNldFVzZXJHZW9WaWV3U3RhdGUoVXNlckdlb1ZpZXdTdGF0ZS5WRVJJRllJTkcpXCI+VmVyaWZ5aW5nPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZGV2LWJ0blwiIChjbGljayk9XCJzZXRVc2VyR2VvVmlld1N0YXRlKFVzZXJHZW9WaWV3U3RhdGUuVkVSSUZJRUQpXCI+VmVyaWZpZWQ8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJkZXYtYnRuXCIgKGNsaWNrKT1cInNldFVzZXJHZW9WaWV3U3RhdGUoVXNlckdlb1ZpZXdTdGF0ZS5ERU5JRUQpXCI+RGVuaWVkPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZGV2LWJ0blwiIChjbGljayk9XCJzZXRVc2VyR2VvVmlld1N0YXRlKFVzZXJHZW9WaWV3U3RhdGUuSElEREVOKVwiPkhpZGU8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19
|