tas-uell-sdk 0.0.6 → 0.1.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 +72 -3
- package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +27 -35
- package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs +109 -0
- package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +114 -8
- package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +104 -46
- package/esm2020/lib/config/tas.config.mjs +1 -1
- package/esm2020/lib/interfaces/tas.interfaces.mjs +7 -1
- package/esm2020/lib/services/geolocation.service.mjs +56 -0
- package/esm2020/lib/services/tas.service.mjs +38 -1
- package/esm2020/lib/tas-uell-sdk.module.mjs +11 -5
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/tas-uell-sdk.mjs +458 -90
- package/fesm2015/tas-uell-sdk.mjs.map +1 -1
- package/fesm2020/tas-uell-sdk.mjs +446 -89
- package/fesm2020/tas-uell-sdk.mjs.map +1 -1
- package/lib/components/tas-btn/tas-btn.component.d.ts +6 -4
- package/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.d.ts +33 -0
- package/lib/components/tas-videocall/tas-videocall.component.d.ts +27 -2
- package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +29 -8
- package/lib/config/tas.config.d.ts +3 -0
- package/lib/interfaces/tas.interfaces.d.ts +26 -2
- package/lib/services/geolocation.service.d.ts +24 -0
- package/lib/services/tas.service.d.ts +13 -1
- package/lib/tas-uell-sdk.module.d.ts +5 -3
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
import { Component, Input } from '@angular/core';
|
|
2
2
|
import { Subscription } from 'rxjs';
|
|
3
|
-
import { TasRoomType, TasBusinessRole, TasUserRole, } from '../../interfaces/tas.interfaces';
|
|
3
|
+
import { TasRoomType, TasBusinessRole, TasUserRole, UserCallAction, } from '../../interfaces/tas.interfaces';
|
|
4
4
|
import { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
7
7
|
import * as i2 from "../../services/tas.service";
|
|
8
|
-
import * as i3 from "
|
|
8
|
+
import * as i3 from "../../services/geolocation.service";
|
|
9
|
+
import * as i4 from "@angular/common";
|
|
9
10
|
export var WaitingRoomState;
|
|
10
11
|
(function (WaitingRoomState) {
|
|
11
12
|
WaitingRoomState["CHECKING_STATUS"] = "CHECKING_STATUS";
|
|
12
|
-
WaitingRoomState["
|
|
13
|
+
WaitingRoomState["WAITING_FOR_JOINABLE"] = "WAITING_FOR_JOINABLE";
|
|
13
14
|
WaitingRoomState["READY"] = "READY";
|
|
14
15
|
WaitingRoomState["GETTING_TOKEN"] = "GETTING_TOKEN";
|
|
16
|
+
WaitingRoomState["JOINING"] = "JOINING";
|
|
15
17
|
WaitingRoomState["ERROR"] = "ERROR";
|
|
16
18
|
})(WaitingRoomState || (WaitingRoomState = {}));
|
|
17
19
|
export class TasWaitingRoomComponent {
|
|
18
|
-
constructor(activeModal, tasService, modalService, cdr) {
|
|
20
|
+
constructor(activeModal, tasService, geolocationService, modalService, cdr) {
|
|
19
21
|
this.activeModal = activeModal;
|
|
20
22
|
this.tasService = tasService;
|
|
23
|
+
this.geolocationService = geolocationService;
|
|
21
24
|
this.modalService = modalService;
|
|
22
25
|
this.cdr = cdr;
|
|
23
26
|
// Status endpoint params
|
|
@@ -27,6 +30,7 @@ export class TasWaitingRoomComponent {
|
|
|
27
30
|
this.state = WaitingRoomState.CHECKING_STATUS;
|
|
28
31
|
this.WaitingRoomState = WaitingRoomState; // Expose enum to template
|
|
29
32
|
this.errorMessage = '';
|
|
33
|
+
this.isJoinable = false;
|
|
30
34
|
// Session data from status response
|
|
31
35
|
this.resolvedSessionId = '';
|
|
32
36
|
this.resolvedAppointmentId = null;
|
|
@@ -35,6 +39,8 @@ export class TasWaitingRoomComponent {
|
|
|
35
39
|
// Subscriptions
|
|
36
40
|
this.subscriptions = new Subscription();
|
|
37
41
|
this.videoCallModalRef = null;
|
|
42
|
+
// Geolocation
|
|
43
|
+
this.geoPosition = null;
|
|
38
44
|
}
|
|
39
45
|
/** Whether current user is an owner */
|
|
40
46
|
get isOwner() {
|
|
@@ -42,8 +48,69 @@ export class TasWaitingRoomComponent {
|
|
|
42
48
|
}
|
|
43
49
|
ngOnInit() {
|
|
44
50
|
console.log('[TAS DEBUG] TasWaitingRoomComponent.ngOnInit');
|
|
51
|
+
this.requestMediaPermissions();
|
|
52
|
+
this.requestGeolocation();
|
|
45
53
|
this.checkStatus();
|
|
46
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Request camera and microphone permissions.
|
|
57
|
+
*/
|
|
58
|
+
async requestMediaPermissions() {
|
|
59
|
+
console.log('[TAS DEBUG] Requesting media permissions...');
|
|
60
|
+
try {
|
|
61
|
+
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
|
|
62
|
+
// Stop tracks immediately - we just needed the permission
|
|
63
|
+
stream.getTracks().forEach(track => track.stop());
|
|
64
|
+
console.log('[TAS DEBUG] Media permissions granted');
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.warn('[TAS DEBUG] Media permissions denied or unavailable:', error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Request geolocation immediately on init.
|
|
72
|
+
* Only for regular users (not owners/backoffice).
|
|
73
|
+
* If user allows, store position and send to backend.
|
|
74
|
+
*/
|
|
75
|
+
async requestGeolocation() {
|
|
76
|
+
// Only request geolocation for regular users, not owners/backoffice
|
|
77
|
+
if (this.isOwner || this.isBackoffice) {
|
|
78
|
+
console.log('[TAS DEBUG] Skipping geolocation for owner/backoffice');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
console.log('[TAS DEBUG] Requesting geolocation...');
|
|
82
|
+
const position = await this.geolocationService.getCurrentPosition();
|
|
83
|
+
if (position) {
|
|
84
|
+
console.log('[TAS DEBUG] Geolocation obtained:', position);
|
|
85
|
+
this.geoPosition = position;
|
|
86
|
+
// Send to backend when videoCallId is available
|
|
87
|
+
this.sendGeolocationToBackend();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.log('[TAS DEBUG] Geolocation denied or unavailable');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Send geolocation to backend via modify user endpoint.
|
|
95
|
+
* NOTE: Endpoint call is prepared but may not be active yet.
|
|
96
|
+
*/
|
|
97
|
+
sendGeolocationToBackend() {
|
|
98
|
+
if (!this.geoPosition || !this.videoCallId) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
console.log('[TAS DEBUG] Sending geolocation to backend...');
|
|
102
|
+
const body = {
|
|
103
|
+
userId: this.currentUser?.id,
|
|
104
|
+
videoCallId: this.videoCallId,
|
|
105
|
+
action: UserCallAction.ACTIVATE_GEOLOCATION,
|
|
106
|
+
latitude: this.geoPosition.latitude,
|
|
107
|
+
longitude: this.geoPosition.longitude,
|
|
108
|
+
};
|
|
109
|
+
this.tasService.modifyProxyVideoUser(body).subscribe({
|
|
110
|
+
next: () => console.log('[TAS DEBUG] Geolocation sent successfully'),
|
|
111
|
+
error: (err) => console.error('[TAS DEBUG] Failed to send geolocation:', err),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
47
114
|
ngOnDestroy() {
|
|
48
115
|
console.log('[TAS DEBUG] TasWaitingRoomComponent.ngOnDestroy');
|
|
49
116
|
this.subscriptions.unsubscribe();
|
|
@@ -77,6 +144,8 @@ export class TasWaitingRoomComponent {
|
|
|
77
144
|
this.resolvedAppointmentId = content.appointmentId;
|
|
78
145
|
this.videoCallId = content.videoCallId;
|
|
79
146
|
console.log('[TAS DEBUG] Status response:', content);
|
|
147
|
+
// Try to send geolocation now that we have videoCallId
|
|
148
|
+
this.sendGeolocationToBackend();
|
|
80
149
|
// Start polling for status updates
|
|
81
150
|
this.tasService.startStatusPolling(statusParams);
|
|
82
151
|
// Subscribe to joinable status
|
|
@@ -98,36 +167,33 @@ export class TasWaitingRoomComponent {
|
|
|
98
167
|
console.log('[TAS DEBUG] handleJoinableChange called', {
|
|
99
168
|
joinable,
|
|
100
169
|
currentState: this.state,
|
|
101
|
-
isOwner: this.isOwner,
|
|
102
|
-
isBackoffice: this.isBackoffice,
|
|
103
170
|
resolvedSessionId: this.resolvedSessionId,
|
|
104
171
|
});
|
|
105
|
-
|
|
172
|
+
this.isJoinable = joinable;
|
|
173
|
+
// Don't update state if already getting token, joining, or in error
|
|
106
174
|
if (this.state === WaitingRoomState.GETTING_TOKEN ||
|
|
107
|
-
this.state === WaitingRoomState.
|
|
175
|
+
this.state === WaitingRoomState.JOINING ||
|
|
108
176
|
this.state === WaitingRoomState.ERROR) {
|
|
109
177
|
console.log('[TAS DEBUG] Skipping state update - already in:', this.state);
|
|
110
178
|
return;
|
|
111
179
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
this.getTokenForOwner();
|
|
117
|
-
}
|
|
180
|
+
// Both users and owners: show join button based on joinable
|
|
181
|
+
if (joinable) {
|
|
182
|
+
console.log('[TAS DEBUG] Joinable is true, showing join button');
|
|
183
|
+
this.state = WaitingRoomState.READY;
|
|
118
184
|
}
|
|
119
185
|
else {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
console.log('[TAS DEBUG] Non-owner: joinable is true, getting token');
|
|
123
|
-
this.getTokenForOwner(); // Also get token when joinable
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
console.log('[TAS DEBUG] Non-owner: waiting for owner');
|
|
127
|
-
this.state = WaitingRoomState.WAITING_FOR_OWNER;
|
|
128
|
-
this.cdr.detectChanges();
|
|
129
|
-
}
|
|
186
|
+
console.log('[TAS DEBUG] Waiting for joinable...');
|
|
187
|
+
this.state = WaitingRoomState.WAITING_FOR_JOINABLE;
|
|
130
188
|
}
|
|
189
|
+
this.cdr.detectChanges();
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Called when user clicks the join button.
|
|
193
|
+
* Calls /start to get token then auto-joins.
|
|
194
|
+
*/
|
|
195
|
+
joinSession() {
|
|
196
|
+
this.startSessionAndJoin();
|
|
131
197
|
}
|
|
132
198
|
/**
|
|
133
199
|
* Check if user has owner/backoffice role
|
|
@@ -138,9 +204,9 @@ export class TasWaitingRoomComponent {
|
|
|
138
204
|
this.businessRole === TasBusinessRole.MANAGER);
|
|
139
205
|
}
|
|
140
206
|
/**
|
|
141
|
-
*
|
|
207
|
+
* Start session and join - called when user clicks join button
|
|
142
208
|
*/
|
|
143
|
-
|
|
209
|
+
startSessionAndJoin() {
|
|
144
210
|
if (!this.resolvedSessionId) {
|
|
145
211
|
this.state = WaitingRoomState.ERROR;
|
|
146
212
|
this.errorMessage = 'Session ID not available';
|
|
@@ -169,10 +235,14 @@ export class TasWaitingRoomComponent {
|
|
|
169
235
|
this.cdr.detectChanges();
|
|
170
236
|
return;
|
|
171
237
|
}
|
|
172
|
-
console.log('[TAS DEBUG] Token obtained successfully');
|
|
238
|
+
console.log('[TAS DEBUG] Token obtained successfully, joining session...');
|
|
173
239
|
this.token = tokenResponse.content.token;
|
|
174
|
-
this.state = WaitingRoomState.
|
|
240
|
+
this.state = WaitingRoomState.JOINING;
|
|
175
241
|
this.cdr.detectChanges();
|
|
242
|
+
// Auto-join immediately
|
|
243
|
+
this.tasService.stopStatusPolling();
|
|
244
|
+
this.activeModal.close('joining');
|
|
245
|
+
this.openVideoCallModal();
|
|
176
246
|
},
|
|
177
247
|
error: (err) => {
|
|
178
248
|
console.error('[TAS DEBUG] /start request failed:', err);
|
|
@@ -184,19 +254,6 @@ export class TasWaitingRoomComponent {
|
|
|
184
254
|
},
|
|
185
255
|
}));
|
|
186
256
|
}
|
|
187
|
-
/**
|
|
188
|
-
* Join the session - token already obtained
|
|
189
|
-
*/
|
|
190
|
-
joinSession() {
|
|
191
|
-
if (!this.resolvedSessionId || !this.token) {
|
|
192
|
-
this.errorMessage = 'Session not ready';
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
// Close waiting room and open video call
|
|
196
|
-
this.tasService.stopStatusPolling();
|
|
197
|
-
this.activeModal.close('joining');
|
|
198
|
-
this.openVideoCallModal();
|
|
199
|
-
}
|
|
200
257
|
/**
|
|
201
258
|
* Closes the waiting room
|
|
202
259
|
*/
|
|
@@ -224,6 +281,7 @@ export class TasWaitingRoomComponent {
|
|
|
224
281
|
this.videoCallModalRef.componentInstance.token = this.token;
|
|
225
282
|
this.videoCallModalRef.componentInstance.appointmentId = this.resolvedAppointmentId;
|
|
226
283
|
this.videoCallModalRef.componentInstance.videoCallId = this.videoCallId;
|
|
284
|
+
this.videoCallModalRef.componentInstance.userId = this.currentUser?.id;
|
|
227
285
|
this.videoCallModalRef.componentInstance.tenant = this.tenant;
|
|
228
286
|
this.videoCallModalRef.componentInstance.businessRole = this.businessRole;
|
|
229
287
|
this.videoCallModalRef.componentInstance.isReturningFromPip = false;
|
|
@@ -234,12 +292,12 @@ export class TasWaitingRoomComponent {
|
|
|
234
292
|
});
|
|
235
293
|
}
|
|
236
294
|
}
|
|
237
|
-
TasWaitingRoomComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasWaitingRoomComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TasService }, { token: i1.NgbModal }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
238
|
-
TasWaitingRoomComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasWaitingRoomComponent, selector: "tas-waiting-room", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser" }, ngImport: i0, template: "<div class=\"tas-waiting-room\">\n <!-- Header -->\n <div class=\"waiting-room-header\">\n <h2 class=\"header-title\">Iniciar turno</h2>\n <button type=\"button\" class=\"close-btn\" (click)=\"cancel()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"waiting-room-content\">\n <!-- CHECKING_STATUS State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.CHECKING_STATUS\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Verificando estado de la sesi\u00F3n...</p>\n </div>\n\n <!--
|
|
295
|
+
TasWaitingRoomComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasWaitingRoomComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TasService }, { token: i3.GeolocationService }, { token: i1.NgbModal }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
296
|
+
TasWaitingRoomComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasWaitingRoomComponent, selector: "tas-waiting-room", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser" }, ngImport: i0, template: "<div class=\"tas-waiting-room\">\n <!-- Header -->\n <div class=\"waiting-room-header\">\n <h2 class=\"header-title\">Iniciar turno</h2>\n <button type=\"button\" class=\"close-btn\" (click)=\"cancel()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"waiting-room-content\">\n <!-- CHECKING_STATUS State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.CHECKING_STATUS\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Verificando estado de la sesi\u00F3n...</p>\n </div>\n\n <!-- WAITING_FOR_JOINABLE State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.WAITING_FOR_JOINABLE\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Esperando que la sesi\u00F3n est\u00E9 disponible...</p>\n <p class=\"state-submessage\">Por favor, permanec\u00E9 en esta pantalla.</p>\n </div>\n\n <!-- READY State (Join button enabled) -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.READY\">\n <div class=\"state-icon ready\">\n <i class=\"fa fa-check-circle\"></i>\n </div>\n <p class=\"state-message success\">\u00A1La sala est\u00E1 lista!</p>\n <button type=\"button\" class=\"btn action-btn join-btn\" (click)=\"joinSession()\">\n <i class=\"fa fa-sign-in\"></i>\n Unirse a la llamada\n </button>\n </div>\n\n <!-- JOINING State (Auto-joining) -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.JOINING\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Ingresando a la llamada...</p>\n </div>\n\n <!-- GETTING_TOKEN State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.GETTING_TOKEN\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Conectando...</p>\n </div>\n\n <!-- ERROR State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.ERROR\">\n <div class=\"state-icon error\">\n <i class=\"fa fa-exclamation-triangle\"></i>\n </div>\n <p class=\"state-message error\">Ocurri\u00F3 un error</p>\n <p class=\"error-details\" *ngIf=\"errorMessage\">\n {{ errorMessage }}\n </p>\n <button type=\"button\" class=\"btn action-btn retry-btn\" (click)=\"retry()\">\n <i class=\"fa fa-refresh\"></i>\n Reintentar\n </button>\n </div>\n </div>\n</div>\n", styles: [".tas-waiting-room{display:flex;flex-direction:column;min-height:420px;background:#ffffff;border-radius:5px;overflow:hidden}.waiting-room-header{position:relative;padding:20px 40px;border-bottom:1px solid #e9ecef;display:flex;align-items:center;justify-content:space-between}.waiting-room-header .header-title{margin:0;font-size:18px;font-weight:600;line-height:24px;color:#212529}.waiting-room-header .close-btn{width:32px;height:32px;border:none;background:transparent;border-radius:4px;color:#6c757d;cursor:pointer;transition:all .2s ease;font-size:20px;display:flex;align-items:center;justify-content:center}.waiting-room-header .close-btn:hover{background:#f8f9fa;color:#212529}.waiting-title{font-size:16px;font-weight:600;color:#212529;margin-bottom:8px}.waiting-room-content{flex:1;display:flex;align-items:center;justify-content:center;padding:32px 40px;background:#ffffff}.state-container{text-align:center;max-width:400px;width:100%}.mode-tabs{display:flex;justify-content:center;gap:8px;margin-bottom:24px;padding:4px;background:#f8f9fa;border-radius:8px}.mode-tab{flex:1;padding:10px 16px;font-size:13px;font-weight:600;border:none;border-radius:6px;background:transparent;color:#6c757d;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;gap:8px}.mode-tab i{font-size:14px}.mode-tab:hover{color:#212529}.mode-tab.active{background:#ffffff;color:#1da4b1;box-shadow:0 2px 8px #00000014}.mode-content{animation:fadeIn .3s ease}.session-input-container{display:flex;flex-direction:column;gap:16px;margin-top:8px}.session-input{width:100%;padding:14px 16px;font-size:14px;border:2px solid #e9ecef;border-radius:8px;background:#ffffff;color:#212529;transition:all .2s ease;text-align:center;font-family:Monaco,Consolas,monospace;letter-spacing:.5px}.session-input::placeholder{color:#6c757d;font-family:inherit;letter-spacing:normal}.session-input:focus{outline:none;border-color:#1da4b1;box-shadow:0 0 0 3px #1da4b126}.session-input:hover:not(:focus){border-color:#6c757d}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.state-icon{width:80px;height:80px;margin:0 auto 24px;border-radius:50%;display:flex;align-items:center;justify-content:center}.state-icon i{font-size:36px}.state-icon.idle{background:rgba(29,164,177,.1);border:2px dashed #1da4b1}.state-icon.idle i{color:#1da4b1}.state-icon.loading{background:rgba(29,164,177,.1);border:2px solid #1da4b1}.state-icon.ready{background:linear-gradient(135deg,#1da4b1 0%,#38b89a 100%);box-shadow:0 4px 16px #1da4b14d}.state-icon.ready i{color:#fff}.state-icon.error{background:rgba(238,49,107,.1);border:2px solid #ee316b}.state-icon.error i{color:#ee316b}.spinner{width:40px;height:40px;border:3px solid #e9ecef;border-top-color:#1da4b1;border-radius:50%;animation:spin 1s linear infinite}.state-message{font-size:16px;font-weight:600;margin:0 0 8px;color:#212529;line-height:24px}.state-message.success{color:#1da4b1}.state-message.error{color:#ee316b}.state-submessage{font-size:14px;color:#6c757d;margin:0 0 24px;font-weight:400}.error-details{font-size:13px;color:#ee316b;margin:0 0 24px;padding:12px 16px;background:rgba(238,49,107,.08);border-radius:8px;border:1px solid rgba(238,49,107,.2)}.progress-steps{display:flex;justify-content:center;gap:24px;margin:24px 0 32px}.step{display:flex;flex-direction:column;align-items:center;gap:8px}.step .step-indicator{width:32px;height:32px;border-radius:50%;background:#f8f9fa;border:2px solid #e9ecef;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.step .step-indicator i{font-size:12px;color:#fff}.step .step-label{font-size:11px;color:#6c757d;text-transform:uppercase;letter-spacing:.5px;font-weight:500}.step.active .step-indicator{background:rgba(29,164,177,.1);border-color:#1da4b1;animation:pulse-active 1.5s infinite}.step.active .step-label{color:#1da4b1;font-weight:600}.step.completed .step-indicator{background:#1da4b1;border-color:#1da4b1}.step.completed .step-label{color:#1da4b1;font-weight:600}.action-btn{padding:12px 32px;font-size:16px;font-weight:600;border-radius:4px;border:none;cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;gap:10px}.action-btn i{font-size:16px}.action-btn.create-btn{background:#0077b3;color:#fff;box-shadow:0 2px 8px #0077b340}.action-btn.create-btn:hover{background:#005c8a;box-shadow:0 4px 12px #0077b359}.action-btn.create-btn:active{transform:translateY(1px)}.action-btn.join-btn{background:#1da4b1;color:#fff;box-shadow:0 2px 8px #1da4b140;animation:pulse-ready 2s infinite}.action-btn.join-btn:hover{background:#17848e;box-shadow:0 4px 12px #1da4b159}.action-btn.join-btn:active{transform:translateY(1px)}.action-btn.retry-btn{background:transparent;color:#6c757d;border:1px solid #e9ecef}.action-btn.retry-btn:hover{background:#f8f9fa;border-color:#6c757d;color:#212529}.waiting-room-footer{padding:16px 40px 24px;background:#ffffff;border-top:1px solid #e9ecef;display:flex;justify-content:center}.waiting-room-footer .cancel-btn{padding:10px 24px;font-size:14px;font-weight:600;border-radius:4px;background:transparent;color:#6c757d;border:none;cursor:pointer;transition:all .2s ease}.waiting-room-footer .cancel-btn:hover{background:#f8f9fa;color:#212529}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse-active{0%,to{box-shadow:0 0 #1da4b166}50%{box-shadow:0 0 0 8px #1da4b100}}@keyframes pulse-ready{0%,to{box-shadow:0 2px 8px #1da4b140}50%{box-shadow:0 4px 16px #1da4b166}}@media (max-width: 576px){.tas-waiting-room{min-height:380px}.waiting-room-header{padding:24px 24px 20px}.waiting-room-header .header-icon{width:56px;height:56px}.waiting-room-header .header-icon i{font-size:22px}.waiting-room-header .header-title{font-size:18px}.waiting-room-content{padding:24px}.state-icon{width:64px;height:64px}.state-icon i{font-size:28px}.spinner{width:32px;height:32px}.progress-steps{gap:12px}.step .step-indicator{width:28px;height:28px}.step .step-label{font-size:9px}.action-btn{padding:10px 24px;font-size:14px}.waiting-room-footer{padding:16px 24px 20px}}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
239
297
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasWaitingRoomComponent, decorators: [{
|
|
240
298
|
type: Component,
|
|
241
|
-
args: [{ selector: 'tas-waiting-room', template: "<div class=\"tas-waiting-room\">\n <!-- Header -->\n <div class=\"waiting-room-header\">\n <h2 class=\"header-title\">Iniciar turno</h2>\n <button type=\"button\" class=\"close-btn\" (click)=\"cancel()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"waiting-room-content\">\n <!-- CHECKING_STATUS State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.CHECKING_STATUS\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Verificando estado de la sesi\u00F3n...</p>\n </div>\n\n <!--
|
|
242
|
-
}], ctorParameters: function () { return [{ type: i1.NgbActiveModal }, { type: i2.TasService }, { type: i1.NgbModal }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { roomType: [{
|
|
299
|
+
args: [{ selector: 'tas-waiting-room', template: "<div class=\"tas-waiting-room\">\n <!-- Header -->\n <div class=\"waiting-room-header\">\n <h2 class=\"header-title\">Iniciar turno</h2>\n <button type=\"button\" class=\"close-btn\" (click)=\"cancel()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"waiting-room-content\">\n <!-- CHECKING_STATUS State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.CHECKING_STATUS\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Verificando estado de la sesi\u00F3n...</p>\n </div>\n\n <!-- WAITING_FOR_JOINABLE State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.WAITING_FOR_JOINABLE\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Esperando que la sesi\u00F3n est\u00E9 disponible...</p>\n <p class=\"state-submessage\">Por favor, permanec\u00E9 en esta pantalla.</p>\n </div>\n\n <!-- READY State (Join button enabled) -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.READY\">\n <div class=\"state-icon ready\">\n <i class=\"fa fa-check-circle\"></i>\n </div>\n <p class=\"state-message success\">\u00A1La sala est\u00E1 lista!</p>\n <button type=\"button\" class=\"btn action-btn join-btn\" (click)=\"joinSession()\">\n <i class=\"fa fa-sign-in\"></i>\n Unirse a la llamada\n </button>\n </div>\n\n <!-- JOINING State (Auto-joining) -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.JOINING\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Ingresando a la llamada...</p>\n </div>\n\n <!-- GETTING_TOKEN State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.GETTING_TOKEN\">\n <div class=\"state-icon loading\">\n <div class=\"spinner\"></div>\n </div>\n <p class=\"state-message\">Conectando...</p>\n </div>\n\n <!-- ERROR State -->\n <div class=\"state-container\" *ngIf=\"state === WaitingRoomState.ERROR\">\n <div class=\"state-icon error\">\n <i class=\"fa fa-exclamation-triangle\"></i>\n </div>\n <p class=\"state-message error\">Ocurri\u00F3 un error</p>\n <p class=\"error-details\" *ngIf=\"errorMessage\">\n {{ errorMessage }}\n </p>\n <button type=\"button\" class=\"btn action-btn retry-btn\" (click)=\"retry()\">\n <i class=\"fa fa-refresh\"></i>\n Reintentar\n </button>\n </div>\n </div>\n</div>\n", styles: [".tas-waiting-room{display:flex;flex-direction:column;min-height:420px;background:#ffffff;border-radius:5px;overflow:hidden}.waiting-room-header{position:relative;padding:20px 40px;border-bottom:1px solid #e9ecef;display:flex;align-items:center;justify-content:space-between}.waiting-room-header .header-title{margin:0;font-size:18px;font-weight:600;line-height:24px;color:#212529}.waiting-room-header .close-btn{width:32px;height:32px;border:none;background:transparent;border-radius:4px;color:#6c757d;cursor:pointer;transition:all .2s ease;font-size:20px;display:flex;align-items:center;justify-content:center}.waiting-room-header .close-btn:hover{background:#f8f9fa;color:#212529}.waiting-title{font-size:16px;font-weight:600;color:#212529;margin-bottom:8px}.waiting-room-content{flex:1;display:flex;align-items:center;justify-content:center;padding:32px 40px;background:#ffffff}.state-container{text-align:center;max-width:400px;width:100%}.mode-tabs{display:flex;justify-content:center;gap:8px;margin-bottom:24px;padding:4px;background:#f8f9fa;border-radius:8px}.mode-tab{flex:1;padding:10px 16px;font-size:13px;font-weight:600;border:none;border-radius:6px;background:transparent;color:#6c757d;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;gap:8px}.mode-tab i{font-size:14px}.mode-tab:hover{color:#212529}.mode-tab.active{background:#ffffff;color:#1da4b1;box-shadow:0 2px 8px #00000014}.mode-content{animation:fadeIn .3s ease}.session-input-container{display:flex;flex-direction:column;gap:16px;margin-top:8px}.session-input{width:100%;padding:14px 16px;font-size:14px;border:2px solid #e9ecef;border-radius:8px;background:#ffffff;color:#212529;transition:all .2s ease;text-align:center;font-family:Monaco,Consolas,monospace;letter-spacing:.5px}.session-input::placeholder{color:#6c757d;font-family:inherit;letter-spacing:normal}.session-input:focus{outline:none;border-color:#1da4b1;box-shadow:0 0 0 3px #1da4b126}.session-input:hover:not(:focus){border-color:#6c757d}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.state-icon{width:80px;height:80px;margin:0 auto 24px;border-radius:50%;display:flex;align-items:center;justify-content:center}.state-icon i{font-size:36px}.state-icon.idle{background:rgba(29,164,177,.1);border:2px dashed #1da4b1}.state-icon.idle i{color:#1da4b1}.state-icon.loading{background:rgba(29,164,177,.1);border:2px solid #1da4b1}.state-icon.ready{background:linear-gradient(135deg,#1da4b1 0%,#38b89a 100%);box-shadow:0 4px 16px #1da4b14d}.state-icon.ready i{color:#fff}.state-icon.error{background:rgba(238,49,107,.1);border:2px solid #ee316b}.state-icon.error i{color:#ee316b}.spinner{width:40px;height:40px;border:3px solid #e9ecef;border-top-color:#1da4b1;border-radius:50%;animation:spin 1s linear infinite}.state-message{font-size:16px;font-weight:600;margin:0 0 8px;color:#212529;line-height:24px}.state-message.success{color:#1da4b1}.state-message.error{color:#ee316b}.state-submessage{font-size:14px;color:#6c757d;margin:0 0 24px;font-weight:400}.error-details{font-size:13px;color:#ee316b;margin:0 0 24px;padding:12px 16px;background:rgba(238,49,107,.08);border-radius:8px;border:1px solid rgba(238,49,107,.2)}.progress-steps{display:flex;justify-content:center;gap:24px;margin:24px 0 32px}.step{display:flex;flex-direction:column;align-items:center;gap:8px}.step .step-indicator{width:32px;height:32px;border-radius:50%;background:#f8f9fa;border:2px solid #e9ecef;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.step .step-indicator i{font-size:12px;color:#fff}.step .step-label{font-size:11px;color:#6c757d;text-transform:uppercase;letter-spacing:.5px;font-weight:500}.step.active .step-indicator{background:rgba(29,164,177,.1);border-color:#1da4b1;animation:pulse-active 1.5s infinite}.step.active .step-label{color:#1da4b1;font-weight:600}.step.completed .step-indicator{background:#1da4b1;border-color:#1da4b1}.step.completed .step-label{color:#1da4b1;font-weight:600}.action-btn{padding:12px 32px;font-size:16px;font-weight:600;border-radius:4px;border:none;cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;gap:10px}.action-btn i{font-size:16px}.action-btn.create-btn{background:#0077b3;color:#fff;box-shadow:0 2px 8px #0077b340}.action-btn.create-btn:hover{background:#005c8a;box-shadow:0 4px 12px #0077b359}.action-btn.create-btn:active{transform:translateY(1px)}.action-btn.join-btn{background:#1da4b1;color:#fff;box-shadow:0 2px 8px #1da4b140;animation:pulse-ready 2s infinite}.action-btn.join-btn:hover{background:#17848e;box-shadow:0 4px 12px #1da4b159}.action-btn.join-btn:active{transform:translateY(1px)}.action-btn.retry-btn{background:transparent;color:#6c757d;border:1px solid #e9ecef}.action-btn.retry-btn:hover{background:#f8f9fa;border-color:#6c757d;color:#212529}.waiting-room-footer{padding:16px 40px 24px;background:#ffffff;border-top:1px solid #e9ecef;display:flex;justify-content:center}.waiting-room-footer .cancel-btn{padding:10px 24px;font-size:14px;font-weight:600;border-radius:4px;background:transparent;color:#6c757d;border:none;cursor:pointer;transition:all .2s ease}.waiting-room-footer .cancel-btn:hover{background:#f8f9fa;color:#212529}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse-active{0%,to{box-shadow:0 0 #1da4b166}50%{box-shadow:0 0 0 8px #1da4b100}}@keyframes pulse-ready{0%,to{box-shadow:0 2px 8px #1da4b140}50%{box-shadow:0 4px 16px #1da4b166}}@media (max-width: 576px){.tas-waiting-room{min-height:380px}.waiting-room-header{padding:24px 24px 20px}.waiting-room-header .header-icon{width:56px;height:56px}.waiting-room-header .header-icon i{font-size:22px}.waiting-room-header .header-title{font-size:18px}.waiting-room-content{padding:24px}.state-icon{width:64px;height:64px}.state-icon i{font-size:28px}.spinner{width:32px;height:32px}.progress-steps{gap:12px}.step .step-indicator{width:28px;height:28px}.step .step-label{font-size:9px}.action-btn{padding:10px 24px;font-size:14px}.waiting-room-footer{padding:16px 24px 20px}}\n"] }]
|
|
300
|
+
}], ctorParameters: function () { return [{ type: i1.NgbActiveModal }, { type: i2.TasService }, { type: i3.GeolocationService }, { type: i1.NgbModal }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { roomType: [{
|
|
243
301
|
type: Input
|
|
244
302
|
}], entityId: [{
|
|
245
303
|
type: Input
|
|
@@ -250,4 +308,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
250
308
|
}], currentUser: [{
|
|
251
309
|
type: Input
|
|
252
310
|
}] } });
|
|
253
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBR3ZGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUVMLFdBQVcsRUFDWCxlQUFlLEVBQ2YsV0FBVyxHQUNaLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7O0FBRWpGLE1BQU0sQ0FBTixJQUFZLGdCQU1YO0FBTkQsV0FBWSxnQkFBZ0I7SUFDMUIsdURBQW1DLENBQUE7SUFDbkMsMkRBQXVDLENBQUE7SUFDdkMsbUNBQWUsQ0FBQTtJQUNmLG1EQUErQixDQUFBO0lBQy9CLG1DQUFlLENBQUE7QUFDakIsQ0FBQyxFQU5XLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFNM0I7QUFPRCxNQUFNLE9BQU8sdUJBQXVCO0lBOEJsQyxZQUNTLFdBQTJCLEVBQzFCLFVBQXNCLEVBQ3RCLFlBQXNCLEVBQ3RCLEdBQXNCO1FBSHZCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3RCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBakNoQyx5QkFBeUI7UUFD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aUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDOztxSEExUVUsdUJBQXVCO3lHQUF2Qix1QkFBdUIsNExDekJwQyxna0ZBaUVBOzRGRHhDYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0Usa0JBQWtCO3FMQU1uQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwsIE5nYk1vZGFsLCBOZ2JNb2RhbFJlZiB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFRhc0N1cnJlbnRVc2VyLFxuICBUYXNSb29tVHlwZSxcbiAgVGFzQnVzaW5lc3NSb2xlLFxuICBUYXNVc2VyUm9sZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUYXNWaWRlb2NhbGxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50JztcblxuZXhwb3J0IGVudW0gV2FpdGluZ1Jvb21TdGF0ZSB7XG4gIENIRUNLSU5HX1NUQVRVUyA9ICdDSEVDS0lOR19TVEFUVVMnLFxuICBXQUlUSU5HX0ZPUl9PV05FUiA9ICdXQUlUSU5HX0ZPUl9PV05FUicsXG4gIFJFQURZID0gJ1JFQURZJyxcbiAgR0VUVElOR19UT0tFTiA9ICdHRVRUSU5HX1RPS0VOJyxcbiAgRVJST1IgPSAnRVJST1InLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXMtd2FpdGluZy1yb29tJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy13YWl0aW5nLXJvb20uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXMtd2FpdGluZy1yb29tLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhc1dhaXRpbmdSb29tQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBTdGF0dXMgZW5kcG9pbnQgcGFyYW1zXG4gIEBJbnB1dCgpIHJvb21UeXBlOiBUYXNSb29tVHlwZSA9IFRhc1Jvb21UeXBlLlRBUztcbiAgQElucHV0KCkgZW50aXR5SWQhOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlbmFudCE6IHN0cmluZztcbiAgQElucHV0KCkgYnVzaW5lc3NSb2xlOiBUYXNCdXNpbmVzc1JvbGUgPSBUYXNCdXNpbmVzc1JvbGUuVVNFUjtcblxuICAvLyBVc2VyIGluZm8gZm9yIHRva2VuIHJlcXVlc3RcbiAgQElucHV0KCkgY3VycmVudFVzZXIhOiBUYXNDdXJyZW50VXNlcjtcblxuICAvLyBDb21wb25lbnQgc3RhdGVcbiAgcHVibGljIHN0YXRlOiBXYWl0aW5nUm9vbVN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZS5DSEVDS0lOR19TVEFUVVM7XG4gIHB1YmxpYyBXYWl0aW5nUm9vbVN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZTsgLy8gRXhwb3NlIGVudW0gdG8gdGVtcGxhdGVcbiAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XG5cbiAgLy8gU2Vzc2lvbiBkYXRhIGZyb20gc3RhdHVzIHJlc3BvbnNlXG4gIHByaXZhdGUgcmVzb2x2ZWRTZXNzaW9uSWQ6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIHJlc29sdmVkQXBwb2ludG1lbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIHZpZGVvQ2FsbElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBTdWJzY3JpcHRpb25zXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSB2aWRlb0NhbGxNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcblxuICAvKiogV2hldGhlciBjdXJyZW50IHVzZXIgaXMgYW4gb3duZXIgKi9cbiAgcHVibGljIGdldCBpc093bmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyPy5yb2xlID09PSBUYXNVc2VyUm9sZS5PV05FUjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXG4gICAgcHJpdmF0ZSB0YXNTZXJ2aWNlOiBUYXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBUYXNXYWl0aW5nUm9vbUNvbXBvbmVudC5uZ09uSW5pdCcpO1xuICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBUYXNXYWl0aW5nUm9vbUNvbXBvbmVudC5uZ09uRGVzdHJveScpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudGFzU2VydmljZS5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyB0byBnZXQgc2Vzc2lvbiBpbmZvXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBjaGVja1N0YXR1cyBjYWxsZWQgd2l0aDonLCB7XG4gICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICBjdXJyZW50VXNlcjogdGhpcy5jdXJyZW50VXNlcixcbiAgICB9KTtcblxuICAgIHRoaXMuc3RhdGUgPSBXYWl0aW5nUm9vbVN0YXRlLkNIRUNLSU5HX1NUQVRVUztcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuXG4gICAgY29uc3Qgc3RhdHVzUGFyYW1zID0ge1xuICAgICAgcm9vbVR5cGU6IHRoaXMucm9vbVR5cGUsXG4gICAgICBlbnRpdHlJZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgIHRlbmFudDogdGhpcy50ZW5hbnQsXG4gICAgICBidXNpbmVzc1JvbGU6IHRoaXMuYnVzaW5lc3NSb2xlLFxuICAgIH07XG5cbiAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gQ2FsbGluZyBnZXRQcm94eVZpZGVvU3RhdHVzLi4uJyk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmdldFByb3h5VmlkZW9TdGF0dXMoc3RhdHVzUGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gcmVzcG9uc2UuY29udGVudDtcblxuICAgICAgICAgIC8vIFN0b3JlIHNlc3Npb24gaW5mbyBmcm9tIHJlc3BvbnNlXG4gICAgICAgICAgdGhpcy5yZXNvbHZlZFNlc3Npb25JZCA9IGNvbnRlbnQuc2Vzc2lvbklkO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWRBcHBvaW50bWVudElkID0gY29udGVudC5hcHBvaW50bWVudElkO1xuICAgICAgICAgIHRoaXMudmlkZW9DYWxsSWQgPSBjb250ZW50LnZpZGVvQ2FsbElkO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFN0YXR1cyByZXNwb25zZTonLCBjb250ZW50KTtcblxuICAgICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgZm9yIHN0YXR1cyB1cGRhdGVzXG4gICAgICAgICAgdGhpcy50YXNTZXJ2aWNlLnN0YXJ0U3RhdHVzUG9sbGluZyhzdGF0dXNQYXJhbXMpO1xuXG4gICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGpvaW5hYmxlIHN0YXR1c1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLnRhc1NlcnZpY2Uuam9pbmFibGUkLnN1YnNjcmliZSgoam9pbmFibGUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVKb2luYWJsZUNoYW5nZShqb2luYWJsZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gU3RhdHVzIGNoZWNrIGZhaWxlZDonLCBlcnIpO1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSBXYWl0aW5nUm9vbVN0YXRlLkVSUk9SO1xuICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ0Vycm9yIGNoZWNraW5nIHNlc3Npb24gc3RhdHVzLiBQbGVhc2UgdHJ5IGFnYWluLic7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNoYW5nZXMgdG8gam9pbmFibGUgc3RhdHVzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUpvaW5hYmxlQ2hhbmdlKGpvaW5hYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIGhhbmRsZUpvaW5hYmxlQ2hhbmdlIGNhbGxlZCcsIHtcbiAgICAgIGpvaW5hYmxlLFxuICAgICAgY3VycmVudFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgaXNPd25lcjogdGhpcy5pc093bmVyLFxuICAgICAgaXNCYWNrb2ZmaWNlOiB0aGlzLmlzQmFja29mZmljZSxcbiAgICAgIHJlc29sdmVkU2Vzc2lvbklkOiB0aGlzLnJlc29sdmVkU2Vzc2lvbklkLFxuICAgIH0pO1xuXG4gICAgLy8gRG9uJ3QgdXBkYXRlIHN0YXRlIGlmIGFscmVhZHkgZ2V0dGluZyB0b2tlbiwgcmVhZHksIG9yIGluIGVycm9yXG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5HRVRUSU5HX1RPS0VOIHx8XG4gICAgICB0aGlzLnN0YXRlID09PSBXYWl0aW5nUm9vbVN0YXRlLlJFQURZIHx8XG4gICAgICB0aGlzLnN0YXRlID09PSBXYWl0aW5nUm9vbVN0YXRlLkVSUk9SXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gU2tpcHBpbmcgc3RhdGUgdXBkYXRlIC0gYWxyZWFkeSBpbjonLCB0aGlzLnN0YXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc093bmVyIHx8IHRoaXMuaXNCYWNrb2ZmaWNlKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gVXNlciBpcyBvd25lci9iYWNrb2ZmaWNlLCBjYWxsaW5nIGdldFRva2VuRm9yT3duZXInKTtcbiAgICAgIC8vIE93bmVyL0JhY2tvZmZpY2U6IGNhbGwgL3N0YXJ0IHRvIGdldCB0b2tlbiBmaXJzdCwgdGhlbiBzaG93IGpvaW4gYnV0dG9uXG4gICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5DSEVDS0lOR19TVEFUVVMpIHtcbiAgICAgICAgdGhpcy5nZXRUb2tlbkZvck93bmVyKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vbi1vd25lcjogd2FpdCB1bnRpbCBqb2luYWJsZSBpcyB0cnVlXG4gICAgICBpZiAoam9pbmFibGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIE5vbi1vd25lcjogam9pbmFibGUgaXMgdHJ1ZSwgZ2V0dGluZyB0b2tlbicpO1xuICAgICAgICB0aGlzLmdldFRva2VuRm9yT3duZXIoKTsgLy8gQWxzbyBnZXQgdG9rZW4gd2hlbiBqb2luYWJsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIE5vbi1vd25lcjogd2FpdGluZyBmb3Igb3duZXInKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuV0FJVElOR19GT1JfT1dORVI7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBoYXMgb3duZXIvYmFja29mZmljZSByb2xlXG4gICAqL1xuICBwcml2YXRlIGdldCBpc0JhY2tvZmZpY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuQkFDS09GRklDRSB8fFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5BRE1JTl9NQU5BR0VSIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLk1BTkFHRVJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0b2tlbiBmb3Igb3duZXIvYmFja29mZmljZSAtIGNhbGwgL3N0YXJ0IGVuZHBvaW50XG4gICAqL1xuICBwcml2YXRlIGdldFRva2VuRm9yT3duZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlc29sdmVkU2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLnN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZS5FUlJPUjtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ1Nlc3Npb24gSUQgbm90IGF2YWlsYWJsZSc7XG4gICAgICB0aGlzLnRhc1NlcnZpY2Uuc3RvcFN0YXR1c1BvbGxpbmcoKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZS5HRVRUSU5HX1RPS0VOO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIENhbGxpbmcgL3N0YXJ0IGZvciBzZXNzaW9uOicsIHRoaXMucmVzb2x2ZWRTZXNzaW9uSWQpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZVxuICAgICAgICAuc3RhcnRQcm94eVZpZGVvU2Vzc2lvbih7XG4gICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnJlc29sdmVkU2Vzc2lvbklkLFxuICAgICAgICAgIG5hbWU6IHRoaXMuY3VycmVudFVzZXIubmFtZSxcbiAgICAgICAgICBsYXN0bmFtZTogdGhpcy5jdXJyZW50VXNlci5sYXN0bmFtZSxcbiAgICAgICAgfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHRva2VuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBUb2tlbiByZXNwb25zZTonLCB0b2tlblJlc3BvbnNlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgSFRUUCBhZGFwdGVyIHJldHVybnMgZXJyb3IgaW4gbmV4dCBpbnN0ZWFkIG9mIGVycm9yIGhhbmRsZXJcbiAgICAgICAgICAgIGlmICghdG9rZW5SZXNwb25zZT8uY29udGVudD8udG9rZW4pIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gSW52YWxpZCB0b2tlbiByZXNwb25zZTonLCB0b2tlblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuRVJST1I7XG4gICAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gKHRva2VuUmVzcG9uc2UgYXMgYW55KT8ubWVzc2FnZSB8fCAnRXJyb3IgYWwgaW5pY2lhciBsYSBzZXNpw7NuLiBSZXNwdWVzdGEgaW52w6FsaWRhLic7XG4gICAgICAgICAgICAgIHRoaXMudGFzU2VydmljZS5zdG9wU3RhdHVzUG9sbGluZygpO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFRva2VuIG9idGFpbmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuUmVzcG9uc2UuY29udGVudC50b2tlbjtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBXYWl0aW5nUm9vbVN0YXRlLlJFQURZO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIC9zdGFydCByZXF1ZXN0IGZhaWxlZDonLCBlcnIpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuRVJST1I7XG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8ICdFcnJvciBhbCBpbmljaWFyIGxhIHNlc2nDs24uIFBvciBmYXZvciwgaW50ZW50ZSBudWV2YW1lbnRlLic7XG4gICAgICAgICAgICB0aGlzLnRhc1NlcnZpY2Uuc3RvcFN0YXR1c1BvbGxpbmcoKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBTdGF0ZSBzZXQgdG8gRVJST1IsIGVycm9yTWVzc2FnZTonLCB0aGlzLmVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEpvaW4gdGhlIHNlc3Npb24gLSB0b2tlbiBhbHJlYWR5IG9idGFpbmVkXG4gICAqL1xuICBqb2luU2Vzc2lvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVzb2x2ZWRTZXNzaW9uSWQgfHwgIXRoaXMudG9rZW4pIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ1Nlc3Npb24gbm90IHJlYWR5JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSB3YWl0aW5nIHJvb20gYW5kIG9wZW4gdmlkZW8gY2FsbFxuICAgIHRoaXMudGFzU2VydmljZS5zdG9wU3RhdHVzUG9sbGluZygpO1xuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2pvaW5pbmcnKTtcbiAgICB0aGlzLm9wZW5WaWRlb0NhbGxNb2RhbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgd2FpdGluZyByb29tXG4gICAqL1xuICBjYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLnN0b3BTdGF0dXNQb2xsaW5nKCk7XG4gICAgdGhpcy5hY3RpdmVNb2RhbC5kaXNtaXNzKCdjYW5jZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyeSBhZnRlciBhbiBlcnJvclxuICAgKi9cbiAgcmV0cnkoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuQ0hFQ0tJTkdfU1RBVFVTO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy50b2tlbiA9ICcnO1xuICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlblZpZGVvQ2FsbE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFRhc1ZpZGVvY2FsbENvbXBvbmVudCwge1xuICAgICAgc2l6ZTogJ3hsJyxcbiAgICAgIHdpbmRvd0NsYXNzOiAndGFzLXZpZGVvLW1vZGFsJyxcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc2Vzc2lvbklkID0gdGhpcy5yZXNvbHZlZFNlc3Npb25JZDtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRva2VuID0gdGhpcy50b2tlbjtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmFwcG9pbnRtZW50SWQgPSB0aGlzLnJlc29sdmVkQXBwb2ludG1lbnRJZDtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnZpZGVvQ2FsbElkID0gdGhpcy52aWRlb0NhbGxJZDtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRlbmFudCA9IHRoaXMudGVuYW50O1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuYnVzaW5lc3NSb2xlID0gdGhpcy5idXNpbmVzc1JvbGU7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pc1JldHVybmluZ0Zyb21QaXAgPSBmYWxzZTtcblxuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYucmVzdWx0LnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhcy13YWl0aW5nLXJvb21cIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJ3YWl0aW5nLXJvb20taGVhZGVyXCI+XG4gICAgPGgyIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+SW5pY2lhciB0dXJubzwvaDI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZS1idG5cIiAoY2xpY2spPVwiY2FuY2VsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ29udGVudCAtLT5cbiAgPGRpdiBjbGFzcz1cIndhaXRpbmctcm9vbS1jb250ZW50XCI+XG4gICAgPCEtLSBDSEVDS0lOR19TVEFUVVMgU3RhdGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0YXRlLWNvbnRhaW5lclwiICpuZ0lmPVwic3RhdGUgPT09IFdhaXRpbmdSb29tU3RhdGUuQ0hFQ0tJTkdfU1RBVFVTXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdGUtaWNvbiBsb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPVwic3RhdGUtbWVzc2FnZVwiPlZlcmlmaWNhbmRvIGVzdGFkbyBkZSBsYSBzZXNpw7NuLi4uPC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBXQUlUSU5HX0ZPUl9PV05FUiBTdGF0ZSAoTm9uLW93bmVyIHdhaXRpbmcpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdGF0ZS1jb250YWluZXIgd2FpdGluZy1mb3Itb3duZXJcIiAqbmdJZj1cInN0YXRlID09PSBXYWl0aW5nUm9vbVN0YXRlLldBSVRJTkdfRk9SX09XTkVSXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdGUtaWNvbiBsb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPVwic3RhdGUtbWVzc2FnZSB3YWl0aW5nLXRpdGxlXCI+TWVkaWNpbmEgbGFib3JhbCB0ZSB2YSBhIGFkbWl0aXIgZW4gdW5vcyBpbnN0YW50ZXMuLi48L3A+XG4gICAgICA8cCBjbGFzcz1cInN0YXRlLXN1Ym1lc3NhZ2VcIj5Qb3IgZmF2b3IsIHBlcm1hbmVjw6kgZW4gZXN0YSBwYW50YWxsYSBoYXN0YSBxdWUgaW5pY2llIGxhIGNvbnN1bHRhLjwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUkVBRFkgU3RhdGUgKE93bmVyIGNhbiBqb2luKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCJzdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5SRUFEWVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXRlLWljb24gcmVhZHlcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGVjay1jaXJjbGVcIj48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPVwic3RhdGUtbWVzc2FnZSBzdWNjZXNzXCI+wqFMYSBzYWxhIGVzdMOhIGxpc3RhITwvcD5cbiAgICAgIDxwIGNsYXNzPVwic3RhdGUtc3VibWVzc2FnZVwiPlBvZMOpcyB1bmlydGUgYSBsYSB2aWRlb2xsYW1hZGEgY3VhbmRvIHF1aWVyYXM8L3A+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBhY3Rpb24tYnRuIGpvaW4tYnRuXCIgKGNsaWNrKT1cImpvaW5TZXNzaW9uKClcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zaWduLWluXCI+PC9pPlxuICAgICAgICBVbmlyc2UgYSBsYSBsbGFtYWRhXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gR0VUVElOR19UT0tFTiBTdGF0ZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCJzdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5HRVRUSU5HX1RPS0VOXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdGUtaWNvbiBsb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPVwic3RhdGUtbWVzc2FnZVwiPkNvbmVjdGFuZG8uLi48L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVSUk9SIFN0YXRlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdGF0ZS1jb250YWluZXJcIiAqbmdJZj1cInN0YXRlID09PSBXYWl0aW5nUm9vbVN0YXRlLkVSUk9SXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdGUtaWNvbiBlcnJvclwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBjbGFzcz1cInN0YXRlLW1lc3NhZ2UgZXJyb3JcIj5PY3VycmnDsyB1biBlcnJvcjwvcD5cbiAgICAgIDxwIGNsYXNzPVwiZXJyb3ItZGV0YWlsc1wiICpuZ0lmPVwiZXJyb3JNZXNzYWdlXCI+XG4gICAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxuICAgICAgPC9wPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYWN0aW9uLWJ0biByZXRyeS1idG5cIiAoY2xpY2spPVwicmV0cnkoKVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXJlZnJlc2hcIj48L2k+XG4gICAgICAgIFJlaW50ZW50YXJcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
311
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSXZGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUVMLFdBQVcsRUFDWCxlQUFlLEVBQ2YsV0FBVyxFQUNYLGNBQWMsR0FFZixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7QUFFakYsTUFBTSxDQUFOLElBQVksZ0JBT1g7QUFQRCxXQUFZLGdCQUFnQjtJQUMxQix1REFBbUMsQ0FBQTtJQUNuQyxpRUFBNkMsQ0FBQTtJQUM3QyxtQ0FBZSxDQUFBO0lBQ2YsbURBQStCLENBQUE7SUFDL0IsdUNBQW1CLENBQUE7SUFDbkIsbUNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBUFcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQU8zQjtBQU9ELE1BQU0sT0FBTyx1QkFBdUI7SUFrQ2xDLFlBQ1MsV0FBMkIsRUFDMUIsVUFBc0IsRUFDdEIsa0JBQXNDLEVBQ3RDLFlBQXNCLEVBQ3RCLEdBQXNCO1FBSnZCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FB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IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwsIE5nYk1vZGFsLCBOZ2JNb2RhbFJlZiB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQgeyBHZW9sb2NhdGlvblNlcnZpY2UsIEdlb1Bvc2l0aW9uIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2VvbG9jYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFRhc0N1cnJlbnRVc2VyLFxuICBUYXNSb29tVHlwZSxcbiAgVGFzQnVzaW5lc3NSb2xlLFxuICBUYXNVc2VyUm9sZSxcbiAgVXNlckNhbGxBY3Rpb24sXG4gIFByb3h5VmlkZW9Vc2VyTW9kaWZ5UmVxdWVzdCxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUYXNWaWRlb2NhbGxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50JztcblxuZXhwb3J0IGVudW0gV2FpdGluZ1Jvb21TdGF0ZSB7XG4gIENIRUNLSU5HX1NUQVRVUyA9ICdDSEVDS0lOR19TVEFUVVMnLFxuICBXQUlUSU5HX0ZPUl9KT0lOQUJMRSA9ICdXQUlUSU5HX0ZPUl9KT0lOQUJMRScsXG4gIFJFQURZID0gJ1JFQURZJyxcbiAgR0VUVElOR19UT0tFTiA9ICdHRVRUSU5HX1RPS0VOJyxcbiAgSk9JTklORyA9ICdKT0lOSU5HJyxcbiAgRVJST1IgPSAnRVJST1InLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXMtd2FpdGluZy1yb29tJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy13YWl0aW5nLXJvb20uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXMtd2FpdGluZy1yb29tLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhc1dhaXRpbmdSb29tQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBTdGF0dXMgZW5kcG9pbnQgcGFyYW1zXG4gIEBJbnB1dCgpIHJvb21UeXBlOiBUYXNSb29tVHlwZSA9IFRhc1Jvb21UeXBlLlRBUztcbiAgQElucHV0KCkgZW50aXR5SWQhOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRlbmFudCE6IHN0cmluZztcbiAgQElucHV0KCkgYnVzaW5lc3NSb2xlOiBUYXNCdXNpbmVzc1JvbGUgPSBUYXNCdXNpbmVzc1JvbGUuVVNFUjtcblxuICAvLyBVc2VyIGluZm8gZm9yIHRva2VuIHJlcXVlc3RcbiAgQElucHV0KCkgY3VycmVudFVzZXIhOiBUYXNDdXJyZW50VXNlcjtcblxuICAvLyBDb21wb25lbnQgc3RhdGVcbiAgcHVibGljIHN0YXRlOiBXYWl0aW5nUm9vbVN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZS5DSEVDS0lOR19TVEFUVVM7XG4gIHB1YmxpYyBXYWl0aW5nUm9vbVN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZTsgLy8gRXhwb3NlIGVudW0gdG8gdGVtcGxhdGVcbiAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBpc0pvaW5hYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gU2Vzc2lvbiBkYXRhIGZyb20gc3RhdHVzIHJlc3BvbnNlXG4gIHByaXZhdGUgcmVzb2x2ZWRTZXNzaW9uSWQ6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIHJlc29sdmVkQXBwb2ludG1lbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIHZpZGVvQ2FsbElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBTdWJzY3JpcHRpb25zXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSB2aWRlb0NhbGxNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcblxuICAvLyBHZW9sb2NhdGlvblxuICBwcml2YXRlIGdlb1Bvc2l0aW9uOiBHZW9Qb3NpdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIGN1cnJlbnQgdXNlciBpcyBhbiBvd25lciAqL1xuICBwdWJsaWMgZ2V0IGlzT3duZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXI/LnJvbGUgPT09IFRhc1VzZXJSb2xlLk9XTkVSO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcbiAgICBwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBnZW9sb2NhdGlvblNlcnZpY2U6IEdlb2xvY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gVGFzV2FpdGluZ1Jvb21Db21wb25lbnQubmdPbkluaXQnKTtcbiAgICB0aGlzLnJlcXVlc3RNZWRpYVBlcm1pc3Npb25zKCk7XG4gICAgdGhpcy5yZXF1ZXN0R2VvbG9jYXRpb24oKTtcbiAgICB0aGlzLmNoZWNrU3RhdHVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBjYW1lcmEgYW5kIG1pY3JvcGhvbmUgcGVybWlzc2lvbnMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlcXVlc3RNZWRpYVBlcm1pc3Npb25zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBSZXF1ZXN0aW5nIG1lZGlhIHBlcm1pc3Npb25zLi4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUsIHZpZGVvOiB0cnVlIH0pO1xuICAgICAgLy8gU3RvcCB0cmFja3MgaW1tZWRpYXRlbHkgLSB3ZSBqdXN0IG5lZWRlZCB0aGUgcGVybWlzc2lvblxuICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2godHJhY2sgPT4gdHJhY2suc3RvcCgpKTtcbiAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBNZWRpYSBwZXJtaXNzaW9ucyBncmFudGVkJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1RBUyBERUJVR10gTWVkaWEgcGVybWlzc2lvbnMgZGVuaWVkIG9yIHVuYXZhaWxhYmxlOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBnZW9sb2NhdGlvbiBpbW1lZGlhdGVseSBvbiBpbml0LlxuICAgKiBPbmx5IGZvciByZWd1bGFyIHVzZXJzIChub3Qgb3duZXJzL2JhY2tvZmZpY2UpLlxuICAgKiBJZiB1c2VyIGFsbG93cywgc3RvcmUgcG9zaXRpb24gYW5kIHNlbmQgdG8gYmFja2VuZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdEdlb2xvY2F0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE9ubHkgcmVxdWVzdCBnZW9sb2NhdGlvbiBmb3IgcmVndWxhciB1c2Vycywgbm90IG93bmVycy9iYWNrb2ZmaWNlXG4gICAgaWYgKHRoaXMuaXNPd25lciB8fCB0aGlzLmlzQmFja29mZmljZSkge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFNraXBwaW5nIGdlb2xvY2F0aW9uIGZvciBvd25lci9iYWNrb2ZmaWNlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFJlcXVlc3RpbmcgZ2VvbG9jYXRpb24uLi4nKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IGF3YWl0IHRoaXMuZ2VvbG9jYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRQb3NpdGlvbigpO1xuICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIEdlb2xvY2F0aW9uIG9idGFpbmVkOicsIHBvc2l0aW9uKTtcbiAgICAgIHRoaXMuZ2VvUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgIC8vIFNlbmQgdG8gYmFja2VuZCB3aGVuIHZpZGVvQ2FsbElkIGlzIGF2YWlsYWJsZVxuICAgICAgdGhpcy5zZW5kR2VvbG9jYXRpb25Ub0JhY2tlbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIEdlb2xvY2F0aW9uIGRlbmllZCBvciB1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGdlb2xvY2F0aW9uIHRvIGJhY2tlbmQgdmlhIG1vZGlmeSB1c2VyIGVuZHBvaW50LlxuICAgKiBOT1RFOiBFbmRwb2ludCBjYWxsIGlzIHByZXBhcmVkIGJ1dCBtYXkgbm90IGJlIGFjdGl2ZSB5ZXQuXG4gICAqL1xuICBwcml2YXRlIHNlbmRHZW9sb2NhdGlvblRvQmFja2VuZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZ2VvUG9zaXRpb24gfHwgIXRoaXMudmlkZW9DYWxsSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gU2VuZGluZyBnZW9sb2NhdGlvbiB0byBiYWNrZW5kLi4uJyk7XG4gICAgY29uc3QgYm9keTogUHJveHlWaWRlb1VzZXJNb2RpZnlSZXF1ZXN0ID0ge1xuICAgICAgdXNlcklkOiB0aGlzLmN1cnJlbnRVc2VyPy5pZCxcbiAgICAgIHZpZGVvQ2FsbElkOiB0aGlzLnZpZGVvQ2FsbElkLFxuICAgICAgYWN0aW9uOiBVc2VyQ2FsbEFjdGlvbi5BQ1RJVkFURV9HRU9MT0NBVElPTixcbiAgICAgIGxhdGl0dWRlOiB0aGlzLmdlb1Bvc2l0aW9uLmxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlOiB0aGlzLmdlb1Bvc2l0aW9uLmxvbmdpdHVkZSxcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudGFzU2VydmljZS5tb2RpZnlQcm94eVZpZGVvVXNlcihib2R5KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4gY29uc29sZS5sb2coJ1tUQVMgREVCVUddIEdlb2xvY2F0aW9uIHNlbnQgc3VjY2Vzc2Z1bGx5JyksXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gRmFpbGVkIHRvIHNlbmQgZ2VvbG9jYXRpb246JywgZXJyKSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBUYXNXYWl0aW5nUm9vbUNvbXBvbmVudC5uZ09uRGVzdHJveScpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudGFzU2VydmljZS5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyB0byBnZXQgc2Vzc2lvbiBpbmZvXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBjaGVja1N0YXR1cyBjYWxsZWQgd2l0aDonLCB7XG4gICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkLFxuICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICBjdXJyZW50VXNlcjogdGhpcy5jdXJyZW50VXNlcixcbiAgICB9KTtcblxuICAgIHRoaXMuc3RhdGUgPSBXYWl0aW5nUm9vbVN0YXRlLkNIRUNLSU5HX1NUQVRVUztcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuXG4gICAgY29uc3Qgc3RhdHVzUGFyYW1zID0ge1xuICAgICAgcm9vbVR5cGU6IHRoaXMucm9vbVR5cGUsXG4gICAgICBlbnRpdHlJZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgIHRlbmFudDogdGhpcy50ZW5hbnQsXG4gICAgICBidXNpbmVzc1JvbGU6IHRoaXMuYnVzaW5lc3NSb2xlLFxuICAgIH07XG5cbiAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gQ2FsbGluZyBnZXRQcm94eVZpZGVvU3RhdHVzLi4uJyk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmdldFByb3h5VmlkZW9TdGF0dXMoc3RhdHVzUGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gcmVzcG9uc2UuY29udGVudDtcblxuICAgICAgICAgIC8vIFN0b3JlIHNlc3Npb24gaW5mbyBmcm9tIHJlc3BvbnNlXG4gICAgICAgICAgdGhpcy5yZXNvbHZlZFNlc3Npb25JZCA9IGNvbnRlbnQuc2Vzc2lvbklkO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWRBcHBvaW50bWVudElkID0gY29udGVudC5hcHBvaW50bWVudElkO1xuICAgICAgICAgIHRoaXMudmlkZW9DYWxsSWQgPSBjb250ZW50LnZpZGVvQ2FsbElkO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFN0YXR1cyByZXNwb25zZTonLCBjb250ZW50KTtcblxuICAgICAgICAgIC8vIFRyeSB0byBzZW5kIGdlb2xvY2F0aW9uIG5vdyB0aGF0IHdlIGhhdmUgdmlkZW9DYWxsSWRcbiAgICAgICAgICB0aGlzLnNlbmRHZW9sb2NhdGlvblRvQmFja2VuZCgpO1xuXG4gICAgICAgICAgLy8gU3RhcnQgcG9sbGluZyBmb3Igc3RhdHVzIHVwZGF0ZXNcbiAgICAgICAgICB0aGlzLnRhc1NlcnZpY2Uuc3RhcnRTdGF0dXNQb2xsaW5nKHN0YXR1c1BhcmFtcyk7XG5cbiAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gam9pbmFibGUgc3RhdHVzXG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIHRoaXMudGFzU2VydmljZS5qb2luYWJsZSQuc3Vic2NyaWJlKChqb2luYWJsZSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUpvaW5hYmxlQ2hhbmdlKGpvaW5hYmxlKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBTdGF0dXMgY2hlY2sgZmFpbGVkOicsIGVycik7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuRVJST1I7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnRXJyb3IgY2hlY2tpbmcgc2Vzc2lvbiBzdGF0dXMuIFBsZWFzZSB0cnkgYWdhaW4uJztcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2hhbmdlcyB0byBqb2luYWJsZSBzdGF0dXNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlSm9pbmFibGVDaGFuZ2Uoam9pbmFibGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gaGFuZGxlSm9pbmFibGVDaGFuZ2UgY2FsbGVkJywge1xuICAgICAgam9pbmFibGUsXG4gICAgICBjdXJyZW50U3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICByZXNvbHZlZFNlc3Npb25JZDogdGhpcy5yZXNvbHZlZFNlc3Npb25JZCxcbiAgICB9KTtcblxuICAgIHRoaXMuaXNKb2luYWJsZSA9IGpvaW5hYmxlO1xuXG4gICAgLy8gRG9uJ3QgdXBkYXRlIHN0YXRlIGlmIGFscmVhZHkgZ2V0dGluZyB0b2tlbiwgam9pbmluZywgb3IgaW4gZXJyb3JcbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlID09PSBXYWl0aW5nUm9vbVN0YXRlLkdFVFRJTkdfVE9LRU4gfHxcbiAgICAgIHRoaXMuc3RhdGUgPT09IFdhaXRpbmdSb29tU3RhdGUuSk9JTklORyB8fFxuICAgICAgdGhpcy5zdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5FUlJPUlxuICAgICkge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFNraXBwaW5nIHN0YXRlIHVwZGF0ZSAtIGFscmVhZHkgaW46JywgdGhpcy5zdGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQm90aCB1c2VycyBhbmQgb3duZXJzOiBzaG93IGpvaW4gYnV0dG9uIGJhc2VkIG9uIGpvaW5hYmxlXG4gICAgaWYgKGpvaW5hYmxlKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gSm9pbmFibGUgaXMgdHJ1ZSwgc2hvd2luZyBqb2luIGJ1dHRvbicpO1xuICAgICAgdGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuUkVBRFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBXYWl0aW5nIGZvciBqb2luYWJsZS4uLicpO1xuICAgICAgdGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuV0FJVElOR19GT1JfSk9JTkFCTEU7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB1c2VyIGNsaWNrcyB0aGUgam9pbiBidXR0b24uXG4gICAqIENhbGxzIC9zdGFydCB0byBnZXQgdG9rZW4gdGhlbiBhdXRvLWpvaW5zLlxuICAgKi9cbiAgcHVibGljIGpvaW5TZXNzaW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhcnRTZXNzaW9uQW5kSm9pbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHVzZXIgaGFzIG93bmVyL2JhY2tvZmZpY2Ugcm9sZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgaXNCYWNrb2ZmaWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLkJBQ0tPRkZJQ0UgfHxcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuQURNSU5fTUFOQUdFUiB8fFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5NQU5BR0VSXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBzZXNzaW9uIGFuZCBqb2luIC0gY2FsbGVkIHdoZW4gdXNlciBjbGlja3Mgam9pbiBidXR0b25cbiAgICovXG4gIHByaXZhdGUgc3RhcnRTZXNzaW9uQW5kSm9pbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVzb2x2ZWRTZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBXYWl0aW5nUm9vbVN0YXRlLkVSUk9SO1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnU2Vzc2lvbiBJRCBub3QgYXZhaWxhYmxlJztcbiAgICAgIHRoaXMudGFzU2VydmljZS5zdG9wU3RhdHVzUG9sbGluZygpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBXYWl0aW5nUm9vbVN0YXRlLkdFVFRJTkdfVE9LRU47XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gQ2FsbGluZyAvc3RhcnQgZm9yIHNlc3Npb246JywgdGhpcy5yZXNvbHZlZFNlc3Npb25JZCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlXG4gICAgICAgIC5zdGFydFByb3h5VmlkZW9TZXNzaW9uKHtcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMucmVzb2x2ZWRTZXNzaW9uSWQsXG4gICAgICAgICAgbmFtZTogdGhpcy5jdXJyZW50VXNlci5uYW1lLFxuICAgICAgICAgIGxhc3RuYW1lOiB0aGlzLmN1cnJlbnRVc2VyLmxhc3RuYW1lLFxuICAgICAgICB9KVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAodG9rZW5SZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFRva2VuIHJlc3BvbnNlOicsIHRva2VuUmVzcG9uc2UpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSBIVFRQIGFkYXB0ZXIgcmV0dXJucyBlcnJvciBpbiBuZXh0IGluc3RlYWQgb2YgZXJyb3IgaGFuZGxlclxuICAgICAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlPy5jb250ZW50Py50b2tlbikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSBJbnZhbGlkIHRva2VuIHJlc3BvbnNlOicsIHRva2VuUmVzcG9uc2UpO1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZS5FUlJPUjtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAodG9rZW5SZXNwb25zZSBhcyBhbnkpPy5tZXNzYWdlIHx8ICdFcnJvciBhbCBpbmljaWFyIGxhIHNlc2nDs24uIFJlc3B1ZXN0YSBpbnbDoWxpZGEuJztcbiAgICAgICAgICAgICAgdGhpcy50YXNTZXJ2aWNlLnN0b3BTdGF0dXNQb2xsaW5nKCk7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gVG9rZW4gb2J0YWluZWQgc3VjY2Vzc2Z1bGx5LCBqb2luaW5nIHNlc3Npb24uLi4nKTtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlblJlc3BvbnNlLmNvbnRlbnQudG9rZW47XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZS5KT0lOSU5HO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBdXRvLWpvaW4gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIHRoaXMudGFzU2VydmljZS5zdG9wU3RhdHVzUG9sbGluZygpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnam9pbmluZycpO1xuICAgICAgICAgICAgdGhpcy5vcGVuVmlkZW9DYWxsTW9kYWwoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVEFTIERFQlVHXSAvc3RhcnQgcmVxdWVzdCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBXYWl0aW5nUm9vbVN0YXRlLkVSUk9SO1xuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCAnRXJyb3IgYWwgaW5pY2lhciBsYSBzZXNpw7NuLiBQb3IgZmF2b3IsIGludGVudGUgbnVldmFtZW50ZS4nO1xuICAgICAgICAgICAgdGhpcy50YXNTZXJ2aWNlLnN0b3BTdGF0dXNQb2xsaW5nKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1RBUyBERUJVR10gU3RhdGUgc2V0IHRvIEVSUk9SLCBlcnJvck1lc3NhZ2U6JywgdGhpcy5lcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG5cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSB3YWl0aW5nIHJvb21cbiAgICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnRhc1NlcnZpY2Uuc3RvcFN0YXR1c1BvbGxpbmcoKTtcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmRpc21pc3MoJ2NhbmNlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJ5IGFmdGVyIGFuIGVycm9yXG4gICAqL1xuICByZXRyeSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZS5DSEVDS0lOR19TVEFUVVM7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLnRva2VuID0gJyc7XG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVmlkZW9DYWxsTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGFzVmlkZW9jYWxsQ29tcG9uZW50LCB7XG4gICAgICBzaXplOiAneGwnLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtdmlkZW8tbW9kYWwnLFxuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxuICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5zZXNzaW9uSWQgPSB0aGlzLnJlc29sdmVkU2Vzc2lvbklkO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudG9rZW4gPSB0aGlzLnRva2VuO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuYXBwb2ludG1lbnRJZCA9IHRoaXMucmVzb2x2ZWRBcHBvaW50bWVudElkO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudmlkZW9DYWxsSWQgPSB0aGlzLnZpZGVvQ2FsbElkO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudXNlcklkID0gdGhpcy5jdXJyZW50VXNlcj8uaWQ7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50ZW5hbnQgPSB0aGlzLnRlbmFudDtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNSZXR1cm5pbmdGcm9tUGlwID0gZmFsc2U7XG5cbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLnJlc3VsdC50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YXMtd2FpdGluZy1yb29tXCI+XG4gIDwhLS0gSGVhZGVyIC0tPlxuICA8ZGl2IGNsYXNzPVwid2FpdGluZy1yb29tLWhlYWRlclwiPlxuICAgIDxoMiBjbGFzcz1cImhlYWRlci10aXRsZVwiPkluaWNpYXIgdHVybm88L2gyPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2UtYnRuXCIgKGNsaWNrKT1cImNhbmNlbCgpXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIENvbnRlbnQgLS0+XG4gIDxkaXYgY2xhc3M9XCJ3YWl0aW5nLXJvb20tY29udGVudFwiPlxuICAgIDwhLS0gQ0hFQ0tJTkdfU1RBVFVTIFN0YXRlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdGF0ZS1jb250YWluZXJcIiAqbmdJZj1cInN0YXRlID09PSBXYWl0aW5nUm9vbVN0YXRlLkNIRUNLSU5HX1NUQVRVU1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXRlLWljb24gbG9hZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBjbGFzcz1cInN0YXRlLW1lc3NhZ2VcIj5WZXJpZmljYW5kbyBlc3RhZG8gZGUgbGEgc2VzacOzbi4uLjwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gV0FJVElOR19GT1JfSk9JTkFCTEUgU3RhdGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0YXRlLWNvbnRhaW5lclwiICpuZ0lmPVwic3RhdGUgPT09IFdhaXRpbmdSb29tU3RhdGUuV0FJVElOR19GT1JfSk9JTkFCTEVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0ZS1pY29uIGxvYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgY2xhc3M9XCJzdGF0ZS1tZXNzYWdlXCI+RXNwZXJhbmRvIHF1ZSBsYSBzZXNpw7NuIGVzdMOpIGRpc3BvbmlibGUuLi48L3A+XG4gICAgICA8cCBjbGFzcz1cInN0YXRlLXN1Ym1lc3NhZ2VcIj5Qb3IgZmF2b3IsIHBlcm1hbmVjw6kgZW4gZXN0YSBwYW50YWxsYS48L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJFQURZIFN0YXRlIChKb2luIGJ1dHRvbiBlbmFibGVkKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCJzdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5SRUFEWVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXRlLWljb24gcmVhZHlcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGVjay1jaXJjbGVcIj48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPVwic3RhdGUtbWVzc2FnZSBzdWNjZXNzXCI+wqFMYSBzYWxhIGVzdMOhIGxpc3RhITwvcD5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGFjdGlvbi1idG4gam9pbi1idG5cIiAoY2xpY2spPVwiam9pblNlc3Npb24oKVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNpZ24taW5cIj48L2k+XG4gICAgICAgIFVuaXJzZSBhIGxhIGxsYW1hZGFcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBKT0lOSU5HIFN0YXRlIChBdXRvLWpvaW5pbmcpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdGF0ZS1jb250YWluZXJcIiAqbmdJZj1cInN0YXRlID09PSBXYWl0aW5nUm9vbVN0YXRlLkpPSU5JTkdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0ZS1pY29uIGxvYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgY2xhc3M9XCJzdGF0ZS1tZXNzYWdlXCI+SW5ncmVzYW5kbyBhIGxhIGxsYW1hZGEuLi48L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEdFVFRJTkdfVE9LRU4gU3RhdGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0YXRlLWNvbnRhaW5lclwiICpuZ0lmPVwic3RhdGUgPT09IFdhaXRpbmdSb29tU3RhdGUuR0VUVElOR19UT0tFTlwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXRlLWljb24gbG9hZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBjbGFzcz1cInN0YXRlLW1lc3NhZ2VcIj5Db25lY3RhbmRvLi4uPC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFUlJPUiBTdGF0ZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCJzdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5FUlJPUlwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXRlLWljb24gZXJyb3JcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZVwiPjwvaT5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgY2xhc3M9XCJzdGF0ZS1tZXNzYWdlIGVycm9yXCI+T2N1cnJpw7MgdW4gZXJyb3I8L3A+XG4gICAgICA8cCBjbGFzcz1cImVycm9yLWRldGFpbHNcIiAqbmdJZj1cImVycm9yTWVzc2FnZVwiPlxuICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgIDwvcD5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGFjdGlvbi1idG4gcmV0cnktYnRuXCIgKGNsaWNrKT1cInJldHJ5KClcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1yZWZyZXNoXCI+PC9pPlxuICAgICAgICBSZWludGVudGFyXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -7,4 +7,4 @@ export const TAS_CONFIG = new InjectionToken('TAS_CONFIG');
|
|
|
7
7
|
* Injection token for HTTP client adapter
|
|
8
8
|
*/
|
|
9
9
|
export const TAS_HTTP_CLIENT = new InjectionToken('TAS_HTTP_CLIENT');
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rhcy11ZWxsLXNkay9zcmMvbGliL2NvbmZpZy90YXMuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUErQi9DOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDO0FBRXRFOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLElBQUksY0FBYyxDQUFnQixpQkFBaUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIFRBUyBtb2R1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNDb25maWcge1xuICAvKiogVG9rQm94L1ZvbmFnZSBBUEkgS2V5ICovXG4gIHRva0JveEFwaUtleTogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgQVBJIGJhc2UgVVJMIGZvciByb29tL3Rva2VuIGVuZHBvaW50cyAqL1xuICBhcGlCYXNlVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhUVFAgY2xpZW50IGludGVyZmFjZSB0aGF0IGNvbnN1bWluZyBhcHBzIG11c3QgaW1wbGVtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFzSHR0cENsaWVudCB7XG4gIGdldDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1cbiAgKTogT2JzZXJ2YWJsZTxUPjtcbiAgcG9zdDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGJvZHk6IGFueTsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfVxuICApOiBPYnNlcnZhYmxlPFQ+O1xuICBwYXRjaDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGJvZHk6IGFueTsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfVxuICApOiBPYnNlcnZhYmxlPFQ+O1xufVxuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgVEFTIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFRBU19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48VGFzQ29uZmlnPignVEFTX0NPTkZJRycpO1xuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgSFRUUCBjbGllbnQgYWRhcHRlclxuICovXG5leHBvcnQgY29uc3QgVEFTX0hUVFBfQ0xJRU5UID0gbmV3IEluamVjdGlvblRva2VuPFRhc0h0dHBDbGllbnQ+KCdUQVNfSFRUUF9DTElFTlQnKTtcbiJdfQ==
|
|
@@ -66,4 +66,10 @@ export var ViewMode;
|
|
|
66
66
|
ViewMode["FULLSCREEN"] = "FULLSCREEN";
|
|
67
67
|
ViewMode["PIP"] = "PIP";
|
|
68
68
|
})(ViewMode || (ViewMode = {}));
|
|
69
|
-
|
|
69
|
+
// Appointment types
|
|
70
|
+
export var AppointmentStatus;
|
|
71
|
+
(function (AppointmentStatus) {
|
|
72
|
+
AppointmentStatus["CONFIRMED"] = "CONFIRMED";
|
|
73
|
+
AppointmentStatus["CANCELLED"] = "CANCELLED";
|
|
74
|
+
})(AppointmentStatus || (AppointmentStatus = {}));
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLmludGVyZmFjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVE7QUFDUixNQUFNLENBQU4sSUFBWSxXQUtYO0FBTEQsV0FBWSxXQUFXO0lBQ3JCLDBCQUFXLENBQUE7SUFDWCx3QkFBUyxDQUFBO0lBQ1Qsa0NBQW1CLENBQUE7SUFDbkIsb0RBQXFDLENBQUE7QUFDdkMsQ0FBQyxFQUxXLFdBQVcsS0FBWCxXQUFXLFFBS3RCO0FBRUQsTUFBTSxDQUFOLElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN4Qiw2Q0FBMkIsQ0FBQTtJQUMzQix5Q0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSFcsY0FBYyxLQUFkLGNBQWMsUUFHekI7QUFFRCxNQUFNLENBQU4sSUFBWSxXQUlYO0FBSkQsV0FBWSxXQUFXO0lBQ3JCLDhCQUFlLENBQUE7SUFDZiw0QkFBYSxDQUFBO0lBQ2Isc0NBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUpXLFdBQVcsS0FBWCxXQUFXLFFBSXRCO0FBRUQsTUFBTSxDQUFOLElBQVksZUFLWDtBQUxELFdBQVksZUFBZTtJQUN6QixrREFBK0IsQ0FBQTtJQUMvQixzQ0FBbUIsQ0FBQTtJQUNuQiw0Q0FBeUIsQ0FBQTtJQUN6QixnQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUxXLGVBQWUsS0FBZixlQUFlLFFBSzFCO0FBRUQsTUFBTSxDQUFOLElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1Qix1Q0FBaUIsQ0FBQTtJQUNqQiwyQ0FBcUIsQ0FBQTtJQUNyQix5Q0FBbUIsQ0FBQTtJQUNuQiw2Q0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBTFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUs3QjtBQUVELE1BQU0sQ0FBTixJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDcEIsK0JBQWlCLENBQUE7SUFDakIsbUNBQXFCLENBQUE7SUFDckIsbUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUpXLFVBQVUsS0FBVixVQUFVLFFBSXJCO0FBRUQsTUFBTSxDQUFOLElBQVksY0FPWDtBQVBELFdBQVksY0FBYztJQUN4QiwyREFBeUMsQ0FBQTtJQUN6QywyREFBeUMsQ0FBQTtJQUN6Qyw2QkFBVyxDQUFBO0lBQ1gsaURBQStCLENBQUE7SUFDL0IscUVBQW1ELENBQUE7SUFDbkQsK0RBQTZDLENBQUE7QUFDL0MsQ0FBQyxFQVBXLGNBQWMsS0FBZCxjQUFjLFFBT3pCO0FBRUQsTUFBTSxDQUFOLElBQVksY0FLWDtBQUxELFdBQVksY0FBYztJQUN4Qix1Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBaUIsQ0FBQTtJQUNqQix1Q0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBTFcsY0FBYyxLQUFkLGNBQWMsUUFLekI7QUFFRCxNQUFNLENBQU4sSUFBWSxTQU1YO0FBTkQsV0FBWSxTQUFTO0lBQ25CLDBCQUFhLENBQUE7SUFDYixzQ0FBeUIsQ0FBQTtJQUN6QixvQ0FBdUIsQ0FBQTtJQUN2QiwwQ0FBNkIsQ0FBQTtJQUM3Qiw0QkFBZSxDQUFBO0FBQ2pCLENBQUMsRUFOVyxTQUFTLEtBQVQsU0FBUyxRQU1wQjtBQUVELE1BQU0sQ0FBTixJQUFZLFFBR1g7QUFIRCxXQUFZLFFBQVE7SUFDbEIscUNBQXlCLENBQUE7SUFDekIsdUJBQVcsQ0FBQTtBQUNiLENBQUMsRUFIVyxRQUFRLEtBQVIsUUFBUSxRQUduQjtBQW9HRCxvQkFBb0I7QUFDcEIsTUFBTSxDQUFOLElBQVksaUJBR1g7QUFIRCxXQUFZLGlCQUFpQjtJQUMzQiw0Q0FBdUIsQ0FBQTtJQUN2Qiw0Q0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSFcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUc1QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEVudW1zXG5leHBvcnQgZW51bSBUYXNSb29tVHlwZSB7XG4gIFRBUyA9ICdUQVMnLFxuICBKTSA9ICdKTScsXG4gIFdFQklOQVIgPSAnV0VCSU5BUicsXG4gIFdFTExORVNTX01BTkFHRVIgPSAnV0VMTE5FU1NfTUFOQUdFUicsXG59XG5cbmV4cG9ydCBlbnVtIFRhc1Nlc3Npb25UeXBlIHtcbiAgU1BPTlRBTkVPVVMgPSAnU1BPTlRBTkVPVVMnLFxuICBTQ0hFRFVMRUQgPSAnU0NIRURVTEVEJyxcbn1cblxuZXhwb3J0IGVudW0gVGFzVXNlclJvbGUge1xuICBPV05FUiA9ICdPV05FUicsXG4gIFVTRVIgPSAnVVNFUicsXG4gIE1PREVSQVRPUiA9ICdNT0RFUkFUT1InLFxufVxuXG5leHBvcnQgZW51bSBUYXNCdXNpbmVzc1JvbGUge1xuICBBRE1JTl9NQU5BR0VSID0gJ0FETUlOX01BTkFHRVInLFxuICBNQU5BR0VSID0gJ01BTkFHRVInLFxuICBCQUNLT0ZGSUNFID0gJ0JBQ0tPRkZJQ0UnLFxuICBVU0VSID0gJ1VTRVInLFxufVxuXG5leHBvcnQgZW51bSBWaWRlb1Nlc3Npb25TdGF0dXMge1xuICBBQ1RJVkUgPSAnQUNUSVZFJyxcbiAgSU5BQ1RJVkUgPSAnSU5BQ1RJVkUnLFxuICBQRU5ESU5HID0gJ1BFTkRJTkcnLFxuICBTQ0hFRFVMRUQgPSAnU0NIRURVTEVEJyxcbn1cblxuZXhwb3J0IGVudW0gVXNlclN0YXR1cyB7XG4gIEFDVElWRSA9ICdBQ1RJVkUnLFxuICBJTkFDVElWRSA9ICdJTkFDVElWRScsXG4gIEFTU0lHTkVEID0gJ0FTU0lHTkVEJyxcbn1cblxuZXhwb3J0IGVudW0gVXNlckNhbGxBY3Rpb24ge1xuICBXQUlUSU5HX1JPT01fRU5URVIgPSAnV0FJVElOR19ST09NX0VOVEVSJyxcbiAgV0FJVElOR19ST09NX0xFQVZFID0gJ1dBSVRJTkdfUk9PTV9MRUFWRScsXG4gIEJBTiA9ICdCQU4nLFxuICBDSEFOR0VfU1RBVFVTID0gJ0NIQU5HRV9TVEFUVVMnLFxuICBSRVFVRVNUX0dFT0xPQ0FMSVpBVElPTiA9ICdSRVFVRVNUX0dFT0xPQ0FMSVpBVElPTicsXG4gIEFDVElWQVRFX0dFT0xPQ0FUSU9OID0gJ0FDVElWQVRFX0dFT0xPQ0FUSU9OJyxcbn1cblxuZXhwb3J0IGVudW0gUm9vbVVzZXJTdGF0dXMge1xuICBBU1NJR05FRCA9ICdBU1NJR05FRCcsXG4gIFdBSVRJTkcgPSAnV0FJVElORycsXG4gIEpPSU5FRCA9ICdKT0lORUQnLFxuICBGSU5JU0hFRCA9ICdGSU5JU0hFRCcsXG59XG5cbmV4cG9ydCBlbnVtIENhbGxTdGF0ZSB7XG4gIElETEUgPSAnSURMRScsXG4gIENPTk5FQ1RJTkcgPSAnQ09OTkVDVElORycsXG4gIENPTk5FQ1RFRCA9ICdDT05ORUNURUQnLFxuICBESVNDT05ORUNURUQgPSAnRElTQ09OTkVDVEVEJyxcbiAgRVJST1IgPSAnRVJST1InLFxufVxuXG5leHBvcnQgZW51bSBWaWV3TW9kZSB7XG4gIEZVTExTQ1JFRU4gPSAnRlVMTFNDUkVFTicsXG4gIFBJUCA9ICdQSVAnLFxufVxuXG4vLyBVc2VyIGludGVyZmFjZXNcbmV4cG9ydCBpbnRlcmZhY2UgVGFzQ3VycmVudFVzZXIge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhc3RuYW1lOiBzdHJpbmc7XG4gIHJvbGU6IFRhc1VzZXJSb2xlO1xufVxuXG4vKiogSW5wdXQgY29uZmlndXJhdGlvbiBmb3IgdGhlIFRBUyB2aWRlbyBjYWxsIGxpYnJhcnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFzQ2FsbENvbmZpZyB7XG4gIC8vIFN0YXR1cyBlbmRwb2ludCBwYXJhbXNcbiAgYXBwb2ludG1lbnRJZD86IG51bWJlcjtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICByb29tVHlwZTogVGFzUm9vbVR5cGU7XG4gIGVudGl0eUlkOiBudW1iZXI7XG4gIHRlbmFudDogc3RyaW5nO1xuICBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZTtcbiAgLy8gQ3VycmVudCB1c2VyIGluZm8gKGZvciB0b2tlbiByZXF1ZXN0KVxuICBjdXJyZW50VXNlcjogVGFzQ3VycmVudFVzZXI7XG59XG5cbi8vIEFQSSBSZXF1ZXN0L1Jlc3BvbnNlIGludGVyZmFjZXNcbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRTZXNzaW9uUmVxdWVzdCB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhc3RuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVUb2tlblJlcXVlc3Qge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBsYXN0bmFtZTogc3RyaW5nO1xuICByb2xlVkM6IFRhc1VzZXJSb2xlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlVG9rZW5SZXNwb25zZSB7XG4gIGNvbnRlbnQ6IHtcbiAgICB0b2tlbjogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5VmlkZW9TdGF0dXNSZXF1ZXN0IHtcbiAgYXBwb2ludG1lbnRJZD86IG51bWJlcjtcbiAgYnVzaW5lc3NSb2xlPzogVGFzQnVzaW5lc3NSb2xlO1xuICB0ZW5hbnQ/OiBzdHJpbmc7XG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgcm9vbVR5cGU/OiBUYXNSb29tVHlwZTtcbiAgZW50aXR5SWQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlWaWRlb1N0YXR1c1VzZXIge1xuICB1c2VySWQ6IG51bWJlcjtcbiAgcm9sOiBUYXNVc2VyUm9sZTtcbiAgc3RhdHVzOiBVc2VyU3RhdHVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5VmlkZW9TdGF0dXNSZXNwb25zZSB7XG4gIGNvbnRlbnQ6IHtcbiAgICB2aWRlb0NhbGxJZDogbnVtYmVyO1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIHN0YXR1c1ZMOiBWaWRlb1Nlc3Npb25TdGF0dXM7XG4gICAgam9pbmFibGU6IGJvb2xlYW47XG4gICAgd2FpdGluZ1Jvb21BdmFpbGFibGU6IGJvb2xlYW47XG4gICAgYXBwb2ludG1lbnRJZDogbnVtYmVyO1xuICAgIGFjdGl2YXRlR2VvOiBib29sZWFuO1xuICAgIGdlb1JlcXVlc3RBY3RpdmU/OiBib29sZWFuOyAvLyBPd25lciBzZW50IGdlbyByZXF1ZXN0LCB3YWl0aW5nIGZvciB1c2VyIHJlc3BvbnNlXG4gICAgYWxsR2VvR3JhbnRlZD86IGJvb2xlYW47IC8vIEFsbCB1c2VycyBoYXZlIHJlc3BvbmRlZCB3aXRoIGdlb1xuICAgIHVzZXJzOiBQcm94eVZpZGVvU3RhdHVzVXNlcltdO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5VmlkZW9GaW5pc2hSZXF1ZXN0IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmlzaFNlc3Npb25SZXNwb25zZSB7XG4gIGNvbnRlbnQ6IHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgY2FsbFN0YXR1czogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5VmlkZW9Vc2VyTW9kaWZ5UmVxdWVzdCB7XG4gIHVzZXJJZD86IG51bWJlcjtcbiAgdmlkZW9DYWxsSWQ6IG51bWJlcjtcbiAgYWN0aW9uPzogVXNlckNhbGxBY3Rpb247XG4gIG5ld1N0YXR1cz86IFJvb21Vc2VyU3RhdHVzO1xuICBsYXRpdHVkZT86IG51bWJlcjtcbiAgbG9uZ2l0dWRlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRpbmdSb29tVXNlciB7XG4gIHVzZXJJZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogUm9vbVVzZXJTdGF0dXM7XG59XG5cbi8vIEFwcG9pbnRtZW50IHR5cGVzXG5leHBvcnQgZW51bSBBcHBvaW50bWVudFN0YXR1cyB7XG4gIENPTkZJUk1FRCA9ICdDT05GSVJNRUQnLFxuICBDQU5DRUxMRUQgPSAnQ0FOQ0VMTEVEJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXNBcHBvaW50bWVudCB7XG4gIGlkOiBudW1iZXI7XG4gIGFnZW5kYUlkOiBudW1iZXI7XG4gIGRhdGU6IHN0cmluZzsgICAgICAgLy8gXCJZWVlZLU1NLUREXCJcbiAgc3RhcnRUaW1lOiBzdHJpbmc7ICAvLyBcIkhIOm1tXCJcbiAgZW5kVGltZTogc3RyaW5nOyAgICAvLyBcIkhIOm1tXCJcbiAgYm9va2luZ1R5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBBcHBvaW50bWVudFN0YXR1cztcbiAgdGl0bGU6IHN0cmluZztcbiAgbm90ZXM6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRBcHBvaW50bWVudHNSZXF1ZXN0IHtcbiAgZnJvbURhdGU6IHN0cmluZzsgIC8vIFlZWVktTU0tRERcbiAgdG9EYXRlOiBzdHJpbmc7ICAgIC8vIFlZWVktTU0tRERcbn1cbiJdfQ==
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class GeolocationService {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.cachedPosition = null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Request current geolocation position using Web Geolocation API.
|
|
9
|
+
* Works in both browser and Capacitor environments.
|
|
10
|
+
* @returns Promise with {latitude, longitude} or null if denied/unavailable
|
|
11
|
+
*/
|
|
12
|
+
async getCurrentPosition() {
|
|
13
|
+
if (!navigator.geolocation) {
|
|
14
|
+
console.warn('[GeolocationService] Geolocation not supported');
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
navigator.geolocation.getCurrentPosition((position) => {
|
|
19
|
+
const geoPosition = {
|
|
20
|
+
latitude: position.coords.latitude,
|
|
21
|
+
longitude: position.coords.longitude,
|
|
22
|
+
};
|
|
23
|
+
this.cachedPosition = geoPosition;
|
|
24
|
+
resolve(geoPosition);
|
|
25
|
+
}, (error) => {
|
|
26
|
+
console.warn('[GeolocationService] Geolocation error:', error.message);
|
|
27
|
+
resolve(null);
|
|
28
|
+
}, {
|
|
29
|
+
enableHighAccuracy: false,
|
|
30
|
+
timeout: 30000,
|
|
31
|
+
maximumAge: 60000,
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get the cached position from the last successful request.
|
|
37
|
+
*/
|
|
38
|
+
getCachedPosition() {
|
|
39
|
+
return this.cachedPosition;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Clear the cached position.
|
|
43
|
+
*/
|
|
44
|
+
clearCache() {
|
|
45
|
+
this.cachedPosition = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
GeolocationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GeolocationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
49
|
+
GeolocationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GeolocationService, providedIn: 'root' });
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: GeolocationService, decorators: [{
|
|
51
|
+
type: Injectable,
|
|
52
|
+
args: [{
|
|
53
|
+
providedIn: 'root',
|
|
54
|
+
}]
|
|
55
|
+
}] });
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rhcy11ZWxsLXNkay9zcmMvbGliL3NlcnZpY2VzL2dlb2xvY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFVM0MsTUFBTSxPQUFPLGtCQUFrQjtJQUgvQjtRQUlVLG1CQUFjLEdBQXVCLElBQUksQ0FBQztLQWlEbkQ7SUEvQ0M7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0I7UUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7WUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0IsU0FBUyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDdEMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDWCxNQUFNLFdBQVcsR0FBZ0I7b0JBQy9CLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVE7b0JBQ2xDLFNBQVMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVM7aUJBQ3JDLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2QixDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDUixPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLENBQUMsRUFDRDtnQkFDRSxrQkFBa0IsRUFBRSxLQUFLO2dCQUN6QixPQUFPLEVBQUUsS0FBSztnQkFDZCxVQUFVLEVBQUUsS0FBSzthQUNsQixDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVTtRQUNmLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7O2dIQWpEVSxrQkFBa0I7b0hBQWxCLGtCQUFrQixjQUZqQixNQUFNOzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VvUG9zaXRpb24ge1xuICBsYXRpdHVkZTogbnVtYmVyO1xuICBsb25naXR1ZGU6IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEdlb2xvY2F0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgY2FjaGVkUG9zaXRpb246IEdlb1Bvc2l0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgY3VycmVudCBnZW9sb2NhdGlvbiBwb3NpdGlvbiB1c2luZyBXZWIgR2VvbG9jYXRpb24gQVBJLlxuICAgKiBXb3JrcyBpbiBib3RoIGJyb3dzZXIgYW5kIENhcGFjaXRvciBlbnZpcm9ubWVudHMuXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB7bGF0aXR1ZGUsIGxvbmdpdHVkZX0gb3IgbnVsbCBpZiBkZW5pZWQvdW5hdmFpbGFibGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDdXJyZW50UG9zaXRpb24oKTogUHJvbWlzZTxHZW9Qb3NpdGlvbiB8IG51bGw+IHtcbiAgICBpZiAoIW5hdmlnYXRvci5nZW9sb2NhdGlvbikge1xuICAgICAgY29uc29sZS53YXJuKCdbR2VvbG9jYXRpb25TZXJ2aWNlXSBHZW9sb2NhdGlvbiBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oXG4gICAgICAgIChwb3NpdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGdlb1Bvc2l0aW9uOiBHZW9Qb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIGxhdGl0dWRlOiBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUsXG4gICAgICAgICAgICBsb25naXR1ZGU6IHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmNhY2hlZFBvc2l0aW9uID0gZ2VvUG9zaXRpb247XG4gICAgICAgICAgcmVzb2x2ZShnZW9Qb3NpdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW0dlb2xvY2F0aW9uU2VydmljZV0gR2VvbG9jYXRpb24gZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogZmFsc2UsIC8vIFVzZSBsb3dlciBhY2N1cmFjeSBmb3IgZmFzdGVyIHJlc3BvbnNlXG4gICAgICAgICAgdGltZW91dDogMzAwMDAsIC8vIDMwIHNlY29uZHMgdGltZW91dFxuICAgICAgICAgIG1heGltdW1BZ2U6IDYwMDAwLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY2FjaGVkIHBvc2l0aW9uIGZyb20gdGhlIGxhc3Qgc3VjY2Vzc2Z1bCByZXF1ZXN0LlxuICAgKi9cbiAgcHVibGljIGdldENhY2hlZFBvc2l0aW9uKCk6IEdlb1Bvc2l0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkUG9zaXRpb247XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGNhY2hlZCBwb3NpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGVkUG9zaXRpb24gPSBudWxsO1xuICB9XG59XG4iXX0=
|