genassist-chat-react 1.0.15 → 1.0.16

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.
@@ -54,7 +54,7 @@ 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 } from 'react';
57
+ import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
58
58
  import { ChatService } from '../services/chatService';
59
59
  export var useChat = function (_a) {
60
60
  var baseUrl = _a.baseUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize;
@@ -79,86 +79,146 @@ export var useChat = function (_a) {
79
79
  return null;
80
80
  return "genassist_conversation_messages:".concat(apiKeyVal, ":").concat(convId);
81
81
  }, []);
82
- // Initialize chat service
82
+ // Deep compare metadata to prevent unnecessary re-initializations
83
+ // Only re-initialize if metadata actually changes (by value, not reference)
84
+ var metadataString = useMemo(function () { return JSON.stringify(metadata || {}); }, [metadata]);
85
+ var metadataRef = useRef(metadataString);
86
+ var prevBaseUrlRef = useRef(baseUrl);
87
+ var prevApiKeyRef = useRef(apiKey);
88
+ var prevTenantRef = useRef(tenant);
89
+ // Store callbacks in refs so they don't trigger re-initialization
90
+ var onErrorRef = useRef(onError);
91
+ var onTakeoverRef = useRef(onTakeover);
92
+ var onFinalizeRef = useRef(onFinalize);
93
+ // Update callback refs when they change
94
+ useEffect(function () {
95
+ onErrorRef.current = onError;
96
+ }, [onError]);
97
+ useEffect(function () {
98
+ onTakeoverRef.current = onTakeover;
99
+ }, [onTakeover]);
100
+ useEffect(function () {
101
+ onFinalizeRef.current = onFinalize;
102
+ }, [onFinalize]);
103
+ // Initialize chat service - only when baseUrl, apiKey, tenant, or metadata actually change
83
104
  useEffect(function () {
84
105
  var _a, _b, _c, _d, _e, _f;
85
- chatServiceRef.current = new ChatService(baseUrl, apiKey, metadata, tenant);
86
- chatServiceRef.current.setMessageHandler(function (message) {
87
- var normalizedMessage = __assign(__assign({}, message), { create_time: (!message.create_time || isNaN(message.create_time))
88
- ? Math.floor(Date.now() / 1000)
89
- : message.create_time });
90
- setMessages(function (prevMessages) { return __spreadArray(__spreadArray([], prevMessages, true), [normalizedMessage], false); });
91
- // Stop typing animation when agent or system message arrives
92
- if (normalizedMessage.speaker === 'agent' || normalizedMessage.speaker === 'special') {
93
- setIsAgentTyping(false);
94
- }
95
- });
96
- chatServiceRef.current.setTakeoverHandler(function () {
97
- setIsTakenOver(true);
98
- setIsAgentTyping(false);
99
- if (onTakeover) {
100
- onTakeover();
101
- }
102
- });
103
- chatServiceRef.current.setFinalizedHandler(function () {
104
- setIsFinalized(true);
105
- setIsAgentTyping(false);
106
- if (onFinalize) {
107
- onFinalize();
106
+ var metadataChanged = metadataRef.current !== metadataString;
107
+ var baseUrlChanged = prevBaseUrlRef.current !== baseUrl;
108
+ var apiKeyChanged = prevApiKeyRef.current !== apiKey;
109
+ var tenantChanged = prevTenantRef.current !== tenant;
110
+ var needsReinit = !chatServiceRef.current || baseUrlChanged || apiKeyChanged || tenantChanged || metadataChanged;
111
+ if (needsReinit) {
112
+ // Update refs
113
+ if (metadataChanged)
114
+ metadataRef.current = metadataString;
115
+ if (baseUrlChanged)
116
+ prevBaseUrlRef.current = baseUrl;
117
+ if (apiKeyChanged)
118
+ prevApiKeyRef.current = apiKey;
119
+ if (tenantChanged)
120
+ prevTenantRef.current = tenant;
121
+ // Clean up existing service if it exists
122
+ if (chatServiceRef.current) {
123
+ chatServiceRef.current.disconnect();
124
+ chatServiceRef.current.setWelcomeDataHandler(null);
108
125
  }
109
- });
110
- // Clear typing animation if agent is not connected
111
- chatServiceRef.current.setConnectionStateHandler(function (state) {
112
- setConnectionState(state);
113
- if (state !== 'connected') {
126
+ chatServiceRef.current = new ChatService(baseUrl, apiKey, metadata, tenant);
127
+ // Set up handlers
128
+ chatServiceRef.current.setMessageHandler(function (message) {
129
+ var normalizedMessage = __assign(__assign({}, message), { create_time: (!message.create_time || isNaN(message.create_time))
130
+ ? Math.floor(Date.now() / 1000)
131
+ : message.create_time });
132
+ setMessages(function (prevMessages) { return __spreadArray(__spreadArray([], prevMessages, true), [normalizedMessage], false); });
133
+ // Stop typing animation when agent or system message arrives
134
+ if (normalizedMessage.speaker === 'agent' || normalizedMessage.speaker === 'special') {
135
+ setIsAgentTyping(false);
136
+ }
137
+ });
138
+ chatServiceRef.current.setTakeoverHandler(function () {
139
+ setIsTakenOver(true);
114
140
  setIsAgentTyping(false);
115
- }
116
- });
117
- chatServiceRef.current.setWelcomeDataHandler(function (data) {
118
- var _a, _b, _c;
119
- setWelcomeTitle((_a = data.title) !== null && _a !== void 0 ? _a : null);
120
- setWelcomeImageUrl((_b = data.imageUrl) !== null && _b !== void 0 ? _b : null);
121
- setWelcomeMessage((_c = data.message) !== null && _c !== void 0 ? _c : null);
122
- if (data.possibleQueries && data.possibleQueries.length > 0) {
123
- setPossibleQueries(data.possibleQueries);
124
- }
125
- });
126
- // Check for a saved conversation and connect to it
127
- var convId = chatServiceRef.current.getConversationId();
128
- if (convId) {
129
- setConversationId(convId);
130
- if (chatServiceRef.current.isConversationFinalized()) {
141
+ if (onTakeoverRef.current) {
142
+ onTakeoverRef.current();
143
+ }
144
+ });
145
+ chatServiceRef.current.setFinalizedHandler(function () {
131
146
  setIsFinalized(true);
147
+ setIsAgentTyping(false);
148
+ if (onFinalizeRef.current) {
149
+ onFinalizeRef.current();
150
+ }
151
+ });
152
+ chatServiceRef.current.setConnectionStateHandler(function (state) {
153
+ setConnectionState(state);
154
+ if (state !== 'connected') {
155
+ setIsAgentTyping(false);
156
+ }
157
+ });
158
+ chatServiceRef.current.setWelcomeDataHandler(function (data) {
159
+ var _a, _b, _c;
160
+ setWelcomeTitle((_a = data.title) !== null && _a !== void 0 ? _a : null);
161
+ setWelcomeImageUrl((_b = data.imageUrl) !== null && _b !== void 0 ? _b : null);
162
+ setWelcomeMessage((_c = data.message) !== null && _c !== void 0 ? _c : null);
163
+ if (data.possibleQueries && data.possibleQueries.length > 0) {
164
+ setPossibleQueries(data.possibleQueries);
165
+ }
166
+ });
167
+ // Check for a saved conversation and connect to it
168
+ var convId = chatServiceRef.current.getConversationId();
169
+ if (convId) {
170
+ setConversationId(convId);
171
+ if (chatServiceRef.current.isConversationFinalized()) {
172
+ setIsFinalized(true);
173
+ }
174
+ else {
175
+ chatServiceRef.current.connectWebSocket();
176
+ }
132
177
  }
133
- else {
134
- chatServiceRef.current.connectWebSocket();
178
+ // Pull initial static data
179
+ if (chatServiceRef.current) {
180
+ var queries = ((_b = (_a = chatServiceRef.current).getPossibleQueries) === null || _b === void 0 ? void 0 : _b.call(_a)) || [];
181
+ if (queries.length)
182
+ setPossibleQueries(queries);
183
+ var welcome = (_d = (_c = chatServiceRef.current).getWelcomeData) === null || _d === void 0 ? void 0 : _d.call(_c);
184
+ if (welcome) {
185
+ setWelcomeTitle(welcome.title || null);
186
+ setWelcomeImageUrl(welcome.imageUrl || null);
187
+ setWelcomeMessage(welcome.message || null);
188
+ }
189
+ var thinking = (_f = (_e = chatServiceRef.current).getThinkingConfig) === null || _f === void 0 ? void 0 : _f.call(_e);
190
+ if (thinking) {
191
+ setThinkingPhrases(thinking.phrases || []);
192
+ setThinkingDelayMs(thinking.delayMs || 1000);
193
+ }
135
194
  }
136
195
  }
137
- // Pull initial static data
196
+ else if (chatServiceRef.current && metadata) {
197
+ // Just update metadata without re-initializing
198
+ chatServiceRef.current.metadata = metadata;
199
+ }
200
+ // Always update handlers when callbacks change (without re-initializing)
138
201
  if (chatServiceRef.current) {
139
- var queries = ((_b = (_a = chatServiceRef.current).getPossibleQueries) === null || _b === void 0 ? void 0 : _b.call(_a)) || [];
140
- if (queries.length)
141
- setPossibleQueries(queries);
142
- var welcome = (_d = (_c = chatServiceRef.current).getWelcomeData) === null || _d === void 0 ? void 0 : _d.call(_c);
143
- if (welcome) {
144
- setWelcomeTitle(welcome.title || null);
145
- setWelcomeImageUrl(welcome.imageUrl || null);
146
- setWelcomeMessage(welcome.message || null);
147
- }
148
- var thinking = (_f = (_e = chatServiceRef.current).getThinkingConfig) === null || _f === void 0 ? void 0 : _f.call(_e);
149
- if (thinking) {
150
- setThinkingPhrases(thinking.phrases || []);
151
- setThinkingDelayMs(thinking.delayMs || 1000);
152
- }
202
+ chatServiceRef.current.setTakeoverHandler(function () {
203
+ setIsTakenOver(true);
204
+ setIsAgentTyping(false);
205
+ if (onTakeoverRef.current) {
206
+ onTakeoverRef.current();
207
+ }
208
+ });
209
+ chatServiceRef.current.setFinalizedHandler(function () {
210
+ setIsFinalized(true);
211
+ setIsAgentTyping(false);
212
+ if (onFinalizeRef.current) {
213
+ onFinalizeRef.current();
214
+ }
215
+ });
153
216
  }
154
- // Cleanup
217
+ // Cleanup only on unmount
155
218
  return function () {
156
- if (chatServiceRef.current) {
157
- chatServiceRef.current.disconnect();
158
- chatServiceRef.current.setWelcomeDataHandler(null);
159
- }
219
+ // Only cleanup on unmount, not on every dependency change
160
220
  };
161
- }, [baseUrl, apiKey, metadata, onError, onTakeover, onFinalize]);
221
+ }, [baseUrl, apiKey, tenant, metadataString]);
162
222
  // Load messages for current pair when available
163
223
  useEffect(function () {
164
224
  var key = buildMessagesKey(apiKey, conversationId);
@@ -245,8 +305,8 @@ export var useChat = function (_a) {
245
305
  error_1 = _a.sent();
246
306
  setConnectionState('disconnected');
247
307
  setIsAgentTyping(false);
248
- if (onError && error_1 instanceof Error) {
249
- onError(error_1);
308
+ if (onErrorRef.current && error_1 instanceof Error) {
309
+ onErrorRef.current(error_1);
250
310
  }
251
311
  else {
252
312
  // ignore
@@ -258,7 +318,7 @@ export var useChat = function (_a) {
258
318
  case 5: return [2 /*return*/];
259
319
  }
260
320
  });
261
- }); }, [onError]);
321
+ }); }, []);
262
322
  var uploadFile = useCallback(function (file) { return __awaiter(void 0, void 0, void 0, function () {
263
323
  var fileUrl, attachment_1, error_2;
264
324
  return __generator(this, function (_a) {
@@ -283,14 +343,14 @@ export var useChat = function (_a) {
283
343
  return [2 /*return*/, attachment_1];
284
344
  case 3:
285
345
  error_2 = _a.sent();
286
- if (onError) {
287
- onError(error_2);
346
+ if (onErrorRef.current) {
347
+ onErrorRef.current(error_2);
288
348
  }
289
349
  return [2 /*return*/, null];
290
350
  case 4: return [2 /*return*/];
291
351
  }
292
352
  });
293
- }); }, [onError]);
353
+ }); }, []);
294
354
  // Send message
295
355
  var sendMessage = useCallback(function (text_1) {
296
356
  var args_1 = [];
@@ -327,8 +387,8 @@ export var useChat = function (_a) {
327
387
  case 3:
328
388
  error_3 = _a.sent();
329
389
  setIsAgentTyping(false);
330
- if (onError && error_3 instanceof Error) {
331
- onError(error_3);
390
+ if (onErrorRef.current && error_3 instanceof Error) {
391
+ onErrorRef.current(error_3);
332
392
  }
333
393
  else {
334
394
  // ignore
@@ -341,7 +401,7 @@ export var useChat = function (_a) {
341
401
  }
342
402
  });
343
403
  });
344
- }, [onError, preloadedAttachments, isTakenOver]);
404
+ }, [preloadedAttachments, isTakenOver]);
345
405
  var startConversation = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
346
406
  var key, convId, queries, welcome, thinking, error_4;
347
407
  return __generator(this, function (_a) {
@@ -393,8 +453,8 @@ export var useChat = function (_a) {
393
453
  error_4 = _a.sent();
394
454
  setConnectionState('disconnected');
395
455
  setIsAgentTyping(false);
396
- if (onError && error_4 instanceof Error) {
397
- onError(error_4);
456
+ if (onErrorRef.current && error_4 instanceof Error) {
457
+ onErrorRef.current(error_4);
398
458
  }
399
459
  else {
400
460
  // ignore
@@ -406,14 +466,19 @@ export var useChat = function (_a) {
406
466
  case 5: return [2 /*return*/];
407
467
  }
408
468
  });
409
- }); }, [onError]);
469
+ }); }, []);
410
470
  // Add feedback to an agent message
411
471
  var addFeedback = useCallback(function (messageId, value, feedbackMessage) { return __awaiter(void 0, void 0, void 0, function () {
412
472
  var newFeedback_1, error_5;
413
473
  return __generator(this, function (_a) {
414
474
  switch (_a.label) {
415
475
  case 0:
416
- if (!chatServiceRef.current || !conversationId) {
476
+ if (!chatServiceRef.current) {
477
+ console.error('Cannot send feedback: ChatService not initialized');
478
+ return [2 /*return*/];
479
+ }
480
+ if (!messageId) {
481
+ console.error('Cannot send feedback: messageId is required');
417
482
  return [2 /*return*/];
418
483
  }
419
484
  _a.label = 1;
@@ -429,21 +494,23 @@ export var useChat = function (_a) {
429
494
  };
430
495
  setMessages(function (prev) {
431
496
  return prev.map(function (m) {
432
- return m.message_id === messageId
497
+ // Match by message_id or id field
498
+ var msgId = m.message_id || m.id;
499
+ return msgId === messageId
433
500
  ? __assign(__assign({}, m), { feedback: __spreadArray(__spreadArray([], (m.feedback || []), true), [newFeedback_1], false) }) : m;
434
501
  });
435
502
  });
436
503
  return [3 /*break*/, 4];
437
504
  case 3:
438
505
  error_5 = _a.sent();
439
- if (onError) {
440
- onError(error_5);
506
+ if (onErrorRef.current) {
507
+ onErrorRef.current(error_5);
441
508
  }
442
509
  return [3 /*break*/, 4];
443
510
  case 4: return [2 /*return*/];
444
511
  }
445
512
  });
446
- }); }, [conversationId, onError]);
513
+ }); }, []);
447
514
  return {
448
515
  messages: messages,
449
516
  isLoading: isLoading,
@@ -465,4 +532,4 @@ export var useChat = function (_a) {
465
532
  thinkingDelayMs: thinkingDelayMs,
466
533
  };
467
534
  };
468
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFhdEQsTUFBTSxDQUFDLElBQU0sT0FBTyxHQUFHLFVBQUMsRUFBb0Y7UUFBbEYsT0FBTyxhQUFBLEVBQUUsTUFBTSxZQUFBLEVBQUUsTUFBTSxZQUFBLEVBQUUsUUFBUSxjQUFBLEVBQUUsT0FBTyxhQUFBLEVBQUUsVUFBVSxnQkFBQSxFQUFFLFVBQVUsZ0JBQUE7SUFDcEYsSUFBQSxLQUEwQixRQUFRLENBQWdCLEVBQUUsQ0FBQyxFQUFwRCxRQUFRLFFBQUEsRUFBRSxXQUFXLFFBQStCLENBQUM7SUFDdEQsSUFBQSxLQUE0QixRQUFRLENBQVUsS0FBSyxDQUFDLEVBQW5ELFNBQVMsUUFBQSxFQUFFLFlBQVksUUFBNEIsQ0FBQztJQUNyRCxJQUFBLEtBQWtELFFBQVEsQ0FBZSxFQUFFLENBQUMsRUFBM0Usb0JBQW9CLFFBQUEsRUFBRSx1QkFBdUIsUUFBOEIsQ0FBQztJQUM3RSxJQUFBLEtBQXdDLFFBQVEsQ0FBOEMsY0FBYyxDQUFDLEVBQTVHLGVBQWUsUUFBQSxFQUFFLGtCQUFrQixRQUF5RSxDQUFDO0lBQzlHLElBQUEsS0FBb0MsUUFBUSxDQUFVLEtBQUssQ0FBQyxFQUEzRCxhQUFhLFFBQUEsRUFBRSxnQkFBZ0IsUUFBNEIsQ0FBQztJQUNuRSxJQUFNLGNBQWMsR0FBRyxNQUFNLENBQXFCLElBQUksQ0FBQyxDQUFDO0lBQ2xELElBQUEsS0FBc0MsUUFBUSxDQUFnQixJQUFJLENBQUMsRUFB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Y2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2hhdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIEF0dGFjaG1lbnQsIE1lc3NhZ2VGZWVkYmFjayB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VDaGF0UHJvcHMge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xuICB0ZW5hbnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgb25FcnJvcj86IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIG9uVGFrZW92ZXI/OiAoKSA9PiB2b2lkO1xuICBvbkZpbmFsaXplPzogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXQgPSAoeyBiYXNlVXJsLCBhcGlLZXksIHRlbmFudCwgbWV0YWRhdGEsIG9uRXJyb3IsIG9uVGFrZW92ZXIsIG9uRmluYWxpemUgfTogVXNlQ2hhdFByb3BzKSA9PiB7XG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oW10pO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbcHJlbG9hZGVkQXR0YWNobWVudHMsIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzXSA9IHVzZVN0YXRlPEF0dGFjaG1lbnRbXT4oW10pO1xuICBjb25zdCBbY29ubmVjdGlvblN0YXRlLCBzZXRDb25uZWN0aW9uU3RhdGVdID0gdXNlU3RhdGU8J2Nvbm5lY3RpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJz4oJ2Rpc2Nvbm5lY3RlZCcpO1xuICBjb25zdCBbaXNBZ2VudFR5cGluZywgc2V0SXNBZ2VudFR5cGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGNoYXRTZXJ2aWNlUmVmID0gdXNlUmVmPENoYXRTZXJ2aWNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtjb252ZXJzYXRpb25JZCwgc2V0Q29udmVyc2F0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtwb3NzaWJsZVF1ZXJpZXMsIHNldFBvc3NpYmxlUXVlcmllc10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oW10pO1xuICBjb25zdCBbd2VsY29tZVRpdGxlLCBzZXRXZWxjb21lVGl0bGVdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFt3ZWxjb21lSW1hZ2VVcmwsIHNldFdlbGNvbWVJbWFnZVVybF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVNZXNzYWdlLCBzZXRXZWxjb21lTWVzc2FnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3RoaW5raW5nUGhyYXNlcywgc2V0VGhpbmtpbmdQaHJhc2VzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt0aGlua2luZ0RlbGF5TXMsIHNldFRoaW5raW5nRGVsYXlNc10gPSB1c2VTdGF0ZTxudW1iZXI+KDEwMDApO1xuICBjb25zdCBbaXNUYWtlbk92ZXIsIHNldElzVGFrZW5PdmVyXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2lzRmluYWxpemVkLCBzZXRJc0ZpbmFsaXplZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gU2NvcGVkIG1lc3NhZ2VzIGtleSBmb3IgYXBpS2V5LCBjb252ZXJzYXRpb0lkXG4gIGNvbnN0IGJ1aWxkTWVzc2FnZXNLZXkgPSB1c2VDYWxsYmFjaygoYXBpS2V5VmFsOiBzdHJpbmcsIGNvbnZJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIGlmICghY29udklkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYGdlbmFzc2lzdF9jb252ZXJzYXRpb25fbWVzc2FnZXM6JHthcGlLZXlWYWx9OiR7Y29udklkfWA7XG4gIH0sIFtdKTtcblxuICAvLyBJbml0aWFsaXplIGNoYXQgc2VydmljZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQgPSBuZXcgQ2hhdFNlcnZpY2UoYmFzZVVybCwgYXBpS2V5LCBtZXRhZGF0YSwgdGVuYW50KTtcbiAgICBcbiAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldE1lc3NhZ2VIYW5kbGVyKChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICBjcmVhdGVfdGltZTogKCFtZXNzYWdlLmNyZWF0ZV90aW1lIHx8IGlzTmFOKG1lc3NhZ2UuY3JlYXRlX3RpbWUpKVxuICAgICAgICAgID8gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcbiAgICAgICAgICA6IG1lc3NhZ2UuY3JlYXRlX3RpbWUsXG4gICAgICB9O1xuXG4gICAgICBzZXRNZXNzYWdlcyhwcmV2TWVzc2FnZXMgPT4gWy4uLnByZXZNZXNzYWdlcywgbm9ybWFsaXplZE1lc3NhZ2VdKTtcbiAgICAgIC8vIFN0b3AgdHlwaW5nIGFuaW1hdGlvbiB3aGVuIGFnZW50IG9yIHN5c3RlbSBtZXNzYWdlIGFycml2ZXNcbiAgICAgIGlmIChub3JtYWxpemVkTWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnIHx8IG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09ICdzcGVjaWFsJykge1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgIHNldElzVGFrZW5PdmVyKHRydWUpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBpZiAob25UYWtlb3Zlcikge1xuICAgICAgICBvblRha2VvdmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIGlmIChvbkZpbmFsaXplKSB7XG4gICAgICAgIG9uRmluYWxpemUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENsZWFyIHR5cGluZyBhbmltYXRpb24gaWYgYWdlbnQgaXMgbm90IGNvbm5lY3RlZFxuICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0Q29ubmVjdGlvblN0YXRlSGFuZGxlcigoc3RhdGUpID0+IHtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShzdGF0ZSk7XG4gICAgICBpZiAoc3RhdGUgIT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRXZWxjb21lRGF0YUhhbmRsZXIoKGRhdGEpID0+IHtcbiAgICAgIHNldFdlbGNvbWVUaXRsZShkYXRhLnRpdGxlID8/IG51bGwpO1xuICAgICAgc2V0V2VsY29tZUltYWdlVXJsKGRhdGEuaW1hZ2VVcmwgPz8gbnVsbCk7XG4gICAgICBzZXRXZWxjb21lTWVzc2FnZShkYXRhLm1lc3NhZ2UgPz8gbnVsbCk7XG4gICAgICBpZiAoZGF0YS5wb3NzaWJsZVF1ZXJpZXMgJiYgZGF0YS5wb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoZGF0YS5wb3NzaWJsZVF1ZXJpZXMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGEgc2F2ZWQgY29udmVyc2F0aW9uIGFuZCBjb25uZWN0IHRvIGl0XG4gICAgY29uc3QgY29udklkID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDb252ZXJzYXRpb25JZCgpO1xuICAgIGlmIChjb252SWQpIHtcbiAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5pc0NvbnZlcnNhdGlvbkZpbmFsaXplZCgpKSB7XG4gICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5jb25uZWN0V2ViU29ja2V0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFB1bGwgaW5pdGlhbCBzdGF0aWMgZGF0YVxuICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXM/LigpIHx8IFtdO1xuICAgICAgaWYgKHF1ZXJpZXMubGVuZ3RoKSBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YT8uKCk7XG4gICAgICBpZiAod2VsY29tZSkge1xuICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKHdlbGNvbWUuaW1hZ2VVcmwgfHwgbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZz8uKCk7XG4gICAgICBpZiAodGhpbmtpbmcpIHtcbiAgICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKHRoaW5raW5nLnBocmFzZXMgfHwgW10pO1xuICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZGlzY29ubmVjdCgpO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFdlbGNvbWVEYXRhSGFuZGxlcihudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbYmFzZVVybCwgYXBpS2V5LCBtZXRhZGF0YSwgb25FcnJvciwgb25UYWtlb3Zlciwgb25GaW5hbGl6ZV0pO1xuXG4gIC8vIExvYWQgbWVzc2FnZXMgZm9yIGN1cnJlbnQgcGFpciB3aGVuIGF2YWlsYWJsZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBzZXRNZXNzYWdlcyhzdG9yZWQgPyBKU09OLnBhcnNlKHN0b3JlZCkgOiBbXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICB9XG4gIH0sIFthcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gUGVyc2lzdCBtZXNzYWdlcyBmb3IgY3VycmVudCBwYWlyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfSwgW21lc3NhZ2VzLCBhcGlLZXksIGNvbnZlcnNhdGlvbklkLCBidWlsZE1lc3NhZ2VzS2V5XSk7XG5cbiAgLy8gUmVzZXQgY29udmVyc2F0aW9uXG4gIGNvbnN0IHJlc2V0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RpbmcnKTtcbiAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgc2V0TWVzc2FnZXMoW10pO1xuICAgIHNldFBvc3NpYmxlUXVlcmllcyhbXSk7XG4gICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgIHNldFdlbGNvbWVJbWFnZVVybChudWxsKTtcbiAgICBzZXRXZWxjb21lTWVzc2FnZShudWxsKTtcbiAgICBzZXRUaGlua2luZ1BocmFzZXMoW10pO1xuICAgIHNldFRoaW5raW5nRGVsYXlNcygxMDAwKTtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgfVxuICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc2V0IHRoZSBjb252ZXJzYXRpb24gaW4gdGhlIGNoYXQgc2VydmljZVxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENvbnZlcnNhdGlvbigpO1xuICAgICAgXG4gICAgICAvLyBTdGFydCBhIG5ldyBjb252ZXJzYXRpb25cbiAgICAgIGNvbnN0IGNvbnZJZCA9IGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc3RhcnRDb252ZXJzYXRpb24oKTtcbiAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RlZCcpO1xuXG4gICAgICAvLyBHZXQgcG9zc2libGUgcXVlcmllcyBmcm9tIEFQSSByZXNwb25zZVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcygpO1xuICAgICAgICBpZiAocXVlcmllcyAmJiBxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHdlbGNvbWUgYW5kIHRoaW5raW5nIGRhdGFcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKSB7XG4gICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKCk7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2Uod2VsY29tZS5tZXNzYWdlIHx8IG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcpIHtcbiAgICAgICAgY29uc3QgdGhpbmtpbmcgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnKCk7XG4gICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIGlmIChvbkVycm9yICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtvbkVycm9yXSk7XG5cbiAgY29uc3QgdXBsb2FkRmlsZSA9IHVzZUNhbGxiYWNrKGFzeW5jIChmaWxlOiBGaWxlKTogUHJvbWlzZTxBdHRhY2htZW50IHwgbnVsbD4gPT4ge1xuICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCB8fCAhY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDb252ZXJzYXRpb25JZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBmaWxlVXJsIH0gPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnVwbG9hZEZpbGUoXG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q29udmVyc2F0aW9uSWQoKSBhcyBzdHJpbmcsXG4gICAgICAgIGZpbGVcbiAgICAgICk7XG4gICAgICBcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQgPSB7XG4gICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgIHVybDogZmlsZVVybCxcbiAgICAgIH07XG5cbiAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKHByZXYgPT4gWy4uLnByZXYsIGF0dGFjaG1lbnRdKTtcbiAgICAgIHJldHVybiBhdHRhY2htZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob25FcnJvcikge1xuICAgICAgICBvbkVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwgW29uRXJyb3JdKTtcblxuICAvLyBTZW5kIG1lc3NhZ2VcbiAgY29uc3Qgc2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhhc3luYyAodGV4dDogc3RyaW5nLCBmaWxlczogRmlsZVtdID0gW10sIGV4dHJhTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7XG4gICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoYXQgc2VydmljZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuXG4gICAgICBjb25zdCBuZXdBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XG4gICAgICBcbiAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHVwbG9hZGVkRmlsZXMgPSBmaWxlcy5tYXAoZiA9PiBwcmVsb2FkZWRBdHRhY2htZW50cy5maW5kKHBhID0+IHBhLm5hbWUgPT09IGYubmFtZSAmJiBwYS5zaXplID09PSBmLnNpemUpKS5maWx0ZXIoQm9vbGVhbikgYXMgQXR0YWNobWVudFtdO1xuICAgICAgICBuZXdBdHRhY2htZW50cy5wdXNoKC4uLnVwbG9hZGVkRmlsZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGFydCB0eXBpbmcgaW1tZWRpYXRlbHkgd2hlbiB1c2VyIHNlbmRzLCB1bmxlc3MgY29udmVyc2F0aW9uIGlzIHRha2VuIG92ZXIgYnkgYSBodW1hblxuICAgICAgaWYgKCFpc1Rha2VuT3Zlcikge1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKHRydWUpO1xuICAgICAgfVxuICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZW5kTWVzc2FnZSh0ZXh0LCBuZXdBdHRhY2htZW50cywgZXh0cmFNZXRhZGF0YSk7XG5cbiAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKFtdKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIGlmIChvbkVycm9yICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtvbkVycm9yLCBwcmVsb2FkZWRBdHRhY2htZW50cywgaXNUYWtlbk92ZXJdKTtcblxuICBjb25zdCBzdGFydENvbnZlcnNhdGlvbiA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGluZycpO1xuICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgICAgXG4gICAgICAvLyBSZXNldCBzdGF0ZSBmb3IgbmV3IGNvbnZlcnNhdGlvblxuICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9XG4gICAgICBzZXRJc0ZpbmFsaXplZChmYWxzZSk7XG4gICAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQucmVzZXRDb252ZXJzYXRpb24oKTtcblxuICAgICAgY29uc3QgY29udklkID0gYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zdGFydENvbnZlcnNhdGlvbigpO1xuICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGVkJyk7XG5cbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcykge1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSkge1xuICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKHdlbGNvbWUuaW1hZ2VVcmwgfHwgbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyh0aGlua2luZy5kZWxheU1zIHx8IDEwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBpZiAob25FcnJvciAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgfVxuICB9LCBbb25FcnJvcl0pO1xuXG4gIC8vIEFkZCBmZWVkYmFjayB0byBhbiBhZ2VudCBtZXNzYWdlXG4gIGNvbnN0IGFkZEZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKG1lc3NhZ2VJZDogc3RyaW5nLCB2YWx1ZTogJ2dvb2QnIHwgJ2JhZCcsIGZlZWRiYWNrTWVzc2FnZT86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50IHx8ICFjb252ZXJzYXRpb25JZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LmFkZEZlZWRiYWNrKG1lc3NhZ2VJZCwgdmFsdWUsIGZlZWRiYWNrTWVzc2FnZSk7XG5cbiAgICAgICAgY29uc3QgbmV3RmVlZGJhY2s6IE1lc3NhZ2VGZWVkYmFjayA9IHtcbiAgICAgICAgICBmZWVkYmFjazogdmFsdWUsXG4gICAgICAgICAgZmVlZGJhY2tfbWVzc2FnZTogZmVlZGJhY2tNZXNzYWdlLFxuICAgICAgICAgIGZlZWRiYWNrX3RpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldE1lc3NhZ2VzKHByZXYgPT5cbiAgICAgICAgICBwcmV2Lm1hcChtID0+XG4gICAgICAgICAgICBtLm1lc3NhZ2VfaWQgPT09IG1lc3NhZ2VJZFxuICAgICAgICAgICAgICA/IHsgLi4ubSwgZmVlZGJhY2s6IFsuLi4obS5mZWVkYmFjayB8fCBbXSksIG5ld0ZlZWRiYWNrXSB9XG4gICAgICAgICAgICAgIDogbVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgICAgb25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtjb252ZXJzYXRpb25JZCwgb25FcnJvcl1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIGlzTG9hZGluZyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICB1cGxvYWRGaWxlLFxuICAgIHJlc2V0Q29udmVyc2F0aW9uLFxuICAgIHN0YXJ0Q29udmVyc2F0aW9uLFxuICAgIGNvbm5lY3Rpb25TdGF0ZSxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBwb3NzaWJsZVF1ZXJpZXMsXG4gICAgaXNUYWtlbk92ZXIsXG4gICAgaXNGaW5hbGl6ZWQsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBhZGRGZWVkYmFjayxcbiAgICB3ZWxjb21lVGl0bGUsXG4gICAgd2VsY29tZUltYWdlVXJsLFxuICAgIHdlbGNvbWVNZXNzYWdlLFxuICAgIHRoaW5raW5nUGhyYXNlcyxcbiAgICB0aGlua2luZ0RlbGF5TXMsXG4gIH07XG59O1xuIl19
535
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBYXRELE1BQU0sQ0FBQyxJQUFNLE9BQU8sR0FBRyxVQUFDLEVBQW9GO1FBQWxGLE9BQU8sYUFBQSxFQUFFLE1BQU0sWUFBQSxFQUFFLE1BQU0sWUFBQSxFQUFFLFFBQVEsY0FBQSxFQUFFLE9BQU8sYUFBQSxFQUFFLFVBQVUsZ0JBQUEsRUFBRSxVQUFVLGdCQUFBO0lBQ3BGLElBQUEsS0FBMEIsUUFBUSxDQUFnQixFQUFFLENBQUMsRUFBcEQsUUFBUSxRQUFBLEVBQUUsV0FBVyxRQUErQixDQUFDO0lBQ3RELElBQUEsS0FBNEIsUUFBUSxDQUFVLEtBQUssQ0FBQyxFQUFuRCxTQUFTLFFBQUEsRUFBRSxZQUFZLFFBQTRCLENBQUM7SUFDckQsSUFBQSxLQUFrRCxRQUFRLENBQWUsRUFBRSxDQUFDLEVBQTNFLG9CQUFvQixRQUFBLEVBQUUsdUJBQXVCLFFBQThCLENBQUM7SUFDN0UsSUFBQSxLQUF3QyxRQUFRLENBQThDLGNBQWMsQ0FBQyxFQUE1RyxlQUFlLFFBQUEsRUFBRSxrQkFBa0IsUUFBeUUsQ0FBQztJQUM5RyxJQUFBLEtBQW9DLFFBQVEsQ0FBVSxLQUFLLENBQUMsRUFBM0QsYUFBYSxRQUFBLEVBQUUsZ0JBQWdCLFFBQTRCLENBQUM7SUFDbkUsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFxQixJQUFJLENBQUMsQ0FBQztJQUNsRCxJQUFBLEtBQXNDLFFBQVEsQ0FBZ0IsSUFB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QWMsQ0FBQyxDQUFDO29CQUNyQyxDQUFDOzs7OztTQUVKLEVBQ0QsRUFBRSxDQUNILENBQUM7SUFFRixPQUFPO1FBQ0wsUUFBUSxVQUFBO1FBQ1IsU0FBUyxXQUFBO1FBQ1QsV0FBVyxhQUFBO1FBQ1gsVUFBVSxZQUFBO1FBQ1YsaUJBQWlCLG1CQUFBO1FBQ2pCLGlCQUFpQixtQkFBQTtRQUNqQixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLGVBQWUsaUJBQUE7UUFDZixXQUFXLGFBQUE7UUFDWCxXQUFXLGFBQUE7UUFDWCxhQUFhLGVBQUE7UUFDYixXQUFXLGFBQUE7UUFDWCxZQUFZLGNBQUE7UUFDWixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLGVBQWUsaUJBQUE7UUFDZixlQUFlLGlCQUFBO0tBQ2hCLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jaGF0U2VydmljZSc7XG5pbXBvcnQgeyBDaGF0TWVzc2FnZSwgQXR0YWNobWVudCwgTWVzc2FnZUZlZWRiYWNrIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUNoYXRQcm9wcyB7XG4gIGJhc2VVcmw6IHN0cmluZztcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIHRlbmFudD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgb25UYWtlb3Zlcj86ICgpID0+IHZvaWQ7XG4gIG9uRmluYWxpemU/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdCA9ICh7IGJhc2VVcmwsIGFwaUtleSwgdGVuYW50LCBtZXRhZGF0YSwgb25FcnJvciwgb25UYWtlb3Zlciwgb25GaW5hbGl6ZSB9OiBVc2VDaGF0UHJvcHMpID0+IHtcbiAgY29uc3QgW21lc3NhZ2VzLCBzZXRNZXNzYWdlc10gPSB1c2VTdGF0ZTxDaGF0TWVzc2FnZVtdPihbXSk7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtwcmVsb2FkZWRBdHRhY2htZW50cywgc2V0UHJlbG9hZGVkQXR0YWNobWVudHNdID0gdXNlU3RhdGU8QXR0YWNobWVudFtdPihbXSk7XG4gIGNvbnN0IFtjb25uZWN0aW9uU3RhdGUsIHNldENvbm5lY3Rpb25TdGF0ZV0gPSB1c2VTdGF0ZTwnY29ubmVjdGluZycgfCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnPignZGlzY29ubmVjdGVkJyk7XG4gIGNvbnN0IFtpc0FnZW50VHlwaW5nLCBzZXRJc0FnZW50VHlwaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgY2hhdFNlcnZpY2VSZWYgPSB1c2VSZWY8Q2hhdFNlcnZpY2UgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2NvbnZlcnNhdGlvbklkLCBzZXRDb252ZXJzYXRpb25JZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3Bvc3NpYmxlUXVlcmllcywgc2V0UG9zc2libGVRdWVyaWVzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gIGNvbnN0IFt3ZWxjb21lVGl0bGUsIHNldFdlbGNvbWVUaXRsZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dlbGNvbWVJbWFnZVVybCwgc2V0V2VsY29tZUltYWdlVXJsXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbd2VsY29tZU1lc3NhZ2UsIHNldFdlbGNvbWVNZXNzYWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbdGhpbmtpbmdQaHJhc2VzLCBzZXRUaGlua2luZ1BocmFzZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTtcbiAgY29uc3QgW3RoaW5raW5nRGVsYXlNcywgc2V0VGhpbmtpbmdEZWxheU1zXSA9IHVzZVN0YXRlPG51bWJlcj4oMTAwMCk7XG4gIGNvbnN0IFtpc1Rha2VuT3Zlciwgc2V0SXNUYWtlbk92ZXJdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbaXNGaW5hbGl6ZWQsIHNldElzRmluYWxpemVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyBTY29wZWQgbWVzc2FnZXMga2V5IGZvciBhcGlLZXksIGNvbnZlcnNhdGlvSWRcbiAgY29uc3QgYnVpbGRNZXNzYWdlc0tleSA9IHVzZUNhbGxiYWNrKChhcGlLZXlWYWw6IHN0cmluZywgY29udklkOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgaWYgKCFjb252SWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBgZ2VuYXNzaXN0X2NvbnZlcnNhdGlvbl9tZXNzYWdlczoke2FwaUtleVZhbH06JHtjb252SWR9YDtcbiAgfSwgW10pO1xuXG4gIC8vIERlZXAgY29tcGFyZSBtZXRhZGF0YSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLWluaXRpYWxpemF0aW9uc1xuICAvLyBPbmx5IHJlLWluaXRpYWxpemUgaWYgbWV0YWRhdGEgYWN0dWFsbHkgY2hhbmdlcyAoYnkgdmFsdWUsIG5vdCByZWZlcmVuY2UpXG4gIGNvbnN0IG1ldGFkYXRhU3RyaW5nID0gdXNlTWVtbygoKSA9PiBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSB8fCB7fSksIFttZXRhZGF0YV0pO1xuICBjb25zdCBtZXRhZGF0YVJlZiA9IHVzZVJlZjxzdHJpbmc+KG1ldGFkYXRhU3RyaW5nKTtcbiAgY29uc3QgcHJldkJhc2VVcmxSZWYgPSB1c2VSZWY8c3RyaW5nPihiYXNlVXJsKTtcbiAgY29uc3QgcHJldkFwaUtleVJlZiA9IHVzZVJlZjxzdHJpbmc+KGFwaUtleSk7XG4gIGNvbnN0IHByZXZUZW5hbnRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih0ZW5hbnQpO1xuXG4gIC8vIFN0b3JlIGNhbGxiYWNrcyBpbiByZWZzIHNvIHRoZXkgZG9uJ3QgdHJpZ2dlciByZS1pbml0aWFsaXphdGlvblxuICBjb25zdCBvbkVycm9yUmVmID0gdXNlUmVmKG9uRXJyb3IpO1xuICBjb25zdCBvblRha2VvdmVyUmVmID0gdXNlUmVmKG9uVGFrZW92ZXIpO1xuICBjb25zdCBvbkZpbmFsaXplUmVmID0gdXNlUmVmKG9uRmluYWxpemUpO1xuXG4gIC8vIFVwZGF0ZSBjYWxsYmFjayByZWZzIHdoZW4gdGhleSBjaGFuZ2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkVycm9yUmVmLmN1cnJlbnQgPSBvbkVycm9yO1xuICB9LCBbb25FcnJvcl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25UYWtlb3ZlclJlZi5jdXJyZW50ID0gb25UYWtlb3ZlcjtcbiAgfSwgW29uVGFrZW92ZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uRmluYWxpemVSZWYuY3VycmVudCA9IG9uRmluYWxpemU7XG4gIH0sIFtvbkZpbmFsaXplXSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBjaGF0IHNlcnZpY2UgLSBvbmx5IHdoZW4gYmFzZVVybCwgYXBpS2V5LCB0ZW5hbnQsIG9yIG1ldGFkYXRhIGFjdHVhbGx5IGNoYW5nZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhQ2hhbmdlZCA9IG1ldGFkYXRhUmVmLmN1cnJlbnQgIT09IG1ldGFkYXRhU3RyaW5nO1xuICAgIGNvbnN0IGJhc2VVcmxDaGFuZ2VkID0gcHJldkJhc2VVcmxSZWYuY3VycmVudCAhPT0gYmFzZVVybDtcbiAgICBjb25zdCBhcGlLZXlDaGFuZ2VkID0gcHJldkFwaUtleVJlZi5jdXJyZW50ICE9PSBhcGlLZXk7XG4gICAgY29uc3QgdGVuYW50Q2hhbmdlZCA9IHByZXZUZW5hbnRSZWYuY3VycmVudCAhPT0gdGVuYW50O1xuICAgIFxuICAgIGNvbnN0IG5lZWRzUmVpbml0ID0gIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQgfHwgYmFzZVVybENoYW5nZWQgfHwgYXBpS2V5Q2hhbmdlZCB8fCB0ZW5hbnRDaGFuZ2VkIHx8IG1ldGFkYXRhQ2hhbmdlZDtcblxuICAgIGlmIChuZWVkc1JlaW5pdCkge1xuICAgICAgLy8gVXBkYXRlIHJlZnNcbiAgICAgIGlmIChtZXRhZGF0YUNoYW5nZWQpIG1ldGFkYXRhUmVmLmN1cnJlbnQgPSBtZXRhZGF0YVN0cmluZztcbiAgICAgIGlmIChiYXNlVXJsQ2hhbmdlZCkgcHJldkJhc2VVcmxSZWYuY3VycmVudCA9IGJhc2VVcmw7XG4gICAgICBpZiAoYXBpS2V5Q2hhbmdlZCkgcHJldkFwaUtleVJlZi5jdXJyZW50ID0gYXBpS2V5O1xuICAgICAgaWYgKHRlbmFudENoYW5nZWQpIHByZXZUZW5hbnRSZWYuY3VycmVudCA9IHRlbmFudDtcblxuICAgICAgLy8gQ2xlYW4gdXAgZXhpc3Rpbmcgc2VydmljZSBpZiBpdCBleGlzdHNcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZGlzY29ubmVjdCgpO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFdlbGNvbWVEYXRhSGFuZGxlcihudWxsKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudCA9IG5ldyBDaGF0U2VydmljZShiYXNlVXJsLCBhcGlLZXksIG1ldGFkYXRhLCB0ZW5hbnQpO1xuICAgICAgXG4gICAgICAvLyBTZXQgdXAgaGFuZGxlcnNcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0TWVzc2FnZUhhbmRsZXIoKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgIGNyZWF0ZV90aW1lOiAoIW1lc3NhZ2UuY3JlYXRlX3RpbWUgfHwgaXNOYU4obWVzc2FnZS5jcmVhdGVfdGltZSkpXG4gICAgICAgICAgICA/IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApXG4gICAgICAgICAgICA6IG1lc3NhZ2UuY3JlYXRlX3RpbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0TWVzc2FnZXMocHJldk1lc3NhZ2VzID0+IFsuLi5wcmV2TWVzc2FnZXMsIG5vcm1hbGl6ZWRNZXNzYWdlXSk7XG4gICAgICAgIC8vIFN0b3AgdHlwaW5nIGFuaW1hdGlvbiB3aGVuIGFnZW50IG9yIHN5c3RlbSBtZXNzYWdlIGFycml2ZXNcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCcgfHwgbm9ybWFsaXplZE1lc3NhZ2Uuc3BlYWtlciA9PT0gJ3NwZWNpYWwnKSB7XG4gICAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFRha2VvdmVySGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzVGFrZW5PdmVyKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uVGFrZW92ZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uVGFrZW92ZXJSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRGaW5hbGl6ZWRIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25GaW5hbGl6ZVJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25GaW5hbGl6ZVJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldENvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoKHN0YXRlKSA9PiB7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShzdGF0ZSk7XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0V2VsY29tZURhdGFIYW5kbGVyKChkYXRhKSA9PiB7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZShkYXRhLnRpdGxlID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwoZGF0YS5pbWFnZVVybCA/PyBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2UoZGF0YS5tZXNzYWdlID8/IG51bGwpO1xuICAgICAgICBpZiAoZGF0YS5wb3NzaWJsZVF1ZXJpZXMgJiYgZGF0YS5wb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhkYXRhLnBvc3NpYmxlUXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBmb3IgYSBzYXZlZCBjb252ZXJzYXRpb24gYW5kIGNvbm5lY3QgdG8gaXRcbiAgICAgIGNvbnN0IGNvbnZJZCA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q29udmVyc2F0aW9uSWQoKTtcbiAgICAgIGlmIChjb252SWQpIHtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuaXNDb252ZXJzYXRpb25GaW5hbGl6ZWQoKSkge1xuICAgICAgICAgIHNldElzRmluYWxpemVkKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuY29ubmVjdFdlYlNvY2tldCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBQdWxsIGluaXRpYWwgc3RhdGljIGRhdGFcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcz8uKCkgfHwgW107XG4gICAgICAgIGlmIChxdWVyaWVzLmxlbmd0aCkgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YT8uKCk7XG4gICAgICAgIGlmICh3ZWxjb21lKSB7XG4gICAgICAgICAgc2V0V2VsY29tZVRpdGxlKHdlbGNvbWUudGl0bGUgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKHdlbGNvbWUuaW1hZ2VVcmwgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2Uod2VsY29tZS5tZXNzYWdlIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZz8uKCk7XG4gICAgICAgIGlmICh0aGlua2luZykge1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCAmJiBtZXRhZGF0YSkge1xuICAgICAgLy8gSnVzdCB1cGRhdGUgbWV0YWRhdGEgd2l0aG91dCByZS1pbml0aWFsaXppbmdcbiAgICAgIChjaGF0U2VydmljZVJlZi5jdXJyZW50IGFzIGFueSkubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXBkYXRlIGhhbmRsZXJzIHdoZW4gY2FsbGJhY2tzIGNoYW5nZSAod2l0aG91dCByZS1pbml0aWFsaXppbmcpXG4gICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25UYWtlb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25UYWtlb3ZlclJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkZpbmFsaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBvbmx5IG9uIHVubW91bnRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gT25seSBjbGVhbnVwIG9uIHVubW91bnQsIG5vdCBvbiBldmVyeSBkZXBlbmRlbmN5IGNoYW5nZVxuICAgIH07XG4gIH0sIFtiYXNlVXJsLCBhcGlLZXksIHRlbmFudCwgbWV0YWRhdGFTdHJpbmddKTtcblxuICAvLyBMb2FkIG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXIgd2hlbiBhdmFpbGFibGVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSB7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgc2V0TWVzc2FnZXMoc3RvcmVkID8gSlNPTi5wYXJzZShzdG9yZWQpIDogW10pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgfVxuICB9LCBbYXBpS2V5LCBjb252ZXJzYXRpb25JZCwgYnVpbGRNZXNzYWdlc0tleV0pO1xuXG4gIC8vIFBlcnNpc3QgbWVzc2FnZXMgZm9yIGN1cnJlbnQgcGFpclxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShtZXNzYWdlcykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH0sIFttZXNzYWdlcywgYXBpS2V5LCBjb252ZXJzYXRpb25JZCwgYnVpbGRNZXNzYWdlc0tleV0pO1xuXG4gIC8vIFJlc2V0IGNvbnZlcnNhdGlvblxuICBjb25zdCByZXNldENvbnZlcnNhdGlvbiA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0aW5nJyk7XG4gICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgIHNldFdlbGNvbWVUaXRsZShudWxsKTtcbiAgICBzZXRXZWxjb21lSW1hZ2VVcmwobnVsbCk7XG4gICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgc2V0VGhpbmtpbmdQaHJhc2VzKFtdKTtcbiAgICBzZXRUaGlua2luZ0RlbGF5TXMoMTAwMCk7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgIH1cbiAgICBzZXRJc0ZpbmFsaXplZChmYWxzZSk7XG4gICAgc2V0SXNUYWtlbk92ZXIoZmFsc2UpO1xuICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNldCB0aGUgY29udmVyc2F0aW9uIGluIHRoZSBjaGF0IHNlcnZpY2VcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQucmVzZXRDb252ZXJzYXRpb24oKTtcbiAgICAgIFxuICAgICAgLy8gU3RhcnQgYSBuZXcgY29udmVyc2F0aW9uXG4gICAgICBjb25zdCBjb252SWQgPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnN0YXJ0Q29udmVyc2F0aW9uKCk7XG4gICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0ZWQnKTtcblxuICAgICAgLy8gR2V0IHBvc3NpYmxlIHF1ZXJpZXMgZnJvbSBBUEkgcmVzcG9uc2VcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcykge1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB3ZWxjb21lIGFuZCB0aGlua2luZyBkYXRhXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSkge1xuICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICBzZXRXZWxjb21lVGl0bGUod2VsY29tZS50aXRsZSB8fCBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKHdlbGNvbWUuaW1hZ2VVcmwgfHwgbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICBzZXRUaGlua2luZ1BocmFzZXModGhpbmtpbmcucGhyYXNlcyB8fCBbXSk7XG4gICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyh0aGlua2luZy5kZWxheU1zIHx8IDEwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IHVwbG9hZEZpbGUgPSB1c2VDYWxsYmFjayhhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8QXR0YWNobWVudCB8IG51bGw+ID0+IHtcbiAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQgfHwgIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q29udmVyc2F0aW9uSWQoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZmlsZVVybCB9ID0gYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC51cGxvYWRGaWxlKFxuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENvbnZlcnNhdGlvbklkKCkgYXMgc3RyaW5nLFxuICAgICAgICBmaWxlXG4gICAgICApO1xuICAgICAgXG4gICAgICBjb25zdCBhdHRhY2htZW50OiBBdHRhY2htZW50ID0ge1xuICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICB1cmw6IGZpbGVVcmwsXG4gICAgICB9O1xuXG4gICAgICBzZXRQcmVsb2FkZWRBdHRhY2htZW50cyhwcmV2ID0+IFsuLi5wcmV2LCBhdHRhY2htZW50XSk7XG4gICAgICByZXR1cm4gYXR0YWNobWVudDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCkge1xuICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgLy8gU2VuZCBtZXNzYWdlXG4gIGNvbnN0IHNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soYXN5bmMgKHRleHQ6IHN0cmluZywgZmlsZXM6IEZpbGVbXSA9IFtdLCBleHRyYU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGF0IHNlcnZpY2Ugbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcblxuICAgICAgY29uc3QgbmV3QXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xuICAgICAgXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzID0gZmlsZXMubWFwKGYgPT4gcHJlbG9hZGVkQXR0YWNobWVudHMuZmluZChwYSA9PiBwYS5uYW1lID09PSBmLm5hbWUgJiYgcGEuc2l6ZSA9PT0gZi5zaXplKSkuZmlsdGVyKEJvb2xlYW4pIGFzIEF0dGFjaG1lbnRbXTtcbiAgICAgICAgbmV3QXR0YWNobWVudHMucHVzaCguLi51cGxvYWRlZEZpbGVzKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgdHlwaW5nIGltbWVkaWF0ZWx5IHdoZW4gdXNlciBzZW5kcywgdW5sZXNzIGNvbnZlcnNhdGlvbiBpcyB0YWtlbiBvdmVyIGJ5IGEgaHVtYW5cbiAgICAgIGlmICghaXNUYWtlbk92ZXIpIHtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2VuZE1lc3NhZ2UodGV4dCwgbmV3QXR0YWNobWVudHMsIGV4dHJhTWV0YWRhdGEpO1xuXG4gICAgICBzZXRQcmVsb2FkZWRBdHRhY2htZW50cyhbXSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSwgW3ByZWxvYWRlZEF0dGFjaG1lbnRzLCBpc1Rha2VuT3Zlcl0pO1xuXG4gIGNvbnN0IHN0YXJ0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0aW5nJyk7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICBcbiAgICAgIC8vIFJlc2V0IHN0YXRlIGZvciBuZXcgY29udmVyc2F0aW9uXG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH1cbiAgICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENvbnZlcnNhdGlvbigpO1xuXG4gICAgICBjb25zdCBjb252SWQgPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnN0YXJ0Q29udmVyc2F0aW9uKCk7XG4gICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0ZWQnKTtcblxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcygpO1xuICAgICAgICBpZiAocXVlcmllcyAmJiBxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKSB7XG4gICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKCk7XG4gICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lSW1hZ2VVcmwod2VsY29tZS5pbWFnZVVybCB8fCBudWxsKTtcbiAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2Uod2VsY29tZS5tZXNzYWdlIHx8IG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0VGhpbmtpbmdDb25maWcpIHtcbiAgICAgICAgY29uc3QgdGhpbmtpbmcgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnKCk7XG4gICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKHRoaW5raW5nLmRlbGF5TXMgfHwgMTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgLy8gQWRkIGZlZWRiYWNrIHRvIGFuIGFnZW50IG1lc3NhZ2VcbiAgY29uc3QgYWRkRmVlZGJhY2sgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAobWVzc2FnZUlkOiBzdHJpbmcsIHZhbHVlOiAnZ29vZCcgfCAnYmFkJywgZmVlZGJhY2tNZXNzYWdlPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHNlbmQgZmVlZGJhY2s6IENoYXRTZXJ2aWNlIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3Qgc2VuZCBmZWVkYmFjazogbWVzc2FnZUlkIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5hZGRGZWVkYmFjayhtZXNzYWdlSWQsIHZhbHVlLCBmZWVkYmFja01lc3NhZ2UpO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZlZWRiYWNrOiBNZXNzYWdlRmVlZGJhY2sgPSB7XG4gICAgICAgICAgZmVlZGJhY2s6IHZhbHVlLFxuICAgICAgICAgIGZlZWRiYWNrX21lc3NhZ2U6IGZlZWRiYWNrTWVzc2FnZSxcbiAgICAgICAgICBmZWVkYmFja190aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRNZXNzYWdlcyhwcmV2ID0+XG4gICAgICAgICAgcHJldi5tYXAobSA9PiB7XG4gICAgICAgICAgICAvLyBNYXRjaCBieSBtZXNzYWdlX2lkIG9yIGlkIGZpZWxkXG4gICAgICAgICAgICBjb25zdCBtc2dJZCA9IG0ubWVzc2FnZV9pZCB8fCAobSBhcyBhbnkpLmlkO1xuICAgICAgICAgICAgcmV0dXJuIG1zZ0lkID09PSBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgPyB7IC4uLm0sIGZlZWRiYWNrOiBbLi4uKG0uZmVlZGJhY2sgfHwgW10pLCBuZXdGZWVkYmFja10gfVxuICAgICAgICAgICAgICA6IG07XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNMb2FkaW5nLFxuICAgIHNlbmRNZXNzYWdlLFxuICAgIHVwbG9hZEZpbGUsXG4gICAgcmVzZXRDb252ZXJzYXRpb24sXG4gICAgc3RhcnRDb252ZXJzYXRpb24sXG4gICAgY29ubmVjdGlvblN0YXRlLFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIHBvc3NpYmxlUXVlcmllcyxcbiAgICBpc1Rha2VuT3ZlcixcbiAgICBpc0ZpbmFsaXplZCxcbiAgICBpc0FnZW50VHlwaW5nLFxuICAgIGFkZEZlZWRiYWNrLFxuICAgIHdlbGNvbWVUaXRsZSxcbiAgICB3ZWxjb21lSW1hZ2VVcmwsXG4gICAgd2VsY29tZU1lc3NhZ2UsXG4gICAgdGhpbmtpbmdQaHJhc2VzLFxuICAgIHRoaW5raW5nRGVsYXlNcyxcbiAgfTtcbn07XG4iXX0=
package/dist/index.d.ts CHANGED
@@ -6,5 +6,6 @@ export { ChatBubble } from './components/ChatBubble';
6
6
  export { ChatService } from './services/chatService';
7
7
  export { useChat } from './hooks/useChat';
8
8
  export type { UseChatProps } from './hooks/useChat';
9
- export type { Attachment, AgentWelcomeData, AgentThinkingConfig, ChatContentBlock, DynamicChatItem, ScheduleItem, } from './types';
9
+ export type { Attachment, AgentWelcomeData, AgentThinkingConfig, ChatContentBlock, DynamicChatItem, ScheduleItem, Translations, } from './types';
10
10
  export { parseInteractiveContentBlocks, generateMessageContent, } from './utils/interactiveContent';
11
+ export { defaultTranslations, spanishTranslations, frenchTranslations, germanTranslations, italianTranslations, portugueseTranslations, translationsByLanguage, getBrowserLanguage, getTranslation, getTranslationString, getTranslationArray, resolveLanguage, mergeTranslations, getTranslationsForLanguage, } from './utils/i18n';
package/dist/index.js CHANGED
@@ -4,4 +4,5 @@ export { ChatBubble } from './components/ChatBubble';
4
4
  export { ChatService } from './services/chatService';
5
5
  export { useChat } from './hooks/useChat';
6
6
  export { parseInteractiveContentBlocks, generateMessageContent, } from './utils/interactiveContent';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBTXZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBVTFDLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0Isc0JBQXNCLEdBQ3ZCLE1BQU0sNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBHZW5BZ2VudENoYXQgfSBmcm9tICcuL2NvbXBvbmVudHMvR2VuQWdlbnRDaGF0JztcbmV4cG9ydCB0eXBlIHsgR2VuQWdlbnRDaGF0UHJvcHMsIENoYXRNZXNzYWdlIH0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgeyBHZW5BZ2VudENvbmZpZ1BhbmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL0dlbkFnZW50Q29uZmlnUGFuZWwnO1xuZXhwb3J0IHR5cGUge1xuICBHZW5BZ2VudENvbmZpZ1BhbmVsUHJvcHMsXG4gIENoYXRUaGVtZSxcbiAgQ2hhdFNldHRpbmdzQ29uZmlnLFxufSBmcm9tICcuL2NvbXBvbmVudHMvR2VuQWdlbnRDb25maWdQYW5lbCc7XG5leHBvcnQgeyBDaGF0QnViYmxlIH0gZnJvbSAnLi9jb21wb25lbnRzL0NoYXRCdWJibGUnO1xuZXhwb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2NoYXRTZXJ2aWNlJztcbmV4cG9ydCB7IHVzZUNoYXQgfSBmcm9tICcuL2hvb2tzL3VzZUNoYXQnO1xuZXhwb3J0IHR5cGUgeyBVc2VDaGF0UHJvcHMgfSBmcm9tICcuL2hvb2tzL3VzZUNoYXQnO1xuZXhwb3J0IHR5cGUge1xuICBBdHRhY2htZW50LFxuICBBZ2VudFdlbGNvbWVEYXRhLFxuICBBZ2VudFRoaW5raW5nQ29uZmlnLFxuICBDaGF0Q29udGVudEJsb2NrLFxuICBEeW5hbWljQ2hhdEl0ZW0sXG4gIFNjaGVkdWxlSXRlbSxcbn0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQge1xuICBwYXJzZUludGVyYWN0aXZlQ29udGVudEJsb2NrcyxcbiAgZ2VuZXJhdGVNZXNzYWdlQ29udGVudCxcbn0gZnJvbSAnLi91dGlscy9pbnRlcmFjdGl2ZUNvbnRlbnQnO1xuIl19
7
+ export { defaultTranslations, spanishTranslations, frenchTranslations, germanTranslations, italianTranslations, portugueseTranslations, translationsByLanguage, getBrowserLanguage, getTranslation, getTranslationString, getTranslationArray, resolveLanguage, mergeTranslations, getTranslationsForLanguage, } from './utils/i18n';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBTXZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBVzFDLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0Isc0JBQXNCLEdBQ3ZCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGlCQUFpQixFQUNqQiwwQkFBMEIsR0FDM0IsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBHZW5BZ2VudENoYXQgfSBmcm9tICcuL2NvbXBvbmVudHMvR2VuQWdlbnRDaGF0JztcbmV4cG9ydCB0eXBlIHsgR2VuQWdlbnRDaGF0UHJvcHMsIENoYXRNZXNzYWdlIH0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgeyBHZW5BZ2VudENvbmZpZ1BhbmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL0dlbkFnZW50Q29uZmlnUGFuZWwnO1xuZXhwb3J0IHR5cGUge1xuICBHZW5BZ2VudENvbmZpZ1BhbmVsUHJvcHMsXG4gIENoYXRUaGVtZSxcbiAgQ2hhdFNldHRpbmdzQ29uZmlnLFxufSBmcm9tICcuL2NvbXBvbmVudHMvR2VuQWdlbnRDb25maWdQYW5lbCc7XG5leHBvcnQgeyBDaGF0QnViYmxlIH0gZnJvbSAnLi9jb21wb25lbnRzL0NoYXRCdWJibGUnO1xuZXhwb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2NoYXRTZXJ2aWNlJztcbmV4cG9ydCB7IHVzZUNoYXQgfSBmcm9tICcuL2hvb2tzL3VzZUNoYXQnO1xuZXhwb3J0IHR5cGUgeyBVc2VDaGF0UHJvcHMgfSBmcm9tICcuL2hvb2tzL3VzZUNoYXQnO1xuZXhwb3J0IHR5cGUge1xuICBBdHRhY2htZW50LFxuICBBZ2VudFdlbGNvbWVEYXRhLFxuICBBZ2VudFRoaW5raW5nQ29uZmlnLFxuICBDaGF0Q29udGVudEJsb2NrLFxuICBEeW5hbWljQ2hhdEl0ZW0sXG4gIFNjaGVkdWxlSXRlbSxcbiAgVHJhbnNsYXRpb25zLFxufSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7XG4gIHBhcnNlSW50ZXJhY3RpdmVDb250ZW50QmxvY2tzLFxuICBnZW5lcmF0ZU1lc3NhZ2VDb250ZW50LFxufSBmcm9tICcuL3V0aWxzL2ludGVyYWN0aXZlQ29udGVudCc7XG5leHBvcnQge1xuICBkZWZhdWx0VHJhbnNsYXRpb25zLFxuICBzcGFuaXNoVHJhbnNsYXRpb25zLFxuICBmcmVuY2hUcmFuc2xhdGlvbnMsXG4gIGdlcm1hblRyYW5zbGF0aW9ucyxcbiAgaXRhbGlhblRyYW5zbGF0aW9ucyxcbiAgcG9ydHVndWVzZVRyYW5zbGF0aW9ucyxcbiAgdHJhbnNsYXRpb25zQnlMYW5ndWFnZSxcbiAgZ2V0QnJvd3Nlckxhbmd1YWdlLFxuICBnZXRUcmFuc2xhdGlvbixcbiAgZ2V0VHJhbnNsYXRpb25TdHJpbmcsXG4gIGdldFRyYW5zbGF0aW9uQXJyYXksXG4gIHJlc29sdmVMYW5ndWFnZSxcbiAgbWVyZ2VUcmFuc2xhdGlvbnMsXG4gIGdldFRyYW5zbGF0aW9uc0Zvckxhbmd1YWdlLFxufSBmcm9tICcuL3V0aWxzL2kxOG4nO1xuIl19