@projectcor/maia-components 2.11.41 → 2.11.42-0

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 (81) hide show
  1. package/lib/App.js +22 -11
  2. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
  3. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +184 -0
  4. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  5. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +432 -0
  6. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  7. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +225 -0
  8. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +6 -0
  9. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  10. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +282 -0
  11. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +148 -0
  12. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  13. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +160 -0
  14. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +79 -0
  15. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  16. package/lib/components/atoms/EntitySelector/EntitySelector.js +47 -3
  17. package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +3 -3
  18. package/lib/components/atoms/MAIAInput/MAIAInput.js +246 -321
  19. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +269 -0
  20. package/lib/components/atoms/MAIAInput/styles.js +75 -46
  21. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  22. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  23. package/lib/components/atoms/icons/index.js +2 -1
  24. package/lib/components/index.js +2 -1
  25. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +8 -4
  26. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +31 -3
  27. package/lib/components/molecules/ChatAIMessages/newStyles.js +5 -2
  28. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -6
  29. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -4
  30. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +68 -0
  31. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  32. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  33. package/lib/components/molecules/Sidebar/Sidebar.js +9 -5
  34. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +6 -2
  35. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +5 -2
  36. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +6 -3
  37. package/lib/constants/config.js +3 -1
  38. package/lib/constants/taskLinkIcon.js +6 -0
  39. package/lib/context/cor-user.js +1 -1
  40. package/lib/dev/DevContextMentionInput.js +65 -0
  41. package/lib/dev/Providers.js +11 -6
  42. package/lib/hooks/useCaretPosition.js +35 -0
  43. package/lib/hooks/useChatManager/useChatManager.interface.js +1 -1
  44. package/lib/hooks/useChatManager/useChatManager.js +21 -11
  45. package/lib/hooks/useChatMessages/useChatMessages.interface.js +1 -1
  46. package/lib/hooks/useChatMessages/useChatMessages.js +30 -14
  47. package/lib/hooks/useClientSearch.js +3 -2
  48. package/lib/hooks/useContextMentions.js +270 -0
  49. package/lib/hooks/useEntitySearch.js +1097 -0
  50. package/lib/hooks/useEvent.js +6 -1
  51. package/lib/hooks/useMentionAllowedTypes.js +103 -0
  52. package/lib/hooks/useMentionPopover.js +334 -0
  53. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +6 -4
  54. package/lib/hooks/useProjectSearch.js +3 -2
  55. package/lib/hooks/useRecentClientsSearch.js +3 -2
  56. package/lib/hooks/useTaskPanel.js +3 -10
  57. package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
  58. package/lib/lang/br/index.js +24 -1
  59. package/lib/lang/en/index.js +24 -1
  60. package/lib/lang/es/index.js +24 -1
  61. package/lib/lang/fr/index.js +23 -1
  62. package/lib/services/maia/Chats/getChatMessages.js +29 -4
  63. package/lib/services/maia/Orchestrator/orchestrator.js +8 -5
  64. package/lib/services/maia/RecentProjects/getRecentProjects.js +12 -4
  65. package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
  66. package/lib/services/maia/RecentTasks/index.js +6 -0
  67. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  68. package/lib/services/maia/RecentUsers/index.js +6 -0
  69. package/lib/services/query/entitySearchQuery.js +18 -0
  70. package/lib/services/query/usersDirectoryQuery.js +19 -0
  71. package/lib/services/utils/mapChatMessages.js +12 -5
  72. package/lib/types/Chat.js +1 -1
  73. package/lib/types/agent.js +1 -1
  74. package/lib/types/contextMention.js +37 -0
  75. package/lib/utils/contextMentionIcons.js +115 -0
  76. package/lib/utils/contextMentionLabel.js +4 -0
  77. package/lib/utils/contextMentionTypeLabel.js +17 -0
  78. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  79. package/lib/utils/openTaskInCorPanel.js +18 -0
  80. package/lib/utils/renderContextMentions.js +355 -0
  81. package/package.json +2 -1
@@ -0,0 +1,355 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import styled, { css } from 'styled-components';
3
+ import { CONTEXT_MENTION_CHIP_CLASS } from '../types/contextMention';
4
+ import { MENTION_CHIP_COLORS, MENTION_CHIP_NON_TASK_HOVER_BG } from '../components/atoms/ContextMentionChip/ContextMentionChip.styles';
5
+ import { VIOLET_IA_COLORS } from '../styles/config';
6
+ import { SCTaskLink } from '../components/molecules/ChatAIMessages/newStyles';
7
+ import { getContextMentionIcon } from './contextMentionIcons';
8
+ import { normalizeContextMentionLabel } from './contextMentionLabel';
9
+ import { openTaskInCorPanel } from './openTaskInCorPanel';
10
+
11
+ /**
12
+ * Formato del marcador que viaja en el texto del mensaje:
13
+ * [[mention:<type>:<id>|<label>]]
14
+ *
15
+ * El editor lo emite cuando serializa el contenteditable, el backend lo
16
+ * persiste tal cual y al renderizar se transforma en un link markdown con
17
+ * un protocolo propio que `CustomLink` intercepta y dibuja como span
18
+ * estilado.
19
+ *
20
+ * Por separado, la metadata `context_message` lleva los valores limpios
21
+ * (id + name) para que el backend pueda interpretar las entidades sin
22
+ * tener que parsear el texto.
23
+ */
24
+ /**
25
+ * Label puede contener `]` (ej: "[Educate]Blog Post ..."), por eso
26
+ * se captura de forma lazy hasta el cierre real `]]`.
27
+ */
28
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
29
+ export var MENTION_MARKER_REGEX = /\[\[mention:(client|project|task|user|mcp):([^|\]]+)\|([\s\S]*?)\]\]/g;
30
+ export var MAIA_MENTION_PROTOCOL = 'maia-mention://';
31
+ var INCOMPLETE_MENTION_MARKER_REGEX = /\[\[mention:[\s\S]*$/;
32
+ var ALLOWED_TYPES = ['client', 'project', 'task', 'user', 'mcp'];
33
+ var parseMentionProtocolHref = function parseMentionProtocolHref(href) {
34
+ var rest = href.slice(MAIA_MENTION_PROTOCOL.length);
35
+ var slashIdx = rest.indexOf('/');
36
+ var rawType = slashIdx >= 0 ? rest.slice(0, slashIdx) : rest;
37
+ var rawId = slashIdx >= 0 ? rest.slice(slashIdx + 1) : '';
38
+ var id = '';
39
+ try {
40
+ id = rawId ? decodeURIComponent(rawId) : '';
41
+ } catch (_unused) {
42
+ id = rawId;
43
+ }
44
+ var type = ALLOWED_TYPES.includes(rawType) ? rawType : 'user';
45
+ return {
46
+ type: type,
47
+ id: id
48
+ };
49
+ };
50
+
51
+ /** Genera el marcador para un mention dado. Lo usa el editor al serializar. */
52
+ export var serializeMention = function serializeMention(mention) {
53
+ return "[[mention:".concat(mention.type, ":").concat(mention.id, "|").concat(mention.label, "]]");
54
+ };
55
+
56
+ /**
57
+ * Convierte cada `[[mention:...]]` en un link markdown con protocolo propio
58
+ * para que Streamdown lo emita como `<a>` y `CustomLink` lo intercepte.
59
+ */
60
+ export var transformMentionMarkers = function transformMentionMarkers(text) {
61
+ if (!text) return text;
62
+ return text.replace(MENTION_MARKER_REGEX, function (_m, type, id, label) {
63
+ var safeLabel = String(label).replace(/[\\\]]/g, '\\$&');
64
+ return "[".concat(safeLabel, "](").concat(MAIA_MENTION_PROTOCOL).concat(type, "/").concat(encodeURIComponent(String(id)), ")");
65
+ });
66
+ };
67
+ var mentionChildrenToLabel = function mentionChildrenToLabel(children) {
68
+ if (typeof children === 'string') return normalizeContextMentionLabel(children);
69
+ if (children == null || children === false) return '';
70
+ if (Array.isArray(children)) {
71
+ return normalizeContextMentionLabel(children.map(function (c) {
72
+ return typeof c === 'string' ? c : '';
73
+ }).join(''));
74
+ }
75
+ return normalizeContextMentionLabel(String(children));
76
+ };
77
+ var splitLabelFirstWord = function splitLabelFirstWord(label) {
78
+ var normalized = normalizeContextMentionLabel(label).trim();
79
+ if (!normalized) return {
80
+ firstWord: '',
81
+ rest: ''
82
+ };
83
+ var firstWhitespaceIdx = normalized.search(/\s/);
84
+ if (firstWhitespaceIdx < 0) return {
85
+ firstWord: normalized,
86
+ rest: ''
87
+ };
88
+ return {
89
+ firstWord: normalized.slice(0, firstWhitespaceIdx),
90
+ rest: normalized.slice(firstWhitespaceIdx)
91
+ };
92
+ };
93
+ var inlineMentionHoverCss = function inlineMentionHoverCss(type, isClickable) {
94
+ var bg = type === 'project' ? VIOLET_IA_COLORS[100] : MENTION_CHIP_NON_TASK_HOVER_BG;
95
+ return css(["background:", ";opacity:", ";"], bg, isClickable ? 0.95 : 1);
96
+ };
97
+
98
+ /** Span inline estilado (menciones no-task en chat). */
99
+ var SCInlineMention = styled.span.withConfig({
100
+ displayName: "renderContextMentions__SCInlineMention",
101
+ componentId: "sc-f3uz3m-0"
102
+ })(["display:inline;padding:2px 4px;margin:0 1px;border-radius:4px;font-family:var(--cor-typography-font-family,'Work Sans');font-weight:500;font-size:inherit;line-height:inherit;background:", ";color:", ";white-space:normal;overflow-wrap:break-word;word-break:break-word;cursor:", ";text-decoration:none;box-sizing:border-box;&:hover{", "}"], function (_ref) {
103
+ var _MENTION_CHIP_COLORS$;
104
+ var $type = _ref.$type;
105
+ return ((_MENTION_CHIP_COLORS$ = MENTION_CHIP_COLORS[$type]) !== null && _MENTION_CHIP_COLORS$ !== void 0 ? _MENTION_CHIP_COLORS$ : MENTION_CHIP_COLORS.user).bg;
106
+ }, function (_ref2) {
107
+ var _MENTION_CHIP_COLORS$2;
108
+ var $type = _ref2.$type;
109
+ return ((_MENTION_CHIP_COLORS$2 = MENTION_CHIP_COLORS[$type]) !== null && _MENTION_CHIP_COLORS$2 !== void 0 ? _MENTION_CHIP_COLORS$2 : MENTION_CHIP_COLORS.user).fg;
110
+ }, function (_ref3) {
111
+ var $isClickable = _ref3.$isClickable;
112
+ return $isClickable ? 'pointer' : 'default';
113
+ }, function (_ref4) {
114
+ var $type = _ref4.$type,
115
+ $isClickable = _ref4.$isClickable;
116
+ return inlineMentionHoverCss($type, $isClickable);
117
+ });
118
+ var SCInlineMentionIcon = styled.span.withConfig({
119
+ displayName: "renderContextMentions__SCInlineMentionIcon",
120
+ componentId: "sc-f3uz3m-1"
121
+ })(["display:inline-block;vertical-align:middle;margin-right:2px;line-height:1;width:", ";height:", ";"], function (_ref5) {
122
+ var $task = _ref5.$task;
123
+ return $task ? '16px' : '14px';
124
+ }, function (_ref6) {
125
+ var $task = _ref6.$task;
126
+ return $task ? '16px' : '14px';
127
+ });
128
+
129
+ /**
130
+ * Si el href corresponde al protocolo de mention, devuelve un nodo estilado por tipo.
131
+ * Las tareas usan `<a>` como los enlaces de tarea del agente (`.has-task-links`).
132
+ */
133
+ export var renderMentionLink = function renderMentionLink(href, children) {
134
+ if (!href || !href.startsWith(MAIA_MENTION_PROTOCOL)) return null;
135
+ var _parseMentionProtocol = parseMentionProtocolHref(href),
136
+ type = _parseMentionProtocol.type,
137
+ id = _parseMentionProtocol.id;
138
+ var label = mentionChildrenToLabel(children);
139
+ var isTask = type === 'task';
140
+ var iconSize = isTask ? 16 : 14;
141
+ var taskUrl = "/tasks/".concat(id, "/detail");
142
+ var handleTaskClick = function handleTaskClick(e) {
143
+ if (e.metaKey || e.ctrlKey) return;
144
+ e.preventDefault();
145
+ e.stopPropagation();
146
+ openTaskInCorPanel(id, 'detail');
147
+ };
148
+ var handleTaskKeyDown = function handleTaskKeyDown(e) {
149
+ if (e.key !== 'Enter' && e.key !== ' ') return;
150
+ e.preventDefault();
151
+ openTaskInCorPanel(id, 'detail');
152
+ };
153
+ if (isTask) {
154
+ return /*#__PURE__*/_jsx(SCTaskLink, {
155
+ href: taskUrl,
156
+ className: CONTEXT_MENTION_CHIP_CLASS,
157
+ "data-mention-type": type,
158
+ "data-mention-surface": "chat",
159
+ onClick: handleTaskClick,
160
+ onKeyDown: handleTaskKeyDown,
161
+ children: label
162
+ });
163
+ }
164
+ var isProject = type === 'project';
165
+ var projectUrl = isProject ? "/projects/".concat(id, "/dashboard") : null;
166
+ var showIcon = !isProject;
167
+ var _splitLabelFirstWord = splitLabelFirstWord(label),
168
+ firstWord = _splitLabelFirstWord.firstWord,
169
+ rest = _splitLabelFirstWord.rest;
170
+ var handleProjectClick = function handleProjectClick(e) {
171
+ if (!projectUrl) return;
172
+ e.preventDefault();
173
+ e.stopPropagation();
174
+ window.open(projectUrl, '_blank');
175
+ };
176
+ return /*#__PURE__*/_jsxs(SCInlineMention, {
177
+ $type: type,
178
+ $isClickable: isProject,
179
+ className: CONTEXT_MENTION_CHIP_CLASS,
180
+ "data-mention-type": type,
181
+ "data-mention-surface": "chat",
182
+ onClick: isProject ? handleProjectClick : undefined,
183
+ role: isProject ? 'button' : undefined,
184
+ tabIndex: isProject ? 0 : undefined,
185
+ children: [showIcon ? /*#__PURE__*/_jsxs(_Fragment, {
186
+ children: [/*#__PURE__*/_jsxs("span", {
187
+ style: {
188
+ display: 'inline-flex',
189
+ alignItems: 'center',
190
+ whiteSpace: 'nowrap',
191
+ maxWidth: '100%'
192
+ },
193
+ children: [/*#__PURE__*/_jsx(SCInlineMentionIcon, {
194
+ $task: isTask,
195
+ children: getContextMentionIcon(type, MENTION_CHIP_COLORS[type].fg, id, iconSize)
196
+ }), /*#__PURE__*/_jsx("span", {
197
+ style: {
198
+ whiteSpace: 'nowrap'
199
+ },
200
+ children: firstWord
201
+ })]
202
+ }), rest ? /*#__PURE__*/_jsx("span", {
203
+ children: rest
204
+ }) : null]
205
+ }) : null, !showIcon ? label : null]
206
+ });
207
+ };
208
+
209
+ /** Quita los markers del texto, dejando solo `label`. Útil para fallback plano. */
210
+ export var stripMentionMarkers = function stripMentionMarkers(text) {
211
+ return text.replace(MENTION_MARKER_REGEX, function (_m, _type, _id, label) {
212
+ return normalizeContextMentionLabel(String(label));
213
+ });
214
+ };
215
+
216
+ /**
217
+ * Títulos de conversación (p. ej. `last_question` derivado del primer mensaje) pueden
218
+ * incluir el texto serializado `[[mention:type:id|label]]`. Para sidebar y listados,
219
+ * reemplaza cada bloque por `label` en texto plano, sin el marcador crudo.
220
+ */
221
+ export var formatChatListTitleMentions = function formatChatListTitleMentions(text) {
222
+ if (text == null || text === '') return text !== null && text !== void 0 ? text : '';
223
+ var withoutCompleteMarkers = text.replace(MENTION_MARKER_REGEX, function (_m, _type, _id, label) {
224
+ return normalizeContextMentionLabel(String(label).trim());
225
+ });
226
+ return withoutCompleteMarkers.replace(INCOMPLETE_MENTION_MARKER_REGEX, '').trim();
227
+ };
228
+
229
+ /** Genera la URL de navegación para un mention según su tipo. */
230
+ var getMentionUrl = function getMentionUrl(type, id) {
231
+ switch (type) {
232
+ case 'client':
233
+ return "/clients/".concat(id);
234
+ case 'project':
235
+ return "/project/".concat(id, "/dashboard");
236
+ case 'task':
237
+ return "/tasks/".concat(id, "/detail");
238
+ case 'user':
239
+ return null;
240
+ // Los users no son clickeables
241
+ case 'mcp':
242
+ return null;
243
+ default:
244
+ return null;
245
+ }
246
+ };
247
+ var MentionChip = function MentionChip(_ref7) {
248
+ var type = _ref7.type,
249
+ id = _ref7.id,
250
+ label = _ref7.label;
251
+ var normalizedLabel = normalizeContextMentionLabel(label);
252
+ var url = getMentionUrl(type, id);
253
+ var isClickable = !!url;
254
+ var isTask = type === 'task';
255
+ var isProject = type === 'project';
256
+ var showIcon = !isProject;
257
+ var iconSize = isTask ? 16 : 14;
258
+ var _splitLabelFirstWord2 = splitLabelFirstWord(normalizedLabel),
259
+ firstWord = _splitLabelFirstWord2.firstWord,
260
+ rest = _splitLabelFirstWord2.rest;
261
+ var handleClick = function handleClick(e) {
262
+ if (!isClickable || !url) return;
263
+ if (type === 'task') {
264
+ if (e.metaKey || e.ctrlKey) return;
265
+ e.preventDefault();
266
+ e.stopPropagation();
267
+ openTaskInCorPanel(id, 'detail');
268
+ return;
269
+ }
270
+ e.preventDefault();
271
+ window.open(url, '_blank');
272
+ };
273
+ var handleKeyDown = function handleKeyDown(e) {
274
+ if (!isClickable || type !== 'task') return;
275
+ if (e.key !== 'Enter' && e.key !== ' ') return;
276
+ e.preventDefault();
277
+ openTaskInCorPanel(id, 'detail');
278
+ };
279
+ if (type === 'task') {
280
+ return /*#__PURE__*/_jsx(SCTaskLink, {
281
+ href: url !== null && url !== void 0 ? url : '#',
282
+ className: CONTEXT_MENTION_CHIP_CLASS,
283
+ "data-mention-type": "task",
284
+ "data-mention-surface": "chat",
285
+ onClick: handleClick,
286
+ onKeyDown: handleKeyDown,
287
+ children: normalizedLabel
288
+ });
289
+ }
290
+ return /*#__PURE__*/_jsxs(SCInlineMention, {
291
+ $type: type,
292
+ $isClickable: isClickable,
293
+ className: CONTEXT_MENTION_CHIP_CLASS,
294
+ "data-mention-type": type,
295
+ "data-mention-surface": "chat",
296
+ onClick: isClickable ? handleClick : undefined,
297
+ role: isClickable ? 'button' : undefined,
298
+ tabIndex: isClickable ? 0 : undefined,
299
+ children: [showIcon ? /*#__PURE__*/_jsxs(_Fragment, {
300
+ children: [/*#__PURE__*/_jsxs("span", {
301
+ style: {
302
+ display: 'inline-flex',
303
+ alignItems: 'center',
304
+ whiteSpace: 'nowrap',
305
+ maxWidth: '100%'
306
+ },
307
+ children: [/*#__PURE__*/_jsx(SCInlineMentionIcon, {
308
+ $task: isTask,
309
+ children: getContextMentionIcon(type, MENTION_CHIP_COLORS[type].fg, id, iconSize)
310
+ }), /*#__PURE__*/_jsx("span", {
311
+ style: {
312
+ whiteSpace: 'nowrap'
313
+ },
314
+ children: firstWord
315
+ })]
316
+ }), rest ? /*#__PURE__*/_jsx("span", {
317
+ children: rest
318
+ }) : null]
319
+ }) : null, !showIcon ? normalizedLabel : null]
320
+ });
321
+ };
322
+
323
+ /**
324
+ * Splitea el texto por markers y devuelve un array de ReactNodes:
325
+ * texto plano + spans estilados para cada mention. Renderiza directamente
326
+ * sin pasar por Streamdown (no soporta markdown en este modo).
327
+ */
328
+ export var renderTextWithMentions = function renderTextWithMentions(text) {
329
+ if (!text) return [text];
330
+ var out = [];
331
+ var lastIdx = 0;
332
+ MENTION_MARKER_REGEX.lastIndex = 0;
333
+ var match = MENTION_MARKER_REGEX.exec(text);
334
+ var keyIdx = 0;
335
+ while (match) {
336
+ if (match.index > lastIdx) out.push(text.slice(lastIdx, match.index));
337
+ var _match = match,
338
+ _match2 = _slicedToArray(_match, 4),
339
+ rawType = _match2[1],
340
+ id = _match2[2],
341
+ label = _match2[3];
342
+ var type = ALLOWED_TYPES.includes(rawType) ? rawType : 'user';
343
+ out.push(/*#__PURE__*/_jsx(MentionChip, {
344
+ type: type,
345
+ id: id,
346
+ label: label
347
+ }, "mention-".concat(keyIdx, "-").concat(match.index)));
348
+ lastIdx = match.index + match[0].length;
349
+ keyIdx += 1;
350
+ match = MENTION_MARKER_REGEX.exec(text);
351
+ }
352
+ if (lastIdx < text.length) out.push(text.slice(lastIdx));
353
+ return out;
354
+ };
355
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzdHlsZWQiLCJjc3MiLCJDT05URVhUX01FTlRJT05fQ0hJUF9DTEFTUyIsIk1FTlRJT05fQ0hJUF9DT0xPUlMiLCJNRU5USU9OX0NISVBfTk9OX1RBU0tfSE9WRVJfQkciLCJWSU9MRVRfSUFfQ09MT1JTIiwiU0NUYXNrTGluayIsImdldENvbnRleHRNZW50aW9uSWNvbiIsIm5vcm1hbGl6ZUNvbnRleHRNZW50aW9uTGFiZWwiLCJvcGVuVGFza0luQ29yUGFuZWwiLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwiRnJhZ21lbnQiLCJfRnJhZ21lbnQiLCJNRU5USU9OX01BUktFUl9SRUdFWCIsIk1BSUFfTUVOVElPTl9QUk9UT0NPTCIsIklOQ09NUExFVEVfTUVOVElPTl9NQVJLRVJfUkVHRVgiLCJBTExPV0VEX1RZUEVTIiwicGFyc2VNZW50aW9uUHJvdG9jb2xIcmVmIiwiaHJlZiIsInJlc3QiLCJzbGljZSIsImxlbmd0aCIsInNsYXNoSWR4IiwiaW5kZXhPZiIsInJhd1R5cGUiLCJyYXdJZCIsImlkIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiX3VudXNlZCIsInR5cGUiLCJpbmNsdWRlcyIsInNlcmlhbGl6ZU1lbnRpb24iLCJtZW50aW9uIiwiY29uY2F0IiwibGFiZWwiLCJ0cmFuc2Zvcm1NZW50aW9uTWFya2VycyIsInRleHQiLCJyZXBsYWNlIiwiX20iLCJzYWZlTGFiZWwiLCJTdHJpbmciLCJlbmNvZGVVUklDb21wb25lbnQiLCJtZW50aW9uQ2hpbGRyZW5Ub0xhYmVsIiwiY2hpbGRyZW4iLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJjIiwiam9pbiIsInNwbGl0TGFiZWxGaXJzdFdvcmQiLCJub3JtYWxpemVkIiwidHJpbSIsImZpcnN0V29yZCIsImZpcnN0V2hpdGVzcGFjZUlkeCIsInNlYXJjaCIsImlubGluZU1lbnRpb25Ib3ZlckNzcyIsImlzQ2xpY2thYmxlIiwiYmciLCJTQ0lubGluZU1lbnRpb24iLCJzcGFuIiwid2l0aENvbmZpZyIsImRpc3BsYXlOYW1lIiwiY29tcG9uZW50SWQiLCJfcmVmIiwiX01FTlRJT05fQ0hJUF9DT0xPUlMkIiwiJHR5cGUiLCJ1c2VyIiwiX3JlZjIiLCJfTUVOVElPTl9DSElQX0NPTE9SUyQyIiwiZmciLCJfcmVmMyIsIiRpc0NsaWNrYWJsZSIsIl9yZWY0IiwiU0NJbmxpbmVNZW50aW9uSWNvbiIsIl9yZWY1IiwiJHRhc2siLCJfcmVmNiIsInJlbmRlck1lbnRpb25MaW5rIiwic3RhcnRzV2l0aCIsIl9wYXJzZU1lbnRpb25Qcm90b2NvbCIsImlzVGFzayIsImljb25TaXplIiwidGFza1VybCIsImhhbmRsZVRhc2tDbGljayIsImUiLCJtZXRhS2V5IiwiY3RybEtleSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiaGFuZGxlVGFza0tleURvd24iLCJrZXkiLCJjbGFzc05hbWUiLCJvbkNsaWNrIiwib25LZXlEb3duIiwiaXNQcm9qZWN0IiwicHJvamVjdFVybCIsInNob3dJY29uIiwiX3NwbGl0TGFiZWxGaXJzdFdvcmQiLCJoYW5kbGVQcm9qZWN0Q2xpY2siLCJ3aW5kb3ciLCJvcGVuIiwidW5kZWZpbmVkIiwicm9sZSIsInRhYkluZGV4Iiwic3R5bGUiLCJkaXNwbGF5IiwiYWxpZ25JdGVtcyIsIndoaXRlU3BhY2UiLCJtYXhXaWR0aCIsInN0cmlwTWVudGlvbk1hcmtlcnMiLCJfdHlwZSIsIl9pZCIsImZvcm1hdENoYXRMaXN0VGl0bGVNZW50aW9ucyIsIndpdGhvdXRDb21wbGV0ZU1hcmtlcnMiLCJnZXRNZW50aW9uVXJsIiwiTWVudGlvbkNoaXAiLCJfcmVmNyIsIm5vcm1hbGl6ZWRMYWJlbCIsInVybCIsIl9zcGxpdExhYmVsRmlyc3RXb3JkMiIsImhhbmRsZUNsaWNrIiwiaGFuZGxlS2V5RG93biIsInJlbmRlclRleHRXaXRoTWVudGlvbnMiLCJvdXQiLCJsYXN0SWR4IiwibGFzdEluZGV4IiwibWF0Y2giLCJleGVjIiwia2V5SWR4IiwiaW5kZXgiLCJwdXNoIiwiX21hdGNoIiwiX21hdGNoMiIsIl9zbGljZWRUb0FycmF5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3JlbmRlckNvbnRleHRNZW50aW9ucy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhY3ROb2RlLCBSZWFjdEVsZW1lbnQsIE1vdXNlRXZlbnQsIEtleWJvYXJkRXZlbnQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBzdHlsZWQsIHsgY3NzIH0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnXG5pbXBvcnQgeyBDb250ZXh0RW50aXR5VHlwZSwgQ29udGV4dE1lbnRpb24sIENPTlRFWFRfTUVOVElPTl9DSElQX0NMQVNTIH0gZnJvbSAnLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQge1xuICBNRU5USU9OX0NISVBfQ09MT1JTLFxuICBNRU5USU9OX0NISVBfTk9OX1RBU0tfSE9WRVJfQkcsXG59IGZyb20gJy4uL2NvbXBvbmVudHMvYXRvbXMvQ29udGV4dE1lbnRpb25DaGlwL0NvbnRleHRNZW50aW9uQ2hpcC5zdHlsZXMnXG5pbXBvcnQgeyBWSU9MRVRfSUFfQ09MT1JTIH0gZnJvbSAnLi4vc3R5bGVzL2NvbmZpZydcbmltcG9ydCB7IFNDVGFza0xpbmsgfSBmcm9tICcuLi9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0QUlNZXNzYWdlcy9uZXdTdHlsZXMnXG5pbXBvcnQgeyBnZXRDb250ZXh0TWVudGlvbkljb24gfSBmcm9tICcuL2NvbnRleHRNZW50aW9uSWNvbnMnXG5pbXBvcnQgeyBub3JtYWxpemVDb250ZXh0TWVudGlvbkxhYmVsIH0gZnJvbSAnLi9jb250ZXh0TWVudGlvbkxhYmVsJ1xuaW1wb3J0IHsgb3BlblRhc2tJbkNvclBhbmVsIH0gZnJvbSAnLi9vcGVuVGFza0luQ29yUGFuZWwnXG5cbi8qKlxuICogRm9ybWF0byBkZWwgbWFyY2Fkb3IgcXVlIHZpYWphIGVuIGVsIHRleHRvIGRlbCBtZW5zYWplOlxuICogICBbW21lbnRpb246PHR5cGU+OjxpZD58PGxhYmVsPl1dXG4gKlxuICogRWwgZWRpdG9yIGxvIGVtaXRlIGN1YW5kbyBzZXJpYWxpemEgZWwgY29udGVudGVkaXRhYmxlLCBlbCBiYWNrZW5kIGxvXG4gKiBwZXJzaXN0ZSB0YWwgY3VhbCB5IGFsIHJlbmRlcml6YXIgc2UgdHJhbnNmb3JtYSBlbiB1biBsaW5rIG1hcmtkb3duIGNvblxuICogdW4gcHJvdG9jb2xvIHByb3BpbyBxdWUgYEN1c3RvbUxpbmtgIGludGVyY2VwdGEgeSBkaWJ1amEgY29tbyBzcGFuXG4gKiBlc3RpbGFkby5cbiAqXG4gKiBQb3Igc2VwYXJhZG8sIGxhIG1ldGFkYXRhIGBjb250ZXh0X21lc3NhZ2VgIGxsZXZhIGxvcyB2YWxvcmVzIGxpbXBpb3NcbiAqIChpZCArIG5hbWUpIHBhcmEgcXVlIGVsIGJhY2tlbmQgcHVlZGEgaW50ZXJwcmV0YXIgbGFzIGVudGlkYWRlcyBzaW5cbiAqIHRlbmVyIHF1ZSBwYXJzZWFyIGVsIHRleHRvLlxuICovXG4vKipcbiAqIExhYmVsIHB1ZWRlIGNvbnRlbmVyIGBdYCAoZWo6IFwiW0VkdWNhdGVdQmxvZyBQb3N0IC4uLlwiKSwgcG9yIGVzb1xuICogc2UgY2FwdHVyYSBkZSBmb3JtYSBsYXp5IGhhc3RhIGVsIGNpZXJyZSByZWFsIGBdXWAuXG4gKi9cbmV4cG9ydCBjb25zdCBNRU5USU9OX01BUktFUl9SRUdFWCA9IC9cXFtcXFttZW50aW9uOihjbGllbnR8cHJvamVjdHx0YXNrfHVzZXJ8bWNwKTooW158XFxdXSspXFx8KFtcXHNcXFNdKj8pXFxdXFxdL2dcbmV4cG9ydCBjb25zdCBNQUlBX01FTlRJT05fUFJPVE9DT0wgPSAnbWFpYS1tZW50aW9uOi8vJ1xuY29uc3QgSU5DT01QTEVURV9NRU5USU9OX01BUktFUl9SRUdFWCA9IC9cXFtcXFttZW50aW9uOltcXHNcXFNdKiQvXG5cbmNvbnN0IEFMTE9XRURfVFlQRVM6IENvbnRleHRFbnRpdHlUeXBlW10gPSBbJ2NsaWVudCcsICdwcm9qZWN0JywgJ3Rhc2snLCAndXNlcicsICdtY3AnXVxuXG5jb25zdCBwYXJzZU1lbnRpb25Qcm90b2NvbEhyZWYgPSAoaHJlZjogc3RyaW5nKTogeyB0eXBlOiBDb250ZXh0RW50aXR5VHlwZTsgaWQ6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgcmVzdCA9IGhyZWYuc2xpY2UoTUFJQV9NRU5USU9OX1BST1RPQ09MLmxlbmd0aClcbiAgY29uc3Qgc2xhc2hJZHggPSByZXN0LmluZGV4T2YoJy8nKVxuICBjb25zdCByYXdUeXBlID0gc2xhc2hJZHggPj0gMCA/IHJlc3Quc2xpY2UoMCwgc2xhc2hJZHgpIDogcmVzdFxuICBjb25zdCByYXdJZCA9IHNsYXNoSWR4ID49IDAgPyByZXN0LnNsaWNlKHNsYXNoSWR4ICsgMSkgOiAnJ1xuICBsZXQgaWQgPSAnJ1xuICB0cnkge1xuICAgIGlkID0gcmF3SWQgPyBkZWNvZGVVUklDb21wb25lbnQocmF3SWQpIDogJydcbiAgfSBjYXRjaCB7XG4gICAgaWQgPSByYXdJZFxuICB9XG4gIGNvbnN0IHR5cGUgPSBBTExPV0VEX1RZUEVTLmluY2x1ZGVzKHJhd1R5cGUgYXMgQ29udGV4dEVudGl0eVR5cGUpID8gKHJhd1R5cGUgYXMgQ29udGV4dEVudGl0eVR5cGUpIDogJ3VzZXInXG4gIHJldHVybiB7IHR5cGUsIGlkIH1cbn1cblxuLyoqIEdlbmVyYSBlbCBtYXJjYWRvciBwYXJhIHVuIG1lbnRpb24gZGFkby4gTG8gdXNhIGVsIGVkaXRvciBhbCBzZXJpYWxpemFyLiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZU1lbnRpb24gPSAobWVudGlvbjogQ29udGV4dE1lbnRpb24pOiBzdHJpbmcgPT5cbiAgYFtbbWVudGlvbjoke21lbnRpb24udHlwZX06JHttZW50aW9uLmlkfXwke21lbnRpb24ubGFiZWx9XV1gXG5cbi8qKlxuICogQ29udmllcnRlIGNhZGEgYFtbbWVudGlvbjouLi5dXWAgZW4gdW4gbGluayBtYXJrZG93biBjb24gcHJvdG9jb2xvIHByb3Bpb1xuICogcGFyYSBxdWUgU3RyZWFtZG93biBsbyBlbWl0YSBjb21vIGA8YT5gIHkgYEN1c3RvbUxpbmtgIGxvIGludGVyY2VwdGUuXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1NZW50aW9uTWFya2VycyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXRleHQpIHJldHVybiB0ZXh0XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoTUVOVElPTl9NQVJLRVJfUkVHRVgsIChfbSwgdHlwZSwgaWQsIGxhYmVsKSA9PiB7XG4gICAgY29uc3Qgc2FmZUxhYmVsID0gU3RyaW5nKGxhYmVsKS5yZXBsYWNlKC9bXFxcXFxcXV0vZywgJ1xcXFwkJicpXG4gICAgcmV0dXJuIGBbJHtzYWZlTGFiZWx9XSgke01BSUFfTUVOVElPTl9QUk9UT0NPTH0ke3R5cGV9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhpZCkpfSlgXG4gIH0pXG59XG5cbmNvbnN0IG1lbnRpb25DaGlsZHJlblRvTGFiZWwgPSAoY2hpbGRyZW46IFJlYWN0Tm9kZSk6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnKSByZXR1cm4gbm9ybWFsaXplQ29udGV4dE1lbnRpb25MYWJlbChjaGlsZHJlbilcbiAgaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4gPT09IGZhbHNlKSByZXR1cm4gJydcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUNvbnRleHRNZW50aW9uTGFiZWwoY2hpbGRyZW4ubWFwKGMgPT4gKHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAnJykpLmpvaW4oJycpKVxuICB9XG4gIHJldHVybiBub3JtYWxpemVDb250ZXh0TWVudGlvbkxhYmVsKFN0cmluZyhjaGlsZHJlbikpXG59XG5cbmNvbnN0IHNwbGl0TGFiZWxGaXJzdFdvcmQgPSAobGFiZWw6IHN0cmluZyk6IHsgZmlyc3RXb3JkOiBzdHJpbmc7IHJlc3Q6IHN0cmluZyB9ID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUNvbnRleHRNZW50aW9uTGFiZWwobGFiZWwpLnRyaW0oKVxuICBpZiAoIW5vcm1hbGl6ZWQpIHJldHVybiB7IGZpcnN0V29yZDogJycsIHJlc3Q6ICcnIH1cbiAgY29uc3QgZmlyc3RXaGl0ZXNwYWNlSWR4ID0gbm9ybWFsaXplZC5zZWFyY2goL1xccy8pXG4gIGlmIChmaXJzdFdoaXRlc3BhY2VJZHggPCAwKSByZXR1cm4geyBmaXJzdFdvcmQ6IG5vcm1hbGl6ZWQsIHJlc3Q6ICcnIH1cbiAgcmV0dXJuIHtcbiAgICBmaXJzdFdvcmQ6IG5vcm1hbGl6ZWQuc2xpY2UoMCwgZmlyc3RXaGl0ZXNwYWNlSWR4KSxcbiAgICByZXN0OiBub3JtYWxpemVkLnNsaWNlKGZpcnN0V2hpdGVzcGFjZUlkeCksXG4gIH1cbn1cblxuY29uc3QgaW5saW5lTWVudGlvbkhvdmVyQ3NzID0gKHR5cGU6IENvbnRleHRFbnRpdHlUeXBlLCBpc0NsaWNrYWJsZT86IGJvb2xlYW4pID0+IHtcbiAgY29uc3QgYmcgPSB0eXBlID09PSAncHJvamVjdCcgPyBWSU9MRVRfSUFfQ09MT1JTWzEwMF0gOiBNRU5USU9OX0NISVBfTk9OX1RBU0tfSE9WRVJfQkdcbiAgcmV0dXJuIGNzc2BcbiAgICBiYWNrZ3JvdW5kOiAke2JnfTtcbiAgICBvcGFjaXR5OiAke2lzQ2xpY2thYmxlID8gMC45NSA6IDF9O1xuICBgXG59XG5cbi8qKiBTcGFuIGlubGluZSBlc3RpbGFkbyAobWVuY2lvbmVzIG5vLXRhc2sgZW4gY2hhdCkuICovXG5jb25zdCBTQ0lubGluZU1lbnRpb24gPSBzdHlsZWQuc3Bhbjx7ICR0eXBlOiBDb250ZXh0RW50aXR5VHlwZTsgJGlzQ2xpY2thYmxlPzogYm9vbGVhbiB9PmBcbiAgZGlzcGxheTogaW5saW5lO1xuICBwYWRkaW5nOiAycHggNHB4O1xuICBtYXJnaW46IDAgMXB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1jb3ItdHlwb2dyYXBoeS1mb250LWZhbWlseSwgJ1dvcmsgU2FucycpO1xuICBmb250LXdlaWdodDogNTAwO1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICBiYWNrZ3JvdW5kOiAkeyh7ICR0eXBlIH0pID0+IChNRU5USU9OX0NISVBfQ09MT1JTWyR0eXBlXSA/PyBNRU5USU9OX0NISVBfQ09MT1JTLnVzZXIpLmJnfTtcbiAgY29sb3I6ICR7KHsgJHR5cGUgfSkgPT4gKE1FTlRJT05fQ0hJUF9DT0xPUlNbJHR5cGVdID8/IE1FTlRJT05fQ0hJUF9DT0xPUlMudXNlcikuZmd9O1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xuICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xuICBjdXJzb3I6ICR7KHsgJGlzQ2xpY2thYmxlIH0pID0+ICgkaXNDbGlja2FibGUgPyAncG9pbnRlcicgOiAnZGVmYXVsdCcpfTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXG4gICY6aG92ZXIge1xuICAgICR7KHsgJHR5cGUsICRpc0NsaWNrYWJsZSB9KSA9PiBpbmxpbmVNZW50aW9uSG92ZXJDc3MoJHR5cGUsICRpc0NsaWNrYWJsZSl9XG4gIH1cbmBcblxuY29uc3QgU0NJbmxpbmVNZW50aW9uSWNvbiA9IHN0eWxlZC5zcGFuPHsgJHRhc2s/OiBib29sZWFuIH0+YFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xuICBsaW5lLWhlaWdodDogMTtcbiAgd2lkdGg6ICR7KHsgJHRhc2sgfSkgPT4gKCR0YXNrID8gJzE2cHgnIDogJzE0cHgnKX07XG4gIGhlaWdodDogJHsoeyAkdGFzayB9KSA9PiAoJHRhc2sgPyAnMTZweCcgOiAnMTRweCcpfTtcbmBcblxuLyoqXG4gKiBTaSBlbCBocmVmIGNvcnJlc3BvbmRlIGFsIHByb3RvY29sbyBkZSBtZW50aW9uLCBkZXZ1ZWx2ZSB1biBub2RvIGVzdGlsYWRvIHBvciB0aXBvLlxuICogTGFzIHRhcmVhcyB1c2FuIGA8YT5gIGNvbW8gbG9zIGVubGFjZXMgZGUgdGFyZWEgZGVsIGFnZW50ZSAoYC5oYXMtdGFzay1saW5rc2ApLlxuICovXG5leHBvcnQgY29uc3QgcmVuZGVyTWVudGlvbkxpbmsgPSAoaHJlZjogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaGlsZHJlbjogUmVhY3ROb2RlKTogUmVhY3ROb2RlIHwgbnVsbCA9PiB7XG4gIGlmICghaHJlZiB8fCAhaHJlZi5zdGFydHNXaXRoKE1BSUFfTUVOVElPTl9QUk9UT0NPTCkpIHJldHVybiBudWxsXG4gIGNvbnN0IHsgdHlwZSwgaWQgfSA9IHBhcnNlTWVudGlvblByb3RvY29sSHJlZihocmVmKVxuICBjb25zdCBsYWJlbCA9IG1lbnRpb25DaGlsZHJlblRvTGFiZWwoY2hpbGRyZW4pXG4gIGNvbnN0IGlzVGFzayA9IHR5cGUgPT09ICd0YXNrJ1xuICBjb25zdCBpY29uU2l6ZSA9IGlzVGFzayA/IDE2IDogMTRcbiAgY29uc3QgdGFza1VybCA9IGAvdGFza3MvJHtpZH0vZGV0YWlsYFxuXG4gIGNvbnN0IGhhbmRsZVRhc2tDbGljayA9IChlOiBNb3VzZUV2ZW50PEhUTUxBbmNob3JFbGVtZW50PikgPT4ge1xuICAgIGlmIChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSByZXR1cm5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgb3BlblRhc2tJbkNvclBhbmVsKGlkLCAnZGV0YWlsJylcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVRhc2tLZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQ8SFRNTEFuY2hvckVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGUua2V5ICE9PSAnRW50ZXInICYmIGUua2V5ICE9PSAnICcpIHJldHVyblxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIG9wZW5UYXNrSW5Db3JQYW5lbChpZCwgJ2RldGFpbCcpXG4gIH1cblxuICBpZiAoaXNUYXNrKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTQ1Rhc2tMaW5rXG4gICAgICAgIGhyZWY9e3Rhc2tVcmx9XG4gICAgICAgIGNsYXNzTmFtZT17Q09OVEVYVF9NRU5USU9OX0NISVBfQ0xBU1N9XG4gICAgICAgIGRhdGEtbWVudGlvbi10eXBlPXt0eXBlfVxuICAgICAgICBkYXRhLW1lbnRpb24tc3VyZmFjZT1cImNoYXRcIlxuICAgICAgICBvbkNsaWNrPXtoYW5kbGVUYXNrQ2xpY2t9XG4gICAgICAgIG9uS2V5RG93bj17aGFuZGxlVGFza0tleURvd259XG4gICAgICA+XG4gICAgICAgIHtsYWJlbH1cbiAgICAgIDwvU0NUYXNrTGluaz5cbiAgICApXG4gIH1cblxuICBjb25zdCBpc1Byb2plY3QgPSB0eXBlID09PSAncHJvamVjdCdcbiAgY29uc3QgcHJvamVjdFVybCA9IGlzUHJvamVjdCA/IGAvcHJvamVjdHMvJHtpZH0vZGFzaGJvYXJkYCA6IG51bGxcbiAgY29uc3Qgc2hvd0ljb24gPSAhaXNQcm9qZWN0XG4gIGNvbnN0IHsgZmlyc3RXb3JkLCByZXN0IH0gPSBzcGxpdExhYmVsRmlyc3RXb3JkKGxhYmVsKVxuXG4gIGNvbnN0IGhhbmRsZVByb2plY3RDbGljayA9IChlOiBNb3VzZUV2ZW50PEhUTUxTcGFuRWxlbWVudD4pID0+IHtcbiAgICBpZiAoIXByb2plY3RVcmwpIHJldHVyblxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB3aW5kb3cub3Blbihwcm9qZWN0VXJsLCAnX2JsYW5rJylcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDSW5saW5lTWVudGlvblxuICAgICAgJHR5cGU9e3R5cGV9XG4gICAgICAkaXNDbGlja2FibGU9e2lzUHJvamVjdH1cbiAgICAgIGNsYXNzTmFtZT17Q09OVEVYVF9NRU5USU9OX0NISVBfQ0xBU1N9XG4gICAgICBkYXRhLW1lbnRpb24tdHlwZT17dHlwZX1cbiAgICAgIGRhdGEtbWVudGlvbi1zdXJmYWNlPVwiY2hhdFwiXG4gICAgICBvbkNsaWNrPXtpc1Byb2plY3QgPyBoYW5kbGVQcm9qZWN0Q2xpY2sgOiB1bmRlZmluZWR9XG4gICAgICByb2xlPXtpc1Byb2plY3QgPyAnYnV0dG9uJyA6IHVuZGVmaW5lZH1cbiAgICAgIHRhYkluZGV4PXtpc1Byb2plY3QgPyAwIDogdW5kZWZpbmVkfVxuICAgID5cbiAgICAgIHtzaG93SWNvbiA/IChcbiAgICAgICAgPD5cbiAgICAgICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgd2hpdGVTcGFjZTogJ25vd3JhcCcsIG1heFdpZHRoOiAnMTAwJScgfX0+XG4gICAgICAgICAgICA8U0NJbmxpbmVNZW50aW9uSWNvbiAkdGFzaz17aXNUYXNrfT5cbiAgICAgICAgICAgICAge2dldENvbnRleHRNZW50aW9uSWNvbih0eXBlLCBNRU5USU9OX0NISVBfQ09MT1JTW3R5cGVdLmZnLCBpZCwgaWNvblNpemUpfVxuICAgICAgICAgICAgPC9TQ0lubGluZU1lbnRpb25JY29uPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgd2hpdGVTcGFjZTogJ25vd3JhcCcgfX0+e2ZpcnN0V29yZH08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtyZXN0ID8gPHNwYW4+e3Jlc3R9PC9zcGFuPiA6IG51bGx9XG4gICAgICAgIDwvPlxuICAgICAgKSA6IG51bGx9XG4gICAgICB7IXNob3dJY29uID8gbGFiZWwgOiBudWxsfVxuICAgIDwvU0NJbmxpbmVNZW50aW9uPlxuICApXG59XG5cbi8qKiBRdWl0YSBsb3MgbWFya2VycyBkZWwgdGV4dG8sIGRlamFuZG8gc29sbyBgbGFiZWxgLiDDmnRpbCBwYXJhIGZhbGxiYWNrIHBsYW5vLiAqL1xuZXhwb3J0IGNvbnN0IHN0cmlwTWVudGlvbk1hcmtlcnMgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG4gIHRleHQucmVwbGFjZShNRU5USU9OX01BUktFUl9SRUdFWCwgKF9tLCBfdHlwZSwgX2lkLCBsYWJlbCkgPT4gbm9ybWFsaXplQ29udGV4dE1lbnRpb25MYWJlbChTdHJpbmcobGFiZWwpKSlcblxuLyoqXG4gKiBUw610dWxvcyBkZSBjb252ZXJzYWNpw7NuIChwLiBlai4gYGxhc3RfcXVlc3Rpb25gIGRlcml2YWRvIGRlbCBwcmltZXIgbWVuc2FqZSkgcHVlZGVuXG4gKiBpbmNsdWlyIGVsIHRleHRvIHNlcmlhbGl6YWRvIGBbW21lbnRpb246dHlwZTppZHxsYWJlbF1dYC4gUGFyYSBzaWRlYmFyIHkgbGlzdGFkb3MsXG4gKiByZWVtcGxhemEgY2FkYSBibG9xdWUgcG9yIGBsYWJlbGAgZW4gdGV4dG8gcGxhbm8sIHNpbiBlbCBtYXJjYWRvciBjcnVkby5cbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdENoYXRMaXN0VGl0bGVNZW50aW9ucyA9ICh0ZXh0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0ID09PSAnJykgcmV0dXJuIHRleHQgPz8gJydcbiAgY29uc3Qgd2l0aG91dENvbXBsZXRlTWFya2VycyA9IHRleHQucmVwbGFjZShNRU5USU9OX01BUktFUl9SRUdFWCwgKF9tLCBfdHlwZSwgX2lkLCBsYWJlbCkgPT5cbiAgICBub3JtYWxpemVDb250ZXh0TWVudGlvbkxhYmVsKFN0cmluZyhsYWJlbCkudHJpbSgpKVxuICApXG4gIHJldHVybiB3aXRob3V0Q29tcGxldGVNYXJrZXJzLnJlcGxhY2UoSU5DT01QTEVURV9NRU5USU9OX01BUktFUl9SRUdFWCwgJycpLnRyaW0oKVxufVxuXG4vKiogR2VuZXJhIGxhIFVSTCBkZSBuYXZlZ2FjacOzbiBwYXJhIHVuIG1lbnRpb24gc2Vnw7puIHN1IHRpcG8uICovXG5jb25zdCBnZXRNZW50aW9uVXJsID0gKHR5cGU6IENvbnRleHRFbnRpdHlUeXBlLCBpZDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2NsaWVudCc6XG4gICAgICByZXR1cm4gYC9jbGllbnRzLyR7aWR9YFxuICAgIGNhc2UgJ3Byb2plY3QnOlxuICAgICAgcmV0dXJuIGAvcHJvamVjdC8ke2lkfS9kYXNoYm9hcmRgXG4gICAgY2FzZSAndGFzayc6XG4gICAgICByZXR1cm4gYC90YXNrcy8ke2lkfS9kZXRhaWxgXG4gICAgY2FzZSAndXNlcic6XG4gICAgICByZXR1cm4gbnVsbCAvLyBMb3MgdXNlcnMgbm8gc29uIGNsaWNrZWFibGVzXG4gICAgY2FzZSAnbWNwJzpcbiAgICAgIHJldHVybiBudWxsXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuY29uc3QgTWVudGlvbkNoaXAgPSAoeyB0eXBlLCBpZCwgbGFiZWwgfTogeyB0eXBlOiBDb250ZXh0RW50aXR5VHlwZTsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9KSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRMYWJlbCA9IG5vcm1hbGl6ZUNvbnRleHRNZW50aW9uTGFiZWwobGFiZWwpXG4gIGNvbnN0IHVybCA9IGdldE1lbnRpb25VcmwodHlwZSwgaWQpXG4gIGNvbnN0IGlzQ2xpY2thYmxlID0gISF1cmxcbiAgY29uc3QgaXNUYXNrID0gdHlwZSA9PT0gJ3Rhc2snXG4gIGNvbnN0IGlzUHJvamVjdCA9IHR5cGUgPT09ICdwcm9qZWN0J1xuICBjb25zdCBzaG93SWNvbiA9ICFpc1Byb2plY3RcbiAgY29uc3QgaWNvblNpemUgPSBpc1Rhc2sgPyAxNiA6IDE0XG4gIGNvbnN0IHsgZmlyc3RXb3JkLCByZXN0IH0gPSBzcGxpdExhYmVsRmlyc3RXb3JkKG5vcm1hbGl6ZWRMYWJlbClcblxuICBjb25zdCBoYW5kbGVDbGljayA9IChlOiBNb3VzZUV2ZW50PEhUTUxBbmNob3JFbGVtZW50IHwgSFRNTFNwYW5FbGVtZW50PikgPT4ge1xuICAgIGlmICghaXNDbGlja2FibGUgfHwgIXVybCkgcmV0dXJuXG4gICAgaWYgKHR5cGUgPT09ICd0YXNrJykge1xuICAgICAgaWYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHJldHVyblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICBvcGVuVGFza0luQ29yUGFuZWwoaWQsICdkZXRhaWwnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpXG4gIH1cblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQ8SFRNTEFuY2hvckVsZW1lbnQgfCBIVE1MU3BhbkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFpc0NsaWNrYWJsZSB8fCB0eXBlICE9PSAndGFzaycpIHJldHVyblxuICAgIGlmIChlLmtleSAhPT0gJ0VudGVyJyAmJiBlLmtleSAhPT0gJyAnKSByZXR1cm5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBvcGVuVGFza0luQ29yUGFuZWwoaWQsICdkZXRhaWwnKVxuICB9XG5cbiAgaWYgKHR5cGUgPT09ICd0YXNrJykge1xuICAgIHJldHVybiAoXG4gICAgICA8U0NUYXNrTGlua1xuICAgICAgICBocmVmPXt1cmwgPz8gJyMnfVxuICAgICAgICBjbGFzc05hbWU9e0NPTlRFWFRfTUVOVElPTl9DSElQX0NMQVNTfVxuICAgICAgICBkYXRhLW1lbnRpb24tdHlwZT1cInRhc2tcIlxuICAgICAgICBkYXRhLW1lbnRpb24tc3VyZmFjZT1cImNoYXRcIlxuICAgICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgICAgb25LZXlEb3duPXtoYW5kbGVLZXlEb3dufVxuICAgICAgPlxuICAgICAgICB7bm9ybWFsaXplZExhYmVsfVxuICAgICAgPC9TQ1Rhc2tMaW5rPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDSW5saW5lTWVudGlvblxuICAgICAgJHR5cGU9e3R5cGV9XG4gICAgICAkaXNDbGlja2FibGU9e2lzQ2xpY2thYmxlfVxuICAgICAgY2xhc3NOYW1lPXtDT05URVhUX01FTlRJT05fQ0hJUF9DTEFTU31cbiAgICAgIGRhdGEtbWVudGlvbi10eXBlPXt0eXBlfVxuICAgICAgZGF0YS1tZW50aW9uLXN1cmZhY2U9XCJjaGF0XCJcbiAgICAgIG9uQ2xpY2s9e2lzQ2xpY2thYmxlID8gaGFuZGxlQ2xpY2sgOiB1bmRlZmluZWR9XG4gICAgICByb2xlPXtpc0NsaWNrYWJsZSA/ICdidXR0b24nIDogdW5kZWZpbmVkfVxuICAgICAgdGFiSW5kZXg9e2lzQ2xpY2thYmxlID8gMCA6IHVuZGVmaW5lZH1cbiAgICA+XG4gICAgICB7c2hvd0ljb24gPyAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZGlzcGxheTogJ2lubGluZS1mbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIHdoaXRlU3BhY2U6ICdub3dyYXAnLCBtYXhXaWR0aDogJzEwMCUnIH19PlxuICAgICAgICAgICAgPFNDSW5saW5lTWVudGlvbkljb24gJHRhc2s9e2lzVGFza30+XG4gICAgICAgICAgICAgIHtnZXRDb250ZXh0TWVudGlvbkljb24odHlwZSwgTUVOVElPTl9DSElQX0NPTE9SU1t0eXBlXS5mZywgaWQsIGljb25TaXplKX1cbiAgICAgICAgICAgIDwvU0NJbmxpbmVNZW50aW9uSWNvbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IHdoaXRlU3BhY2U6ICdub3dyYXAnIH19PntmaXJzdFdvcmR9PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7cmVzdCA/IDxzcGFuPntyZXN0fTwvc3Bhbj4gOiBudWxsfVxuICAgICAgICA8Lz5cbiAgICAgICkgOiBudWxsfVxuICAgICAgeyFzaG93SWNvbiA/IG5vcm1hbGl6ZWRMYWJlbCA6IG51bGx9XG4gICAgPC9TQ0lubGluZU1lbnRpb24+XG4gIClcbn1cblxuLyoqXG4gKiBTcGxpdGVhIGVsIHRleHRvIHBvciBtYXJrZXJzIHkgZGV2dWVsdmUgdW4gYXJyYXkgZGUgUmVhY3ROb2RlczpcbiAqIHRleHRvIHBsYW5vICsgc3BhbnMgZXN0aWxhZG9zIHBhcmEgY2FkYSBtZW50aW9uLiBSZW5kZXJpemEgZGlyZWN0YW1lbnRlXG4gKiBzaW4gcGFzYXIgcG9yIFN0cmVhbWRvd24gKG5vIHNvcG9ydGEgbWFya2Rvd24gZW4gZXN0ZSBtb2RvKS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlclRleHRXaXRoTWVudGlvbnMgPSAodGV4dDogc3RyaW5nKTogQXJyYXk8c3RyaW5nIHwgUmVhY3RFbGVtZW50PiA9PiB7XG4gIGlmICghdGV4dCkgcmV0dXJuIFt0ZXh0XVxuICBjb25zdCBvdXQ6IEFycmF5PHN0cmluZyB8IFJlYWN0RWxlbWVudD4gPSBbXVxuICBsZXQgbGFzdElkeCA9IDBcbiAgTUVOVElPTl9NQVJLRVJfUkVHRVgubGFzdEluZGV4ID0gMFxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBNRU5USU9OX01BUktFUl9SRUdFWC5leGVjKHRleHQpXG4gIGxldCBrZXlJZHggPSAwXG4gIHdoaWxlIChtYXRjaCkge1xuICAgIGlmIChtYXRjaC5pbmRleCA+IGxhc3RJZHgpIG91dC5wdXNoKHRleHQuc2xpY2UobGFzdElkeCwgbWF0Y2guaW5kZXgpKVxuICAgIGNvbnN0IFssIHJhd1R5cGUsIGlkLCBsYWJlbF0gPSBtYXRjaFxuICAgIGNvbnN0IHR5cGUgPSBBTExPV0VEX1RZUEVTLmluY2x1ZGVzKHJhd1R5cGUgYXMgQ29udGV4dEVudGl0eVR5cGUpID8gKHJhd1R5cGUgYXMgQ29udGV4dEVudGl0eVR5cGUpIDogJ3VzZXInXG5cbiAgICBvdXQucHVzaCg8TWVudGlvbkNoaXAga2V5PXtgbWVudGlvbi0ke2tleUlkeH0tJHttYXRjaC5pbmRleH1gfSB0eXBlPXt0eXBlfSBpZD17aWR9IGxhYmVsPXtsYWJlbH0gLz4pXG5cbiAgICBsYXN0SWR4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcbiAgICBrZXlJZHggKz0gMVxuICAgIG1hdGNoID0gTUVOVElPTl9NQVJLRVJfUkVHRVguZXhlYyh0ZXh0KVxuICB9XG4gIGlmIChsYXN0SWR4IDwgdGV4dC5sZW5ndGgpIG91dC5wdXNoKHRleHQuc2xpY2UobGFzdElkeCkpXG4gIHJldHVybiBvdXRcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU9BLE1BQU0sSUFBSUMsR0FBRyxRQUFRLG1CQUFtQjtBQUMvQyxTQUE0Q0MsMEJBQTBCLFFBQVEseUJBQXlCO0FBQ3ZHLFNBQ0VDLG1CQUFtQixFQUNuQkMsOEJBQThCLFFBQ3pCLGtFQUFrRTtBQUN6RSxTQUFTQyxnQkFBZ0IsUUFBUSxrQkFBa0I7QUFDbkQsU0FBU0MsVUFBVSxRQUFRLGtEQUFrRDtBQUM3RSxTQUFTQyxxQkFBcUIsUUFBUSx1QkFBdUI7QUFDN0QsU0FBU0MsNEJBQTRCLFFBQVEsdUJBQXVCO0FBQ3BFLFNBQVNDLGtCQUFrQixRQUFRLHNCQUFzQjs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBLFNBQUFDLEdBQUEsSUFBQUMsSUFBQSxFQUFBQyxJQUFBLElBQUFDLEtBQUEsRUFBQUMsUUFBQSxJQUFBQyxTQUFBO0FBSUEsT0FBTyxJQUFNQyxvQkFBb0IsR0FBRyx1RUFBdUU7QUFDM0csT0FBTyxJQUFNQyxxQkFBcUIsR0FBRyxpQkFBaUI7QUFDdEQsSUFBTUMsK0JBQStCLEdBQUcsc0JBQXNCO0FBRTlELElBQU1DLGFBQWtDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDO0FBRXZGLElBQU1DLHdCQUF3QixHQUFHLFNBQTNCQSx3QkFBd0JBLENBQUlDLElBQVksRUFBOEM7RUFDMUYsSUFBTUMsSUFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectcor/maia-components",
3
- "version": "2.11.41",
3
+ "version": "2.11.42-0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "repository": {
@@ -37,6 +37,7 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@streamdown/code": "^1.0.1",
40
+ "rehype-sanitize": "^6.0.0",
40
41
  "react-file-viewer": "^1.2.1",
41
42
  "streamdown": "^2.1.0",
42
43
  "xlsx": "^0.18.5",