@hivegpt/hiveai-angular 0.0.573 → 0.0.575
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/bundles/hivegpt-hiveai-angular.umd.js +526 -271
- package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
- package/esm2015/lib/components/chat-drawer/chat-drawer.component.js +6 -6
- package/esm2015/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.js +85 -54
- package/esm2015/lib/components/voice-agent/services/daily-voice-client.service.js +153 -63
- package/esm2015/lib/components/voice-agent/services/voice-agent.service.js +149 -85
- package/esm2015/lib/components/voice-agent/services/websocket-voice-client.service.js +79 -34
- package/fesm2015/hivegpt-hiveai-angular.js +465 -236
- package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
- package/hivegpt-hiveai-angular.metadata.json +1 -1
- package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts +7 -1
- package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts.map +1 -1
- package/lib/components/voice-agent/services/daily-voice-client.service.d.ts +37 -3
- package/lib/components/voice-agent/services/daily-voice-client.service.d.ts.map +1 -1
- package/lib/components/voice-agent/services/voice-agent.service.d.ts +19 -6
- package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
- package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts +5 -12
- package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -12,8 +12,21 @@ import * as i1 from "./audio-analyzer.service";
|
|
|
12
12
|
import * as i2 from "./websocket-voice-client.service";
|
|
13
13
|
import * as i3 from "./daily-voice-client.service";
|
|
14
14
|
import * as i4 from "../../../services/platform-token-refresh.service";
|
|
15
|
+
/**
|
|
16
|
+
* Voice agent orchestrator. Coordinates WebSocket (signaling) and Daily.js (WebRTC audio).
|
|
17
|
+
*
|
|
18
|
+
* CRITICAL: This service must NEVER use Socket.IO or ngx-socket-io. Voice flow uses only:
|
|
19
|
+
* - Native WebSocket (WebSocketVoiceClientService) for signaling (room_created, transcripts)
|
|
20
|
+
* - Daily.js (DailyVoiceClientService) for WebRTC audio. Audio does NOT flow over WebSocket.
|
|
21
|
+
*
|
|
22
|
+
* - Maintains callState, statusText, duration, isMicMuted, isUserSpeaking, audioLevels
|
|
23
|
+
* - Uses WebSocket for room_created and transcripts only (no audio)
|
|
24
|
+
* - Uses Daily.js for all audio, mic, and real-time speaking detection
|
|
25
|
+
*/
|
|
15
26
|
export class VoiceAgentService {
|
|
16
|
-
constructor(audioAnalyzer, wsClient, dailyClient, platformTokenRefresh,
|
|
27
|
+
constructor(audioAnalyzer, wsClient, dailyClient, platformTokenRefresh,
|
|
28
|
+
/** `Object` not `object` — ngc metadata collection rejects the `object` type in DI params. */
|
|
29
|
+
platformId) {
|
|
17
30
|
this.audioAnalyzer = audioAnalyzer;
|
|
18
31
|
this.wsClient = wsClient;
|
|
19
32
|
this.dailyClient = dailyClient;
|
|
@@ -22,7 +35,7 @@ export class VoiceAgentService {
|
|
|
22
35
|
this.callStateSubject = new BehaviorSubject('idle');
|
|
23
36
|
this.statusTextSubject = new BehaviorSubject('');
|
|
24
37
|
this.durationSubject = new BehaviorSubject('00:00');
|
|
25
|
-
this.isMicMutedSubject = new BehaviorSubject(
|
|
38
|
+
this.isMicMutedSubject = new BehaviorSubject(false);
|
|
26
39
|
this.isUserSpeakingSubject = new BehaviorSubject(false);
|
|
27
40
|
this.audioLevelsSubject = new BehaviorSubject([]);
|
|
28
41
|
this.userTranscriptSubject = new Subject();
|
|
@@ -30,6 +43,8 @@ export class VoiceAgentService {
|
|
|
30
43
|
this.callStartTime = 0;
|
|
31
44
|
this.durationInterval = null;
|
|
32
45
|
this.subscriptions = new Subscription();
|
|
46
|
+
/** Per-call only; cleared on disconnect / reset / new room so handlers do not stack. */
|
|
47
|
+
this.callSubscriptions = new Subscription();
|
|
33
48
|
this.destroy$ = new Subject();
|
|
34
49
|
this.callState$ = this.callStateSubject.asObservable();
|
|
35
50
|
this.statusText$ = this.statusTextSubject.asObservable();
|
|
@@ -39,118 +54,155 @@ export class VoiceAgentService {
|
|
|
39
54
|
this.audioLevels$ = this.audioLevelsSubject.asObservable();
|
|
40
55
|
this.userTranscript$ = this.userTranscriptSubject.asObservable();
|
|
41
56
|
this.botTranscript$ = this.botTranscriptSubject.asObservable();
|
|
57
|
+
// Waveform visualization only - do NOT use for speaking state
|
|
42
58
|
this.subscriptions.add(this.audioAnalyzer.audioLevels$.subscribe((levels) => this.audioLevelsSubject.next(levels)));
|
|
59
|
+
// Transcripts: single subscription for service lifetime (avoid stacking on each connect()).
|
|
60
|
+
// WebSocket is disconnected between calls; no replay — new subscribers (setupVoiceTranscripts)
|
|
61
|
+
// only receive messages from the new WS after connect.
|
|
62
|
+
this.subscriptions.add(this.wsClient.userTranscript$
|
|
63
|
+
.pipe(takeUntil(this.destroy$))
|
|
64
|
+
.subscribe((t) => this.userTranscriptSubject.next(t)));
|
|
65
|
+
this.subscriptions.add(this.wsClient.botTranscript$
|
|
66
|
+
.pipe(takeUntil(this.destroy$))
|
|
67
|
+
.subscribe((t) => this.botTranscriptSubject.next(t)));
|
|
43
68
|
}
|
|
44
69
|
ngOnDestroy() {
|
|
45
70
|
this.destroy$.next();
|
|
46
71
|
this.subscriptions.unsubscribe();
|
|
47
72
|
this.disconnect();
|
|
48
73
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Tear down transports and reset UI state so a new `connect()` can run.
|
|
51
|
-
* `connect()` only proceeds from `idle`; use this after `ended` or when reopening the modal.
|
|
52
|
-
*/
|
|
74
|
+
/** Reset to idle state (e.g. when modal opens so user can click Start Call). */
|
|
53
75
|
resetToIdle() {
|
|
76
|
+
if (this.callStateSubject.value === 'idle')
|
|
77
|
+
return;
|
|
78
|
+
this.callSubscriptions.unsubscribe();
|
|
79
|
+
this.callSubscriptions = new Subscription();
|
|
54
80
|
this.stopDurationTimer();
|
|
55
81
|
this.audioAnalyzer.stop();
|
|
56
82
|
this.wsClient.disconnect();
|
|
83
|
+
// Fire-and-forget: Daily disconnect is async; connect() will await if needed
|
|
57
84
|
void this.dailyClient.disconnect();
|
|
58
85
|
this.callStateSubject.next('idle');
|
|
59
86
|
this.statusTextSubject.next('');
|
|
60
|
-
this.durationSubject.next('
|
|
61
|
-
this.isMicMutedSubject.next(true);
|
|
62
|
-
this.isUserSpeakingSubject.next(false);
|
|
63
|
-
this.audioLevelsSubject.next([]);
|
|
87
|
+
this.durationSubject.next('0:00');
|
|
64
88
|
}
|
|
65
|
-
connect(apiUrl, token, botId, conversationId, apiKey, eventToken, eventId, eventUrl, domainAuthority, usersApiUrl) {
|
|
89
|
+
connect(apiUrl, token, botId, conversationId, apiKey, eventToken, eventId, eventUrl, domainAuthority, usersApiUrl, existingMicStream) {
|
|
90
|
+
var _a;
|
|
66
91
|
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
-
if (this.callStateSubject.value !== 'idle')
|
|
92
|
+
if (this.callStateSubject.value !== 'idle') {
|
|
93
|
+
console.warn('Call already in progress');
|
|
68
94
|
return;
|
|
95
|
+
}
|
|
69
96
|
try {
|
|
70
97
|
this.callStateSubject.next('connecting');
|
|
71
|
-
this.statusTextSubject.next('Connecting
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
98
|
+
this.statusTextSubject.next('Connecting...');
|
|
99
|
+
const tokenPromise = usersApiUrl && isPlatformBrowser(this.platformId)
|
|
100
|
+
? this.platformTokenRefresh
|
|
101
|
+
.ensureValidAccessToken(token, usersApiUrl)
|
|
102
|
+
.pipe(take(1))
|
|
103
|
+
.toPromise()
|
|
104
|
+
.then((ensured) => { var _a; return (_a = ensured === null || ensured === void 0 ? void 0 : ensured.accessToken) !== null && _a !== void 0 ? _a : token; })
|
|
105
|
+
.catch((e) => {
|
|
106
|
+
console.warn('[HiveGpt Voice] Token refresh before connect failed', e);
|
|
107
|
+
return token;
|
|
108
|
+
})
|
|
109
|
+
: Promise.resolve(token);
|
|
110
|
+
const prepPromise = Promise.resolve().then(() => {
|
|
111
|
+
const baseUrl = apiUrl.replace(/\/$/, '');
|
|
112
|
+
return {
|
|
113
|
+
postUrl: `${baseUrl}/ai/ask-voice`,
|
|
114
|
+
body: JSON.stringify({
|
|
115
|
+
bot_id: botId,
|
|
116
|
+
conversation_id: conversationId,
|
|
117
|
+
voice: 'alloy',
|
|
118
|
+
}),
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
const micPromise = (existingMicStream === null || existingMicStream === void 0 ? void 0 : existingMicStream.getAudioTracks().some((t) => t.readyState === 'live'))
|
|
122
|
+
? Promise.resolve(existingMicStream)
|
|
123
|
+
: isPlatformBrowser(this.platformId) &&
|
|
124
|
+
((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia)
|
|
125
|
+
? navigator.mediaDevices
|
|
126
|
+
.getUserMedia({ audio: true })
|
|
127
|
+
.catch(() => undefined)
|
|
128
|
+
: Promise.resolve(undefined);
|
|
129
|
+
const [accessToken, { postUrl, body }, micStream] = yield Promise.all([
|
|
130
|
+
tokenPromise,
|
|
131
|
+
prepPromise,
|
|
132
|
+
micPromise,
|
|
133
|
+
]);
|
|
134
|
+
const headers = {
|
|
135
|
+
'Content-Type': 'application/json',
|
|
136
|
+
Authorization: `Bearer ${accessToken}`,
|
|
137
|
+
'x-api-key': apiKey,
|
|
138
|
+
'hive-bot-id': botId,
|
|
139
|
+
'domain-authority': domainAuthority,
|
|
140
|
+
eventUrl,
|
|
141
|
+
eventId,
|
|
142
|
+
eventToken,
|
|
143
|
+
'ngrok-skip-browser-warning': 'true',
|
|
144
|
+
};
|
|
145
|
+
// POST to get ws_url for signaling
|
|
89
146
|
const res = yield fetch(postUrl, {
|
|
90
147
|
method: 'POST',
|
|
91
|
-
headers
|
|
92
|
-
|
|
93
|
-
Authorization: `Bearer ${accessToken}`,
|
|
94
|
-
'domain-authority': domainAuthority,
|
|
95
|
-
eventtoken: eventToken,
|
|
96
|
-
eventurl: eventUrl,
|
|
97
|
-
'hive-bot-id': botId,
|
|
98
|
-
'x-api-key': apiKey,
|
|
99
|
-
eventId: eventIdHeader,
|
|
100
|
-
},
|
|
101
|
-
body: JSON.stringify({
|
|
102
|
-
bot_id: botId,
|
|
103
|
-
conversation_id: conversationId,
|
|
104
|
-
voice: 'alloy',
|
|
105
|
-
}),
|
|
148
|
+
headers,
|
|
149
|
+
body,
|
|
106
150
|
});
|
|
151
|
+
if (!res.ok) {
|
|
152
|
+
throw new Error(`HTTP ${res.status}`);
|
|
153
|
+
}
|
|
107
154
|
const json = yield res.json();
|
|
108
155
|
const wsUrl = json === null || json === void 0 ? void 0 : json.rn_ws_url;
|
|
156
|
+
if (!wsUrl || typeof wsUrl !== 'string') {
|
|
157
|
+
throw new Error('No ws_url in response');
|
|
158
|
+
}
|
|
159
|
+
// Subscribe to room_created BEFORE connecting to avoid race
|
|
109
160
|
this.wsClient.roomCreated$
|
|
110
161
|
.pipe(take(1), takeUntil(this.destroy$))
|
|
111
162
|
.subscribe((roomUrl) => __awaiter(this, void 0, void 0, function* () {
|
|
112
|
-
|
|
163
|
+
try {
|
|
164
|
+
yield this.onRoomCreated(roomUrl, micStream !== null && micStream !== void 0 ? micStream : undefined);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
console.error('Daily join failed:', err);
|
|
168
|
+
this.callStateSubject.next('ended');
|
|
169
|
+
this.statusTextSubject.next('Connection failed');
|
|
170
|
+
yield this.disconnect();
|
|
171
|
+
throw err;
|
|
172
|
+
}
|
|
113
173
|
}));
|
|
114
|
-
|
|
115
|
-
this.
|
|
116
|
-
this.wsClient.connect(wsUrl);
|
|
174
|
+
// Connect signaling WebSocket (no audio over WS)
|
|
175
|
+
yield this.wsClient.connect(wsUrl);
|
|
117
176
|
}
|
|
118
|
-
catch (
|
|
177
|
+
catch (error) {
|
|
178
|
+
console.error('Error connecting voice agent:', error);
|
|
119
179
|
this.callStateSubject.next('ended');
|
|
180
|
+
yield this.disconnect();
|
|
181
|
+
this.statusTextSubject.next('Connection failed');
|
|
182
|
+
throw error;
|
|
120
183
|
}
|
|
121
184
|
});
|
|
122
185
|
}
|
|
123
|
-
onRoomCreated(roomUrl) {
|
|
186
|
+
onRoomCreated(roomUrl, micStream) {
|
|
124
187
|
return __awaiter(this, void 0, void 0, function* () {
|
|
125
|
-
yield this.dailyClient.connect(roomUrl);
|
|
126
|
-
|
|
127
|
-
this.
|
|
128
|
-
|
|
129
|
-
this.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
console.log('[VoiceFlow] First bot response → enabling mic');
|
|
137
|
-
this.dailyClient.setMuted(false);
|
|
138
|
-
this.statusTextSubject.next('You can speak now');
|
|
139
|
-
});
|
|
140
|
-
// ⛑️ Fallback (if bot fails)
|
|
141
|
-
setTimeout(() => {
|
|
142
|
-
if (!handled) {
|
|
143
|
-
console.warn('[VoiceFlow] Fallback → enabling mic');
|
|
144
|
-
this.dailyClient.setMuted(false);
|
|
145
|
-
this.statusTextSubject.next('You can speak now');
|
|
146
|
-
}
|
|
147
|
-
}, 8000);
|
|
148
|
-
// rest same
|
|
149
|
-
this.subscriptions.add(combineLatest([
|
|
188
|
+
yield this.dailyClient.connect(roomUrl, undefined, micStream);
|
|
189
|
+
this.callSubscriptions.unsubscribe();
|
|
190
|
+
this.callSubscriptions = new Subscription();
|
|
191
|
+
// Waveform: use local mic stream from Daily client
|
|
192
|
+
this.callSubscriptions.add(this.dailyClient.localStream$
|
|
193
|
+
.pipe(filter((s) => s != null), take(1))
|
|
194
|
+
.subscribe((stream) => {
|
|
195
|
+
this.audioAnalyzer.start(stream);
|
|
196
|
+
}));
|
|
197
|
+
this.callSubscriptions.add(this.dailyClient.userSpeaking$.subscribe((s) => this.isUserSpeakingSubject.next(s)));
|
|
198
|
+
this.callSubscriptions.add(combineLatest([
|
|
150
199
|
this.dailyClient.speaking$,
|
|
151
200
|
this.dailyClient.userSpeaking$,
|
|
152
201
|
]).subscribe(([bot, user]) => {
|
|
153
202
|
const current = this.callStateSubject.value;
|
|
203
|
+
if (current === 'connecting' && !bot) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
154
206
|
if (current === 'connecting' && bot) {
|
|
155
207
|
this.callStartTime = Date.now();
|
|
156
208
|
this.startDurationTimer();
|
|
@@ -164,15 +216,21 @@ export class VoiceAgentService {
|
|
|
164
216
|
this.callStateSubject.next('talking');
|
|
165
217
|
}
|
|
166
218
|
else {
|
|
167
|
-
|
|
219
|
+
// Between bot turns: stay on listening to avoid flicker via 'connected'
|
|
220
|
+
this.callStateSubject.next('listening');
|
|
168
221
|
}
|
|
169
222
|
}));
|
|
223
|
+
this.callSubscriptions.add(this.dailyClient.micMuted$.subscribe((muted) => this.isMicMutedSubject.next(muted)));
|
|
224
|
+
this.statusTextSubject.next('Connecting...');
|
|
170
225
|
});
|
|
171
226
|
}
|
|
172
227
|
disconnect() {
|
|
173
228
|
return __awaiter(this, void 0, void 0, function* () {
|
|
229
|
+
this.callSubscriptions.unsubscribe();
|
|
230
|
+
this.callSubscriptions = new Subscription();
|
|
174
231
|
this.stopDurationTimer();
|
|
175
232
|
this.audioAnalyzer.stop();
|
|
233
|
+
// Daily first, then WebSocket
|
|
176
234
|
yield this.dailyClient.disconnect();
|
|
177
235
|
this.wsClient.disconnect();
|
|
178
236
|
this.callStateSubject.next('ended');
|
|
@@ -184,16 +242,22 @@ export class VoiceAgentService {
|
|
|
184
242
|
this.dailyClient.setMuted(!current);
|
|
185
243
|
}
|
|
186
244
|
startDurationTimer() {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
245
|
+
const updateDuration = () => {
|
|
246
|
+
if (this.callStartTime > 0) {
|
|
247
|
+
const elapsed = Math.floor((Date.now() - this.callStartTime) / 1000);
|
|
248
|
+
const minutes = Math.floor(elapsed / 60);
|
|
249
|
+
const seconds = elapsed % 60;
|
|
250
|
+
this.durationSubject.next(`${minutes}:${String(seconds).padStart(2, '0')}`);
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
updateDuration();
|
|
254
|
+
this.durationInterval = setInterval(updateDuration, 1000);
|
|
193
255
|
}
|
|
194
256
|
stopDurationTimer() {
|
|
195
|
-
if (this.durationInterval)
|
|
257
|
+
if (this.durationInterval) {
|
|
196
258
|
clearInterval(this.durationInterval);
|
|
259
|
+
this.durationInterval = null;
|
|
260
|
+
}
|
|
197
261
|
}
|
|
198
262
|
}
|
|
199
263
|
VoiceAgentService.ɵprov = i0.ɵɵdefineInjectable({ factory: function VoiceAgentService_Factory() { return new VoiceAgentService(i0.ɵɵinject(i1.AudioAnalyzerService), i0.ɵɵinject(i2.WebSocketVoiceClientService), i0.ɵɵinject(i3.DailyVoiceClientService), i0.ɵɵinject(i4.PlatformTokenRefreshService), i0.ɵɵinject(i0.PLATFORM_ID)); }, token: VoiceAgentService, providedIn: "root" });
|
|
@@ -209,4 +273,4 @@ VoiceAgentService.ctorParameters = () => [
|
|
|
209
273
|
{ type: PlatformTokenRefreshService },
|
|
210
274
|
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
|
|
211
275
|
];
|
|
212
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9oaXR0aGFrdXIvaGl2ZS1ncHQvSGl2ZUFJLVBhY2thZ2VzL0FuZ3VsYXIvcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9zZXJ2aWNlcy92b2ljZS1hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBRWIsT0FBTyxFQUNQLFlBQVksR0FDYixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7QUFrQnZFLE1BQU0sT0FBTyxpQkFBaUI7SUF5QjVCLFlBQ1UsYUFBbUMsRUFDbkMsUUFBcUMsRUFDckMsV0FBb0MsRUFDcEMsb0JBQWlELEVBQzVCLFVBQWtCO1FBSnZDLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUNuQyxhQUFRLEdBQVIsUUFBUSxDQUE2QjtRQUNyQyxnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFDcEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUE2QjtRQUM1QixlQUFVLEdBQVYsVUFBVSxD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QUFDO0lBQ1gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbEUsQ0FBQzs7OztZQXpPRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQW5CUSxvQkFBb0I7WUFDcEIsMkJBQTJCO1lBQzNCLHVCQUF1QjtZQUh2QiwyQkFBMkI7WUFtRFMsTUFBTSx1QkFBOUMsTUFBTSxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUGxhdGZvcm1Ub2tlblJlZnJlc2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGxhdGZvcm0tdG9rZW4tcmVmcmVzaC5zZXJ2aWNlJztcbmltcG9ydCB7IEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9hdWRpby1hbmFseXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFdlYlNvY2tldFZvaWNlQ2xpZW50U2VydmljZSB9IGZyb20gJy4vd2Vic29ja2V0LXZvaWNlLWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IERhaWx5Vm9pY2VDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi9kYWlseS12b2ljZS1jbGllbnQuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIENhbGxTdGF0ZSA9XG4gIHwgJ2lkbGUnXG4gIHwgJ2Nvbm5lY3RpbmcnXG4gIHwgJ2Nvbm5lY3RlZCdcbiAgfCAnbGlzdGVuaW5nJ1xuICB8ICd0YWxraW5nJ1xuICB8ICdlbmRlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdERhdGEge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGZpbmFsOiBib29sZWFuO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVm9pY2VBZ2VudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGNhbGxTdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENhbGxTdGF0ZT4oJ2lkbGUnKTtcbiAgcHJpdmF0ZSBzdGF0dXNUZXh0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHByaXZhdGUgZHVyYXRpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcwMDowMCcpO1xuICBwcml2YXRlIGlzTWljTXV0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHJpdmF0ZSBpc1VzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBhdWRpb0xldmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcltdPihbXSk7XG4gIHByaXZhdGUgdXNlclRyYW5zY3JpcHRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VHJhbnNjcmlwdERhdGE+KCk7XG4gIHByaXZhdGUgYm90VHJhbnNjcmlwdFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBjYWxsU3RhcnRUaW1lID0gMDtcbiAgcHJpdmF0ZSBkdXJhdGlvbkludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNhbGxTdGF0ZSQgPSB0aGlzLmNhbGxTdGF0ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHN0YXR1c1RleHQkID0gdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgZHVyYXRpb24kID0gdGhpcy5kdXJhdGlvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGlzTWljTXV0ZWQkID0gdGhpcy5pc01pY011dGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgaXNVc2VyU3BlYWtpbmckID0gdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGF1ZGlvTGV2ZWxzJCA9IHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB1c2VyVHJhbnNjcmlwdCQgPSB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgYm90VHJhbnNjcmlwdCQgPSB0aGlzLmJvdFRyYW5zY3JpcHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXVkaW9BbmFseXplcjogQXVkaW9BbmFseXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB3c0NsaWVudDogV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGFpbHlDbGllbnQ6IERhaWx5Vm9pY2VDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGxhdGZvcm1Ub2tlblJlZnJlc2g6IFBsYXRmb3JtVG9rZW5SZWZyZXNoU2VydmljZSxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuYXVkaW9BbmFseXplci5hdWRpb0xldmVscyQuc3Vic2NyaWJlKChsZXZlbHMpID0+XG4gICAgICAgIHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0Lm5leHQobGV2ZWxzKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlYXIgZG93biB0cmFuc3BvcnRzIGFuZCByZXNldCBVSSBzdGF0ZSBzbyBhIG5ldyBgY29ubmVjdCgpYCBjYW4gcnVuLlxuICAgKiBgY29ubmVjdCgpYCBvbmx5IHByb2NlZWRzIGZyb20gYGlkbGVgOyB1c2UgdGhpcyBhZnRlciBgZW5kZWRgIG9yIHdoZW4gcmVvcGVuaW5nIHRoZSBtb2RhbC5cbiAgICovXG4gIHJlc2V0VG9JZGxlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcER1cmF0aW9uVGltZXIoKTtcbiAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RvcCgpO1xuICAgIHRoaXMud3NDbGllbnQuZGlzY29ubmVjdCgpO1xuICAgIHZvaWQgdGhpcy5kYWlseUNsaWVudC5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2lkbGUnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJycpO1xuICAgIHRoaXMuZHVyYXRpb25TdWJqZWN0Lm5leHQoJzAwOjAwJyk7XG4gICAgdGhpcy5pc01pY011dGVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0Lm5leHQoW10pO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdChcbiAgICBhcGlVcmw6IHN0cmluZyxcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIGJvdElkOiBzdHJpbmcsXG4gICAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyxcbiAgICBhcGlLZXk6IHN0cmluZyxcbiAgICBldmVudFRva2VuOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nLFxuICAgIGV2ZW50VXJsOiBzdHJpbmcsXG4gICAgZG9tYWluQXV0aG9yaXR5OiBzdHJpbmcsXG4gICAgdXNlcnNBcGlVcmw/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNhbGxTdGF0ZVN1YmplY3QudmFsdWUgIT09ICdpZGxlJykgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdjb25uZWN0aW5nJyk7XG4gICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0Nvbm5lY3RpbmcgdG8gYWdlbnQuLi4nKTtcblxuICAgICAgbGV0IGFjY2Vzc1Rva2VuID0gdG9rZW47XG5cbiAgICAgIGlmICh1c2Vyc0FwaVVybCAmJiBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW5zdXJlZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1Ub2tlblJlZnJlc2hcbiAgICAgICAgICAgIC5lbnN1cmVWYWxpZEFjY2Vzc1Rva2VuKHRva2VuLCB1c2Vyc0FwaVVybClcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG5cbiAgICAgICAgICBpZiAoZW5zdXJlZD8uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuID0gZW5zdXJlZC5hY2Nlc3NUb2tlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZSA9IChhcGlVcmwgfHwgJycpLnJlcGxhY2UoL1xcLyskLywgJycpO1xuICAgICAgY29uc3QgcG9zdFVybCA9IGBodHRwczovLzEzNTYtMTAzLTIxMC0zMy0yMzYubmdyb2stZnJlZS5hcHAvYWkvYXNrLXZvaWNlYDtcbiAgICAgIC8vIFNhbWUgYXMgY2hhdC1kcmF3ZXIgYC9haS9hc2tgIGhlYWRlcnM6IHVzZSBgZXZlbnRJZGAgKGNhbWVsQ2FzZSksIHZhbHVlIGZyb20gaG9zdCBgdGhpcy5ldmVudElkYC5cbiAgICAgIGNvbnN0IGV2ZW50SWRIZWFkZXIgPSAoZXZlbnRJZCAmJiBTdHJpbmcoZXZlbnRJZCkudHJpbSgpKSB8fCAnJztcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocG9zdFVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FjY2Vzc1Rva2VufWAsXG4gICAgICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiBkb21haW5BdXRob3JpdHksXG4gICAgICAgICAgZXZlbnR0b2tlbjogZXZlbnRUb2tlbixcbiAgICAgICAgICBldmVudHVybDogZXZlbnRVcmwsXG4gICAgICAgICAgJ2hpdmUtYm90LWlkJzogYm90SWQsXG4gICAgICAgICAgJ3gtYXBpLWtleSc6IGFwaUtleSxcbiAgICAgICAgICBldmVudElkOiBldmVudElkSGVhZGVyLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgYm90X2lkOiBib3RJZCxcbiAgICAgICAgICBjb252ZXJzYXRpb25faWQ6IGNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgIHZvaWNlOiAnYWxsb3knLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IHdzVXJsID0ganNvbj8ucm5fd3NfdXJsO1xuXG4gICAgICB0aGlzLndzQ2xpZW50LnJvb21DcmVhdGVkJFxuICAgICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHJvb21VcmwpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uUm9vbUNyZWF0ZWQocm9vbVVybCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICB0aGlzLndzQ2xpZW50LnVzZXJUcmFuc2NyaXB0JC5zdWJzY3JpYmUoKHQpID0+XG4gICAgICAgICAgdGhpcy51c2VyVHJhbnNjcmlwdFN1YmplY3QubmV4dCh0KSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgIHRoaXMud3NDbGllbnQuYm90VHJhbnNjcmlwdCQuc3Vic2NyaWJlKCh0KSA9PlxuICAgICAgICAgIHRoaXMuYm90VHJhbnNjcmlwdFN1YmplY3QubmV4dCh0KSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMud3NDbGllbnQuY29ubmVjdCh3c1VybCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvblJvb21DcmVhdGVkKHJvb21Vcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGFpbHlDbGllbnQuY29ubmVjdChyb29tVXJsKTtcblxuICAgIC8vIPCflLQgU3RhcnQgTVVURURcbiAgICB0aGlzLmRhaWx5Q2xpZW50LnNldE11dGVkKHRydWUpO1xuICAgIHRoaXMuaXNNaWNNdXRlZFN1YmplY3QubmV4dCh0cnVlKTtcblxuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnTGlzdGVuaW5nIHRvIGFnZW50Li4uJyk7XG5cbiAgICAvLyDinIUgRW5hYmxlIG1pYyBvbiBGSVJTVCBib3Qgc3BlZWNoXG4gICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuZGFpbHlDbGllbnQuc3BlYWtpbmckLnBpcGUoZmlsdGVyKEJvb2xlYW4pLCB0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKGhhbmRsZWQpIHJldHVybjtcbiAgICAgIGhhbmRsZWQgPSB0cnVlO1xuXG4gICAgICBjb25zb2xlLmxvZygnW1ZvaWNlRmxvd10gRmlyc3QgYm90IHJlc3BvbnNlIOKGkiBlbmFibGluZyBtaWMnKTtcblxuICAgICAgdGhpcy5kYWlseUNsaWVudC5zZXRNdXRlZChmYWxzZSk7XG4gICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ1lvdSBjYW4gc3BlYWsgbm93Jyk7XG4gICAgfSk7XG5cbiAgICAvLyDim5HvuI8gRmFsbGJhY2sgKGlmIGJvdCBmYWlscylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghaGFuZGxlZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tWb2ljZUZsb3ddIEZhbGxiYWNrIOKGkiBlbmFibGluZyBtaWMnKTtcbiAgICAgICAgdGhpcy5kYWlseUNsaWVudC5zZXRNdXRlZChmYWxzZSk7XG4gICAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnWW91IGNhbiBzcGVhayBub3cnKTtcbiAgICAgIH1cbiAgICB9LCA4MDAwKTtcblxuICAgIC8vIHJlc3Qgc2FtZVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5kYWlseUNsaWVudC5zcGVha2luZyQsXG4gICAgICAgIHRoaXMuZGFpbHlDbGllbnQudXNlclNwZWFraW5nJCxcbiAgICAgIF0pLnN1YnNjcmliZSgoW2JvdCwgdXNlcl0pID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZTtcblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gJ2Nvbm5lY3RpbmcnICYmIGJvdCkge1xuICAgICAgICAgIHRoaXMuY2FsbFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGhpcy5zdGFydER1cmF0aW9uVGltZXIoKTtcbiAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgndGFsa2luZycpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2xpc3RlbmluZycpO1xuICAgICAgICB9IGVsc2UgaWYgKGJvdCkge1xuICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCd0YWxraW5nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3BEdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5hdWRpb0FuYWx5emVyLnN0b3AoKTtcblxuICAgIGF3YWl0IHRoaXMuZGFpbHlDbGllbnQuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMud3NDbGllbnQuZGlzY29ubmVjdCgpO1xuXG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZGVkJyk7XG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdDYWxsIEVuZGVkJyk7XG4gIH1cblxuICB0b2dnbGVNaWMoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuaXNNaWNNdXRlZFN1YmplY3QudmFsdWU7XG4gICAgdGhpcy5kYWlseUNsaWVudC5zZXRNdXRlZCghY3VycmVudCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHVyYXRpb25UaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmR1cmF0aW9uSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBlbGFwc2VkID0gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIHRoaXMuY2FsbFN0YXJ0VGltZSkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCk7XG4gICAgICBjb25zdCBzID0gZWxhcHNlZCAlIDYwO1xuICAgICAgdGhpcy5kdXJhdGlvblN1YmplY3QubmV4dChgJHttfToke1N0cmluZyhzKS5wYWRTdGFydCgyLCAnMCcpfWApO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wRHVyYXRpb25UaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kdXJhdGlvbkludGVydmFsKSBjbGVhckludGVydmFsKHRoaXMuZHVyYXRpb25JbnRlcnZhbCk7XG4gIH1cbn1cbiJdfQ==
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9oaXR0aGFrdXIvaGl2ZS1ncHQvSGl2ZUFJLVBhY2thZ2VzL0FuZ3VsYXIvcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy92b2ljZS1hZ2VudC9zZXJ2aWNlcy92b2ljZS1hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBRWIsT0FBTyxFQUNQLFlBQVksR0FDYixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7QUFldkU7Ozs7Ozs7Ozs7R0FVRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUE2QjVCLFlBQ1UsYUFBbUMsRUFDbkMsUUFBcUMsRUFDckMsV0FBb0MsRUFDcEMsb0JBQWlEO0lBQ3pELDhGQUE4RjtJQUNqRSxVQUFrQjtRQUx2QyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDbkMsYUFBUSxHQUFSLFFBQVEsQ0FBNkI7UUFDckMsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBQ3BDLHlCQUFvQixHQUFwQixvQkFB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QyxlQUFlLENBQUMsSUFBSSxDQUN2QixHQUFHLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUNqRCxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUM7UUFDRixjQUFjLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQzs7OztZQS9TRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQTlCUSxvQkFBb0I7WUFDcEIsMkJBQTJCO1lBQzNCLHVCQUF1QjtZQUh2QiwyQkFBMkI7WUFtRVMsTUFBTSx1QkFBOUMsTUFBTSxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUGxhdGZvcm1Ub2tlblJlZnJlc2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGxhdGZvcm0tdG9rZW4tcmVmcmVzaC5zZXJ2aWNlJztcbmltcG9ydCB7IEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9hdWRpby1hbmFseXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFdlYlNvY2tldFZvaWNlQ2xpZW50U2VydmljZSB9IGZyb20gJy4vd2Vic29ja2V0LXZvaWNlLWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IERhaWx5Vm9pY2VDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi9kYWlseS12b2ljZS1jbGllbnQuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIENhbGxTdGF0ZSA9XG4gIHwgJ2lkbGUnXG4gIHwgJ2Nvbm5lY3RpbmcnXG4gIHwgJ2Nvbm5lY3RlZCdcbiAgfCAnbGlzdGVuaW5nJ1xuICB8ICd0YWxraW5nJ1xuICB8ICdlbmRlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdERhdGEge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGZpbmFsOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFZvaWNlIGFnZW50IG9yY2hlc3RyYXRvci4gQ29vcmRpbmF0ZXMgV2ViU29ja2V0IChzaWduYWxpbmcpIGFuZCBEYWlseS5qcyAoV2ViUlRDIGF1ZGlvKS5cbiAqXG4gKiBDUklUSUNBTDogVGhpcyBzZXJ2aWNlIG11c3QgTkVWRVIgdXNlIFNvY2tldC5JTyBvciBuZ3gtc29ja2V0LWlvLiBWb2ljZSBmbG93IHVzZXMgb25seTpcbiAqIC0gTmF0aXZlIFdlYlNvY2tldCAoV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlKSBmb3Igc2lnbmFsaW5nIChyb29tX2NyZWF0ZWQsIHRyYW5zY3JpcHRzKVxuICogLSBEYWlseS5qcyAoRGFpbHlWb2ljZUNsaWVudFNlcnZpY2UpIGZvciBXZWJSVEMgYXVkaW8uIEF1ZGlvIGRvZXMgTk9UIGZsb3cgb3ZlciBXZWJTb2NrZXQuXG4gKlxuICogLSBNYWludGFpbnMgY2FsbFN0YXRlLCBzdGF0dXNUZXh0LCBkdXJhdGlvbiwgaXNNaWNNdXRlZCwgaXNVc2VyU3BlYWtpbmcsIGF1ZGlvTGV2ZWxzXG4gKiAtIFVzZXMgV2ViU29ja2V0IGZvciByb29tX2NyZWF0ZWQgYW5kIHRyYW5zY3JpcHRzIG9ubHkgKG5vIGF1ZGlvKVxuICogLSBVc2VzIERhaWx5LmpzIGZvciBhbGwgYXVkaW8sIG1pYywgYW5kIHJlYWwtdGltZSBzcGVha2luZyBkZXRlY3Rpb25cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFZvaWNlQWdlbnRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBjYWxsU3RhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDYWxsU3RhdGU+KCdpZGxlJyk7XG4gIHByaXZhdGUgc3RhdHVzVGV4dFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBwcml2YXRlIGR1cmF0aW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignMDA6MDAnKTtcbiAgcHJpdmF0ZSBpc01pY011dGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGlzVXNlclNwZWFraW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGF1ZGlvTGV2ZWxzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyW10+KFtdKTtcbiAgcHJpdmF0ZSB1c2VyVHJhbnNjcmlwdFN1YmplY3QgPSBuZXcgU3ViamVjdDxUcmFuc2NyaXB0RGF0YT4oKTtcbiAgcHJpdmF0ZSBib3RUcmFuc2NyaXB0U3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIGNhbGxTdGFydFRpbWUgPSAwO1xuICBwcml2YXRlIGR1cmF0aW9uSW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgLyoqIFBlci1jYWxsIG9ubHk7IGNsZWFyZWQgb24gZGlzY29ubmVjdCAvIHJlc2V0IC8gbmV3IHJvb20gc28gaGFuZGxlcnMgZG8gbm90IHN0YWNrLiAqL1xuICBwcml2YXRlIGNhbGxTdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjYWxsU3RhdGUkOiBPYnNlcnZhYmxlPENhbGxTdGF0ZT4gPSB0aGlzLmNhbGxTdGF0ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHN0YXR1c1RleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLnN0YXR1c1RleHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBkdXJhdGlvbiQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuZHVyYXRpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBpc01pY011dGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaXNNaWNNdXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGlzVXNlclNwZWFraW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9XG4gICAgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGF1ZGlvTGV2ZWxzJDogT2JzZXJ2YWJsZTxudW1iZXJbXT4gPSB0aGlzLmF1ZGlvTGV2ZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgdXNlclRyYW5zY3JpcHQkOiBPYnNlcnZhYmxlPFRyYW5zY3JpcHREYXRhPiA9XG4gICAgdGhpcy51c2VyVHJhbnNjcmlwdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGJvdFRyYW5zY3JpcHQkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLmJvdFRyYW5zY3JpcHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXVkaW9BbmFseXplcjogQXVkaW9BbmFseXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB3c0NsaWVudDogV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGFpbHlDbGllbnQ6IERhaWx5Vm9pY2VDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGxhdGZvcm1Ub2tlblJlZnJlc2g6IFBsYXRmb3JtVG9rZW5SZWZyZXNoU2VydmljZSxcbiAgICAvKiogYE9iamVjdGAgbm90IGBvYmplY3RgIOKAlCBuZ2MgbWV0YWRhdGEgY29sbGVjdGlvbiByZWplY3RzIHRoZSBgb2JqZWN0YCB0eXBlIGluIERJIHBhcmFtcy4gKi9cbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgKSB7XG4gICAgLy8gV2F2ZWZvcm0gdmlzdWFsaXphdGlvbiBvbmx5IC0gZG8gTk9UIHVzZSBmb3Igc3BlYWtpbmcgc3RhdGVcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5hdWRpb0FuYWx5emVyLmF1ZGlvTGV2ZWxzJC5zdWJzY3JpYmUoKGxldmVscykgPT5cbiAgICAgICAgdGhpcy5hdWRpb0xldmVsc1N1YmplY3QubmV4dChsZXZlbHMpLFxuICAgICAgKSxcbiAgICApO1xuICAgIC8vIFRyYW5zY3JpcHRzOiBzaW5nbGUgc3Vic2NyaXB0aW9uIGZvciBzZXJ2aWNlIGxpZmV0aW1lIChhdm9pZCBzdGFja2luZyBvbiBlYWNoIGNvbm5lY3QoKSkuXG4gICAgLy8gV2ViU29ja2V0IGlzIGRpc2Nvbm5lY3RlZCBiZXR3ZWVuIGNhbGxzOyBubyByZXBsYXkg4oCUIG5ldyBzdWJzY3JpYmVycyAoc2V0dXBWb2ljZVRyYW5zY3JpcHRzKVxuICAgIC8vIG9ubHkgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHRoZSBuZXcgV1MgYWZ0ZXIgY29ubmVjdC5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy53c0NsaWVudC51c2VyVHJhbnNjcmlwdCRcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCh0KSA9PiB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5uZXh0KHQpKSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLndzQ2xpZW50LmJvdFRyYW5zY3JpcHQkXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgodCkgPT4gdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5uZXh0KHQpKSxcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICAvKiogUmVzZXQgdG8gaWRsZSBzdGF0ZSAoZS5nLiB3aGVuIG1vZGFsIG9wZW5zIHNvIHVzZXIgY2FuIGNsaWNrIFN0YXJ0IENhbGwpLiAqL1xuICByZXNldFRvSWRsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWxsU3RhdGVTdWJqZWN0LnZhbHVlID09PSAnaWRsZScpIHJldHVybjtcbiAgICB0aGlzLmNhbGxTdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jYWxsU3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICB0aGlzLnN0b3BEdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5hdWRpb0FuYWx5emVyLnN0b3AoKTtcbiAgICB0aGlzLndzQ2xpZW50LmRpc2Nvbm5lY3QoKTtcbiAgICAvLyBGaXJlLWFuZC1mb3JnZXQ6IERhaWx5IGRpc2Nvbm5lY3QgaXMgYXN5bmM7IGNvbm5lY3QoKSB3aWxsIGF3YWl0IGlmIG5lZWRlZFxuICAgIHZvaWQgdGhpcy5kYWlseUNsaWVudC5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2lkbGUnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJycpO1xuICAgIHRoaXMuZHVyYXRpb25TdWJqZWN0Lm5leHQoJzA6MDAnKTtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3QoXG4gICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBib3RJZDogc3RyaW5nLFxuICAgIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsXG4gICAgYXBpS2V5OiBzdHJpbmcsXG4gICAgZXZlbnRUb2tlbjogc3RyaW5nLFxuICAgIGV2ZW50SWQ6IHN0cmluZyxcbiAgICBldmVudFVybDogc3RyaW5nLFxuICAgIGRvbWFpbkF1dGhvcml0eTogc3RyaW5nLFxuICAgIHVzZXJzQXBpVXJsPzogc3RyaW5nLFxuICAgIGV4aXN0aW5nTWljU3RyZWFtPzogTWVkaWFTdHJlYW0gfCBudWxsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jYWxsU3RhdGVTdWJqZWN0LnZhbHVlICE9PSAnaWRsZScpIHtcbiAgICAgIGNvbnNvbGUud2FybignQ2FsbCBhbHJlYWR5IGluIHByb2dyZXNzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdjb25uZWN0aW5nJyk7XG4gICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0Nvbm5lY3RpbmcuLi4nKTtcblxuICAgICAgY29uc3QgdG9rZW5Qcm9taXNlID1cbiAgICAgICAgdXNlcnNBcGlVcmwgJiYgaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKVxuICAgICAgICAgID8gdGhpcy5wbGF0Zm9ybVRva2VuUmVmcmVzaFxuICAgICAgICAgICAgICAuZW5zdXJlVmFsaWRBY2Nlc3NUb2tlbih0b2tlbiwgdXNlcnNBcGlVcmwpXG4gICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgICAudGhlbigoZW5zdXJlZCkgPT4gZW5zdXJlZD8uYWNjZXNzVG9rZW4gPz8gdG9rZW4pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICdbSGl2ZUdwdCBWb2ljZV0gVG9rZW4gcmVmcmVzaCBiZWZvcmUgY29ubmVjdCBmYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh0b2tlbik7XG5cbiAgICAgIGNvbnN0IHByZXBQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBhcGlVcmwucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwb3N0VXJsOiBgJHtiYXNlVXJsfS9haS9hc2stdm9pY2VgLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGJvdF9pZDogYm90SWQsXG4gICAgICAgICAgICBjb252ZXJzYXRpb25faWQ6IGNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgdm9pY2U6ICdhbGxveScsXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWljUHJvbWlzZSA9XG4gICAgICAgIGV4aXN0aW5nTWljU3RyZWFtPy5nZXRBdWRpb1RyYWNrcygpLnNvbWUoKHQpID0+IHQucmVhZHlTdGF0ZSA9PT0gJ2xpdmUnKVxuICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKGV4aXN0aW5nTWljU3RyZWFtKVxuICAgICAgICAgIDogaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSAmJlxuICAgICAgICAgICAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzPy5nZXRVc2VyTWVkaWFcbiAgICAgICAgICAgID8gbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAgICAgICAgIC5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXG4gICAgICBjb25zdCBbYWNjZXNzVG9rZW4sIHsgcG9zdFVybCwgYm9keSB9LCBtaWNTdHJlYW1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0b2tlblByb21pc2UsXG4gICAgICAgIHByZXBQcm9taXNlLFxuICAgICAgICBtaWNQcm9taXNlLFxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxuICAgICAgICAneC1hcGkta2V5JzogYXBpS2V5LFxuICAgICAgICAnaGl2ZS1ib3QtaWQnOiBib3RJZCxcbiAgICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiBkb21haW5BdXRob3JpdHksXG4gICAgICAgIGV2ZW50VXJsLFxuICAgICAgICBldmVudElkLFxuICAgICAgICBldmVudFRva2VuLFxuICAgICAgICAnbmdyb2stc2tpcC1icm93c2VyLXdhcm5pbmcnOiAndHJ1ZScsXG4gICAgICB9O1xuXG4gICAgICAvLyBQT1NUIHRvIGdldCB3c191cmwgZm9yIHNpZ25hbGluZ1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocG9zdFVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYm9keSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXMuc3RhdHVzfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IHdzVXJsID0ganNvbj8ucm5fd3NfdXJsO1xuICAgICAgaWYgKCF3c1VybCB8fCB0eXBlb2Ygd3NVcmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gd3NfdXJsIGluIHJlc3BvbnNlJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byByb29tX2NyZWF0ZWQgQkVGT1JFIGNvbm5lY3RpbmcgdG8gYXZvaWQgcmFjZVxuICAgICAgdGhpcy53c0NsaWVudC5yb29tQ3JlYXRlZCRcbiAgICAgICAgLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIChyb29tVXJsKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25Sb29tQ3JlYXRlZChyb29tVXJsLCBtaWNTdHJlYW0gPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RhaWx5IGpvaW4gZmFpbGVkOicsIGVycik7XG4gICAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnZW5kZWQnKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGlvbiBmYWlsZWQnKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIENvbm5lY3Qgc2lnbmFsaW5nIFdlYlNvY2tldCAobm8gYXVkaW8gb3ZlciBXUylcbiAgICAgIGF3YWl0IHRoaXMud3NDbGllbnQuY29ubmVjdCh3c1VybCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNvbm5lY3Rpbmcgdm9pY2UgYWdlbnQ6JywgZXJyb3IpO1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZGVkJyk7XG4gICAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGlvbiBmYWlsZWQnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb25Sb29tQ3JlYXRlZChcbiAgICByb29tVXJsOiBzdHJpbmcsXG4gICAgbWljU3RyZWFtPzogTWVkaWFTdHJlYW0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGFpbHlDbGllbnQuY29ubmVjdChyb29tVXJsLCB1bmRlZmluZWQsIG1pY1N0cmVhbSk7XG5cbiAgICB0aGlzLmNhbGxTdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jYWxsU3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIC8vIFdhdmVmb3JtOiB1c2UgbG9jYWwgbWljIHN0cmVhbSBmcm9tIERhaWx5IGNsaWVudFxuICAgIHRoaXMuY2FsbFN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5kYWlseUNsaWVudC5sb2NhbFN0cmVhbSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChzKTogcyBpcyBNZWRpYVN0cmVhbSA9PiBzICE9IG51bGwpLFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoc3RyZWFtKSA9PiB7XG4gICAgICAgICAgdGhpcy5hdWRpb0FuYWx5emVyLnN0YXJ0KHN0cmVhbSk7XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLmNhbGxTdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuZGFpbHlDbGllbnQudXNlclNwZWFraW5nJC5zdWJzY3JpYmUoKHMpID0+XG4gICAgICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQocyksXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5jYWxsU3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5kYWlseUNsaWVudC5zcGVha2luZyQsXG4gICAgICAgIHRoaXMuZGFpbHlDbGllbnQudXNlclNwZWFraW5nJCxcbiAgICAgIF0pLnN1YnNjcmliZSgoW2JvdCwgdXNlcl0pID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09ICdjb25uZWN0aW5nJyAmJiAhYm90KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ID09PSAnY29ubmVjdGluZycgJiYgYm90KSB7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0RHVyYXRpb25UaW1lcigpO1xuICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCd0YWxraW5nJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2xpc3RlbmluZycpO1xuICAgICAgICB9IGVsc2UgaWYgKGJvdCkge1xuICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCd0YWxraW5nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQmV0d2VlbiBib3QgdHVybnM6IHN0YXkgb24gbGlzdGVuaW5nIHRvIGF2b2lkIGZsaWNrZXIgdmlhICdjb25uZWN0ZWQnXG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2xpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5jYWxsU3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLmRhaWx5Q2xpZW50Lm1pY011dGVkJC5zdWJzY3JpYmUoKG11dGVkKSA9PlxuICAgICAgICB0aGlzLmlzTWljTXV0ZWRTdWJqZWN0Lm5leHQobXV0ZWQpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdDb25uZWN0aW5nLi4uJyk7XG4gIH1cblxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2FsbFN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNhbGxTdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMuc3RvcER1cmF0aW9uVGltZXIoKTtcbiAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RvcCgpO1xuXG4gICAgLy8gRGFpbHkgZmlyc3QsIHRoZW4gV2ViU29ja2V0XG4gICAgYXdhaXQgdGhpcy5kYWlseUNsaWVudC5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy53c0NsaWVudC5kaXNjb25uZWN0KCk7XG5cbiAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnZW5kZWQnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0NhbGwgRW5kZWQnKTtcbiAgfVxuXG4gIHRvZ2dsZU1pYygpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5pc01pY011dGVkU3ViamVjdC52YWx1ZTtcbiAgICB0aGlzLmRhaWx5Q2xpZW50LnNldE11dGVkKCFjdXJyZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnREdXJhdGlvblRpbWVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHVwZGF0ZUR1cmF0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2FsbFN0YXJ0VGltZSA+IDApIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IE1hdGguZmxvb3IoKERhdGUubm93KCkgLSB0aGlzLmNhbGxTdGFydFRpbWUpIC8gMTAwMCk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCk7XG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSBlbGFwc2VkICUgNjA7XG4gICAgICAgIHRoaXMuZHVyYXRpb25TdWJqZWN0Lm5leHQoXG4gICAgICAgICAgYCR7bWludXRlc306JHtTdHJpbmcoc2Vjb25kcykucGFkU3RhcnQoMiwgJzAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gICAgdXBkYXRlRHVyYXRpb24oKTtcbiAgICB0aGlzLmR1cmF0aW9uSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh1cGRhdGVEdXJhdGlvbiwgMTAwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BEdXJhdGlvblRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmR1cmF0aW9uSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5kdXJhdGlvbkludGVydmFsKTtcbiAgICAgIHRoaXMuZHVyYXRpb25JbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -11,6 +11,7 @@ import * as i0 from "@angular/core";
|
|
|
11
11
|
* - Emit roomCreated$, userTranscript$, botTranscript$
|
|
12
12
|
* - NO audio logic, NO mic logic. Audio is handled by Daily.js (WebRTC).
|
|
13
13
|
*/
|
|
14
|
+
const WS_CONNECT_TIMEOUT_MS = 10000;
|
|
14
15
|
export class WebSocketVoiceClientService {
|
|
15
16
|
constructor() {
|
|
16
17
|
this.ws = null;
|
|
@@ -24,54 +25,98 @@ export class WebSocketVoiceClientService {
|
|
|
24
25
|
/** Emits bot transcript updates. */
|
|
25
26
|
this.botTranscript$ = this.botTranscriptSubject.asObservable();
|
|
26
27
|
}
|
|
27
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Connect to signaling WebSocket. No audio over this connection.
|
|
30
|
+
* Resolves when the socket is open; rejects if the connection fails.
|
|
31
|
+
*/
|
|
28
32
|
connect(wsUrl) {
|
|
29
33
|
var _a;
|
|
30
34
|
if (((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) {
|
|
31
|
-
return;
|
|
35
|
+
return Promise.resolve();
|
|
32
36
|
}
|
|
33
37
|
if (this.ws) {
|
|
34
38
|
this.ws.close();
|
|
35
39
|
this.ws = null;
|
|
36
40
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
let settled = false;
|
|
43
|
+
const timeout = setTimeout(() => {
|
|
40
44
|
var _a;
|
|
45
|
+
if (settled)
|
|
46
|
+
return;
|
|
47
|
+
settled = true;
|
|
41
48
|
try {
|
|
42
|
-
|
|
43
|
-
if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'room_created') {
|
|
44
|
-
const roomUrl = ((_a = msg.room_url) !== null && _a !== void 0 ? _a : msg.roomUrl);
|
|
45
|
-
if (typeof roomUrl === 'string') {
|
|
46
|
-
this.roomCreatedSubject.next(roomUrl);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
else if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'user_transcript' && typeof msg.text === 'string') {
|
|
50
|
-
this.userTranscriptSubject.next({
|
|
51
|
-
text: msg.text,
|
|
52
|
-
final: msg.final === true,
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
else if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'bot_transcript' && typeof msg.text === 'string') {
|
|
56
|
-
this.botTranscriptSubject.next(msg.text);
|
|
57
|
-
}
|
|
49
|
+
(_a = this.ws) === null || _a === void 0 ? void 0 : _a.close();
|
|
58
50
|
}
|
|
59
51
|
catch (_b) {
|
|
60
|
-
|
|
52
|
+
/* ignore */
|
|
61
53
|
}
|
|
62
|
-
};
|
|
63
|
-
this.ws.onerror = () => {
|
|
64
|
-
this.disconnect();
|
|
65
|
-
};
|
|
66
|
-
this.ws.onclose = () => {
|
|
67
54
|
this.ws = null;
|
|
55
|
+
reject(new Error('WebSocket connection timed out'));
|
|
56
|
+
}, WS_CONNECT_TIMEOUT_MS);
|
|
57
|
+
const clear = () => {
|
|
58
|
+
clearTimeout(timeout);
|
|
68
59
|
};
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
60
|
+
try {
|
|
61
|
+
const ws = new WebSocket(wsUrl);
|
|
62
|
+
this.ws = ws;
|
|
63
|
+
ws.onopen = () => {
|
|
64
|
+
if (settled)
|
|
65
|
+
return;
|
|
66
|
+
settled = true;
|
|
67
|
+
clear();
|
|
68
|
+
resolve();
|
|
69
|
+
};
|
|
70
|
+
ws.onmessage = (event) => {
|
|
71
|
+
var _a;
|
|
72
|
+
try {
|
|
73
|
+
const msg = JSON.parse(event.data);
|
|
74
|
+
if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'room_created') {
|
|
75
|
+
const roomUrl = ((_a = msg.room_url) !== null && _a !== void 0 ? _a : msg.roomUrl);
|
|
76
|
+
if (typeof roomUrl === 'string') {
|
|
77
|
+
this.roomCreatedSubject.next(roomUrl);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'user_transcript' && typeof msg.text === 'string') {
|
|
81
|
+
this.userTranscriptSubject.next({
|
|
82
|
+
text: msg.text,
|
|
83
|
+
final: msg.final === true,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
else if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'bot_transcript' && typeof msg.text === 'string') {
|
|
87
|
+
this.botTranscriptSubject.next(msg.text);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (_b) {
|
|
91
|
+
// Ignore non-JSON or unknown messages
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
ws.onerror = () => {
|
|
95
|
+
if (!settled) {
|
|
96
|
+
settled = true;
|
|
97
|
+
clear();
|
|
98
|
+
this.disconnect();
|
|
99
|
+
reject(new Error('WebSocket connection failed'));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.disconnect();
|
|
103
|
+
};
|
|
104
|
+
ws.onclose = () => {
|
|
105
|
+
this.ws = null;
|
|
106
|
+
if (!settled) {
|
|
107
|
+
settled = true;
|
|
108
|
+
clear();
|
|
109
|
+
reject(new Error('WebSocket connection failed'));
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
clear();
|
|
115
|
+
console.error('WebSocketVoiceClient: connect failed', err);
|
|
116
|
+
this.ws = null;
|
|
117
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
118
|
+
}
|
|
119
|
+
});
|
|
75
120
|
}
|
|
76
121
|
/** Disconnect and cleanup. */
|
|
77
122
|
disconnect() {
|
|
@@ -92,4 +137,4 @@ WebSocketVoiceClientService.decorators = [
|
|
|
92
137
|
providedIn: 'root',
|
|
93
138
|
},] }
|
|
94
139
|
];
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXZvaWNlLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3NlcnZpY2VzL3dlYnNvY2tldC12b2ljZS1jbGllbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBNkIzQzs7Ozs7Ozs7O0dBU0c7QUFJSCxNQUFNLE9BQU8sMkJBQTJCO0lBSHhDO1FBSVUsT0FBRSxHQUFxQixJQUFJLENBQUM7UUFDNUIsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUMzQywwQkFBcUIsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQztRQUN0RCx5QkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRXJELHNEQUFzRDtRQUN0RCxpQkFBWSxHQUF1QixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFMUUscUNBQXFDO1FBQ3JDLG9CQUFlLEdBQ2IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTVDLG9DQUFvQztRQUNwQyxtQkFBYyxHQUNaLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQTJENUM7SUF6REMscUVBQXFFO0lBQ3JFLE9BQU8sQ0FBQyxLQUFhOztRQUNuQixJQUFJLENBQUEsTUFBQSxJQUFJLENBQUMsRUFBRSwwQ0FBRSxVQUFVLE1BQUssU0FBUyxDQUFDLElBQUksRUFBRTtZQUMxQyxPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDWCxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1NBQ2hCO1FBRUQsSUFBSTtZQUNGLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFtQixFQUFFLEVBQUU7O2dCQUMxQyxJQUFJO29CQUNGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBNEIsQ0FBQztvQkFDOUQsSUFBSSxDQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxJQUFJLE1BQUssY0FBYyxFQUFFO3dCQUNoQyxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQUEsR0FBRyxDQUFDLFFBQVEsbUNBQUksR0FBRyxDQUFDLE9BQU8sQ0FBdUIsQ0FBQzt3QkFDcEUsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3ZDO3FCQUNGO3lCQUFNLElBQUksQ0FBQSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsSUFBSSxNQUFLLGlCQUFpQixJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7d0JBQzFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7NEJBQzlCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTs0QkFDZCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJO3lCQUMxQixDQUFDLENBQUM7cUJBQ0o7eUJBQU0sSUFBSSxDQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxJQUFJLE1BQUssZ0JBQWdCLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTt3QkFDekUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzFDO2lCQUNGO2dCQUFDLFdBQU07b0JBQ04sc0NBQXNDO2lCQUN2QztZQUNILENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtnQkFDckIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtnQkFDckIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDakIsQ0FBQyxDQUFDO1NBQ0g7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDZixNQUFNLEdBQUcsQ0FBQztTQUNYO0lBQ0gsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztTQUNoQjtJQUNILENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsSUFBSSxXQUFXOztRQUNiLE9BQU8sQ0FBQSxNQUFBLElBQUksQ0FBQyxFQUFFLDBDQUFFLFVBQVUsTUFBSyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2hELENBQUM7Ozs7WUE1RUYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG4vKiogV2ViU29ja2V0IG1lc3NhZ2UgdHlwZXMgZnJvbSBiYWNrZW5kIHNpZ25hbGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NNZXNzYWdlUm9vbUNyZWF0ZWQge1xuICB0eXBlOiAncm9vbV9jcmVhdGVkJztcbiAgcm9vbV91cmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXc01lc3NhZ2VVc2VyVHJhbnNjcmlwdCB7XG4gIHR5cGU6ICd1c2VyX3RyYW5zY3JpcHQnO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGZpbmFsPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXc01lc3NhZ2VCb3RUcmFuc2NyaXB0IHtcbiAgdHlwZTogJ2JvdF90cmFuc2NyaXB0JztcbiAgdGV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBXc01lc3NhZ2UgPVxuICB8IFdzTWVzc2FnZVJvb21DcmVhdGVkXG4gIHwgV3NNZXNzYWdlVXNlclRyYW5zY3JpcHRcbiAgfCBXc01lc3NhZ2VCb3RUcmFuc2NyaXB0O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHREYXRhIHtcbiAgdGV4dDogc3RyaW5nO1xuICBmaW5hbDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXZWJTb2NrZXQtb25seSBjbGllbnQgZm9yIHZvaWNlIGFnZW50IHNpZ25hbGluZy5cbiAqIENSSVRJQ0FMOiBVc2VzIG5hdGl2ZSBXZWJTb2NrZXQgb25seS4gTk8gU29ja2V0LklPLCBOTyBuZ3gtc29ja2V0LWlvLlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIENvbm5lY3QgdG8gd3NfdXJsIChmcm9tIFBPU1QgL2FpL2Fzay12b2ljZSByZXNwb25zZSlcbiAqIC0gUGFyc2UgSlNPTiBtZXNzYWdlcyAocm9vbV9jcmVhdGVkLCB1c2VyX3RyYW5zY3JpcHQsIGJvdF90cmFuc2NyaXB0KVxuICogLSBFbWl0IHJvb21DcmVhdGVkJCwgdXNlclRyYW5zY3JpcHQkLCBib3RUcmFuc2NyaXB0JFxuICogLSBOTyBhdWRpbyBsb2dpYywgTk8gbWljIGxvZ2ljLiBBdWRpbyBpcyBoYW5kbGVkIGJ5IERhaWx5LmpzIChXZWJSVEMpLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB3czogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcm9vbUNyZWF0ZWRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIHVzZXJUcmFuc2NyaXB0U3ViamVjdCA9IG5ldyBTdWJqZWN0PFRyYW5zY3JpcHREYXRhPigpO1xuICBwcml2YXRlIGJvdFRyYW5zY3JpcHRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0cyByb29tX3VybCB3aGVuIGJhY2tlbmQgc2VuZHMgcm9vbV9jcmVhdGVkLiAqL1xuICByb29tQ3JlYXRlZCQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMucm9vbUNyZWF0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBFbWl0cyB1c2VyIHRyYW5zY3JpcHQgdXBkYXRlcy4gKi9cbiAgdXNlclRyYW5zY3JpcHQkOiBPYnNlcnZhYmxlPFRyYW5zY3JpcHREYXRhPiA9XG4gICAgdGhpcy51c2VyVHJhbnNjcmlwdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIEVtaXRzIGJvdCB0cmFuc2NyaXB0IHVwZGF0ZXMuICovXG4gIGJvdFRyYW5zY3JpcHQkOiBPYnNlcnZhYmxlPHN0cmluZz4gPVxuICAgIHRoaXMuYm90VHJhbnNjcmlwdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIENvbm5lY3QgdG8gc2lnbmFsaW5nIFdlYlNvY2tldC4gTm8gYXVkaW8gb3ZlciB0aGlzIGNvbm5lY3Rpb24uICovXG4gIGNvbm5lY3Qod3NVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLndzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy53cykge1xuICAgICAgdGhpcy53cy5jbG9zZSgpO1xuICAgICAgdGhpcy53cyA9IG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMud3MgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICAgIHRoaXMud3Mub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChtc2c/LnR5cGUgPT09ICdyb29tX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICBjb25zdCByb29tVXJsID0gKG1zZy5yb29tX3VybCA/PyBtc2cucm9vbVVybCkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb29tVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICB0aGlzLnJvb21DcmVhdGVkU3ViamVjdC5uZXh0KHJvb21VcmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobXNnPy50eXBlID09PSAndXNlcl90cmFuc2NyaXB0JyAmJiB0eXBlb2YgbXNnLnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgICAgdGV4dDogbXNnLnRleHQsXG4gICAgICAgICAgICAgIGZpbmFsOiBtc2cuZmluYWwgPT09IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZz8udHlwZSA9PT0gJ2JvdF90cmFuc2NyaXB0JyAmJiB0eXBlb2YgbXNnLnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJvdFRyYW5zY3JpcHRTdWJqZWN0Lm5leHQobXNnLnRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIG5vbi1KU09OIG9yIHVua25vd24gbWVzc2FnZXNcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMud3Mub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy53cy5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLndzID0gbnVsbDtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdXZWJTb2NrZXRWb2ljZUNsaWVudDogY29ubmVjdCBmYWlsZWQnLCBlcnIpO1xuICAgICAgdGhpcy53cyA9IG51bGw7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqIERpc2Nvbm5lY3QgYW5kIGNsZWFudXAuICovXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBXZWJTb2NrZXQgaXMgb3Blbi4gKi9cbiAgZ2V0IGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLndzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTjtcbiAgfVxufVxuIl19
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXZvaWNlLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3NlcnZpY2VzL3dlYnNvY2tldC12b2ljZS1jbGllbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBNkIzQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLEtBQU0sQ0FBQztBQUtyQyxNQUFNLE9BQU8sMkJBQTJCO0lBSHhDO1FBSVUsT0FBRSxHQUFxQixJQUFJLENBQUM7UUFDNUIsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUMzQywwQkFBcUIsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQztRQUN0RCx5QkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRXJELHNEQUFzRDtRQUN0RCxpQkFBWSxHQUF1QixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFMUUscUNBQXFDO1FBQ3JDLG9CQUFlLEdBQ2IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTVDLG9DQUFvQztRQUNwQyxtQkFBYyxHQUNaLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQXlHNUM7SUF2R0M7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLEtBQWE7O1FBQ25CLElBQUksQ0FBQSxNQUFBLElBQUksQ0FBQyxFQUFFLDBDQUFFLFVBQVUsTUFBSyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQzFDLE9BQU8s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VSxNQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDaEQsQ0FBQzs7OztZQTFIRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbi8qKiBXZWJTb2NrZXQgbWVzc2FnZSB0eXBlcyBmcm9tIGJhY2tlbmQgc2lnbmFsaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc01lc3NhZ2VSb29tQ3JlYXRlZCB7XG4gIHR5cGU6ICdyb29tX2NyZWF0ZWQnO1xuICByb29tX3VybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdzTWVzc2FnZVVzZXJUcmFuc2NyaXB0IHtcbiAgdHlwZTogJ3VzZXJfdHJhbnNjcmlwdCc7XG4gIHRleHQ6IHN0cmluZztcbiAgZmluYWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdzTWVzc2FnZUJvdFRyYW5zY3JpcHQge1xuICB0eXBlOiAnYm90X3RyYW5zY3JpcHQnO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFdzTWVzc2FnZSA9XG4gIHwgV3NNZXNzYWdlUm9vbUNyZWF0ZWRcbiAgfCBXc01lc3NhZ2VVc2VyVHJhbnNjcmlwdFxuICB8IFdzTWVzc2FnZUJvdFRyYW5zY3JpcHQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdERhdGEge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGZpbmFsOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdlYlNvY2tldC1vbmx5IGNsaWVudCBmb3Igdm9pY2UgYWdlbnQgc2lnbmFsaW5nLlxuICogQ1JJVElDQUw6IFVzZXMgbmF0aXZlIFdlYlNvY2tldCBvbmx5LiBOTyBTb2NrZXQuSU8sIE5PIG5neC1zb2NrZXQtaW8uXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ29ubmVjdCB0byB3c191cmwgKGZyb20gUE9TVCAvYWkvYXNrLXZvaWNlIHJlc3BvbnNlKVxuICogLSBQYXJzZSBKU09OIG1lc3NhZ2VzIChyb29tX2NyZWF0ZWQsIHVzZXJfdHJhbnNjcmlwdCwgYm90X3RyYW5zY3JpcHQpXG4gKiAtIEVtaXQgcm9vbUNyZWF0ZWQkLCB1c2VyVHJhbnNjcmlwdCQsIGJvdFRyYW5zY3JpcHQkXG4gKiAtIE5PIGF1ZGlvIGxvZ2ljLCBOTyBtaWMgbG9naWMuIEF1ZGlvIGlzIGhhbmRsZWQgYnkgRGFpbHkuanMgKFdlYlJUQykuXG4gKi9cbmNvbnN0IFdTX0NPTk5FQ1RfVElNRU9VVF9NUyA9IDEwXzAwMDtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFZvaWNlQ2xpZW50U2VydmljZSB7XG4gIHByaXZhdGUgd3M6IFdlYlNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJvb21DcmVhdGVkU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSB1c2VyVHJhbnNjcmlwdFN1YmplY3QgPSBuZXcgU3ViamVjdDxUcmFuc2NyaXB0RGF0YT4oKTtcbiAgcHJpdmF0ZSBib3RUcmFuc2NyaXB0U3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAvKiogRW1pdHMgcm9vbV91cmwgd2hlbiBiYWNrZW5kIHNlbmRzIHJvb21fY3JlYXRlZC4gKi9cbiAgcm9vbUNyZWF0ZWQkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLnJvb21DcmVhdGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogRW1pdHMgdXNlciB0cmFuc2NyaXB0IHVwZGF0ZXMuICovXG4gIHVzZXJUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxUcmFuc2NyaXB0RGF0YT4gPVxuICAgIHRoaXMudXNlclRyYW5zY3JpcHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBFbWl0cyBib3QgdHJhbnNjcmlwdCB1cGRhdGVzLiAqL1xuICBib3RUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxzdHJpbmc+ID1cbiAgICB0aGlzLmJvdFRyYW5zY3JpcHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIHNpZ25hbGluZyBXZWJTb2NrZXQuIE5vIGF1ZGlvIG92ZXIgdGhpcyBjb25uZWN0aW9uLlxuICAgKiBSZXNvbHZlcyB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbjsgcmVqZWN0cyBpZiB0aGUgY29ubmVjdGlvbiBmYWlscy5cbiAgICovXG4gIGNvbm5lY3Qod3NVcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLndzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy53cykge1xuICAgICAgdGhpcy53cy5jbG9zZSgpO1xuICAgICAgdGhpcy53cyA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMud3M/LmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8qIGlnbm9yZSAqL1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdXZWJTb2NrZXQgY29ubmVjdGlvbiB0aW1lZCBvdXQnKSk7XG4gICAgICB9LCBXU19DT05ORUNUX1RJTUVPVVRfTVMpO1xuXG4gICAgICBjb25zdCBjbGVhciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICAgICAgdGhpcy53cyA9IHdzO1xuXG4gICAgICAgIHdzLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIGNsZWFyKCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdzLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBpZiAobXNnPy50eXBlID09PSAncm9vbV9jcmVhdGVkJykge1xuICAgICAgICAgICAgICBjb25zdCByb29tVXJsID0gKG1zZy5yb29tX3VybCA/PyBtc2cucm9vbVVybCkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvb21VcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb29tQ3JlYXRlZFN1YmplY3QubmV4dChyb29tVXJsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChtc2c/LnR5cGUgPT09ICd1c2VyX3RyYW5zY3JpcHQnICYmIHR5cGVvZiBtc2cudGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgdGhpcy51c2VyVHJhbnNjcmlwdFN1YmplY3QubmV4dCh7XG4gICAgICAgICAgICAgICAgdGV4dDogbXNnLnRleHQsXG4gICAgICAgICAgICAgICAgZmluYWw6IG1zZy5maW5hbCA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1zZz8udHlwZSA9PT0gJ2JvdF90cmFuc2NyaXB0JyAmJiB0eXBlb2YgbXNnLnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHRoaXMuYm90VHJhbnNjcmlwdFN1YmplY3QubmV4dChtc2cudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgbm9uLUpTT04gb3IgdW5rbm93biBtZXNzYWdlc1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB3cy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIGlmICghc2V0dGxlZCkge1xuICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICBjbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdzLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy53cyA9IG51bGw7XG4gICAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNsZWFyKCk7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdXZWJTb2NrZXQgY29ubmVjdGlvbiBmYWlsZWQnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNsZWFyKCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dlYlNvY2tldFZvaWNlQ2xpZW50OiBjb25uZWN0IGZhaWxlZCcsIGVycik7XG4gICAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgICAgICByZWplY3QoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEaXNjb25uZWN0IGFuZCBjbGVhbnVwLiAqL1xuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndzKSB7XG4gICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgICB0aGlzLndzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgV2ViU29ja2V0IGlzIG9wZW4uICovXG4gIGdldCBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU47XG4gIH1cbn1cbiJdfQ==
|