genassist-chat-react 1.0.21 → 1.0.23

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.
@@ -57,28 +57,60 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
57
57
  import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
58
58
  import { ChatService } from '../services/chatService';
59
59
  export var useChat = function (_a) {
60
- var baseUrl = _a.baseUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, language = _a.language, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize;
61
- var _b = useState([]), messages = _b[0], setMessages = _b[1];
62
- var _c = useState(false), isLoading = _c[0], setIsLoading = _c[1];
63
- var _d = useState([]), preloadedAttachments = _d[0], setPreloadedAttachments = _d[1];
64
- var _e = useState('disconnected'), connectionState = _e[0], setConnectionState = _e[1];
65
- var _f = useState(false), isAgentTyping = _f[0], setIsAgentTyping = _f[1];
60
+ 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;
61
+ var _c = useState([]), messages = _c[0], setMessages = _c[1];
62
+ var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
63
+ var _e = useState([]), preloadedAttachments = _e[0], setPreloadedAttachments = _e[1];
64
+ var _f = useState('disconnected'), connectionState = _f[0], setConnectionState = _f[1];
65
+ var _g = useState(false), isAgentTyping = _g[0], setIsAgentTyping = _g[1];
66
66
  var chatServiceRef = useRef(null);
67
- var _g = useState(null), conversationId = _g[0], setConversationId = _g[1];
68
- var _h = useState([]), possibleQueries = _h[0], setPossibleQueries = _h[1];
69
- var _j = useState(null), welcomeTitle = _j[0], setWelcomeTitle = _j[1];
70
- var _k = useState(null), welcomeImageUrl = _k[0], setWelcomeImageUrl = _k[1];
71
- var _l = useState(null), welcomeMessage = _l[0], setWelcomeMessage = _l[1];
72
- var _m = useState([]), thinkingPhrases = _m[0], setThinkingPhrases = _m[1];
73
- var _o = useState(1000), thinkingDelayMs = _o[0], setThinkingDelayMs = _o[1];
74
- var _p = useState(false), isTakenOver = _p[0], setIsTakenOver = _p[1];
75
- var _q = useState(false), isFinalized = _q[0], setIsFinalized = _q[1];
67
+ var _h = useState(null), conversationId = _h[0], setConversationId = _h[1];
68
+ var _j = useState([]), possibleQueries = _j[0], setPossibleQueries = _j[1];
69
+ var _k = useState(null), welcomeTitle = _k[0], setWelcomeTitle = _k[1];
70
+ var _l = useState(null), welcomeImageUrl = _l[0], setWelcomeImageUrl = _l[1];
71
+ var _m = useState(null), welcomeMessage = _m[0], setWelcomeMessage = _m[1];
72
+ var _o = useState([]), thinkingPhrases = _o[0], setThinkingPhrases = _o[1];
73
+ var _p = useState(1000), thinkingDelayMs = _p[0], setThinkingDelayMs = _p[1];
74
+ var _q = useState(false), isTakenOver = _q[0], setIsTakenOver = _q[1];
75
+ var _r = useState(false), isFinalized = _r[0], setIsFinalized = _r[1];
76
76
  // Scoped messages key for apiKey, conversatioId
77
77
  var buildMessagesKey = useCallback(function (apiKeyVal, convId) {
78
78
  if (!convId)
79
79
  return null;
80
80
  return "genassist_conversation_messages:".concat(apiKeyVal, ":").concat(convId);
81
81
  }, []);
82
+ // Check if an error is a token expiration error (401 + "Token has expired.")
83
+ var isTokenExpiredError = useCallback(function (error) {
84
+ var _a, _b;
85
+ return !!(((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status) === 401 &&
86
+ ((_b = error === null || error === void 0 ? void 0 : error.response) === null || _b === void 0 ? void 0 : _b.data) &&
87
+ (error.response.data.error === "Token has expired." ||
88
+ error.response.data.message === "Token has expired." ||
89
+ (typeof error.response.data === "string" && error.response.data.includes("Token has expired"))));
90
+ }, []);
91
+ // Reset conversation state to initial (e.g. after token expiration)
92
+ var resetToInitialState = useCallback(function () {
93
+ setConversationId(null);
94
+ setIsFinalized(false);
95
+ setIsTakenOver(false);
96
+ setConnectionState('disconnected');
97
+ setWelcomeTitle(null);
98
+ setWelcomeImageUrl(null);
99
+ setWelcomeMessage(null);
100
+ setPossibleQueries([]);
101
+ setThinkingPhrases([]);
102
+ setThinkingDelayMs(1000);
103
+ setMessages([]);
104
+ var key = buildMessagesKey(apiKey, conversationId);
105
+ if (key) {
106
+ try {
107
+ localStorage.removeItem(key);
108
+ }
109
+ catch (e) {
110
+ // ignore
111
+ }
112
+ }
113
+ }, [apiKey, conversationId, buildMessagesKey]);
82
114
  // Deep compare metadata to prevent unnecessary re-initializations
83
115
  // Only re-initialize if metadata actually changes (by value, not reference)
84
116
  var metadataString = useMemo(function () { return JSON.stringify(metadata || {}); }, [metadata]);
@@ -86,6 +118,7 @@ export var useChat = function (_a) {
86
118
  var prevBaseUrlRef = useRef(baseUrl);
87
119
  var prevApiKeyRef = useRef(apiKey);
88
120
  var prevTenantRef = useRef(tenant);
121
+ var prevUseWsRef = useRef(useWs);
89
122
  // Store callbacks in refs so they don't trigger re-initialization
90
123
  var onErrorRef = useRef(onError);
91
124
  var onTakeoverRef = useRef(onTakeover);
@@ -100,15 +133,16 @@ export var useChat = function (_a) {
100
133
  useEffect(function () {
101
134
  onFinalizeRef.current = onFinalize;
102
135
  }, [onFinalize]);
103
- // Initialize chat service - only when baseUrl, apiKey, tenant, or metadata actually change
136
+ // Initialize chat service - only when baseUrl, apiKey, tenant, useWs, or metadata actually change
104
137
  useEffect(function () {
105
138
  var _a, _b, _c, _d, _e, _f;
106
139
  var metadataChanged = metadataRef.current !== metadataString;
107
140
  var baseUrlChanged = prevBaseUrlRef.current !== baseUrl;
108
141
  var apiKeyChanged = prevApiKeyRef.current !== apiKey;
109
142
  var tenantChanged = prevTenantRef.current !== tenant;
143
+ var useWsChanged = prevUseWsRef.current !== useWs;
110
144
  // Only re-initialize for connection-related changes, NOT for metadata changes
111
- var needsReinit = !chatServiceRef.current || baseUrlChanged || apiKeyChanged || tenantChanged;
145
+ var needsReinit = !chatServiceRef.current || baseUrlChanged || apiKeyChanged || tenantChanged || useWsChanged;
112
146
  if (needsReinit) {
113
147
  // Update refs
114
148
  if (baseUrlChanged)
@@ -117,6 +151,8 @@ export var useChat = function (_a) {
117
151
  prevApiKeyRef.current = apiKey;
118
152
  if (tenantChanged)
119
153
  prevTenantRef.current = tenant;
154
+ if (useWsChanged)
155
+ prevUseWsRef.current = useWs;
120
156
  if (metadataChanged)
121
157
  metadataRef.current = metadataString;
122
158
  // Clean up existing service if it exists
@@ -124,7 +160,7 @@ export var useChat = function (_a) {
124
160
  chatServiceRef.current.disconnect();
125
161
  chatServiceRef.current.setWelcomeDataHandler(null);
126
162
  }
127
- chatServiceRef.current = new ChatService(baseUrl, apiKey, metadata, tenant, language);
163
+ chatServiceRef.current = new ChatService(baseUrl, apiKey, metadata, tenant, language, useWs);
128
164
  // Set up handlers
129
165
  chatServiceRef.current.setMessageHandler(function (message) {
130
166
  var normalizedMessage = __assign(__assign({}, message), { create_time: (!message.create_time || isNaN(message.create_time))
@@ -222,7 +258,7 @@ export var useChat = function (_a) {
222
258
  return function () {
223
259
  // Only cleanup on unmount, not on every dependency change
224
260
  };
225
- }, [baseUrl, apiKey, tenant, metadataString, language]);
261
+ }, [baseUrl, apiKey, tenant, metadataString, language, useWs]);
226
262
  // Update language when it changes (without re-initializing the service)
227
263
  useEffect(function () {
228
264
  if (chatServiceRef.current) {
@@ -330,29 +366,36 @@ export var useChat = function (_a) {
330
366
  });
331
367
  }); }, []);
332
368
  var uploadFile = useCallback(function (file) { return __awaiter(void 0, void 0, void 0, function () {
333
- var fileUrl, attachment_1, error_2;
334
- return __generator(this, function (_a) {
335
- switch (_a.label) {
369
+ var conversationId, uploadResult, file_url, attachment_1, error_2;
370
+ var _a, _b;
371
+ return __generator(this, function (_c) {
372
+ switch (_c.label) {
336
373
  case 0:
337
- if (!chatServiceRef.current || !chatServiceRef.current.getConversationId()) {
374
+ conversationId = (_a = chatServiceRef.current) === null || _a === void 0 ? void 0 : _a.getConversationId();
375
+ if (!conversationId) {
338
376
  return [2 /*return*/, null];
339
377
  }
340
- _a.label = 1;
378
+ _c.label = 1;
341
379
  case 1:
342
- _a.trys.push([1, 3, , 4]);
343
- return [4 /*yield*/, chatServiceRef.current.uploadFile(chatServiceRef.current.getConversationId(), file)];
380
+ _c.trys.push([1, 3, , 4]);
381
+ return [4 /*yield*/, ((_b = chatServiceRef.current) === null || _b === void 0 ? void 0 : _b.uploadFile(conversationId, file))];
344
382
  case 2:
345
- fileUrl = (_a.sent()).fileUrl;
383
+ uploadResult = _c.sent();
384
+ file_url = new URL(uploadResult.file_url, baseUrl).href;
346
385
  attachment_1 = {
347
386
  name: file.name,
348
387
  type: file.type,
349
388
  size: file.size,
350
- url: fileUrl,
389
+ url: file_url,
390
+ file_id: uploadResult === null || uploadResult === void 0 ? void 0 : uploadResult.file_id,
351
391
  };
352
392
  setPreloadedAttachments(function (prev) { return __spreadArray(__spreadArray([], prev, true), [attachment_1], false); });
353
393
  return [2 /*return*/, attachment_1];
354
394
  case 3:
355
- error_2 = _a.sent();
395
+ error_2 = _c.sent();
396
+ if (isTokenExpiredError(error_2)) {
397
+ resetToInitialState();
398
+ }
356
399
  if (onErrorRef.current) {
357
400
  onErrorRef.current(error_2);
358
401
  }
@@ -360,7 +403,7 @@ export var useChat = function (_a) {
360
403
  case 4: return [2 /*return*/];
361
404
  }
362
405
  });
363
- }); }, []);
406
+ }); }, [apiKey, conversationId, buildMessagesKey, isTokenExpiredError, resetToInitialState]);
364
407
  // Send message
365
408
  var sendMessage = useCallback(function (text_1) {
366
409
  var args_1 = [];
@@ -397,6 +440,9 @@ export var useChat = function (_a) {
397
440
  case 3:
398
441
  error_3 = _a.sent();
399
442
  setIsAgentTyping(false);
443
+ if (isTokenExpiredError(error_3)) {
444
+ resetToInitialState();
445
+ }
400
446
  if (onErrorRef.current && error_3 instanceof Error) {
401
447
  onErrorRef.current(error_3);
402
448
  }
@@ -411,7 +457,7 @@ export var useChat = function (_a) {
411
457
  }
412
458
  });
413
459
  });
414
- }, [preloadedAttachments, isTakenOver]);
460
+ }, [preloadedAttachments, isTakenOver, isTokenExpiredError, resetToInitialState]);
415
461
  var startConversation = useCallback(function (reCaptchaToken) { return __awaiter(void 0, void 0, void 0, function () {
416
462
  var key, convId, queries, welcome, thinking, error_4;
417
463
  return __generator(this, function (_a) {
@@ -542,4 +588,4 @@ export var useChat = function (_a) {
542
588
  thinkingDelayMs: thinkingDelayMs,
543
589
  };
544
590
  };
545
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBY3RELE1BQU0sQ0FBQyxJQUFNLE9BQU8sR0FBRyxVQUFDLEVBQThGO1FBQTVGLE9BQU8sYUFBQSxFQUFFLE1BQU0sWUFBQSxFQUFFLE1BQU0sWUFBQSxFQUFFLFFBQVEsY0FBQSxFQUFFLFFBQVEsY0FBQSxFQUFFLE9BQU8sYUFBQSxFQUFFLFVBQVUsZ0JBQUEsRUFBRSxVQUFVLGdCQUFBO0lBQzlGLElBQUEsS0FBMEIsUUFBUSxDQUFnQixFQUFFLENBQUMsRUFBcEQsUUFBUSxRQUFBLEVBQUUsV0FBVyxRQUErQixDQUFDO0lBQ3RELElBQUEsS0FBNEIsUUFBUSxDQUFVLEtBQUssQ0FBQyxFQUFuRCxTQUFTLFFBQUEsRUFBRSxZQUFZLFFBQTRCLENBQUM7SUFDckQsSUFBQSxLQUFrRCxRQUFRLENBQWUsRUFBRSxDQUFDLEVBQTNFLG9CQUFvQixRQUFBLEVBQUUsdUJBQXVCLFFBQThCLENBQUM7SUFDN0UsSUFBQSxLQUF3QyxRQUFRLENBQThDLGNBQWMsQ0FBQyxFQUE1RyxlQUFlLFFBQUEsRUFBRSxrQkFBa0IsUUFBeUUsQ0FBQztJQUM5RyxJQUFBLEtBQW9DLFFBQVEsQ0FBVSxLQUFLLENBQUMsRUFBM0QsYUFBYSxRQUFBLEVBQUUsZ0JBQWdCLFFBQTRCLENBQUM7SUFDbkUsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFxQixJQUFJLENBQUMsQ0FBQztJQUNsRCxJQUFBLEtBQXND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QUcsQ0FBQyxVQUFBLENBQUM7NEJBQ1Isa0NBQWtDOzRCQUNsQyxJQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsVUFBVSxJQUFLLENBQVMsQ0FBQyxFQUFFLENBQUM7NEJBQzVDLE9BQU8sS0FBSyxLQUFLLFNBQVM7Z0NBQ3hCLENBQUMsdUJBQU0sQ0FBQyxLQUFFLFFBQVEsa0NBQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxVQUFFLGFBQVcsYUFDdkQsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDUixDQUFDLENBQUM7b0JBTkYsQ0FNRSxDQUNILENBQUM7Ozs7b0JBRUYsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3ZCLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBYyxDQUFDLENBQUM7b0JBQ3JDLENBQUM7Ozs7O1NBRUosRUFDRCxFQUFFLENBQ0gsQ0FBQztJQUVGLE9BQU87UUFDTCxRQUFRLFVBQUE7UUFDUixTQUFTLFdBQUE7UUFDVCxXQUFXLGFBQUE7UUFDWCxVQUFVLFlBQUE7UUFDVixpQkFBaUIsbUJBQUE7UUFDakIsaUJBQWlCLG1CQUFBO1FBQ2pCLGVBQWUsaUJBQUE7UUFDZixjQUFjLGdCQUFBO1FBQ2QsZUFBZSxpQkFBQTtRQUNmLFdBQVcsYUFBQTtRQUNYLFdBQVcsYUFBQTtRQUNYLGFBQWEsZUFBQTtRQUNiLFdBQVcsYUFBQTtRQUNYLFlBQVksY0FBQTtRQUNaLGVBQWUsaUJBQUE7UUFDZixjQUFjLGdCQUFBO1FBQ2QsZUFBZSxpQkFBQTtRQUNmLGVBQWUsaUJBQUE7S0FDaEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NoYXRTZXJ2aWNlJztcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBBdHRhY2htZW50LCBNZXNzYWdlRmVlZGJhY2sgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQ2hhdFByb3BzIHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICBhcGlLZXk6IHN0cmluZztcbiAgdGVuYW50Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgb25UYWtlb3Zlcj86ICgpID0+IHZvaWQ7XG4gIG9uRmluYWxpemU/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdCA9ICh7IGJhc2VVcmwsIGFwaUtleSwgdGVuYW50LCBtZXRhZGF0YSwgbGFuZ3VhZ2UsIG9uRXJyb3IsIG9uVGFrZW92ZXIsIG9uRmluYWxpemUgfTogVXNlQ2hhdFByb3BzKSA9PiB7XG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oW10pO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbcHJlbG9hZGVkQXR0YWNobWVudHMsIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzXSA9IHVzZVN0YXRlPEF0dGFjaG1lbnRbXT4oW10pO1xuICBjb25zdCBbY29ubmVjdGlvblN0YXRlLCBzZXRDb25uZWN0aW9uU3RhdGVdID0gdXNlU3RhdGU8J2Nvbm5lY3RpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJz4oJ2Rpc2Nvbm5lY3RlZCcpO1xuICBjb25zdCBbaXNBZ2VudFR5cGluZywgc2V0SXNBZ2VudFR5cGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGNoYXRTZXJ2aWNlUmVmID0gdXNlUmVmPENoYXRTZXJ2aWNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtjb252ZXJzYXRpb25JZCwgc2V0Q29udmVyc2F0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtwb3NzaWJsZVF1ZXJpZXMsIHNldFBvc3NpYmxlUXVlcmllc10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oW10pO1xuICBjb25zdCBbd2VsY29tZVRpdGxlLCBzZXRXZWxjb21lVGl0bGVdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFt3ZWxjb21lSW1hZ2VVcmwsIHNldFdlbGNvbWVJbWFnZVVybF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVNZXNzYWdlLCBzZXRXZWxjb21lTWVzc2FnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3RoaW5raW5nUGhyYXNlcywgc2V0VGhpbmtpbmdQaHJhc2VzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt0aGlua2luZ0RlbGF5TXMsIHNldFRoaW5raW5nRGVsYXlNc10gPSB1c2VTdGF0ZTxudW1iZXI+KDEwMDApO1xuICBjb25zdCBbaXNUYWtlbk92ZXIsIHNldElzVGFrZW5PdmVyXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2lzRmluYWxpemVkLCBzZXRJc0ZpbmFsaXplZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gU2NvcGVkIG1lc3NhZ2VzIGtleSBmb3IgYXBpS2V5LCBjb252ZXJzYXRpb0lkXG4gIGNvbnN0IGJ1aWxkTWVzc2FnZXNLZXkgPSB1c2VDYWxsYmFjaygoYXBpS2V5VmFsOiBzdHJpbmcsIGNvbnZJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIGlmICghY29udklkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYGdlbmFzc2lzdF9jb252ZXJzYXRpb25fbWVzc2FnZXM6JHthcGlLZXlWYWx9OiR7Y29udklkfWA7XG4gIH0sIFtdKTtcblxuICAvLyBEZWVwIGNvbXBhcmUgbWV0YWRhdGEgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1pbml0aWFsaXphdGlvbnNcbiAgLy8gT25seSByZS1pbml0aWFsaXplIGlmIG1ldGFkYXRhIGFjdHVhbGx5IGNoYW5nZXMgKGJ5IHZhbHVlLCBub3QgcmVmZXJlbmNlKVxuICBjb25zdCBtZXRhZGF0YVN0cmluZyA9IHVzZU1lbW8oKCkgPT4gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEgfHwge30pLCBbbWV0YWRhdGFdKTtcbiAgY29uc3QgbWV0YWRhdGFSZWYgPSB1c2VSZWY8c3RyaW5nPihtZXRhZGF0YVN0cmluZyk7XG4gIGNvbnN0IHByZXZCYXNlVXJsUmVmID0gdXNlUmVmPHN0cmluZz4oYmFzZVVybCk7XG4gIGNvbnN0IHByZXZBcGlLZXlSZWYgPSB1c2VSZWY8c3RyaW5nPihhcGlLZXkpO1xuICBjb25zdCBwcmV2VGVuYW50UmVmID0gdXNlUmVmPHN0cmluZyB8IHVuZGVmaW5lZD4odGVuYW50KTtcblxuICAvLyBTdG9yZSBjYWxsYmFja3MgaW4gcmVmcyBzbyB0aGV5IGRvbid0IHRyaWdnZXIgcmUtaW5pdGlhbGl6YXRpb25cbiAgY29uc3Qgb25FcnJvclJlZiA9IHVzZVJlZihvbkVycm9yKTtcbiAgY29uc3Qgb25UYWtlb3ZlclJlZiA9IHVzZVJlZihvblRha2VvdmVyKTtcbiAgY29uc3Qgb25GaW5hbGl6ZVJlZiA9IHVzZVJlZihvbkZpbmFsaXplKTtcblxuICAvLyBVcGRhdGUgY2FsbGJhY2sgcmVmcyB3aGVuIHRoZXkgY2hhbmdlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25FcnJvclJlZi5jdXJyZW50ID0gb25FcnJvcjtcbiAgfSwgW29uRXJyb3JdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uVGFrZW92ZXJSZWYuY3VycmVudCA9IG9uVGFrZW92ZXI7XG4gIH0sIFtvblRha2VvdmVyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQgPSBvbkZpbmFsaXplO1xuICB9LCBbb25GaW5hbGl6ZV0pO1xuXG4gIC8vIEluaXRpYWxpemUgY2hhdCBzZXJ2aWNlIC0gb25seSB3aGVuIGJhc2VVcmwsIGFwaUtleSwgdGVuYW50LCBvciBtZXRhZGF0YSBhY3R1YWxseSBjaGFuZ2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YUNoYW5nZWQgPSBtZXRhZGF0YVJlZi5jdXJyZW50ICE9PSBtZXRhZGF0YVN0cmluZztcbiAgICBjb25zdCBiYXNlVXJsQ2hhbmdlZCA9IHByZXZCYXNlVXJsUmVmLmN1cnJlbnQgIT09IGJhc2VVcmw7XG4gICAgY29uc3QgYXBpS2V5Q2hhbmdlZCA9IHByZXZBcGlLZXlSZWYuY3VycmVudCAhPT0gYXBpS2V5O1xuICAgIGNvbnN0IHRlbmFudENoYW5nZWQgPSBwcmV2VGVuYW50UmVmLmN1cnJlbnQgIT09IHRlbmFudDtcbiAgICBcbiAgICAvLyBPbmx5IHJlLWluaXRpYWxpemUgZm9yIGNvbm5lY3Rpb24tcmVsYXRlZCBjaGFuZ2VzLCBOT1QgZm9yIG1ldGFkYXRhIGNoYW5nZXNcbiAgICBjb25zdCBuZWVkc1JlaW5pdCA9ICFjaGF0U2VydmljZVJlZi5jdXJyZW50IHx8IGJhc2VVcmxDaGFuZ2VkIHx8IGFwaUtleUNoYW5nZWQgfHwgdGVuYW50Q2hhbmdlZDtcblxuICAgIGlmIChuZWVkc1JlaW5pdCkge1xuICAgICAgLy8gVXBkYXRlIHJlZnNcbiAgICAgIGlmIChiYXNlVXJsQ2hhbmdlZCkgcHJldkJhc2VVcmxSZWYuY3VycmVudCA9IGJhc2VVcmw7XG4gICAgICBpZiAoYXBpS2V5Q2hhbmdlZCkgcHJldkFwaUtleVJlZi5jdXJyZW50ID0gYXBpS2V5O1xuICAgICAgaWYgKHRlbmFudENoYW5nZWQpIHByZXZUZW5hbnRSZWYuY3VycmVudCA9IHRlbmFudDtcbiAgICAgIGlmIChtZXRhZGF0YUNoYW5nZWQpIG1ldGFkYXRhUmVmLmN1cnJlbnQgPSBtZXRhZGF0YVN0cmluZztcblxuICAgICAgLy8gQ2xlYW4gdXAgZXhpc3Rpbmcgc2VydmljZSBpZiBpdCBleGlzdHNcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZGlzY29ubmVjdCgpO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFdlbGNvbWVEYXRhSGFuZGxlcihudWxsKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudCA9IG5ldyBDaGF0U2VydmljZShiYXNlVXJsLCBhcGlLZXksIG1ldGFkYXRhLCB0ZW5hbnQsIGxhbmd1YWdlKTtcbiAgICAgIFxuICAgICAgLy8gU2V0IHVwIGhhbmRsZXJzXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1lc3NhZ2VIYW5kbGVyKChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgICBjcmVhdGVfdGltZTogKCFtZXNzYWdlLmNyZWF0ZV90aW1lIHx8IGlzTmFOKG1lc3NhZ2UuY3JlYXRlX3RpbWUpKVxuICAgICAgICAgICAgPyBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKVxuICAgICAgICAgICAgOiBtZXNzYWdlLmNyZWF0ZV90aW1lLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldE1lc3NhZ2VzKHByZXZNZXNzYWdlcyA9PiBbLi4ucHJldk1lc3NhZ2VzLCBub3JtYWxpemVkTWVzc2FnZV0pO1xuICAgICAgICAvLyBTdG9wIHR5cGluZyBhbmltYXRpb24gd2hlbiBhZ2VudCBvciBzeXN0ZW0gbWVzc2FnZSBhcnJpdmVzXG4gICAgICAgIGlmIChub3JtYWxpemVkTWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnIHx8IG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09ICdzcGVjaWFsJykge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRUYWtlb3ZlckhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvblRha2VvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0RmluYWxpemVkSGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRmluYWxpemVSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRmluYWxpemVSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKChzdGF0ZSkgPT4ge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoc3RhdGUpO1xuICAgICAgICBpZiAoc3RhdGUgIT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFdlbGNvbWVEYXRhSGFuZGxlcigoZGF0YSkgPT4ge1xuICAgICAgICBzZXRXZWxjb21lVGl0bGUoZGF0YS50aXRsZSA/PyBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKGRhdGEuaW1hZ2VVcmwgPz8gbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKGRhdGEubWVzc2FnZSA/PyBudWxsKTtcbiAgICAgICAgaWYgKGRhdGEucG9zc2libGVRdWVyaWVzICYmIGRhdGEucG9zc2libGVRdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoZGF0YS5wb3NzaWJsZVF1ZXJpZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGEgc2F2ZWQgY29udmVyc2F0aW9uIGFuZCBjb25uZWN0IHRvIGl0XG4gICAgICBjb25zdCBjb252SWQgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENvbnZlcnNhdGlvbklkKCk7XG4gICAgICBpZiAoY29udklkKSB7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmlzQ29udmVyc2F0aW9uRmluYWxpemVkKCkpIHtcbiAgICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmNvbm5lY3RXZWJTb2NrZXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gUHVsbCBpbml0aWFsIHN0YXRpYyBkYXRhXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXM/LigpIHx8IFtdO1xuICAgICAgICBpZiAocXVlcmllcy5sZW5ndGgpIHNldFBvc3NpYmxlUXVlcmllcyhxdWVyaWVzKTtcbiAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGE/LigpO1xuICAgICAgICBpZiAod2VsY29tZSkge1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWc/LigpO1xuICAgICAgICBpZiAodGhpbmtpbmcpIHtcbiAgICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIC8vIEp1c3QgdXBkYXRlIG1ldGFkYXRhIHdpdGhvdXQgcmUtaW5pdGlhbGl6aW5nXG4gICAgICBpZiAobWV0YWRhdGFDaGFuZ2VkKSB7XG4gICAgICAgIG1ldGFkYXRhUmVmLmN1cnJlbnQgPSBtZXRhZGF0YVN0cmluZztcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIHVwZGF0ZSBoYW5kbGVycyB3aGVuIGNhbGxiYWNrcyBjaGFuZ2UgKHdpdGhvdXQgcmUtaW5pdGlhbGl6aW5nKVxuICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFRha2VvdmVySGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzVGFrZW5PdmVyKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uVGFrZW92ZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uVGFrZW92ZXJSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRGaW5hbGl6ZWRIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25GaW5hbGl6ZVJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25GaW5hbGl6ZVJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFudXAgb25seSBvbiB1bm1vdW50XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIC8vIE9ubHkgY2xlYW51cCBvbiB1bm1vdW50LCBub3Qgb24gZXZlcnkgZGVwZW5kZW5jeSBjaGFuZ2VcbiAgICB9O1xuICB9LCBbYmFzZVVybCwgYXBpS2V5LCB0ZW5hbnQsIG1ldGFkYXRhU3RyaW5nLCBsYW5ndWFnZV0pO1xuXG4gIC8vIFVwZGF0ZSBsYW5ndWFnZSB3aGVuIGl0IGNoYW5nZXMgKHdpdGhvdXQgcmUtaW5pdGlhbGl6aW5nIHRoZSBzZXJ2aWNlKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldExhbmd1YWdlKGxhbmd1YWdlKTtcbiAgICB9XG4gIH0sIFtsYW5ndWFnZV0pO1xuXG4gIC8vIExvYWQgbWVzc2FnZXMgZm9yIGN1cnJlbnQgcGFpciB3aGVuIGF2YWlsYWJsZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBzZXRNZXNzYWdlcyhzdG9yZWQgPyBKU09OLnBhcnNlKHN0b3JlZCkgOiBbXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICB9XG4gIH0sIFthcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gUGVyc2lzdCBtZXNzYWdlcyBmb3IgY3VycmVudCBwYWlyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfSwgW21lc3NhZ2VzLCBhcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gUmVzZXQgY29udmVyc2F0aW9uXG4gIGNvbnN0IHJlc2V0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soYXN5bmMgKHJlQ2FwdGNoYVRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0aW5nJyk7XG4gICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgIHNldFdlbGNvbWVUaXRsZShudWxsKTtcbiAgICBzZXRXZWxjb21lSW1hZ2VVcmwobnVsbCk7XG4gICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgc2V0VGhpbmtpbmdQaHJhc2VzKFtdKTtcbiAgICBzZXRUaGlua2luZ0RlbGF5TXMoMTAwMCk7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgIH1cbiAgICBzZXRJc0ZpbmFsaXplZChmYWxzZSk7XG4gICAgc2V0SXNUYWtlbk92ZXIoZmFsc2UpO1xuICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNldCB0aGUgY29udmVyc2F0aW9uIGluIHRoZSBjaGF0IHNlcnZpY2VcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQucmVzZXRDb252ZXJzYXRpb24oKTtcbiAgICAgIFxuICAgICAgLy8gU3RhcnQgYSBuZXcgY29udmVyc2F0aW9uXG4gICAgICBjb25zdCBjb252SWQgPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnN0YXJ0Q29udmVyc2F0aW9uKHJlQ2FwdGNoYVRva2VuKTtcbiAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RlZCcpO1xuXG4gICAgICAvLyBHZXQgcG9zc2libGUgcXVlcmllcyBmcm9tIEFQSSByZXNwb25zZVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcygpO1xuICAgICAgICBpZiAocXVlcmllcyAmJiBxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHdlbGNvbWUgYW5kIHRoaW5raW5nIGRhdGFcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKSB7XG4gICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKCk7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2Uod2VsY29tZS5tZXNzYWdlIHx8IG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcpIHtcbiAgICAgICAgY29uc3QgdGhpbmtpbmcgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnKCk7XG4gICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgY29uc3QgdXBsb2FkRmlsZSA9IHVzZUNhbGxiYWNrKGFzeW5jIChmaWxlOiBGaWxlKTogUHJvbWlzZTxBdHRhY2htZW50IHwgbnVsbD4gPT4ge1xuICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCB8fCAhY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDb252ZXJzYXRpb25JZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBmaWxlVXJsIH0gPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnVwbG9hZEZpbGUoXG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q29udmVyc2F0aW9uSWQoKSBhcyBzdHJpbmcsXG4gICAgICAgIGZpbGVcbiAgICAgICk7XG4gICAgICBcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQgPSB7XG4gICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgIHVybDogZmlsZVVybCxcbiAgICAgIH07XG5cbiAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKHByZXYgPT4gWy4uLnByZXYsIGF0dGFjaG1lbnRdKTtcbiAgICAgIHJldHVybiBhdHRhY2htZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50KSB7XG4gICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvciBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIFtdKTtcblxuICAvLyBTZW5kIG1lc3NhZ2VcbiAgY29uc3Qgc2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhhc3luYyAodGV4dDogc3RyaW5nLCBmaWxlczogRmlsZVtdID0gW10sIGV4dHJhTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCByZUNhcHRjaGFUb2tlbj86IHN0cmluZykgPT4ge1xuICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGF0IHNlcnZpY2Ugbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcblxuICAgICAgY29uc3QgbmV3QXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xuICAgICAgXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzID0gZmlsZXMubWFwKGYgPT4gcHJlbG9hZGVkQXR0YWNobWVudHMuZmluZChwYSA9PiBwYS5uYW1lID09PSBmLm5hbWUgJiYgcGEuc2l6ZSA9PT0gZi5zaXplKSkuZmlsdGVyKEJvb2xlYW4pIGFzIEF0dGFjaG1lbnRbXTtcbiAgICAgICAgbmV3QXR0YWNobWVudHMucHVzaCguLi51cGxvYWRlZEZpbGVzKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgdHlwaW5nIGltbWVkaWF0ZWx5IHdoZW4gdXNlciBzZW5kcywgdW5sZXNzIGNvbnZlcnNhdGlvbiBpcyB0YWtlbiBvdmVyIGJ5IGEgaHVtYW5cbiAgICAgIGlmICghaXNUYWtlbk92ZXIpIHtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2VuZE1lc3NhZ2UodGV4dCwgbmV3QXR0YWNobWVudHMsIGV4dHJhTWV0YWRhdGEsIHJlQ2FwdGNoYVRva2VuKTtcblxuICAgICAgc2V0UHJlbG9hZGVkQXR0YWNobWVudHMoW10pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtwcmVsb2FkZWRBdHRhY2htZW50cywgaXNUYWtlbk92ZXJdKTtcblxuICBjb25zdCBzdGFydENvbnZlcnNhdGlvbiA9IHVzZUNhbGxiYWNrKGFzeW5jIChyZUNhcHRjaGFUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RpbmcnKTtcbiAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgIFxuICAgICAgLy8gUmVzZXQgc3RhdGUgZm9yIG5ldyBjb252ZXJzYXRpb25cbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhbXSk7XG4gICAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfVxuICAgICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgICAgc2V0SXNUYWtlbk92ZXIoZmFsc2UpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnJlc2V0Q29udmVyc2F0aW9uKCk7XG5cbiAgICAgIGNvbnN0IGNvbnZJZCA9IGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW4pO1xuICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGVkJyk7XG5cbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcykge1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSkge1xuICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKHdlbGNvbWUuaW1hZ2VVcmwgfHwgbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyh0aGlua2luZy5kZWxheU1zIHx8IDEwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIC8vIEFkZCBmZWVkYmFjayB0byBhbiBhZ2VudCBtZXNzYWdlXG4gIGNvbnN0IGFkZEZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKG1lc3NhZ2VJZDogc3RyaW5nLCB2YWx1ZTogJ2dvb2QnIHwgJ2JhZCcsIGZlZWRiYWNrTWVzc2FnZT86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBzZW5kIGZlZWRiYWNrOiBDaGF0U2VydmljZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHNlbmQgZmVlZGJhY2s6IG1lc3NhZ2VJZCBpcyByZXF1aXJlZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuYWRkRmVlZGJhY2sobWVzc2FnZUlkLCB2YWx1ZSwgZmVlZGJhY2tNZXNzYWdlKTtcblxuICAgICAgICBjb25zdCBuZXdGZWVkYmFjazogTWVzc2FnZUZlZWRiYWNrID0ge1xuICAgICAgICAgIGZlZWRiYWNrOiB2YWx1ZSxcbiAgICAgICAgICBmZWVkYmFja19tZXNzYWdlOiBmZWVkYmFja01lc3NhZ2UsXG4gICAgICAgICAgZmVlZGJhY2tfdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0TWVzc2FnZXMocHJldiA9PlxuICAgICAgICAgIHByZXYubWFwKG0gPT4ge1xuICAgICAgICAgICAgLy8gTWF0Y2ggYnkgbWVzc2FnZV9pZCBvciBpZCBmaWVsZFxuICAgICAgICAgICAgY29uc3QgbXNnSWQgPSBtLm1lc3NhZ2VfaWQgfHwgKG0gYXMgYW55KS5pZDtcbiAgICAgICAgICAgIHJldHVybiBtc2dJZCA9PT0gbWVzc2FnZUlkXG4gICAgICAgICAgICAgID8geyAuLi5tLCBmZWVkYmFjazogWy4uLihtLmZlZWRiYWNrIHx8IFtdKSwgbmV3RmVlZGJhY2tdIH1cbiAgICAgICAgICAgICAgOiBtO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIGlzTG9hZGluZyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICB1cGxvYWRGaWxlLFxuICAgIHJlc2V0Q29udmVyc2F0aW9uLFxuICAgIHN0YXJ0Q29udmVyc2F0aW9uLFxuICAgIGNvbm5lY3Rpb25TdGF0ZSxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBwb3NzaWJsZVF1ZXJpZXMsXG4gICAgaXNUYWtlbk92ZXIsXG4gICAgaXNGaW5hbGl6ZWQsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBhZGRGZWVkYmFjayxcbiAgICB3ZWxjb21lVGl0bGUsXG4gICAgd2VsY29tZUltYWdlVXJsLFxuICAgIHdlbGNvbWVNZXNzYWdlLFxuICAgIHRoaW5raW5nUGhyYXNlcyxcbiAgICB0aGlua2luZ0RlbGF5TXMsXG4gIH07XG59O1xuIl19
591
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBZ0J0RCxNQUFNLENBQUMsSUFBTSxPQUFPLEdBQUcsVUFBQyxFQUE0RztRQUExRyxPQUFPLGFBQUEsRUFBRSxNQUFNLFlBQUEsRUFBRSxNQUFNLFlBQUEsRUFBRSxRQUFRLGNBQUEsRUFBRSxhQUFZLEVBQVosS0FBSyxtQkFBRyxJQUFJLEtBQUEsRUFBRSxRQUFRLGNBQUEsRUFBRSxPQUFPLGFBQUEsRUFBRSxVQUFVLGdCQUFBLEVBQUUsVUFBVSxnQkFBQTtJQUM1RyxJQUFBLEtBQTBCLFFBQVEsQ0FBZ0IsRUFBRSxDQUFDLEVBQXBELFFBQVEsUUFBQSxFQUFFLFdBQVcsUUFBK0IsQ0FBQztJQUN0RCxJQUFBLEtBQTRCLFFBQVEsQ0FBVSxLQUFLLENBQUMsRUFBbkQsU0FBUyxRQUFBLEVBQUUsWUFBWSxRQUE0QixDQUFDO0lBQ3JELElBQUEsS0FBa0QsUUFBUSxDQUFlLEVBQUUsQ0FBQyxFQUEzRSxvQkFBb0IsUUFBQSxFQUFFLHVCQUF1QixRQUE4QixDQUFDO0lBQzdFLElBQUEsS0FBd0MsUUFBUSxDQUE4QyxjQUFjLENBQUMsRUFBNUcsZUFBZSxRQUFBLEVBQUUsa0JBQWtCLFFBQXlFLENBQUM7SUFDOUcsSUFBQSxLQUFvQyxRQUFRLENBQVUsS0FBSyxDQUFDLEVBQTNELGFBQWEsUUFBQSxFQUFFLGdCQUFnQixRQUE0QixDQUFDO0lBQ25FLElBQU0sY0FBYyxHQUFHLE1BQU0s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Q0FBQyxFQUFFLENBQUM7NEJBQzVDLE9BQU8sS0FBSyxLQUFLLFNBQVM7Z0NBQ3hCLENBQUMsdUJBQU0sQ0FBQyxLQUFFLFFBQVEsa0NBQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxVQUFFLGFBQVcsYUFDdkQsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDUixDQUFDLENBQUM7b0JBTkYsQ0FNRSxDQUNILENBQUM7Ozs7b0JBRUYsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3ZCLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBYyxDQUFDLENBQUM7b0JBQ3JDLENBQUM7Ozs7O1NBRUosRUFDRCxFQUFFLENBQ0gsQ0FBQztJQUVGLE9BQU87UUFDTCxRQUFRLFVBQUE7UUFDUixTQUFTLFdBQUE7UUFDVCxXQUFXLGFBQUE7UUFDWCxVQUFVLFlBQUE7UUFDVixpQkFBaUIsbUJBQUE7UUFDakIsaUJBQWlCLG1CQUFBO1FBQ2pCLGVBQWUsaUJBQUE7UUFDZixjQUFjLGdCQUFBO1FBQ2QsZUFBZSxpQkFBQTtRQUNmLFdBQVcsYUFBQTtRQUNYLFdBQVcsYUFBQTtRQUNYLGFBQWEsZUFBQTtRQUNiLFdBQVcsYUFBQTtRQUNYLFlBQVksY0FBQTtRQUNaLGVBQWUsaUJBQUE7UUFDZixjQUFjLGdCQUFBO1FBQ2QsZUFBZSxpQkFBQTtRQUNmLGVBQWUsaUJBQUE7S0FDaEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NoYXRTZXJ2aWNlJztcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBBdHRhY2htZW50LCBNZXNzYWdlRmVlZGJhY2sgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQ2hhdFByb3BzIHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICBhcGlLZXk6IHN0cmluZztcbiAgdGVuYW50Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8vICBJZiBmYWxzZSwgdGhlIGNoYXQgd2lsbCBydW4gaW4gSFRUUC1vbmx5IG1vZGUgKG5vIFdlYlNvY2tldCBjb25uZWN0aW9uKS5cbiAgdXNlV3M/OiBib29sZWFuO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgb25FcnJvcj86IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIG9uVGFrZW92ZXI/OiAoKSA9PiB2b2lkO1xuICBvbkZpbmFsaXplPzogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXQgPSAoeyBiYXNlVXJsLCBhcGlLZXksIHRlbmFudCwgbWV0YWRhdGEsIHVzZVdzID0gdHJ1ZSwgbGFuZ3VhZ2UsIG9uRXJyb3IsIG9uVGFrZW92ZXIsIG9uRmluYWxpemUgfTogVXNlQ2hhdFByb3BzKSA9PiB7XG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oW10pO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbcHJlbG9hZGVkQXR0YWNobWVudHMsIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzXSA9IHVzZVN0YXRlPEF0dGFjaG1lbnRbXT4oW10pO1xuICBjb25zdCBbY29ubmVjdGlvblN0YXRlLCBzZXRDb25uZWN0aW9uU3RhdGVdID0gdXNlU3RhdGU8J2Nvbm5lY3RpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJz4oJ2Rpc2Nvbm5lY3RlZCcpO1xuICBjb25zdCBbaXNBZ2VudFR5cGluZywgc2V0SXNBZ2VudFR5cGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGNoYXRTZXJ2aWNlUmVmID0gdXNlUmVmPENoYXRTZXJ2aWNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtjb252ZXJzYXRpb25JZCwgc2V0Q29udmVyc2F0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtwb3NzaWJsZVF1ZXJpZXMsIHNldFBvc3NpYmxlUXVlcmllc10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oW10pO1xuICBjb25zdCBbd2VsY29tZVRpdGxlLCBzZXRXZWxjb21lVGl0bGVdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFt3ZWxjb21lSW1hZ2VVcmwsIHNldFdlbGNvbWVJbWFnZVVybF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVNZXNzYWdlLCBzZXRXZWxjb21lTWVzc2FnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3RoaW5raW5nUGhyYXNlcywgc2V0VGhpbmtpbmdQaHJhc2VzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt0aGlua2luZ0RlbGF5TXMsIHNldFRoaW5raW5nRGVsYXlNc10gPSB1c2VTdGF0ZTxudW1iZXI+KDEwMDApO1xuICBjb25zdCBbaXNUYWtlbk92ZXIsIHNldElzVGFrZW5PdmVyXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2lzRmluYWxpemVkLCBzZXRJc0ZpbmFsaXplZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gU2NvcGVkIG1lc3NhZ2VzIGtleSBmb3IgYXBpS2V5LCBjb252ZXJzYXRpb0lkXG4gIGNvbnN0IGJ1aWxkTWVzc2FnZXNLZXkgPSB1c2VDYWxsYmFjaygoYXBpS2V5VmFsOiBzdHJpbmcsIGNvbnZJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIGlmICghY29udklkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYGdlbmFzc2lzdF9jb252ZXJzYXRpb25fbWVzc2FnZXM6JHthcGlLZXlWYWx9OiR7Y29udklkfWA7XG4gIH0sIFtdKTtcblxuICAvLyBDaGVjayBpZiBhbiBlcnJvciBpcyBhIHRva2VuIGV4cGlyYXRpb24gZXJyb3IgKDQwMSArIFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIpXG4gIGNvbnN0IGlzVG9rZW5FeHBpcmVkRXJyb3IgPSB1c2VDYWxsYmFjaygoZXJyb3I6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIGVycm9yPy5yZXNwb25zZT8uc3RhdHVzID09PSA0MDEgJiZcbiAgICAgIGVycm9yPy5yZXNwb25zZT8uZGF0YSAmJlxuICAgICAgKGVycm9yLnJlc3BvbnNlLmRhdGEuZXJyb3IgPT09IFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIgfHxcbiAgICAgICAgZXJyb3IucmVzcG9uc2UuZGF0YS5tZXNzYWdlID09PSBcIlRva2VuIGhhcyBleHBpcmVkLlwiIHx8XG4gICAgICAgICh0eXBlb2YgZXJyb3IucmVzcG9uc2UuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiBlcnJvci5yZXNwb25zZS5kYXRhLmluY2x1ZGVzKFwiVG9rZW4gaGFzIGV4cGlyZWRcIikpKVxuICAgICk7XG4gIH0sIFtdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb24gc3RhdGUgdG8gaW5pdGlhbCAoZS5nLiBhZnRlciB0b2tlbiBleHBpcmF0aW9uKVxuICBjb25zdCByZXNldFRvSW5pdGlhbFN0YXRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldENvbnZlcnNhdGlvbklkKG51bGwpO1xuICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICBzZXRXZWxjb21lVGl0bGUobnVsbCk7XG4gICAgc2V0V2VsY29tZUltYWdlVXJsKG51bGwpO1xuICAgIHNldFdlbGNvbWVNZXNzYWdlKG51bGwpO1xuICAgIHNldFBvc3NpYmxlUXVlcmllcyhbXSk7XG4gICAgc2V0VGhpbmtpbmdQaHJhc2VzKFtdKTtcbiAgICBzZXRUaGlua2luZ0RlbGF5TXMoMTAwMCk7XG4gICAgc2V0TWVzc2FnZXMoW10pO1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgaWYgKGtleSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfVxuICB9LCBbYXBpS2V5LCBjb252ZXJzYXRpb25JZCwgYnVpbGRNZXNzYWdlc0tleV0pO1xuXG4gIC8vIERlZXAgY29tcGFyZSBtZXRhZGF0YSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLWluaXRpYWxpemF0aW9uc1xuICAvLyBPbmx5IHJlLWluaXRpYWxpemUgaWYgbWV0YWRhdGEgYWN0dWFsbHkgY2hhbmdlcyAoYnkgdmFsdWUsIG5vdCByZWZlcmVuY2UpXG4gIGNvbnN0IG1ldGFkYXRhU3RyaW5nID0gdXNlTWVtbygoKSA9PiBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSB8fCB7fSksIFttZXRhZGF0YV0pO1xuICBjb25zdCBtZXRhZGF0YVJlZiA9IHVzZVJlZjxzdHJpbmc+KG1ldGFkYXRhU3RyaW5nKTtcbiAgY29uc3QgcHJldkJhc2VVcmxSZWYgPSB1c2VSZWY8c3RyaW5nPihiYXNlVXJsKTtcbiAgY29uc3QgcHJldkFwaUtleVJlZiA9IHVzZVJlZjxzdHJpbmc+KGFwaUtleSk7XG4gIGNvbnN0IHByZXZUZW5hbnRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih0ZW5hbnQpO1xuICBjb25zdCBwcmV2VXNlV3NSZWYgPSB1c2VSZWY8Ym9vbGVhbj4odXNlV3MpO1xuXG4gIC8vIFN0b3JlIGNhbGxiYWNrcyBpbiByZWZzIHNvIHRoZXkgZG9uJ3QgdHJpZ2dlciByZS1pbml0aWFsaXphdGlvblxuICBjb25zdCBvbkVycm9yUmVmID0gdXNlUmVmKG9uRXJyb3IpO1xuICBjb25zdCBvblRha2VvdmVyUmVmID0gdXNlUmVmKG9uVGFrZW92ZXIpO1xuICBjb25zdCBvbkZpbmFsaXplUmVmID0gdXNlUmVmKG9uRmluYWxpemUpO1xuXG4gIC8vIFVwZGF0ZSBjYWxsYmFjayByZWZzIHdoZW4gdGhleSBjaGFuZ2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkVycm9yUmVmLmN1cnJlbnQgPSBvbkVycm9yO1xuICB9LCBbb25FcnJvcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25UYWtlb3ZlclJlZi5jdXJyZW50ID0gb25UYWtlb3ZlcjtcbiAgfSwgW29uVGFrZW92ZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uRmluYWxpemVSZWYuY3VycmVudCA9IG9uRmluYWxpemU7XG4gIH0sIFtvbkZpbmFsaXplXSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBjaGF0IHNlcnZpY2UgLSBvbmx5IHdoZW4gYmFzZVVybCwgYXBpS2V5LCB0ZW5hbnQsIHVzZVdzLCBvciBtZXRhZGF0YSBhY3R1YWxseSBjaGFuZ2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YUNoYW5nZWQgPSBtZXRhZGF0YVJlZi5jdXJyZW50ICE9PSBtZXRhZGF0YVN0cmluZztcbiAgICBjb25zdCBiYXNlVXJsQ2hhbmdlZCA9IHByZXZCYXNlVXJsUmVmLmN1cnJlbnQgIT09IGJhc2VVcmw7XG4gICAgY29uc3QgYXBpS2V5Q2hhbmdlZCA9IHByZXZBcGlLZXlSZWYuY3VycmVudCAhPT0gYXBpS2V5O1xuICAgIGNvbnN0IHRlbmFudENoYW5nZWQgPSBwcmV2VGVuYW50UmVmLmN1cnJlbnQgIT09IHRlbmFudDtcbiAgICBjb25zdCB1c2VXc0NoYW5nZWQgPSBwcmV2VXNlV3NSZWYuY3VycmVudCAhPT0gdXNlV3M7XG4gICAgXG4gICAgLy8gT25seSByZS1pbml0aWFsaXplIGZvciBjb25uZWN0aW9uLXJlbGF0ZWQgY2hhbmdlcywgTk9UIGZvciBtZXRhZGF0YSBjaGFuZ2VzXG4gICAgY29uc3QgbmVlZHNSZWluaXQgPSAhY2hhdFNlcnZpY2VSZWYuY3VycmVudCB8fCBiYXNlVXJsQ2hhbmdlZCB8fCBhcGlLZXlDaGFuZ2VkIHx8IHRlbmFudENoYW5nZWQgfHwgdXNlV3NDaGFuZ2VkO1xuXG4gICAgaWYgKG5lZWRzUmVpbml0KSB7XG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgaWYgKGJhc2VVcmxDaGFuZ2VkKSBwcmV2QmFzZVVybFJlZi5jdXJyZW50ID0gYmFzZVVybDtcbiAgICAgIGlmIChhcGlLZXlDaGFuZ2VkKSBwcmV2QXBpS2V5UmVmLmN1cnJlbnQgPSBhcGlLZXk7XG4gICAgICBpZiAodGVuYW50Q2hhbmdlZCkgcHJldlRlbmFudFJlZi5jdXJyZW50ID0gdGVuYW50O1xuICAgICAgaWYgKHVzZVdzQ2hhbmdlZCkgcHJldlVzZVdzUmVmLmN1cnJlbnQgPSB1c2VXcztcbiAgICAgIGlmIChtZXRhZGF0YUNoYW5nZWQpIG1ldGFkYXRhUmVmLmN1cnJlbnQgPSBtZXRhZGF0YVN0cmluZztcblxuICAgICAgLy8gQ2xlYW4gdXAgZXhpc3Rpbmcgc2VydmljZSBpZiBpdCBleGlzdHNcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZGlzY29ubmVjdCgpO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFdlbGNvbWVEYXRhSGFuZGxlcihudWxsKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudCA9IG5ldyBDaGF0U2VydmljZShiYXNlVXJsLCBhcGlLZXksIG1ldGFkYXRhLCB0ZW5hbnQsIGxhbmd1YWdlLCB1c2VXcyk7XG4gICAgICBcbiAgICAgIC8vIFNldCB1cCBoYW5kbGVyc1xuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRNZXNzYWdlSGFuZGxlcigobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgY3JlYXRlX3RpbWU6ICghbWVzc2FnZS5jcmVhdGVfdGltZSB8fCBpc05hTihtZXNzYWdlLmNyZWF0ZV90aW1lKSlcbiAgICAgICAgICAgID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcbiAgICAgICAgICAgIDogbWVzc2FnZS5jcmVhdGVfdGltZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRNZXNzYWdlcyhwcmV2TWVzc2FnZXMgPT4gWy4uLnByZXZNZXNzYWdlcywgbm9ybWFsaXplZE1lc3NhZ2VdKTtcbiAgICAgICAgLy8gU3RvcCB0eXBpbmcgYW5pbWF0aW9uIHdoZW4gYWdlbnQgb3Igc3lzdGVtIG1lc3NhZ2UgYXJyaXZlc1xuICAgICAgICBpZiAobm9ybWFsaXplZE1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50JyB8fCBub3JtYWxpemVkTWVzc2FnZS5zcGVha2VyID09PSAnc3BlY2lhbCcpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25UYWtlb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25UYWtlb3ZlclJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkZpbmFsaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0Q29ubmVjdGlvblN0YXRlSGFuZGxlcigoc3RhdGUpID0+IHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKHN0YXRlKTtcbiAgICAgICAgaWYgKHN0YXRlICE9PSAnY29ubmVjdGVkJykge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRXZWxjb21lRGF0YUhhbmRsZXIoKGRhdGEpID0+IHtcbiAgICAgICAgc2V0V2VsY29tZVRpdGxlKGRhdGEudGl0bGUgPz8gbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVJbWFnZVVybChkYXRhLmltYWdlVXJsID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lTWVzc2FnZShkYXRhLm1lc3NhZ2UgPz8gbnVsbCk7XG4gICAgICAgIGlmIChkYXRhLnBvc3NpYmxlUXVlcmllcyAmJiBkYXRhLnBvc3NpYmxlUXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKGRhdGEucG9zc2libGVRdWVyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENoZWNrIGZvciBhIHNhdmVkIGNvbnZlcnNhdGlvbiBhbmQgY29ubmVjdCB0byBpdFxuICAgICAgY29uc3QgY29udklkID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDb252ZXJzYXRpb25JZCgpO1xuICAgICAgaWYgKGNvbnZJZCkge1xuICAgICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5pc0NvbnZlcnNhdGlvbkZpbmFsaXplZCgpKSB7XG4gICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5jb25uZWN0V2ViU29ja2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFB1bGwgaW5pdGlhbCBzdGF0aWMgZGF0YVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzPy4oKSB8fCBbXTtcbiAgICAgICAgaWYgKHF1ZXJpZXMubGVuZ3RoKSBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhPy4oKTtcbiAgICAgICAgaWYgKHdlbGNvbWUpIHtcbiAgICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhpbmtpbmcgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnPy4oKTtcbiAgICAgICAgaWYgKHRoaW5raW5nKSB7XG4gICAgICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKHRoaW5raW5nLnBocmFzZXMgfHwgW10pO1xuICAgICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyh0aGlua2luZy5kZWxheU1zIHx8IDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAvLyBKdXN0IHVwZGF0ZSBtZXRhZGF0YSB3aXRob3V0IHJlLWluaXRpYWxpemluZ1xuICAgICAgaWYgKG1ldGFkYXRhQ2hhbmdlZCkge1xuICAgICAgICBtZXRhZGF0YVJlZi5jdXJyZW50ID0gbWV0YWRhdGFTdHJpbmc7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsd2F5cyB1cGRhdGUgaGFuZGxlcnMgd2hlbiBjYWxsYmFja3MgY2hhbmdlICh3aXRob3V0IHJlLWluaXRpYWxpemluZylcbiAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRUYWtlb3ZlckhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvblRha2VvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvblRha2VvdmVyUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0RmluYWxpemVkSGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRmluYWxpemVSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uRmluYWxpemVSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDbGVhbnVwIG9ubHkgb24gdW5tb3VudFxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBPbmx5IGNsZWFudXAgb24gdW5tb3VudCwgbm90IG9uIGV2ZXJ5IGRlcGVuZGVuY3kgY2hhbmdlXG4gICAgfTtcbiAgfSwgW2Jhc2VVcmwsIGFwaUtleSwgdGVuYW50LCBtZXRhZGF0YVN0cmluZywgbGFuZ3VhZ2UsIHVzZVdzXSk7XG5cbiAgLy8gVXBkYXRlIGxhbmd1YWdlIHdoZW4gaXQgY2hhbmdlcyAod2l0aG91dCByZS1pbml0aWFsaXppbmcgdGhlIHNlcnZpY2UpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpO1xuICAgIH1cbiAgfSwgW2xhbmd1YWdlXSk7XG5cbiAgLy8gTG9hZCBtZXNzYWdlcyBmb3IgY3VycmVudCBwYWlyIHdoZW4gYXZhaWxhYmxlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoIWtleSkge1xuICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgIHNldE1lc3NhZ2VzKHN0b3JlZCA/IEpTT04ucGFyc2Uoc3RvcmVkKSA6IFtdKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgIH1cbiAgfSwgW2FwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBQZXJzaXN0IG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXJcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbbWVzc2FnZXMsIGFwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb25cbiAgY29uc3QgcmVzZXRDb252ZXJzYXRpb24gPSB1c2VDYWxsYmFjayhhc3luYyAocmVDYXB0Y2hhVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RpbmcnKTtcbiAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgc2V0TWVzc2FnZXMoW10pO1xuICAgIHNldFBvc3NpYmxlUXVlcmllcyhbXSk7XG4gICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgIHNldFdlbGNvbWVJbWFnZVVybChudWxsKTtcbiAgICBzZXRXZWxjb21lTWVzc2FnZShudWxsKTtcbiAgICBzZXRUaGlua2luZ1BocmFzZXMoW10pO1xuICAgIHNldFRoaW5raW5nRGVsYXlNcygxMDAwKTtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgfVxuICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc2V0IHRoZSBjb252ZXJzYXRpb24gaW4gdGhlIGNoYXQgc2VydmljZVxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENvbnZlcnNhdGlvbigpO1xuICAgICAgXG4gICAgICAvLyBTdGFydCBhIG5ldyBjb252ZXJzYXRpb25cbiAgICAgIGNvbnN0IGNvbnZJZCA9IGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW4pO1xuICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGVkJyk7XG5cbiAgICAgIC8vIEdldCBwb3NzaWJsZSBxdWVyaWVzIGZyb20gQVBJIHJlc3BvbnNlXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMpIHtcbiAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgIGlmIChxdWVyaWVzICYmIHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhxdWVyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gd2VsY29tZSBhbmQgdGhpbmtpbmcgZGF0YVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgY29uc3Qgd2VsY29tZSA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEoKTtcbiAgICAgICAgc2V0V2VsY29tZVRpdGxlKHdlbGNvbWUudGl0bGUgfHwgbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lTWVzc2FnZSh3ZWxjb21lLm1lc3NhZ2UgfHwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICBjb25zdCB0aGlua2luZyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcoKTtcbiAgICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKHRoaW5raW5nLnBocmFzZXMgfHwgW10pO1xuICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCB1cGxvYWRGaWxlID0gdXNlQ2FsbGJhY2soYXN5bmMgKGZpbGU6IEZpbGUpOiBQcm9taXNlPEF0dGFjaG1lbnQgfCBudWxsPiA9PiB7XG4gICAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50Py5nZXRDb252ZXJzYXRpb25JZCgpOyBcbiAgICBpZiAoIWNvbnZlcnNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXBsb2FkUmVzdWx0ID0gYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudD8udXBsb2FkRmlsZShjb252ZXJzYXRpb25JZCwgZmlsZSk7XG5cbiAgICAgIC8vIGNvbnN0cnVjdCB0aGUgZmlsZSB1cmwgd2l0aCB0aGUgYmFzZSB1cmxcbiAgICAgIGNvbnN0IGZpbGVfdXJsID0gbmV3IFVSTCh1cGxvYWRSZXN1bHQhLmZpbGVfdXJsISwgYmFzZVVybCkuaHJlZjtcbiAgICAgIFxuICAgICAgY29uc3QgYXR0YWNobWVudDogQXR0YWNobWVudCA9IHtcbiAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgdXJsOiBmaWxlX3VybCxcbiAgICAgICAgZmlsZV9pZDogdXBsb2FkUmVzdWx0Py5maWxlX2lkLFxuICAgICAgfTtcblxuICAgICAgc2V0UHJlbG9hZGVkQXR0YWNobWVudHMocHJldiA9PiBbLi4ucHJldiwgYXR0YWNobWVudF0pO1xuICAgICAgcmV0dXJuIGF0dGFjaG1lbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwgW2FwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXksIGlzVG9rZW5FeHBpcmVkRXJyb3IsIHJlc2V0VG9Jbml0aWFsU3RhdGVdKTtcblxuICAvLyBTZW5kIG1lc3NhZ2VcbiAgY29uc3Qgc2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhhc3luYyAodGV4dDogc3RyaW5nLCBmaWxlczogRmlsZVtdID0gW10sIGV4dHJhTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCByZUNhcHRjaGFUb2tlbj86IHN0cmluZykgPT4ge1xuICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGF0IHNlcnZpY2Ugbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcblxuICAgICAgY29uc3QgbmV3QXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xuICAgICAgXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzID0gZmlsZXMubWFwKGYgPT4gcHJlbG9hZGVkQXR0YWNobWVudHMuZmluZChwYSA9PiBwYS5uYW1lID09PSBmLm5hbWUgJiYgcGEuc2l6ZSA9PT0gZi5zaXplKSkuZmlsdGVyKEJvb2xlYW4pIGFzIEF0dGFjaG1lbnRbXTtcbiAgICAgICAgbmV3QXR0YWNobWVudHMucHVzaCguLi51cGxvYWRlZEZpbGVzKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgdHlwaW5nIGltbWVkaWF0ZWx5IHdoZW4gdXNlciBzZW5kcywgdW5sZXNzIGNvbnZlcnNhdGlvbiBpcyB0YWtlbiBvdmVyIGJ5IGEgaHVtYW5cbiAgICAgIGlmICghaXNUYWtlbk92ZXIpIHtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyh0cnVlKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZW5kTWVzc2FnZSh0ZXh0LCBuZXdBdHRhY2htZW50cywgZXh0cmFNZXRhZGF0YSwgcmVDYXB0Y2hhVG9rZW4pO1xuXG4gICAgICBzZXRQcmVsb2FkZWRBdHRhY2htZW50cyhbXSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIGlmIChpc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICByZXNldFRvSW5pdGlhbFN0YXRlKCk7XG4gICAgICB9XG4gICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSwgW3ByZWxvYWRlZEF0dGFjaG1lbnRzLCBpc1Rha2VuT3ZlciwgaXNUb2tlbkV4cGlyZWRFcnJvciwgcmVzZXRUb0luaXRpYWxTdGF0ZV0pO1xuXG4gIGNvbnN0IHN0YXJ0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soYXN5bmMgKHJlQ2FwdGNoYVRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGluZycpO1xuICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgICAgXG4gICAgICAvLyBSZXNldCBzdGF0ZSBmb3IgbmV3IGNvbnZlcnNhdGlvblxuICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9XG4gICAgICBzZXRJc0ZpbmFsaXplZChmYWxzZSk7XG4gICAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQucmVzZXRDb252ZXJzYXRpb24oKTtcblxuICAgICAgY29uc3QgY29udklkID0gYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlbik7XG4gICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0ZWQnKTtcblxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcygpO1xuICAgICAgICBpZiAocXVlcmllcyAmJiBxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKSB7XG4gICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKCk7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2Uod2VsY29tZS5tZXNzYWdlIHx8IG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcpIHtcbiAgICAgICAgY29uc3QgdGhpbmtpbmcgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnKCk7XG4gICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgLy8gQWRkIGZlZWRiYWNrIHRvIGFuIGFnZW50IG1lc3NhZ2VcbiAgY29uc3QgYWRkRmVlZGJhY2sgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAobWVzc2FnZUlkOiBzdHJpbmcsIHZhbHVlOiAnZ29vZCcgfCAnYmFkJywgZmVlZGJhY2tNZXNzYWdlPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHNlbmQgZmVlZGJhY2s6IENoYXRTZXJ2aWNlIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3Qgc2VuZCBmZWVkYmFjazogbWVzc2FnZUlkIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5hZGRGZWVkYmFjayhtZXNzYWdlSWQsIHZhbHVlLCBmZWVkYmFja01lc3NhZ2UpO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZlZWRiYWNrOiBNZXNzYWdlRmVlZGJhY2sgPSB7XG4gICAgICAgICAgZmVlZGJhY2s6IHZhbHVlLFxuICAgICAgICAgIGZlZWRiYWNrX21lc3NhZ2U6IGZlZWRiYWNrTWVzc2FnZSxcbiAgICAgICAgICBmZWVkYmFja190aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRNZXNzYWdlcyhwcmV2ID0+XG4gICAgICAgICAgcHJldi5tYXAobSA9PiB7XG4gICAgICAgICAgICAvLyBNYXRjaCBieSBtZXNzYWdlX2lkIG9yIGlkIGZpZWxkXG4gICAgICAgICAgICBjb25zdCBtc2dJZCA9IG0ubWVzc2FnZV9pZCB8fCAobSBhcyBhbnkpLmlkO1xuICAgICAgICAgICAgcmV0dXJuIG1zZ0lkID09PSBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgPyB7IC4uLm0sIGZlZWRiYWNrOiBbLi4uKG0uZmVlZGJhY2sgfHwgW10pLCBuZXdGZWVkYmFja10gfVxuICAgICAgICAgICAgICA6IG07XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNMb2FkaW5nLFxuICAgIHNlbmRNZXNzYWdlLFxuICAgIHVwbG9hZEZpbGUsXG4gICAgcmVzZXRDb252ZXJzYXRpb24sXG4gICAgc3RhcnRDb252ZXJzYXRpb24sXG4gICAgY29ubmVjdGlvblN0YXRlLFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIHBvc3NpYmxlUXVlcmllcyxcbiAgICBpc1Rha2VuT3ZlcixcbiAgICBpc0ZpbmFsaXplZCxcbiAgICBpc0FnZW50VHlwaW5nLFxuICAgIGFkZEZlZWRiYWNrLFxuICAgIHdlbGNvbWVUaXRsZSxcbiAgICB3ZWxjb21lSW1hZ2VVcmwsXG4gICAgd2VsY29tZU1lc3NhZ2UsXG4gICAgdGhpbmtpbmdQaHJhc2VzLFxuICAgIHRoaW5raW5nRGVsYXlNcyxcbiAgfTtcbn07XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { ChatMessage, Attachment, AgentThinkingConfig, AgentWelcomeData } from "../types";
1
+ import { ChatMessage, Attachment, AgentThinkingConfig, AgentWelcomeData, FileUploadResponse } from "../types";
2
2
  export declare class ChatService {
3
3
  private baseUrl;
4
4
  private apiKey;
@@ -21,7 +21,8 @@ export declare class ChatService {
21
21
  private tenant;
22
22
  private agentId;
23
23
  private language;
24
- constructor(baseUrl: string, apiKey: string, metadata?: Record<string, any>, tenant?: string, language?: string);
24
+ private useWs;
25
+ constructor(baseUrl: string, apiKey: string, metadata?: Record<string, any>, tenant?: string, language?: string, useWs?: boolean);
25
26
  private getStorageKey;
26
27
  /**
27
28
  * Set the language for Accept-Language header
@@ -57,6 +58,7 @@ export declare class ChatService {
57
58
  * Save the current conversation ID to localStorage
58
59
  */
59
60
  private saveConversation;
61
+ private isTokenExpiredError;
60
62
  /**
61
63
  * Reset the current conversation by clearing the ID and websocket
62
64
  */
@@ -72,9 +74,7 @@ export declare class ChatService {
72
74
  isConversationFinalized(): boolean;
73
75
  startConversation(reCaptchaToken: string | undefined): Promise<string>;
74
76
  sendMessage(message: string, attachments?: Attachment[], extraMetadata?: Record<string, any>, reCaptchaToken?: string): Promise<void>;
75
- uploadFile(chatId: string, file: File): Promise<{
76
- fileUrl: string;
77
- }>;
77
+ uploadFile(chatId: string, file: File): Promise<FileUploadResponse | null>;
78
78
  connectWebSocket(): void;
79
79
  disconnect(): void;
80
80
  private fetchWelcomeImage;