tas-uell-sdk 0.0.5 → 0.0.6
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 +94 -53
- package/esm2020/lib/components/tas-avatar/tas-avatar.component.mjs +75 -0
- package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +156 -63
- package/esm2020/lib/components/tas-floating-call/tas-floating-call.component.mjs +48 -23
- package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +109 -18
- package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +158 -150
- package/esm2020/lib/config/tas.config.mjs +1 -1
- package/esm2020/lib/interfaces/tas.interfaces.mjs +39 -2
- package/esm2020/lib/services/tas.service.mjs +363 -34
- package/esm2020/lib/tas-uell-sdk.module.mjs +19 -21
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/tas-uell-sdk.mjs +945 -292
- package/fesm2015/tas-uell-sdk.mjs.map +1 -1
- package/fesm2020/tas-uell-sdk.mjs +940 -290
- package/fesm2020/tas-uell-sdk.mjs.map +1 -1
- package/lib/components/tas-avatar/tas-avatar.component.d.ts +9 -0
- package/lib/components/tas-btn/tas-btn.component.d.ts +33 -15
- package/lib/components/tas-floating-call/tas-floating-call.component.d.ts +5 -1
- package/lib/components/tas-videocall/tas-videocall.component.d.ts +23 -2
- package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +28 -34
- package/lib/config/tas.config.d.ts +4 -0
- package/lib/interfaces/tas.interfaces.d.ts +103 -35
- package/lib/services/tas.service.d.ts +86 -9
- package/lib/tas-uell-sdk.module.d.ts +4 -3
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/src/lib/styles/tas-global.scss +27 -28
- package/INSTALL_AND_TEST.md +0 -427
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { Injectable, Inject } from
|
|
2
|
-
import { BehaviorSubject } from
|
|
3
|
-
import { catchError, map } from
|
|
4
|
-
import * as OT from
|
|
5
|
-
import { CallState, ViewMode, } from
|
|
6
|
-
import { TAS_CONFIG, TAS_HTTP_CLIENT } from
|
|
1
|
+
import { Injectable, Inject } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { catchError, map } from 'rxjs/operators';
|
|
4
|
+
import * as OT from '@opentok/client';
|
|
5
|
+
import { UserCallAction, RoomUserStatus, TasBusinessRole, TasUserRole, CallState, ViewMode, } from '../interfaces/tas.interfaces';
|
|
6
|
+
import { TAS_CONFIG, TAS_HTTP_CLIENT, } from '../config/tas.config';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
// Re-export enums for backward compatibility
|
|
9
|
-
export { CallState, ViewMode };
|
|
9
|
+
export { CallState, ViewMode, TasBusinessRole, UserCallAction, RoomUserStatus };
|
|
10
10
|
export class TasService {
|
|
11
11
|
constructor(httpClient, config) {
|
|
12
12
|
this.httpClient = httpClient;
|
|
@@ -23,6 +23,77 @@ export class TasService {
|
|
|
23
23
|
// Session info for PiP mode restoration
|
|
24
24
|
this.currentSessionId = null;
|
|
25
25
|
this.currentToken = null;
|
|
26
|
+
this.STORAGE_KEY = 'tas_session_state';
|
|
27
|
+
this.DISCONNECTED_FLAG_KEY = 'tas_session_disconnected';
|
|
28
|
+
this.isFinishingSession = false;
|
|
29
|
+
// Proxy-video circuit state
|
|
30
|
+
this.proxyVideoSessionId = null;
|
|
31
|
+
this.proxyVideoToken = null;
|
|
32
|
+
this.currentBusinessRole = TasBusinessRole.USER;
|
|
33
|
+
// Waiting room and status polling
|
|
34
|
+
this.waitingRoomUsersSubject = new BehaviorSubject([]);
|
|
35
|
+
this.waitingRoomUsers$ = this.waitingRoomUsersSubject.asObservable();
|
|
36
|
+
this.ownerHasJoinedSubject = new BehaviorSubject(false);
|
|
37
|
+
this.ownerHasJoined$ = this.ownerHasJoinedSubject.asObservable();
|
|
38
|
+
// Observable that emits true when owner was present but then left
|
|
39
|
+
this.ownerHasLeftSubject = new BehaviorSubject(false);
|
|
40
|
+
this.ownerHasLeft$ = this.ownerHasLeftSubject.asObservable();
|
|
41
|
+
this.joinableSubject = new BehaviorSubject(false);
|
|
42
|
+
this.joinable$ = this.joinableSubject.asObservable();
|
|
43
|
+
this.statusPollingInterval = null;
|
|
44
|
+
this.DEFAULT_POLL_INTERVAL_MS = 30000; // Default 30s
|
|
45
|
+
this.wasOwnerPresent = false;
|
|
46
|
+
// Current call context
|
|
47
|
+
this.currentAppointmentId = null;
|
|
48
|
+
this.currentVideoCallId = null;
|
|
49
|
+
this.currentTenant = null;
|
|
50
|
+
}
|
|
51
|
+
// ... (Getters and other methods remain unchanged)
|
|
52
|
+
/**
|
|
53
|
+
* Start automatic status polling for the current session.
|
|
54
|
+
* Status is polled every intervalMs (default 30s).
|
|
55
|
+
*/
|
|
56
|
+
startStatusPolling(params, intervalMs = this.DEFAULT_POLL_INTERVAL_MS) {
|
|
57
|
+
this.stopStatusPolling(); // Clear any existing polling
|
|
58
|
+
// Store context for polling
|
|
59
|
+
if (params.sessionId) {
|
|
60
|
+
this.currentSessionId = params.sessionId;
|
|
61
|
+
}
|
|
62
|
+
if (params.appointmentId) {
|
|
63
|
+
this.currentAppointmentId = params.appointmentId;
|
|
64
|
+
}
|
|
65
|
+
if (params.tenant) {
|
|
66
|
+
this.currentTenant = params.tenant;
|
|
67
|
+
}
|
|
68
|
+
console.log(`[TAS DEBUG] Starting status polling with interval ${intervalMs}ms`);
|
|
69
|
+
// Initial status fetch
|
|
70
|
+
this.fetchAndProcessStatus(params);
|
|
71
|
+
// Set up periodic polling
|
|
72
|
+
this.statusPollingInterval = setInterval(() => {
|
|
73
|
+
this.fetchAndProcessStatus(params);
|
|
74
|
+
}, intervalMs);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Stop automatic status polling.
|
|
78
|
+
*/
|
|
79
|
+
stopStatusPolling() {
|
|
80
|
+
if (this.statusPollingInterval) {
|
|
81
|
+
clearInterval(this.statusPollingInterval);
|
|
82
|
+
this.statusPollingInterval = null;
|
|
83
|
+
}
|
|
84
|
+
// Do NOT reset waiting room state here, as other components might observe it
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Reset polling state (waiting room, owner status, etc)
|
|
88
|
+
* Call this when completely exiting the flow
|
|
89
|
+
*/
|
|
90
|
+
resetPollingState() {
|
|
91
|
+
this.stopStatusPolling();
|
|
92
|
+
this.waitingRoomUsersSubject.next([]);
|
|
93
|
+
this.ownerHasJoinedSubject.next(false);
|
|
94
|
+
this.ownerHasLeftSubject.next(false);
|
|
95
|
+
this.joinableSubject.next(false);
|
|
96
|
+
this.wasOwnerPresent = false;
|
|
26
97
|
}
|
|
27
98
|
// Getters
|
|
28
99
|
get currentSession() {
|
|
@@ -40,18 +111,36 @@ export class TasService {
|
|
|
40
111
|
get token() {
|
|
41
112
|
return this.currentToken;
|
|
42
113
|
}
|
|
114
|
+
get proxySessionId() {
|
|
115
|
+
return this.proxyVideoSessionId;
|
|
116
|
+
}
|
|
117
|
+
get proxyToken() {
|
|
118
|
+
return this.proxyVideoToken;
|
|
119
|
+
}
|
|
120
|
+
get businessRole() {
|
|
121
|
+
return this.currentBusinessRole;
|
|
122
|
+
}
|
|
43
123
|
get isMuted() {
|
|
44
124
|
return this.isMutedSubject.getValue();
|
|
45
125
|
}
|
|
46
126
|
// View Mode Methods
|
|
47
127
|
setViewMode(mode) {
|
|
48
128
|
this.viewModeSubject.next(mode);
|
|
129
|
+
if (this.currentSessionId && this.currentToken) {
|
|
130
|
+
this.saveSessionState(this.currentSessionId, this.currentToken, mode, this.currentBusinessRole);
|
|
131
|
+
}
|
|
49
132
|
}
|
|
50
133
|
enterPipMode() {
|
|
51
134
|
this.viewModeSubject.next(ViewMode.PIP);
|
|
135
|
+
if (this.currentSessionId && this.currentToken) {
|
|
136
|
+
this.saveSessionState(this.currentSessionId, this.currentToken, ViewMode.PIP, this.currentBusinessRole);
|
|
137
|
+
}
|
|
52
138
|
}
|
|
53
139
|
exitPipMode() {
|
|
54
140
|
this.viewModeSubject.next(ViewMode.FULLSCREEN);
|
|
141
|
+
if (this.currentSessionId && this.currentToken) {
|
|
142
|
+
this.saveSessionState(this.currentSessionId, this.currentToken, ViewMode.FULLSCREEN, this.currentBusinessRole);
|
|
143
|
+
}
|
|
55
144
|
}
|
|
56
145
|
isPipMode() {
|
|
57
146
|
return this.viewModeSubject.getValue() === ViewMode.PIP;
|
|
@@ -78,7 +167,17 @@ export class TasService {
|
|
|
78
167
|
}
|
|
79
168
|
}
|
|
80
169
|
// Session Management
|
|
81
|
-
disconnectSession() {
|
|
170
|
+
disconnectSession(clearStorage = true) {
|
|
171
|
+
console.log('[TAS DEBUG] TasService.disconnectSession called. clearStorage:', clearStorage);
|
|
172
|
+
// Call finishSession before disconnecting if we have a sessionId
|
|
173
|
+
const sessionIdToFinish = this.currentSessionId;
|
|
174
|
+
// Clear storage FIRST to prevent any race conditions where state might be saved after disconnect
|
|
175
|
+
if (clearStorage) {
|
|
176
|
+
this.clearSessionState();
|
|
177
|
+
// Set a flag to indicate this session was intentionally disconnected
|
|
178
|
+
// This prevents reconnection on page reload
|
|
179
|
+
sessionStorage.setItem(this.DISCONNECTED_FLAG_KEY, 'true');
|
|
180
|
+
}
|
|
82
181
|
if (this.session) {
|
|
83
182
|
this.session.disconnect();
|
|
84
183
|
this.session = null;
|
|
@@ -87,49 +186,260 @@ export class TasService {
|
|
|
87
186
|
this.subscribers = [];
|
|
88
187
|
this.currentSessionId = null;
|
|
89
188
|
this.currentToken = null;
|
|
189
|
+
this.proxyVideoSessionId = null;
|
|
190
|
+
this.proxyVideoToken = null;
|
|
90
191
|
this.isMutedSubject.next(false); // Reset mute state
|
|
91
192
|
this.viewModeSubject.next(ViewMode.FULLSCREEN);
|
|
92
193
|
this.callStateSubject.next(CallState.DISCONNECTED);
|
|
194
|
+
// Call proxy finish after disconnecting (only if not already finishing)
|
|
195
|
+
if (sessionIdToFinish && !this.isFinishingSession) {
|
|
196
|
+
this.isFinishingSession = true;
|
|
197
|
+
this.finishProxyVideoSession({
|
|
198
|
+
sessionId: sessionIdToFinish,
|
|
199
|
+
businessRole: this.currentBusinessRole,
|
|
200
|
+
}).subscribe({
|
|
201
|
+
next: (response) => {
|
|
202
|
+
console.log('[TAS DEBUG] Session finished successfully:', response);
|
|
203
|
+
this.isFinishingSession = false;
|
|
204
|
+
},
|
|
205
|
+
error: (error) => {
|
|
206
|
+
console.error('[TAS DEBUG] Error finishing session:', error);
|
|
207
|
+
this.isFinishingSession = false;
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
}
|
|
93
211
|
}
|
|
94
212
|
isCallActive() {
|
|
95
213
|
return this.callStateSubject.getValue() === CallState.CONNECTED;
|
|
96
214
|
}
|
|
215
|
+
// State Persistence
|
|
216
|
+
saveSessionState(sessionId, token, viewMode, businessRole = TasBusinessRole.USER) {
|
|
217
|
+
const state = {
|
|
218
|
+
sessionId,
|
|
219
|
+
token,
|
|
220
|
+
viewMode,
|
|
221
|
+
businessRole,
|
|
222
|
+
};
|
|
223
|
+
sessionStorage.setItem(this.STORAGE_KEY, JSON.stringify(state));
|
|
224
|
+
}
|
|
225
|
+
clearSessionState() {
|
|
226
|
+
sessionStorage.removeItem(this.STORAGE_KEY);
|
|
227
|
+
// Also clear the disconnected flag when clearing state
|
|
228
|
+
sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);
|
|
229
|
+
}
|
|
230
|
+
canRestoreSession() {
|
|
231
|
+
return !!sessionStorage.getItem(this.STORAGE_KEY);
|
|
232
|
+
}
|
|
233
|
+
restoreSession(containerId) {
|
|
234
|
+
const savedState = sessionStorage.getItem(this.STORAGE_KEY);
|
|
235
|
+
if (!savedState)
|
|
236
|
+
return;
|
|
237
|
+
// Check if this session was intentionally disconnected
|
|
238
|
+
// If so, don't restore it on page reload
|
|
239
|
+
const wasDisconnected = sessionStorage.getItem(this.DISCONNECTED_FLAG_KEY);
|
|
240
|
+
if (wasDisconnected === 'true') {
|
|
241
|
+
console.log('[TAS DEBUG] Session was intentionally disconnected, skipping restore');
|
|
242
|
+
this.clearSessionState();
|
|
243
|
+
sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
// Don't restore if we're already disconnected or if there's no active session
|
|
247
|
+
// This prevents restoring sessions that were properly disconnected
|
|
248
|
+
if (this.callStateSubject.getValue() === CallState.DISCONNECTED) {
|
|
249
|
+
console.log('[TAS DEBUG] Call state is DISCONNECTED, skipping restore');
|
|
250
|
+
this.clearSessionState();
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
try {
|
|
254
|
+
const state = JSON.parse(savedState);
|
|
255
|
+
if (state.sessionId && state.token) {
|
|
256
|
+
console.log('[TAS DEBUG] Restoring session from storage');
|
|
257
|
+
// Force PiP mode for restoration to ensure UI consistency
|
|
258
|
+
this.viewModeSubject.next(ViewMode.PIP);
|
|
259
|
+
if (state.businessRole) {
|
|
260
|
+
this.currentBusinessRole = state.businessRole;
|
|
261
|
+
}
|
|
262
|
+
this.connectSession(state.sessionId, state.token, containerId, // Use the same container for both since we are in PiP
|
|
263
|
+
containerId, this.currentBusinessRole)
|
|
264
|
+
.then(() => {
|
|
265
|
+
console.log('[TAS DEBUG] Session restored successfully');
|
|
266
|
+
// Clear the disconnected flag if restoration succeeds
|
|
267
|
+
sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);
|
|
268
|
+
})
|
|
269
|
+
.catch((err) => {
|
|
270
|
+
console.error('[TAS DEBUG] Failed to restore session:', err);
|
|
271
|
+
this.clearSessionState(); // Clear bad state
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch (e) {
|
|
276
|
+
console.error('[TAS DEBUG] Error parsing saved session state', e);
|
|
277
|
+
this.clearSessionState();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
97
280
|
// API Methods
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
281
|
+
/**
|
|
282
|
+
* PROXY circuit token: /v2/proxy/video/start
|
|
283
|
+
*/
|
|
284
|
+
startProxyVideoSession(payload) {
|
|
285
|
+
return this.httpClient
|
|
286
|
+
.post('v2/proxy/video/start', {
|
|
287
|
+
body: payload,
|
|
288
|
+
headers: {},
|
|
289
|
+
})
|
|
290
|
+
.pipe(map((response) => response), catchError((error) => {
|
|
291
|
+
console.error('TAS Service: startProxyVideoSession failed', error);
|
|
101
292
|
throw error;
|
|
102
293
|
}));
|
|
103
294
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
295
|
+
/**
|
|
296
|
+
* PROXY circuit status: /v2/proxy/video/status
|
|
297
|
+
*/
|
|
298
|
+
getProxyVideoStatus(payload) {
|
|
299
|
+
return this.httpClient
|
|
300
|
+
.post('v2/proxy/video/status', {
|
|
301
|
+
body: payload,
|
|
302
|
+
headers: {},
|
|
303
|
+
})
|
|
304
|
+
.pipe(map((response) => response), catchError((error) => {
|
|
305
|
+
console.error('TAS Service: getProxyVideoStatus failed', error);
|
|
306
|
+
throw error;
|
|
307
|
+
}));
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* PROXY circuit user modification: /v2/proxy/video/user/modify
|
|
311
|
+
*/
|
|
312
|
+
modifyProxyVideoUser(payload) {
|
|
313
|
+
return this.httpClient
|
|
314
|
+
.patch('v2/proxy/video/user/modify', {
|
|
315
|
+
body: payload,
|
|
316
|
+
headers: {},
|
|
317
|
+
})
|
|
318
|
+
.pipe(catchError((error) => {
|
|
319
|
+
console.error('TAS Service: modifyProxyVideoUser failed', error);
|
|
320
|
+
throw error;
|
|
321
|
+
}));
|
|
322
|
+
}
|
|
323
|
+
finishProxyVideoSession(payload) {
|
|
324
|
+
return this.httpClient
|
|
325
|
+
.post('v2/proxy/video/finish', {
|
|
326
|
+
body: payload,
|
|
327
|
+
headers: {},
|
|
328
|
+
})
|
|
329
|
+
.pipe(map((response) => response), catchError((error) => {
|
|
330
|
+
console.error('TAS Service: finishProxyVideoSession failed', error);
|
|
107
331
|
throw error;
|
|
108
332
|
}));
|
|
109
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* Start automatic status polling for the current session.
|
|
336
|
+
* Status is polled every STATUS_POLL_INTERVAL_MS milliseconds.
|
|
337
|
+
*/
|
|
338
|
+
/**
|
|
339
|
+
* Stop automatic status polling.
|
|
340
|
+
*/
|
|
341
|
+
/**
|
|
342
|
+
* Fetch status and process the response.
|
|
343
|
+
*/
|
|
344
|
+
fetchAndProcessStatus(params) {
|
|
345
|
+
this.getProxyVideoStatus(params).subscribe({
|
|
346
|
+
next: (response) => {
|
|
347
|
+
this.processStatusResponse(response);
|
|
348
|
+
},
|
|
349
|
+
error: (err) => {
|
|
350
|
+
console.error('[TAS DEBUG] Status polling error:', err);
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Process status response to update waiting room users and owner join status.
|
|
356
|
+
*/
|
|
357
|
+
processStatusResponse(response) {
|
|
358
|
+
const content = response.content;
|
|
359
|
+
// Update videoCallId if available
|
|
360
|
+
if (content.videoCallId) {
|
|
361
|
+
this.currentVideoCallId = content.videoCallId;
|
|
362
|
+
}
|
|
363
|
+
// Update sessionId if available
|
|
364
|
+
if (content.sessionId) {
|
|
365
|
+
this.currentSessionId = content.sessionId;
|
|
366
|
+
this.proxyVideoSessionId = content.sessionId;
|
|
367
|
+
}
|
|
368
|
+
// Update joinable status
|
|
369
|
+
this.joinableSubject.next(content.joinable);
|
|
370
|
+
// Check if owner has joined
|
|
371
|
+
const ownerJoined = this.checkIfOwnerJoined(content.users);
|
|
372
|
+
this.ownerHasJoinedSubject.next(ownerJoined);
|
|
373
|
+
// Detect if owner left: was present, now not present
|
|
374
|
+
if (this.wasOwnerPresent && !ownerJoined) {
|
|
375
|
+
console.log('[TAS DEBUG] Owner has left the session');
|
|
376
|
+
this.ownerHasLeftSubject.next(true);
|
|
377
|
+
}
|
|
378
|
+
if (ownerJoined) {
|
|
379
|
+
this.wasOwnerPresent = true;
|
|
380
|
+
}
|
|
381
|
+
// Extract waiting room users (status === WAITING)
|
|
382
|
+
const waitingUsers = content.users
|
|
383
|
+
.filter((u) => u.status === 'WAITING')
|
|
384
|
+
.map((u) => ({
|
|
385
|
+
userId: u.userId,
|
|
386
|
+
name: `User ${u.userId}`,
|
|
387
|
+
status: RoomUserStatus.WAITING,
|
|
388
|
+
}));
|
|
389
|
+
this.waitingRoomUsersSubject.next(waitingUsers);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Check if at least one OWNER has joined the call.
|
|
393
|
+
*/
|
|
394
|
+
checkIfOwnerJoined(users) {
|
|
395
|
+
return users.some((u) => u.rol === TasUserRole.OWNER && u.status === 'JOINED');
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Admit a user from the waiting room by changing their status.
|
|
399
|
+
*/
|
|
400
|
+
admitUserFromWaitingRoom(userId, videoCallId) {
|
|
401
|
+
return this.modifyProxyVideoUser({
|
|
402
|
+
userId,
|
|
403
|
+
videoCallId,
|
|
404
|
+
action: UserCallAction.WAITING_ROOM_LEAVE,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
// Getters for current call context
|
|
408
|
+
get appointmentId() {
|
|
409
|
+
return this.currentAppointmentId;
|
|
410
|
+
}
|
|
411
|
+
get videoCallId() {
|
|
412
|
+
return this.currentVideoCallId;
|
|
413
|
+
}
|
|
110
414
|
/**
|
|
111
415
|
* Connects to a TokBox video session
|
|
112
416
|
*/
|
|
113
|
-
connectSession(sessionId, token, publisherElement, subscriberElement) {
|
|
417
|
+
connectSession(sessionId, token, publisherElement, subscriberElement, businessRole = TasBusinessRole.USER) {
|
|
114
418
|
this.callStateSubject.next(CallState.CONNECTING);
|
|
115
419
|
this.currentSessionId = sessionId;
|
|
116
420
|
this.currentToken = token;
|
|
421
|
+
this.currentBusinessRole = businessRole;
|
|
422
|
+
this.isFinishingSession = false; // Reset flag for new session
|
|
423
|
+
// Save initial state (defaulting to current view mode)
|
|
424
|
+
this.saveSessionState(sessionId, token, this.viewModeSubject.getValue(), businessRole);
|
|
425
|
+
// Clear the disconnected flag when starting a new connection
|
|
426
|
+
sessionStorage.removeItem(this.DISCONNECTED_FLAG_KEY);
|
|
117
427
|
return new Promise((resolve, reject) => {
|
|
118
428
|
if (!OT.checkSystemRequirements()) {
|
|
119
429
|
this.callStateSubject.next(CallState.ERROR);
|
|
120
|
-
reject(new Error(
|
|
430
|
+
reject(new Error('Browser not compatible with TokBox'));
|
|
121
431
|
return;
|
|
122
432
|
}
|
|
123
433
|
this.session = OT.initSession(this.config.tokBoxApiKey, sessionId);
|
|
124
434
|
// Handle new streams (remote participants joining)
|
|
125
|
-
this.session.on(
|
|
435
|
+
this.session.on('streamCreated', (event) => {
|
|
126
436
|
const subscriber = this.session?.subscribe(event.stream, subscriberElement, {
|
|
127
|
-
insertMode:
|
|
128
|
-
width:
|
|
129
|
-
height:
|
|
437
|
+
insertMode: 'append',
|
|
438
|
+
width: '100%',
|
|
439
|
+
height: '100%',
|
|
130
440
|
}, (error) => {
|
|
131
441
|
if (error) {
|
|
132
|
-
console.error(
|
|
442
|
+
console.error('Error subscribing to stream:', error);
|
|
133
443
|
}
|
|
134
444
|
});
|
|
135
445
|
if (subscriber) {
|
|
@@ -137,29 +447,48 @@ export class TasService {
|
|
|
137
447
|
}
|
|
138
448
|
});
|
|
139
449
|
// Handle streams ending (remote participants leaving)
|
|
140
|
-
this.session.on(
|
|
450
|
+
this.session.on('streamDestroyed', (event) => {
|
|
141
451
|
this.subscribers = this.subscribers.filter((sub) => sub.stream?.streamId !== event.stream.streamId);
|
|
142
452
|
});
|
|
143
453
|
// Handle session disconnection
|
|
144
|
-
this.session.on(
|
|
454
|
+
this.session.on('sessionDisconnected', () => {
|
|
145
455
|
this.callStateSubject.next(CallState.DISCONNECTED);
|
|
456
|
+
// Call finishSession when session is disconnected (e.g., by server)
|
|
457
|
+
// Only call if not already finishing (prevents duplicate calls)
|
|
458
|
+
const sessionIdToFinish = this.currentSessionId;
|
|
459
|
+
if (sessionIdToFinish && !this.isFinishingSession) {
|
|
460
|
+
this.isFinishingSession = true;
|
|
461
|
+
this.finishProxyVideoSession({
|
|
462
|
+
sessionId: sessionIdToFinish,
|
|
463
|
+
businessRole: this.currentBusinessRole,
|
|
464
|
+
}).subscribe({
|
|
465
|
+
next: (response) => {
|
|
466
|
+
console.log('[TAS DEBUG] Session finished on disconnect event:', response);
|
|
467
|
+
this.isFinishingSession = false;
|
|
468
|
+
},
|
|
469
|
+
error: (error) => {
|
|
470
|
+
console.error('[TAS DEBUG] Error finishing session on disconnect:', error);
|
|
471
|
+
this.isFinishingSession = false;
|
|
472
|
+
},
|
|
473
|
+
});
|
|
474
|
+
}
|
|
146
475
|
});
|
|
147
476
|
// Connect to session
|
|
148
477
|
this.session.connect(token, (error) => {
|
|
149
478
|
if (error) {
|
|
150
|
-
console.error(
|
|
479
|
+
console.error('Error connecting to session:', error);
|
|
151
480
|
this.callStateSubject.next(CallState.ERROR);
|
|
152
481
|
reject(error);
|
|
153
482
|
return;
|
|
154
483
|
}
|
|
155
484
|
// Initialize publisher (local video)
|
|
156
485
|
this.publisher = OT.initPublisher(publisherElement, {
|
|
157
|
-
insertMode:
|
|
158
|
-
width:
|
|
159
|
-
height:
|
|
486
|
+
insertMode: 'append',
|
|
487
|
+
width: '100%',
|
|
488
|
+
height: '100%',
|
|
160
489
|
}, (err) => {
|
|
161
490
|
if (err) {
|
|
162
|
-
console.error(
|
|
491
|
+
console.error('Error initializing publisher:', err);
|
|
163
492
|
this.callStateSubject.next(CallState.ERROR);
|
|
164
493
|
reject(err);
|
|
165
494
|
return;
|
|
@@ -167,7 +496,7 @@ export class TasService {
|
|
|
167
496
|
// Publish to session
|
|
168
497
|
this.session?.publish(this.publisher, (pubErr) => {
|
|
169
498
|
if (pubErr) {
|
|
170
|
-
console.error(
|
|
499
|
+
console.error('Error publishing stream:', pubErr);
|
|
171
500
|
this.callStateSubject.next(CallState.ERROR);
|
|
172
501
|
reject(pubErr);
|
|
173
502
|
}
|
|
@@ -227,12 +556,12 @@ export class TasService {
|
|
|
227
556
|
this.movePublisherTo('publisher-container');
|
|
228
557
|
}
|
|
229
558
|
}
|
|
230
|
-
TasService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
231
|
-
TasService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.
|
|
232
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.
|
|
559
|
+
TasService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasService, deps: [{ token: TAS_HTTP_CLIENT }, { token: TAS_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
560
|
+
TasService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasService, providedIn: 'root' });
|
|
561
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasService, decorators: [{
|
|
233
562
|
type: Injectable,
|
|
234
563
|
args: [{
|
|
235
|
-
providedIn:
|
|
564
|
+
providedIn: 'root',
|
|
236
565
|
}]
|
|
237
566
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
238
567
|
type: Inject,
|
|
@@ -241,4 +570,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
241
570
|
type: Inject,
|
|
242
571
|
args: [TAS_CONFIG]
|
|
243
572
|
}] }]; } });
|
|
244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9zZXJ2aWNlcy90YXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBS04sU0FBUyxFQUNULFFBQVEsR0FDUixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUE0QixNQUFNLHNCQUFzQixDQUFDOztBQUU3Riw2Q0FBNkM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUsvQixNQUFNLE9BQU8sVUFBVTtJQWtCdEIsWUFDa0MsVUFBeUIsRUFDOUIsTUFBaUI7UUFEWixlQUFVLEdBQVYsVUFBVSxDQUFlO1FBQzlCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFuQnRDLFlBQU8sR0FBc0IsSUFBSSxDQUFDO1FBQ2xDLGNBQVMsR0FBd0IsSUFBSSxDQUFDO1FBQ3RDLGdCQUFXLEdBQW9CLEVBQUUsQ0FBQztRQUVsQyxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBWSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsZUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVqRCxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFXLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RSxjQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVB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QUMsc0JBQXNCLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDN0MsQ0FBQzs7dUdBdFJXLFVBQVUsa0JBbUJiLGVBQWUsYUFDZixVQUFVOzJHQXBCUCxVQUFVLGNBRlYsTUFBTTsyRkFFTixVQUFVO2tCQUh0QixVQUFVO21CQUFDO29CQUNYLFVBQVUsRUFBRSxNQUFNO2lCQUNsQjs7MEJBb0JFLE1BQU07MkJBQUMsZUFBZTs7MEJBQ3RCLE1BQU07MkJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgKiBhcyBPVCBmcm9tIFwiQG9wZW50b2svY2xpZW50XCI7XG5pbXBvcnQge1xuXHRDcmVhdGVSb29tUmVxdWVzdCxcblx0Q3JlYXRlUm9vbVJlc3BvbnNlLFxuXHRHZW5lcmF0ZVRva2VuUmVxdWVzdCxcblx0R2VuZXJhdGVUb2tlblJlc3BvbnNlLFxuXHRDYWxsU3RhdGUsXG5cdFZpZXdNb2RlLFxufSBmcm9tIFwiLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgVEFTX0NPTkZJRywgVEFTX0hUVFBfQ0xJRU5ULCBUYXNDb25maWcsIFRhc0h0dHBDbGllbnQgfSBmcm9tIFwiLi4vY29uZmlnL3Rhcy5jb25maWdcIjtcblxuLy8gUmUtZXhwb3J0IGVudW1zIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5leHBvcnQgeyBDYWxsU3RhdGUsIFZpZXdNb2RlIH07XG5cbkBJbmplY3RhYmxlKHtcblx0cHJvdmlkZWRJbjogXCJyb290XCIsXG59KVxuZXhwb3J0IGNsYXNzIFRhc1NlcnZpY2Uge1xuXHRwcml2YXRlIHNlc3Npb246IE9ULlNlc3Npb24gfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBwdWJsaXNoZXI6IE9ULlB1Ymxpc2hlciB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIHN1YnNjcmliZXJzOiBPVC5TdWJzY3JpYmVyW10gPSBbXTtcblxuXHRwcml2YXRlIGNhbGxTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGxTdGF0ZT4oQ2FsbFN0YXRlLklETEUpO1xuXHRwdWJsaWMgY2FsbFN0YXRlJCA9IHRoaXMuY2FsbFN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuXHRwcml2YXRlIHZpZXdNb2RlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Vmlld01vZGU+KFZpZXdNb2RlLkZVTExTQ1JFRU4pO1xuXHRwdWJsaWMgdmlld01vZGUkID0gdGhpcy52aWV3TW9kZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cblx0cHJpdmF0ZSBpc011dGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXHRwdWJsaWMgaXNNdXRlZCQgPSB0aGlzLmlzTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG5cdC8vIFNlc3Npb24gaW5mbyBmb3IgUGlQIG1vZGUgcmVzdG9yYXRpb25cblx0cHJpdmF0ZSBjdXJyZW50U2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBjdXJyZW50VG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdEBJbmplY3QoVEFTX0hUVFBfQ0xJRU5UKSBwcml2YXRlIGh0dHBDbGllbnQ6IFRhc0h0dHBDbGllbnQsXG5cdFx0QEluamVjdChUQVNfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVGFzQ29uZmlnXG5cdCkge31cblxuXHQvLyBHZXR0ZXJzXG5cdHB1YmxpYyBnZXQgY3VycmVudFNlc3Npb24oKTogT1QuU2Vzc2lvbiB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLnNlc3Npb247XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGN1cnJlbnRQdWJsaXNoZXIoKTogT1QuUHVibGlzaGVyIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMucHVibGlzaGVyO1xuXHR9XG5cblx0cHVibGljIGdldCBjdXJyZW50U3Vic2NyaWJlcnMoKTogT1QuU3Vic2NyaWJlcltdIHtcblx0XHRyZXR1cm4gdGhpcy5zdWJzY3JpYmVycztcblx0fVxuXG5cdHB1YmxpYyBnZXQgc2Vzc2lvbklkKCk6IHN0cmluZyB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLmN1cnJlbnRTZXNzaW9uSWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLmN1cnJlbnRUb2tlbjtcblx0fVxuXG5cdHB1YmxpYyBnZXQgaXNNdXRlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5pc011dGVkU3ViamVjdC5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0Ly8gVmlldyBNb2RlIE1ldGhvZHNcblx0cHVibGljIHNldFZpZXdNb2RlKG1vZGU6IFZpZXdNb2RlKTogdm9pZCB7XG5cdFx0dGhpcy52aWV3TW9kZVN1YmplY3QubmV4dChtb2RlKTtcblx0fVxuXG5cdHB1YmxpYyBlbnRlclBpcE1vZGUoKTogdm9pZCB7XG5cdFx0dGhpcy52aWV3TW9kZVN1YmplY3QubmV4dChWaWV3TW9kZS5QSVApO1xuXHR9XG5cblx0cHVibGljIGV4aXRQaXBNb2RlKCk6IHZvaWQge1xuXHRcdHRoaXMudmlld01vZGVTdWJqZWN0Lm5leHQoVmlld01vZGUuRlVMTFNDUkVFTik7XG5cdH1cblxuXHRwdWJsaWMgaXNQaXBNb2RlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnZpZXdNb2RlU3ViamVjdC5nZXRWYWx1ZSgpID09PSBWaWV3TW9kZS5QSVA7XG5cdH1cblxuXHQvLyBBdWRpbyBDb250cm9sXG5cdHB1YmxpYyB0b2dnbGVNdXRlKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnB1Ymxpc2hlcikge1xuXHRcdFx0Y29uc3QgbmV3TXV0ZVN0YXRlID0gIXRoaXMuaXNNdXRlZFN1YmplY3QuZ2V0VmFsdWUoKTtcblx0XHRcdGNvbnN0IHNob3VsZEVuYWJsZUF1ZGlvID0gIW5ld011dGVTdGF0ZTtcblx0XHRcdFxuXHRcdFx0Ly8gVXNlIE9wZW5Ub2sncyBwdWJsaXNoQXVkaW9cblx0XHRcdHRoaXMucHVibGlzaGVyLnB1Ymxpc2hBdWRpbyhzaG91bGRFbmFibGVBdWRpbyk7XG5cdFx0XHRcblx0XHRcdC8vIEFsc28gZGlyZWN0bHkgY29udHJvbCB0aGUgTWVkaWFTdHJlYW1UcmFjayBhcyBiYWNrdXBcblx0XHRcdGNvbnN0IGF1ZGlvVHJhY2sgPSB0aGlzLnB1Ymxpc2hlci5nZXRBdWRpb1NvdXJjZT8uKCk7XG5cdFx0XHRpZiAoYXVkaW9UcmFjaykge1xuXHRcdFx0XHRhdWRpb1RyYWNrLmVuYWJsZWQgPSBzaG91bGRFbmFibGVBdWRpbztcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0dGhpcy5pc011dGVkU3ViamVjdC5uZXh0KG5ld011dGVTdGF0ZSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldE11dGUobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5wdWJsaXNoZXIpIHtcblx0XHRcdHRoaXMucHVibGlzaGVyLnB1Ymxpc2hBdWRpbyghbXV0ZWQpO1xuXHRcdFx0dGhpcy5pc011dGVkU3ViamVjdC5uZXh0KG11dGVkKTtcblx0XHR9XG5cdH1cblxuXHQvLyBTZXNzaW9uIE1hbmFnZW1lbnRcblx0cHVibGljIGRpc2Nvbm5lY3RTZXNzaW9uKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnNlc3Npb24pIHtcblx0XHRcdHRoaXMuc2Vzc2lvbi5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLnNlc3Npb24gPSBudWxsO1xuXHRcdH1cblx0XHR0aGlzLnB1Ymxpc2hlciA9IG51bGw7XG5cdFx0dGhpcy5zdWJzY3JpYmVycyA9IFtdO1xuXHRcdHRoaXMuY3VycmVudFNlc3Npb25JZCA9IG51bGw7XG5cdFx0dGhpcy5jdXJyZW50VG9rZW4gPSBudWxsO1xuXHRcdHRoaXMuaXNNdXRlZFN1YmplY3QubmV4dChmYWxzZSk7IC8vIFJlc2V0IG11dGUgc3RhdGVcblx0XHR0aGlzLnZpZXdNb2RlU3ViamVjdC5uZXh0KFZpZXdNb2RlLkZVTExTQ1JFRU4pO1xuXHRcdHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5ESVNDT05ORUNURUQpO1xuXHR9XG5cblx0cHVibGljIGlzQ2FsbEFjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jYWxsU3RhdGVTdWJqZWN0LmdldFZhbHVlKCkgPT09IENhbGxTdGF0ZS5DT05ORUNURUQ7XG5cdH1cblxuXHQvLyBBUEkgTWV0aG9kc1xuXHRwdWJsaWMgY3JlYXRlUm9vbShwYXlsb2FkOiBDcmVhdGVSb29tUmVxdWVzdCk6IE9ic2VydmFibGU8Q3JlYXRlUm9vbVJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PENyZWF0ZVJvb21SZXNwb25zZT4oXCJ2Mi9yb29tXCIsIHsgYm9keTogcGF5bG9hZCwgaGVhZGVyczoge30gfSkucGlwZShcblx0XHRcdG1hcCgocmVzcG9uc2UpID0+IHJlc3BvbnNlIGFzIENyZWF0ZVJvb21SZXNwb25zZSksXG5cdFx0XHRjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKFwiVEFTIFNlcnZpY2U6IGNyZWF0ZVJvb20gZmFpbGVkXCIsIGVycm9yKTtcblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2VuZXJhdGVUb2tlbihwYXlsb2FkOiBHZW5lcmF0ZVRva2VuUmVxdWVzdCk6IE9ic2VydmFibGU8R2VuZXJhdGVUb2tlblJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEdlbmVyYXRlVG9rZW5SZXNwb25zZT4oXCJ2Mi9yb29tL3Rva2VuXCIsIHsgYm9keTogcGF5bG9hZCwgaGVhZGVyczoge30gfSkucGlwZShcblx0XHRcdG1hcCgocmVzcG9uc2U6IGFueSkgPT4gcmVzcG9uc2UgYXMgR2VuZXJhdGVUb2tlblJlc3BvbnNlKSxcblx0XHRcdGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJUQVMgU2VydmljZTogZ2VuZXJhdGVUb2tlbiBmYWlsZWRcIiwgZXJyb3IpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0cyB0byBhIFRva0JveCB2aWRlbyBzZXNzaW9uXG5cdCAqL1xuXHRwdWJsaWMgY29ubmVjdFNlc3Npb24oXG5cdFx0c2Vzc2lvbklkOiBzdHJpbmcsXG5cdFx0dG9rZW46IHN0cmluZyxcblx0XHRwdWJsaXNoZXJFbGVtZW50OiBzdHJpbmcsXG5cdFx0c3Vic2NyaWJlckVsZW1lbnQ6IHN0cmluZ1xuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuQ09OTkVDVElORyk7XG5cdFx0dGhpcy5jdXJyZW50U2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuXHRcdHRoaXMuY3VycmVudFRva2VuID0gdG9rZW47XG5cdFx0XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGlmICghT1QuY2hlY2tTeXN0ZW1SZXF1aXJlbWVudHMoKSkge1xuXHRcdFx0XHR0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRVJST1IpO1xuXHRcdFx0XHRyZWplY3QobmV3IEVycm9yKFwiQnJvd3NlciBub3QgY29tcGF0aWJsZSB3aXRoIFRva0JveFwiKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXNzaW9uID0gT1QuaW5pdFNlc3Npb24odGhpcy5jb25maWcudG9rQm94QXBpS2V5LCBzZXNzaW9uSWQpO1xuXG5cdFx0XHQvLyBIYW5kbGUgbmV3IHN0cmVhbXMgKHJlbW90ZSBwYXJ0aWNpcGFudHMgam9pbmluZylcblx0XHRcdHRoaXMuc2Vzc2lvbi5vbihcInN0cmVhbUNyZWF0ZWRcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN1YnNjcmliZXIgPSB0aGlzLnNlc3Npb24/LnN1YnNjcmliZShcblx0XHRcdFx0XHRldmVudC5zdHJlYW0sXG5cdFx0XHRcdFx0c3Vic2NyaWJlckVsZW1lbnQsXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aW5zZXJ0TW9kZTogXCJhcHBlbmRcIixcblx0XHRcdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0XHRcdGhlaWdodDogXCIxMDAlXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRcdGlmIChlcnJvcikge1xuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRXJyb3Igc3Vic2NyaWJpbmcgdG8gc3RyZWFtOlwiLCBlcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoc3Vic2NyaWJlcikge1xuXHRcdFx0XHRcdHRoaXMuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEhhbmRsZSBzdHJlYW1zIGVuZGluZyAocmVtb3RlIHBhcnRpY2lwYW50cyBsZWF2aW5nKVxuXHRcdFx0dGhpcy5zZXNzaW9uLm9uKFwic3RyZWFtRGVzdHJveWVkXCIsIChldmVudCkgPT4ge1xuXHRcdFx0XHR0aGlzLnN1YnNjcmliZXJzID0gdGhpcy5zdWJzY3JpYmVycy5maWx0ZXIoXG5cdFx0XHRcdFx0KHN1YikgPT4gc3ViLnN0cmVhbT8uc3RyZWFtSWQgIT09IGV2ZW50LnN0cmVhbS5zdHJlYW1JZFxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEhhbmRsZSBzZXNzaW9uIGRpc2Nvbm5lY3Rpb25cblx0XHRcdHRoaXMuc2Vzc2lvbi5vbihcInNlc3Npb25EaXNjb25uZWN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRElTQ09OTkVDVEVEKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDb25uZWN0IHRvIHNlc3Npb25cblx0XHRcdHRoaXMuc2Vzc2lvbi5jb25uZWN0KHRva2VuLCAoZXJyb3IpID0+IHtcblx0XHRcdFx0aWYgKGVycm9yKSB7XG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcIkVycm9yIGNvbm5lY3RpbmcgdG8gc2Vzc2lvbjpcIiwgZXJyb3IpO1xuXHRcdFx0XHRcdHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5FUlJPUik7XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJbml0aWFsaXplIHB1Ymxpc2hlciAobG9jYWwgdmlkZW8pXG5cdFx0XHRcdHRoaXMucHVibGlzaGVyID0gT1QuaW5pdFB1Ymxpc2hlcihcblx0XHRcdFx0XHRwdWJsaXNoZXJFbGVtZW50LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGluc2VydE1vZGU6IFwiYXBwZW5kXCIsXG5cdFx0XHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IFwiMTAwJVwiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0KGVycikgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGVycikge1xuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRXJyb3IgaW5pdGlhbGl6aW5nIHB1Ymxpc2hlcjpcIiwgZXJyKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkVSUk9SKTtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KGVycik7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gUHVibGlzaCB0byBzZXNzaW9uXG5cdFx0XHRcdFx0XHR0aGlzLnNlc3Npb24/LnB1Ymxpc2godGhpcy5wdWJsaXNoZXIsIChwdWJFcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHB1YkVycikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwdWJsaXNoaW5nIHN0cmVhbTpcIiwgcHViRXJyKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuRVJST1IpO1xuXHRcdFx0XHRcdFx0XHRcdHJlamVjdChwdWJFcnIpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5DT05ORUNURUQpO1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBWaWRlbyBFbGVtZW50IE1vdmVtZW50IE1ldGhvZHNcblx0cHVibGljIG1vdmVQdWJsaXNoZXJUbyhuZXdDb250YWluZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLnB1Ymxpc2hlcikgcmV0dXJuO1xuXHRcdFxuXHRcdGNvbnN0IHB1Ymxpc2hlckVsZW1lbnQgPSB0aGlzLnB1Ymxpc2hlci5lbGVtZW50O1xuXHRcdGNvbnN0IG5ld0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5ld0NvbnRhaW5lcklkKTtcblx0XHRcblx0XHRpZiAocHVibGlzaGVyRWxlbWVudCAmJiBuZXdDb250YWluZXIpIHtcblx0XHRcdG5ld0NvbnRhaW5lci5hcHBlbmRDaGlsZChwdWJsaXNoZXJFbGVtZW50KTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgbW92ZVN1YnNjcmliZXJzVG8obmV3Q29udGFpbmVySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG5ld0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5ld0NvbnRhaW5lcklkKTtcblx0XHRpZiAoIW5ld0NvbnRhaW5lcikgcmV0dXJuO1xuXHRcdFxuXHRcdHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4ge1xuXHRcdFx0Y29uc3Qgc3Vic2NyaWJlckVsZW1lbnQgPSBzdWJzY3JpYmVyLmVsZW1lbnQ7XG5cdFx0XHRpZiAoc3Vic2NyaWJlckVsZW1lbnQpIHtcblx0XHRcdFx0bmV3Q29udGFpbmVyLmFwcGVuZENoaWxkKHN1YnNjcmliZXJFbGVtZW50KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNb3ZlcyB0aGUgbWFpbiB2aWRlbyAoc3Vic2NyaWJlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBwdWJsaXNoZXIpIHRvIGEgY29udGFpbmVyLlxuXHQgKiBVc2VkIGZvciBQaVAgbW9kZSB0byBzaG93IG9ubHkgb25lIHZpZGVvLlxuXHQgKi9cblx0cHVibGljIG1vdmVNYWluVmlkZW9UbyhuZXdDb250YWluZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3QgbmV3Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobmV3Q29udGFpbmVySWQpO1xuXHRcdGlmICghbmV3Q29udGFpbmVyKSByZXR1cm47XG5cblx0XHQvLyBQcmVmZXIgcmVtb3RlIHZpZGVvIChzdWJzY3JpYmVyKSBhcyBtYWluXG5cdFx0aWYgKHRoaXMuc3Vic2NyaWJlcnMubGVuZ3RoID4gMCAmJiB0aGlzLnN1YnNjcmliZXJzWzBdLmVsZW1lbnQpIHtcblx0XHRcdG5ld0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnN1YnNjcmliZXJzWzBdLmVsZW1lbnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGwgYmFjayB0byBsb2NhbCB2aWRlbyAocHVibGlzaGVyKVxuXHRcdGlmICh0aGlzLnB1Ymxpc2hlcj8uZWxlbWVudCkge1xuXHRcdFx0bmV3Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucHVibGlzaGVyLmVsZW1lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNb3ZlcyB2aWRlb3MgYmFjayB0byBmdWxsc2NyZWVuIGNvbnRhaW5lcnNcblx0ICovXG5cdHB1YmxpYyBtb3ZlVmlkZW9zVG9GdWxsc2NyZWVuKCk6IHZvaWQge1xuXHRcdHRoaXMubW92ZVN1YnNjcmliZXJzVG8oJ3N1YnNjcmliZXItY29udGFpbmVyJyk7XG5cdFx0dGhpcy5tb3ZlUHVibGlzaGVyVG8oJ3B1Ymxpc2hlci1jb250YWluZXInKTtcblx0fVxufVxuXG4iXX0=
|
|
573
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9zZXJ2aWNlcy90YXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBUUwsY0FBYyxFQUNkLGNBQWMsRUFFZCxlQUFlLEVBQ2YsV0FBVyxFQUNYLFNBQVMsRUFDVCxRQUFRLEdBRVQsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGVBQWUsR0FHaEIsTUFBTSxzQkFBc0IsQ0FBQzs7QUFFOUIsNkNBQTZDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFLaEYsTUFBTSxPQUFPLFVBQVU7SUFpRHJCLFlBQ21DLFVBQXlCLEVBQzlCLE1BQWlCO1FBRFosZUFBVSxHQUFWLFVBQVUsQ0FBZTtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBbER2QyxZQUFPLEdBQXNCLElBQUksQ0FBQztRQUNsQyxjQUFTLEdBQXdCLElBQUksQ0FBQztRQUN0QyxnQkFBVyxHQUFvQixFQUFFLENBQUM7UUFFbEMscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25FLGVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFakQsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FB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LHFCQUFxQixDQUFDLENBQUM7SUFDOUMsQ0FBQzs7d0dBdnNCVSxVQUFVLGtCQWtEWCxlQUFlLGFBQ2YsVUFBVTs0R0FuRFQsVUFBVSxjQUZULE1BQU07NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQW1ESSxNQUFNOzJCQUFDLGVBQWU7OzBCQUN0QixNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgT1QgZnJvbSAnQG9wZW50b2svY2xpZW50JztcbmltcG9ydCB7XG4gIEdlbmVyYXRlVG9rZW5SZXNwb25zZSxcbiAgU3RhcnRTZXNzaW9uUmVxdWVzdCxcbiAgRmluaXNoU2Vzc2lvblJlc3BvbnNlLFxuICBQcm94eVZpZGVvU3RhdHVzUmVxdWVzdCxcbiAgUHJveHlWaWRlb1N0YXR1c1Jlc3BvbnNlLFxuICBQcm94eVZpZGVvRmluaXNoUmVxdWVzdCxcbiAgUHJveHlWaWRlb1VzZXJNb2RpZnlSZXF1ZXN0LFxuICBVc2VyQ2FsbEFjdGlvbixcbiAgUm9vbVVzZXJTdGF0dXMsXG4gIFRhc0N1cnJlbnRVc2VyLFxuICBUYXNCdXNpbmVzc1JvbGUsXG4gIFRhc1VzZXJSb2xlLFxuICBDYWxsU3RhdGUsXG4gIFZpZXdNb2RlLFxuICBXYWl0aW5nUm9vbVVzZXIsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvdGFzLmludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgVEFTX0NPTkZJRyxcbiAgVEFTX0hUVFBfQ0xJRU5ULFxuICBUYXNDb25maWcsXG4gIFRhc0h0dHBDbGllbnQsXG59IGZyb20gJy4uL2NvbmZpZy90YXMuY29uZmlnJztcblxuLy8gUmUtZXhwb3J0IGVudW1zIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5leHBvcnQgeyBDYWxsU3RhdGUsIFZpZXdNb2RlLCBUYXNCdXNpbmVzc1JvbGUsIFVzZXJDYWxsQWN0aW9uLCBSb29tVXNlclN0YXR1cyB9O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVGFzU2VydmljZSB7XG4gIHByaXZhdGUgc2Vzc2lvbjogT1QuU2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHB1Ymxpc2hlcjogT1QuUHVibGlzaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3Vic2NyaWJlcnM6IE9ULlN1YnNjcmliZXJbXSA9IFtdO1xuXG4gIHByaXZhdGUgY2FsbFN0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FsbFN0YXRlPihDYWxsU3RhdGUuSURMRSk7XG4gIHB1YmxpYyBjYWxsU3RhdGUkID0gdGhpcy5jYWxsU3RhdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgdmlld01vZGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWaWV3TW9kZT4oVmlld01vZGUuRlVMTFNDUkVFTik7XG4gIHB1YmxpYyB2aWV3TW9kZSQgPSB0aGlzLnZpZXdNb2RlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIGlzTXV0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBpc011dGVkJCA9IHRoaXMuaXNNdXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLy8gU2Vzc2lvbiBpbmZvIGZvciBQaVAgbW9kZSByZXN0b3JhdGlvblxuICBwcml2YXRlIGN1cnJlbnRTZXNzaW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1RPUkFHRV9LRVkgPSAndGFzX3Nlc3Npb25fc3RhdGUnO1xuICBwcml2YXRlIHJlYWRvbmx5IERJU0NPTk5FQ1RFRF9GTEFHX0tFWSA9ICd0YXNfc2Vzc2lvbl9kaXNjb25uZWN0ZWQnO1xuICBwcml2YXRlIGlzRmluaXNoaW5nU2Vzc2lvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFByb3h5LXZpZGVvIGNpcmN1aXQgc3RhdGVcbiAgcHJpdmF0ZSBwcm94eVZpZGVvU2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcm94eVZpZGVvVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRCdXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSO1xuXG4gIC8vIFdhaXRpbmcgcm9vbSBhbmQgc3RhdHVzIHBvbGxpbmdcbiAgcHJpdmF0ZSB3YWl0aW5nUm9vbVVzZXJzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8V2FpdGluZ1Jvb21Vc2VyW10+KFtdKTtcbiAgcHVibGljIHdhaXRpbmdSb29tVXNlcnMkID0gdGhpcy53YWl0aW5nUm9vbVVzZXJzU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIG93bmVySGFzSm9pbmVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgb3duZXJIYXNKb2luZWQkID0gdGhpcy5vd25lckhhc0pvaW5lZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLy8gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRydWUgd2hlbiBvd25lciB3YXMgcHJlc2VudCBidXQgdGhlbiBsZWZ0XG4gIHByaXZhdGUgb3duZXJIYXNMZWZ0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgb3duZXJIYXNMZWZ0JCA9IHRoaXMub3duZXJIYXNMZWZ0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIGpvaW5hYmxlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgam9pbmFibGUkID0gdGhpcy5qb2luYWJsZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBzdGF0dXNQb2xsaW5nSW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUyA9IDMwMDAwOyAvLyBEZWZhdWx0IDMwc1xuICBwcml2YXRlIHdhc093bmVyUHJlc2VudCA9IGZhbHNlO1xuXG4gIC8vIEN1cnJlbnQgY2FsbCBjb250ZXh0XG4gIHByaXZhdGUgY3VycmVudEFwcG9pbnRtZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRWaWRlb0NhbGxJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFRlbmFudDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChUQVNfSFRUUF9DTElFTlQpIHByaXZhdGUgaHR0cENsaWVudDogVGFzSHR0cENsaWVudCxcbiAgICBASW5qZWN0KFRBU19DT05GSUcpIHByaXZhdGUgY29uZmlnOiBUYXNDb25maWdcbiAgKSB7fVxuXG4gIC8vIC4uLiAoR2V0dGVycyBhbmQgb3RoZXIgbWV0aG9kcyByZW1haW4gdW5jaGFuZ2VkKVxuXG4gIC8qKlxuICAgKiBTdGFydCBhdXRvbWF0aWMgc3RhdHVzIHBvbGxpbmcgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uXG4gICAqIFN0YXR1cyBpcyBwb2xsZWQgZXZlcnkgaW50ZXJ2YWxNcyAoZGVmYXVsdCAzMHMpLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0U3RhdHVzUG9sbGluZyhcbiAgICBwYXJhbXM6IFByb3h5VmlkZW9TdGF0dXNSZXF1ZXN0LCBcbiAgICBpbnRlcnZhbE1zOiBudW1iZXIgPSB0aGlzLkRFRkFVTFRfUE9MTF9JTlRFUlZBTF9NU1xuICApOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BTdGF0dXNQb2xsaW5nKCk7IC8vIENsZWFyIGFueSBleGlzdGluZyBwb2xsaW5nXG5cbiAgICAvLyBTdG9yZSBjb250ZXh0IGZvciBwb2xsaW5nXG4gICAgaWYgKHBhcmFtcy5zZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuY3VycmVudFNlc3Npb25JZCA9IHBhcmFtcy5zZXNzaW9uSWQ7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuYXBwb2ludG1lbnRJZCkge1xuICAgICAgdGhpcy5jdXJyZW50QXBwb2ludG1lbnRJZCA9IHBhcmFtcy5hcHBvaW50bWVudElkO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnRlbmFudCkge1xuICAgICAgdGhpcy5jdXJyZW50VGVuYW50ID0gcGFyYW1zLnRlbmFudDtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgW1RBUyBERUJVR10gU3RhcnRpbmcgc3RhdHVzIHBvbGxpbmcgd2l0aCBpbnRlcnZhbCAke2ludGVydmFsTXN9bXNgKTtcblxuICAgIC8vIEluaXRpYWwgc3RhdHVzIGZldGNoXG4gICAgdGhpcy5mZXRjaEFuZFByb2Nlc3NTdGF0dXMocGFyYW1zKTtcblxuICAgIC8vIFNldCB1cCBwZXJpb2RpYyBwb2xsaW5nXG4gICAgdGhpcy5zdGF0dXNQb2xsaW5nSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmZldGNoQW5kUHJvY2Vzc1N0YXR1cyhwYXJhbXMpO1xuICAgIH0sIGludGVydmFsTXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYXV0b21hdGljIHN0YXR1cyBwb2xsaW5nLlxuICAgKi9cbiAgcHVibGljIHN0b3BTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCk7XG4gICAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICAgIC8vIERvIE5PVCByZXNldCB3YWl0aW5nIHJvb20gc3RhdGUgaGVyZSwgYXMgb3RoZXIgY29tcG9uZW50cyBtaWdodCBvYnNlcnZlIGl0XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgcG9sbGluZyBzdGF0ZSAod2FpdGluZyByb29tLCBvd25lciBzdGF0dXMsIGV0YylcbiAgICogQ2FsbCB0aGlzIHdoZW4gY29tcGxldGVseSBleGl0aW5nIHRoZSBmbG93XG4gICAqL1xuICBwdWJsaWMgcmVzZXRQb2xsaW5nU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuICAgIHRoaXMud2FpdGluZ1Jvb21Vc2Vyc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5vd25lckhhc0pvaW5lZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5vd25lckhhc0xlZnRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIHRoaXMuam9pbmFibGVTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIHRoaXMud2FzT3duZXJQcmVzZW50ID0gZmFsc2U7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHB1YmxpYyBnZXQgY3VycmVudFNlc3Npb24oKTogT1QuU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRQdWJsaXNoZXIoKTogT1QuUHVibGlzaGVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucHVibGlzaGVyO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50U3Vic2NyaWJlcnMoKTogT1QuU3Vic2NyaWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmVycztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2Vzc2lvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTZXNzaW9uSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJveHlTZXNzaW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucHJveHlWaWRlb1Nlc3Npb25JZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJveHlUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wcm94eVZpZGVvVG9rZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJ1c2luZXNzUm9sZSgpOiBUYXNCdXNpbmVzc1JvbGUge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRCdXNpbmVzc1JvbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTXV0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNdXRlZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIFZpZXcgTW9kZSBNZXRob2RzXG4gIHB1YmxpYyBzZXRWaWV3TW9kZShtb2RlOiBWaWV3TW9kZSk6IHZvaWQge1xuICAgIHRoaXMudmlld01vZGVTdWJqZWN0Lm5leHQobW9kZSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFNlc3Npb25JZCAmJiB0aGlzLmN1cnJlbnRUb2tlbikge1xuICAgICAgdGhpcy5zYXZlU2Vzc2lvblN0YXRlKFxuICAgICAgICB0aGlzLmN1cnJlbnRTZXNzaW9uSWQsXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLFxuICAgICAgICBtb2RlLFxuICAgICAgICB0aGlzLmN1cnJlbnRCdXNpbmVzc1JvbGVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVudGVyUGlwTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlU3ViamVjdC5uZXh0KFZpZXdNb2RlLlBJUCk7XG4gICAgaWYgKHRoaXMuY3VycmVudFNlc3Npb25JZCAmJiB0aGlzLmN1cnJlbnRUb2tlbikge1xuICAgICAgdGhpcy5zYXZlU2Vzc2lvblN0YXRlKFxuICAgICAgICB0aGlzLmN1cnJlbnRTZXNzaW9uSWQsXG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuLFxuICAgICAgICBWaWV3TW9kZS5QSVAsXG4gICAgICAgIHRoaXMuY3VycmVudEJ1c2luZXNzUm9sZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZXhpdFBpcE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3TW9kZVN1YmplY3QubmV4dChWaWV3TW9kZS5GVUxMU0NSRUVOKTtcbiAgICBpZiAodGhpcy5jdXJyZW50U2Vzc2lvbklkICYmIHRoaXMuY3VycmVudFRva2VuKSB7XG4gICAgICB0aGlzLnNhdmVTZXNzaW9uU3RhdGUoXG4gICAgICAgIHRoaXMuY3VycmVudFNlc3Npb25JZCxcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4sXG4gICAgICAgIFZpZXdNb2RlLkZVTExTQ1JFRU4sXG4gICAgICAgIHRoaXMuY3VycmVudEJ1c2luZXNzUm9sZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNQaXBNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdNb2RlU3ViamVjdC5nZXRWYWx1ZSgpID09PSBWaWV3TW9kZS5QSVA7XG4gIH1cblxuICAvLyBBdWRpbyBDb250cm9sXG4gIHB1YmxpYyB0b2dnbGVNdXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnB1Ymxpc2hlcikge1xuICAgICAgY29uc3QgbmV3TXV0ZVN0YXRlID0gIXRoaXMuaXNNdXRlZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgIGNvbnN0IHNob3VsZEVuYWJsZUF1ZGlvID0gIW5ld011dGVTdGF0ZTtcblxuICAgICAgLy8gVXNlIE9wZW5Ub2sncyBwdWJsaXNoQXVkaW9cbiAgICAgIHRoaXMucHVibGlzaGVyLnB1Ymxpc2hBdWRpbyhzaG91bGRFbmFibGVBdWRpbyk7XG5cbiAgICAgIC8vIEFsc28gZGlyZWN0bHkgY29udHJvbCB0aGUgTWVkaWFTdHJlYW1UcmFjayBhcyBiYWNrdXBcbiAgICAgIGNvbnN0IGF1ZGlvVHJhY2sgPSB0aGlzLnB1Ymxpc2hlci5nZXRBdWRpb1NvdXJjZT8uKCk7XG4gICAgICBpZiAoYXVkaW9UcmFjaykge1xuICAgICAgICBhdWRpb1RyYWNrLmVuYWJsZWQgPSBzaG91bGRFbmFibGVBdWRpbztcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc011dGVkU3ViamVjdC5uZXh0KG5ld011dGVTdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE11dGUobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wdWJsaXNoZXIpIHtcbiAgICAgIHRoaXMucHVibGlzaGVyLnB1Ymxpc2hBdWRpbyghbXV0ZWQpO1xuICAgICAgdGhpcy5pc011dGVkU3ViamVjdC5uZXh0KG11dGVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXNzaW9uIE1hbmFnZW1lbnRcbiAgcHVibGljIGRpc2Nvbm5lY3RTZXNzaW9uKGNsZWFyU3RvcmFnZTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdbVEFTIERFQlVHXSBUYXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uIGNhbGxlZC4gY2xlYXJTdG9yYWdlOicsXG4gICAgICBjbGVhclN0b3JhZ2VcbiAgICApO1xuXG4gICAgLy8gQ2FsbCBmaW5pc2hTZXNzaW9uIGJlZm9yZSBkaXNjb25uZWN0aW5nIGlmIHdlIGhhdmUgYSBzZXNzaW9uSWRcbiAgICBjb25zdCBzZXNzaW9uSWRUb0ZpbmlzaCA9IHRoaXMuY3VycmVudFNlc3Npb25JZDtcblxuICAgIC8vIENsZWFyIHN0b3JhZ2UgRklSU1QgdG8gcHJldmVudCBhbnkgcmFjZSBjb25kaXRpb25zIHdoZXJlIHN0YXRlIG1pZ2h0IGJlIHNhdmVkIGFmdGVyIGRpc2Nvbm5lY3RcbiAgICBpZiAoY2xlYXJTdG9yYWdlKSB7XG4gICAgICB0aGlzLmNsZWFyU2Vzc2lvblN0YXRlKCk7XG4gICAgICAvLyBTZXQgYSBmbGFnIHRvIGluZGljYXRlIHRoaXMgc2Vzc2lvbiB3YXMgaW50ZW50aW9uYWxseSBkaXNjb25uZWN0ZWRcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgcmVjb25uZWN0aW9uIG9uIHBhZ2UgcmVsb2FkXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuRElTQ09OTkVDVEVEX0ZMQUdfS0VZLCAndHJ1ZScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlc3Npb24pIHtcbiAgICAgIHRoaXMuc2Vzc2lvbi5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLnNlc3Npb24gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnB1Ymxpc2hlciA9IG51bGw7XG4gICAgdGhpcy5zdWJzY3JpYmVycyA9IFtdO1xuICAgIHRoaXMuY3VycmVudFNlc3Npb25JZCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50VG9rZW4gPSBudWxsO1xuICAgIHRoaXMucHJveHlWaWRlb1Nlc3Npb25JZCA9IG51bGw7XG4gICAgdGhpcy5wcm94eVZpZGVvVG9rZW4gPSBudWxsO1xuICAgIHRoaXMuaXNNdXRlZFN1YmplY3QubmV4dChmYWxzZSk7IC8vIFJlc2V0IG11dGUgc3RhdGVcbiAgICB0aGlzLnZpZXdNb2RlU3ViamVjdC5uZXh0KFZpZXdNb2RlLkZVTExTQ1JFRU4pO1xuICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5ESVNDT05ORUNURUQpO1xuXG4gICAgLy8gQ2FsbCBwcm94eSBmaW5pc2ggYWZ0ZXIgZGlzY29ubmVjdGluZyAob25seSBpZiBub3QgYWxyZWFkeSBmaW5pc2hpbmcpXG4gICAgaWYgKHNlc3Npb25JZFRvRmluaXNoICYmICF0aGlzLmlzRmluaXNoaW5nU2Vzc2lvbikge1xuICAgICAgdGhpcy5pc0ZpbmlzaGluZ1Nlc3Npb24gPSB0cnVlO1xuICAgICAgdGhpcy5maW5pc2hQcm94eVZpZGVvU2Vzc2lvbih7XG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkVG9GaW5pc2gsXG4gICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5jdXJyZW50QnVzaW5lc3NSb2xlLFxuICAgICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFNlc3Npb24gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5OicsIHJlc3BvbnNlKTtcbiAgICAgICAgICB0aGlzLmlzRmluaXNoaW5nU2Vzc2lvbiA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gRXJyb3IgZmluaXNoaW5nIHNlc3Npb246JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuaXNGaW5pc2hpbmdTZXNzaW9uID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNDYWxsQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhbGxTdGF0ZVN1YmplY3QuZ2V0VmFsdWUoKSA9PT0gQ2FsbFN0YXRlLkNPTk5FQ1RFRDtcbiAgfVxuXG4gIC8vIFN0YXRlIFBlcnNpc3RlbmNlXG4gIHByaXZhdGUgc2F2ZVNlc3Npb25TdGF0ZShcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIHZpZXdNb2RlOiBWaWV3TW9kZSxcbiAgICBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdG9rZW4sXG4gICAgICB2aWV3TW9kZSxcbiAgICAgIGJ1c2luZXNzUm9sZSxcbiAgICB9O1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZXNzaW9uU3RhdGUoKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlNUT1JBR0VfS0VZKTtcbiAgICAvLyBBbHNvIGNsZWFyIHRoZSBkaXNjb25uZWN0ZWQgZmxhZyB3aGVuIGNsZWFyaW5nIHN0YXRlXG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkRJU0NPTk5FQ1RFRF9GTEFHX0tFWSk7XG4gIH1cblxuICBwdWJsaWMgY2FuUmVzdG9yZVNlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlNUT1JBR0VfS0VZKTtcbiAgfVxuXG4gIHB1YmxpYyByZXN0b3JlU2Vzc2lvbihjb250YWluZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2F2ZWRTdGF0ZSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5TVE9SQUdFX0tFWSk7XG4gICAgaWYgKCFzYXZlZFN0YXRlKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIHNlc3Npb24gd2FzIGludGVudGlvbmFsbHkgZGlzY29ubmVjdGVkXG4gICAgLy8gSWYgc28sIGRvbid0IHJlc3RvcmUgaXQgb24gcGFnZSByZWxvYWRcbiAgICBjb25zdCB3YXNEaXNjb25uZWN0ZWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuRElTQ09OTkVDVEVEX0ZMQUdfS0VZKTtcbiAgICBpZiAod2FzRGlzY29ubmVjdGVkID09PSAndHJ1ZScpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBTZXNzaW9uIHdhcyBpbnRlbnRpb25hbGx5IGRpc2Nvbm5lY3RlZCwgc2tpcHBpbmcgcmVzdG9yZScpO1xuICAgICAgdGhpcy5jbGVhclNlc3Npb25TdGF0ZSgpO1xuICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkRJU0NPTk5FQ1RFRF9GTEFHX0tFWSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgcmVzdG9yZSBpZiB3ZSdyZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZCBvciBpZiB0aGVyZSdzIG5vIGFjdGl2ZSBzZXNzaW9uXG4gICAgLy8gVGhpcyBwcmV2ZW50cyByZXN0b3Jpbmcgc2Vzc2lvbnMgdGhhdCB3ZXJlIHByb3Blcmx5IGRpc2Nvbm5lY3RlZFxuICAgIGlmICh0aGlzLmNhbGxTdGF0ZVN1YmplY3QuZ2V0VmFsdWUoKSA9PT0gQ2FsbFN0YXRlLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIENhbGwgc3RhdGUgaXMgRElTQ09OTkVDVEVELCBza2lwcGluZyByZXN0b3JlJyk7XG4gICAgICB0aGlzLmNsZWFyU2Vzc2lvblN0YXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRlID0gSlNPTi5wYXJzZShzYXZlZFN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5zZXNzaW9uSWQgJiYgc3RhdGUudG9rZW4pIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFJlc3RvcmluZyBzZXNzaW9uIGZyb20gc3RvcmFnZScpO1xuICAgICAgICAvLyBGb3JjZSBQaVAgbW9kZSBmb3IgcmVzdG9yYXRpb24gdG8gZW5zdXJlIFVJIGNvbnNpc3RlbmN5XG4gICAgICAgIHRoaXMudmlld01vZGVTdWJqZWN0Lm5leHQoVmlld01vZGUuUElQKTtcblxuICAgICAgICBpZiAoc3RhdGUuYnVzaW5lc3NSb2xlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50QnVzaW5lc3NSb2xlID0gc3RhdGUuYnVzaW5lc3NSb2xlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25uZWN0U2Vzc2lvbihcbiAgICAgICAgICBzdGF0ZS5zZXNzaW9uSWQsXG4gICAgICAgICAgc3RhdGUudG9rZW4sXG4gICAgICAgICAgY29udGFpbmVySWQsIC8vIFVzZSB0aGUgc2FtZSBjb250YWluZXIgZm9yIGJvdGggc2luY2Ugd2UgYXJlIGluIFBpUFxuICAgICAgICAgIGNvbnRhaW5lcklkLFxuICAgICAgICAgIHRoaXMuY3VycmVudEJ1c2luZXNzUm9sZVxuICAgICAgICApXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIFNlc3Npb24gcmVzdG9yZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgICAvLyBDbGVhciB0aGUgZGlzY29ubmVjdGVkIGZsYWcgaWYgcmVzdG9yYXRpb24gc3VjY2VlZHNcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5ESVNDT05ORUNURURfRkxBR19LRVkpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIEZhaWxlZCB0byByZXN0b3JlIHNlc3Npb246JywgZXJyKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZXNzaW9uU3RhdGUoKTsgLy8gQ2xlYXIgYmFkIHN0YXRlXG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gRXJyb3IgcGFyc2luZyBzYXZlZCBzZXNzaW9uIHN0YXRlJywgZSk7XG4gICAgICB0aGlzLmNsZWFyU2Vzc2lvblN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQVBJIE1ldGhvZHNcbiAgLyoqXG4gICAqIFBST1hZIGNpcmN1aXQgdG9rZW46IC92Mi9wcm94eS92aWRlby9zdGFydFxuICAgKi9cbiAgcHVibGljIHN0YXJ0UHJveHlWaWRlb1Nlc3Npb24oXG4gICAgcGF5bG9hZDogU3RhcnRTZXNzaW9uUmVxdWVzdFxuICApOiBPYnNlcnZhYmxlPEdlbmVyYXRlVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcbiAgICAgIC5wb3N0PEdlbmVyYXRlVG9rZW5SZXNwb25zZT4oJ3YyL3Byb3h5L3ZpZGVvL3N0YXJ0Jywge1xuICAgICAgICBib2R5OiBwYXlsb2FkLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiByZXNwb25zZSBhcyBHZW5lcmF0ZVRva2VuUmVzcG9uc2UpLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RBUyBTZXJ2aWNlOiBzdGFydFByb3h5VmlkZW9TZXNzaW9uIGZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUFJPWFkgY2lyY3VpdCBzdGF0dXM6IC92Mi9wcm94eS92aWRlby9zdGF0dXNcbiAgICovXG4gIHB1YmxpYyBnZXRQcm94eVZpZGVvU3RhdHVzKFxuICAgIHBheWxvYWQ6IFByb3h5VmlkZW9TdGF0dXNSZXF1ZXN0XG4gICk6IE9ic2VydmFibGU8UHJveHlWaWRlb1N0YXR1c1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3Q8UHJveHlWaWRlb1N0YXR1c1Jlc3BvbnNlPigndjIvcHJveHkvdmlkZW8vc3RhdHVzJywge1xuICAgICAgICBib2R5OiBwYXlsb2FkLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiByZXNwb25zZSBhcyBQcm94eVZpZGVvU3RhdHVzUmVzcG9uc2UpLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RBUyBTZXJ2aWNlOiBnZXRQcm94eVZpZGVvU3RhdHVzIGZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUFJPWFkgY2lyY3VpdCB1c2VyIG1vZGlmaWNhdGlvbjogL3YyL3Byb3h5L3ZpZGVvL3VzZXIvbW9kaWZ5XG4gICAqL1xuICBwdWJsaWMgbW9kaWZ5UHJveHlWaWRlb1VzZXIocGF5bG9hZDogUHJveHlWaWRlb1VzZXJNb2RpZnlSZXF1ZXN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAucGF0Y2g8YW55PigndjIvcHJveHkvdmlkZW8vdXNlci9tb2RpZnknLCB7XG4gICAgICAgIGJvZHk6IHBheWxvYWQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RBUyBTZXJ2aWNlOiBtb2RpZnlQcm94eVZpZGVvVXNlciBmYWlsZWQnLCBlcnJvcik7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGZpbmlzaFByb3h5VmlkZW9TZXNzaW9uKHBheWxvYWQ6IFByb3h5VmlkZW9GaW5pc2hSZXF1ZXN0KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3Q8RmluaXNoU2Vzc2lvblJlc3BvbnNlPigndjIvcHJveHkvdmlkZW8vZmluaXNoJywge1xuICAgICAgICBib2R5OiBwYXlsb2FkLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiByZXNwb25zZSBhcyBGaW5pc2hTZXNzaW9uUmVzcG9uc2UpLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RBUyBTZXJ2aWNlOiBmaW5pc2hQcm94eVZpZGVvU2Vzc2lvbiBmYWlsZWQnLCBlcnJvcik7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGF1dG9tYXRpYyBzdGF0dXMgcG9sbGluZyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICogU3RhdHVzIGlzIHBvbGxlZCBldmVyeSBTVEFUVVNfUE9MTF9JTlRFUlZBTF9NUyBtaWxsaXNlY29uZHMuXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIFN0b3AgYXV0b21hdGljIHN0YXR1cyBwb2xsaW5nLlxuICAgKi9cblxuXG4gIC8qKlxuICAgKiBGZXRjaCBzdGF0dXMgYW5kIHByb2Nlc3MgdGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBmZXRjaEFuZFByb2Nlc3NTdGF0dXMocGFyYW1zOiBQcm94eVZpZGVvU3RhdHVzUmVxdWVzdCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0UHJveHlWaWRlb1N0YXR1cyhwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RhdHVzUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUQVMgREVCVUddIFN0YXR1cyBwb2xsaW5nIGVycm9yOicsIGVycik7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3Mgc3RhdHVzIHJlc3BvbnNlIHRvIHVwZGF0ZSB3YWl0aW5nIHJvb20gdXNlcnMgYW5kIG93bmVyIGpvaW4gc3RhdHVzLlxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzU3RhdHVzUmVzcG9uc2UocmVzcG9uc2U6IFByb3h5VmlkZW9TdGF0dXNSZXNwb25zZSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZXNwb25zZS5jb250ZW50O1xuXG4gICAgLy8gVXBkYXRlIHZpZGVvQ2FsbElkIGlmIGF2YWlsYWJsZVxuICAgIGlmIChjb250ZW50LnZpZGVvQ2FsbElkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWRlb0NhbGxJZCA9IGNvbnRlbnQudmlkZW9DYWxsSWQ7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHNlc3Npb25JZCBpZiBhdmFpbGFibGVcbiAgICBpZiAoY29udGVudC5zZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuY3VycmVudFNlc3Npb25JZCA9IGNvbnRlbnQuc2Vzc2lvbklkO1xuICAgICAgdGhpcy5wcm94eVZpZGVvU2Vzc2lvbklkID0gY29udGVudC5zZXNzaW9uSWQ7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGpvaW5hYmxlIHN0YXR1c1xuICAgIHRoaXMuam9pbmFibGVTdWJqZWN0Lm5leHQoY29udGVudC5qb2luYWJsZSk7XG5cbiAgICAvLyBDaGVjayBpZiBvd25lciBoYXMgam9pbmVkXG4gICAgY29uc3Qgb3duZXJKb2luZWQgPSB0aGlzLmNoZWNrSWZPd25lckpvaW5lZChjb250ZW50LnVzZXJzKTtcbiAgICB0aGlzLm93bmVySGFzSm9pbmVkU3ViamVjdC5uZXh0KG93bmVySm9pbmVkKTtcblxuICAgIC8vIERldGVjdCBpZiBvd25lciBsZWZ0OiB3YXMgcHJlc2VudCwgbm93IG5vdCBwcmVzZW50XG4gICAgaWYgKHRoaXMud2FzT3duZXJQcmVzZW50ICYmICFvd25lckpvaW5lZCkge1xuICAgICAgY29uc29sZS5sb2coJ1tUQVMgREVCVUddIE93bmVyIGhhcyBsZWZ0IHRoZSBzZXNzaW9uJyk7XG4gICAgICB0aGlzLm93bmVySGFzTGVmdFN1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAob3duZXJKb2luZWQpIHtcbiAgICAgIHRoaXMud2FzT3duZXJQcmVzZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHdhaXRpbmcgcm9vbSB1c2VycyAoc3RhdHVzID09PSBXQUlUSU5HKVxuICAgIGNvbnN0IHdhaXRpbmdVc2VyczogV2FpdGluZ1Jvb21Vc2VyW10gPSBjb250ZW50LnVzZXJzXG4gICAgICAuZmlsdGVyKCh1KSA9PiAodS5zdGF0dXMgYXMgc3RyaW5nKSA9PT0gJ1dBSVRJTkcnKVxuICAgICAgLm1hcCgodSkgPT4gKHtcbiAgICAgICAgdXNlcklkOiB1LnVzZXJJZCxcbiAgICAgICAgbmFtZTogYFVzZXIgJHt1LnVzZXJJZH1gLCAvLyBUT0RPOiBGZXRjaCBhY3R1YWwgdXNlciBuYW1lcyBmcm9tIGEgdXNlciBzZXJ2aWNlXG4gICAgICAgIHN0YXR1czogUm9vbVVzZXJTdGF0dXMuV0FJVElORyxcbiAgICAgIH0pKTtcblxuICAgIHRoaXMud2FpdGluZ1Jvb21Vc2Vyc1N1YmplY3QubmV4dCh3YWl0aW5nVXNlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGF0IGxlYXN0IG9uZSBPV05FUiBoYXMgam9pbmVkIHRoZSBjYWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0lmT3duZXJKb2luZWQoXG4gICAgdXNlcnM6IHsgdXNlcklkOiBudW1iZXI7IHJvbDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9W11cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHVzZXJzLnNvbWUoXG4gICAgICAodSkgPT4gdS5yb2wgPT09IFRhc1VzZXJSb2xlLk9XTkVSICYmIHUuc3RhdHVzID09PSAnSk9JTkVEJ1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRtaXQgYSB1c2VyIGZyb20gdGhlIHdhaXRpbmcgcm9vbSBieSBjaGFuZ2luZyB0aGVpciBzdGF0dXMuXG4gICAqL1xuICBwdWJsaWMgYWRtaXRVc2VyRnJvbVdhaXRpbmdSb29tKFxuICAgIHVzZXJJZDogbnVtYmVyLFxuICAgIHZpZGVvQ2FsbElkOiBudW1iZXJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5tb2RpZnlQcm94eVZpZGVvVXNlcih7XG4gICAgICB1c2VySWQsXG4gICAgICB2aWRlb0NhbGxJZCxcbiAgICAgIGFjdGlvbjogVXNlckNhbGxBY3Rpb24uV0FJVElOR19ST09NX0xFQVZFLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gR2V0dGVycyBmb3IgY3VycmVudCBjYWxsIGNvbnRleHRcbiAgcHVibGljIGdldCBhcHBvaW50bWVudElkKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRBcHBvaW50bWVudElkO1xuICB9XG5cbiAgcHVibGljIGdldCB2aWRlb0NhbGxJZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50VmlkZW9DYWxsSWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdHMgdG8gYSBUb2tCb3ggdmlkZW8gc2Vzc2lvblxuICAgKi9cbiAgcHVibGljIGNvbm5lY3RTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgcHVibGlzaGVyRWxlbWVudDogc3RyaW5nLFxuICAgIHN1YnNjcmliZXJFbGVtZW50OiBzdHJpbmcsXG4gICAgYnVzaW5lc3NSb2xlOiBUYXNCdXNpbmVzc1JvbGUgPSBUYXNCdXNpbmVzc1JvbGUuVVNFUlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuQ09OTkVDVElORyk7XG4gICAgdGhpcy5jdXJyZW50U2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIHRoaXMuY3VycmVudFRva2VuID0gdG9rZW47XG4gICAgdGhpcy5jdXJyZW50QnVzaW5lc3NSb2xlID0gYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMuaXNGaW5pc2hpbmdTZXNzaW9uID0gZmFsc2U7IC8vIFJlc2V0IGZsYWcgZm9yIG5ldyBzZXNzaW9uXG5cbiAgICAvLyBTYXZlIGluaXRpYWwgc3RhdGUgKGRlZmF1bHRpbmcgdG8gY3VycmVudCB2aWV3IG1vZGUpXG4gICAgdGhpcy5zYXZlU2Vzc2lvblN0YXRlKFxuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdG9rZW4sXG4gICAgICB0aGlzLnZpZXdNb2RlU3ViamVjdC5nZXRWYWx1ZSgpLFxuICAgICAgYnVzaW5lc3NSb2xlXG4gICAgKTtcbiAgICAvLyBDbGVhciB0aGUgZGlzY29ubmVjdGVkIGZsYWcgd2hlbiBzdGFydGluZyBhIG5ldyBjb25uZWN0aW9uXG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkRJU0NPTk5FQ1RFRF9GTEFHX0tFWSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFPVC5jaGVja1N5c3RlbVJlcXVpcmVtZW50cygpKSB7XG4gICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KENhbGxTdGF0ZS5FUlJPUik7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0Jyb3dzZXIgbm90IGNvbXBhdGlibGUgd2l0aCBUb2tCb3gnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXNzaW9uID0gT1QuaW5pdFNlc3Npb24odGhpcy5jb25maWcudG9rQm94QXBpS2V5LCBzZXNzaW9uSWQpO1xuXG4gICAgICAvLyBIYW5kbGUgbmV3IHN0cmVhbXMgKHJlbW90ZSBwYXJ0aWNpcGFudHMgam9pbmluZylcbiAgICAgIHRoaXMuc2Vzc2lvbi5vbignc3RyZWFtQ3JlYXRlZCcsIChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gdGhpcy5zZXNzaW9uPy5zdWJzY3JpYmUoXG4gICAgICAgICAgZXZlbnQuc3RyZWFtLFxuICAgICAgICAgIHN1YnNjcmliZXJFbGVtZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluc2VydE1vZGU6ICdhcHBlbmQnLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3Vic2NyaWJpbmcgdG8gc3RyZWFtOicsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSGFuZGxlIHN0cmVhbXMgZW5kaW5nIChyZW1vdGUgcGFydGljaXBhbnRzIGxlYXZpbmcpXG4gICAgICB0aGlzLnNlc3Npb24ub24oJ3N0cmVhbURlc3Ryb3llZCcsIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzID0gdGhpcy5zdWJzY3JpYmVycy5maWx0ZXIoXG4gICAgICAgICAgKHN1YikgPT4gc3ViLnN0cmVhbT8uc3RyZWFtSWQgIT09IGV2ZW50LnN0cmVhbS5zdHJlYW1JZFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEhhbmRsZSBzZXNzaW9uIGRpc2Nvbm5lY3Rpb25cbiAgICAgIHRoaXMuc2Vzc2lvbi5vbignc2Vzc2lvbkRpc2Nvbm5lY3RlZCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkRJU0NPTk5FQ1RFRCk7XG5cbiAgICAgICAgLy8gQ2FsbCBmaW5pc2hTZXNzaW9uIHdoZW4gc2Vzc2lvbiBpcyBkaXNjb25uZWN0ZWQgKGUuZy4sIGJ5IHNlcnZlcilcbiAgICAgICAgLy8gT25seSBjYWxsIGlmIG5vdCBhbHJlYWR5IGZpbmlzaGluZyAocHJldmVudHMgZHVwbGljYXRlIGNhbGxzKVxuICAgICAgICBjb25zdCBzZXNzaW9uSWRUb0ZpbmlzaCA9IHRoaXMuY3VycmVudFNlc3Npb25JZDtcbiAgICAgICAgaWYgKHNlc3Npb25JZFRvRmluaXNoICYmICF0aGlzLmlzRmluaXNoaW5nU2Vzc2lvbikge1xuICAgICAgICAgIHRoaXMuaXNGaW5pc2hpbmdTZXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmZpbmlzaFByb3h5VmlkZW9TZXNzaW9uKHtcbiAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkVG9GaW5pc2gsXG4gICAgICAgICAgICBidXNpbmVzc1JvbGU6IHRoaXMuY3VycmVudEJ1c2luZXNzUm9sZSxcbiAgICAgICAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbVEFTIERFQlVHXSBTZXNzaW9uIGZpbmlzaGVkIG9uIGRpc2Nvbm5lY3QgZXZlbnQ6JywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICB0aGlzLmlzRmluaXNoaW5nU2Vzc2lvbiA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RBUyBERUJVR10gRXJyb3IgZmluaXNoaW5nIHNlc3Npb24gb24gZGlzY29ubmVjdDonLCBlcnJvcik7XG4gICAgICAgICAgICAgIHRoaXMuaXNGaW5pc2hpbmdTZXNzaW9uID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQ29ubmVjdCB0byBzZXNzaW9uXG4gICAgICB0aGlzLnNlc3Npb24uY29ubmVjdCh0b2tlbiwgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNvbm5lY3RpbmcgdG8gc2Vzc2lvbjonLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkVSUk9SKTtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgcHVibGlzaGVyIChsb2NhbCB2aWRlbylcbiAgICAgICAgdGhpcy5wdWJsaXNoZXIgPSBPVC5pbml0UHVibGlzaGVyKFxuICAgICAgICAgIHB1Ymxpc2hlckVsZW1lbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zZXJ0TW9kZTogJ2FwcGVuZCcsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBwdWJsaXNoZXI6JywgZXJyKTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkVSUk9SKTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHVibGlzaCB0byBzZXNzaW9uXG4gICAgICAgICAgICB0aGlzLnNlc3Npb24/LnB1Ymxpc2godGhpcy5wdWJsaXNoZXIsIChwdWJFcnIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHB1YkVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHB1Ymxpc2hpbmcgc3RyZWFtOicsIHB1YkVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoQ2FsbFN0YXRlLkVSUk9SKTtcbiAgICAgICAgICAgICAgICByZWplY3QocHViRXJyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dChDYWxsU3RhdGUuQ09OTkVDVEVEKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVmlkZW8gRWxlbWVudCBNb3ZlbWVudCBNZXRob2RzXG4gIHB1YmxpYyBtb3ZlUHVibGlzaGVyVG8obmV3Q29udGFpbmVySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wdWJsaXNoZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHB1Ymxpc2hlckVsZW1lbnQgPSB0aGlzLnB1Ymxpc2hlci5lbGVtZW50O1xuICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5ld0NvbnRhaW5lcklkKTtcblxuICAgIGlmIChwdWJsaXNoZXJFbGVtZW50ICYmIG5ld0NvbnRhaW5lcikge1xuICAgICAgbmV3Q29udGFpbmVyLmFwcGVuZENoaWxkKHB1Ymxpc2hlckVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBtb3ZlU3Vic2NyaWJlcnNUbyhuZXdDb250YWluZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbmV3Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobmV3Q29udGFpbmVySWQpO1xuICAgIGlmICghbmV3Q29udGFpbmVyKSByZXR1cm47XG5cbiAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIGNvbnN0IHN1YnNjcmliZXJFbGVtZW50ID0gc3Vic2NyaWJlci5lbGVtZW50O1xuICAgICAgaWYgKHN1YnNjcmliZXJFbGVtZW50KSB7XG4gICAgICAgIG5ld0NvbnRhaW5lci5hcHBlbmRDaGlsZChzdWJzY3JpYmVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIG1haW4gdmlkZW8gKHN1YnNjcmliZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgcHVibGlzaGVyKSB0byBhIGNvbnRhaW5lci5cbiAgICogVXNlZCBmb3IgUGlQIG1vZGUgdG8gc2hvdyBvbmx5IG9uZSB2aWRlby5cbiAgICovXG4gIHB1YmxpYyBtb3ZlTWFpblZpZGVvVG8obmV3Q29udGFpbmVySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5ld0NvbnRhaW5lcklkKTtcbiAgICBpZiAoIW5ld0NvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgLy8gUHJlZmVyIHJlbW90ZSB2aWRlbyAoc3Vic2NyaWJlcikgYXMgbWFpblxuICAgIGlmICh0aGlzLnN1YnNjcmliZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5zdWJzY3JpYmVyc1swXS5lbGVtZW50KSB7XG4gICAgICBuZXdDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zdWJzY3JpYmVyc1swXS5lbGVtZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gbG9jYWwgdmlkZW8gKHB1Ymxpc2hlcilcbiAgICBpZiAodGhpcy5wdWJsaXNoZXI/LmVsZW1lbnQpIHtcbiAgICAgIG5ld0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnB1Ymxpc2hlci5lbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdmlkZW9zIGJhY2sgdG8gZnVsbHNjcmVlbiBjb250YWluZXJzXG4gICAqL1xuICBwdWJsaWMgbW92ZVZpZGVvc1RvRnVsbHNjcmVlbigpOiB2b2lkIHtcbiAgICB0aGlzLm1vdmVTdWJzY3JpYmVyc1RvKCdzdWJzY3JpYmVyLWNvbnRhaW5lcicpO1xuICAgIHRoaXMubW92ZVB1Ymxpc2hlclRvKCdwdWJsaXNoZXItY29udGFpbmVyJyk7XG4gIH1cbn1cbiJdfQ==
|