@projectcor/maia-components 2.11.108-0 → 2.11.108

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 (35) hide show
  1. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +2 -8
  2. package/lib/components/atoms/IconButton.js +2 -2
  3. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +5 -16
  4. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +187 -154
  5. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +12 -2
  6. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +26 -8
  7. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +24 -7
  8. package/lib/components/molecules/MessageFeedback/MessageFeedback.js +2 -14
  9. package/lib/components/organisms/ChatAI/ChatAI.js +22 -3
  10. package/lib/components/organisms/ClientAIButton/ClientAIButton.js +4 -1
  11. package/lib/components/organisms/CloseWhileGeneratingModal/CloseWhileGeneratingModal.js +56 -0
  12. package/lib/components/organisms/CloseWhileGeneratingModal/CloseWhileGeneratingModal.styles.js +35 -0
  13. package/lib/components/organisms/CloseWhileGeneratingModal/index.js +2 -0
  14. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +4 -1
  15. package/lib/dev/DevChatAI.js +4 -1
  16. package/lib/hooks/useChatManager/useChatManager.js +77 -351
  17. package/lib/hooks/useChatMessages/useChatMessages.js +33 -6
  18. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  19. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +3 -78
  20. package/lib/lang/br/index.js +8 -1
  21. package/lib/lang/en/index.js +8 -1
  22. package/lib/lang/es/index.js +8 -1
  23. package/lib/lang/fr/index.js +8 -1
  24. package/lib/services/maia/Orchestrator/index.js +3 -4
  25. package/lib/services/maia/Orchestrator/orchestrator.js +16 -79
  26. package/lib/services/utils/mapChatMessages.js +5 -9
  27. package/lib/store/maiaMinimizedPersistence.js +49 -0
  28. package/lib/store/sessions/sessionStreamManager.js +2 -141
  29. package/lib/store/sessions/sessions.types.js +1 -1
  30. package/lib/utils/hitlAnalytics.js +35 -1
  31. package/lib/utils/maiaHostOpen.js +10 -1
  32. package/package.json +1 -1
  33. package/lib/components/atoms/icons/RetryIcon.js +0 -34
  34. package/lib/store/maiaLastChatPersistence.js +0 -35
  35. package/lib/utils/retryCompletion.js +0 -85
@@ -1,35 +0,0 @@
1
- var STORAGE_PREFIX = 'maia:last-chat';
2
- var canUseStorage = function canUseStorage() {
3
- return typeof window !== 'undefined' && typeof localStorage !== 'undefined';
4
- };
5
- var buildKey = function buildKey(userId) {
6
- return "".concat(STORAGE_PREFIX, ":").concat(userId);
7
- };
8
-
9
- /**
10
- * Último chat abierto por el usuario. El pill es permanente, así que al navegar o refrescar
11
- * no hay "estado minimizado" que restaurar: lo único que necesitamos recordar es a qué
12
- * conversación volver. Scopeado por usuario para no arrastrarlo de una cuenta a otra.
13
- */
14
- export var readLastActiveChatId = function readLastActiveChatId(userId) {
15
- if (!canUseStorage()) return null;
16
- try {
17
- var raw = localStorage.getItem(buildKey(userId));
18
- return raw && raw.length > 0 ? raw : null;
19
- } catch (_unused) {
20
- return null;
21
- }
22
- };
23
- export var writeLastActiveChatId = function writeLastActiveChatId(userId, chatId) {
24
- if (!canUseStorage()) return;
25
- try {
26
- if (!chatId) {
27
- localStorage.removeItem(buildKey(userId));
28
- return;
29
- }
30
- localStorage.setItem(buildKey(userId), chatId);
31
- } catch (_unused2) {
32
- // storage lleno o bloqueado: el pill simplemente no recuerda la última conversación
33
- }
34
- };
35
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTVE9SQUdFX1BSRUZJWCIsImNhblVzZVN0b3JhZ2UiLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJidWlsZEtleSIsInVzZXJJZCIsImNvbmNhdCIsInJlYWRMYXN0QWN0aXZlQ2hhdElkIiwicmF3IiwiZ2V0SXRlbSIsImxlbmd0aCIsIl91bnVzZWQiLCJ3cml0ZUxhc3RBY3RpdmVDaGF0SWQiLCJjaGF0SWQiLCJyZW1vdmVJdGVtIiwic2V0SXRlbSIsIl91bnVzZWQyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3JlL21haWFMYXN0Q2hhdFBlcnNpc3RlbmNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFNUT1JBR0VfUFJFRklYID0gJ21haWE6bGFzdC1jaGF0J1xuXG5jb25zdCBjYW5Vc2VTdG9yYWdlID0gKCk6IGJvb2xlYW4gPT4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCdcblxuY29uc3QgYnVpbGRLZXkgPSAodXNlcklkOiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcgPT4gYCR7U1RPUkFHRV9QUkVGSVh9OiR7dXNlcklkfWBcblxuLyoqXG4gKiDDmmx0aW1vIGNoYXQgYWJpZXJ0byBwb3IgZWwgdXN1YXJpby4gRWwgcGlsbCBlcyBwZXJtYW5lbnRlLCBhc8OtIHF1ZSBhbCBuYXZlZ2FyIG8gcmVmcmVzY2FyXG4gKiBubyBoYXkgXCJlc3RhZG8gbWluaW1pemFkb1wiIHF1ZSByZXN0YXVyYXI6IGxvIMO6bmljbyBxdWUgbmVjZXNpdGFtb3MgcmVjb3JkYXIgZXMgYSBxdcOpXG4gKiBjb252ZXJzYWNpw7NuIHZvbHZlci4gU2NvcGVhZG8gcG9yIHVzdWFyaW8gcGFyYSBubyBhcnJhc3RyYXJsbyBkZSB1bmEgY3VlbnRhIGEgb3RyYS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlYWRMYXN0QWN0aXZlQ2hhdElkID0gKHVzZXJJZDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGlmICghY2FuVXNlU3RvcmFnZSgpKSByZXR1cm4gbnVsbFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYnVpbGRLZXkodXNlcklkKSlcbiAgICByZXR1cm4gcmF3ICYmIHJhdy5sZW5ndGggPiAwID8gcmF3IDogbnVsbFxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB3cml0ZUxhc3RBY3RpdmVDaGF0SWQgPSAodXNlcklkOiBudW1iZXIgfCBzdHJpbmcsIGNoYXRJZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQgPT4ge1xuICBpZiAoIWNhblVzZVN0b3JhZ2UoKSkgcmV0dXJuXG5cbiAgdHJ5IHtcbiAgICBpZiAoIWNoYXRJZCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYnVpbGRLZXkodXNlcklkKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShidWlsZEtleSh1c2VySWQpLCBjaGF0SWQpXG4gIH0gY2F0Y2gge1xuICAgIC8vIHN0b3JhZ2UgbGxlbm8gbyBibG9xdWVhZG86IGVsIHBpbGwgc2ltcGxlbWVudGUgbm8gcmVjdWVyZGEgbGEgw7psdGltYSBjb252ZXJzYWNpw7NuXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBTUEsY0FBYyxHQUFHLGdCQUFnQjtBQUV2QyxJQUFNQyxhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQUE7RUFBQSxPQUFrQixPQUFPQyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU9DLFlBQVksS0FBSyxXQUFXO0FBQUE7QUFFekcsSUFBTUMsUUFBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUlDLE1BQXVCO0VBQUEsVUFBQUMsTUFBQSxDQUFnQk4sY0FBYyxPQUFBTSxNQUFBLENBQUlELE1BQU07QUFBQSxDQUFFOztBQUVuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFNRSxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFJRixNQUF1QixFQUFvQjtFQUM5RSxJQUFJLENBQUNKLGFBQWEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJO0VBRWpDLElBQUk7SUFDRixJQUFNTyxHQUFHLEdBQUdMLFlBQVksQ0FBQ00sT0FBTyxDQUFDTCxRQUFRLENBQUNDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELE9BQU9HLEdBQUcsSUFBSUEsR0FBRyxDQUFDRSxNQUFNLEdBQUcsQ0FBQyxHQUFHRixHQUFHLEdBQUcsSUFBSTtFQUMzQyxDQUFDLENBQUMsT0FBQUcsT0FBQSxFQUFNO0lBQ04sT0FBTyxJQUFJO0VBQ2I7QUFDRixDQUFDO0FBRUQsT0FBTyxJQUFNQyxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXFCQSxDQUFJUCxNQUF1QixFQUFFUSxNQUFxQixFQUFXO0VBQzdGLElBQUksQ0FBQ1osYUFBYSxDQUFDLENBQUMsRUFBRTtFQUV0QixJQUFJO0lBQ0YsSUFBSSxDQUFDWSxNQUFNLEVBQUU7TUFDWFYsWUFBWSxDQUFDVyxVQUFVLENBQUNWLFFBQVEsQ0FBQ0MsTUFBTSxDQUFDLENBQUM7TUFDekM7SUFDRjtJQUNBRixZQUFZLENBQUNZLE9BQU8sQ0FBQ1gsUUFBUSxDQUFDQyxNQUFNLENBQUMsRUFBRVEsTUFBTSxDQUFDO0VBQ2hELENBQUMsQ0FBQyxPQUFBRyxRQUFBLEVBQU07SUFDTjtFQUFBO0FBRUosQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,85 +0,0 @@
1
- import { ChatHistoryRole } from '../types/Chat';
2
-
3
- /** Ids of the assistant turn to regenerate (`memory_sessions.id`). */
4
- export var resolveRetryTurnId = function resolveRetryTurnId(message) {
5
- var _message$memorySessio;
6
- var fromField = (_message$memorySessio = message.memorySessionId) === null || _message$memorySessio === void 0 ? void 0 : _message$memorySessio.trim();
7
- if (fromField) return fromField;
8
- var id = message.id || '';
9
- if (!id || id.includes('-streaming')) return null;
10
- if (id.startsWith('answer-') && !id.endsWith('-cancelled')) {
11
- var rest = id.slice('answer-'.length);
12
- return rest || null;
13
- }
14
- if (id.endsWith('-answer')) {
15
- var _rest = id.slice(0, -'-answer'.length);
16
- return _rest || null;
17
- }
18
- if (id.endsWith('-cancelled')) {
19
- var _message$memorySessio2;
20
- if ((_message$memorySessio2 = message.memorySessionId) !== null && _message$memorySessio2 !== void 0 && _message$memorySessio2.trim()) return message.memorySessionId.trim();
21
- // Burbuja local tras Stop: answer-{streamMessageId}-cancelled (no es memory_session_id).
22
- if (id.startsWith('answer-')) return null;
23
- var _rest2 = id.slice(0, -'-cancelled'.length);
24
- return _rest2 || null;
25
- }
26
- return null;
27
- };
28
- var isUserMessage = function isUserMessage(message) {
29
- var _message$user;
30
- return message.role === ChatHistoryRole.USER || ((_message$user = message.user) === null || _message$user === void 0 ? void 0 : _message$user.id) !== 'assistant';
31
- };
32
- var isAssistantMessage = function isAssistantMessage(message) {
33
- var _message$user2;
34
- return message.role === ChatHistoryRole.ASSISTANT || ((_message$user2 = message.user) === null || _message$user2 === void 0 ? void 0 : _message$user2.id) === 'assistant';
35
- };
36
-
37
- /** Pregunta del usuario asociada al turno que se quiere regenerar. */
38
- export var findUserMessageForRetry = function findUserMessageForRetry(messages, target) {
39
- var idx = messages.findIndex(function (message) {
40
- return message.id === target.id;
41
- });
42
- if (idx <= 0) return null;
43
- for (var i = idx - 1; i >= 0; i -= 1) {
44
- var candidate = messages[i];
45
- if (candidate && isUserMessage(candidate)) return candidate;
46
- }
47
- return null;
48
- };
49
-
50
- /**
51
- * Clave para agrupar las burbujas locales de un mismo stop, que no tienen
52
- * `memory_session_id`: `answer-X` (parcial) y `answer-X-cancelled` comparten X.
53
- */
54
- var localStopTurnKey = function localStopTurnKey(message) {
55
- var id = message.id || '';
56
- if (!id.startsWith('answer-') || id.includes('-streaming')) return null;
57
- var rest = id.slice('answer-'.length);
58
- var base = rest.endsWith('-cancelled') ? rest.slice(0, -'-cancelled'.length) : rest;
59
- return base || null;
60
- };
61
- var retryTurnKey = function retryTurnKey(message) {
62
- var _resolveRetryTurnId;
63
- return (_resolveRetryTurnId = resolveRetryTurnId(message)) !== null && _resolveRetryTurnId !== void 0 ? _resolveRetryTurnId : localStopTurnKey(message);
64
- };
65
-
66
- /**
67
- * Drop the retried assistant turn (partial answer + cancelled notice) and every
68
- * message after it. Keeps the original user question.
69
- */
70
- export var messagesWithoutRetriedTurn = function messagesWithoutRetriedTurn(messages, target) {
71
- var idx = messages.findIndex(function (message) {
72
- return message.id === target.id;
73
- });
74
- if (idx < 0) return messages;
75
- var turnKey = retryTurnKey(target);
76
- var start = idx;
77
- while (start > 0) {
78
- var previous = messages[start - 1];
79
- if (!previous || !isAssistantMessage(previous)) break;
80
- if (!turnKey || retryTurnKey(previous) !== turnKey) break;
81
- start -= 1;
82
- }
83
- return messages.slice(0, start);
84
- };
85
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDaGF0SGlzdG9yeVJvbGUiLCJyZXNvbHZlUmV0cnlUdXJuSWQiLCJtZXNzYWdlIiwiX21lc3NhZ2UkbWVtb3J5U2Vzc2lvIiwiZnJvbUZpZWxkIiwibWVtb3J5U2Vzc2lvbklkIiwidHJpbSIsImlkIiwiaW5jbHVkZXMiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJyZXN0Iiwic2xpY2UiLCJsZW5ndGgiLCJfbWVzc2FnZSRtZW1vcnlTZXNzaW8yIiwiaXNVc2VyTWVzc2FnZSIsIl9tZXNzYWdlJHVzZXIiLCJyb2xlIiwiVVNFUiIsInVzZXIiLCJpc0Fzc2lzdGFudE1lc3NhZ2UiLCJfbWVzc2FnZSR1c2VyMiIsIkFTU0lTVEFOVCIsImZpbmRVc2VyTWVzc2FnZUZvclJldHJ5IiwibWVzc2FnZXMiLCJ0YXJnZXQiLCJpZHgiLCJmaW5kSW5kZXgiLCJpIiwiY2FuZGlkYXRlIiwibG9jYWxTdG9wVHVybktleSIsImJhc2UiLCJyZXRyeVR1cm5LZXkiLCJfcmVzb2x2ZVJldHJ5VHVybklkIiwibWVzc2FnZXNXaXRob3V0UmV0cmllZFR1cm4iLCJ0dXJuS2V5Iiwic3RhcnQiLCJwcmV2aW91cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9yZXRyeUNvbXBsZXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdEhpc3RvcnlSb2xlLCBDaGF0TWVzc2FnZSB9IGZyb20gJy4uL3R5cGVzL0NoYXQnXG5cbi8qKiBJZHMgb2YgdGhlIGFzc2lzdGFudCB0dXJuIHRvIHJlZ2VuZXJhdGUgKGBtZW1vcnlfc2Vzc2lvbnMuaWRgKS4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlUmV0cnlUdXJuSWQgPSAobWVzc2FnZTogUGljazxDaGF0TWVzc2FnZSwgJ2lkJyB8ICdtZW1vcnlTZXNzaW9uSWQnPik6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCBmcm9tRmllbGQgPSBtZXNzYWdlLm1lbW9yeVNlc3Npb25JZD8udHJpbSgpXG4gIGlmIChmcm9tRmllbGQpIHJldHVybiBmcm9tRmllbGRcblxuICBjb25zdCBpZCA9IG1lc3NhZ2UuaWQgfHwgJydcbiAgaWYgKCFpZCB8fCBpZC5pbmNsdWRlcygnLXN0cmVhbWluZycpKSByZXR1cm4gbnVsbFxuXG4gIGlmIChpZC5zdGFydHNXaXRoKCdhbnN3ZXItJykgJiYgIWlkLmVuZHNXaXRoKCctY2FuY2VsbGVkJykpIHtcbiAgICBjb25zdCByZXN0ID0gaWQuc2xpY2UoJ2Fuc3dlci0nLmxlbmd0aClcbiAgICByZXR1cm4gcmVzdCB8fCBudWxsXG4gIH1cblxuICBpZiAoaWQuZW5kc1dpdGgoJy1hbnN3ZXInKSkge1xuICAgIGNvbnN0IHJlc3QgPSBpZC5zbGljZSgwLCAtJy1hbnN3ZXInLmxlbmd0aClcbiAgICByZXR1cm4gcmVzdCB8fCBudWxsXG4gIH1cbiAgaWYgKGlkLmVuZHNXaXRoKCctY2FuY2VsbGVkJykpIHtcbiAgICBpZiAobWVzc2FnZS5tZW1vcnlTZXNzaW9uSWQ/LnRyaW0oKSkgcmV0dXJuIG1lc3NhZ2UubWVtb3J5U2Vzc2lvbklkLnRyaW0oKVxuICAgIC8vIEJ1cmJ1amEgbG9jYWwgdHJhcyBTdG9wOiBhbnN3ZXIte3N0cmVhbU1lc3NhZ2VJZH0tY2FuY2VsbGVkIChubyBlcyBtZW1vcnlfc2Vzc2lvbl9pZCkuXG4gICAgaWYgKGlkLnN0YXJ0c1dpdGgoJ2Fuc3dlci0nKSkgcmV0dXJuIG51bGxcbiAgICBjb25zdCByZXN0ID0gaWQuc2xpY2UoMCwgLSctY2FuY2VsbGVkJy5sZW5ndGgpXG4gICAgcmV0dXJuIHJlc3QgfHwgbnVsbFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgaXNVc2VyTWVzc2FnZSA9IChtZXNzYWdlOiBDaGF0TWVzc2FnZSk6IGJvb2xlYW4gPT5cbiAgbWVzc2FnZS5yb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuVVNFUiB8fCBtZXNzYWdlLnVzZXI/LmlkICE9PSAnYXNzaXN0YW50J1xuXG5jb25zdCBpc0Fzc2lzdGFudE1lc3NhZ2UgPSAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpOiBib29sZWFuID0+XG4gIG1lc3NhZ2Uucm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCB8fCBtZXNzYWdlLnVzZXI/LmlkID09PSAnYXNzaXN0YW50J1xuXG4vKiogUHJlZ3VudGEgZGVsIHVzdWFyaW8gYXNvY2lhZGEgYWwgdHVybm8gcXVlIHNlIHF1aWVyZSByZWdlbmVyYXIuICovXG5leHBvcnQgY29uc3QgZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkgPSAobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIHRhcmdldDogQ2hhdE1lc3NhZ2UpOiBDaGF0TWVzc2FnZSB8IG51bGwgPT4ge1xuICBjb25zdCBpZHggPSBtZXNzYWdlcy5maW5kSW5kZXgobWVzc2FnZSA9PiBtZXNzYWdlLmlkID09PSB0YXJnZXQuaWQpXG4gIGlmIChpZHggPD0gMCkgcmV0dXJuIG51bGxcblxuICBmb3IgKGxldCBpID0gaWR4IC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBtZXNzYWdlc1tpXVxuICAgIGlmIChjYW5kaWRhdGUgJiYgaXNVc2VyTWVzc2FnZShjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIENsYXZlIHBhcmEgYWdydXBhciBsYXMgYnVyYnVqYXMgbG9jYWxlcyBkZSB1biBtaXNtbyBzdG9wLCBxdWUgbm8gdGllbmVuXG4gKiBgbWVtb3J5X3Nlc3Npb25faWRgOiBgYW5zd2VyLVhgIChwYXJjaWFsKSB5IGBhbnN3ZXItWC1jYW5jZWxsZWRgIGNvbXBhcnRlbiBYLlxuICovXG5jb25zdCBsb2NhbFN0b3BUdXJuS2V5ID0gKG1lc3NhZ2U6IFBpY2s8Q2hhdE1lc3NhZ2UsICdpZCc+KTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGlkID0gbWVzc2FnZS5pZCB8fCAnJ1xuICBpZiAoIWlkLnN0YXJ0c1dpdGgoJ2Fuc3dlci0nKSB8fCBpZC5pbmNsdWRlcygnLXN0cmVhbWluZycpKSByZXR1cm4gbnVsbFxuICBjb25zdCByZXN0ID0gaWQuc2xpY2UoJ2Fuc3dlci0nLmxlbmd0aClcbiAgY29uc3QgYmFzZSA9IHJlc3QuZW5kc1dpdGgoJy1jYW5jZWxsZWQnKSA/IHJlc3Quc2xpY2UoMCwgLSctY2FuY2VsbGVkJy5sZW5ndGgpIDogcmVzdFxuICByZXR1cm4gYmFzZSB8fCBudWxsXG59XG5cbmNvbnN0IHJldHJ5VHVybktleSA9IChtZXNzYWdlOiBDaGF0TWVzc2FnZSk6IHN0cmluZyB8IG51bGwgPT4gcmVzb2x2ZVJldHJ5VHVybklkKG1lc3NhZ2UpID8/IGxvY2FsU3RvcFR1cm5LZXkobWVzc2FnZSlcblxuLyoqXG4gKiBEcm9wIHRoZSByZXRyaWVkIGFzc2lzdGFudCB0dXJuIChwYXJ0aWFsIGFuc3dlciArIGNhbmNlbGxlZCBub3RpY2UpIGFuZCBldmVyeVxuICogbWVzc2FnZSBhZnRlciBpdC4gS2VlcHMgdGhlIG9yaWdpbmFsIHVzZXIgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBtZXNzYWdlc1dpdGhvdXRSZXRyaWVkVHVybiA9IChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSwgdGFyZ2V0OiBDaGF0TWVzc2FnZSk6IENoYXRNZXNzYWdlW10gPT4ge1xuICBjb25zdCBpZHggPSBtZXNzYWdlcy5maW5kSW5kZXgobWVzc2FnZSA9PiBtZXNzYWdlLmlkID09PSB0YXJnZXQuaWQpXG4gIGlmIChpZHggPCAwKSByZXR1cm4gbWVzc2FnZXNcblxuICBjb25zdCB0dXJuS2V5ID0gcmV0cnlUdXJuS2V5KHRhcmdldClcbiAgbGV0IHN0YXJ0ID0gaWR4XG4gIHdoaWxlIChzdGFydCA+IDApIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IG1lc3NhZ2VzW3N0YXJ0IC0gMV1cbiAgICBpZiAoIXByZXZpb3VzIHx8ICFpc0Fzc2lzdGFudE1lc3NhZ2UocHJldmlvdXMpKSBicmVha1xuICAgIGlmICghdHVybktleSB8fCByZXRyeVR1cm5LZXkocHJldmlvdXMpICE9PSB0dXJuS2V5KSBicmVha1xuICAgIHN0YXJ0IC09IDFcbiAgfVxuXG4gIHJldHVybiBtZXNzYWdlcy5zbGljZSgwLCBzdGFydClcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZUFBZSxRQUFxQixlQUFlOztBQUU1RDtBQUNBLE9BQU8sSUFBTUMsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFrQkEsQ0FBSUMsT0FBb0QsRUFBb0I7RUFBQSxJQUFBQyxxQkFBQTtFQUN6RyxJQUFNQyxTQUFTLElBQUFELHFCQUFBLEdBQUdELE9BQU8sQ0FBQ0csZUFBZSxjQUFBRixxQkFBQSx1QkFBdkJBLHFCQUFBLENBQXlCRyxJQUFJLENBQUMsQ0FBQztFQUNqRCxJQUFJRixTQUFTLEVBQUUsT0FBT0EsU0FBUztFQUUvQixJQUFNRyxFQUFFLEdBQUdMLE9BQU8sQ0FBQ0ssRUFBRSxJQUFJLEVBQUU7RUFDM0IsSUFBSSxDQUFDQSxFQUFFLElBQUlBLEVBQUUsQ0FBQ0MsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sSUFBSTtFQUVqRCxJQUFJRCxFQUFFLENBQUNFLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDRixFQUFFLENBQUNHLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUMxRCxJQUFNQyxJQUFJLEdBQUdKLEVBQUUsQ0FBQ0ssS0FBSyxDQUFDLFNBQVMsQ0FBQ0MsTUFBTSxDQUFDO0lBQ3ZDLE9BQU9GLElBQUksSUFBSSxJQUFJO0VBQ3JCO0VBRUEsSUFBSUosRUFBRSxDQUFDRyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7SUFDMUIsSUFBTUMsS0FBSSxHQUFHSixFQUFFLENBQUNLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUNDLE1BQU0sQ0FBQztJQUMzQyxPQUFPRixLQUFJLElBQUksSUFBSTtFQUNyQjtFQUNBLElBQUlKLEVBQUUsQ0FBQ0csUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO0lBQUEsSUFBQUksc0JBQUE7SUFDN0IsS0FBQUEsc0JBQUEsR0FBSVosT0FB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