@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.
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +2 -8
- package/lib/components/atoms/IconButton.js +2 -2
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +5 -16
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +187 -154
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +12 -2
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +26 -8
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +24 -7
- package/lib/components/molecules/MessageFeedback/MessageFeedback.js +2 -14
- package/lib/components/organisms/ChatAI/ChatAI.js +22 -3
- package/lib/components/organisms/ClientAIButton/ClientAIButton.js +4 -1
- package/lib/components/organisms/CloseWhileGeneratingModal/CloseWhileGeneratingModal.js +56 -0
- package/lib/components/organisms/CloseWhileGeneratingModal/CloseWhileGeneratingModal.styles.js +35 -0
- package/lib/components/organisms/CloseWhileGeneratingModal/index.js +2 -0
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +4 -1
- package/lib/dev/DevChatAI.js +4 -1
- package/lib/hooks/useChatManager/useChatManager.js +77 -351
- package/lib/hooks/useChatMessages/useChatMessages.js +33 -6
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +3 -78
- package/lib/lang/br/index.js +8 -1
- package/lib/lang/en/index.js +8 -1
- package/lib/lang/es/index.js +8 -1
- package/lib/lang/fr/index.js +8 -1
- package/lib/services/maia/Orchestrator/index.js +3 -4
- package/lib/services/maia/Orchestrator/orchestrator.js +16 -79
- package/lib/services/utils/mapChatMessages.js +5 -9
- package/lib/store/maiaMinimizedPersistence.js +49 -0
- package/lib/store/sessions/sessionStreamManager.js +2 -141
- package/lib/store/sessions/sessions.types.js +1 -1
- package/lib/utils/hitlAnalytics.js +35 -1
- package/lib/utils/maiaHostOpen.js +10 -1
- package/package.json +1 -1
- package/lib/components/atoms/icons/RetryIcon.js +0 -34
- package/lib/store/maiaLastChatPersistence.js +0 -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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
|