@projectcor/maia-components 2.11.103-3 → 2.11.103-4

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.
Files changed (65) hide show
  1. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +7 -6
  2. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +9 -12
  3. package/lib/components/atoms/MAIAInput/MAIAInput.js +6 -1
  4. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
  5. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
  6. package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
  7. package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
  8. package/lib/components/atoms/icons/index.js +2 -1
  9. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +68 -97
  10. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +9 -18
  11. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +3 -3
  12. package/lib/components/molecules/ChatAIHome/styles.js +26 -32
  13. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +46 -7
  14. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +308 -69
  15. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +28 -18
  16. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +9 -2
  17. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +15 -3
  18. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +5 -1
  19. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +66 -0
  20. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +55 -0
  21. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
  22. package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -2
  23. package/lib/components/molecules/Sidebar/Sidebar.js +106 -61
  24. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +16 -1
  25. package/lib/components/molecules/Sidebar/Sidebar.styles.js +30 -29
  26. package/lib/components/organisms/ChatAI/ChatAI.js +131 -40
  27. package/lib/context/cor-user.js +1 -5
  28. package/lib/context/global-context.js +3 -1
  29. package/lib/hooks/useChatManager/useChatManager.js +530 -438
  30. package/lib/hooks/useChatMessages/useChatMessages.js +427 -236
  31. package/lib/hooks/useChats/useChats.js +21 -4
  32. package/lib/hooks/useMinimizedPillBottomOffset.js +97 -0
  33. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  34. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +139 -521
  35. package/lib/hooks/useStreamingMessage/index.js +2 -3
  36. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +13 -17
  37. package/lib/lang/br/index.js +11 -6
  38. package/lib/lang/en/index.js +11 -6
  39. package/lib/lang/es/index.js +11 -6
  40. package/lib/lang/fr/index.js +13 -7
  41. package/lib/services/maia/Chats/getChatsByUserId.js +6 -4
  42. package/lib/services/maia/Chats/index.js +3 -1
  43. package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
  44. package/lib/store/chatsSidebarOptimistic.js +92 -0
  45. package/lib/store/chatsStore.types.js +1 -1
  46. package/lib/store/maiaMinimizedPersistence.js +49 -0
  47. package/lib/store/sessions/activeView.js +22 -0
  48. package/lib/store/sessions/index.js +9 -0
  49. package/lib/store/sessions/sessionHitlContext.js +15 -0
  50. package/lib/store/sessions/sessionNotificationSound.js +57 -0
  51. package/lib/store/sessions/sessionNotifications.js +110 -0
  52. package/lib/store/sessions/sessionNotifications.types.js +2 -0
  53. package/lib/store/sessions/sessionStreamManager.js +576 -0
  54. package/lib/store/sessions/sessionStreamingText.js +80 -0
  55. package/lib/store/sessions/sessions.types.js +35 -0
  56. package/lib/store/sessions/useSessionMeta.js +39 -0
  57. package/lib/store/sessions/useSessionStreamingText.js +18 -0
  58. package/lib/store/sessions/useSessionsStore.js +197 -0
  59. package/lib/store/useChatsStore.js +149 -12
  60. package/lib/types/Chat.js +1 -1
  61. package/lib/utils/formatUnreadCount.js +6 -0
  62. package/lib/utils/maiaHostOpen.js +54 -0
  63. package/package.json +3 -3
  64. package/lib/hooks/useStreamingMessage/streamingStore.js +0 -69
  65. package/lib/utils/managerHoursHomeFuas.js +0 -54
@@ -1,7 +1,7 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
2
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
5
5
  import _regeneratorRuntime from "@babel/runtime/regenerator";
6
6
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
7
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -17,6 +17,39 @@ import { useTabTaskDefault } from '../useTabTaskDefault';
17
17
  import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
18
18
  import { mapCORLang } from '../../lang/utils';
19
19
  import { formatQuickActionMessageForDisplay } from '../../utils/formatQuickActionMessage';
20
+ import { useSessionsStore } from '../../store/sessions/useSessionsStore';
21
+ import { isActiveSessionStatus } from '../../store/sessions/sessions.types';
22
+ import { getChatsStoreState } from '../../store/useChatsStore';
23
+ /** El modal usa `{ message: '', attachments: [] }` como "sin mensaje inicial"; no es falsy. */
24
+ var hasMeaningfulUserInitialMessage = function hasMeaningfulUserInitialMessage(userInitialMessage) {
25
+ var _userInitialMessage$m, _userInitialMessage$a;
26
+ return Boolean(userInitialMessage && (((_userInitialMessage$m = userInitialMessage.message) === null || _userInitialMessage$m === void 0 ? void 0 : _userInitialMessage$m.trim()) || ((_userInitialMessage$a = userInitialMessage.attachments) === null || _userInitialMessage$a === void 0 ? void 0 : _userInitialMessage$a.length) || userInitialMessage.fuaId || userInitialMessage.scId));
27
+ };
28
+
29
+ /** Marca la sesión como leída cuando terminó de hidratarse y sigue siendo la activa y visible. */
30
+ var markOpenedSessionAsReadIfVisible = function markOpenedSessionAsReadIfVisible(sessionId) {
31
+ var _getChatsStoreState = getChatsStoreState(),
32
+ isChatViewVisible = _getChatsStoreState.isChatViewVisible,
33
+ activeChatId = _getChatsStoreState.activeChatId,
34
+ markChatAsRead = _getChatsStoreState.markChatAsRead;
35
+ if (!isChatViewVisible || activeChatId !== sessionId) return;
36
+ void markChatAsRead(sessionId);
37
+ };
38
+ var buildInitialMessagePlaceholder = function buildInitialMessagePlaceholder(userInitialMessage, currentUser) {
39
+ return [_objectSpread(_objectSpread({
40
+ id: 'user-initial-message',
41
+ date: new Date(),
42
+ user: currentUser,
43
+ message: formatQuickActionMessageForDisplay(userInitialMessage.message, {
44
+ fuaId: userInitialMessage.fuaId,
45
+ scId: userInitialMessage.scId
46
+ })
47
+ }, userInitialMessage.attachments ? {
48
+ attachments: userInitialMessage.attachments
49
+ } : {}), buildContextMessage(userInitialMessage.mentions) ? {
50
+ contextMessage: buildContextMessage(userInitialMessage.mentions)
51
+ } : {})];
52
+ };
20
53
  var rewriteTaskUrlsInContent = function rewriteTaskUrlsInContent(content, tabSegment) {
21
54
  var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
22
55
  return content.replace(taskUrlRegex, function (url) {
@@ -40,19 +73,9 @@ export var useChatMessages = function useChatMessages(_ref) {
40
73
  _useState2 = _slicedToArray(_useState, 2),
41
74
  loadingMessages = _useState2[0],
42
75
  setLoadingMessages = _useState2[1];
43
- var _useState3 = useState(userInitialMessage ? [_objectSpread(_objectSpread({
44
- id: 'user-initial-message',
45
- date: new Date(),
46
- user: currentUser,
47
- message: formatQuickActionMessageForDisplay(userInitialMessage.message, {
48
- fuaId: userInitialMessage.fuaId,
49
- scId: userInitialMessage.scId
50
- })
51
- }, userInitialMessage.attachments ? {
52
- attachments: userInitialMessage.attachments
53
- } : {}), buildContextMessage(userInitialMessage.mentions) ? {
54
- contextMessage: buildContextMessage(userInitialMessage.mentions)
55
- } : {})] : []),
76
+ var _useState3 = useState(function () {
77
+ return hasMeaningfulUserInitialMessage(userInitialMessage) && userInitialMessage ? buildInitialMessagePlaceholder(userInitialMessage, currentUser) : [];
78
+ }),
56
79
  _useState4 = _slicedToArray(_useState3, 2),
57
80
  messages = _useState4[0],
58
81
  setMessages = _useState4[1];
@@ -80,6 +103,15 @@ export var useChatMessages = function useChatMessages(_ref) {
80
103
  var isLoadingRef = useRef(false);
81
104
  var initialLoadDone = useRef(false);
82
105
  var previousChatId = useRef(chatId);
106
+ var loadSeqRef = useRef(0);
107
+ var syncMessagesToStore = useCallback(function (targetChatId, nextMessages, lastEvaluatedKeyValue) {
108
+ useSessionsStore.getState().setMessages(targetChatId, nextMessages);
109
+ if (lastEvaluatedKeyValue !== undefined) {
110
+ useSessionsStore.getState().patchViewCache(targetChatId, {
111
+ lastEvaluatedKey: lastEvaluatedKeyValue
112
+ });
113
+ }
114
+ }, []);
83
115
  var setConversationContextFromMetadata = useCallback(/*#__PURE__*/function () {
84
116
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref2) {
85
117
  var projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, projects, hasMultiAgentsAccess, projectIdNum, foundProject, _foundProject$client;
@@ -158,118 +190,157 @@ export var useChatMessages = function useChatMessages(_ref) {
158
190
  return _ref3.apply(this, arguments);
159
191
  };
160
192
  }(), [fetchProjects, setClient, setChipsProject, setProject, setTask]);
161
- var loadMessages = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
162
- var _yield$maia$Chats$get, items, nextItem, agentDeleted, agentNoPermission, hasAgentAccess, hasAgentPermission, agentTypeFromSession, agentEntityFromSession, projectIdMessage, projectNameFromSession, projectDeleted, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, agentInList, contextProjectId, itemsToSet, tab, tabSegment, _t;
163
- return _regeneratorRuntime.wrap(function (_context2) {
164
- while (1) switch (_context2.prev = _context2.next) {
165
- case 0:
166
- _context2.prev = 0;
167
- setLoadingMessages(true);
168
- initialLoadDone.current = false;
169
- _context2.next = 1;
170
- return maia.Chats.getChatMessages({
171
- chatId: chatId,
172
- currentUser: currentUser,
173
- offset: lastEvaluatedKey,
174
- cancelledText: t('chat.cancelled'),
175
- lang: mapCORLang(i18n.language)
176
- });
177
- case 1:
178
- _yield$maia$Chats$get = _context2.sent;
179
- items = _yield$maia$Chats$get.items;
180
- nextItem = _yield$maia$Chats$get.nextItem;
181
- agentDeleted = _yield$maia$Chats$get.agentDeleted;
182
- agentNoPermission = _yield$maia$Chats$get.agentNoPermission;
183
- hasAgentAccess = _yield$maia$Chats$get.hasAgentAccess;
184
- hasAgentPermission = _yield$maia$Chats$get.hasAgentPermission;
185
- agentTypeFromSession = _yield$maia$Chats$get.agentType;
186
- agentEntityFromSession = _yield$maia$Chats$get.agentEntity;
187
- projectIdMessage = _yield$maia$Chats$get.projectId;
188
- projectNameFromSession = _yield$maia$Chats$get.projectName;
189
- projectDeleted = _yield$maia$Chats$get.projectDeleted;
190
- clientIdFromSession = _yield$maia$Chats$get.clientId;
191
- clientNameFromSession = _yield$maia$Chats$get.clientName;
192
- taskIdFromSession = _yield$maia$Chats$get.taskId;
193
- taskNameFromSession = _yield$maia$Chats$get.taskName;
194
- if (agentDeleted) {
195
- selectAgent(_objectSpread({
196
- id: agentDeleted.id,
197
- name: agentDeleted.name,
198
- emoji: agentDeleted.emoji,
199
- type: 'custom',
200
- is_deleted: true,
201
- deleted_at: agentDeleted.deletedAt
202
- }, agentNoPermission !== null && agentNoPermission !== void 0 && agentNoPermission.connectors ? {
203
- connectors: agentNoPermission.connectors
204
- } : {}));
205
- }
206
-
207
- // Si el agente no está en la lista pero tiene permisos, acceso y no está eliminado, setearlo normalmente
208
- // Excluir agentes no-custom para usuarios con roles deshabilitados
209
- if (agentNoPermission && !agentDeleted && userPermissions !== null && userPermissions !== void 0 && userPermissions.view && hasAgentAccess && hasAgentPermission && !agents.find(function (agent) {
210
- return agent.id === agentNoPermission.id;
211
- })) {
212
- selectAgent(_objectSpread(_objectSpread({
213
- id: agentNoPermission.id,
214
- name: agentNoPermission.name,
215
- emoji: agentNoPermission.emoji,
216
- type: agentNoPermission.type,
217
- is_from_conversation: true
218
- }, agentNoPermission.connectors ? {
219
- connectors: agentNoPermission.connectors
220
- } : {}), projectDeleted ? {
221
- project_deleted: {
222
- name: projectDeleted.name
223
- }
224
- } : {}));
225
- }
226
-
227
- // Si el agente está en la lista y tiene acceso/permisos, actualizar project_deleted (o limpiarlo al cambiar de chat)
228
- if (agentNoPermission && !agentDeleted && hasAgentAccess && hasAgentPermission && agents.find(function (a) {
229
- return a.id === agentNoPermission.id;
230
- })) {
231
- agentInList = agents.find(function (a) {
232
- return a.id === agentNoPermission.id;
193
+ var restoreSessionFromStore = useCallback(/*#__PURE__*/function () {
194
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(targetChatId) {
195
+ var _cache$lastEvaluatedK;
196
+ var sessionsStore, cachedMessages, cache;
197
+ return _regeneratorRuntime.wrap(function (_context2) {
198
+ while (1) switch (_context2.prev = _context2.next) {
199
+ case 0:
200
+ sessionsStore = useSessionsStore.getState();
201
+ cachedMessages = sessionsStore.getMessages(targetChatId);
202
+ cache = sessionsStore.getViewCache(targetChatId);
203
+ setMessages(cachedMessages);
204
+ setLastEvaluatedKey((_cache$lastEvaluatedK = cache === null || cache === void 0 ? void 0 : cache.lastEvaluatedKey) !== null && _cache$lastEvaluatedK !== void 0 ? _cache$lastEvaluatedK : 0);
205
+ initialLoadDone.current = true;
206
+ if (cache !== null && cache !== void 0 && cache.agentSnapshot) {
207
+ selectAgent(cache.agentSnapshot);
208
+ }
209
+ if (!(cache !== null && cache !== void 0 && cache.conversationMeta)) {
210
+ _context2.next = 1;
211
+ break;
212
+ }
213
+ _context2.next = 1;
214
+ return setConversationContextFromMetadata({
215
+ projectIdMessage: cache.conversationMeta.projectIdMessage,
216
+ projectNameFromSession: cache.conversationMeta.projectNameFromSession,
217
+ clientIdFromSession: cache.conversationMeta.clientIdFromSession,
218
+ clientNameFromSession: cache.conversationMeta.clientNameFromSession,
219
+ taskIdFromSession: cache.conversationMeta.taskIdFromSession,
220
+ taskNameFromSession: cache.conversationMeta.taskNameFromSession
233
221
  });
234
- if (agentInList) {
235
- selectAgent(_objectSpread(_objectSpread(_objectSpread({}, agentInList), agentNoPermission.connectors ? {
236
- connectors: agentNoPermission.connectors
237
- } : {}), projectDeleted ? {
238
- project_deleted: {
239
- name: projectDeleted.name
240
- }
241
- } : {
242
- project_deleted: undefined
222
+ case 1:
223
+ if (cache !== null && cache !== void 0 && cache.sessionMetaEvent) {
224
+ document.dispatchEvent(new CustomEvent('maia-chat-session-meta', {
225
+ detail: cache.sessionMetaEvent
243
226
  }));
244
227
  }
245
- }
246
-
247
- // Si el agente no tiene acceso o permisos según la respuesta de sessions, seleccionarlo con el flag correspondiente
248
- // La validación ahora se basa en las propiedades has_agent_access y has_agent_permission de la respuesta
249
- if (agentNoPermission && !agentDeleted) {
250
- if (!hasAgentAccess) {
251
- // Caso 1: No tiene acceso al agente
252
- selectAgent(_objectSpread(_objectSpread({
253
- id: agentNoPermission.id,
254
- name: agentNoPermission.name,
255
- emoji: agentNoPermission.emoji,
256
- type: agentNoPermission.type,
257
- has_not_access: true
258
- }, agentNoPermission.connectors ? {
228
+ markOpenedSessionAsReadIfVisible(targetChatId);
229
+ case 2:
230
+ case "end":
231
+ return _context2.stop();
232
+ }
233
+ }, _callee2);
234
+ }));
235
+ return function (_x2) {
236
+ return _ref4.apply(this, arguments);
237
+ };
238
+ }(), [selectAgent, setConversationContextFromMetadata]);
239
+ var loadMessages = useCallback(/*#__PURE__*/function () {
240
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(options) {
241
+ var seq, targetChatId, agentSnapshot, selectAgentForSession, _yield$maia$Chats$get, items, nextItem, agentDeleted, agentNoPermission, hasAgentAccess, hasAgentPermission, agentTypeFromSession, agentEntityFromSession, projectIdMessage, projectNameFromSession, projectDeleted, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, agentInList, contextProjectId, itemsToSet, tab, tabSegment, sessionMeta, finalMessages, tail, existingIds, extra, conversationMeta, sessionMetaEvent, paginationKey, _t;
242
+ return _regeneratorRuntime.wrap(function (_context3) {
243
+ while (1) switch (_context3.prev = _context3.next) {
244
+ case 0:
245
+ if (!(!(options !== null && options !== void 0 && options.force) && useSessionsStore.getState().canRestoreSession(chatId))) {
246
+ _context3.next = 2;
247
+ break;
248
+ }
249
+ _context3.next = 1;
250
+ return restoreSessionFromStore(chatId);
251
+ case 1:
252
+ return _context3.abrupt("return");
253
+ case 2:
254
+ loadSeqRef.current += 1;
255
+ seq = loadSeqRef.current;
256
+ targetChatId = chatId;
257
+ _context3.prev = 3;
258
+ setLoadingMessages(true);
259
+ initialLoadDone.current = false;
260
+ console.info('[useChatMessages] loadMessages start', {
261
+ chatId: targetChatId,
262
+ seq: seq,
263
+ force: options === null || options === void 0 ? void 0 : options.force
264
+ });
265
+ agentSnapshot = null;
266
+ selectAgentForSession = function selectAgentForSession(next) {
267
+ selectAgent(next);
268
+ agentSnapshot = next;
269
+ };
270
+ _context3.next = 4;
271
+ return maia.Chats.getChatMessages({
272
+ chatId: targetChatId,
273
+ currentUser: currentUser,
274
+ offset: 0,
275
+ cancelledText: t('chat.cancelled'),
276
+ lang: mapCORLang(i18n.language)
277
+ });
278
+ case 4:
279
+ _yield$maia$Chats$get = _context3.sent;
280
+ items = _yield$maia$Chats$get.items;
281
+ nextItem = _yield$maia$Chats$get.nextItem;
282
+ agentDeleted = _yield$maia$Chats$get.agentDeleted;
283
+ agentNoPermission = _yield$maia$Chats$get.agentNoPermission;
284
+ hasAgentAccess = _yield$maia$Chats$get.hasAgentAccess;
285
+ hasAgentPermission = _yield$maia$Chats$get.hasAgentPermission;
286
+ agentTypeFromSession = _yield$maia$Chats$get.agentType;
287
+ agentEntityFromSession = _yield$maia$Chats$get.agentEntity;
288
+ projectIdMessage = _yield$maia$Chats$get.projectId;
289
+ projectNameFromSession = _yield$maia$Chats$get.projectName;
290
+ projectDeleted = _yield$maia$Chats$get.projectDeleted;
291
+ clientIdFromSession = _yield$maia$Chats$get.clientId;
292
+ clientNameFromSession = _yield$maia$Chats$get.clientName;
293
+ taskIdFromSession = _yield$maia$Chats$get.taskId;
294
+ taskNameFromSession = _yield$maia$Chats$get.taskName;
295
+ if (!(seq !== loadSeqRef.current || targetChatId !== chatId)) {
296
+ _context3.next = 5;
297
+ break;
298
+ }
299
+ console.info('[useChatMessages] loadMessages stale response discarded', {
300
+ targetChatId: targetChatId,
301
+ currentChatId: chatId,
302
+ seq: seq,
303
+ currentSeq: loadSeqRef.current,
304
+ itemCount: items.length
305
+ });
306
+ return _context3.abrupt("return");
307
+ case 5:
308
+ console.info('[useChatMessages] loadMessages result:', {
309
+ chatId: targetChatId,
310
+ itemCount: items.length,
311
+ agentNoPermission: agentNoPermission,
312
+ agentDeleted: !!agentDeleted,
313
+ hasAgentAccess: hasAgentAccess,
314
+ hasAgentPermission: hasAgentPermission,
315
+ userPermissionsView: userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.view,
316
+ agentInAgentsList: agentNoPermission ? !!agents.find(function (a) {
317
+ return a.id === agentNoPermission.id;
318
+ }) : null
319
+ });
320
+ if (agentDeleted) {
321
+ selectAgentForSession(_objectSpread({
322
+ id: agentDeleted.id,
323
+ name: agentDeleted.name,
324
+ emoji: agentDeleted.emoji,
325
+ type: 'custom',
326
+ is_deleted: true,
327
+ deleted_at: agentDeleted.deletedAt
328
+ }, agentNoPermission !== null && agentNoPermission !== void 0 && agentNoPermission.connectors ? {
259
329
  connectors: agentNoPermission.connectors
260
- } : {}), projectDeleted ? {
261
- project_deleted: {
262
- name: projectDeleted.name
263
- }
264
330
  } : {}));
265
- } else if (!hasAgentPermission) {
266
- // Caso 2: No tiene permisos para visualizar/interactuar con el agente
267
- selectAgent(_objectSpread(_objectSpread({
331
+ }
332
+
333
+ // Si el agente no está en la lista pero tiene permisos, acceso y no está eliminado, setearlo normalmente
334
+ // Excluir agentes no-custom para usuarios con roles deshabilitados
335
+ if (agentNoPermission && !agentDeleted && userPermissions !== null && userPermissions !== void 0 && userPermissions.view && hasAgentAccess && hasAgentPermission && !agents.find(function (agent) {
336
+ return agent.id === agentNoPermission.id;
337
+ })) {
338
+ selectAgentForSession(_objectSpread(_objectSpread({
268
339
  id: agentNoPermission.id,
269
340
  name: agentNoPermission.name,
270
341
  emoji: agentNoPermission.emoji,
271
342
  type: agentNoPermission.type,
272
- has_not_permissions: true
343
+ is_from_conversation: true
273
344
  }, agentNoPermission.connectors ? {
274
345
  connectors: agentNoPermission.connectors
275
346
  } : {}), projectDeleted ? {
@@ -277,36 +348,149 @@ export var useChatMessages = function useChatMessages(_ref) {
277
348
  name: projectDeleted.name
278
349
  }
279
350
  } : {}));
280
- } else if (projectDeleted) {
281
- // Caso 3: El proyecto de la conversación fue eliminado
282
- selectAgent(_objectSpread(_objectSpread({
283
- id: agentNoPermission.id,
284
- name: agentNoPermission.name,
285
- emoji: agentNoPermission.emoji,
286
- type: agentNoPermission.type
287
- }, agentNoPermission.connectors ? {
288
- connectors: agentNoPermission.connectors
289
- } : {}), {}, {
290
- project_deleted: {
291
- name: projectDeleted.name
292
- }
351
+ }
352
+
353
+ // Si el agente está en la lista y tiene acceso/permisos, actualizar project_deleted (o limpiarlo al cambiar de chat)
354
+ if (agentNoPermission && !agentDeleted && hasAgentAccess && hasAgentPermission && agents.find(function (a) {
355
+ return a.id === agentNoPermission.id;
356
+ })) {
357
+ agentInList = agents.find(function (a) {
358
+ return a.id === agentNoPermission.id;
359
+ });
360
+ if (agentInList) {
361
+ selectAgentForSession(_objectSpread(_objectSpread(_objectSpread({}, agentInList), agentNoPermission.connectors ? {
362
+ connectors: agentNoPermission.connectors
363
+ } : {}), projectDeleted ? {
364
+ project_deleted: {
365
+ name: projectDeleted.name
366
+ }
367
+ } : {
368
+ project_deleted: undefined
369
+ }));
370
+ }
371
+ }
372
+
373
+ // Si el agente no tiene acceso o permisos según la respuesta de sessions, seleccionarlo con el flag correspondiente
374
+ // La validación ahora se basa en las propiedades has_agent_access y has_agent_permission de la respuesta
375
+ if (agentNoPermission && !agentDeleted) {
376
+ if (!hasAgentAccess) {
377
+ // Caso 1: No tiene acceso al agente
378
+ console.info('[useChatMessages] BRANCH: has_not_access — hasAgentAccess:', hasAgentAccess);
379
+ selectAgentForSession(_objectSpread(_objectSpread({
380
+ id: agentNoPermission.id,
381
+ name: agentNoPermission.name,
382
+ emoji: agentNoPermission.emoji,
383
+ type: agentNoPermission.type,
384
+ has_not_access: true
385
+ }, agentNoPermission.connectors ? {
386
+ connectors: agentNoPermission.connectors
387
+ } : {}), projectDeleted ? {
388
+ project_deleted: {
389
+ name: projectDeleted.name
390
+ }
391
+ } : {}));
392
+ } else if (!hasAgentPermission) {
393
+ // Caso 2: No tiene permisos para visualizar/interactuar con el agente
394
+ console.info('[useChatMessages] BRANCH: has_not_permissions — hasAgentPermission:', hasAgentPermission);
395
+ selectAgentForSession(_objectSpread(_objectSpread({
396
+ id: agentNoPermission.id,
397
+ name: agentNoPermission.name,
398
+ emoji: agentNoPermission.emoji,
399
+ type: agentNoPermission.type,
400
+ has_not_permissions: true
401
+ }, agentNoPermission.connectors ? {
402
+ connectors: agentNoPermission.connectors
403
+ } : {}), projectDeleted ? {
404
+ project_deleted: {
405
+ name: projectDeleted.name
406
+ }
407
+ } : {}));
408
+ } else if (projectDeleted) {
409
+ // Caso 3: El proyecto de la conversación fue eliminado
410
+ selectAgentForSession(_objectSpread(_objectSpread({
411
+ id: agentNoPermission.id,
412
+ name: agentNoPermission.name,
413
+ emoji: agentNoPermission.emoji,
414
+ type: agentNoPermission.type
415
+ }, agentNoPermission.connectors ? {
416
+ connectors: agentNoPermission.connectors
417
+ } : {}), {}, {
418
+ project_deleted: {
419
+ name: projectDeleted.name
420
+ }
421
+ }));
422
+ }
423
+ }
424
+ _context3.next = 6;
425
+ return setConversationContextFromMetadata({
426
+ projectIdMessage: projectIdMessage,
427
+ projectNameFromSession: projectNameFromSession,
428
+ clientIdFromSession: clientIdFromSession,
429
+ clientNameFromSession: clientNameFromSession,
430
+ taskIdFromSession: taskIdFromSession,
431
+ taskNameFromSession: taskNameFromSession
432
+ });
433
+ case 6:
434
+ // Metadata de la session (agent_type / agent_entity + contexto) para el cartel de
435
+ // "continuar en un chat nuevo" del footer cuando se abre una conversación de un clone legacy.
436
+ document.dispatchEvent(new CustomEvent('maia-chat-session-meta', {
437
+ detail: {
438
+ chatId: chatId,
439
+ agentType: agentTypeFromSession,
440
+ agentEntity: agentEntityFromSession,
441
+ projectId: projectIdMessage,
442
+ projectName: projectNameFromSession,
443
+ clientId: clientIdFromSession,
444
+ clientName: clientNameFromSession,
445
+ taskId: taskIdFromSession,
446
+ taskName: taskNameFromSession
447
+ }
448
+ }));
449
+
450
+ // Si hay proyecto en la conversación, reescribir URLs de tareas con el tab del usuario (me)
451
+ contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
452
+ itemsToSet = items;
453
+ if (!contextProjectId) {
454
+ _context3.next = 8;
455
+ break;
456
+ }
457
+ _context3.next = 7;
458
+ return getTabTaskDefault(1);
459
+ case 7:
460
+ tab = _context3.sent;
461
+ tabSegment = tab ? "/".concat(tab) : '/detail';
462
+ itemsToSet = items.map(function (item) {
463
+ return _objectSpread(_objectSpread({}, item), {}, {
464
+ message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
465
+ });
466
+ });
467
+ case 8:
468
+ // Si la sesión sigue generando (stream en background), reconstruimos el
469
+ // tail en vuelo (pregunta + placeholder) que aún no está persistido en el
470
+ // backend, mergeándolo al historial cargado sin duplicar por id.
471
+ sessionMeta = useSessionsStore.getState().getMeta(chatId);
472
+ finalMessages = itemsToSet;
473
+ if (sessionMeta && isActiveSessionStatus(sessionMeta.status)) {
474
+ tail = useSessionsStore.getState().getMessages(chatId);
475
+ existingIds = new Set(itemsToSet.map(function (item) {
476
+ return item.id;
293
477
  }));
478
+ extra = tail.filter(function (item) {
479
+ return !existingIds.has(item.id);
480
+ });
481
+ if (extra.length) {
482
+ finalMessages = [].concat(_toConsumableArray(itemsToSet), _toConsumableArray(extra));
483
+ }
294
484
  }
295
- }
296
- _context2.next = 2;
297
- return setConversationContextFromMetadata({
298
- projectIdMessage: projectIdMessage,
299
- projectNameFromSession: projectNameFromSession,
300
- clientIdFromSession: clientIdFromSession,
301
- clientNameFromSession: clientNameFromSession,
302
- taskIdFromSession: taskIdFromSession,
303
- taskNameFromSession: taskNameFromSession
304
- });
305
- case 2:
306
- // Metadata de la session (agent_type / agent_entity + contexto) para el cartel de
307
- // "continuar en un chat nuevo" del footer cuando se abre una conversación de un clone legacy.
308
- document.dispatchEvent(new CustomEvent('maia-chat-session-meta', {
309
- detail: {
485
+ conversationMeta = {
486
+ projectIdMessage: projectIdMessage,
487
+ projectNameFromSession: projectNameFromSession,
488
+ clientIdFromSession: clientIdFromSession,
489
+ clientNameFromSession: clientNameFromSession,
490
+ taskIdFromSession: taskIdFromSession,
491
+ taskNameFromSession: taskNameFromSession
492
+ };
493
+ sessionMetaEvent = {
310
494
  chatId: chatId,
311
495
  agentType: agentTypeFromSession,
312
496
  agentEntity: agentEntityFromSession,
@@ -316,64 +500,62 @@ export var useChatMessages = function useChatMessages(_ref) {
316
500
  clientName: clientNameFromSession,
317
501
  taskId: taskIdFromSession,
318
502
  taskName: taskNameFromSession
319
- }
320
- }));
321
-
322
- // Si hay proyecto en la conversación, reescribir URLs de tareas con el tab del usuario (me)
323
- contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
324
- itemsToSet = items;
325
- if (!contextProjectId) {
326
- _context2.next = 4;
327
- break;
328
- }
329
- _context2.next = 3;
330
- return getTabTaskDefault(1);
331
- case 3:
332
- tab = _context2.sent;
333
- tabSegment = tab ? "/".concat(tab) : '/detail';
334
- itemsToSet = items.map(function (item) {
335
- return _objectSpread(_objectSpread({}, item), {}, {
336
- message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
503
+ };
504
+ setMessages(finalMessages);
505
+ paginationKey = Number(nextItem);
506
+ setLastEvaluatedKey(paginationKey);
507
+ initialLoadDone.current = true;
508
+ useSessionsStore.getState().setMessages(targetChatId, finalMessages);
509
+ useSessionsStore.getState().setViewCache(targetChatId, {
510
+ hydratedFromApi: true,
511
+ lastEvaluatedKey: paginationKey,
512
+ conversationMeta: conversationMeta,
513
+ sessionMetaEvent: sessionMetaEvent,
514
+ agentSnapshot: agentSnapshot
337
515
  });
338
- });
339
- case 4:
340
- setMessages(itemsToSet);
341
- setLastEvaluatedKey(Number(nextItem));
342
- initialLoadDone.current = true;
343
- _context2.next = 6;
344
- break;
345
- case 5:
346
- _context2.prev = 5;
347
- _t = _context2["catch"](0);
348
- onError === null || onError === void 0 || onError();
349
- case 6:
350
- _context2.prev = 6;
351
- setLoadingMessages(false);
352
- return _context2.finish(6);
353
- case 7:
354
- case "end":
355
- return _context2.stop();
356
- }
357
- }, _callee2, null, [[0, 5, 6, 7]]);
358
- })), [chatId, currentUser, setConversationContextFromMetadata, onError, getTabTaskDefault]);
516
+ markOpenedSessionAsReadIfVisible(targetChatId);
517
+ _context3.next = 10;
518
+ break;
519
+ case 9:
520
+ _context3.prev = 9;
521
+ _t = _context3["catch"](3);
522
+ if (seq === loadSeqRef.current && targetChatId === chatId) {
523
+ onError === null || onError === void 0 || onError();
524
+ }
525
+ case 10:
526
+ _context3.prev = 10;
527
+ if (seq === loadSeqRef.current && targetChatId === chatId) {
528
+ setLoadingMessages(false);
529
+ }
530
+ return _context3.finish(10);
531
+ case 11:
532
+ case "end":
533
+ return _context3.stop();
534
+ }
535
+ }, _callee3, null, [[3, 9, 10, 11]]);
536
+ }));
537
+ return function (_x3) {
538
+ return _ref5.apply(this, arguments);
539
+ };
540
+ }(), [chatId, currentUser, setConversationContextFromMetadata, onError, getTabTaskDefault, restoreSessionFromStore, selectAgent, agents, t, i18n.language, userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.view]);
359
541
  var loadMoreMessages = useCallback(/*#__PURE__*/function () {
360
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(container) {
361
- var oldScrollHeight, oldScrollTop, _yield$maia$Chats$get2, items, nextItem, projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, contextProjectId, itemsToMerge, tab, tabSegment, newMessages, _t2;
362
- return _regeneratorRuntime.wrap(function (_context3) {
363
- while (1) switch (_context3.prev = _context3.next) {
542
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(container) {
543
+ var oldScrollHeight, oldScrollTop, _yield$maia$Chats$get2, items, nextItem, projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, contextProjectId, itemsToMerge, tab, tabSegment, newMessages, paginationKey, _t2;
544
+ return _regeneratorRuntime.wrap(function (_context4) {
545
+ while (1) switch (_context4.prev = _context4.next) {
364
546
  case 0:
365
547
  if (!(isLoadingRef.current || !lastEvaluatedKey || !container)) {
366
- _context3.next = 1;
548
+ _context4.next = 1;
367
549
  break;
368
550
  }
369
- return _context3.abrupt("return");
551
+ return _context4.abrupt("return");
370
552
  case 1:
371
- _context3.prev = 1;
553
+ _context4.prev = 1;
372
554
  isLoadingRef.current = true;
373
555
  setIsLoadingMoreMessages(true);
374
556
  oldScrollHeight = container.scrollHeight;
375
557
  oldScrollTop = container.scrollTop;
376
- _context3.next = 2;
558
+ _context4.next = 2;
377
559
  return maia.Chats.getChatMessages({
378
560
  chatId: chatId,
379
561
  currentUser: currentUser,
@@ -381,7 +563,7 @@ export var useChatMessages = function useChatMessages(_ref) {
381
563
  lang: mapCORLang(i18n.language)
382
564
  });
383
565
  case 2:
384
- _yield$maia$Chats$get2 = _context3.sent;
566
+ _yield$maia$Chats$get2 = _context4.sent;
385
567
  items = _yield$maia$Chats$get2.items;
386
568
  nextItem = _yield$maia$Chats$get2.nextItem;
387
569
  projectIdMessage = _yield$maia$Chats$get2.projectId;
@@ -390,7 +572,7 @@ export var useChatMessages = function useChatMessages(_ref) {
390
572
  clientNameFromSession = _yield$maia$Chats$get2.clientName;
391
573
  taskIdFromSession = _yield$maia$Chats$get2.taskId;
392
574
  taskNameFromSession = _yield$maia$Chats$get2.taskName;
393
- _context3.next = 3;
575
+ _context4.next = 3;
394
576
  return setConversationContextFromMetadata({
395
577
  projectIdMessage: projectIdMessage,
396
578
  projectNameFromSession: projectNameFromSession,
@@ -404,13 +586,13 @@ export var useChatMessages = function useChatMessages(_ref) {
404
586
  contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
405
587
  itemsToMerge = items;
406
588
  if (!contextProjectId) {
407
- _context3.next = 5;
589
+ _context4.next = 5;
408
590
  break;
409
591
  }
410
- _context3.next = 4;
592
+ _context4.next = 4;
411
593
  return getTabTaskDefault(1);
412
594
  case 4:
413
- tab = _context3.sent;
595
+ tab = _context4.sent;
414
596
  tabSegment = tab ? "/".concat(tab) : '/detail';
415
597
  itemsToMerge = items.map(function (item) {
416
598
  return _objectSpread(_objectSpread({}, item), {}, {
@@ -420,7 +602,9 @@ export var useChatMessages = function useChatMessages(_ref) {
420
602
  case 5:
421
603
  newMessages = [].concat(_toConsumableArray(messages.slice(0, 1)), _toConsumableArray(itemsToMerge), _toConsumableArray(messages.slice(1)));
422
604
  setMessages(newMessages);
423
- setLastEvaluatedKey(Number(nextItem));
605
+ paginationKey = Number(nextItem);
606
+ setLastEvaluatedKey(paginationKey);
607
+ syncMessagesToStore(chatId, newMessages, paginationKey);
424
608
  requestAnimationFrame(function () {
425
609
  requestAnimationFrame(function () {
426
610
  var containerRef = container;
@@ -431,27 +615,27 @@ export var useChatMessages = function useChatMessages(_ref) {
431
615
  }
432
616
  });
433
617
  });
434
- _context3.next = 7;
618
+ _context4.next = 7;
435
619
  break;
436
620
  case 6:
437
- _context3.prev = 6;
438
- _t2 = _context3["catch"](1);
621
+ _context4.prev = 6;
622
+ _t2 = _context4["catch"](1);
439
623
  onError === null || onError === void 0 || onError();
440
624
  case 7:
441
- _context3.prev = 7;
625
+ _context4.prev = 7;
442
626
  setIsLoadingMoreMessages(false);
443
627
  isLoadingRef.current = false;
444
- return _context3.finish(7);
628
+ return _context4.finish(7);
445
629
  case 8:
446
630
  case "end":
447
- return _context3.stop();
631
+ return _context4.stop();
448
632
  }
449
- }, _callee3, null, [[1, 6, 7, 8]]);
633
+ }, _callee4, null, [[1, 6, 7, 8]]);
450
634
  }));
451
- return function (_x2) {
452
- return _ref5.apply(this, arguments);
635
+ return function (_x4) {
636
+ return _ref6.apply(this, arguments);
453
637
  };
454
- }(), [chatId, currentUser, lastEvaluatedKey, onError, messages, getTabTaskDefault, setConversationContextFromMetadata]);
638
+ }(), [chatId, currentUser, lastEvaluatedKey, onError, messages, getTabTaskDefault, setConversationContextFromMetadata, syncMessagesToStore]);
455
639
  var handleScroll = useCallback(function (container) {
456
640
  if (!container || isLoadingRef.current || !initialLoadDone.current) return;
457
641
  var scrollTop = container.scrollTop,
@@ -464,36 +648,37 @@ export var useChatMessages = function useChatMessages(_ref) {
464
648
  }, [loadMoreMessages]);
465
649
  useEffect(function () {
466
650
  if (chatId !== previousChatId.current) {
467
- setMessages(userInitialMessage ? [_objectSpread(_objectSpread({
468
- id: 'user-initial-message',
469
- date: new Date(),
470
- user: currentUser,
471
- message: formatQuickActionMessageForDisplay(userInitialMessage.message, {
472
- fuaId: userInitialMessage.fuaId,
473
- scId: userInitialMessage.scId
474
- })
475
- }, userInitialMessage.attachments ? {
476
- attachments: userInitialMessage.attachments
477
- } : {}), buildContextMessage(userInitialMessage.mentions) ? {
478
- contextMessage: buildContextMessage(userInitialMessage.mentions)
479
- } : {})] : []);
480
- setLastEvaluatedKey(0);
651
+ var fromChatId = previousChatId.current;
652
+ var canRestore = useSessionsStore.getState().canRestoreSession(chatId);
653
+ console.info('[useChatMessages] session switch', {
654
+ from: fromChatId,
655
+ to: chatId,
656
+ canRestore: canRestore
657
+ });
481
658
  isLoadingRef.current = false;
482
659
  initialLoadDone.current = false;
483
660
  previousChatId.current = chatId;
661
+ setLastEvaluatedKey(0);
662
+ loadSeqRef.current += 1;
663
+ refetchTabTaskDefault();
664
+ var pendingInitialMessage = hasMeaningfulUserInitialMessage(userInitialMessage);
665
+ if (!pendingInitialMessage && canRestore) {
666
+ restoreSessionFromStore(chatId)["catch"](function (error) {
667
+ console.error('[useChatMessages] restoreSessionFromStore failed', error);
668
+ });
669
+ return;
670
+ }
671
+ setMessages(pendingInitialMessage && userInitialMessage ? buildInitialMessagePlaceholder(userInitialMessage, currentUser) : []);
484
672
 
485
673
  // Limpiar el estado del proyecto y la tarea cuando cambia de conversación
486
674
  setChipsProject(null);
487
675
  setProject(null);
488
676
  setTask(null);
489
-
490
- // Volver a ejecutar la query me para tener tabTaskDefault actualizado en la nueva conversación
491
- refetchTabTaskDefault();
492
- if (!userInitialMessage) {
677
+ if (!pendingInitialMessage) {
493
678
  loadMessages();
494
679
  }
495
680
  }
496
- }, [chatId, userInitialMessage, currentUser, loadMessages, setChipsProject, setProject, setTask, refetchTabTaskDefault]);
681
+ }, [chatId, userInitialMessage, currentUser, loadMessages, restoreSessionFromStore, setChipsProject, setProject, setTask, refetchTabTaskDefault]);
497
682
 
498
683
  // Cuando tabTaskDefault pasa a estar disponible después de cargar, reescribir URLs de tareas en los mensajes ya cargados.
499
684
  // Ref para evitar bucle: setMessages(rewritten) cambia messages y re-ejecuta el efecto; solo reescribimos una vez por lote.
@@ -522,27 +707,33 @@ export var useChatMessages = function useChatMessages(_ref) {
522
707
  });
523
708
  });
524
709
  setMessages(rewritten);
525
- }, [tabTaskDefault, project === null || project === void 0 ? void 0 : project.id, messages]);
710
+ syncMessagesToStore(chatId, rewritten);
711
+ }, [tabTaskDefault, project === null || project === void 0 ? void 0 : project.id, messages, chatId, syncMessagesToStore]);
526
712
  var addMessage = useCallback(function (message) {
527
713
  setMessages(function (prev) {
528
714
  var existingMessageIndex = prev.findIndex(function (msg) {
529
715
  return msg.id === message.id;
530
716
  });
531
717
  if (existingMessageIndex >= 0) {
532
- var newMessages = _toConsumableArray(prev);
533
- newMessages[existingMessageIndex] = message;
534
- return newMessages;
718
+ var _newMessages = _toConsumableArray(prev);
719
+ _newMessages[existingMessageIndex] = message;
720
+ syncMessagesToStore(chatId, _newMessages);
721
+ return _newMessages;
535
722
  }
536
- return [].concat(_toConsumableArray(prev), [message]);
723
+ var newMessages = [].concat(_toConsumableArray(prev), [message]);
724
+ syncMessagesToStore(chatId, newMessages);
725
+ return newMessages;
537
726
  });
538
- }, []);
727
+ }, [chatId, syncMessagesToStore]);
539
728
  var removeMessage = useCallback(function (messageId) {
540
729
  setMessages(function (prev) {
541
- return prev.filter(function (msg) {
730
+ var newMessages = prev.filter(function (msg) {
542
731
  return msg.id !== messageId;
543
732
  });
733
+ syncMessagesToStore(chatId, newMessages);
734
+ return newMessages;
544
735
  });
545
- }, []);
736
+ }, [chatId, syncMessagesToStore]);
546
737
  return {
547
738
  loadingMessages: loadingMessages,
548
739
  messages: messages,
@@ -555,4 +746,4 @@ export var useChatMessages = function useChatMessages(_ref) {
555
746
  handleScroll: handleScroll
556
747
  };
557
748
  };
558
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVN0YXRlIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlUHJvamVjdHMiLCJidWlsZENvbnRleHRNZXNzYWdlIiwibWFpYSIsInVzZUdsb2JhbENvbnRleHQiLCJ1c2VUIiwidXNlVXNlciIsInVzZVRhYlRhc2tEZWZhdWx0IiwiVEFTS19VUkxfUkVHRVhfUEFUVEVSTiIsIm1hcENPUkxhbmciLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwicmV3cml0ZVRhc2tVcmxzSW5Db250ZW50IiwiY29udGVudCIsInRhYlNlZ21lbnQiLCJ0YXNrVXJsUmVnZXgiLCJSZWdFeHAiLCJyZXBsYWNlIiwidXJsIiwidXNlQ2hhdE1lc3NhZ2VzIiwiX3JlZiIsIl91c2VyJHBlcm1pc3Npb25zIiwib25FcnJvciIsImNoYXRJZCIsImN1cnJlbnRVc2VyIiwidXNlckluaXRpYWxNZXNzYWdlIiwiX3JlZiRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsInQiLCJpMThuIiwidXNlciIsInVzZXJQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwibG9hZGluZ01lc3NhZ2VzIiwic2V0TG9hZGluZ01lc3NhZ2VzIiwiX3VzZVN0YXRlMyIsIl9vYmplY3RTcHJlYWQiLCJpZCIsImRhdGUiLCJEYXRlIiwibWVzc2FnZSIsImZ1YUlkIiwic2NJZCIsImF0dGFjaG1lbnRzIiwibWVudGlvbnMiLCJjb250ZXh0TWVzc2FnZSIsIl91c2VTdGF0ZTQiLCJtZXNzYWdlcyIsInNldE1lc3NhZ2VzIiwiX3VzZVByb2plY3RzIiwiZmV0Y2hQcm9qZWN0cyIsIl91c2VHbG9iYWxDb250ZXh0Iiwic2VsZWN0QWdlbnQiLCJzZXRDaGlwc1Byb2plY3QiLCJzZXRQcm9qZWN0Iiwic2V0Q2xpZW50Iiwic2V0VGFzayIsInByb2plY3QiLCJfdXNlVGFiVGFza0RlZmF1bHQiLCJnZXRUYWJUYXNrRGVmYXVsdCIsInRhYlRhc2tEZWZhdWx0IiwicmVmZXRjaFRhYlRhc2tEZWZhdWx0IiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsImxhc3RFdmFsdWF0ZWRLZXkiLCJzZXRMYXN0RXZhbHVhdGVkS2V5IiwiaXNMb2FkaW5nUmVmIiwiaW5pdGlhbExvYWREb25lIiwicHJldmlvdXNDaGF0SWQiLCJzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhIiwiX3JlZjMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsIl9yZWYyIiwicHJvamVjdElkTWVzc2FnZSIsInByb2plY3ROYW1lRnJvbVNlc3Npb24iLCJjbGllbnRJZEZyb21TZXNzaW9uIiwiY2xpZW50TmFtZUZyb21TZXNzaW9uIiwidGFza0lkRnJvbVNlc3Npb24iLCJ0YXNrTmFtZUZyb21TZXNzaW9uIiwicHJvamVjdHMiLCJoYXNNdWx0aUFnZW50c0FjY2VzcyIsInByb2plY3RJZE51bSIsImZvdW5kUHJvamVjdCIsIl9mb3VuZFByb2plY3QkY2xpZW50Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJuYW1lIiwiTnVtYmVyIiwiYWJydXB0Iiwic2VudCIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJmaW5kIiwicCIsInByb2plY3ROYW1lIiwiY2xpZW50TmFtZSIsImNsaWVudCIsInByb2plY3RJZCIsIlN0cmluZyIsInN0b3AiLCJfeCIsImFwcGx5IiwiYXJndW1lbnRzIiwibG9hZE1lc3NhZ2VzIiwiX2NhbGxlZTIiLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQiLCJpdGVtcyIsIm5leHRJdGVtIiwiYWdlbnREZWxldGVkIiwiYWdlbnROb1Blcm1pc3Npb24iLCJoYXNBZ2VudEFjY2VzcyIsImhhc0FnZW50UGVybWlzc2lvbiIsImFnZW50VHlwZUZyb21TZXNzaW9uIiwiYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbiIsInByb2plY3REZWxldGVkIiwiYWdlbnRJbkxpc3QiLCJjb250ZXh0UHJvamVjdElkIiwiaXRlbXNUb1NldCIsInRhYiIsIl90IiwiX2NvbnRleHQyIiwiY3VycmVudCIsIkNoYXRzIiwiZ2V0Q2hhdE1lc3NhZ2VzIiwib2Zmc2V0IiwiY2FuY2VsbGVkVGV4dCIsImxhbmciLCJsYW5ndWFnZSIsImFnZW50VHlwZSIsImFnZW50RW50aXR5IiwiY2xpZW50SWQiLCJ0YXNrSWQiLCJ0YXNrTmFtZSIsImVtb2ppIiwidHlwZSIsImlzX2RlbGV0ZWQiLCJkZWxldGVkX2F0IiwiZGVsZXRlZEF0IiwiY29ubmVjdG9ycyIsInZpZXciLCJhZ2VudCIsImlzX2Zyb21fY29udmVyc2F0aW9uIiwicHJvamVjdF9kZWxldGVkIiwiYSIsInVuZGVmaW5lZCIsImhhc19ub3RfYWNjZXNzIiwiaGFzX25vdF9wZXJtaXNzaW9ucyIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwicGFyc2VJbnQiLCJjb25jYXQiLCJtYXAiLCJpdGVtIiwiZmluaXNoIiwibG9hZE1vcmVNZXNzYWdlcyIsIl9yZWY1IiwiX2NhbGxlZTMiLCJjb250YWluZXIiLCJvbGRTY3JvbGxIZWlnaHQiLCJvbGRTY3JvbGxUb3AiLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQyIiwiaXRlbXNUb01lcmdlIiwibmV3TWVzc2FnZXMiLCJfdDIiLCJfY29udGV4dDMiLCJzY3JvbGxIZWlnaHQiLCJzY3JvbGxUb3AiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJzbGljZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNvbnRhaW5lclJlZiIsIm5ld1Njcm9sbEhlaWdodCIsImhlaWdodERpZmZlcmVuY2UiLCJfeDIiLCJoYW5kbGVTY3JvbGwiLCJjbGllbnRIZWlnaHQiLCJzY3JvbGxQZXJjZW50YWdlIiwiZGlkUmV3cml0ZVJlZiIsImxlbmd0aCIsIm5lZWRzUmV3cml0ZSIsInNvbWUiLCJtc2ciLCJtYXRjaGVzIiwibWF0Y2giLCJlbmRzV2l0aCIsImluY2x1ZGVzIiwicmV3cml0dGVuIiwiYWRkTWVzc2FnZSIsImV4aXN0aW5nTWVzc2FnZUluZGV4IiwiZmluZEluZGV4IiwicmVtb3ZlTWVzc2FnZSIsIm1lc3NhZ2VJZCIsImZpbHRlciIsImhhc01vcmVNZXNzYWdlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWVzc2FnZXMvdXNlQ2hhdE1lc3NhZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVByb2plY3RzIH0gZnJvbSAnLi4vdXNlUHJvamVjdHMnXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBidWlsZENvbnRleHRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgbWFpYSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhJ1xuaW1wb3J0IHsgVXNlQ2hhdE1lc3NhZ2VzUHJvcHMgfSBmcm9tICcuL3VzZUNoYXRNZXNzYWdlcy5pbnRlcmZhY2UnXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi91c2VUJ1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyB1c2VUYWJUYXNrRGVmYXVsdCB9IGZyb20gJy4uL3VzZVRhYlRhc2tEZWZhdWx0J1xuaW1wb3J0IHsgVEFTS19VUkxfUkVHRVhfUEFUVEVSTiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy90YXNrVXJscydcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi9sYW5nL3V0aWxzJ1xuaW1wb3J0IHsgZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZSdcblxuY29uc3QgcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50ID0gKGNvbnRlbnQ6IHN0cmluZywgdGFiU2VnbWVudDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICB1cmwucmVwbGFjZSgvXFwvKGRldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpKD89JHxcXD8pLywgdGFiU2VnbWVudClcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdE1lc3NhZ2VzID0gKHtcbiAgb25FcnJvcixcbiAgY2hhdElkLFxuICBjdXJyZW50VXNlcixcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBhZ2VudHMgPSBbXSxcbn06IFVzZUNoYXRNZXNzYWdlc1Byb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCwgaTE4biB9ID0gdXNlVCgpXG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gdXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50c1xuICBjb25zdCBbbG9hZGluZ01lc3NhZ2VzLCBzZXRMb2FkaW5nTWVzc2FnZXNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oXG4gICAgdXNlckluaXRpYWxNZXNzYWdlXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3VzZXItaW5pdGlhbC1tZXNzYWdlJyxcbiAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkodXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2UsIHtcbiAgICAgICAgICAgICAgZnVhSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCxcbiAgICAgICAgICAgICAgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHMgPyB7IGF0dGFjaG1lbnRzOiB1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucylcbiAgICAgICAgICAgICAgPyB7IGNvbnRleHRNZXNzYWdlOiBidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucykgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICA6IFtdXG4gIClcbiAgY29uc3QgeyBmZXRjaFByb2plY3RzIH0gPSB1c2VQcm9qZWN0cygpXG4gIGNvbnN0IHsgc2VsZWN0QWdlbnQsIHNldENoaXBzUHJvamVjdCwgc2V0UHJvamVjdCwgc2V0Q2xpZW50LCBzZXRUYXNrLCBwcm9qZWN0IH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgeyBnZXRUYWJUYXNrRGVmYXVsdCwgdGFiVGFza0RlZmF1bHQsIHJlZmV0Y2hUYWJUYXNrRGVmYXVsdCB9ID0gdXNlVGFiVGFza0RlZmF1bHQoKVxuICBjb25zdCBbaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCBzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtsYXN0RXZhbHVhdGVkS2V5LCBzZXRMYXN0RXZhbHVhdGVkS2V5XSA9IHVzZVN0YXRlPG51bWJlciB8IHVuZGVmaW5lZD4oMClcbiAgY29uc3QgaXNMb2FkaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBpbml0aWFsTG9hZERvbmUgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHByZXZpb3VzQ2hhdElkID0gdXNlUmVmKGNoYXRJZClcblxuICBjb25zdCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHtcbiAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgIHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICB9OiB7XG4gICAgICBwcm9qZWN0SWRNZXNzYWdlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICBjbGllbnRJZEZyb21TZXNzaW9uOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICBjbGllbnROYW1lRnJvbVNlc3Npb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIHRhc2tJZEZyb21TZXNzaW9uOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICB0YXNrTmFtZUZyb21TZXNzaW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgfSkgPT4ge1xuICAgICAgLy8gVGFyZWEgZGUgbGEgY29udmVyc2FjacOzbjogc2UgZGVyaXZhIGRlIGxhIG1ldGFkYXRhIGRlIGxhIHNlc3Npb24gcGFyYSBtb3N0cmFyIGVsIGNoaXBcbiAgICAgIC8vIGRlIGxhIHRhcmVhICh5IHJlZW52aWFyIGxhIG1ldGFkYXRhIGVuIGNhZGEgbWVuc2FqZSkgc2luIGltcG9ydGFyIGRlc2RlIGTDs25kZSBzZSBhYnJhLlxuICAgICAgaWYgKHRhc2tJZEZyb21TZXNzaW9uICE9IG51bGwgJiYgdGFza05hbWVGcm9tU2Vzc2lvbikge1xuICAgICAgICBzZXRUYXNrKHsgaWQ6IHRhc2tJZEZyb21TZXNzaW9uLCBuYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUYXNrKG51bGwpXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnNhY2nDs24gY29uIGNsaWVudF9tZXRhZGF0YTogc2V0ZWFyIGNsaWVudGUgeSBsaW1waWFyIHByb3llY3RvXG4gICAgICBpZiAoY2xpZW50SWRGcm9tU2Vzc2lvbiAhPSBudWxsICYmIGNsaWVudE5hbWVGcm9tU2Vzc2lvbikge1xuICAgICAgICBzZXRDbGllbnQoeyBpZDogTnVtYmVyKGNsaWVudElkRnJvbVNlc3Npb24pLCBuYW1lOiBjbGllbnROYW1lRnJvbVNlc3Npb24gfSlcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmV0Y2hQcm9qZWN0cyhwcm9qZWN0SWRNZXNzYWdlKVxuICAgICAgY29uc3QgaGFzTXVsdGlBZ2VudHNBY2Nlc3MgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG5cbiAgICAgIGlmIChwcm9qZWN0SWRNZXNzYWdlICYmIGhhc011bHRpQWdlbnRzQWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3RJZE51bSA9IE51bWJlcihwcm9qZWN0SWRNZXNzYWdlKVxuICAgICAgICBjb25zdCBmb3VuZFByb2plY3QgPSBwcm9qZWN0cz8uZmluZChwID0+IE51bWJlcihwLmlkKSA9PT0gcHJvamVjdElkTnVtKVxuXG4gICAgICAgIGlmIChmb3VuZFByb2plY3QpIHtcbiAgICAgICAgICBzZXRDaGlwc1Byb2plY3Qoe1xuICAgICAgICAgICAgcHJvamVjdE5hbWU6IGZvdW5kUHJvamVjdC5uYW1lLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogZm91bmRQcm9qZWN0LmNsaWVudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHByb2plY3RJZDogU3RyaW5nKGZvdW5kUHJvamVjdC5pZCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRQcm9qZWN0KGZvdW5kUHJvamVjdClcbiAgICAgICAgfSBlbHNlIGlmIChwcm9qZWN0TmFtZUZyb21TZXNzaW9uKSB7XG4gICAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KHtcbiAgICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogJycsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IFN0cmluZyhwcm9qZWN0SWRNZXNzYWdlKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHNldFByb2plY3QoeyBpZDogcHJvamVjdElkTnVtLCBuYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICB9XG4gICAgfSxcbiAgICBbZmV0Y2hQcm9qZWN0cywgc2V0Q2xpZW50LCBzZXRDaGlwc1Byb2plY3QsIHNldFByb2plY3QsIHNldFRhc2tdXG4gIClcblxuICBjb25zdCBsb2FkTWVzc2FnZXMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHNldExvYWRpbmdNZXNzYWdlcyh0cnVlKVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgY29uc3Qge1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgbmV4dEl0ZW0sXG4gICAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgICAgYWdlbnROb1Blcm1pc3Npb24sXG4gICAgICAgIGhhc0FnZW50QWNjZXNzLFxuICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICAgIGFnZW50VHlwZTogYWdlbnRUeXBlRnJvbVNlc3Npb24sXG4gICAgICAgIGFnZW50RW50aXR5OiBhZ2VudEVudGl0eUZyb21TZXNzaW9uLFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICBwcm9qZWN0RGVsZXRlZCxcbiAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgIGNsaWVudE5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgdGFza0lkOiB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICB9ID0gYXdhaXQgbWFpYS5DaGF0cy5nZXRDaGF0TWVzc2FnZXMoe1xuICAgICAgICBjaGF0SWQsXG4gICAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgICBvZmZzZXQ6IGxhc3RFdmFsdWF0ZWRLZXksXG4gICAgICAgIGNhbmNlbGxlZFRleHQ6IHQoJ2NoYXQuY2FuY2VsbGVkJyksXG4gICAgICAgIGxhbmc6IG1hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSksXG4gICAgICB9KVxuXG4gICAgICBpZiAoYWdlbnREZWxldGVkKSB7XG4gICAgICAgIHNlbGVjdEFnZW50KHtcbiAgICAgICAgICBpZDogYWdlbnREZWxldGVkLmlkLFxuICAgICAgICAgIG5hbWU6IGFnZW50RGVsZXRlZC5uYW1lLFxuICAgICAgICAgIGVtb2ppOiBhZ2VudERlbGV0ZWQuZW1vamksXG4gICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgaXNfZGVsZXRlZDogdHJ1ZSxcbiAgICAgICAgICBkZWxldGVkX2F0OiBhZ2VudERlbGV0ZWQuZGVsZXRlZEF0LFxuICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbj8uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBTaSBlbCBhZ2VudGUgbm8gZXN0w6EgZW4gbGEgbGlzdGEgcGVybyB0aWVuZSBwZXJtaXNvcywgYWNjZXNvIHkgbm8gZXN0w6EgZWxpbWluYWRvLCBzZXRlYXJsbyBub3JtYWxtZW50ZVxuICAgICAgLy8gRXhjbHVpciBhZ2VudGVzIG5vLWN1c3RvbSBwYXJhIHVzdWFyaW9zIGNvbiByb2xlcyBkZXNoYWJpbGl0YWRvc1xuICAgICAgaWYgKFxuICAgICAgICBhZ2VudE5vUGVybWlzc2lvbiAmJlxuICAgICAgICAhYWdlbnREZWxldGVkICYmXG4gICAgICAgIHVzZXJQZXJtaXNzaW9ucz8udmlldyAmJlxuICAgICAgICBoYXNBZ2VudEFjY2VzcyAmJlxuICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24gJiZcbiAgICAgICAgIWFnZW50cy5maW5kKGFnZW50ID0+IGFnZW50LmlkID09PSBhZ2VudE5vUGVybWlzc2lvbi5pZClcbiAgICAgICkge1xuICAgICAgICBzZWxlY3RBZ2VudCh7XG4gICAgICAgICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgJ3BtJyB8ICdjdXN0b20nIHwgJ2Nsb25lJyB8ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgIGlzX2Zyb21fY29udmVyc2F0aW9uOiB0cnVlLFxuICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIFNpIGVsIGFnZW50ZSBlc3TDoSBlbiBsYSBsaXN0YSB5IHRpZW5lIGFjY2Vzby9wZXJtaXNvcywgYWN0dWFsaXphciBwcm9qZWN0X2RlbGV0ZWQgKG8gbGltcGlhcmxvIGFsIGNhbWJpYXIgZGUgY2hhdClcbiAgICAgIGlmIChcbiAgICAgICAgYWdlbnROb1Blcm1pc3Npb24gJiZcbiAgICAgICAgIWFnZW50RGVsZXRlZCAmJlxuICAgICAgICBoYXNBZ2VudEFjY2VzcyAmJlxuICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24gJiZcbiAgICAgICAgYWdlbnRzLmZpbmQoYSA9PiBhLmlkID09PSBhZ2VudE5vUGVybWlzc2lvbi5pZClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhZ2VudEluTGlzdCA9IGFnZW50cy5maW5kKGEgPT4gYS5pZCA9PT0gYWdlbnROb1Blcm1pc3Npb24uaWQpXG4gICAgICAgIGlmIChhZ2VudEluTGlzdCkge1xuICAgICAgICAgIHNlbGVjdEFnZW50KHtcbiAgICAgICAgICAgIC4uLmFnZW50SW5MaXN0LFxuICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDogeyBwcm9qZWN0X2RlbGV0ZWQ6IHVuZGVmaW5lZCB9KSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNpIGVsIGFnZW50ZSBubyB0aWVuZSBhY2Nlc28gbyBwZXJtaXNvcyBzZWfDum4gbGEgcmVzcHVlc3RhIGRlIHNlc3Npb25zLCBzZWxlY2Npb25hcmxvIGNvbiBlbCBmbGFnIGNvcnJlc3BvbmRpZW50ZVxuICAgICAgLy8gTGEgdmFsaWRhY2nDs24gYWhvcmEgc2UgYmFzYSBlbiBsYXMgcHJvcGllZGFkZXMgaGFzX2FnZW50X2FjY2VzcyB5IGhhc19hZ2VudF9wZXJtaXNzaW9uIGRlIGxhIHJlc3B1ZXN0YVxuICAgICAgaWYgKGFnZW50Tm9QZXJtaXNzaW9uICYmICFhZ2VudERlbGV0ZWQpIHtcbiAgICAgICAgaWYgKCFoYXNBZ2VudEFjY2Vzcykge1xuICAgICAgICAgIC8vIENhc28gMTogTm8gdGllbmUgYWNjZXNvIGFsIGFnZW50ZVxuICAgICAgICAgIHNlbGVjdEFnZW50KHtcbiAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgIGhhc19ub3RfYWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDoge30pLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc0FnZW50UGVybWlzc2lvbikge1xuICAgICAgICAgIC8vIENhc28gMjogTm8gdGllbmUgcGVybWlzb3MgcGFyYSB2aXN1YWxpemFyL2ludGVyYWN0dWFyIGNvbiBlbCBhZ2VudGVcbiAgICAgICAgICBzZWxlY3RBZ2VudCh7XG4gICAgICAgICAgICBpZDogYWdlbnROb1Blcm1pc3Npb24uaWQsXG4gICAgICAgICAgICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICAgICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgICAgdHlwZTogYWdlbnROb1Blcm1pc3Npb24udHlwZSBhcyAncG0nIHwgJ2N1c3RvbScgfCAnY2xvbmUnIHwgJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgICBoYXNfbm90X3Blcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDoge30pLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocHJvamVjdERlbGV0ZWQpIHtcbiAgICAgICAgICAvLyBDYXNvIDM6IEVsIHByb3llY3RvIGRlIGxhIGNvbnZlcnNhY2nDs24gZnVlIGVsaW1pbmFkb1xuICAgICAgICAgIHNlbGVjdEFnZW50KHtcbiAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSh7XG4gICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICB9KVxuXG4gICAgICAvLyBNZXRhZGF0YSBkZSBsYSBzZXNzaW9uIChhZ2VudF90eXBlIC8gYWdlbnRfZW50aXR5ICsgY29udGV4dG8pIHBhcmEgZWwgY2FydGVsIGRlXG4gICAgICAvLyBcImNvbnRpbnVhciBlbiB1biBjaGF0IG51ZXZvXCIgZGVsIGZvb3RlciBjdWFuZG8gc2UgYWJyZSB1bmEgY29udmVyc2FjacOzbiBkZSB1biBjbG9uZSBsZWdhY3kuXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtY2hhdC1zZXNzaW9uLW1ldGEnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBjaGF0SWQsXG4gICAgICAgICAgICBhZ2VudFR5cGU6IGFnZW50VHlwZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgYWdlbnRFbnRpdHk6IGFnZW50RW50aXR5RnJvbVNlc3Npb24sXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgICBwcm9qZWN0TmFtZTogcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgIGNsaWVudElkOiBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgdGFza0lkOiB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgIHRhc2tOYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApXG5cbiAgICAgIC8vIFNpIGhheSBwcm95ZWN0byBlbiBsYSBjb252ZXJzYWNpw7NuLCByZWVzY3JpYmlyIFVSTHMgZGUgdGFyZWFzIGNvbiBlbCB0YWIgZGVsIHVzdWFyaW8gKG1lKVxuICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZCA9IHByb2plY3RJZE1lc3NhZ2UgPyBwYXJzZUludChTdHJpbmcocHJvamVjdElkTWVzc2FnZSksIDEwKSA6IG51bGxcbiAgICAgIGxldCBpdGVtc1RvU2V0ID0gaXRlbXNcbiAgICAgIGlmIChjb250ZXh0UHJvamVjdElkKSB7XG4gICAgICAgIGNvbnN0IHRhYiA9IGF3YWl0IGdldFRhYlRhc2tEZWZhdWx0KDEpXG4gICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgaXRlbXNUb1NldCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBtZXNzYWdlOiByZXdyaXRlVGFza1VybHNJbkNvbnRlbnQoaXRlbS5tZXNzYWdlIHx8ICcnLCB0YWJTZWdtZW50KSxcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgICBzZXRNZXNzYWdlcyhpdGVtc1RvU2V0KVxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShOdW1iZXIobmV4dEl0ZW0pKVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG9uRXJyb3I/LigpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldExvYWRpbmdNZXNzYWdlcyhmYWxzZSlcbiAgICB9XG4gIH0sIFtjaGF0SWQsIGN1cnJlbnRVc2VyLCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhLCBvbkVycm9yLCBnZXRUYWJUYXNrRGVmYXVsdF0pXG5cbiAgY29uc3QgbG9hZE1vcmVNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKGlzTG9hZGluZ1JlZi5jdXJyZW50IHx8ICFsYXN0RXZhbHVhdGVkS2V5IHx8ICFjb250YWluZXIpIHJldHVyblxuICAgICAgdHJ5IHtcbiAgICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIHNldElzTG9hZGluZ01vcmVNZXNzYWdlcyh0cnVlKVxuXG4gICAgICAgIGNvbnN0IG9sZFNjcm9sbEhlaWdodCA9IGNvbnRhaW5lci5zY3JvbGxIZWlnaHRcbiAgICAgICAgY29uc3Qgb2xkU2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcFxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICBuZXh0SXRlbSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0gPSBhd2FpdCBtYWlhLkNoYXRzLmdldENoYXRNZXNzYWdlcyh7XG4gICAgICAgICAgY2hhdElkLFxuICAgICAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgICAgIG9mZnNldDogbGFzdEV2YWx1YXRlZEtleSxcbiAgICAgICAgICBsYW5nOiBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpLFxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEoe1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNpIGhheSBwcm95ZWN0byBlbiBsYSBjb252ZXJzYWNpw7NuLCByZWVzY3JpYmlyIFVSTHMgZGUgdGFyZWFzIGVuIGxvcyBtZW5zYWplcyBjYXJnYWRvc1xuICAgICAgICBjb25zdCBjb250ZXh0UHJvamVjdElkID0gcHJvamVjdElkTWVzc2FnZSA/IHBhcnNlSW50KFN0cmluZyhwcm9qZWN0SWRNZXNzYWdlKSwgMTApIDogbnVsbFxuICAgICAgICBsZXQgaXRlbXNUb01lcmdlID0gaXRlbXNcbiAgICAgICAgaWYgKGNvbnRleHRQcm9qZWN0SWQpIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCgxKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBpdGVtc1RvTWVyZ2UgPSBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChpdGVtLm1lc3NhZ2UgfHwgJycsIHRhYlNlZ21lbnQpLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2VzID0gWy4uLm1lc3NhZ2VzLnNsaWNlKDAsIDEpLCAuLi5pdGVtc1RvTWVyZ2UsIC4uLm1lc3NhZ2VzLnNsaWNlKDEpXVxuICAgICAgICBzZXRNZXNzYWdlcyhuZXdNZXNzYWdlcylcbiAgICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShOdW1iZXIobmV4dEl0ZW0pKVxuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IGNvbnRhaW5lclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lclJlZikge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxIZWlnaHQgPSBjb250YWluZXJSZWYuc2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgICAgIGNvbnN0IGhlaWdodERpZmZlcmVuY2UgPSBuZXdTY3JvbGxIZWlnaHQgLSBvbGRTY3JvbGxIZWlnaHRcbiAgICAgICAgICAgICAgY29udGFpbmVyUmVmLnNjcm9sbFRvcCA9IG9sZFNjcm9sbFRvcCArIGhlaWdodERpZmZlcmVuY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25FcnJvcj8uKClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZ01vcmVNZXNzYWdlcyhmYWxzZSlcbiAgICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAgW2NoYXRJZCwgY3VycmVudFVzZXIsIGxhc3RFdmFsdWF0ZWRLZXksIG9uRXJyb3IsIG1lc3NhZ2VzLCBnZXRUYWJUYXNrRGVmYXVsdCwgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YV1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNjcm9sbCA9IHVzZUNhbGxiYWNrKFxuICAgIChjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKCFjb250YWluZXIgfHwgaXNMb2FkaW5nUmVmLmN1cnJlbnQgfHwgIWluaXRpYWxMb2FkRG9uZS5jdXJyZW50KSByZXR1cm5cblxuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXJcbiAgICAgIGNvbnN0IHNjcm9sbFBlcmNlbnRhZ2UgPSBzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQgPiAwID8gKHNjcm9sbFRvcCAvIChzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQpKSAqIDEwMCA6IDBcblxuICAgICAgaWYgKHNjcm9sbFBlcmNlbnRhZ2UgPCAxMCkge1xuICAgICAgICBsb2FkTW9yZU1lc3NhZ2VzKGNvbnRhaW5lcilcbiAgICAgIH1cbiAgICB9LFxuICAgIFtsb2FkTW9yZU1lc3NhZ2VzXVxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY2hhdElkICE9PSBwcmV2aW91c0NoYXRJZC5jdXJyZW50KSB7XG4gICAgICBzZXRNZXNzYWdlcyhcbiAgICAgICAgdXNlckluaXRpYWxNZXNzYWdlXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ3VzZXItaW5pdGlhbC1tZXNzYWdlJyxcbiAgICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIHVzZXI6IGN1cnJlbnRVc2VyLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkodXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2UsIHtcbiAgICAgICAgICAgICAgICAgIGZ1YUlkOiB1c2VySW5pdGlhbE1lc3NhZ2UuZnVhSWQsXG4gICAgICAgICAgICAgICAgICBzY0lkOiB1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzID8geyBhdHRhY2htZW50czogdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgLi4uKGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKVxuICAgICAgICAgICAgICAgICAgPyB7IGNvbnRleHRNZXNzYWdlOiBidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucykgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXVxuICAgICAgKVxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleSgwKVxuICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcHJldmlvdXNDaGF0SWQuY3VycmVudCA9IGNoYXRJZFxuXG4gICAgICAvLyBMaW1waWFyIGVsIGVzdGFkbyBkZWwgcHJveWVjdG8geSBsYSB0YXJlYSBjdWFuZG8gY2FtYmlhIGRlIGNvbnZlcnNhY2nDs25cbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0VGFzayhudWxsKVxuXG4gICAgICAvLyBWb2x2ZXIgYSBlamVjdXRhciBsYSBxdWVyeSBtZSBwYXJhIHRlbmVyIHRhYlRhc2tEZWZhdWx0IGFjdHVhbGl6YWRvIGVuIGxhIG51ZXZhIGNvbnZlcnNhY2nDs25cbiAgICAgIHJlZmV0Y2hUYWJUYXNrRGVmYXVsdCgpXG5cbiAgICAgIGlmICghdXNlckluaXRpYWxNZXNzYWdlKSB7XG4gICAgICAgIGxvYWRNZXNzYWdlcygpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXG4gICAgY2hhdElkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBjdXJyZW50VXNlcixcbiAgICBsb2FkTWVzc2FnZXMsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICAgIHNldFByb2plY3QsXG4gICAgc2V0VGFzayxcbiAgICByZWZldGNoVGFiVGFza0RlZmF1bHQsXG4gIF0pXG5cbiAgLy8gQ3VhbmRvIHRhYlRhc2tEZWZhdWx0IHBhc2EgYSBlc3RhciBkaXNwb25pYmxlIGRlc3B1w6lzIGRlIGNhcmdhciwgcmVlc2NyaWJpciBVUkxzIGRlIHRhcmVhcyBlbiBsb3MgbWVuc2FqZXMgeWEgY2FyZ2Fkb3MuXG4gIC8vIFJlZiBwYXJhIGV2aXRhciBidWNsZTogc2V0TWVzc2FnZXMocmV3cml0dGVuKSBjYW1iaWEgbWVzc2FnZXMgeSByZS1lamVjdXRhIGVsIGVmZWN0bzsgc29sbyByZWVzY3JpYmltb3MgdW5hIHZleiBwb3IgbG90ZS5cbiAgY29uc3QgZGlkUmV3cml0ZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXRhYlRhc2tEZWZhdWx0IHx8ICFwcm9qZWN0Py5pZCB8fCBtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVyblxuICAgIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICAgIGNvbnN0IHRhYlNlZ21lbnQgPSBgLyR7dGFiVGFza0RlZmF1bHR9YFxuICAgIGNvbnN0IG5lZWRzUmV3cml0ZSA9IG1lc3NhZ2VzLnNvbWUobXNnID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBtc2cubWVzc2FnZSB8fCAnJ1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2godGFza1VybFJlZ2V4KVxuICAgICAgaWYgKCFtYXRjaGVzPy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgcmV0dXJuIG1hdGNoZXMuc29tZSh1cmwgPT4gIXVybC5lbmRzV2l0aChgLyR7dGFiVGFza0RlZmF1bHR9YCkgJiYgIXVybC5pbmNsdWRlcyhgLyR7dGFiVGFza0RlZmF1bHR9P2ApKVxuICAgIH0pXG4gICAgaWYgKCFuZWVkc1Jld3JpdGUpIHtcbiAgICAgIGRpZFJld3JpdGVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRpZFJld3JpdGVSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgZGlkUmV3cml0ZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIGNvbnN0IHJld3JpdHRlbiA9IG1lc3NhZ2VzLm1hcChtc2cgPT4gKHtcbiAgICAgIC4uLm1zZyxcbiAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChtc2cubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gICAgfSkpXG4gICAgc2V0TWVzc2FnZXMocmV3cml0dGVuKVxuICB9LCBbdGFiVGFza0RlZmF1bHQsIHByb2plY3Q/LmlkLCBtZXNzYWdlc10pXG5cbiAgY29uc3QgYWRkTWVzc2FnZSA9IHVzZUNhbGxiYWNrKChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgIHNldE1lc3NhZ2VzKHByZXYgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdNZXNzYWdlSW5kZXggPSBwcmV2LmZpbmRJbmRleChtc2cgPT4gbXNnLmlkID09PSBtZXNzYWdlLmlkKVxuXG4gICAgICBpZiAoZXhpc3RpbmdNZXNzYWdlSW5kZXggPj0gMCkge1xuICAgICAgICBjb25zdCBuZXdNZXNzYWdlcyA9IFsuLi5wcmV2XVxuICAgICAgICBuZXdNZXNzYWdlc1tleGlzdGluZ01lc3NhZ2VJbmRleF0gPSBtZXNzYWdlXG4gICAgICAgIHJldHVybiBuZXdNZXNzYWdlc1xuICAgICAgfVxuICAgICAgcmV0dXJuIFsuLi5wcmV2LCBtZXNzYWdlXVxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHJlbW92ZU1lc3NhZ2UgPSB1c2VDYWxsYmFjaygobWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICBzZXRNZXNzYWdlcyhwcmV2ID0+IHByZXYuZmlsdGVyKG1zZyA9PiBtc2cuaWQgIT09IG1lc3NhZ2VJZCkpXG4gIH0sIFtdKVxuXG4gIHJldHVybiB7XG4gICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgIG1lc3NhZ2VzLFxuICAgIGhhc01vcmVNZXNzYWdlczogISFsYXN0RXZhbHVhdGVkS2V5LFxuICAgIGlzTG9hZGluZ01vcmVNZXNzYWdlcyxcbiAgICBsb2FkTWVzc2FnZXMsXG4gICAgbG9hZE1vcmVNZXNzYWdlcyxcbiAgICBhZGRNZXNzYWdlLFxuICAgIHJlbW92ZU1lc3NhZ2UsXG4gICAgaGFuZGxlU2Nyb2xsLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBLFNBQVNBLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxNQUFNLEVBQUVDLFNBQVMsUUFBUSxPQUFPO0FBQ2hFLFNBQVNDLFdBQVcsUUFBUSxnQkFBZ0I7QUFFNUMsU0FBU0MsbUJBQW1CLFFBQVEsNEJBQTRCO0FBQ2hFLE9BQU9DLElBQUksTUFBTSxxQkFBcUI7QUFFdEMsU0FBU0MsZ0JBQWdCLFFBQVEsOEJBQThCO0FBQy9ELFNBQVNDLElBQUks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
749
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVN0YXRlIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlUHJvamVjdHMiLCJidWlsZENvbnRleHRNZXNzYWdlIiwibWFpYSIsInVzZUdsb2JhbENvbnRleHQiLCJ1c2VUIiwidXNlVXNlciIsInVzZVRhYlRhc2tEZWZhdWx0IiwiVEFTS19VUkxfUkVHRVhfUEFUVEVSTiIsIm1hcENPUkxhbmciLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlU2Vzc2lvbnNTdG9yZSIsImlzQWN0aXZlU2Vzc2lvblN0YXR1cyIsImdldENoYXRzU3RvcmVTdGF0ZSIsImhhc01lYW5pbmdmdWxVc2VySW5pdGlhbE1lc3NhZ2UiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlckluaXRpYWxNZXNzYWdlJG0iLCJfdXNlckluaXRpYWxNZXNzYWdlJGEiLCJCb29sZWFuIiwibWVzc2FnZSIsInRyaW0iLCJhdHRhY2htZW50cyIsImxlbmd0aCIsImZ1YUlkIiwic2NJZCIsIm1hcmtPcGVuZWRTZXNzaW9uQXNSZWFkSWZWaXNpYmxlIiwic2Vzc2lvbklkIiwiX2dldENoYXRzU3RvcmVTdGF0ZSIsImlzQ2hhdFZpZXdWaXNpYmxlIiwiYWN0aXZlQ2hhdElkIiwibWFya0NoYXRBc1JlYWQiLCJidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIiLCJjdXJyZW50VXNlciIsIl9vYmplY3RTcHJlYWQiLCJpZCIsImRhdGUiLCJEYXRlIiwidXNlciIsIm1lbnRpb25zIiwiY29udGV4dE1lc3NhZ2UiLCJyZXdyaXRlVGFza1VybHNJbkNvbnRlbnQiLCJjb250ZW50IiwidGFiU2VnbWVudCIsInRhc2tVcmxSZWdleCIsIlJlZ0V4cCIsInJlcGxhY2UiLCJ1cmwiLCJ1c2VDaGF0TWVzc2FnZXMiLCJfcmVmIiwiX3VzZXIkcGVybWlzc2lvbnMiLCJvbkVycm9yIiwiY2hhdElkIiwiX3JlZiRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsInQiLCJpMThuIiwidXNlclBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJsb2FkaW5nTWVzc2FnZXMiLCJzZXRMb2FkaW5nTWVzc2FnZXMiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsIm1lc3NhZ2VzIiwic2V0TWVzc2FnZXMiLCJfdXNlUHJvamVjdHMiLCJmZXRjaFByb2plY3RzIiwiX3VzZUdsb2JhbENvbnRleHQiLCJzZWxlY3RBZ2VudCIsInNldENoaXBzUHJvamVjdCIsInNldFByb2plY3QiLCJzZXRDbGllbnQiLCJzZXRUYXNrIiwicHJvamVjdCIsIl91c2VUYWJUYXNrRGVmYXVsdCIsImdldFRhYlRhc2tEZWZhdWx0IiwidGFiVGFza0RlZmF1bHQiLCJyZWZldGNoVGFiVGFza0RlZmF1bHQiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsInNldElzTG9hZGluZ01vcmVNZXNzYWdlcyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwibGFzdEV2YWx1YXRlZEtleSIsInNldExhc3RFdmFsdWF0ZWRLZXkiLCJpc0xvYWRpbmdSZWYiLCJpbml0aWFsTG9hZERvbmUiLCJwcmV2aW91c0NoYXRJZCIsImxvYWRTZXFSZWYiLCJzeW5jTWVzc2FnZXNUb1N0b3JlIiwidGFyZ2V0Q2hhdElkIiwibmV4dE1lc3NhZ2VzIiwibGFzdEV2YWx1YXRlZEtleVZhbHVlIiwiZ2V0U3RhdGUiLCJ1bmRlZmluZWQiLCJwYXRjaFZpZXdDYWNoZSIsInNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEiLCJfcmVmMyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZjIiLCJwcm9qZWN0SWRNZXNzYWdlIiwicHJvamVjdE5hbWVGcm9tU2Vzc2lvbiIsImNsaWVudElkRnJvbVNlc3Npb24iLCJjbGllbnROYW1lRnJvbVNlc3Npb24iLCJ0YXNrSWRGcm9tU2Vzc2lvbiIsInRhc2tOYW1lRnJvbVNlc3Npb24iLCJwcm9qZWN0cyIsImhhc011bHRpQWdlbnRzQWNjZXNzIiwicHJvamVjdElkTnVtIiwiZm91bmRQcm9qZWN0IiwiX2ZvdW5kUHJvamVjdCRjbGllbnQiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIm5hbWUiLCJOdW1iZXIiLCJhYnJ1cHQiLCJzZW50Iiwid2luZG93IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsImZpbmQiLCJwIiwicHJvamVjdE5hbWUiLCJjbGllbnROYW1lIiwiY2xpZW50IiwicHJvamVjdElkIiwiU3RyaW5nIiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJyZXN0b3JlU2Vzc2lvbkZyb21TdG9yZSIsIl9yZWY0IiwiX2NhbGxlZTIiLCJfY2FjaGUkbGFzdEV2YWx1YXRlZEsiLCJzZXNzaW9uc1N0b3JlIiwiY2FjaGVkTWVzc2FnZXMiLCJjYWNoZSIsIl9jb250ZXh0MiIsImdldE1lc3NhZ2VzIiwiZ2V0Vmlld0NhY2hlIiwiY3VycmVudCIsImFnZW50U25hcHNob3QiLCJjb252ZXJzYXRpb25NZXRhIiwic2Vzc2lvbk1ldGFFdmVudCIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiX3gyIiwibG9hZE1lc3NhZ2VzIiwiX3JlZjUiLCJfY2FsbGVlMyIsIm9wdGlvbnMiLCJzZXEiLCJzZWxlY3RBZ2VudEZvclNlc3Npb24iLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQiLCJpdGVtcyIsIm5leHRJdGVtIiwiYWdlbnREZWxldGVkIiwiYWdlbnROb1Blcm1pc3Npb24iLCJoYXNBZ2VudEFjY2VzcyIsImhhc0FnZW50UGVybWlzc2lvbiIsImFnZW50VHlwZUZyb21TZXNzaW9uIiwiYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbiIsInByb2plY3REZWxldGVkIiwiYWdlbnRJbkxpc3QiLCJjb250ZXh0UHJvamVjdElkIiwiaXRlbXNUb1NldCIsInRhYiIsInNlc3Npb25NZXRhIiwiZmluYWxNZXNzYWdlcyIsInRhaWwiLCJleGlzdGluZ0lkcyIsImV4dHJhIiwicGFnaW5hdGlvbktleSIsIl90IiwiX2NvbnRleHQzIiwiZm9yY2UiLCJjYW5SZXN0b3JlU2Vzc2lvbiIsImNvbnNvbGUiLCJpbmZvIiwiQ2hhdHMiLCJnZXRDaGF0TWVzc2FnZXMiLCJvZmZzZXQiLCJjYW5jZWxsZWRUZXh0IiwibGFuZyIsImxhbmd1YWdlIiwiYWdlbnRUeXBlIiwiYWdlbnRFbnRpdHkiLCJjbGllbnRJZCIsInRhc2tJZCIsInRhc2tOYW1lIiwiY3VycmVudENoYXRJZCIsImN1cnJlbnRTZXEiLCJpdGVtQ291bnQiLCJ1c2VyUGVybWlzc2lvbnNWaWV3IiwidmlldyIsImFnZW50SW5BZ2VudHNMaXN0IiwiYSIsImVtb2ppIiwidHlwZSIsImlzX2RlbGV0ZWQiLCJkZWxldGVkX2F0IiwiZGVsZXRlZEF0IiwiY29ubmVjdG9ycyIsImFnZW50IiwiaXNfZnJvbV9jb252ZXJzYXRpb24iLCJwcm9qZWN0X2RlbGV0ZWQiLCJoYXNfbm90X2FjY2VzcyIsImhhc19ub3RfcGVybWlzc2lvbnMiLCJwYXJzZUludCIsImNvbmNhdCIsIm1hcCIsIml0ZW0iLCJnZXRNZXRhIiwic3RhdHVzIiwiU2V0IiwiZmlsdGVyIiwiaGFzIiwiX3RvQ29uc3VtYWJsZUFycmF5Iiwic2V0Vmlld0NhY2hlIiwiaHlkcmF0ZWRGcm9tQXBpIiwiZmluaXNoIiwiX3gzIiwibG9hZE1vcmVNZXNzYWdlcyIsIl9yZWY2IiwiX2NhbGxlZTQiLCJjb250YWluZXIiLCJvbGRTY3JvbGxIZWlnaHQiLCJvbGRTY3JvbGxUb3AiLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQyIiwiaXRlbXNUb01lcmdlIiwibmV3TWVzc2FnZXMiLCJfdDIiLCJfY29udGV4dDQiLCJzY3JvbGxIZWlnaHQiLCJzY3JvbGxUb3AiLCJzbGljZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNvbnRhaW5lclJlZiIsIm5ld1Njcm9sbEhlaWdodCIsImhlaWdodERpZmZlcmVuY2UiLCJfeDQiLCJoYW5kbGVTY3JvbGwiLCJjbGllbnRIZWlnaHQiLCJzY3JvbGxQZXJjZW50YWdlIiwiZnJvbUNoYXRJZCIsImNhblJlc3RvcmUiLCJmcm9tIiwidG8iLCJwZW5kaW5nSW5pdGlhbE1lc3NhZ2UiLCJlcnJvciIsImRpZFJld3JpdGVSZWYiLCJuZWVkc1Jld3JpdGUiLCJzb21lIiwibXNnIiwibWF0Y2hlcyIsIm1hdGNoIiwiZW5kc1dpdGgiLCJpbmNsdWRlcyIsInJld3JpdHRlbiIsImFkZE1lc3NhZ2UiLCJleGlzdGluZ01lc3NhZ2VJbmRleCIsImZpbmRJbmRleCIsInJlbW92ZU1lc3NhZ2UiLCJtZXNzYWdlSWQiLCJoYXNNb3JlTWVzc2FnZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvdXNlQ2hhdE1lc3NhZ2VzL3VzZUNoYXRNZXNzYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VQcm9qZWN0cyB9IGZyb20gJy4uL3VzZVByb2plY3RzJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IHsgYnVpbGRDb250ZXh0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IG1haWEgZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYSdcbmltcG9ydCB7IFVzZUNoYXRNZXNzYWdlc1Byb3BzIH0gZnJvbSAnLi91c2VDaGF0TWVzc2FnZXMuaW50ZXJmYWNlJ1xuaW1wb3J0IHsgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyB1c2VUIH0gZnJvbSAnLi4vdXNlVCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgdXNlVGFiVGFza0RlZmF1bHQgfSBmcm9tICcuLi91c2VUYWJUYXNrRGVmYXVsdCdcbmltcG9ydCB7IFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4gfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdGFza1VybHMnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vbGFuZy91dGlscydcbmltcG9ydCB7IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkgfSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2UnXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGlzQWN0aXZlU2Vzc2lvblN0YXR1cyB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25zLnR5cGVzJ1xuaW1wb3J0IHsgZ2V0Q2hhdHNTdG9yZVN0YXRlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdXNlQ2hhdHNTdG9yZSdcbmltcG9ydCB0eXBlIHsgQWdlbnQgfSBmcm9tICcuLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB0eXBlIHsgU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEsIFNlc3Npb25NZXRhRXZlbnREZXRhaWwgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9zZXNzaW9ucy50eXBlcydcblxudHlwZSBMb2FkTWVzc2FnZXNPcHRpb25zID0ge1xuICAvKiogSWdub3JhIGNhY2hlIGVuIG1lbW9yaWEgeSB2dWVsdmUgYSBwZWRpciBnZXRDaGF0TWVzc2FnZXMuICovXG4gIGZvcmNlPzogYm9vbGVhblxufVxuXG50eXBlIFVzZXJJbml0aWFsTWVzc2FnZSA9IFVzZUNoYXRNZXNzYWdlc1Byb3BzWyd1c2VySW5pdGlhbE1lc3NhZ2UnXVxuXG4vKiogRWwgbW9kYWwgdXNhIGB7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfWAgY29tbyBcInNpbiBtZW5zYWplIGluaWNpYWxcIjsgbm8gZXMgZmFsc3kuICovXG5jb25zdCBoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlID0gKHVzZXJJbml0aWFsTWVzc2FnZT86IFVzZXJJbml0aWFsTWVzc2FnZSk6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UgJiZcbiAgICAodXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2U/LnRyaW0oKSB8fFxuICAgICAgdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzPy5sZW5ndGggfHxcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCB8fFxuICAgICAgdXNlckluaXRpYWxNZXNzYWdlLnNjSWQpXG4gIClcblxuLyoqIE1hcmNhIGxhIHNlc2nDs24gY29tbyBsZcOtZGEgY3VhbmRvIHRlcm1pbsOzIGRlIGhpZHJhdGFyc2UgeSBzaWd1ZSBzaWVuZG8gbGEgYWN0aXZhIHkgdmlzaWJsZS4gKi9cbmNvbnN0IG1hcmtPcGVuZWRTZXNzaW9uQXNSZWFkSWZWaXNpYmxlID0gKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgaXNDaGF0Vmlld1Zpc2libGUsIGFjdGl2ZUNoYXRJZCwgbWFya0NoYXRBc1JlYWQgfSA9IGdldENoYXRzU3RvcmVTdGF0ZSgpXG4gIGlmICghaXNDaGF0Vmlld1Zpc2libGUgfHwgYWN0aXZlQ2hhdElkICE9PSBzZXNzaW9uSWQpIHJldHVyblxuICB2b2lkIG1hcmtDaGF0QXNSZWFkKHNlc3Npb25JZClcbn1cblxuY29uc3QgYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyID0gKFxuICB1c2VySW5pdGlhbE1lc3NhZ2U6IE5vbk51bGxhYmxlPFVzZXJJbml0aWFsTWVzc2FnZT4sXG4gIGN1cnJlbnRVc2VyOiBVc2VDaGF0TWVzc2FnZXNQcm9wc1snY3VycmVudFVzZXInXVxuKTogQ2hhdE1lc3NhZ2VbXSA9PiBbXG4gIHtcbiAgICBpZDogJ3VzZXItaW5pdGlhbC1tZXNzYWdlJyxcbiAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgIHVzZXI6IGN1cnJlbnRVc2VyLFxuICAgIG1lc3NhZ2U6IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkodXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2UsIHtcbiAgICAgIGZ1YUlkOiB1c2VySW5pdGlhbE1lc3NhZ2UuZnVhSWQsXG4gICAgICBzY0lkOiB1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCxcbiAgICB9KSxcbiAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzID8geyBhdHRhY2htZW50czogdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgLi4uKGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKVxuICAgICAgPyB7IGNvbnRleHRNZXNzYWdlOiBidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucykgfVxuICAgICAgOiB7fSksXG4gIH0sXG5dXG5cbmNvbnN0IHJld3JpdGVUYXNrVXJsc0luQ29udGVudCA9IChjb250ZW50OiBzdHJpbmcsIHRhYlNlZ21lbnQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICByZXR1cm4gY29udGVudC5yZXBsYWNlKHRhc2tVcmxSZWdleCwgdXJsID0+XG4gICAgdXJsLnJlcGxhY2UoL1xcLyhkZXRhaWx8bWVzc2FnZXxtZXNzYWdlc3xmaWxlc3xoaXN0b3J5fGhvdXJzKSg/PSR8XFw/KS8sIHRhYlNlZ21lbnQpXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXRNZXNzYWdlcyA9ICh7XG4gIG9uRXJyb3IsXG4gIGNoYXRJZCxcbiAgY3VycmVudFVzZXIsXG4gIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgYWdlbnRzID0gW10sXG59OiBVc2VDaGF0TWVzc2FnZXNQcm9wcykgPT4ge1xuICBjb25zdCB7IHQsIGkxOG4gfSA9IHVzZVQoKVxuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHNcbiAgY29uc3QgW2xvYWRpbmdNZXNzYWdlcywgc2V0TG9hZGluZ01lc3NhZ2VzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbWVzc2FnZXMsIHNldE1lc3NhZ2VzXSA9IHVzZVN0YXRlPENoYXRNZXNzYWdlW10+KCgpID0+XG4gICAgaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UpICYmIHVzZXJJbml0aWFsTWVzc2FnZVxuICAgICAgPyBidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIodXNlckluaXRpYWxNZXNzYWdlLCBjdXJyZW50VXNlcilcbiAgICAgIDogW11cbiAgKVxuICBjb25zdCB7IGZldGNoUHJvamVjdHMgfSA9IHVzZVByb2plY3RzKClcbiAgY29uc3QgeyBzZWxlY3RBZ2VudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRQcm9qZWN0LCBzZXRDbGllbnQsIHNldFRhc2ssIHByb2plY3QgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCB7IGdldFRhYlRhc2tEZWZhdWx0LCB0YWJUYXNrRGVmYXVsdCwgcmVmZXRjaFRhYlRhc2tEZWZhdWx0IH0gPSB1c2VUYWJUYXNrRGVmYXVsdCgpXG4gIGNvbnN0IFtpc0xvYWRpbmdNb3JlTWVzc2FnZXMsIHNldElzTG9hZGluZ01vcmVNZXNzYWdlc10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xhc3RFdmFsdWF0ZWRLZXksIHNldExhc3RFdmFsdWF0ZWRLZXldID0gdXNlU3RhdGU8bnVtYmVyIHwgdW5kZWZpbmVkPigwKVxuICBjb25zdCBpc0xvYWRpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGluaXRpYWxMb2FkRG9uZSA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgcHJldmlvdXNDaGF0SWQgPSB1c2VSZWYoY2hhdElkKVxuICBjb25zdCBsb2FkU2VxUmVmID0gdXNlUmVmKDApXG5cbiAgY29uc3Qgc3luY01lc3NhZ2VzVG9TdG9yZSA9IHVzZUNhbGxiYWNrKFxuICAgICh0YXJnZXRDaGF0SWQ6IHN0cmluZywgbmV4dE1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBsYXN0RXZhbHVhdGVkS2V5VmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5zZXRNZXNzYWdlcyh0YXJnZXRDaGF0SWQsIG5leHRNZXNzYWdlcylcbiAgICAgIGlmIChsYXN0RXZhbHVhdGVkS2V5VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkucGF0Y2hWaWV3Q2FjaGUodGFyZ2V0Q2hhdElkLCB7IGxhc3RFdmFsdWF0ZWRLZXk6IGxhc3RFdmFsdWF0ZWRLZXlWYWx1ZSB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoe1xuICAgICAgcHJvamVjdElkTWVzc2FnZSxcbiAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgIH06IHtcbiAgICAgIHByb2plY3RJZE1lc3NhZ2U6IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIGNsaWVudElkRnJvbVNlc3Npb246IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgdGFza0lkRnJvbVNlc3Npb246IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgICB9KSA9PiB7XG4gICAgICAvLyBUYXJlYSBkZSBsYSBjb252ZXJzYWNpw7NuOiBzZSBkZXJpdmEgZGUgbGEgbWV0YWRhdGEgZGUgbGEgc2Vzc2lvbiBwYXJhIG1vc3RyYXIgZWwgY2hpcFxuICAgICAgLy8gZGUgbGEgdGFyZWEgKHkgcmVlbnZpYXIgbGEgbWV0YWRhdGEgZW4gY2FkYSBtZW5zYWplKSBzaW4gaW1wb3J0YXIgZGVzZGUgZMOzbmRlIHNlIGFicmEuXG4gICAgICBpZiAodGFza0lkRnJvbVNlc3Npb24gIT0gbnVsbCAmJiB0YXNrTmFtZUZyb21TZXNzaW9uKSB7XG4gICAgICAgIHNldFRhc2soeyBpZDogdGFza0lkRnJvbVNlc3Npb24sIG5hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24gfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRhc2sobnVsbClcbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVyc2FjacOzbiBjb24gY2xpZW50X21ldGFkYXRhOiBzZXRlYXIgY2xpZW50ZSB5IGxpbXBpYXIgcHJveWVjdG9cbiAgICAgIGlmIChjbGllbnRJZEZyb21TZXNzaW9uICE9IG51bGwgJiYgY2xpZW50TmFtZUZyb21TZXNzaW9uKSB7XG4gICAgICAgIHNldENsaWVudCh7IGlkOiBOdW1iZXIoY2xpZW50SWRGcm9tU2Vzc2lvbiksIG5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbiB9KVxuICAgICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmZXRjaFByb2plY3RzKHByb2plY3RJZE1lc3NhZ2UpXG4gICAgICBjb25zdCBoYXNNdWx0aUFnZW50c0FjY2VzcyA9ICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICAgICAgaWYgKHByb2plY3RJZE1lc3NhZ2UgJiYgaGFzTXVsdGlBZ2VudHNBY2Nlc3MpIHtcbiAgICAgICAgY29uc3QgcHJvamVjdElkTnVtID0gTnVtYmVyKHByb2plY3RJZE1lc3NhZ2UpXG4gICAgICAgIGNvbnN0IGZvdW5kUHJvamVjdCA9IHByb2plY3RzPy5maW5kKHAgPT4gTnVtYmVyKHAuaWQpID09PSBwcm9qZWN0SWROdW0pXG5cbiAgICAgICAgaWYgKGZvdW5kUHJvamVjdCkge1xuICAgICAgICAgIHNldENoaXBzUHJvamVjdCh7XG4gICAgICAgICAgICBwcm9qZWN0TmFtZTogZm91bmRQcm9qZWN0Lm5hbWUsXG4gICAgICAgICAgICBjbGllbnROYW1lOiBmb3VuZFByb2plY3QuY2xpZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgcHJvamVjdElkOiBTdHJpbmcoZm91bmRQcm9qZWN0LmlkKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHNldFByb2plY3QoZm91bmRQcm9qZWN0KVxuICAgICAgICB9IGVsc2UgaWYgKHByb2plY3ROYW1lRnJvbVNlc3Npb24pIHtcbiAgICAgICAgICBzZXRDaGlwc1Byb2plY3Qoe1xuICAgICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgICBjbGllbnROYW1lOiAnJyxcbiAgICAgICAgICAgIHByb2plY3RJZDogU3RyaW5nKHByb2plY3RJZE1lc3NhZ2UpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2V0UHJvamVjdCh7IGlkOiBwcm9qZWN0SWROdW0sIG5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24gfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICAgIH1cblxuICAgICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmZXRjaFByb2plY3RzLCBzZXRDbGllbnQsIHNldENoaXBzUHJvamVjdCwgc2V0UHJvamVjdCwgc2V0VGFza11cbiAgKVxuXG4gIGNvbnN0IHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHRhcmdldENoYXRJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uc1N0b3JlID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG4gICAgICBjb25zdCBjYWNoZWRNZXNzYWdlcyA9IHNlc3Npb25zU3RvcmUuZ2V0TWVzc2FnZXModGFyZ2V0Q2hhdElkKVxuICAgICAgY29uc3QgY2FjaGUgPSBzZXNzaW9uc1N0b3JlLmdldFZpZXdDYWNoZSh0YXJnZXRDaGF0SWQpXG5cbiAgICAgIHNldE1lc3NhZ2VzKGNhY2hlZE1lc3NhZ2VzKVxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShjYWNoZT8ubGFzdEV2YWx1YXRlZEtleSA/PyAwKVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSB0cnVlXG5cbiAgICAgIGlmIChjYWNoZT8uYWdlbnRTbmFwc2hvdCkge1xuICAgICAgICBzZWxlY3RBZ2VudChjYWNoZS5hZ2VudFNuYXBzaG90KVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGU/LmNvbnZlcnNhdGlvbk1ldGEpIHtcbiAgICAgICAgYXdhaXQgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSh7XG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZTogY2FjaGUuY29udmVyc2F0aW9uTWV0YS5wcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEucHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLmNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLmNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbjogY2FjaGUuY29udmVyc2F0aW9uTWV0YS50YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLnRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjYWNoZT8uc2Vzc2lvbk1ldGFFdmVudCkge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1jaGF0LXNlc3Npb24tbWV0YScsIHtcbiAgICAgICAgICAgIGRldGFpbDogY2FjaGUuc2Vzc2lvbk1ldGFFdmVudCxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIG1hcmtPcGVuZWRTZXNzaW9uQXNSZWFkSWZWaXNpYmxlKHRhcmdldENoYXRJZClcbiAgICB9LFxuICAgIFtzZWxlY3RBZ2VudCwgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YV1cbiAgKVxuXG4gIGNvbnN0IGxvYWRNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChvcHRpb25zPzogTG9hZE1lc3NhZ2VzT3B0aW9ucykgPT4ge1xuICAgICAgaWYgKCFvcHRpb25zPy5mb3JjZSAmJiB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuY2FuUmVzdG9yZVNlc3Npb24oY2hhdElkKSkge1xuICAgICAgICBhd2FpdCByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZShjaGF0SWQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBsb2FkU2VxUmVmLmN1cnJlbnQgKz0gMVxuICAgICAgY29uc3Qgc2VxID0gbG9hZFNlcVJlZi5jdXJyZW50XG4gICAgICBjb25zdCB0YXJnZXRDaGF0SWQgPSBjaGF0SWRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZ01lc3NhZ2VzKHRydWUpXG4gICAgICAgIGluaXRpYWxMb2FkRG9uZS5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1lc3NhZ2VzXSBsb2FkTWVzc2FnZXMgc3RhcnQnLCB7IGNoYXRJZDogdGFyZ2V0Q2hhdElkLCBzZXEsIGZvcmNlOiBvcHRpb25zPy5mb3JjZSB9KVxuICAgICAgICBsZXQgYWdlbnRTbmFwc2hvdDogQWdlbnQgfCBudWxsID0gbnVsbFxuICAgICAgICBjb25zdCBzZWxlY3RBZ2VudEZvclNlc3Npb24gPSAobmV4dDogQWdlbnQpID0+IHtcbiAgICAgICAgICBzZWxlY3RBZ2VudChuZXh0KVxuICAgICAgICAgIGFnZW50U25hcHNob3QgPSBuZXh0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIG5leHRJdGVtLFxuICAgICAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgICAgICBoYXNBZ2VudEFjY2VzcyxcbiAgICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudFR5cGVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbixcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgcHJvamVjdERlbGV0ZWQsXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0gPSBhd2FpdCBtYWlhLkNoYXRzLmdldENoYXRNZXNzYWdlcyh7XG4gICAgICAgICAgY2hhdElkOiB0YXJnZXRDaGF0SWQsXG4gICAgICAgICAgY3VycmVudFVzZXIsXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGNhbmNlbGxlZFRleHQ6IHQoJ2NoYXQuY2FuY2VsbGVkJyksXG4gICAgICAgICAgbGFuZzogbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoc2VxICE9PSBsb2FkU2VxUmVmLmN1cnJlbnQgfHwgdGFyZ2V0Q2hhdElkICE9PSBjaGF0SWQpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VDaGF0TWVzc2FnZXNdIGxvYWRNZXNzYWdlcyBzdGFsZSByZXNwb25zZSBkaXNjYXJkZWQnLCB7XG4gICAgICAgICAgICB0YXJnZXRDaGF0SWQsXG4gICAgICAgICAgICBjdXJyZW50Q2hhdElkOiBjaGF0SWQsXG4gICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICBjdXJyZW50U2VxOiBsb2FkU2VxUmVmLmN1cnJlbnQsXG4gICAgICAgICAgICBpdGVtQ291bnQ6IGl0ZW1zLmxlbmd0aCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1lc3NhZ2VzXSBsb2FkTWVzc2FnZXMgcmVzdWx0OicsIHtcbiAgICAgICAgICBjaGF0SWQ6IHRhcmdldENoYXRJZCxcbiAgICAgICAgICBpdGVtQ291bnQ6IGl0ZW1zLmxlbmd0aCxcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgICAgICBhZ2VudERlbGV0ZWQ6ICEhYWdlbnREZWxldGVkLFxuICAgICAgICAgIGhhc0FnZW50QWNjZXNzLFxuICAgICAgICAgIGhhc0FnZW50UGVybWlzc2lvbixcbiAgICAgICAgICB1c2VyUGVybWlzc2lvbnNWaWV3OiB1c2VyUGVybWlzc2lvbnM/LnZpZXcsXG4gICAgICAgICAgYWdlbnRJbkFnZW50c0xpc3Q6IGFnZW50Tm9QZXJtaXNzaW9uID8gISFhZ2VudHMuZmluZChhID0+IGEuaWQgPT09IGFnZW50Tm9QZXJtaXNzaW9uLmlkKSA6IG51bGwsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGFnZW50RGVsZXRlZCkge1xuICAgICAgICAgIHNlbGVjdEFnZW50Rm9yU2Vzc2lvbih7XG4gICAgICAgICAgICBpZDogYWdlbnREZWxldGVkLmlkLFxuICAgICAgICAgICAgbmFtZTogYWdlbnREZWxldGVkLm5hbWUsXG4gICAgICAgICAgICBlbW9qaTogYWdlbnREZWxldGVkLmVtb2ppLFxuICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICBpc19kZWxldGVkOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlZF9hdDogYWdlbnREZWxldGVkLmRlbGV0ZWRBdCxcbiAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbj8uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaSBlbCBhZ2VudGUgbm8gZXN0w6EgZW4gbGEgbGlzdGEgcGVybyB0aWVuZSBwZXJtaXNvcywgYWNjZXNvIHkgbm8gZXN0w6EgZWxpbWluYWRvLCBzZXRlYXJsbyBub3JtYWxtZW50ZVxuICAgICAgICAvLyBFeGNsdWlyIGFnZW50ZXMgbm8tY3VzdG9tIHBhcmEgdXN1YXJpb3MgY29uIHJvbGVzIGRlc2hhYmlsaXRhZG9zXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbiAmJlxuICAgICAgICAgICFhZ2VudERlbGV0ZWQgJiZcbiAgICAgICAgICB1c2VyUGVybWlzc2lvbnM/LnZpZXcgJiZcbiAgICAgICAgICBoYXNBZ2VudEFjY2VzcyAmJlxuICAgICAgICAgIGhhc0FnZW50UGVybWlzc2lvbiAmJlxuICAgICAgICAgICFhZ2VudHMuZmluZChhZ2VudCA9PiBhZ2VudC5pZCA9PT0gYWdlbnROb1Blcm1pc3Npb24uaWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHNlbGVjdEFnZW50Rm9yU2Vzc2lvbih7XG4gICAgICAgICAgICBpZDogYWdlbnROb1Blcm1pc3Npb24uaWQsXG4gICAgICAgICAgICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICAgICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgICAgdHlwZTogYWdlbnROb1Blcm1pc3Npb24udHlwZSBhcyAncG0nIHwgJ2N1c3RvbScgfCAnY2xvbmUnIHwgJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgICBpc19mcm9tX2NvbnZlcnNhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICAuLi4ocHJvamVjdERlbGV0ZWQgPyB7IHByb2plY3RfZGVsZXRlZDogeyBuYW1lOiBwcm9qZWN0RGVsZXRlZC5uYW1lIH0gfSA6IHt9KSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgZWwgYWdlbnRlIGVzdMOhIGVuIGxhIGxpc3RhIHkgdGllbmUgYWNjZXNvL3Blcm1pc29zLCBhY3R1YWxpemFyIHByb2plY3RfZGVsZXRlZCAobyBsaW1waWFybG8gYWwgY2FtYmlhciBkZSBjaGF0KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWdlbnROb1Blcm1pc3Npb24gJiZcbiAgICAgICAgICAhYWdlbnREZWxldGVkICYmXG4gICAgICAgICAgaGFzQWdlbnRBY2Nlc3MgJiZcbiAgICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24gJiZcbiAgICAgICAgICBhZ2VudHMuZmluZChhID0+IGEuaWQgPT09IGFnZW50Tm9QZXJtaXNzaW9uLmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBhZ2VudEluTGlzdCA9IGFnZW50cy5maW5kKGEgPT4gYS5pZCA9PT0gYWdlbnROb1Blcm1pc3Npb24uaWQpXG4gICAgICAgICAgaWYgKGFnZW50SW5MaXN0KSB7XG4gICAgICAgICAgICBzZWxlY3RBZ2VudEZvclNlc3Npb24oe1xuICAgICAgICAgICAgICAuLi5hZ2VudEluTGlzdCxcbiAgICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7IHByb2plY3RfZGVsZXRlZDogdW5kZWZpbmVkIH0pLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaSBlbCBhZ2VudGUgbm8gdGllbmUgYWNjZXNvIG8gcGVybWlzb3Mgc2Vnw7puIGxhIHJlc3B1ZXN0YSBkZSBzZXNzaW9ucywgc2VsZWNjaW9uYXJsbyBjb24gZWwgZmxhZyBjb3JyZXNwb25kaWVudGVcbiAgICAgICAgLy8gTGEgdmFsaWRhY2nDs24gYWhvcmEgc2UgYmFzYSBlbiBsYXMgcHJvcGllZGFkZXMgaGFzX2FnZW50X2FjY2VzcyB5IGhhc19hZ2VudF9wZXJtaXNzaW9uIGRlIGxhIHJlc3B1ZXN0YVxuICAgICAgICBpZiAoYWdlbnROb1Blcm1pc3Npb24gJiYgIWFnZW50RGVsZXRlZCkge1xuICAgICAgICAgIGlmICghaGFzQWdlbnRBY2Nlc3MpIHtcbiAgICAgICAgICAgIC8vIENhc28gMTogTm8gdGllbmUgYWNjZXNvIGFsIGFnZW50ZVxuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1lc3NhZ2VzXSBCUkFOQ0g6IGhhc19ub3RfYWNjZXNzIOKAlCBoYXNBZ2VudEFjY2VzczonLCBoYXNBZ2VudEFjY2VzcylcbiAgICAgICAgICAgIHNlbGVjdEFnZW50Rm9yU2Vzc2lvbih7XG4gICAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgICAgbmFtZTogYWdlbnROb1Blcm1pc3Npb24ubmFtZSxcbiAgICAgICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgICAgaGFzX25vdF9hY2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDoge30pLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNBZ2VudFBlcm1pc3Npb24pIHtcbiAgICAgICAgICAgIC8vIENhc28gMjogTm8gdGllbmUgcGVybWlzb3MgcGFyYSB2aXN1YWxpemFyL2ludGVyYWN0dWFyIGNvbiBlbCBhZ2VudGVcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUNoYXRNZXNzYWdlc10gQlJBTkNIOiBoYXNfbm90X3Blcm1pc3Npb25zIOKAlCBoYXNBZ2VudFBlcm1pc3Npb246JywgaGFzQWdlbnRQZXJtaXNzaW9uKVxuICAgICAgICAgICAgc2VsZWN0QWdlbnRGb3JTZXNzaW9uKHtcbiAgICAgICAgICAgICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgICAgICAgICAgICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICAgICAgICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgICAgICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgJ3BtJyB8ICdjdXN0b20nIHwgJ2Nsb25lJyB8ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgICAgICBoYXNfbm90X3Blcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgICAgICAuLi4oYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICAgICAgICAuLi4ocHJvamVjdERlbGV0ZWQgPyB7IHByb2plY3RfZGVsZXRlZDogeyBuYW1lOiBwcm9qZWN0RGVsZXRlZC5uYW1lIH0gfSA6IHt9KSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9qZWN0RGVsZXRlZCkge1xuICAgICAgICAgICAgLy8gQ2FzbyAzOiBFbCBwcm95ZWN0byBkZSBsYSBjb252ZXJzYWNpw7NuIGZ1ZSBlbGltaW5hZG9cbiAgICAgICAgICAgIHNlbGVjdEFnZW50Rm9yU2Vzc2lvbih7XG4gICAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgICAgbmFtZTogYWdlbnROb1Blcm1pc3Npb24ubmFtZSxcbiAgICAgICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgICAgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSh7XG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gTWV0YWRhdGEgZGUgbGEgc2Vzc2lvbiAoYWdlbnRfdHlwZSAvIGFnZW50X2VudGl0eSArIGNvbnRleHRvKSBwYXJhIGVsIGNhcnRlbCBkZVxuICAgICAgICAvLyBcImNvbnRpbnVhciBlbiB1biBjaGF0IG51ZXZvXCIgZGVsIGZvb3RlciBjdWFuZG8gc2UgYWJyZSB1bmEgY29udmVyc2FjacOzbiBkZSB1biBjbG9uZSBsZWdhY3kuXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLWNoYXQtc2Vzc2lvbi1tZXRhJywge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIGNoYXRJZCxcbiAgICAgICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudFR5cGVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgICAgYWdlbnRFbnRpdHk6IGFnZW50RW50aXR5RnJvbVNlc3Npb24sXG4gICAgICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgICAgIGNsaWVudElkOiBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBjbGllbnROYW1lOiBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgICAgIHRhc2tOYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG5cbiAgICAgICAgLy8gU2kgaGF5IHByb3llY3RvIGVuIGxhIGNvbnZlcnNhY2nDs24sIHJlZXNjcmliaXIgVVJMcyBkZSB0YXJlYXMgY29uIGVsIHRhYiBkZWwgdXN1YXJpbyAobWUpXG4gICAgICAgIGNvbnN0IGNvbnRleHRQcm9qZWN0SWQgPSBwcm9qZWN0SWRNZXNzYWdlID8gcGFyc2VJbnQoU3RyaW5nKHByb2plY3RJZE1lc3NhZ2UpLCAxMCkgOiBudWxsXG4gICAgICAgIGxldCBpdGVtc1RvU2V0ID0gaXRlbXNcbiAgICAgICAgaWYgKGNvbnRleHRQcm9qZWN0SWQpIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCgxKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBpdGVtc1RvU2V0ID0gaXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICBtZXNzYWdlOiByZXdyaXRlVGFza1VybHNJbkNvbnRlbnQoaXRlbS5tZXNzYWdlIHx8ICcnLCB0YWJTZWdtZW50KSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgICAvLyBTaSBsYSBzZXNpw7NuIHNpZ3VlIGdlbmVyYW5kbyAoc3RyZWFtIGVuIGJhY2tncm91bmQpLCByZWNvbnN0cnVpbW9zIGVsXG4gICAgICAgIC8vIHRhaWwgZW4gdnVlbG8gKHByZWd1bnRhICsgcGxhY2Vob2xkZXIpIHF1ZSBhw7puIG5vIGVzdMOhIHBlcnNpc3RpZG8gZW4gZWxcbiAgICAgICAgLy8gYmFja2VuZCwgbWVyZ2XDoW5kb2xvIGFsIGhpc3RvcmlhbCBjYXJnYWRvIHNpbiBkdXBsaWNhciBwb3IgaWQuXG4gICAgICAgIGNvbnN0IHNlc3Npb25NZXRhID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmdldE1ldGEoY2hhdElkKVxuICAgICAgICBsZXQgZmluYWxNZXNzYWdlcyA9IGl0ZW1zVG9TZXRcbiAgICAgICAgaWYgKHNlc3Npb25NZXRhICYmIGlzQWN0aXZlU2Vzc2lvblN0YXR1cyhzZXNzaW9uTWV0YS5zdGF0dXMpKSB7XG4gICAgICAgICAgY29uc3QgdGFpbCA9IHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5nZXRNZXNzYWdlcyhjaGF0SWQpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KGl0ZW1zVG9TZXQubWFwKGl0ZW0gPT4gaXRlbS5pZCkpXG4gICAgICAgICAgY29uc3QgZXh0cmEgPSB0YWlsLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoaXRlbS5pZCkpXG4gICAgICAgICAgaWYgKGV4dHJhLmxlbmd0aCkge1xuICAgICAgICAgICAgZmluYWxNZXNzYWdlcyA9IFsuLi5pdGVtc1RvU2V0LCAuLi5leHRyYV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb252ZXJzYXRpb25NZXRhOiBTZXNzaW9uQ29udmVyc2F0aW9uTWV0YSA9IHtcbiAgICAgICAgICBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlc3Npb25NZXRhRXZlbnQ6IFNlc3Npb25NZXRhRXZlbnREZXRhaWwgPSB7XG4gICAgICAgICAgY2hhdElkLFxuICAgICAgICAgIGFnZW50VHlwZTogYWdlbnRUeXBlRnJvbVNlc3Npb24sXG4gICAgICAgICAgYWdlbnRFbnRpdHk6IGFnZW50RW50aXR5RnJvbVNlc3Npb24sXG4gICAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkOiBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWQ6IHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9XG5cbiAgICAgICAgc2V0TWVzc2FnZXMoZmluYWxNZXNzYWdlcylcbiAgICAgICAgY29uc3QgcGFnaW5hdGlvbktleSA9IE51bWJlcihuZXh0SXRlbSlcbiAgICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShwYWdpbmF0aW9uS2V5KVxuICAgICAgICBpbml0aWFsTG9hZERvbmUuY3VycmVudCA9IHRydWVcblxuICAgICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0TWVzc2FnZXModGFyZ2V0Q2hhdElkLCBmaW5hbE1lc3NhZ2VzKVxuICAgICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0Vmlld0NhY2hlKHRhcmdldENoYXRJZCwge1xuICAgICAgICAgIGh5ZHJhdGVkRnJvbUFwaTogdHJ1ZSxcbiAgICAgICAgICBsYXN0RXZhbHVhdGVkS2V5OiBwYWdpbmF0aW9uS2V5LFxuICAgICAgICAgIGNvbnZlcnNhdGlvbk1ldGEsXG4gICAgICAgICAgc2Vzc2lvbk1ldGFFdmVudCxcbiAgICAgICAgICBhZ2VudFNuYXBzaG90LFxuICAgICAgICB9KVxuXG4gICAgICAgIG1hcmtPcGVuZWRTZXNzaW9uQXNSZWFkSWZWaXNpYmxlKHRhcmdldENoYXRJZClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXEgPT09IGxvYWRTZXFSZWYuY3VycmVudCAmJiB0YXJnZXRDaGF0SWQgPT09IGNoYXRJZCkge1xuICAgICAgICAgIG9uRXJyb3I/LigpXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChzZXEgPT09IGxvYWRTZXFSZWYuY3VycmVudCAmJiB0YXJnZXRDaGF0SWQgPT09IGNoYXRJZCkge1xuICAgICAgICAgIHNldExvYWRpbmdNZXNzYWdlcyhmYWxzZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgY2hhdElkLFxuICAgICAgY3VycmVudFVzZXIsXG4gICAgICBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhLFxuICAgICAgb25FcnJvcixcbiAgICAgIGdldFRhYlRhc2tEZWZhdWx0LFxuICAgICAgcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUsXG4gICAgICBzZWxlY3RBZ2VudCxcbiAgICAgIGFnZW50cyxcbiAgICAgIHQsXG4gICAgICBpMThuLmxhbmd1YWdlLFxuICAgICAgdXNlclBlcm1pc3Npb25zPy52aWV3LFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGxvYWRNb3JlTWVzc2FnZXMgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGwpID0+IHtcbiAgICAgIGlmIChpc0xvYWRpbmdSZWYuY3VycmVudCB8fCAhbGFzdEV2YWx1YXRlZEtleSB8fCAhY29udGFpbmVyKSByZXR1cm5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlzTG9hZGluZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICBzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXModHJ1ZSlcblxuICAgICAgICBjb25zdCBvbGRTY3JvbGxIZWlnaHQgPSBjb250YWluZXIuc2Nyb2xsSGVpZ2h0XG4gICAgICAgIGNvbnN0IG9sZFNjcm9sbFRvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3BcblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgbmV4dEl0ZW0sXG4gICAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkOiBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWQ6IHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9ID0gYXdhaXQgbWFpYS5DaGF0cy5nZXRDaGF0TWVzc2FnZXMoe1xuICAgICAgICAgIGNoYXRJZCxcbiAgICAgICAgICBjdXJyZW50VXNlcixcbiAgICAgICAgICBvZmZzZXQ6IGxhc3RFdmFsdWF0ZWRLZXksXG4gICAgICAgICAgbGFuZzogbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhKHtcbiAgICAgICAgICBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTaSBoYXkgcHJveWVjdG8gZW4gbGEgY29udmVyc2FjacOzbiwgcmVlc2NyaWJpciBVUkxzIGRlIHRhcmVhcyBlbiBsb3MgbWVuc2FqZXMgY2FyZ2Fkb3NcbiAgICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZCA9IHByb2plY3RJZE1lc3NhZ2UgPyBwYXJzZUludChTdHJpbmcocHJvamVjdElkTWVzc2FnZSksIDEwKSA6IG51bGxcbiAgICAgICAgbGV0IGl0ZW1zVG9NZXJnZSA9IGl0ZW1zXG4gICAgICAgIGlmIChjb250ZXh0UHJvamVjdElkKSB7XG4gICAgICAgICAgY29uc3QgdGFiID0gYXdhaXQgZ2V0VGFiVGFza0RlZmF1bHQoMSlcbiAgICAgICAgICBjb25zdCB0YWJTZWdtZW50ID0gdGFiID8gYC8ke3RhYn1gIDogJy9kZXRhaWwnXG4gICAgICAgICAgaXRlbXNUb01lcmdlID0gaXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICBtZXNzYWdlOiByZXdyaXRlVGFza1VybHNJbkNvbnRlbnQoaXRlbS5tZXNzYWdlIHx8ICcnLCB0YWJTZWdtZW50KSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdNZXNzYWdlcyA9IFsuLi5tZXNzYWdlcy5zbGljZSgwLCAxKSwgLi4uaXRlbXNUb01lcmdlLCAuLi5tZXNzYWdlcy5zbGljZSgxKV1cbiAgICAgICAgc2V0TWVzc2FnZXMobmV3TWVzc2FnZXMpXG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25LZXkgPSBOdW1iZXIobmV4dEl0ZW0pXG4gICAgICAgIHNldExhc3RFdmFsdWF0ZWRLZXkocGFnaW5hdGlvbktleSlcbiAgICAgICAgc3luY01lc3NhZ2VzVG9TdG9yZShjaGF0SWQsIG5ld01lc3NhZ2VzLCBwYWdpbmF0aW9uS2V5KVxuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IGNvbnRhaW5lclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lclJlZikge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxIZWlnaHQgPSBjb250YWluZXJSZWYuc2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgICAgIGNvbnN0IGhlaWdodERpZmZlcmVuY2UgPSBuZXdTY3JvbGxIZWlnaHQgLSBvbGRTY3JvbGxIZWlnaHRcbiAgICAgICAgICAgICAgY29udGFpbmVyUmVmLnNjcm9sbFRvcCA9IG9sZFNjcm9sbFRvcCArIGhlaWdodERpZmZlcmVuY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25FcnJvcj8uKClcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZ01vcmVNZXNzYWdlcyhmYWxzZSlcbiAgICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgY2hhdElkLFxuICAgICAgY3VycmVudFVzZXIsXG4gICAgICBsYXN0RXZhbHVhdGVkS2V5LFxuICAgICAgb25FcnJvcixcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgZ2V0VGFiVGFza0RlZmF1bHQsXG4gICAgICBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhLFxuICAgICAgc3luY01lc3NhZ2VzVG9TdG9yZSxcbiAgICBdXG4gIClcblxuICBjb25zdCBoYW5kbGVTY3JvbGwgPSB1c2VDYWxsYmFjayhcbiAgICAoY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGwpID0+IHtcbiAgICAgIGlmICghY29udGFpbmVyIHx8IGlzTG9hZGluZ1JlZi5jdXJyZW50IHx8ICFpbml0aWFsTG9hZERvbmUuY3VycmVudCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHsgc2Nyb2xsVG9wLCBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCB9ID0gY29udGFpbmVyXG4gICAgICBjb25zdCBzY3JvbGxQZXJjZW50YWdlID0gc2Nyb2xsSGVpZ2h0IC0gY2xpZW50SGVpZ2h0ID4gMCA/IChzY3JvbGxUb3AgLyAoc2Nyb2xsSGVpZ2h0IC0gY2xpZW50SGVpZ2h0KSkgKiAxMDAgOiAwXG5cbiAgICAgIGlmIChzY3JvbGxQZXJjZW50YWdlIDwgMTApIHtcbiAgICAgICAgbG9hZE1vcmVNZXNzYWdlcyhjb250YWluZXIpXG4gICAgICB9XG4gICAgfSxcbiAgICBbbG9hZE1vcmVNZXNzYWdlc11cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGNoYXRJZCAhPT0gcHJldmlvdXNDaGF0SWQuY3VycmVudCkge1xuICAgICAgY29uc3QgZnJvbUNoYXRJZCA9IHByZXZpb3VzQ2hhdElkLmN1cnJlbnRcbiAgICAgIGNvbnN0IGNhblJlc3RvcmUgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuY2FuUmVzdG9yZVNlc3Npb24oY2hhdElkKVxuICAgICAgY29uc29sZS5pbmZvKCdbdXNlQ2hhdE1lc3NhZ2VzXSBzZXNzaW9uIHN3aXRjaCcsIHsgZnJvbTogZnJvbUNoYXRJZCwgdG86IGNoYXRJZCwgY2FuUmVzdG9yZSB9KVxuXG4gICAgICBpc0xvYWRpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBpbml0aWFsTG9hZERvbmUuY3VycmVudCA9IGZhbHNlXG4gICAgICBwcmV2aW91c0NoYXRJZC5jdXJyZW50ID0gY2hhdElkXG4gICAgICBzZXRMYXN0RXZhbHVhdGVkS2V5KDApXG4gICAgICBsb2FkU2VxUmVmLmN1cnJlbnQgKz0gMVxuXG4gICAgICByZWZldGNoVGFiVGFza0RlZmF1bHQoKVxuXG4gICAgICBjb25zdCBwZW5kaW5nSW5pdGlhbE1lc3NhZ2UgPSBoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZSlcblxuICAgICAgaWYgKCFwZW5kaW5nSW5pdGlhbE1lc3NhZ2UgJiYgY2FuUmVzdG9yZSkge1xuICAgICAgICByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZShjaGF0SWQpLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1lc3NhZ2VzXSByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZSBmYWlsZWQnLCBlcnJvcilcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHNldE1lc3NhZ2VzKFxuICAgICAgICBwZW5kaW5nSW5pdGlhbE1lc3NhZ2UgJiYgdXNlckluaXRpYWxNZXNzYWdlXG4gICAgICAgICAgPyBidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIodXNlckluaXRpYWxNZXNzYWdlLCBjdXJyZW50VXNlcilcbiAgICAgICAgICA6IFtdXG4gICAgICApXG5cbiAgICAgIC8vIExpbXBpYXIgZWwgZXN0YWRvIGRlbCBwcm95ZWN0byB5IGxhIHRhcmVhIGN1YW5kbyBjYW1iaWEgZGUgY29udmVyc2FjacOzblxuICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRUYXNrKG51bGwpXG5cbiAgICAgIGlmICghcGVuZGluZ0luaXRpYWxNZXNzYWdlKSB7XG4gICAgICAgIGxvYWRNZXNzYWdlcygpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXG4gICAgY2hhdElkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBjdXJyZW50VXNlcixcbiAgICBsb2FkTWVzc2FnZXMsXG4gICAgcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICAgIHNldFByb2plY3QsXG4gICAgc2V0VGFzayxcbiAgICByZWZldGNoVGFiVGFza0RlZmF1bHQsXG4gIF0pXG5cbiAgLy8gQ3VhbmRvIHRhYlRhc2tEZWZhdWx0IHBhc2EgYSBlc3RhciBkaXNwb25pYmxlIGRlc3B1w6lzIGRlIGNhcmdhciwgcmVlc2NyaWJpciBVUkxzIGRlIHRhcmVhcyBlbiBsb3MgbWVuc2FqZXMgeWEgY2FyZ2Fkb3MuXG4gIC8vIFJlZiBwYXJhIGV2aXRhciBidWNsZTogc2V0TWVzc2FnZXMocmV3cml0dGVuKSBjYW1iaWEgbWVzc2FnZXMgeSByZS1lamVjdXRhIGVsIGVmZWN0bzsgc29sbyByZWVzY3JpYmltb3MgdW5hIHZleiBwb3IgbG90ZS5cbiAgY29uc3QgZGlkUmV3cml0ZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXRhYlRhc2tEZWZhdWx0IHx8ICFwcm9qZWN0Py5pZCB8fCBtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVyblxuICAgIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICAgIGNvbnN0IHRhYlNlZ21lbnQgPSBgLyR7dGFiVGFza0RlZmF1bHR9YFxuICAgIGNvbnN0IG5lZWRzUmV3cml0ZSA9IG1lc3NhZ2VzLnNvbWUobXNnID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBtc2cubWVzc2FnZSB8fCAnJ1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2godGFza1VybFJlZ2V4KVxuICAgICAgaWYgKCFtYXRjaGVzPy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgcmV0dXJuIG1hdGNoZXMuc29tZSh1cmwgPT4gIXVybC5lbmRzV2l0aChgLyR7dGFiVGFza0RlZmF1bHR9YCkgJiYgIXVybC5pbmNsdWRlcyhgLyR7dGFiVGFza0RlZmF1bHR9P2ApKVxuICAgIH0pXG4gICAgaWYgKCFuZWVkc1Jld3JpdGUpIHtcbiAgICAgIGRpZFJld3JpdGVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRpZFJld3JpdGVSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgZGlkUmV3cml0ZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIGNvbnN0IHJld3JpdHRlbiA9IG1lc3NhZ2VzLm1hcChtc2cgPT4gKHtcbiAgICAgIC4uLm1zZyxcbiAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChtc2cubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gICAgfSkpXG4gICAgc2V0TWVzc2FnZXMocmV3cml0dGVuKVxuICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUoY2hhdElkLCByZXdyaXR0ZW4pXG4gIH0sIFt0YWJUYXNrRGVmYXVsdCwgcHJvamVjdD8uaWQsIG1lc3NhZ2VzLCBjaGF0SWQsIHN5bmNNZXNzYWdlc1RvU3RvcmVdKVxuXG4gIGNvbnN0IGFkZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgIHNldE1lc3NhZ2VzKHByZXYgPT4ge1xuICAgICAgICBjb25zdCBleGlzdGluZ01lc3NhZ2VJbmRleCA9IHByZXYuZmluZEluZGV4KG1zZyA9PiBtc2cuaWQgPT09IG1lc3NhZ2UuaWQpXG5cbiAgICAgICAgaWYgKGV4aXN0aW5nTWVzc2FnZUluZGV4ID49IDApIHtcbiAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlcyA9IFsuLi5wcmV2XVxuICAgICAgICAgIG5ld01lc3NhZ2VzW2V4aXN0aW5nTWVzc2FnZUluZGV4XSA9IG1lc3NhZ2VcbiAgICAgICAgICBzeW5jTWVzc2FnZXNUb1N0b3JlKGNoYXRJZCwgbmV3TWVzc2FnZXMpXG4gICAgICAgICAgcmV0dXJuIG5ld01lc3NhZ2VzXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3TWVzc2FnZXMgPSBbLi4ucHJldiwgbWVzc2FnZV1cbiAgICAgICAgc3luY01lc3NhZ2VzVG9TdG9yZShjaGF0SWQsIG5ld01lc3NhZ2VzKVxuICAgICAgICByZXR1cm4gbmV3TWVzc2FnZXNcbiAgICAgIH0pXG4gICAgfSxcbiAgICBbY2hhdElkLCBzeW5jTWVzc2FnZXNUb1N0b3JlXVxuICApXG5cbiAgY29uc3QgcmVtb3ZlTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgc2V0TWVzc2FnZXMocHJldiA9PiB7XG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2VzID0gcHJldi5maWx0ZXIobXNnID0+IG1zZy5pZCAhPT0gbWVzc2FnZUlkKVxuICAgICAgICBzeW5jTWVzc2FnZXNUb1N0b3JlKGNoYXRJZCwgbmV3TWVzc2FnZXMpXG4gICAgICAgIHJldHVybiBuZXdNZXNzYWdlc1xuICAgICAgfSlcbiAgICB9LFxuICAgIFtjaGF0SWQsIHN5bmNNZXNzYWdlc1RvU3RvcmVdXG4gIClcblxuICByZXR1cm4ge1xuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBtZXNzYWdlcyxcbiAgICBoYXNNb3JlTWVzc2FnZXM6ICEhbGFzdEV2YWx1YXRlZEtleSxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgbG9hZE1lc3NhZ2VzLFxuICAgIGxvYWRNb3JlTWVzc2FnZXMsXG4gICAgYWRkTWVzc2FnZSxcbiAgICByZW1vdmVNZXNzYWdlLFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQSxTQUFT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