genassist-chat-react 1.0.26 → 1.0.28
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 +2 -0
- package/dist/components/GenAgentChat.js +40 -31
- package/dist/components/GenAgentConfigPanel.d.ts +1 -0
- package/dist/components/GenAgentConfigPanel.js +2 -1
- package/dist/components/InteractiveContent.js +3 -2
- package/dist/components/MarkdownMessage.d.ts +11 -0
- package/dist/components/MarkdownMessage.js +56 -0
- package/dist/components/WelcomeCard.js +3 -3
- package/dist/hooks/useChat.d.ts +6 -2
- package/dist/hooks/useChat.js +314 -67
- package/dist/services/chatService.d.ts +24 -2
- package/dist/services/chatService.js +146 -48
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.js +1 -1
- package/package.json +5 -2
package/dist/hooks/useChat.js
CHANGED
|
@@ -54,46 +54,55 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
54
54
|
}
|
|
55
55
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
56
56
|
};
|
|
57
|
-
import { useState, useEffect, useCallback, useRef, useMemo } from
|
|
58
|
-
import { ChatService } from
|
|
59
|
-
var DEFAULT_SERVER_UNAVAILABLE_MESSAGE =
|
|
60
|
-
var DEFAULT_SERVER_UNAVAILABLE_CONTACT_LABEL =
|
|
57
|
+
import { useState, useEffect, useCallback, useRef, useMemo } from "react";
|
|
58
|
+
import { ChatService } from "../services/chatService";
|
|
59
|
+
var DEFAULT_SERVER_UNAVAILABLE_MESSAGE = "The service is temporarily unavailable. Please try again later.";
|
|
60
|
+
var DEFAULT_SERVER_UNAVAILABLE_CONTACT_LABEL = "Contact support";
|
|
61
61
|
function isNetworkOrServerError(error) {
|
|
62
62
|
var _a;
|
|
63
63
|
// No response = network error
|
|
64
64
|
if (!error.response) {
|
|
65
65
|
var code = error === null || error === void 0 ? void 0 : error.code;
|
|
66
|
-
if (code ===
|
|
66
|
+
if (code === "ERR_NETWORK" ||
|
|
67
|
+
code === "ECONNREFUSED" ||
|
|
68
|
+
code === "ETIMEDOUT" ||
|
|
69
|
+
code === "ERR_CONNECTION_REFUSED")
|
|
67
70
|
return true;
|
|
68
71
|
return true; // any request error without response is treated as server/network issue
|
|
69
72
|
}
|
|
70
73
|
var status = (_a = error.response) === null || _a === void 0 ? void 0 : _a.status;
|
|
71
|
-
return typeof status ===
|
|
74
|
+
return typeof status === "number" && status >= 500;
|
|
72
75
|
}
|
|
73
76
|
export var useChat = function (_a) {
|
|
74
|
-
var baseUrl = _a.baseUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, _b = _a.useWs, useWs = _b === void 0 ? true : _b, language = _a.language, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize, serverUnavailableMessage = _a.serverUnavailableMessage, serverUnavailableContactUrl = _a.serverUnavailableContactUrl, serverUnavailableContactLabel = _a.serverUnavailableContactLabel;
|
|
75
|
-
var
|
|
76
|
-
var
|
|
77
|
-
var
|
|
78
|
-
var
|
|
79
|
-
var
|
|
77
|
+
var baseUrl = _a.baseUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, _b = _a.useWs, useWs = _b === void 0 ? true : _b, _c = _a.usePoll, usePoll = _c === void 0 ? false : _c, language = _a.language, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize, serverUnavailableMessage = _a.serverUnavailableMessage, serverUnavailableContactUrl = _a.serverUnavailableContactUrl, serverUnavailableContactLabel = _a.serverUnavailableContactLabel, onConfigLoaded = _a.onConfigLoaded;
|
|
78
|
+
var _d = useState([]), messages = _d[0], setMessages = _d[1];
|
|
79
|
+
var _e = useState(false), isLoading = _e[0], setIsLoading = _e[1];
|
|
80
|
+
var _f = useState([]), preloadedAttachments = _f[0], setPreloadedAttachments = _f[1];
|
|
81
|
+
var _g = useState("disconnected"), connectionState = _g[0], setConnectionState = _g[1];
|
|
82
|
+
var _h = useState(false), isAgentTyping = _h[0], setIsAgentTyping = _h[1];
|
|
80
83
|
var chatServiceRef = useRef(null);
|
|
81
|
-
var
|
|
82
|
-
var
|
|
83
|
-
var
|
|
84
|
-
var
|
|
85
|
-
var
|
|
86
|
-
var
|
|
87
|
-
var
|
|
88
|
-
var
|
|
89
|
-
var
|
|
90
|
-
var
|
|
84
|
+
var _j = useState(null), conversationId = _j[0], setConversationId = _j[1];
|
|
85
|
+
var _k = useState([]), possibleQueries = _k[0], setPossibleQueries = _k[1];
|
|
86
|
+
var _l = useState(null), welcomeTitle = _l[0], setWelcomeTitle = _l[1];
|
|
87
|
+
var _m = useState(null), welcomeImageUrl = _m[0], setWelcomeImageUrl = _m[1];
|
|
88
|
+
var _o = useState(null), welcomeMessage = _o[0], setWelcomeMessage = _o[1];
|
|
89
|
+
var _p = useState([]), thinkingPhrases = _p[0], setThinkingPhrases = _p[1];
|
|
90
|
+
var _q = useState(1000), thinkingDelayMs = _q[0], setThinkingDelayMs = _q[1];
|
|
91
|
+
var _r = useState({}), chatInputMetadata = _r[0], setChatInputMetadata = _r[1];
|
|
92
|
+
var _s = useState(false), isTakenOver = _s[0], setIsTakenOver = _s[1];
|
|
93
|
+
var _t = useState(false), isFinalized = _t[0], setIsFinalized = _t[1];
|
|
91
94
|
// Scoped messages key for apiKey, conversatioId
|
|
92
95
|
var buildMessagesKey = useCallback(function (apiKeyVal, convId) {
|
|
93
96
|
if (!convId)
|
|
94
97
|
return null;
|
|
95
98
|
return "genassist_conversation_messages:".concat(apiKeyVal, ":").concat(convId);
|
|
96
99
|
}, []);
|
|
100
|
+
var validateMessages = useCallback(function (messages) {
|
|
101
|
+
var hasTakeOverMsg = messages.some(function (m) { return (m === null || m === void 0 ? void 0 : m.type) === "takeover"; });
|
|
102
|
+
var hasFinalizedMsg = messages.some(function (m) { return (m === null || m === void 0 ? void 0 : m.type) === "finalized"; });
|
|
103
|
+
setIsTakenOver(hasTakeOverMsg);
|
|
104
|
+
setIsFinalized(hasFinalizedMsg);
|
|
105
|
+
}, [setIsTakenOver, setIsFinalized]);
|
|
97
106
|
// Check if an error is a token expiration error (401 + "Token has expired.")
|
|
98
107
|
var isTokenExpiredError = useCallback(function (error) {
|
|
99
108
|
var _a, _b;
|
|
@@ -101,14 +110,15 @@ export var useChat = function (_a) {
|
|
|
101
110
|
((_b = error === null || error === void 0 ? void 0 : error.response) === null || _b === void 0 ? void 0 : _b.data) &&
|
|
102
111
|
(error.response.data.error === "Token has expired." ||
|
|
103
112
|
error.response.data.message === "Token has expired." ||
|
|
104
|
-
(typeof error.response.data === "string" &&
|
|
113
|
+
(typeof error.response.data === "string" &&
|
|
114
|
+
error.response.data.includes("Token has expired"))));
|
|
105
115
|
}, []);
|
|
106
116
|
// Reset conversation state to initial (e.g. after token expiration)
|
|
107
117
|
var resetToInitialState = useCallback(function () {
|
|
108
118
|
setConversationId(null);
|
|
109
119
|
setIsFinalized(false);
|
|
110
120
|
setIsTakenOver(false);
|
|
111
|
-
setConnectionState(
|
|
121
|
+
setConnectionState("disconnected");
|
|
112
122
|
setWelcomeTitle(null);
|
|
113
123
|
setWelcomeImageUrl(null);
|
|
114
124
|
setWelcomeMessage(null);
|
|
@@ -117,6 +127,7 @@ export var useChat = function (_a) {
|
|
|
117
127
|
setThinkingDelayMs(1000);
|
|
118
128
|
setChatInputMetadata({});
|
|
119
129
|
setMessages([]);
|
|
130
|
+
lastServerCreateTimeRef.current = 0;
|
|
120
131
|
var key = buildMessagesKey(apiKey, conversationId);
|
|
121
132
|
if (key) {
|
|
122
133
|
try {
|
|
@@ -135,10 +146,19 @@ export var useChat = function (_a) {
|
|
|
135
146
|
var prevApiKeyRef = useRef(apiKey);
|
|
136
147
|
var prevTenantRef = useRef(tenant);
|
|
137
148
|
var prevUseWsRef = useRef(useWs);
|
|
149
|
+
var prevUsePollRef = useRef(usePoll);
|
|
150
|
+
// Heartbeat polling state (when WebSocket is disabled)
|
|
151
|
+
var heartbeatFailureCountRef = useRef(0);
|
|
152
|
+
var heartbeatIntervalRef = useRef(0);
|
|
153
|
+
var lastServerCreateTimeRef = useRef(0);
|
|
154
|
+
// Refs so we only run takeover/finalized once per conversation (avoid stale isTakenOver/isFinalized in poll closure)
|
|
155
|
+
var takeoverProcessedRef = useRef(false);
|
|
156
|
+
var finalizedProcessedRef = useRef(false);
|
|
138
157
|
// Store callbacks in refs so they don't trigger re-initialization
|
|
139
158
|
var onErrorRef = useRef(onError);
|
|
140
159
|
var onTakeoverRef = useRef(onTakeover);
|
|
141
160
|
var onFinalizeRef = useRef(onFinalize);
|
|
161
|
+
var onConfigLoadedRef = useRef(onConfigLoaded);
|
|
142
162
|
// Update callback refs when they change
|
|
143
163
|
useEffect(function () {
|
|
144
164
|
onErrorRef.current = onError;
|
|
@@ -149,16 +169,24 @@ export var useChat = function (_a) {
|
|
|
149
169
|
useEffect(function () {
|
|
150
170
|
onFinalizeRef.current = onFinalize;
|
|
151
171
|
}, [onFinalize]);
|
|
172
|
+
useEffect(function () {
|
|
173
|
+
onConfigLoadedRef.current = onConfigLoaded;
|
|
174
|
+
}, [onConfigLoaded]);
|
|
152
175
|
// Initialize chat service - only when baseUrl, apiKey, tenant, useWs, or metadata actually change
|
|
153
176
|
useEffect(function () {
|
|
154
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
177
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
155
178
|
var metadataChanged = metadataRef.current !== metadataString;
|
|
156
179
|
var baseUrlChanged = prevBaseUrlRef.current !== baseUrl;
|
|
157
180
|
var apiKeyChanged = prevApiKeyRef.current !== apiKey;
|
|
158
181
|
var tenantChanged = prevTenantRef.current !== tenant;
|
|
159
182
|
var useWsChanged = prevUseWsRef.current !== useWs;
|
|
183
|
+
var usePollChanged = prevUsePollRef.current !== usePoll;
|
|
160
184
|
// Only re-initialize for connection-related changes, NOT for metadata changes
|
|
161
|
-
var needsReinit = !chatServiceRef.current ||
|
|
185
|
+
var needsReinit = !chatServiceRef.current ||
|
|
186
|
+
baseUrlChanged ||
|
|
187
|
+
apiKeyChanged ||
|
|
188
|
+
tenantChanged ||
|
|
189
|
+
useWsChanged;
|
|
162
190
|
if (needsReinit) {
|
|
163
191
|
// Update refs
|
|
164
192
|
if (baseUrlChanged)
|
|
@@ -169,6 +197,8 @@ export var useChat = function (_a) {
|
|
|
169
197
|
prevTenantRef.current = tenant;
|
|
170
198
|
if (useWsChanged)
|
|
171
199
|
prevUseWsRef.current = useWs;
|
|
200
|
+
if (usePollChanged)
|
|
201
|
+
prevUsePollRef.current = usePoll;
|
|
172
202
|
if (metadataChanged)
|
|
173
203
|
metadataRef.current = metadataString;
|
|
174
204
|
// Clean up existing service if it exists
|
|
@@ -177,15 +207,30 @@ export var useChat = function (_a) {
|
|
|
177
207
|
chatServiceRef.current.disconnect();
|
|
178
208
|
chatServiceRef.current.setWelcomeDataHandler(null);
|
|
179
209
|
}
|
|
180
|
-
chatServiceRef.current = new ChatService(baseUrl, apiKey, metadata, tenant, language, useWs);
|
|
210
|
+
chatServiceRef.current = new ChatService(baseUrl, apiKey, metadata, tenant, language, useWs, usePoll);
|
|
181
211
|
// Set up handlers
|
|
182
212
|
chatServiceRef.current.setMessageHandler(function (message) {
|
|
183
|
-
var normalizedMessage = __assign(__assign({}, message), { create_time:
|
|
213
|
+
var normalizedMessage = __assign(__assign({}, message), { create_time: !message.create_time || isNaN(message.create_time)
|
|
184
214
|
? Math.floor(Date.now() / 1000)
|
|
185
215
|
: message.create_time });
|
|
186
|
-
|
|
216
|
+
// Track latest create_time we've seen from server/websocket (in seconds)
|
|
217
|
+
if (normalizedMessage.create_time && normalizedMessage.create_time > 0) {
|
|
218
|
+
lastServerCreateTimeRef.current = Math.round(normalizedMessage.create_time) * 1000 / 1000;
|
|
219
|
+
}
|
|
220
|
+
// Add message to messages array
|
|
221
|
+
setMessages(function (prevMessages) {
|
|
222
|
+
// Avoid adding duplicate messages with same message_id and type
|
|
223
|
+
if (normalizedMessage.message_id) {
|
|
224
|
+
var exists = prevMessages.some(function (m) { return m.message_id === normalizedMessage.message_id; });
|
|
225
|
+
if (exists) {
|
|
226
|
+
return prevMessages;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return __spreadArray(__spreadArray([], prevMessages, true), [normalizedMessage], false);
|
|
230
|
+
});
|
|
187
231
|
// Stop typing animation when agent or system message arrives
|
|
188
|
-
if (normalizedMessage.speaker ===
|
|
232
|
+
if (normalizedMessage.speaker === "agent" ||
|
|
233
|
+
normalizedMessage.speaker === "special") {
|
|
189
234
|
setIsAgentTyping(false);
|
|
190
235
|
}
|
|
191
236
|
});
|
|
@@ -205,7 +250,7 @@ export var useChat = function (_a) {
|
|
|
205
250
|
});
|
|
206
251
|
chatServiceRef.current.setConnectionStateHandler(function (state) {
|
|
207
252
|
setConnectionState(state);
|
|
208
|
-
if (state !==
|
|
253
|
+
if (state !== "connected") {
|
|
209
254
|
setIsAgentTyping(false);
|
|
210
255
|
}
|
|
211
256
|
});
|
|
@@ -229,7 +274,7 @@ export var useChat = function (_a) {
|
|
|
229
274
|
else {
|
|
230
275
|
chatServiceRef.current.connectWebSocket();
|
|
231
276
|
if (!useWs) {
|
|
232
|
-
setConnectionState(
|
|
277
|
+
setConnectionState("connected");
|
|
233
278
|
}
|
|
234
279
|
}
|
|
235
280
|
}
|
|
@@ -250,9 +295,10 @@ export var useChat = function (_a) {
|
|
|
250
295
|
setThinkingDelayMs(thinking.delayMs || 1000);
|
|
251
296
|
}
|
|
252
297
|
var meta = (_h = (_g = chatServiceRef.current).getChatInputMetadata) === null || _h === void 0 ? void 0 : _h.call(_g);
|
|
253
|
-
if (meta && typeof meta ===
|
|
298
|
+
if (meta && typeof meta === "object" && Object.keys(meta).length > 0) {
|
|
254
299
|
setChatInputMetadata(meta);
|
|
255
300
|
}
|
|
301
|
+
(_j = onConfigLoadedRef.current) === null || _j === void 0 ? void 0 : _j.call(onConfigLoadedRef, { chatInputMetadata: meta !== null && meta !== void 0 ? meta : {} });
|
|
256
302
|
}
|
|
257
303
|
}
|
|
258
304
|
else if (chatServiceRef.current) {
|
|
@@ -284,7 +330,18 @@ export var useChat = function (_a) {
|
|
|
284
330
|
return function () {
|
|
285
331
|
// Only cleanup on unmount, not on every dependency change
|
|
286
332
|
};
|
|
287
|
-
}, [
|
|
333
|
+
}, [
|
|
334
|
+
baseUrl,
|
|
335
|
+
apiKey,
|
|
336
|
+
tenant,
|
|
337
|
+
metadataString,
|
|
338
|
+
language,
|
|
339
|
+
useWs,
|
|
340
|
+
usePoll,
|
|
341
|
+
serverUnavailableMessage,
|
|
342
|
+
serverUnavailableContactUrl,
|
|
343
|
+
serverUnavailableContactLabel,
|
|
344
|
+
]);
|
|
288
345
|
// Update language when it changes (without re-initializing the service)
|
|
289
346
|
useEffect(function () {
|
|
290
347
|
if (chatServiceRef.current) {
|
|
@@ -296,16 +353,29 @@ export var useChat = function (_a) {
|
|
|
296
353
|
var key = buildMessagesKey(apiKey, conversationId);
|
|
297
354
|
if (!key) {
|
|
298
355
|
setMessages([]);
|
|
356
|
+
lastServerCreateTimeRef.current = 0;
|
|
299
357
|
return;
|
|
300
358
|
}
|
|
301
359
|
try {
|
|
302
360
|
var stored = localStorage.getItem(key);
|
|
303
|
-
|
|
361
|
+
var parsed = stored ? JSON.parse(stored) : [];
|
|
362
|
+
setMessages(parsed);
|
|
363
|
+
// Initialize last seen create_time from cached messages
|
|
364
|
+
if (parsed.length) {
|
|
365
|
+
var maxCreateTime = Math.max.apply(Math, parsed.map(function (m) { return (m.create_time ? m.create_time : 0); }));
|
|
366
|
+
// Initialize last seen create_time from cached messages
|
|
367
|
+
lastServerCreateTimeRef.current = Math.round(maxCreateTime) * 1000 / 1000;
|
|
368
|
+
}
|
|
304
369
|
}
|
|
305
370
|
catch (error) {
|
|
306
371
|
setMessages([]);
|
|
372
|
+
lastServerCreateTimeRef.current = 0;
|
|
307
373
|
}
|
|
308
374
|
}, [apiKey, conversationId, buildMessagesKey]);
|
|
375
|
+
// Validate messages for takeover and finalized
|
|
376
|
+
useEffect(function () {
|
|
377
|
+
validateMessages(messages);
|
|
378
|
+
}, [messages]);
|
|
309
379
|
// Persist messages for current pair
|
|
310
380
|
useEffect(function () {
|
|
311
381
|
var key = buildMessagesKey(apiKey, conversationId);
|
|
@@ -318,17 +388,169 @@ export var useChat = function (_a) {
|
|
|
318
388
|
// ignore
|
|
319
389
|
}
|
|
320
390
|
}, [messages, apiKey, conversationId, buildMessagesKey]);
|
|
391
|
+
// Heartbeat long polling when WebSocket is disabled and we have an in-progress conversation.
|
|
392
|
+
// - Starts with a short interval
|
|
393
|
+
// - Increases the interval over time (every successful poll)
|
|
394
|
+
// - Retries up to 5 times on errors, then stops
|
|
395
|
+
var HEARTBEAT_INITIAL_INTERVAL_MS = 2000;
|
|
396
|
+
var HEARTBEAT_INTERVAL_STEP_MS = 5000;
|
|
397
|
+
var HEARTBEAT_MAX_INTERVAL_MS = 30000;
|
|
398
|
+
useEffect(function () {
|
|
399
|
+
if (useWs || !conversationId || isFinalized)
|
|
400
|
+
return;
|
|
401
|
+
var svc = chatServiceRef.current;
|
|
402
|
+
if (!svc)
|
|
403
|
+
return;
|
|
404
|
+
// Reset per-conversation flags so we only notify takeover/finalized once
|
|
405
|
+
takeoverProcessedRef.current = false;
|
|
406
|
+
finalizedProcessedRef.current = false;
|
|
407
|
+
var cancelled = false;
|
|
408
|
+
var timeoutId = null;
|
|
409
|
+
var scheduleNext = function (delayMs) {
|
|
410
|
+
if (cancelled)
|
|
411
|
+
return;
|
|
412
|
+
timeoutId = window.setTimeout(poll, delayMs);
|
|
413
|
+
};
|
|
414
|
+
var poll = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
415
|
+
var _a, status_1, pollMessages, lastServerCreateTime_1, newMessagesRaw, speakerType_1, text_1, newMessages_1, hasTakeoverMessage, hasFinalizedMessage, nextInterval, _b, retryDelay;
|
|
416
|
+
return __generator(this, function (_c) {
|
|
417
|
+
switch (_c.label) {
|
|
418
|
+
case 0:
|
|
419
|
+
if (cancelled)
|
|
420
|
+
return [2 /*return*/];
|
|
421
|
+
_c.label = 1;
|
|
422
|
+
case 1:
|
|
423
|
+
_c.trys.push([1, 3, , 4]);
|
|
424
|
+
return [4 /*yield*/, svc.pollInProgressConversation()];
|
|
425
|
+
case 2:
|
|
426
|
+
_a = _c.sent(), status_1 = _a.status, pollMessages = _a.pollMessages;
|
|
427
|
+
if (cancelled)
|
|
428
|
+
return [2 /*return*/];
|
|
429
|
+
// Reset failure counter on success
|
|
430
|
+
heartbeatFailureCountRef.current = 0;
|
|
431
|
+
lastServerCreateTime_1 = Math.floor(Number(lastServerCreateTimeRef.current) || 0);
|
|
432
|
+
newMessagesRaw = (pollMessages || []).filter(function (m) {
|
|
433
|
+
var ct = Number(m.create_time);
|
|
434
|
+
if (ct === 0 || !Number.isFinite(ct))
|
|
435
|
+
return false;
|
|
436
|
+
return ct > lastServerCreateTime_1;
|
|
437
|
+
});
|
|
438
|
+
if (newMessagesRaw.length > 0) {
|
|
439
|
+
speakerType_1 = function (speaker) {
|
|
440
|
+
if (speaker === "customer")
|
|
441
|
+
return "customer";
|
|
442
|
+
if (speaker === "agent")
|
|
443
|
+
return "agent";
|
|
444
|
+
return "special";
|
|
445
|
+
};
|
|
446
|
+
text_1 = function (m) {
|
|
447
|
+
if (m.type === "takeover")
|
|
448
|
+
return "Supervisor took over";
|
|
449
|
+
if (m.type === "finalized")
|
|
450
|
+
return "Conversation Finalized";
|
|
451
|
+
return m.text;
|
|
452
|
+
};
|
|
453
|
+
newMessages_1 = newMessagesRaw.map(function (m) {
|
|
454
|
+
var _a, _b;
|
|
455
|
+
return ({
|
|
456
|
+
message_id: m.id,
|
|
457
|
+
create_time: Number(m.create_time),
|
|
458
|
+
start_time: Number((_a = m.start_time) !== null && _a !== void 0 ? _a : 0),
|
|
459
|
+
end_time: Number((_b = m.end_time) !== null && _b !== void 0 ? _b : 0),
|
|
460
|
+
speaker: speakerType_1(m.speaker),
|
|
461
|
+
text: text_1(m),
|
|
462
|
+
type: m.type,
|
|
463
|
+
feedback: m.feedback,
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
// Append only messages we don't already have (dedupe by message_id; same create_time can repeat every poll)
|
|
467
|
+
if (newMessages_1.length > 0) {
|
|
468
|
+
setMessages(function (prevMessages) {
|
|
469
|
+
var existingIds = new Set(prevMessages.map(function (m) { return m.message_id; }).filter(Boolean));
|
|
470
|
+
var toAdd = newMessages_1.filter(function (m) { return m.message_id == null || !existingIds.has(m.message_id); });
|
|
471
|
+
if (toAdd.length === 0)
|
|
472
|
+
return prevMessages;
|
|
473
|
+
var maxCreateTimeFromPoll = toAdd.reduce(function (max, msg) {
|
|
474
|
+
return Number.isFinite(msg.create_time)
|
|
475
|
+
? Math.max(max, msg.create_time)
|
|
476
|
+
: max;
|
|
477
|
+
}, lastServerCreateTime_1);
|
|
478
|
+
lastServerCreateTimeRef.current = maxCreateTimeFromPoll;
|
|
479
|
+
return __spreadArray(__spreadArray([], prevMessages, true), toAdd, true);
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
hasTakeoverMessage = newMessages_1.some(function (m) { return m.type === "takeover"; });
|
|
483
|
+
hasFinalizedMessage = newMessages_1.some(function (m) { return m.type === "finalized"; });
|
|
484
|
+
if ((status_1 === "finalized" || hasFinalizedMessage) && !finalizedProcessedRef.current) {
|
|
485
|
+
finalizedProcessedRef.current = true;
|
|
486
|
+
setIsFinalized(true);
|
|
487
|
+
}
|
|
488
|
+
else if ((status_1 === "takeover" || hasTakeoverMessage) && !takeoverProcessedRef.current) {
|
|
489
|
+
takeoverProcessedRef.current = true;
|
|
490
|
+
setIsTakenOver(true);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
// No new messages; still honor status if it indicates a terminal state (once per conversation)
|
|
495
|
+
if (status_1 === "finalized" && !finalizedProcessedRef.current) {
|
|
496
|
+
finalizedProcessedRef.current = true;
|
|
497
|
+
svc.handleConversationFinalized();
|
|
498
|
+
setIsFinalized(true);
|
|
499
|
+
}
|
|
500
|
+
else if (status_1 === "takeover" && !takeoverProcessedRef.current) {
|
|
501
|
+
takeoverProcessedRef.current = true;
|
|
502
|
+
svc.notifyTakeoverFromPoll();
|
|
503
|
+
setIsTakenOver(true);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
if (status_1 === "finalized") {
|
|
507
|
+
// Mark finalized and let the effect cleanup prevent further scheduling
|
|
508
|
+
return [2 /*return*/];
|
|
509
|
+
}
|
|
510
|
+
nextInterval = HEARTBEAT_INTERVAL_STEP_MS;
|
|
511
|
+
heartbeatIntervalRef.current = nextInterval;
|
|
512
|
+
scheduleNext(nextInterval);
|
|
513
|
+
return [3 /*break*/, 4];
|
|
514
|
+
case 3:
|
|
515
|
+
_b = _c.sent();
|
|
516
|
+
if (cancelled)
|
|
517
|
+
return [2 /*return*/];
|
|
518
|
+
// Increment failure counter and stop after 5 consecutive failures
|
|
519
|
+
heartbeatFailureCountRef.current += 1;
|
|
520
|
+
if (heartbeatFailureCountRef.current >= 5) {
|
|
521
|
+
return [2 /*return*/];
|
|
522
|
+
}
|
|
523
|
+
retryDelay = heartbeatIntervalRef.current || HEARTBEAT_INITIAL_INTERVAL_MS;
|
|
524
|
+
scheduleNext(retryDelay);
|
|
525
|
+
return [3 /*break*/, 4];
|
|
526
|
+
case 4: return [2 /*return*/];
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
}); };
|
|
530
|
+
// Reset counters for this conversation and start immediately
|
|
531
|
+
heartbeatFailureCountRef.current = 0;
|
|
532
|
+
heartbeatIntervalRef.current = HEARTBEAT_INITIAL_INTERVAL_MS;
|
|
533
|
+
if (usePoll && !useWs) {
|
|
534
|
+
poll();
|
|
535
|
+
}
|
|
536
|
+
return function () {
|
|
537
|
+
cancelled = true;
|
|
538
|
+
if (timeoutId !== null) {
|
|
539
|
+
clearTimeout(timeoutId);
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
}, [useWs, conversationId, isFinalized, usePoll]);
|
|
321
543
|
// Reset conversation
|
|
322
544
|
var resetConversation = useCallback(function (reCaptchaToken) { return __awaiter(void 0, void 0, void 0, function () {
|
|
323
545
|
var key, convId, queries, welcome, thinking, meta, error_1;
|
|
324
|
-
var _a, _b;
|
|
325
|
-
return __generator(this, function (
|
|
326
|
-
switch (
|
|
546
|
+
var _a, _b, _c, _d, _e, _f;
|
|
547
|
+
return __generator(this, function (_g) {
|
|
548
|
+
switch (_g.label) {
|
|
327
549
|
case 0:
|
|
328
550
|
if (!chatServiceRef.current) {
|
|
329
551
|
return [2 /*return*/];
|
|
330
552
|
}
|
|
331
|
-
setConnectionState(
|
|
553
|
+
setConnectionState("connecting");
|
|
332
554
|
setIsLoading(true);
|
|
333
555
|
setMessages([]);
|
|
334
556
|
setPossibleQueries([]);
|
|
@@ -337,6 +559,7 @@ export var useChat = function (_a) {
|
|
|
337
559
|
setWelcomeMessage(null);
|
|
338
560
|
setThinkingPhrases([]);
|
|
339
561
|
setThinkingDelayMs(1000);
|
|
562
|
+
lastServerCreateTimeRef.current = 0;
|
|
340
563
|
key = buildMessagesKey(apiKey, conversationId);
|
|
341
564
|
if (key) {
|
|
342
565
|
localStorage.removeItem(key);
|
|
@@ -344,16 +567,16 @@ export var useChat = function (_a) {
|
|
|
344
567
|
setIsFinalized(false);
|
|
345
568
|
setIsTakenOver(false);
|
|
346
569
|
setIsAgentTyping(false);
|
|
347
|
-
|
|
570
|
+
_g.label = 1;
|
|
348
571
|
case 1:
|
|
349
|
-
|
|
572
|
+
_g.trys.push([1, 3, 4, 5]);
|
|
350
573
|
// Reset the conversation in the chat service
|
|
351
574
|
chatServiceRef.current.resetChatConversation();
|
|
352
575
|
return [4 /*yield*/, chatServiceRef.current.startConversation(reCaptchaToken)];
|
|
353
576
|
case 2:
|
|
354
|
-
convId =
|
|
577
|
+
convId = _g.sent();
|
|
355
578
|
setConversationId(convId);
|
|
356
|
-
setConnectionState(
|
|
579
|
+
setConnectionState("connected");
|
|
357
580
|
// Get possible queries from API response
|
|
358
581
|
if (chatServiceRef.current.getPossibleQueries) {
|
|
359
582
|
queries = chatServiceRef.current.getPossibleQueries();
|
|
@@ -374,13 +597,16 @@ export var useChat = function (_a) {
|
|
|
374
597
|
setThinkingDelayMs(thinking.delayMs || 1000);
|
|
375
598
|
}
|
|
376
599
|
meta = (_b = (_a = chatServiceRef.current).getChatInputMetadata) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
377
|
-
if (meta && typeof meta ===
|
|
600
|
+
if (meta && typeof meta === "object" && Object.keys(meta).length > 0) {
|
|
378
601
|
setChatInputMetadata(meta);
|
|
379
602
|
}
|
|
603
|
+
(_c = onConfigLoadedRef.current) === null || _c === void 0 ? void 0 : _c.call(onConfigLoadedRef, {
|
|
604
|
+
chatInputMetadata: (_f = (_e = (_d = chatServiceRef.current).getChatInputMetadata) === null || _e === void 0 ? void 0 : _e.call(_d)) !== null && _f !== void 0 ? _f : {},
|
|
605
|
+
});
|
|
380
606
|
return [3 /*break*/, 5];
|
|
381
607
|
case 3:
|
|
382
|
-
error_1 =
|
|
383
|
-
setConnectionState(
|
|
608
|
+
error_1 = _g.sent();
|
|
609
|
+
setConnectionState("disconnected");
|
|
384
610
|
setIsAgentTyping(false);
|
|
385
611
|
if (onErrorRef.current && error_1 instanceof Error) {
|
|
386
612
|
onErrorRef.current(error_1);
|
|
@@ -434,14 +660,20 @@ export var useChat = function (_a) {
|
|
|
434
660
|
case 4: return [2 /*return*/];
|
|
435
661
|
}
|
|
436
662
|
});
|
|
437
|
-
}); }, [
|
|
663
|
+
}); }, [
|
|
664
|
+
apiKey,
|
|
665
|
+
conversationId,
|
|
666
|
+
buildMessagesKey,
|
|
667
|
+
isTokenExpiredError,
|
|
668
|
+
resetToInitialState,
|
|
669
|
+
]);
|
|
438
670
|
// Send message
|
|
439
|
-
var sendMessage = useCallback(function (
|
|
671
|
+
var sendMessage = useCallback(function (text_2) {
|
|
440
672
|
var args_1 = [];
|
|
441
673
|
for (var _i = 1; _i < arguments.length; _i++) {
|
|
442
674
|
args_1[_i - 1] = arguments[_i];
|
|
443
675
|
}
|
|
444
|
-
return __awaiter(void 0, __spreadArray([
|
|
676
|
+
return __awaiter(void 0, __spreadArray([text_2], args_1, true), void 0, function (text, files, extraMetadata, reCaptchaToken) {
|
|
445
677
|
var newAttachments, uploadedFiles, error_3, now, createTime, startTime, endTime, specialMessage_1;
|
|
446
678
|
var _a;
|
|
447
679
|
if (files === void 0) { files = []; }
|
|
@@ -449,7 +681,7 @@ export var useChat = function (_a) {
|
|
|
449
681
|
switch (_b.label) {
|
|
450
682
|
case 0:
|
|
451
683
|
if (!chatServiceRef.current) {
|
|
452
|
-
throw new Error(
|
|
684
|
+
throw new Error("Chat service not initialized");
|
|
453
685
|
}
|
|
454
686
|
_b.label = 1;
|
|
455
687
|
case 1:
|
|
@@ -457,7 +689,11 @@ export var useChat = function (_a) {
|
|
|
457
689
|
setIsLoading(true);
|
|
458
690
|
newAttachments = [];
|
|
459
691
|
if (files.length > 0) {
|
|
460
|
-
uploadedFiles = files
|
|
692
|
+
uploadedFiles = files
|
|
693
|
+
.map(function (f) {
|
|
694
|
+
return preloadedAttachments.find(function (pa) { return pa.name === f.name && pa.size === f.size; });
|
|
695
|
+
})
|
|
696
|
+
.filter(Boolean);
|
|
461
697
|
newAttachments.push.apply(newAttachments, uploadedFiles);
|
|
462
698
|
}
|
|
463
699
|
// Start typing immediately when user sends, unless conversation is taken over by a human
|
|
@@ -480,7 +716,7 @@ export var useChat = function (_a) {
|
|
|
480
716
|
createTime = (_a = chatServiceRef.current) === null || _a === void 0 ? void 0 : _a.getConversationCreateTime();
|
|
481
717
|
startTime = createTime != null ? now - createTime : 0;
|
|
482
718
|
endTime = startTime + 0.01;
|
|
483
|
-
specialMessage_1 = __assign({ create_time: now, start_time: startTime, end_time: endTime, speaker:
|
|
719
|
+
specialMessage_1 = __assign({ create_time: now, start_time: startTime, end_time: endTime, speaker: "special", text: serverUnavailableMessage !== null && serverUnavailableMessage !== void 0 ? serverUnavailableMessage : DEFAULT_SERVER_UNAVAILABLE_MESSAGE }, (serverUnavailableContactUrl && {
|
|
484
720
|
linkUrl: serverUnavailableContactUrl,
|
|
485
721
|
linkLabel: serverUnavailableContactLabel !== null && serverUnavailableContactLabel !== void 0 ? serverUnavailableContactLabel : DEFAULT_SERVER_UNAVAILABLE_CONTACT_LABEL,
|
|
486
722
|
}));
|
|
@@ -498,20 +734,28 @@ export var useChat = function (_a) {
|
|
|
498
734
|
}
|
|
499
735
|
});
|
|
500
736
|
});
|
|
501
|
-
}, [
|
|
737
|
+
}, [
|
|
738
|
+
preloadedAttachments,
|
|
739
|
+
isTakenOver,
|
|
740
|
+
isTokenExpiredError,
|
|
741
|
+
resetToInitialState,
|
|
742
|
+
serverUnavailableMessage,
|
|
743
|
+
serverUnavailableContactUrl,
|
|
744
|
+
serverUnavailableContactLabel,
|
|
745
|
+
]);
|
|
502
746
|
var startConversation = useCallback(function (reCaptchaToken) { return __awaiter(void 0, void 0, void 0, function () {
|
|
503
747
|
var key, convId, queries, welcome, thinking, meta, error_4;
|
|
504
|
-
var _a, _b;
|
|
505
|
-
return __generator(this, function (
|
|
506
|
-
switch (
|
|
748
|
+
var _a, _b, _c, _d, _e, _f;
|
|
749
|
+
return __generator(this, function (_g) {
|
|
750
|
+
switch (_g.label) {
|
|
507
751
|
case 0:
|
|
508
752
|
if (!chatServiceRef.current) {
|
|
509
753
|
return [2 /*return*/];
|
|
510
754
|
}
|
|
511
|
-
|
|
755
|
+
_g.label = 1;
|
|
512
756
|
case 1:
|
|
513
|
-
|
|
514
|
-
setConnectionState(
|
|
757
|
+
_g.trys.push([1, 3, 4, 5]);
|
|
758
|
+
setConnectionState("connecting");
|
|
515
759
|
setIsLoading(true);
|
|
516
760
|
// Reset state for new conversation
|
|
517
761
|
setMessages([]);
|
|
@@ -526,9 +770,9 @@ export var useChat = function (_a) {
|
|
|
526
770
|
chatServiceRef.current.resetChatConversation();
|
|
527
771
|
return [4 /*yield*/, chatServiceRef.current.startConversation(reCaptchaToken)];
|
|
528
772
|
case 2:
|
|
529
|
-
convId =
|
|
773
|
+
convId = _g.sent();
|
|
530
774
|
setConversationId(convId);
|
|
531
|
-
setConnectionState(
|
|
775
|
+
setConnectionState("connected");
|
|
532
776
|
if (chatServiceRef.current.getPossibleQueries) {
|
|
533
777
|
queries = chatServiceRef.current.getPossibleQueries();
|
|
534
778
|
if (queries && queries.length > 0) {
|
|
@@ -547,13 +791,16 @@ export var useChat = function (_a) {
|
|
|
547
791
|
setThinkingDelayMs(thinking.delayMs || 1000);
|
|
548
792
|
}
|
|
549
793
|
meta = (_b = (_a = chatServiceRef.current).getChatInputMetadata) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
550
|
-
if (meta && typeof meta ===
|
|
794
|
+
if (meta && typeof meta === "object" && Object.keys(meta).length > 0) {
|
|
551
795
|
setChatInputMetadata(meta);
|
|
552
796
|
}
|
|
797
|
+
(_c = onConfigLoadedRef.current) === null || _c === void 0 ? void 0 : _c.call(onConfigLoadedRef, {
|
|
798
|
+
chatInputMetadata: (_f = (_e = (_d = chatServiceRef.current).getChatInputMetadata) === null || _e === void 0 ? void 0 : _e.call(_d)) !== null && _f !== void 0 ? _f : {},
|
|
799
|
+
});
|
|
553
800
|
return [3 /*break*/, 5];
|
|
554
801
|
case 3:
|
|
555
|
-
error_4 =
|
|
556
|
-
setConnectionState(
|
|
802
|
+
error_4 = _g.sent();
|
|
803
|
+
setConnectionState("disconnected");
|
|
557
804
|
setIsAgentTyping(false);
|
|
558
805
|
if (onErrorRef.current && error_4 instanceof Error) {
|
|
559
806
|
onErrorRef.current(error_4);
|
|
@@ -576,11 +823,11 @@ export var useChat = function (_a) {
|
|
|
576
823
|
switch (_a.label) {
|
|
577
824
|
case 0:
|
|
578
825
|
if (!chatServiceRef.current) {
|
|
579
|
-
console.error(
|
|
826
|
+
console.error("Cannot send feedback: ChatService not initialized");
|
|
580
827
|
return [2 /*return*/];
|
|
581
828
|
}
|
|
582
829
|
if (!messageId) {
|
|
583
|
-
console.error(
|
|
830
|
+
console.error("Cannot send feedback: messageId is required");
|
|
584
831
|
return [2 /*return*/];
|
|
585
832
|
}
|
|
586
833
|
_a.label = 1;
|
|
@@ -635,4 +882,4 @@ export var useChat = function (_a) {
|
|
|
635
882
|
chatInputMetadata: chatInputMetadata,
|
|
636
883
|
};
|
|
637
884
|
};
|
|
638
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBbUJ0RCxJQUFNLGtDQUFrQyxHQUFHLGlFQUFpRSxDQUFDO0FBQzdHLElBQU0sd0NBQXdDLEdBQUcsaUJBQWlCLENBQUM7QUFFbkUsU0FBUyxzQkFBc0IsQ0FBQyxLQUFVOztJQUN4Qyw4QkFBOEI7SUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQixJQUFNLElBQUksR0FBRyxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsSUFBSSxDQUFDO1FBQ3pCLElBQUksSUFBSSxLQUFLLGFBQWEsSUFBSSxJQUFJLEtBQUssY0FBYyxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxLQUFLLHdCQUF3QjtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hJLE9BQU8sSUFBSSxDQUFDLENBQUMsd0VBQXdFO0lBQ3ZGLENBQUM7SUFDRCxJQUFNLE1BQU0sR0FBRyxNQUFBLEtBQUssQ0FBQyxRQUFRLDBDQUFFLE1BQU0sQ0FBQztJQUN0QyxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLElBQUksR0FBRyxDQUFDO0FBQ3JELENBQUM7QUFFRCxNQUFNLENBQUMsSUFBTSxPQUFPLEdBQUcsVUFBQyxFQUFrTTtRQUFoTSxPQUFPLGFBQUEsRUFBRSxNQUFNLFlBQUEsRUFBRSxNQUFNLFlBQUEsRUFBRSxRQUFRLGNBQUEsRUFBRSxhQUFZLEVBQVos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LGlCQUFpQixtQkFBQTtRQUNqQixpQkFBaUIsbUJBQUE7UUFDakIsZUFBZSxpQkFBQTtRQUNmLGNBQWMsZ0JBQUE7UUFDZCxlQUFlLGlCQUFBO1FBQ2YsV0FBVyxhQUFBO1FBQ1gsV0FBVyxhQUFBO1FBQ1gsYUFBYSxlQUFBO1FBQ2IsV0FBVyxhQUFBO1FBQ1gsWUFBWSxjQUFBO1FBQ1osZUFBZSxpQkFBQTtRQUNmLGNBQWMsZ0JBQUE7UUFDZCxlQUFlLGlCQUFBO1FBQ2YsZUFBZSxpQkFBQTtRQUNmLGlCQUFpQixtQkFBQTtLQUNsQixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2hhdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIEF0dGFjaG1lbnQsIE1lc3NhZ2VGZWVkYmFjayB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VDaGF0UHJvcHMge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xuICB0ZW5hbnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLy8gIElmIGZhbHNlLCB0aGUgY2hhdCB3aWxsIHJ1biBpbiBIVFRQLW9ubHkgbW9kZSAobm8gV2ViU29ja2V0IGNvbm5lY3Rpb24pLlxuICB1c2VXcz86IGJvb2xlYW47XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgb25UYWtlb3Zlcj86ICgpID0+IHZvaWQ7XG4gIG9uRmluYWxpemU/OiAoKSA9PiB2b2lkO1xuICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2U/OiBzdHJpbmc7IC8vIEN1c3RvbSBtZXNzYWdlIHdoZW4gc2VydmVyIGlzIGRvd25cbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsPzogc3RyaW5nOyAvLyBPcHRpb25hbCBVUkwgZm9yIGNvbnRhY3Qvc3VwcG9ydFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbD86IHN0cmluZzsgLy8gTGFiZWwgZm9yIHRoZSBjb250YWN0IGxpbmtcbn1cblxuY29uc3QgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfTUVTU0FHRSA9ICdUaGUgc2VydmljZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nO1xuY29uc3QgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfQ09OVEFDVF9MQUJFTCA9ICdDb250YWN0IHN1cHBvcnQnO1xuXG5mdW5jdGlvbiBpc05ldHdvcmtPclNlcnZlckVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgLy8gTm8gcmVzcG9uc2UgPSBuZXR3b3JrIGVycm9yXG4gIGlmICghZXJyb3IucmVzcG9uc2UpIHtcbiAgICBjb25zdCBjb2RlID0gZXJyb3I/LmNvZGU7XG4gICAgaWYgKGNvZGUgPT09ICdFUlJfTkVUV09SSycgfHwgY29kZSA9PT0gJ0VDT05OUkVGVVNFRCcgfHwgY29kZSA9PT0gJ0VUSU1FRE9VVCcgfHwgY29kZSA9PT0gJ0VSUl9DT05ORUNUSU9OX1JFRlVTRUQnKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gYW55IHJlcXVlc3QgZXJyb3Igd2l0aG91dCByZXNwb25zZSBpcyB0cmVhdGVkIGFzIHNlcnZlci9uZXR3b3JrIGlzc3VlXG4gIH1cbiAgY29uc3Qgc3RhdHVzID0gZXJyb3IucmVzcG9uc2U/LnN0YXR1cztcbiAgcmV0dXJuIHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInICYmIHN0YXR1cyA+PSA1MDA7XG59XG5cbmV4cG9ydCBjb25zdCB1c2VDaGF0ID0gKHsgYmFzZVVybCwgYXBpS2V5LCB0ZW5hbnQsIG1ldGFkYXRhLCB1c2VXcyA9IHRydWUsIGxhbmd1YWdlLCBvbkVycm9yLCBvblRha2VvdmVyLCBvbkZpbmFsaXplLCBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCwgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwgfTogVXNlQ2hhdFByb3BzKSA9PiB7XG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oW10pO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbcHJlbG9hZGVkQXR0YWNobWVudHMsIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzXSA9IHVzZVN0YXRlPEF0dGFjaG1lbnRbXT4oW10pO1xuICBjb25zdCBbY29ubmVjdGlvblN0YXRlLCBzZXRDb25uZWN0aW9uU3RhdGVdID0gdXNlU3RhdGU8J2Nvbm5lY3RpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJz4oJ2Rpc2Nvbm5lY3RlZCcpO1xuICBjb25zdCBbaXNBZ2VudFR5cGluZywgc2V0SXNBZ2VudFR5cGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGNoYXRTZXJ2aWNlUmVmID0gdXNlUmVmPENoYXRTZXJ2aWNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtjb252ZXJzYXRpb25JZCwgc2V0Q29udmVyc2F0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtwb3NzaWJsZVF1ZXJpZXMsIHNldFBvc3NpYmxlUXVlcmllc10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oW10pO1xuICBjb25zdCBbd2VsY29tZVRpdGxlLCBzZXRXZWxjb21lVGl0bGVdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFt3ZWxjb21lSW1hZ2VVcmwsIHNldFdlbGNvbWVJbWFnZVVybF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVNZXNzYWdlLCBzZXRXZWxjb21lTWVzc2FnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3RoaW5raW5nUGhyYXNlcywgc2V0VGhpbmtpbmdQaHJhc2VzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt0aGlua2luZ0RlbGF5TXMsIHNldFRoaW5raW5nRGVsYXlNc10gPSB1c2VTdGF0ZTxudW1iZXI+KDEwMDApO1xuICBjb25zdCBbY2hhdElucHV0TWV0YWRhdGEsIHNldENoYXRJbnB1dE1ldGFkYXRhXSA9IHVzZVN0YXRlPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7fSk7XG4gIGNvbnN0IFtpc1Rha2VuT3Zlciwgc2V0SXNUYWtlbk92ZXJdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbaXNGaW5hbGl6ZWQsIHNldElzRmluYWxpemVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyBTY29wZWQgbWVzc2FnZXMga2V5IGZvciBhcGlLZXksIGNvbnZlcnNhdGlvSWRcbiAgY29uc3QgYnVpbGRNZXNzYWdlc0tleSA9IHVzZUNhbGxiYWNrKChhcGlLZXlWYWw6IHN0cmluZywgY29udklkOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgaWYgKCFjb252SWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBgZ2VuYXNzaXN0X2NvbnZlcnNhdGlvbl9tZXNzYWdlczoke2FwaUtleVZhbH06JHtjb252SWR9YDtcbiAgfSwgW10pO1xuXG4gIC8vIENoZWNrIGlmIGFuIGVycm9yIGlzIGEgdG9rZW4gZXhwaXJhdGlvbiBlcnJvciAoNDAxICsgXCJUb2tlbiBoYXMgZXhwaXJlZC5cIilcbiAgY29uc3QgaXNUb2tlbkV4cGlyZWRFcnJvciA9IHVzZUNhbGxiYWNrKChlcnJvcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMSAmJlxuICAgICAgZXJyb3I/LnJlc3BvbnNlPy5kYXRhICYmXG4gICAgICAoZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvciA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgPT09IFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIgfHxcbiAgICAgICAgKHR5cGVvZiBlcnJvci5yZXNwb25zZS5kYXRhID09PSBcInN0cmluZ1wiICYmIGVycm9yLnJlc3BvbnNlLmRhdGEuaW5jbHVkZXMoXCJUb2tlbiBoYXMgZXhwaXJlZFwiKSkpXG4gICAgKTtcbiAgfSwgW10pO1xuXG4gIC8vIFJlc2V0IGNvbnZlcnNhdGlvbiBzdGF0ZSB0byBpbml0aWFsIChlLmcuIGFmdGVyIHRva2VuIGV4cGlyYXRpb24pXG4gIGNvbnN0IHJlc2V0VG9Jbml0aWFsU3RhdGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0Q29udmVyc2F0aW9uSWQobnVsbCk7XG4gICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgIHNldFdlbGNvbWVUaXRsZShudWxsKTtcbiAgICBzZXRXZWxjb21lSW1hZ2VVcmwobnVsbCk7XG4gICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICBzZXRUaGlua2luZ1BocmFzZXMoW10pO1xuICAgIHNldFRoaW5raW5nRGVsYXlNcygxMDAwKTtcbiAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YSh7fSk7XG4gICAgc2V0TWVzc2FnZXMoW10pO1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgaWYgKGtleSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfVxuICB9LCBbYXBpS2V5LCBjb252ZXJzYXRpb25JZCwgYnVpbGRNZXNzYWdlc0tleV0pO1xuXG4gIC8vIERlZXAgY29tcGFyZSBtZXRhZGF0YSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLWluaXRpYWxpemF0aW9uc1xuICAvLyBPbmx5IHJlLWluaXRpYWxpemUgaWYgbWV0YWRhdGEgYWN0dWFsbHkgY2hhbmdlcyAoYnkgdmFsdWUsIG5vdCByZWZlcmVuY2UpXG4gIGNvbnN0IG1ldGFkYXRhU3RyaW5nID0gdXNlTWVtbygoKSA9PiBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSB8fCB7fSksIFttZXRhZGF0YV0pO1xuICBjb25zdCBtZXRhZGF0YVJlZiA9IHVzZVJlZjxzdHJpbmc+KG1ldGFkYXRhU3RyaW5nKTtcbiAgY29uc3QgcHJldkJhc2VVcmxSZWYgPSB1c2VSZWY8c3RyaW5nPihiYXNlVXJsKTtcbiAgY29uc3QgcHJldkFwaUtleVJlZiA9IHVzZVJlZjxzdHJpbmc+KGFwaUtleSk7XG4gIGNvbnN0IHByZXZUZW5hbnRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih0ZW5hbnQpO1xuICBjb25zdCBwcmV2VXNlV3NSZWYgPSB1c2VSZWY8Ym9vbGVhbj4odXNlV3MpO1xuXG4gIC8vIFN0b3JlIGNhbGxiYWNrcyBpbiByZWZzIHNvIHRoZXkgZG9uJ3QgdHJpZ2dlciByZS1pbml0aWFsaXphdGlvblxuICBjb25zdCBvbkVycm9yUmVmID0gdXNlUmVmKG9uRXJyb3IpO1xuICBjb25zdCBvblRha2VvdmVyUmVmID0gdXNlUmVmKG9uVGFrZW92ZXIpO1xuICBjb25zdCBvbkZpbmFsaXplUmVmID0gdXNlUmVmKG9uRmluYWxpemUpO1xuXG4gIC8vIFVwZGF0ZSBjYWxsYmFjayByZWZzIHdoZW4gdGhleSBjaGFuZ2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkVycm9yUmVmLmN1cnJlbnQgPSBvbkVycm9yO1xuICB9LCBbb25FcnJvcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25UYWtlb3ZlclJlZi5jdXJyZW50ID0gb25UYWtlb3ZlcjtcbiAgfSwgW29uVGFrZW92ZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uRmluYWxpemVSZWYuY3VycmVudCA9IG9uRmluYWxpemU7XG4gIH0sIFtvbkZpbmFsaXplXSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBjaGF0IHNlcnZpY2UgLSBvbmx5IHdoZW4gYmFzZVVybCwgYXBpS2V5LCB0ZW5hbnQsIHVzZVdzLCBvciBtZXRhZGF0YSBhY3R1YWxseSBjaGFuZ2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YUNoYW5nZWQgPSBtZXRhZGF0YVJlZi5jdXJyZW50ICE9PSBtZXRhZGF0YVN0cmluZztcbiAgICBjb25zdCBiYXNlVXJsQ2hhbmdlZCA9IHByZXZCYXNlVXJsUmVmLmN1cnJlbnQgIT09IGJhc2VVcmw7XG4gICAgY29uc3QgYXBpS2V5Q2hhbmdlZCA9IHByZXZBcGlLZXlSZWYuY3VycmVudCAhPT0gYXBpS2V5O1xuICAgIGNvbnN0IHRlbmFudENoYW5nZWQgPSBwcmV2VGVuYW50UmVmLmN1cnJlbnQgIT09IHRlbmFudDtcbiAgICBjb25zdCB1c2VXc0NoYW5nZWQgPSBwcmV2VXNlV3NSZWYuY3VycmVudCAhPT0gdXNlV3M7XG4gICAgXG4gICAgLy8gT25seSByZS1pbml0aWFsaXplIGZvciBjb25uZWN0aW9uLXJlbGF0ZWQgY2hhbmdlcywgTk9UIGZvciBtZXRhZGF0YSBjaGFuZ2VzXG4gICAgY29uc3QgbmVlZHNSZWluaXQgPSAhY2hhdFNlcnZpY2VSZWYuY3VycmVudCB8fCBiYXNlVXJsQ2hhbmdlZCB8fCBhcGlLZXlDaGFuZ2VkIHx8IHRlbmFudENoYW5nZWQgfHwgdXNlV3NDaGFuZ2VkO1xuXG4gICAgaWYgKG5lZWRzUmVpbml0KSB7XG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgaWYgKGJhc2VVcmxDaGFuZ2VkKSBwcmV2QmFzZVVybFJlZi5jdXJyZW50ID0gYmFzZVVybDtcbiAgICAgIGlmIChhcGlLZXlDaGFuZ2VkKSBwcmV2QXBpS2V5UmVmLmN1cnJlbnQgPSBhcGlLZXk7XG4gICAgICBpZiAodGVuYW50Q2hhbmdlZCkgcHJldlRlbmFudFJlZi5jdXJyZW50ID0gdGVuYW50O1xuICAgICAgaWYgKHVzZVdzQ2hhbmdlZCkgcHJldlVzZVdzUmVmLmN1cnJlbnQgPSB1c2VXcztcbiAgICAgIGlmIChtZXRhZGF0YUNoYW5nZWQpIG1ldGFkYXRhUmVmLmN1cnJlbnQgPSBtZXRhZGF0YVN0cmluZztcblxuICAgICAgLy8gQ2xlYW4gdXAgZXhpc3Rpbmcgc2VydmljZSBpZiBpdCBleGlzdHNcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0Q29ubmVjdGlvblN0YXRlSGFuZGxlcigoKSA9PiB7fSk7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZGlzY29ubmVjdCgpO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFdlbGNvbWVEYXRhSGFuZGxlcihudWxsKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudCA9IG5ldyBDaGF0U2VydmljZShiYXNlVXJsLCBhcGlLZXksIG1ldGFkYXRhLCB0ZW5hbnQsIGxhbmd1YWdlLCB1c2VXcyk7XG4gICAgICBcbiAgICAgIC8vIFNldCB1cCBoYW5kbGVyc1xuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRNZXNzYWdlSGFuZGxlcigobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgY3JlYXRlX3RpbWU6ICghbWVzc2FnZS5jcmVhdGVfdGltZSB8fCBpc05hTihtZXNzYWdlLmNyZWF0ZV90aW1lKSlcbiAgICAgICAgICAgID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcbiAgICAgICAgICAgIDogbWVzc2FnZS5jcmVhdGVfdGltZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRNZXNzYWdlcyhwcmV2TWVzc2FnZXMgPT4gWy4uLnByZXZNZXNzYWdlcywgbm9ybWFsaXplZE1lc3NhZ2VdKTtcbiAgICAgICAgLy8gU3RvcCB0eXBpbmcgYW5pbWF0aW9uIHdoZW4gYWdlbnQgb3Igc3lzdGVtIG1lc3NhZ2UgYXJyaXZlc1xuICAgICAgICBpZiAobm9ybWFsaXplZE1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50JyB8fCBub3JtYWxpemVkTWVzc2FnZS5zcGVha2VyID09PSAnc3BlY2lhbCcpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25UYWtlb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25UYWtlb3ZlclJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkZpbmFsaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0Q29ubmVjdGlvblN0YXRlSGFuZGxlcigoc3RhdGUpID0+IHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKHN0YXRlKTtcbiAgICAgICAgaWYgKHN0YXRlICE9PSAnY29ubmVjdGVkJykge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRXZWxjb21lRGF0YUhhbmRsZXIoKGRhdGEpID0+IHtcbiAgICAgICAgc2V0V2VsY29tZVRpdGxlKGRhdGEudGl0bGUgPz8gbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVJbWFnZVVybChkYXRhLmltYWdlVXJsID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lTWVzc2FnZShkYXRhLm1lc3NhZ2UgPz8gbnVsbCk7XG4gICAgICAgIGlmIChkYXRhLnBvc3NpYmxlUXVlcmllcyAmJiBkYXRhLnBvc3NpYmxlUXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKGRhdGEucG9zc2libGVRdWVyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0U2VydmVyVW5hdmFpbGFibGVDb25maWcoXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbFxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGEgc2F2ZWQgY29udmVyc2F0aW9uIGFuZCBjb25uZWN0IHRvIGl0XG4gICAgICBjb25zdCBjb252SWQgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENvbnZlcnNhdGlvbklkKCk7XG4gICAgICBpZiAoY29udklkKSB7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmlzQ29udmVyc2F0aW9uRmluYWxpemVkKCkpIHtcbiAgICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmNvbm5lY3RXZWJTb2NrZXQoKTtcbiAgICAgICAgICBpZiAoIXVzZVdzKSB7XG4gICAgICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gUHVsbCBpbml0aWFsIHN0YXRpYyBkYXRhXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXM/LigpIHx8IFtdO1xuICAgICAgICBpZiAocXVlcmllcy5sZW5ndGgpIHNldFBvc3NpYmxlUXVlcmllcyhxdWVyaWVzKTtcbiAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGE/LigpO1xuICAgICAgICBpZiAod2VsY29tZSkge1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWc/LigpO1xuICAgICAgICBpZiAodGhpbmtpbmcpIHtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q2hhdElucHV0TWV0YWRhdGE/LigpO1xuICAgICAgICBpZiAobWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMobWV0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKG1ldGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAvLyBKdXN0IHVwZGF0ZSBtZXRhZGF0YSB3aXRob3V0IHJlLWluaXRpYWxpemluZ1xuICAgICAgaWYgKG1ldGFkYXRhQ2hhbmdlZCkge1xuICAgICAgICBtZXRhZGF0YVJlZi5jdXJyZW50ID0gbWV0YWRhdGFTdHJpbmc7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsd2F5cyB1cGRhdGUgaGFuZGxlcnMgd2hlbiBjYWxsYmFja3MgY2hhbmdlICh3aXRob3V0IHJlLWluaXRpYWxpemluZylcbiAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRUYWtlb3ZlckhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvblRha2VvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0RmluYWxpemVkSGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRmluYWxpemVSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRmluYWxpemVSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRTZXJ2ZXJVbmF2YWlsYWJsZUNvbmZpZyhcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENsZWFudXAgb25seSBvbiB1bm1vdW50XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIC8vIE9ubHkgY2xlYW51cCBvbiB1bm1vdW50LCBub3Qgb24gZXZlcnkgZGVwZW5kZW5jeSBjaGFuZ2VcbiAgICB9O1xuICB9LCBbYmFzZVVybCwgYXBpS2V5LCB0ZW5hbnQsIG1ldGFkYXRhU3RyaW5nLCBsYW5ndWFnZSwgdXNlV3MsIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSwgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLCBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbF0pO1xuXG4gIC8vIFVwZGF0ZSBsYW5ndWFnZSB3aGVuIGl0IGNoYW5nZXMgKHdpdGhvdXQgcmUtaW5pdGlhbGl6aW5nIHRoZSBzZXJ2aWNlKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldExhbmd1YWdlKGxhbmd1YWdlKTtcbiAgICB9XG4gIH0sIFtsYW5ndWFnZV0pO1xuXG4gIC8vIExvYWQgbWVzc2FnZXMgZm9yIGN1cnJlbnQgcGFpciB3aGVuIGF2YWlsYWJsZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBzZXRNZXNzYWdlcyhzdG9yZWQgPyBKU09OLnBhcnNlKHN0b3JlZCkgOiBbXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICB9XG4gIH0sIFthcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gUGVyc2lzdCBtZXNzYWdlcyBmb3IgY3VycmVudCBwYWlyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfSwgW21lc3NhZ2VzLCBhcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gUmVzZXQgY29udmVyc2F0aW9uXG4gIGNvbnN0IHJlc2V0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soYXN5bmMgKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGluZycpO1xuICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICBzZXRXZWxjb21lVGl0bGUobnVsbCk7XG4gICAgc2V0V2VsY29tZUltYWdlVXJsKG51bGwpO1xuICAgIHNldFdlbGNvbWVNZXNzYWdlKG51bGwpO1xuICAgIHNldFRoaW5raW5nUGhyYXNlcyhbXSk7XG4gICAgc2V0VGhpbmtpbmdEZWxheU1zKDEwMDApO1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgaWYgKGtleSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB9XG4gICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gUmVzZXQgdGhlIGNvbnZlcnNhdGlvbiBpbiB0aGUgY2hhdCBzZXJ2aWNlXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuICAgICAgXG4gICAgICAvLyBTdGFydCBhIG5ldyBjb252ZXJzYXRpb25cbiAgICAgIGNvbnN0IGNvbnZJZCA9IGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW4pO1xuICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGVkJyk7XG5cbiAgICAgIC8vIEdldCBwb3NzaWJsZSBxdWVyaWVzIGZyb20gQVBJIHJlc3BvbnNlXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMpIHtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgIGlmIChxdWVyaWVzICYmIHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhxdWVyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gd2VsY29tZSBhbmQgdGhpbmtpbmcgZGF0YVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEoKTtcbiAgICAgICAgc2V0V2VsY29tZVRpdGxlKHdlbGNvbWUudGl0bGUgfHwgbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcoKTtcbiAgICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKHRoaW5raW5nLnBocmFzZXMgfHwgW10pO1xuICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGEgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENoYXRJbnB1dE1ldGFkYXRhPy4oKTtcbiAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhtZXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKG1ldGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IHVwbG9hZEZpbGUgPSB1c2VDYWxsYmFjayhhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8QXR0YWNobWVudCB8IG51bGw+ID0+IHtcbiAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LmdldENvbnZlcnNhdGlvbklkKCk7IFxuICAgIGlmICghY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cGxvYWRSZXN1bHQgPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50Py51cGxvYWRGaWxlKGNvbnZlcnNhdGlvbklkLCBmaWxlKTtcblxuICAgICAgLy8gY29uc3RydWN0IHRoZSBmaWxlIHVybCB3aXRoIHRoZSBiYXNlIHVybFxuICAgICAgY29uc3QgZmlsZV91cmwgPSBuZXcgVVJMKHVwbG9hZFJlc3VsdCEuZmlsZV91cmwhLCBiYXNlVXJsKS5ocmVmO1xuICAgICAgXG4gICAgICBjb25zdCBhdHRhY2htZW50OiBBdHRhY2htZW50ID0ge1xuICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICB1cmw6IGZpbGVfdXJsLFxuICAgICAgICBmaWxlX2lkOiB1cGxvYWRSZXN1bHQ/LmZpbGVfaWQsXG4gICAgICB9O1xuXG4gICAgICBzZXRQcmVsb2FkZWRBdHRhY2htZW50cyhwcmV2ID0+IFsuLi5wcmV2LCBhdHRhY2htZW50XSk7XG4gICAgICByZXR1cm4gYXR0YWNobWVudDtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCkge1xuICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCBbYXBpS2V5LCBjb252ZXJzYXRpb25JZCwgYnVpbGRNZXNzYWdlc0tleSwgaXNUb2tlbkV4cGlyZWRFcnJvciwgcmVzZXRUb0luaXRpYWxTdGF0ZV0pO1xuXG4gIC8vIFNlbmQgbWVzc2FnZVxuICBjb25zdCBzZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKGFzeW5jICh0ZXh0OiBzdHJpbmcsIGZpbGVzOiBGaWxlW10gPSBbXSwgZXh0cmFNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sIHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoYXQgc2VydmljZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuXG4gICAgICBjb25zdCBuZXdBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XG4gICAgICBcbiAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHVwbG9hZGVkRmlsZXMgPSBmaWxlcy5tYXAoZiA9PiBwcmVsb2FkZWRBdHRhY2htZW50cy5maW5kKHBhID0+IHBhLm5hbWUgPT09IGYubmFtZSAmJiBwYS5zaXplID09PSBmLnNpemUpKS5maWx0ZXIoQm9vbGVhbikgYXMgQXR0YWNobWVudFtdO1xuICAgICAgICBuZXdBdHRhY2htZW50cy5wdXNoKC4uLnVwbG9hZGVkRmlsZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGFydCB0eXBpbmcgaW1tZWRpYXRlbHkgd2hlbiB1c2VyIHNlbmRzLCB1bmxlc3MgY29udmVyc2F0aW9uIGlzIHRha2VuIG92ZXIgYnkgYSBodW1hblxuICAgICAgaWYgKCFpc1Rha2VuT3Zlcikge1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKHRydWUpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNlbmRNZXNzYWdlKHRleHQsIG5ld0F0dGFjaG1lbnRzLCBleHRyYU1ldGFkYXRhLCByZUNhcHRjaGFUb2tlbik7XG5cbiAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKFtdKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUoKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOZXR3b3JrT3JTZXJ2ZXJFcnJvcihlcnJvcikpIHtcbiAgICAgICAgLy8gU2hvdyBjdXN0b20gc2VydmVyLXVuYXZhaWxhYmxlIG1lc3NhZ2VcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50Py5nZXRDb252ZXJzYXRpb25DcmVhdGVUaW1lKCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGNyZWF0ZVRpbWUgIT0gbnVsbCA/IG5vdyAtIGNyZWF0ZVRpbWUgOiAwO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gc3RhcnRUaW1lICsgMC4wMTtcbiAgICAgICAgY29uc3Qgc3BlY2lhbE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICAgICAgc3RhcnRfdGltZTogc3RhcnRUaW1lLFxuICAgICAgICAgIGVuZF90aW1lOiBlbmRUaW1lLFxuICAgICAgICAgIHNwZWFrZXI6ICdzcGVjaWFsJyxcbiAgICAgICAgICB0ZXh0OiBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UgPz8gREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfTUVTU0FHRSxcbiAgICAgICAgICAuLi4oc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsICYmIHtcbiAgICAgICAgICAgIGxpbmtVcmw6IHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgICAgIGxpbmtMYWJlbDogc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwgPz8gREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfQ09OVEFDVF9MQUJFTCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgc2V0TWVzc2FnZXMocHJldiA9PiBbLi4ucHJldiwgc3BlY2lhbE1lc3NhZ2VdKTtcbiAgICAgICAgLy8gRG9uJ3QgY2FsbCBvbkVycm9yIHNvIHRoZSB1c2VyIG9ubHkgc2VlcyBvdXIgY3VzdG9tIG1lc3NhZ2VcbiAgICAgIH0gZWxzZSBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtwcmVsb2FkZWRBdHRhY2htZW50cywgaXNUYWtlbk92ZXIsIGlzVG9rZW5FeHBpcmVkRXJyb3IsIHJlc2V0VG9Jbml0aWFsU3RhdGUsIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSwgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLCBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbF0pO1xuXG4gIGNvbnN0IHN0YXJ0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soYXN5bmMgKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RpbmcnKTtcbiAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgIFxuICAgICAgLy8gUmVzZXQgc3RhdGUgZm9yIG5ldyBjb252ZXJzYXRpb25cbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhbXSk7XG4gICAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfVxuICAgICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgICAgc2V0SXNUYWtlbk92ZXIoZmFsc2UpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuXG4gICAgICBjb25zdCBjb252SWQgPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnN0YXJ0Q29udmVyc2F0aW9uKHJlQ2FwdGNoYVRva2VuKTtcbiAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RlZCcpO1xuXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMpIHtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgIGlmIChxdWVyaWVzICYmIHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhxdWVyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEoKTtcbiAgICAgICAgc2V0V2VsY29tZVRpdGxlKHdlbGNvbWUudGl0bGUgfHwgbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcoKTtcbiAgICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKHRoaW5raW5nLnBocmFzZXMgfHwgW10pO1xuICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGEgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENoYXRJbnB1dE1ldGFkYXRhPy4oKTtcbiAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhtZXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKG1ldGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIC8vIEFkZCBmZWVkYmFjayB0byBhbiBhZ2VudCBtZXNzYWdlXG4gIGNvbnN0IGFkZEZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKG1lc3NhZ2VJZDogc3RyaW5nLCB2YWx1ZTogJ2dvb2QnIHwgJ2JhZCcsIGZlZWRiYWNrTWVzc2FnZT86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBzZW5kIGZlZWRiYWNrOiBDaGF0U2VydmljZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHNlbmQgZmVlZGJhY2s6IG1lc3NhZ2VJZCBpcyByZXF1aXJlZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuYWRkRmVlZGJhY2sobWVzc2FnZUlkLCB2YWx1ZSwgZmVlZGJhY2tNZXNzYWdlKTtcblxuICAgICAgICBjb25zdCBuZXdGZWVkYmFjazogTWVzc2FnZUZlZWRiYWNrID0ge1xuICAgICAgICAgIGZlZWRiYWNrOiB2YWx1ZSxcbiAgICAgICAgICBmZWVkYmFja19tZXNzYWdlOiBmZWVkYmFja01lc3NhZ2UsXG4gICAgICAgICAgZmVlZGJhY2tfdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0TWVzc2FnZXMocHJldiA9PlxuICAgICAgICAgIHByZXYubWFwKG0gPT4ge1xuICAgICAgICAgICAgLy8gTWF0Y2ggYnkgbWVzc2FnZV9pZCBvciBpZCBmaWVsZFxuICAgICAgICAgICAgY29uc3QgbXNnSWQgPSBtLm1lc3NhZ2VfaWQgfHwgKG0gYXMgYW55KS5pZDtcbiAgICAgICAgICAgIHJldHVybiBtc2dJZCA9PT0gbWVzc2FnZUlkXG4gICAgICAgICAgICAgID8geyAuLi5tLCBmZWVkYmFjazogWy4uLihtLmZlZWRiYWNrIHx8IFtdKSwgbmV3RmVlZGJhY2tdIH1cbiAgICAgICAgICAgICAgOiBtO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIGlzTG9hZGluZyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICB1cGxvYWRGaWxlLFxuICAgIHJlc2V0Q29udmVyc2F0aW9uLFxuICAgIHN0YXJ0Q29udmVyc2F0aW9uLFxuICAgIGNvbm5lY3Rpb25TdGF0ZSxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBwb3NzaWJsZVF1ZXJpZXMsXG4gICAgaXNUYWtlbk92ZXIsXG4gICAgaXNGaW5hbGl6ZWQsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBhZGRGZWVkYmFjayxcbiAgICB3ZWxjb21lVGl0bGUsXG4gICAgd2VsY29tZUltYWdlVXJsLFxuICAgIHdlbGNvbWVNZXNzYWdlLFxuICAgIHRoaW5raW5nUGhyYXNlcyxcbiAgICB0aGlua2luZ0RlbGF5TXMsXG4gICAgY2hhdElucHV0TWV0YWRhdGEsXG4gIH07XG59O1xuIl19
|
|
885
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBMEJ0RCxJQUFNLGtDQUFrQyxHQUN0QyxpRUFBaUUsQ0FBQztBQUNwRSxJQUFNLHdDQUF3QyxHQUFHLGlCQUFpQixDQUFDO0FBRW5FLFNBQVMsc0JBQXNCLENBQUMsS0FBVTs7SUFDeEMsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsSUFBTSxJQUFJLEdBQUcsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksQ0FBQztRQUN6QixJQUNFLElBQUksS0FBSyxhQUFhO1lBQ3RCLElBQUksS0FBSyxjQUFjO1lBQ3ZCLElBQUksS0FBSyxXQUFXO1lBQ3BCLElBQUksS0FBSyx3QkFBd0I7WUFFakMsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxDQUFDLHdFQUF3RTtJQUN2RixDQUFDO0lBQ0QsSUFBTSxNQUFNLEdBQUcsTUFBQSxLQUFLLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUM7SUFDdEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sT0FBTyxHQUFHLFVBQUMsRUFlVDtRQWRiLE9BQU8sYUFBQSxFQUNQLE1BQU0sWUFBQSxFQUNOLE1BQU0sWUFBQSxFQUNOLFFBQVEsY0FBQSxFQUNSLGFBQVksRUFBWixLQUFLLG1CQUFHLElBQUksS0FBQSxFQUNaLGVBQWUsRUFBZixPQUFPLG1CQUFHLEtBQUssS0FBQSxFQUNmLFFBQVEsY0FBQSxFQUNSLE9BQU8sYUFBQSxFQUNQLFVBQVUsZ0JBQUEsRUFDVixVQUFVLGdCQUFBLEVBQ1Ysd0JBQXdCLDhCQUFBLEVBQ3hCLDJCQUEyQixpQ0FBQSxFQUMzQiw2QkFBNkIsbUNBQUEsRUFDN0IsY0FBYyxvQkFBQTtJQUVSLElBQUEsS0FBMEIsUUFBUSxDQUFnQixFQUFFLENBQUMsRUFBcEQsUUFBUSxRQUFBLEVBQUUsV0FBVyxRQUErQixDQUFDO0lBQ3RELElBQUEsS0FBNEIsUUFBUSxDQUFVLEtBQUssQ0FBQyxFQUFuRCxTQUFTLFFBQUEsRUFBRSxZQUFZLFFBQTRCLENBQUM7SUFDckQsSUFBQSxLQUFrRCxRQUFRLENBRTlELEVBQUUsQ0FBQyxFQUZFLG9CQUFvQixRQUFBLEVBQUUsdUJBQXVCLFFBRS9DLENBQUM7SUFDQSxJQUFBLEtBQXdDLFFBQVEsQ0FFcEQsY0FBYyxDQUFDLEVBRlYsZUFBZSxRQUFBLEVBQUUsa0JBQWtCLFFBRXpCLENBQUM7SUFDWixJQUFBLEtBQW9DLFFBQVEsQ0FBVSxLQUFLLENBQUMsRUFBM0QsYUFBYSxRQUFBLEVBQUUsZ0JBQWdCLFFBQTRCLENBQUM7SUFDbkUsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFxQixJQUFJLENBQUMsQ0FBQztJQUNsRCxJQUFBLEtBQXNDLFFBQVEsQ0FBZ0IsSUFBSSxDQUFDLEVBQWxFLGNBQWMsUUFBQSxFQUFFLGlCQUFpQixRQUFpQyxDQUFDO0lBQ3BFLElBQUEsS0FBd0MsUUFBUSxDQUFXLEVBQUUsQ0FBQyxFQUE3RCxlQUFlLFFBQUEsRUFBRSxrQkFBa0IsUUFBMEIsQ0FBQztJQUMvRCxJQUFBLEtBQWtDLFFBQVEsQ0FBZ0IsSUFBSSxDQUFDLEVBQTlELFlBQVksUUFBQSxFQUFFLGVBQWUsUUFBaUMsQ0FBQztJQUNoRSxJQUFBLEtBQXdDLFFBQVEsQ0FBZ0IsSUFBSSxDQUFDLEVBQXBFLGVBQWUsUUFBQSxFQUFFLGtCQUFrQixRQUFpQyxDQUFDO0lBQ3RFLElBQUEsS0FBc0MsUUFBUSxDQUFnQixJQUFJLENBQUMsRUFBbEUsY0FBYyxRQUFBLEVBQUUsaUJBQWlCLFFBQWlDLENBQUM7SUFDcEUsSUFBQSxLQUF3QyxRQUFRLENBQVcsRUFBRSxDQUFDLEVBQTdELGVBQWUsUUFBQSxFQUFFLGtCQUFrQixRQUEwQixDQUFDO0lBQy9ELElBQUEsS0FBd0MsUUFBUSxDQUFTLElBQUksQ0FBQyxFQUE3RCxlQUFlLFFBQUEsRUFBRSxrQkFBa0IsUUFBMEIsQ0FBQztJQUMvRCxJQUFBLEtBQTRDLFFBQVEsQ0FFeEQsRUFBRSxDQUFDLEVBRkUsaUJBQWlCLFFBQUEsRUFBRSxvQkFBb0IsUUFFekMsQ0FBQztJQUNBLElBQUEsS0FBZ0MsUUFBUSxDQUFVLEtBQUssQ0FBQyxFQUF2RCxXQUFXLFFBQUEsRUFBRSxjQUFjLFFBQTRCLENBQUM7SUFDekQsSUFBQSxLQUFnQyxRQUFRLENBQVUsS0FBSyxDQUFDLEVBQXZELFdBQVcsUUFBQSxFQUFFLGNBQWMsUUFBNEIsQ0FBQztJQUUvRCxnREFBZ0Q7SUFDaEQsSUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQ2xDLFVBQUMsU0FBaUIsRUFBRSxNQUFxQjtRQUN2QyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pCLE9BQU8sMENBQW1DLFNBQVMsY0FBSSxNQUFNLENBQUUsQ0FBQztJQUNsRSxDQUFDLEVBQ0QsRUFBRSxDQUNILENBQUM7SUFFRixJQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FDbEMsVUFBQyxRQUF1QjtRQUN0QixJQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQSxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsSUFBSSxNQUFLLFVBQVUsRUFBdEIsQ0FBc0IsQ0FBQyxDQUFDO1FBQ3BFLElBQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFBLENBQUMsYUFBRCxDQUFDLHVCQUFELENBQUMsQ0FBRSxJQUFJLE1BQUssV0FBVyxFQUF2QixDQUF1QixDQUFDLENBQUM7UUFDdEUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9CLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsQyxDQUFDLEVBQ0QsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQ2pDLENBQUM7SUFFRiw2RUFBNkU7SUFDN0UsSUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUMsVUFBQyxLQUFVOztRQUNqRCxPQUFPLENBQUMsQ0FBQyxDQUNQLENBQUEsTUFBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsUUFBUSwwQ0FBRSxNQUFNLE1BQUssR0FBRzthQUMvQixNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxRQUFRLDBDQUFFLElBQUksQ0FBQTtZQUNyQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxvQkFBb0I7Z0JBQ2pELEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxvQkFBb0I7Z0JBQ3BELENBQUMsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRO29CQUN0QyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQ3hELENBQUM7SUFDSixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxvRUFBb0U7SUFDcEUsSUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUM7UUFDdEMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLHVCQUF1QixDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3JELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUM7Z0JBQ0gsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxTQUFTO1lBQ1gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUUvQyxrRUFBa0U7SUFDbEUsNEVBQTRFO0lBQzVFLElBQU0sY0FBYyxHQUFHLE9BQU8sQ0FDNUIsY0FBTSxPQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxFQUE5QixDQUE4QixFQUNwQyxDQUFDLFFBQVEsQ0FBQyxDQUNYLENBQUM7SUFDRixJQUFNLFdBQVcsR0FBRyxNQUFNLENBQVMsY0FBYyxDQUFDLENBQUM7SUFDbkQsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFTLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLElBQU0sYUFBYSxHQUFHLE1BQU0sQ0FBUyxNQUFNLENBQUMsQ0FBQztJQUM3QyxJQUFNLGFBQWEsR0FBRyxNQUFNLENBQXFCLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELElBQU0sWUFBWSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUM1QyxJQUFNLGNBQWMsR0FBRyxNQUFNLENBQVUsT0FBTyxDQUFDLENBQUM7SUFFaEQsdURBQXVEO0lBQ3ZELElBQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ25ELElBQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2xELHFIQUFxSDtJQUNySCxJQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUVyRCxrRUFBa0U7SUFDbEUsSUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLElBQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxJQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekMsSUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFakQsd0NBQXdDO0lBQ3hDLFNBQVMsQ0FBQztRQUNSLFVBQVUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQy9CLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFZCxTQUFTLENBQUM7UUFDUixhQUFhLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUNyQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBRWpCLFNBQVMsQ0FBQztRQUNSLGFBQWEsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO0lBQ3JDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFakIsU0FBUyxDQUFDO1FBQ1IsaUJBQWlCLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQztJQUM3QyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBRXJCLGtHQUFrRztJQUNsRyxTQUFTLENBQUM7O1FBQ1IsSUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLE9BQU8sS0FBSyxjQUFjLENBQUM7UUFDL0QsSUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUM7UUFDMUQsSUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUM7UUFDdkQsSUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUM7UUFDdkQsSUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUM7UUFDcEQsSUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUM7UUFDMUQsOEVBQThFO1FBQzlFLElBQU0sV0FBVyxHQUNmLENBQUMsY0FBYyxDQUFDLE9BQU87WUFDdkIsY0FBYztZQUNkLGFBQWE7WUFDYixhQUFhO1lBQ2IsWUFBWSxDQUFDO1FBRWYsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixjQUFjO1lBQ2QsSUFBSSxjQUFjO2dCQUFFLGNBQWMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3JELElBQUksYUFBYTtnQkFBRSxhQUFhLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUNsRCxJQUFJLGFBQWE7Z0JBQUUsYUFBYSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDbEQsSUFBSSxZQUFZO2dCQUFFLFlBQVksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQy9DLElBQUksY0FBYztnQkFBRSxjQUFjLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUNyRCxJQUFJLGVBQWU7Z0JBQUUsV0FBVyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUM7WUFFMUQseUNBQXlDO1lBQ3pDLElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMzQixjQUFjLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLGNBQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzNELGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BDLGNBQWMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUVELGNBQWMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQ3RDLE9BQU8sRUFDUCxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLE9BQU8sQ0FDUixDQUFDO1lBRUYsa0JBQWtCO1lBQ2xCLGNBQWMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsVUFBQyxPQUFvQjtnQkFDNUQsSUFBTSxpQkFBaUIseUJBQ2xCLE9BQU8sS0FDVixXQUFXLEVBQ1QsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO3dCQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO3dCQUMvQixDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FDMUIsQ0FBQztnQkFFRix5RUFBeUU7Z0JBQ3pFLElBQUksaUJBQWlCLENBQUMsV0FBVyxJQUFJLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdkUsdUJBQXVCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDNUYsQ0FBQztnQkFFRCxnQ0FBZ0M7Z0JBQ2hDLFdBQVcsQ0FBQyxVQUFDLFlBQVk7b0JBQ3ZCLGdFQUFnRTtvQkFDaEUsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDakMsSUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxVQUFVLEtBQUssaUJBQWlCLENBQUMsVUFBVSxFQUE3QyxDQUE2QyxDQUFDLENBQUM7d0JBQ3ZGLElBQUksTUFBTSxFQUFFLENBQUM7NEJBQ1gsT0FBTyxZQUFZLENBQUM7d0JBQ3RCLENBQUM7b0JBQ0gsQ0FBQztvQkFDRCx1Q0FBVyxZQUFZLFVBQUUsaUJBQWlCLFVBQUU7Z0JBQzlDLENBQUMsQ0FBQyxDQUFDO2dCQUVILDZEQUE2RDtnQkFDN0QsSUFDRSxpQkFBaUIsQ0FBQyxPQUFPLEtBQUssT0FBTztvQkFDckMsaUJBQWlCLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFDdkMsQ0FBQztvQkFDRCxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsY0FBYyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztnQkFDeEMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQixnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzFCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsY0FBYyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztnQkFDekMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQixnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzFCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsY0FBYyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxVQUFDLEtBQUs7Z0JBQ3JELGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDMUIsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILGNBQWMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsVUFBQyxJQUFJOztnQkFDaEQsZUFBZSxDQUFDLE1BQUEsSUFBSSxDQUFDLEtBQUssbUNBQUksSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLGtCQUFrQixDQUFDLE1BQUEsSUFBSSxDQUFDLFFBQVEsbUNBQUksSUFBSSxDQUFDLENBQUM7Z0JBQzFDLGlCQUFpQixDQUFDLE1BQUEsSUFBSSxDQUFDLE9BQU8sbUNBQUksSUFBSSxDQUFDLENBQUM7Z0JBQ3hDLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDNUQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxjQUFjLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUMvQyx3QkFBd0IsRUFDeEIsMkJBQTJCLEVBQzNCLDZCQUE2QixDQUM5QixDQUFDO1lBRUYsbURBQW1EO1lBQ25ELElBQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMxRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQixJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDO29CQUNyRCxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixjQUFjLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQzFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDWCxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELDJCQUEyQjtZQUMzQixJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDM0IsSUFBTSxPQUFPLEdBQUcsQ0FBQSxNQUFBLE1BQUEsY0FBYyxDQUFDLE9BQU8sRUFBQyxrQkFBa0Isa0RBQUksS0FBSSxFQUFFLENBQUM7Z0JBQ3BFLElBQUksT0FBTyxDQUFDLE1BQU07b0JBQUUsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2hELElBQU0sT0FBTyxHQUFHLE1BQUEsTUFBQSxjQUFjLENBQUMsT0FBTyxFQUFDLGNBQWMsa0RBQUksQ0FBQztnQkFDMUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDWixlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDdkMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDN0MsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztnQkFDRCxJQUFNLFFBQVEsR0FBRyxNQUFBLE1BQUEsY0FBYyxDQUFDLE9BQU8sRUFBQyxpQkFBaUIsa0RBQUksQ0FBQztnQkFDOUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUMzQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO2dCQUNELElBQU0sSUFBSSxHQUFHLE1BQUEsTUFBQSxjQUFjLENBQUMsT0FBTyxFQUFDLG9CQUFvQixrREFBSSxDQUFDO2dCQUM3RCxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3JFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUNELE1BQUEsaUJBQWlCLENBQUMsT0FBTyxrRUFBRyxFQUFFLGlCQUFpQixFQUFFLElBQUksYUFBSixJQUFJLGNBQUosSUFBSSxHQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQywrQ0FBK0M7WUFDL0MsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsV0FBVyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUM7Z0JBQ3JDLGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDO1FBRUQseUVBQXlFO1FBQ3pFLElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNCLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7Z0JBQ3hDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckIsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMxQixhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILGNBQWMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3pDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckIsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMxQixhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILGNBQWMsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQy9DLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0IsNkJBQTZCLENBQzlCLENBQUM7UUFDSixDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLE9BQU87WUFDTCwwREFBMEQ7UUFDNUQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxFQUFFO1FBQ0QsT0FBTztRQUNQLE1BQU07UUFDTixNQUFNO1FBQ04sY0FBYztRQUNkLFFBQVE7UUFDUixLQUFLO1FBQ0wsT0FBTztRQUNQLHdCQUF3QjtRQUN4QiwyQkFBMkI7UUFDM0IsNkJBQTZCO0tBQzlCLENBQUMsQ0FBQztJQUVILHdFQUF3RTtJQUN4RSxTQUFTLENBQUM7UUFDUixJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQixjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVmLGdEQUFnRDtJQUNoRCxTQUFTLENBQUM7UUFDUixJQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLHVCQUF1QixDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDcEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxJQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLElBQU0sTUFBTSxHQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUUvRCxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEIsd0RBQXdEO1lBQ3hELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFSLElBQUksRUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQW5DLENBQW1DLENBQUMsQ0FDMUQsQ0FBQztnQkFFRix3REFBd0Q7Z0JBQ3hELHVCQUF1QixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7WUFDNUUsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLHVCQUF1QixDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBRS9DLCtDQUErQztJQUMvQyxTQUFTLENBQUM7UUFDUixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRWYsb0NBQW9DO0lBQ3BDLFNBQVMsQ0FBQztRQUNSLElBQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU87UUFDakIsSUFBSSxDQUFDO1lBQ0gsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsU0FBUztRQUNYLENBQUM7SUFDSCxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFFekQsNkZBQTZGO0lBQzdGLGlDQUFpQztJQUNqQyw2REFBNkQ7SUFDN0QsZ0RBQWdEO0lBQ2hELElBQU0sNkJBQTZCLEdBQUcsSUFBSSxDQUFDO0lBQzNDLElBQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLElBQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBRXhDLFNBQVMsQ0FBQztRQUNSLElBQUksS0FBSyxJQUFJLENBQUMsY0FBYyxJQUFJLFdBQVc7WUFBRSxPQUFPO1FBQ3BELElBQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBRWpCLHlFQUF5RTtRQUN6RSxvQkFBb0IsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLHFCQUFxQixDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFdEMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksU0FBUyxHQUFrQixJQUFJLENBQUM7UUFFcEMsSUFBTSxZQUFZLEdBQUcsVUFBQyxPQUFlO1lBQ25DLElBQUksU0FBUztnQkFBRSxPQUFPO1lBQ3RCLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUM7UUFFRixJQUFNLElBQUksR0FBRzs7Ozs7d0JBQ1gsSUFBSSxTQUFTOzRCQUFFLHNCQUFPOzs7O3dCQUVhLHFCQUFNLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxFQUFBOzt3QkFBakUsS0FBMkIsU0FBc0MsRUFBL0Qsb0JBQU0sRUFBRSxZQUFZLGtCQUFBO3dCQUM1QixJQUFJLFNBQVM7NEJBQUUsc0JBQU87d0JBRXRCLG1DQUFtQzt3QkFDbkMsd0JBQXdCLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQzt3QkFJL0IseUJBQXVCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUVoRixjQUFjLEdBQUcsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUMsQ0FBQzs0QkFDbkQsSUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFFLENBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQzs0QkFDMUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0NBQUUsT0FBTyxLQUFLLENBQUM7NEJBQ25ELE9BQU8sRUFBRSxHQUFHLHNCQUFvQixDQUFDO3dCQUNuQyxDQUFDLENBQUMsQ0FBQzt3QkFFSCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ3hCLGdCQUFjLFVBQUMsT0FBZTtnQ0FDbEMsSUFBSSxPQUFPLEtBQUssVUFBVTtvQ0FBRSxPQUFPLFVBQVUsQ0FBQztnQ0FDOUMsSUFBSSxPQUFPLEtBQUssT0FBTztvQ0FBRSxPQUFPLE9BQU8sQ0FBQztnQ0FDeEMsT0FBTyxTQUFTLENBQUM7NEJBQ25CLENBQUMsQ0FBQzs0QkFFSSxTQUFPLFVBQUMsQ0FBd0I7Z0NBQ3BDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVO29DQUFFLE9BQU8sc0JBQXNCLENBQUM7Z0NBQ3pELElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxXQUFXO29DQUFFLE9BQU8sd0JBQXdCLENBQUM7Z0NBQzVELE9BQVEsQ0FBUyxDQUFDLElBQUksQ0FBQzs0QkFDekIsQ0FBQyxDQUFDOzRCQUVJLGdCQUE2QixjQUFjLENBQUMsR0FBRyxDQUFDLFVBQUMsQ0FBQzs7Z0NBQUssT0FBQSxDQUFDO29DQUM1RCxVQUFVLEVBQUcsQ0FBUyxDQUFDLEVBQUU7b0NBQ3pCLFdBQVcsRUFBRSxNQUFNLENBQUUsQ0FBUyxDQUFDLFdBQVcsQ0FBQztvQ0FDM0MsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFDLENBQVMsQ0FBQyxVQUFVLG1DQUFJLENBQUMsQ0FBQztvQ0FDOUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFDLENBQVMsQ0FBQyxRQUFRLG1DQUFJLENBQUMsQ0FBQztvQ0FDMUMsT0FBTyxFQUFFLGFBQVcsQ0FBRSxDQUFTLENBQUMsT0FBTyxDQUFDO29DQUN4QyxJQUFJLEVBQUUsTUFBSSxDQUFDLENBQUMsQ0FBQztvQ0FDYixJQUFJLEVBQUcsQ0FBUyxDQUFDLElBQUk7b0NBQ3JCLFFBQVEsRUFBRyxDQUFTLENBQUMsUUFBUTtpQ0FDOUIsQ0FBQyxDQUFBOzZCQUFBLENBQUMsQ0FBQzs0QkFFSiw0R0FBNEc7NEJBQzVHLElBQUksYUFBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDM0IsV0FBVyxDQUFDLFVBQUMsWUFBWTtvQ0FDdkIsSUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQ3pCLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsVUFBVSxFQUFaLENBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FDdEQsQ0FBQztvQ0FDRixJQUFNLEtBQUssR0FBRyxhQUFXLENBQUMsTUFBTSxDQUM5QixVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQXRELENBQXNELENBQzlELENBQUM7b0NBQ0YsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7d0NBQUUsT0FBTyxZQUFZLENBQUM7b0NBQzVDLElBQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FDeEMsVUFBQyxHQUFHLEVBQUUsR0FBRzt3Q0FDUCxPQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQzs0Q0FDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUM7NENBQ2hDLENBQUMsQ0FBQyxHQUFHO29DQUZQLENBRU8sRUFDVCxzQkFBb0IsQ0FDckIsQ0FBQztvQ0FFRix1QkFBdUIsQ0FBQyxPQUFPLEdBQUcscUJBQXFCLENBQUM7b0NBQ3hELHVDQUFXLFlBQVksU0FBSyxLQUFLLFFBQUU7Z0NBQ3JDLENBQUMsQ0FBQyxDQUFDOzRCQUNMLENBQUM7NEJBR0ssa0JBQWtCLEdBQUcsYUFBVyxDQUFDLElBQUksQ0FDekMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBckIsQ0FBcUIsQ0FDN0IsQ0FBQzs0QkFDSSxtQkFBbUIsR0FBRyxhQUFXLENBQUMsSUFBSSxDQUMxQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUF0QixDQUFzQixDQUM5QixDQUFDOzRCQUVGLElBQUksQ0FBQyxRQUFNLEtBQUssV0FBVyxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQ0FDdEYscUJBQXFCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQ0FDckMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUN2QixDQUFDO2lDQUFNLElBQUksQ0FBQyxRQUFNLEtBQUssVUFBVSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQ0FDMUYsb0JBQW9CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQ0FDcEMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUN2QixDQUFDO3dCQUNILENBQUM7NkJBQU0sQ0FBQzs0QkFDTiwrRkFBK0Y7NEJBQy9GLElBQUksUUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxDQUFDO2dDQUM3RCxxQkFBcUIsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dDQUNyQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztnQ0FDbEMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUN2QixDQUFDO2lDQUFNLElBQUksUUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDO2dDQUNsRSxvQkFBb0IsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dDQUNwQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQ0FDN0IsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUN2QixDQUFDO3dCQUNILENBQUM7d0JBRUQsSUFBSSxRQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7NEJBQzNCLHVFQUF1RTs0QkFDdkUsc0JBQU87d0JBQ1QsQ0FBQzt3QkFRSyxZQUFZLEdBQUcsMEJBQTBCLENBQUM7d0JBQ2hELG9CQUFvQixDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7d0JBQzVDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQzs7Ozt3QkFFM0IsSUFBSSxTQUFTOzRCQUFFLHNCQUFPO3dCQUN0QixrRUFBa0U7d0JBQ2xFLHdCQUF3QixDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7d0JBQ3RDLElBQUksd0JBQXdCLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDOzRCQUMxQyxzQkFBTzt3QkFDVCxDQUFDO3dCQUNLLFVBQVUsR0FDZCxvQkFBb0IsQ0FBQyxPQUFPLElBQUksNkJBQTZCLENBQUM7d0JBQ2hFLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Ozs7YUFFNUIsQ0FBQztRQUVGLDZEQUE2RDtRQUM3RCx3QkFBd0IsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLG9CQUFvQixDQUFDLE9BQU8sR0FBRyw2QkFBNkIsQ0FBQztRQUU3RCxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQztRQUVELE9BQU87WUFDTCxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN2QixZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFbEQscUJBQXFCO0lBQ3JCLElBQU0saUJBQWlCLEdBQUcsV0FBVyxDQUNuQyxVQUFPLGNBQW1DOzs7Ozs7b0JBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQzVCLHNCQUFPO29CQUNULENBQUM7b0JBRUQsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ2pDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbkIsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNoQixrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDdkIsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDekIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3hCLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN2QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDekIsdUJBQXVCLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztvQkFDOUIsR0FBRyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztvQkFDckQsSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFDUixZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvQixDQUFDO29CQUNELGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEIsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0QixnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7OztvQkFHdEIsNkNBQTZDO29CQUM3QyxjQUFjLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBSTdDLHFCQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLEVBQUE7O29CQUQxRCxNQUFNLEdBQ1YsU0FBOEQ7b0JBQ2hFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMxQixrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFFaEMseUNBQXlDO29CQUN6QyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDeEMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDNUQsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDbEMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzlCLENBQUM7b0JBQ0gsQ0FBQztvQkFDRCw0QkFBNEI7b0JBQzVCLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDcEMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQ3hELGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO3dCQUN2QyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDO3dCQUM3QyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDO29CQUM3QyxDQUFDO29CQUNELElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUN2QyxRQUFRLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUM1RCxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUMzQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDO29CQUMvQyxDQUFDO29CQUNLLElBQUksR0FBRyxNQUFBLE1BQUEsY0FBYyxDQUFDLE9BQU8sRUFBQyxvQkFBb0Isa0RBQUksQ0FBQztvQkFDN0QsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUNyRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0IsQ0FBQztvQkFDRCxNQUFBLGlCQUFpQixDQUFDLE9BQU8sa0VBQUc7d0JBQzFCLGlCQUFpQixFQUNmLE1BQUEsTUFBQSxNQUFBLGNBQWMsQ0FBQyxPQUFPLEVBQUMsb0JBQW9CLGtEQUFJLG1DQUFJLEVBQUU7cUJBQ3hELENBQUMsQ0FBQzs7OztvQkFFSCxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDbkMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hCLElBQUksVUFBVSxDQUFDLE9BQU8sSUFBSSxPQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7d0JBQ2pELFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBSyxDQUFDLENBQUM7b0JBQzVCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixTQUFTO29CQUNYLENBQUM7OztvQkFFRCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7O1NBRXZCLEVBQ0QsRUFBRSxDQUNILENBQUM7SUFFRixJQUFNLFVBQVUsR0FBRyxXQUFXLENBQzVCLFVBQU8sSUFBVTs7Ozs7O29CQUNULGNBQWMsR0FBRyxNQUFBLGNBQWMsQ0FBQyxPQUFPLDBDQUFFLGlCQUFpQixFQUFFLENBQUM7b0JBQ25FLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDcEIsc0JBQU8sSUFBSSxFQUFDO29CQUNkLENBQUM7Ozs7b0JBR3NCLHFCQUFNLENBQUEsTUFBQSxjQUFjLENBQUMsT0FBTywwQ0FBRSxVQUFVLENBQzNELGNBQWMsRUFDZCxJQUFJLENBQ0wsQ0FBQSxFQUFBOztvQkFISyxZQUFZLEdBQUcsU0FHcEI7b0JBR0ssUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLFlBQWEsQ0FBQyxRQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUUxRCxlQUF5Qjt3QkFDN0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO3dCQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsR0FBRyxFQUFFLFFBQVE7d0JBQ2IsT0FBTyxFQUFFLFlBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxPQUFPO3FCQUMvQixDQUFDO29CQUVGLHVCQUF1QixDQUFDLFVBQUMsSUFBSSxJQUFLLHVDQUFJLElBQUksVUFBRSxZQUFVLFdBQXBCLENBQXFCLENBQUMsQ0FBQztvQkFDekQsc0JBQU8sWUFBVSxFQUFDOzs7b0JBRWxCLElBQUksbUJBQW1CLENBQUMsT0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDL0IsbUJBQW1CLEVBQUUsQ0FBQztvQkFDeEIsQ0FBQztvQkFDRCxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDdkIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFjLENBQUMsQ0FBQztvQkFDckMsQ0FBQztvQkFDRCxzQkFBTyxJQUFJLEVBQUM7Ozs7U0FFZixFQUNEO1FBQ0UsTUFBTTtRQUNOLGNBQWM7UUFDZCxnQkFBZ0I7UUFDaEIsbUJBQW1CO1FBQ25CLG1CQUFtQjtLQUNwQixDQUNGLENBQUM7SUFFRixlQUFlO0lBQ2YsSUFBTSxXQUFXLEdBQUcsV0FBVyxDQUM3Qjs7Ozs7MEZBQ0UsSUFBWSxFQUNaLEtBQWtCLEVBQ2xCLGFBQW1DLEVBQ25DLGNBQXVCOzs7WUFGdkIsc0JBQUEsRUFBQSxVQUFrQjs7Ozt3QkFJbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO3dCQUNsRCxDQUFDOzs7O3dCQUdDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFFYixjQUFjLEdBQWlCLEVBQUUsQ0FBQzt3QkFFeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUNmLGFBQWEsR0FBRyxLQUFLO2lDQUN4QixHQUFHLENBQUMsVUFBQyxDQUFDO2dDQUNMLE9BQUEsb0JBQW9CLENBQUMsSUFBSSxDQUN2QixVQUFDLEVBQUUsSUFBSyxPQUFBLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQXhDLENBQXdDLENBQ2pEOzRCQUZELENBRUMsQ0FDRjtpQ0FDQSxNQUFNLENBQUMsT0FBTyxDQUFpQixDQUFDOzRCQUNuQyxjQUFjLENBQUMsSUFBSSxPQUFuQixjQUFjLEVBQVMsYUFBYSxFQUFFO3dCQUN4QyxDQUFDO3dCQUVELHlGQUF5Rjt3QkFDekYsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUNqQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDekIsQ0FBQzt3QkFFRCxxQkFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FDdEMsSUFBSSxFQUNKLGNBQWMsRUFDZCxhQUFhLEVBQ2IsY0FBYyxDQUNmLEVBQUE7O3dCQUxELFNBS0MsQ0FBQzt3QkFFRix1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozt3QkFFNUIsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hCLElBQUksbUJBQW1CLENBQUMsT0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDL0IsbUJBQW1CLEVBQUUsQ0FBQzt3QkFDeEIsQ0FBQzs2QkFBTSxJQUFJLHNCQUFzQixDQUFDLE9BQUssQ0FBQyxFQUFFLENBQUM7NEJBRW5DLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDOzRCQUN4QixVQUFVLEdBQ2QsTUFBQSxjQUFjLENBQUMsT0FBTywwQ0FBRSx5QkFBeUIsRUFBRSxDQUFDOzRCQUNoRCxTQUFTLEdBQUcsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN0RCxPQUFPLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQzs0QkFDM0IsOEJBQ0osV0FBVyxFQUFFLEdBQUcsRUFDaEIsVUFBVSxFQUFFLFNBQVMsRUFDckIsUUFBUSxFQUFFLE9BQU8sRUFDakIsT0FBTyxFQUFFLFNBQVMsRUFDbEIsSUFBSSxFQUNGLHdCQUF3QixhQUF4Qix3QkFBd0IsY0FBeEIsd0JBQXdCLEdBQUksa0NBQWtDLElBQzdELENBQUMsMkJBQTJCLElBQUk7Z0NBQ2pDLE9BQU8sRUFBRSwyQkFBMkI7Z0NBQ3BDLFNBQVMsRUFDUCw2QkFBNkIsYUFBN0IsNkJBQTZCLGNBQTdCLDZCQUE2QixHQUM3Qix3Q0FBd0M7NkJBQzNDLENBQUMsQ0FDSCxDQUFDOzRCQUVGLFdBQVcsQ0FBQyxVQUFDLElBQUksSUFBSyx1Q0FBSSxJQUFJLFVBQUUsZ0JBQWMsV0FBeEIsQ0FBeUIsQ0FBQyxDQUFDOzRCQUNqRCw4REFBOEQ7d0JBQ2hFLENBQUM7NkJBQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxJQUFJLE9BQUssWUFBWSxLQUFLLEVBQUUsQ0FBQzs0QkFDeEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFLLENBQUMsQ0FBQzt3QkFDNUIsQ0FBQzs7O3dCQUVELFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O0tBRXZCLEVBQ0Q7UUFDRSxvQkFBb0I7UUFDcEIsV0FBVztRQUNYLG1CQUFtQjtRQUNuQixtQkFBbUI7UUFDbkIsd0JBQXdCO1FBQ3hCLDJCQUEyQjtRQUMzQiw2QkFBNkI7S0FDOUIsQ0FDRixDQUFDO0lBRUYsSUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQ25DLFVBQU8sY0FBbUM7Ozs7OztvQkFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDNUIsc0JBQU87b0JBQ1QsQ0FBQzs7OztvQkFFQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDakMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUVuQixtQ0FBbUM7b0JBQ25DLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEIsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2pCLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3JELElBQUksR0FBRyxFQUFFLENBQUM7d0JBQ1IsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDL0IsQ0FBQztvQkFDRCxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RCLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEIsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hCLGNBQWMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFHN0MscUJBQU0sY0FBYyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsRUFBQTs7b0JBRDFELE1BQU0sR0FDVixTQUE4RDtvQkFDaEUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzFCLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUVoQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDeEMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDNUQsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDbEMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzlCLENBQUM7b0JBQ0gsQ0FBQztvQkFDRCxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQ3BDLE9BQU8sR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN4RCxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQzt3QkFDdkMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQzt3QkFDN0MsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztvQkFDRCxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3QkFDdkMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3QkFDNUQsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDM0Msa0JBQWtCLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDL0MsQ0FBQztvQkFDSyxJQUFJLEdBQUcsTUFBQSxNQUFBLGNBQWMsQ0FBQyxPQUFPLEVBQUMsb0JBQW9CLGtEQUFJLENBQUM7b0JBQzdELElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDckUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdCLENBQUM7b0JBQ0QsTUFBQSxpQkFBaUIsQ0FBQyxPQUFPLGtFQUFHO3dCQUMxQixpQkFBaUIsRUFDZixNQUFBLE1BQUEsTUFBQSxjQUFjLENBQUMsT0FBTyxFQUFDLG9CQUFvQixrREFBSSxtQ0FBSSxFQUFFO3FCQUN4RCxDQUFDLENBQUM7Ozs7b0JBRUgsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQ25DLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN4QixJQUFJLFVBQVUsQ0FBQyxPQUFPLElBQUksT0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO3dCQUNqRCxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQUssQ0FBQyxDQUFDO29CQUM1QixDQUFDO3lCQUFNLENBQUM7d0JBQ04sU0FBUztvQkFDWCxDQUFDOzs7b0JBRUQsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7OztTQUV2QixFQUNELEVBQUUsQ0FDSCxDQUFDO0lBRUYsbUNBQW1DO0lBQ25DLElBQU0sV0FBVyxHQUFHLFdBQVcsQ0FDN0IsVUFDRSxTQUFpQixFQUNqQixLQUFxQixFQUNyQixlQUF3Qjs7Ozs7b0JBRXhCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQzt3QkFDbkUsc0JBQU87b0JBQ1QsQ0FBQztvQkFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO3dCQUM3RCxzQkFBTztvQkFDVCxDQUFDOzs7O29CQUdDLHFCQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUN0QyxTQUFTLEVBQ1QsS0FBSyxFQUNMLGVBQWUsQ0FDaEIsRUFBQTs7b0JBSkQsU0FJQyxDQUFDO29CQUVJLGdCQUErQjt3QkFDbkMsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsZ0JBQWdCLEVBQUUsZUFBZTt3QkFDakMsa0JBQWtCLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7cUJBQzdDLENBQUM7b0JBRUYsV0FBVyxDQUFDLFVBQUMsSUFBSTt3QkFDZixPQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDOzRCQUNULGtDQUFrQzs0QkFDbEMsSUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSyxDQUFTLENBQUMsRUFBRSxDQUFDOzRCQUM1QyxPQUFPLEtBQUssS0FBSyxTQUFTO2dDQUN4QixDQUFDLHVCQUFNLENBQUMsS0FBRSxRQUFRLGtDQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsVUFBRSxhQUFXLGFBQ3ZELENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ1IsQ0FBQyxDQUFDO29CQU5GLENBTUUsQ0FDSCxDQUFDOzs7O29CQUVGLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN2QixVQUFVLENBQUMsT0FBTyxDQUFDLE9BQWMsQ0FBQyxDQUFDO29CQUNyQyxDQUFDOzs7OztTQUVKLEVBQ0QsRUFBRSxDQUNILENBQUM7SUFFRixPQUFPO1FBQ0wsUUFBUSxVQUFBO1FBQ1IsU0FBUyxXQUFBO1FBQ1QsV0FBVyxhQUFBO1FBQ1gsVUFBVSxZQUFBO1FBQ1YsaUJBQWlCLG1CQUFBO1FBQ2pCLGlCQUFpQixtQkFBQTtRQUNqQixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLGVBQWUsaUJBQUE7UUFDZixXQUFXLGFBQUE7UUFDWCxXQUFXLGFBQUE7UUFDWCxhQUFhLGVBQUE7UUFDYixXQUFXLGFBQUE7UUFDWCxZQUFZLGNBQUE7UUFDWixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLGVBQWUsaUJBQUE7UUFDZixlQUFlLGlCQUFBO1FBQ2YsaUJBQWlCLG1CQUFBO0tBQ2xCLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9jaGF0U2VydmljZVwiO1xuaW1wb3J0IHtcbiAgQ2hhdE1lc3NhZ2UsXG4gIEF0dGFjaG1lbnQsXG4gIE1lc3NhZ2VGZWVkYmFjayxcbiAgSW5Qcm9ncmVzc1BvbGxNZXNzYWdlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VDaGF0UHJvcHMge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xuICB0ZW5hbnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLy8gIElmIGZhbHNlLCB0aGUgY2hhdCB3aWxsIHJ1biBpbiBIVFRQLW9ubHkgbW9kZSAobm8gV2ViU29ja2V0IGNvbm5lY3Rpb24pLlxuICB1c2VXcz86IGJvb2xlYW47XG4gIHVzZVBvbGw/OiBib29sZWFuO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgb25FcnJvcj86IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIG9uVGFrZW92ZXI/OiAoKSA9PiB2b2lkO1xuICBvbkZpbmFsaXplPzogKCkgPT4gdm9pZDtcbiAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlPzogc3RyaW5nOyAvLyBDdXN0b20gbWVzc2FnZSB3aGVuIHNlcnZlciBpcyBkb3duXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybD86IHN0cmluZzsgLy8gT3B0aW9uYWwgVVJMIGZvciBjb250YWN0L3N1cHBvcnRcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWw/OiBzdHJpbmc7IC8vIExhYmVsIGZvciB0aGUgY29udGFjdCBsaW5rXG4gIG9uQ29uZmlnTG9hZGVkPzogKHByb3BzOiB7IGNoYXRJbnB1dE1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PiB9KSA9PiB2b2lkOyAvLyBDYWxsYmFjayBmb3Igd2hlbiB0aGUgY2hhdCBpbnB1dCBtZXRhZGF0YSBpcyBsb2FkZWRcbn1cblxuY29uc3QgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfTUVTU0FHRSA9XG4gIFwiVGhlIHNlcnZpY2UgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCI7XG5jb25zdCBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9DT05UQUNUX0xBQkVMID0gXCJDb250YWN0IHN1cHBvcnRcIjtcblxuZnVuY3Rpb24gaXNOZXR3b3JrT3JTZXJ2ZXJFcnJvcihlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gIC8vIE5vIHJlc3BvbnNlID0gbmV0d29yayBlcnJvclxuICBpZiAoIWVycm9yLnJlc3BvbnNlKSB7XG4gICAgY29uc3QgY29kZSA9IGVycm9yPy5jb2RlO1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IFwiRVJSX05FVFdPUktcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFQ09OTlJFRlVTRURcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFVElNRURPVVRcIiB8fFxuICAgICAgY29kZSA9PT0gXCJFUlJfQ09OTkVDVElPTl9SRUZVU0VEXCJcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gYW55IHJlcXVlc3QgZXJyb3Igd2l0aG91dCByZXNwb25zZSBpcyB0cmVhdGVkIGFzIHNlcnZlci9uZXR3b3JrIGlzc3VlXG4gIH1cbiAgY29uc3Qgc3RhdHVzID0gZXJyb3IucmVzcG9uc2U/LnN0YXR1cztcbiAgcmV0dXJuIHR5cGVvZiBzdGF0dXMgPT09IFwibnVtYmVyXCIgJiYgc3RhdHVzID49IDUwMDtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXQgPSAoe1xuICBiYXNlVXJsLFxuICBhcGlLZXksXG4gIHRlbmFudCxcbiAgbWV0YWRhdGEsXG4gIHVzZVdzID0gdHJ1ZSxcbiAgdXNlUG9sbCA9IGZhbHNlLFxuICBsYW5ndWFnZSxcbiAgb25FcnJvcixcbiAgb25UYWtlb3ZlcixcbiAgb25GaW5hbGl6ZSxcbiAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICBvbkNvbmZpZ0xvYWRlZCxcbn06IFVzZUNoYXRQcm9wcykgPT4ge1xuICBjb25zdCBbbWVzc2FnZXMsIHNldE1lc3NhZ2VzXSA9IHVzZVN0YXRlPENoYXRNZXNzYWdlW10+KFtdKTtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW3ByZWxvYWRlZEF0dGFjaG1lbnRzLCBzZXRQcmVsb2FkZWRBdHRhY2htZW50c10gPSB1c2VTdGF0ZTxcbiAgICBBdHRhY2htZW50W11cbiAgPihbXSk7XG4gIGNvbnN0IFtjb25uZWN0aW9uU3RhdGUsIHNldENvbm5lY3Rpb25TdGF0ZV0gPSB1c2VTdGF0ZTxcbiAgICBcImNvbm5lY3RpbmdcIiB8IFwiY29ubmVjdGVkXCIgfCBcImRpc2Nvbm5lY3RlZFwiXG4gID4oXCJkaXNjb25uZWN0ZWRcIik7XG4gIGNvbnN0IFtpc0FnZW50VHlwaW5nLCBzZXRJc0FnZW50VHlwaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgY2hhdFNlcnZpY2VSZWYgPSB1c2VSZWY8Q2hhdFNlcnZpY2UgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2NvbnZlcnNhdGlvbklkLCBzZXRDb252ZXJzYXRpb25JZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3Bvc3NpYmxlUXVlcmllcywgc2V0UG9zc2libGVRdWVyaWVzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt3ZWxjb21lVGl0bGUsIHNldFdlbGNvbWVUaXRsZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVJbWFnZVVybCwgc2V0V2VsY29tZUltYWdlVXJsXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbd2VsY29tZU1lc3NhZ2UsIHNldFdlbGNvbWVNZXNzYWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbdGhpbmtpbmdQaHJhc2VzLCBzZXRUaGlua2luZ1BocmFzZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTtcbiAgY29uc3QgW3RoaW5raW5nRGVsYXlNcywgc2V0VGhpbmtpbmdEZWxheU1zXSA9IHVzZVN0YXRlPG51bWJlcj4oMTAwMCk7XG4gIGNvbnN0IFtjaGF0SW5wdXRNZXRhZGF0YSwgc2V0Q2hhdElucHV0TWV0YWRhdGFdID0gdXNlU3RhdGU8XG4gICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgPih7fSk7XG4gIGNvbnN0IFtpc1Rha2VuT3Zlciwgc2V0SXNUYWtlbk92ZXJdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbaXNGaW5hbGl6ZWQsIHNldElzRmluYWxpemVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyBTY29wZWQgbWVzc2FnZXMga2V5IGZvciBhcGlLZXksIGNvbnZlcnNhdGlvSWRcbiAgY29uc3QgYnVpbGRNZXNzYWdlc0tleSA9IHVzZUNhbGxiYWNrKFxuICAgIChhcGlLZXlWYWw6IHN0cmluZywgY29udklkOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoIWNvbnZJZCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gYGdlbmFzc2lzdF9jb252ZXJzYXRpb25fbWVzc2FnZXM6JHthcGlLZXlWYWx9OiR7Y29udklkfWA7XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcblxuICBjb25zdCB2YWxpZGF0ZU1lc3NhZ2VzID0gdXNlQ2FsbGJhY2soXG4gICAgKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKSA9PiB7XG4gICAgICBjb25zdCBoYXNUYWtlT3Zlck1zZyA9IG1lc3NhZ2VzLnNvbWUoKG0pID0+IG0/LnR5cGUgPT09IFwidGFrZW92ZXJcIik7XG4gICAgICBjb25zdCBoYXNGaW5hbGl6ZWRNc2cgPSBtZXNzYWdlcy5zb21lKChtKSA9PiBtPy50eXBlID09PSBcImZpbmFsaXplZFwiKTtcbiAgICAgIHNldElzVGFrZW5PdmVyKGhhc1Rha2VPdmVyTXNnKTtcbiAgICAgIHNldElzRmluYWxpemVkKGhhc0ZpbmFsaXplZE1zZyk7XG4gICAgfSxcbiAgICBbc2V0SXNUYWtlbk92ZXIsIHNldElzRmluYWxpemVkXSxcbiAgKTtcblxuICAvLyBDaGVjayBpZiBhbiBlcnJvciBpcyBhIHRva2VuIGV4cGlyYXRpb24gZXJyb3IgKDQwMSArIFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIpXG4gIGNvbnN0IGlzVG9rZW5FeHBpcmVkRXJyb3IgPSB1c2VDYWxsYmFjaygoZXJyb3I6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIGVycm9yPy5yZXNwb25zZT8uc3RhdHVzID09PSA0MDEgJiZcbiAgICAgIGVycm9yPy5yZXNwb25zZT8uZGF0YSAmJlxuICAgICAgKGVycm9yLnJlc3BvbnNlLmRhdGEuZXJyb3IgPT09IFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIgfHxcbiAgICAgICAgZXJyb3IucmVzcG9uc2UuZGF0YS5tZXNzYWdlID09PSBcIlRva2VuIGhhcyBleHBpcmVkLlwiIHx8XG4gICAgICAgICh0eXBlb2YgZXJyb3IucmVzcG9uc2UuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEuaW5jbHVkZXMoXCJUb2tlbiBoYXMgZXhwaXJlZFwiKSkpXG4gICAgKTtcbiAgfSwgW10pO1xuXG4gIC8vIFJlc2V0IGNvbnZlcnNhdGlvbiBzdGF0ZSB0byBpbml0aWFsIChlLmcuIGFmdGVyIHRva2VuIGV4cGlyYXRpb24pXG4gIGNvbnN0IHJlc2V0VG9Jbml0aWFsU3RhdGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0Q29udmVyc2F0aW9uSWQobnVsbCk7XG4gICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJkaXNjb25uZWN0ZWRcIik7XG4gICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgIHNldFdlbGNvbWVJbWFnZVVybChudWxsKTtcbiAgICBzZXRXZWxjb21lTWVzc2FnZShudWxsKTtcbiAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgIHNldFRoaW5raW5nUGhyYXNlcyhbXSk7XG4gICAgc2V0VGhpbmtpbmdEZWxheU1zKDEwMDApO1xuICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKHt9KTtcbiAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IDA7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9XG4gIH0sIFthcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gRGVlcCBjb21wYXJlIG1ldGFkYXRhIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtaW5pdGlhbGl6YXRpb25zXG4gIC8vIE9ubHkgcmUtaW5pdGlhbGl6ZSBpZiBtZXRhZGF0YSBhY3R1YWxseSBjaGFuZ2VzIChieSB2YWx1ZSwgbm90IHJlZmVyZW5jZSlcbiAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB1c2VNZW1vKFxuICAgICgpID0+IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhIHx8IHt9KSxcbiAgICBbbWV0YWRhdGFdLFxuICApO1xuICBjb25zdCBtZXRhZGF0YVJlZiA9IHVzZVJlZjxzdHJpbmc+KG1ldGFkYXRhU3RyaW5nKTtcbiAgY29uc3QgcHJldkJhc2VVcmxSZWYgPSB1c2VSZWY8c3RyaW5nPihiYXNlVXJsKTtcbiAgY29uc3QgcHJldkFwaUtleVJlZiA9IHVzZVJlZjxzdHJpbmc+KGFwaUtleSk7XG4gIGNvbnN0IHByZXZUZW5hbnRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih0ZW5hbnQpO1xuICBjb25zdCBwcmV2VXNlV3NSZWYgPSB1c2VSZWY8Ym9vbGVhbj4odXNlV3MpO1xuICBjb25zdCBwcmV2VXNlUG9sbFJlZiA9IHVzZVJlZjxib29sZWFuPih1c2VQb2xsKTtcblxuICAvLyBIZWFydGJlYXQgcG9sbGluZyBzdGF0ZSAod2hlbiBXZWJTb2NrZXQgaXMgZGlzYWJsZWQpXG4gIGNvbnN0IGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICBjb25zdCBoZWFydGJlYXRJbnRlcnZhbFJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICBjb25zdCBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICAvLyBSZWZzIHNvIHdlIG9ubHkgcnVuIHRha2VvdmVyL2ZpbmFsaXplZCBvbmNlIHBlciBjb252ZXJzYXRpb24gKGF2b2lkIHN0YWxlIGlzVGFrZW5PdmVyL2lzRmluYWxpemVkIGluIHBvbGwgY2xvc3VyZSlcbiAgY29uc3QgdGFrZW92ZXJQcm9jZXNzZWRSZWYgPSB1c2VSZWY8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBmaW5hbGl6ZWRQcm9jZXNzZWRSZWYgPSB1c2VSZWY8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIFN0b3JlIGNhbGxiYWNrcyBpbiByZWZzIHNvIHRoZXkgZG9uJ3QgdHJpZ2dlciByZS1pbml0aWFsaXphdGlvblxuICBjb25zdCBvbkVycm9yUmVmID0gdXNlUmVmKG9uRXJyb3IpO1xuICBjb25zdCBvblRha2VvdmVyUmVmID0gdXNlUmVmKG9uVGFrZW92ZXIpO1xuICBjb25zdCBvbkZpbmFsaXplUmVmID0gdXNlUmVmKG9uRmluYWxpemUpO1xuICBjb25zdCBvbkNvbmZpZ0xvYWRlZFJlZiA9IHVzZVJlZihvbkNvbmZpZ0xvYWRlZCk7XG5cbiAgLy8gVXBkYXRlIGNhbGxiYWNrIHJlZnMgd2hlbiB0aGV5IGNoYW5nZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uRXJyb3JSZWYuY3VycmVudCA9IG9uRXJyb3I7XG4gIH0sIFtvbkVycm9yXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQgPSBvblRha2VvdmVyO1xuICB9LCBbb25UYWtlb3Zlcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25GaW5hbGl6ZVJlZi5jdXJyZW50ID0gb25GaW5hbGl6ZTtcbiAgfSwgW29uRmluYWxpemVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uQ29uZmlnTG9hZGVkUmVmLmN1cnJlbnQgPSBvbkNvbmZpZ0xvYWRlZDtcbiAgfSwgW29uQ29uZmlnTG9hZGVkXSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBjaGF0IHNlcnZpY2UgLSBvbmx5IHdoZW4gYmFzZVVybCwgYXBpS2V5LCB0ZW5hbnQsIHVzZVdzLCBvciBtZXRhZGF0YSBhY3R1YWxseSBjaGFuZ2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YUNoYW5nZWQgPSBtZXRhZGF0YVJlZi5jdXJyZW50ICE9PSBtZXRhZGF0YVN0cmluZztcbiAgICBjb25zdCBiYXNlVXJsQ2hhbmdlZCA9IHByZXZCYXNlVXJsUmVmLmN1cnJlbnQgIT09IGJhc2VVcmw7XG4gICAgY29uc3QgYXBpS2V5Q2hhbmdlZCA9IHByZXZBcGlLZXlSZWYuY3VycmVudCAhPT0gYXBpS2V5O1xuICAgIGNvbnN0IHRlbmFudENoYW5nZWQgPSBwcmV2VGVuYW50UmVmLmN1cnJlbnQgIT09IHRlbmFudDtcbiAgICBjb25zdCB1c2VXc0NoYW5nZWQgPSBwcmV2VXNlV3NSZWYuY3VycmVudCAhPT0gdXNlV3M7XG4gICAgY29uc3QgdXNlUG9sbENoYW5nZWQgPSBwcmV2VXNlUG9sbFJlZi5jdXJyZW50ICE9PSB1c2VQb2xsO1xuICAgIC8vIE9ubHkgcmUtaW5pdGlhbGl6ZSBmb3IgY29ubmVjdGlvbi1yZWxhdGVkIGNoYW5nZXMsIE5PVCBmb3IgbWV0YWRhdGEgY2hhbmdlc1xuICAgIGNvbnN0IG5lZWRzUmVpbml0ID1cbiAgICAgICFjaGF0U2VydmljZVJlZi5jdXJyZW50IHx8XG4gICAgICBiYXNlVXJsQ2hhbmdlZCB8fFxuICAgICAgYXBpS2V5Q2hhbmdlZCB8fFxuICAgICAgdGVuYW50Q2hhbmdlZCB8fFxuICAgICAgdXNlV3NDaGFuZ2VkO1xuXG4gICAgaWYgKG5lZWRzUmVpbml0KSB7XG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgaWYgKGJhc2VVcmxDaGFuZ2VkKSBwcmV2QmFzZVVybFJlZi5jdXJyZW50ID0gYmFzZVVybDtcbiAgICAgIGlmIChhcGlLZXlDaGFuZ2VkKSBwcmV2QXBpS2V5UmVmLmN1cnJlbnQgPSBhcGlLZXk7XG4gICAgICBpZiAodGVuYW50Q2hhbmdlZCkgcHJldlRlbmFudFJlZi5jdXJyZW50ID0gdGVuYW50O1xuICAgICAgaWYgKHVzZVdzQ2hhbmdlZCkgcHJldlVzZVdzUmVmLmN1cnJlbnQgPSB1c2VXcztcbiAgICAgIGlmICh1c2VQb2xsQ2hhbmdlZCkgcHJldlVzZVBvbGxSZWYuY3VycmVudCA9IHVzZVBvbGw7XG4gICAgICBpZiAobWV0YWRhdGFDaGFuZ2VkKSBtZXRhZGF0YVJlZi5jdXJyZW50ID0gbWV0YWRhdGFTdHJpbmc7XG5cbiAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHNlcnZpY2UgaWYgaXQgZXhpc3RzXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldENvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoKCkgPT4ge30pO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRXZWxjb21lRGF0YUhhbmRsZXIobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQgPSBuZXcgQ2hhdFNlcnZpY2UoXG4gICAgICAgIGJhc2VVcmwsXG4gICAgICAgIGFwaUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIHRlbmFudCxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIHVzZVdzLFxuICAgICAgICB1c2VQb2xsLFxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IHVwIGhhbmRsZXJzXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1lc3NhZ2VIYW5kbGVyKChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICBjcmVhdGVfdGltZTpcbiAgICAgICAgICAgICFtZXNzYWdlLmNyZWF0ZV90aW1lIHx8IGlzTmFOKG1lc3NhZ2UuY3JlYXRlX3RpbWUpXG4gICAgICAgICAgICAgID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcbiAgICAgICAgICAgICAgOiBtZXNzYWdlLmNyZWF0ZV90aW1lLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRyYWNrIGxhdGVzdCBjcmVhdGVfdGltZSB3ZSd2ZSBzZWVuIGZyb20gc2VydmVyL3dlYnNvY2tldCAoaW4gc2Vjb25kcylcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lICYmIG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lID4gMCkge1xuICAgICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG5vcm1hbGl6ZWRNZXNzYWdlLmNyZWF0ZV90aW1lKSAqIDEwMDAgLyAxMDAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIG1lc3NhZ2UgdG8gbWVzc2FnZXMgYXJyYXlcbiAgICAgICAgc2V0TWVzc2FnZXMoKHByZXZNZXNzYWdlcykgPT4ge1xuICAgICAgICAgIC8vIEF2b2lkIGFkZGluZyBkdXBsaWNhdGUgbWVzc2FnZXMgd2l0aCBzYW1lIG1lc3NhZ2VfaWQgYW5kIHR5cGVcbiAgICAgICAgICBpZiAobm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gcHJldk1lc3NhZ2VzLnNvbWUoKG0pID0+IG0ubWVzc2FnZV9pZCA9PT0gbm9ybWFsaXplZE1lc3NhZ2UubWVzc2FnZV9pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2TWVzc2FnZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldk1lc3NhZ2VzLCBub3JtYWxpemVkTWVzc2FnZV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgdHlwaW5nIGFuaW1hdGlvbiB3aGVuIGFnZW50IG9yIHN5c3RlbSBtZXNzYWdlIGFycml2ZXNcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwiYWdlbnRcIiB8fFxuICAgICAgICAgIG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09IFwic3BlY2lhbFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRUYWtlb3ZlckhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvblRha2VvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0RmluYWxpemVkSGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRmluYWxpemVSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRmluYWxpemVSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKChzdGF0ZSkgPT4ge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoc3RhdGUpO1xuICAgICAgICBpZiAoc3RhdGUgIT09IFwiY29ubmVjdGVkXCIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0V2VsY29tZURhdGFIYW5kbGVyKChkYXRhKSA9PiB7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZShkYXRhLnRpdGxlID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwoZGF0YS5pbWFnZVVybCA/PyBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2UoZGF0YS5tZXNzYWdlID8/IG51bGwpO1xuICAgICAgICBpZiAoZGF0YS5wb3NzaWJsZVF1ZXJpZXMgJiYgZGF0YS5wb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhkYXRhLnBvc3NpYmxlUXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFNlcnZlclVuYXZhaWxhYmxlQ29uZmlnKFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBmb3IgYSBzYXZlZCBjb252ZXJzYXRpb24gYW5kIGNvbm5lY3QgdG8gaXRcbiAgICAgIGNvbnN0IGNvbnZJZCA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q29udmVyc2F0aW9uSWQoKTtcbiAgICAgIGlmIChjb252SWQpIHtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuaXNDb252ZXJzYXRpb25GaW5hbGl6ZWQoKSkge1xuICAgICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuY29ubmVjdFdlYlNvY2tldCgpO1xuICAgICAgICAgIGlmICghdXNlV3MpIHtcbiAgICAgICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFB1bGwgaW5pdGlhbCBzdGF0aWMgZGF0YVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzPy4oKSB8fCBbXTtcbiAgICAgICAgaWYgKHF1ZXJpZXMubGVuZ3RoKSBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhPy4oKTtcbiAgICAgICAgaWYgKHdlbGNvbWUpIHtcbiAgICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhpbmtpbmcgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnPy4oKTtcbiAgICAgICAgaWYgKHRoaW5raW5nKSB7XG4gICAgICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKHRoaW5raW5nLnBocmFzZXMgfHwgW10pO1xuICAgICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyh0aGlua2luZy5kZWxheU1zIHx8IDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGEgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENoYXRJbnB1dE1ldGFkYXRhPy4oKTtcbiAgICAgICAgaWYgKG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMobWV0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKG1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIG9uQ29uZmlnTG9hZGVkUmVmLmN1cnJlbnQ/Lih7IGNoYXRJbnB1dE1ldGFkYXRhOiBtZXRhID8/IHt9IH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgLy8gSnVzdCB1cGRhdGUgbWV0YWRhdGEgd2l0aG91dCByZS1pbml0aWFsaXppbmdcbiAgICAgIGlmIChtZXRhZGF0YUNoYW5nZWQpIHtcbiAgICAgICAgbWV0YWRhdGFSZWYuY3VycmVudCA9IG1ldGFkYXRhU3RyaW5nO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXBkYXRlIGhhbmRsZXJzIHdoZW4gY2FsbGJhY2tzIGNoYW5nZSAod2l0aG91dCByZS1pbml0aWFsaXppbmcpXG4gICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25UYWtlb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25UYWtlb3ZlclJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkZpbmFsaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0U2VydmVyVW5hdmFpbGFibGVDb25maWcoXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBvbmx5IG9uIHVubW91bnRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gT25seSBjbGVhbnVwIG9uIHVubW91bnQsIG5vdCBvbiBldmVyeSBkZXBlbmRlbmN5IGNoYW5nZVxuICAgIH07XG4gIH0sIFtcbiAgICBiYXNlVXJsLFxuICAgIGFwaUtleSxcbiAgICB0ZW5hbnQsXG4gICAgbWV0YWRhdGFTdHJpbmcsXG4gICAgbGFuZ3VhZ2UsXG4gICAgdXNlV3MsXG4gICAgdXNlUG9sbCxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICBdKTtcblxuICAvLyBVcGRhdGUgbGFuZ3VhZ2Ugd2hlbiBpdCBjaGFuZ2VzICh3aXRob3V0IHJlLWluaXRpYWxpemluZyB0aGUgc2VydmljZSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgfVxuICB9LCBbbGFuZ3VhZ2VdKTtcblxuICAvLyBMb2FkIG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXIgd2hlbiBhdmFpbGFibGVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSB7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBjb25zdCBwYXJzZWQ6IENoYXRNZXNzYWdlW10gPSBzdG9yZWQgPyBKU09OLnBhcnNlKHN0b3JlZCkgOiBbXTtcblxuICAgICAgc2V0TWVzc2FnZXMocGFyc2VkKTtcbiAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICBpZiAocGFyc2VkLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lID0gTWF0aC5tYXgoXG4gICAgICAgICAgLi4ucGFyc2VkLm1hcCgobSkgPT4gKG0uY3JlYXRlX3RpbWUgPyBtLmNyZWF0ZV90aW1lIDogMCkpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG1heENyZWF0ZVRpbWUpICogMTAwMCAvIDEwMDA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgIH1cbiAgfSwgW2FwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBWYWxpZGF0ZSBtZXNzYWdlcyBmb3IgdGFrZW92ZXIgYW5kIGZpbmFsaXplZFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZhbGlkYXRlTWVzc2FnZXMobWVzc2FnZXMpO1xuICB9LCBbbWVzc2FnZXNdKTtcblxuICAvLyBQZXJzaXN0IG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXJcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbbWVzc2FnZXMsIGFwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBIZWFydGJlYXQgbG9uZyBwb2xsaW5nIHdoZW4gV2ViU29ja2V0IGlzIGRpc2FibGVkIGFuZCB3ZSBoYXZlIGFuIGluLXByb2dyZXNzIGNvbnZlcnNhdGlvbi5cbiAgLy8gLSBTdGFydHMgd2l0aCBhIHNob3J0IGludGVydmFsXG4gIC8vIC0gSW5jcmVhc2VzIHRoZSBpbnRlcnZhbCBvdmVyIHRpbWUgKGV2ZXJ5IHN1Y2Nlc3NmdWwgcG9sbClcbiAgLy8gLSBSZXRyaWVzIHVwIHRvIDUgdGltZXMgb24gZXJyb3JzLCB0aGVuIHN0b3BzXG4gIGNvbnN0IEhFQVJUQkVBVF9JTklUSUFMX0lOVEVSVkFMX01TID0gMjAwMDtcbiAgY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMgPSA1MDAwO1xuICBjb25zdCBIRUFSVEJFQVRfTUFYX0lOVEVSVkFMX01TID0gMzAwMDA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodXNlV3MgfHwgIWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkKSByZXR1cm47XG4gICAgY29uc3Qgc3ZjID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICBpZiAoIXN2YykgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgcGVyLWNvbnZlcnNhdGlvbiBmbGFncyBzbyB3ZSBvbmx5IG5vdGlmeSB0YWtlb3Zlci9maW5hbGl6ZWQgb25jZVxuICAgIHRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuXG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGxldCB0aW1lb3V0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc2NoZWR1bGVOZXh0ID0gKGRlbGF5TXM6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQocG9sbCwgZGVsYXlNcyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBvbGwgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgcG9sbE1lc3NhZ2VzIH0gPSBhd2FpdCBzdmMucG9sbEluUHJvZ3Jlc3NDb252ZXJzYXRpb24oKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFJlc2V0IGZhaWx1cmUgY291bnRlciBvbiBzdWNjZXNzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcblxuICAgICAgICAvLyBPbmx5IHRha2UgbWVzc2FnZXMgbmV3ZXIgdGhhbiBvciBlcXVhbCB0byBsYXN0IHNlZW4gY3JlYXRlX3RpbWUgKHNlY29uZHMpLlxuICAgICAgICAvLyBVc2Ugc2Vjb25kcyBjb25zaXN0ZW50bHk6IHBvbGwgbWVzc2FnZXMgYXJlIG5vcm1hbGl6ZWQgdG8gc2Vjb25kcyBpbiBjaGF0U2VydmljZS5cbiAgICAgICAgY29uc3QgbGFzdFNlcnZlckNyZWF0ZVRpbWUgPSBNYXRoLmZsb29yKE51bWJlcihsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50KSB8fCAwKTtcblxuICAgICAgICBjb25zdCBuZXdNZXNzYWdlc1JhdyA9IChwb2xsTWVzc2FnZXMgfHwgW10pLmZpbHRlcigobSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN0ID0gTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpO1xuICAgICAgICAgIGlmIChjdCA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKGN0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHJldHVybiBjdCA+IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmV3TWVzc2FnZXNSYXcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHNwZWFrZXJUeXBlID0gKHNwZWFrZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHNwZWFrZXIgPT09IFwiY3VzdG9tZXJcIikgcmV0dXJuIFwiY3VzdG9tZXJcIjtcbiAgICAgICAgICAgIGlmIChzcGVha2VyID09PSBcImFnZW50XCIpIHJldHVybiBcImFnZW50XCI7XG4gICAgICAgICAgICByZXR1cm4gXCJzcGVjaWFsXCI7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHRleHQgPSAobTogSW5Qcm9ncmVzc1BvbGxNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcInRha2VvdmVyXCIpIHJldHVybiBcIlN1cGVydmlzb3IgdG9vayBvdmVyXCI7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcImZpbmFsaXplZFwiKSByZXR1cm4gXCJDb252ZXJzYXRpb24gRmluYWxpemVkXCI7XG4gICAgICAgICAgICByZXR1cm4gKG0gYXMgYW55KS50ZXh0O1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IG5ld01lc3NhZ2VzUmF3Lm1hcCgobSkgPT4gKHtcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IChtIGFzIGFueSkuaWQsXG4gICAgICAgICAgICBjcmVhdGVfdGltZTogTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpLFxuICAgICAgICAgICAgc3RhcnRfdGltZTogTnVtYmVyKChtIGFzIGFueSkuc3RhcnRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIGVuZF90aW1lOiBOdW1iZXIoKG0gYXMgYW55KS5lbmRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIHNwZWFrZXI6IHNwZWFrZXJUeXBlKChtIGFzIGFueSkuc3BlYWtlciksXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0KG0pLFxuICAgICAgICAgICAgdHlwZTogKG0gYXMgYW55KS50eXBlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IChtIGFzIGFueSkuZmVlZGJhY2ssXG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgLy8gQXBwZW5kIG9ubHkgbWVzc2FnZXMgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIChkZWR1cGUgYnkgbWVzc2FnZV9pZDsgc2FtZSBjcmVhdGVfdGltZSBjYW4gcmVwZWF0IGV2ZXJ5IHBvbGwpXG4gICAgICAgICAgaWYgKG5ld01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldE1lc3NhZ2VzKChwcmV2TWVzc2FnZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgIHByZXZNZXNzYWdlcy5tYXAoKG0pID0+IG0ubWVzc2FnZV9pZCkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCB0b0FkZCA9IG5ld01lc3NhZ2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAobSkgPT4gbS5tZXNzYWdlX2lkID09IG51bGwgfHwgIWV4aXN0aW5nSWRzLmhhcyhtLm1lc3NhZ2VfaWQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAodG9BZGQubGVuZ3RoID09PSAwKSByZXR1cm4gcHJldk1lc3NhZ2VzO1xuICAgICAgICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lRnJvbVBvbGwgPSB0b0FkZC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKG1heCwgbXNnKSA9PlxuICAgICAgICAgICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgPyBNYXRoLm1heChtYXgsIG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgOiBtYXgsXG4gICAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWUsXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IG1heENyZWF0ZVRpbWVGcm9tUG9sbDtcbiAgICAgICAgICAgICAgcmV0dXJuIFsuLi5wcmV2TWVzc2FnZXMsIC4uLnRvQWRkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIG5ldyBtZXNzYWdlcyBmb3IgdGFrZW92ZXIvZmluYWxpemUgbWFya2Vyc1xuICAgICAgICAgIGNvbnN0IGhhc1Rha2VvdmVyTWVzc2FnZSA9IG5ld01lc3NhZ2VzLnNvbWUoXG4gICAgICAgICAgICAobSkgPT4gbS50eXBlID09PSBcInRha2VvdmVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBoYXNGaW5hbGl6ZWRNZXNzYWdlID0gbmV3TWVzc2FnZXMuc29tZShcbiAgICAgICAgICAgIChtKSA9PiBtLnR5cGUgPT09IFwiZmluYWxpemVkXCIsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICgoc3RhdHVzID09PSBcImZpbmFsaXplZFwiIHx8IGhhc0ZpbmFsaXplZE1lc3NhZ2UpICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoc3RhdHVzID09PSBcInRha2VvdmVyXCIgfHwgaGFzVGFrZW92ZXJNZXNzYWdlKSAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gbmV3IG1lc3NhZ2VzOyBzdGlsbCBob25vciBzdGF0dXMgaWYgaXQgaW5kaWNhdGVzIGEgdGVybWluYWwgc3RhdGUgKG9uY2UgcGVyIGNvbnZlcnNhdGlvbilcbiAgICAgICAgICBpZiAoc3RhdHVzID09PSBcImZpbmFsaXplZFwiICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc3ZjLmhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFwidGFrZW92ZXJcIiAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzdmMubm90aWZ5VGFrZW92ZXJGcm9tUG9sbCgpO1xuICAgICAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJmaW5hbGl6ZWRcIikge1xuICAgICAgICAgIC8vIE1hcmsgZmluYWxpemVkIGFuZCBsZXQgdGhlIGVmZmVjdCBjbGVhbnVwIHByZXZlbnQgZnVydGhlciBzY2hlZHVsaW5nXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jcmVhc2UgcG9sbGluZyBpbnRlcnZhbCBvdmVyIHRpbWUgb24gc3VjY2Vzc1xuICAgICAgICAvLyBjb25zdCBuZXh0SW50ZXJ2YWwgPSBNYXRoLm1pbihcbiAgICAgICAgLy8gICAoaGVhcnRiZWF0SW50ZXJ2YWxSZWYuY3VycmVudCB8fCBIRUFSVEJFQVRfSU5JVElBTF9JTlRFUlZBTF9NUykgK1xuICAgICAgICAvLyAgICAgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMsXG4gICAgICAgIC8vICAgSEVBUlRCRUFUX01BWF9JTlRFUlZBTF9NUyxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgY29uc3QgbmV4dEludGVydmFsID0gSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVM7XG4gICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgPSBuZXh0SW50ZXJ2YWw7XG4gICAgICAgIHNjaGVkdWxlTmV4dChuZXh0SW50ZXJ2YWwpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgLy8gSW5jcmVtZW50IGZhaWx1cmUgY291bnRlciBhbmQgc3RvcCBhZnRlciA1IGNvbnNlY3V0aXZlIGZhaWx1cmVzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ICs9IDE7XG4gICAgICAgIGlmIChoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCA+PSA1KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldHJ5RGVsYXkgPVxuICAgICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgfHwgSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG4gICAgICAgIHNjaGVkdWxlTmV4dChyZXRyeURlbGF5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gUmVzZXQgY291bnRlcnMgZm9yIHRoaXMgY29udmVyc2F0aW9uIGFuZCBzdGFydCBpbW1lZGlhdGVseVxuICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcbiAgICBoZWFydGJlYXRJbnRlcnZhbFJlZi5jdXJyZW50ID0gSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG5cbiAgICBpZiAodXNlUG9sbCAmJiAhdXNlV3MpIHtcbiAgICAgIHBvbGwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3VzZVdzLCBjb252ZXJzYXRpb25JZCwgaXNGaW5hbGl6ZWQsIHVzZVBvbGxdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb25cbiAgY29uc3QgcmVzZXRDb252ZXJzYXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAocmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RpbmdcIik7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgICAgc2V0V2VsY29tZUltYWdlVXJsKG51bGwpO1xuICAgICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgICBzZXRUaGlua2luZ1BocmFzZXMoW10pO1xuICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKDEwMDApO1xuICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IDA7XG4gICAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfVxuICAgICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgICAgc2V0SXNUYWtlbk92ZXIoZmFsc2UpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBjb252ZXJzYXRpb24gaW4gdGhlIGNoYXQgc2VydmljZVxuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuXG4gICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNvbnZlcnNhdGlvblxuICAgICAgICBjb25zdCBjb252SWQgPVxuICAgICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW4pO1xuICAgICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0ZWRcIik7XG5cbiAgICAgICAgLy8gR2V0IHBvc3NpYmxlIHF1ZXJpZXMgZnJvbSBBUEkgcmVzcG9uc2VcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHdlbGNvbWUgYW5kIHRoaW5raW5nIGRhdGFcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgIGNoYXRJbnB1dE1ldGFkYXRhOlxuICAgICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCkgPz8ge30sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHVwbG9hZEZpbGUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8QXR0YWNobWVudCB8IG51bGw+ID0+IHtcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudD8uZ2V0Q29udmVyc2F0aW9uSWQoKTtcbiAgICAgIGlmICghY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVwbG9hZFJlc3VsdCA9IGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LnVwbG9hZEZpbGUoXG4gICAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGZpbGUgdXJsIHdpdGggdGhlIGJhc2UgdXJsXG4gICAgICAgIGNvbnN0IGZpbGVfdXJsID0gbmV3IFVSTCh1cGxvYWRSZXN1bHQhLmZpbGVfdXJsISwgYmFzZVVybCkuaHJlZjtcblxuICAgICAgICBjb25zdCBhdHRhY2htZW50OiBBdHRhY2htZW50ID0ge1xuICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgIHVybDogZmlsZV91cmwsXG4gICAgICAgICAgZmlsZV9pZDogdXBsb2FkUmVzdWx0Py5maWxlX2lkLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKChwcmV2KSA9PiBbLi4ucHJldiwgYXR0YWNobWVudF0pO1xuICAgICAgICByZXR1cm4gYXR0YWNobWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgYXBpS2V5LFxuICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICBidWlsZE1lc3NhZ2VzS2V5LFxuICAgICAgaXNUb2tlbkV4cGlyZWRFcnJvcixcbiAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUsXG4gICAgXSxcbiAgKTtcblxuICAvLyBTZW5kIG1lc3NhZ2VcbiAgY29uc3Qgc2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoXG4gICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICBmaWxlczogRmlsZVtdID0gW10sXG4gICAgICBleHRyYU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNoYXQgc2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcblxuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XG5cbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzID0gZmlsZXNcbiAgICAgICAgICAgIC5tYXAoKGYpID0+XG4gICAgICAgICAgICAgIHByZWxvYWRlZEF0dGFjaG1lbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHBhKSA9PiBwYS5uYW1lID09PSBmLm5hbWUgJiYgcGEuc2l6ZSA9PT0gZi5zaXplLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBBdHRhY2htZW50W107XG4gICAgICAgICAgbmV3QXR0YWNobWVudHMucHVzaCguLi51cGxvYWRlZEZpbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHR5cGluZyBpbW1lZGlhdGVseSB3aGVuIHVzZXIgc2VuZHMsIHVubGVzcyBjb252ZXJzYXRpb24gaXMgdGFrZW4gb3ZlciBieSBhIGh1bWFuXG4gICAgICAgIGlmICghaXNUYWtlbk92ZXIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZW5kTWVzc2FnZShcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIG5ld0F0dGFjaG1lbnRzLFxuICAgICAgICAgIGV4dHJhTWV0YWRhdGEsXG4gICAgICAgICAgcmVDYXB0Y2hhVG9rZW4sXG4gICAgICAgICk7XG5cbiAgICAgICAgc2V0UHJlbG9hZGVkQXR0YWNobWVudHMoW10pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTmV0d29ya09yU2VydmVyRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgLy8gU2hvdyBjdXN0b20gc2VydmVyLXVuYXZhaWxhYmxlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICAgICAgICBjb25zdCBjcmVhdGVUaW1lID1cbiAgICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LmdldENvbnZlcnNhdGlvbkNyZWF0ZVRpbWUoKTtcbiAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBjcmVhdGVUaW1lICE9IG51bGwgPyBub3cgLSBjcmVhdGVUaW1lIDogMDtcbiAgICAgICAgICBjb25zdCBlbmRUaW1lID0gc3RhcnRUaW1lICsgMC4wMTtcbiAgICAgICAgICBjb25zdCBzcGVjaWFsTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgICAgc3RhcnRfdGltZTogc3RhcnRUaW1lLFxuICAgICAgICAgICAgZW5kX3RpbWU6IGVuZFRpbWUsXG4gICAgICAgICAgICBzcGVha2VyOiBcInNwZWNpYWxcIixcbiAgICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSA/PyBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9NRVNTQUdFLFxuICAgICAgICAgICAgLi4uKHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCAmJiB7XG4gICAgICAgICAgICAgIGxpbmtVcmw6IHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgICAgICAgbGlua0xhYmVsOlxuICAgICAgICAgICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsID8/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfQ09OVEFDVF9MQUJFTCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZXRNZXNzYWdlcygocHJldikgPT4gWy4uLnByZXYsIHNwZWNpYWxNZXNzYWdlXSk7XG4gICAgICAgICAgLy8gRG9uJ3QgY2FsbCBvbkVycm9yIHNvIHRoZSB1c2VyIG9ubHkgc2VlcyBvdXIgY3VzdG9tIG1lc3NhZ2VcbiAgICAgICAgfSBlbHNlIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBwcmVsb2FkZWRBdHRhY2htZW50cyxcbiAgICAgIGlzVGFrZW5PdmVyLFxuICAgICAgaXNUb2tlbkV4cGlyZWRFcnJvcixcbiAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICBdLFxuICApO1xuXG4gIGNvbnN0IHN0YXJ0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiY29ubmVjdGluZ1wiKTtcbiAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIGZvciBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICAgICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgICAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IGNvbnZJZCA9XG4gICAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlbik7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RlZFwiKTtcblxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMpIHtcbiAgICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICBpZiAocXVlcmllcyAmJiBxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhxdWVyaWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgIGNoYXRJbnB1dE1ldGFkYXRhOlxuICAgICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCkgPz8ge30sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIC8vIEFkZCBmZWVkYmFjayB0byBhbiBhZ2VudCBtZXNzYWdlXG4gIGNvbnN0IGFkZEZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgICB2YWx1ZTogXCJnb29kXCIgfCBcImJhZFwiLFxuICAgICAgZmVlZGJhY2tNZXNzYWdlPzogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3Qgc2VuZCBmZWVkYmFjazogQ2hhdFNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IHNlbmQgZmVlZGJhY2s6IG1lc3NhZ2VJZCBpcyByZXF1aXJlZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LmFkZEZlZWRiYWNrKFxuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBmZWVkYmFja01lc3NhZ2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbmV3RmVlZGJhY2s6IE1lc3NhZ2VGZWVkYmFjayA9IHtcbiAgICAgICAgICBmZWVkYmFjazogdmFsdWUsXG4gICAgICAgICAgZmVlZGJhY2tfbWVzc2FnZTogZmVlZGJhY2tNZXNzYWdlLFxuICAgICAgICAgIGZlZWRiYWNrX3RpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldE1lc3NhZ2VzKChwcmV2KSA9PlxuICAgICAgICAgIHByZXYubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAvLyBNYXRjaCBieSBtZXNzYWdlX2lkIG9yIGlkIGZpZWxkXG4gICAgICAgICAgICBjb25zdCBtc2dJZCA9IG0ubWVzc2FnZV9pZCB8fCAobSBhcyBhbnkpLmlkO1xuICAgICAgICAgICAgcmV0dXJuIG1zZ0lkID09PSBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgPyB7IC4uLm0sIGZlZWRiYWNrOiBbLi4uKG0uZmVlZGJhY2sgfHwgW10pLCBuZXdGZWVkYmFja10gfVxuICAgICAgICAgICAgICA6IG07XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlcyxcbiAgICBpc0xvYWRpbmcsXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgdXBsb2FkRmlsZSxcbiAgICByZXNldENvbnZlcnNhdGlvbixcbiAgICBzdGFydENvbnZlcnNhdGlvbixcbiAgICBjb25uZWN0aW9uU3RhdGUsXG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgcG9zc2libGVRdWVyaWVzLFxuICAgIGlzVGFrZW5PdmVyLFxuICAgIGlzRmluYWxpemVkLFxuICAgIGlzQWdlbnRUeXBpbmcsXG4gICAgYWRkRmVlZGJhY2ssXG4gICAgd2VsY29tZVRpdGxlLFxuICAgIHdlbGNvbWVJbWFnZVVybCxcbiAgICB3ZWxjb21lTWVzc2FnZSxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIGNoYXRJbnB1dE1ldGFkYXRhLFxuICB9O1xufTtcbiJdfQ==
|