@projectcor/maia-components 2.11.103-5 → 2.11.103-7

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 (72) hide show
  1. package/lib/App.js +19 -44
  2. package/lib/components/atoms/MAIAInput/MAIAInput.js +6 -1
  3. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
  4. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
  5. package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
  6. package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
  7. package/lib/components/atoms/icons/index.js +2 -1
  8. package/lib/components/index.js +1 -2
  9. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +4 -91
  10. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +46 -7
  11. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +311 -69
  12. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +28 -18
  13. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +9 -2
  14. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +69 -61
  15. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +5 -1
  16. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +66 -0
  17. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +55 -0
  18. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
  19. package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -2
  20. package/lib/components/molecules/Sidebar/Sidebar.js +104 -61
  21. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +16 -1
  22. package/lib/components/molecules/Sidebar/Sidebar.styles.js +30 -29
  23. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +6 -35
  24. package/lib/components/organisms/ChatAI/ChatAI.js +131 -40
  25. package/lib/context/global-context.js +3 -1
  26. package/lib/hooks/useAgentModel/useCreateAgent.js +14 -61
  27. package/lib/hooks/useAgentModel/useUpdateAgent.js +11 -58
  28. package/lib/hooks/useChatManager/useChatManager.js +530 -438
  29. package/lib/hooks/useChatMessages/useChatMessages.js +427 -236
  30. package/lib/hooks/useChats/useChats.js +21 -4
  31. package/lib/hooks/useEvent.js +1 -2
  32. package/lib/hooks/useMinimizedPillBottomOffset.js +110 -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/index.js +2 -5
  38. package/lib/lang/br/index.js +11 -9
  39. package/lib/lang/en/index.js +11 -9
  40. package/lib/lang/es/index.js +11 -9
  41. package/lib/lang/fr/index.js +13 -10
  42. package/lib/services/maia/Chats/getChatsByUserId.js +6 -4
  43. package/lib/services/maia/Chats/index.js +3 -1
  44. package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
  45. package/lib/store/chatsSidebarOptimistic.js +92 -0
  46. package/lib/store/chatsStore.types.js +1 -1
  47. package/lib/store/maiaMinimizedPersistence.js +49 -0
  48. package/lib/store/sessions/activeView.js +22 -0
  49. package/lib/store/sessions/index.js +9 -0
  50. package/lib/store/sessions/sessionHitlContext.js +15 -0
  51. package/lib/store/sessions/sessionNotificationSound.js +57 -0
  52. package/lib/store/sessions/sessionNotifications.js +110 -0
  53. package/lib/store/sessions/sessionNotifications.types.js +2 -0
  54. package/lib/store/sessions/sessionStreamManager.js +576 -0
  55. package/lib/store/sessions/sessionStreamingText.js +80 -0
  56. package/lib/store/sessions/sessions.types.js +35 -0
  57. package/lib/store/sessions/useSessionMeta.js +39 -0
  58. package/lib/store/sessions/useSessionStreamingText.js +18 -0
  59. package/lib/store/sessions/useSessionsStore.js +197 -0
  60. package/lib/store/useChatsStore.js +149 -12
  61. package/lib/types/Chat.js +1 -1
  62. package/lib/types/agentModal.js +1 -1
  63. package/lib/utils/formatUnreadCount.js +6 -0
  64. package/lib/utils/maiaHostOpen.js +54 -0
  65. package/lib/utils/normalizeAgentConnectors.js +3 -28
  66. package/package.json +3 -3
  67. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -543
  68. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
  69. package/lib/components/organisms/ChatAIPage/index.js +0 -3
  70. package/lib/dev/DevMaiaPage.js +0 -30
  71. package/lib/hooks/useStreamingMessage/streamingStore.js +0 -69
  72. package/lib/services/maia/Agents/connectors.js +0 -250
@@ -1,543 +0,0 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
- import _regeneratorRuntime from "@babel/runtime/regenerator";
5
- 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; }
6
- 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; }
7
- /* eslint-disable no-nested-ternary */
8
- /* eslint-disable react/function-component-definition */
9
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
10
- import moment from 'moment';
11
- import { useTranslation } from 'react-i18next';
12
- import { useUser } from '../../../context/cor-user';
13
- import { MAIAError } from '../../atoms/MAIAError';
14
- import { ChatAIContent } from '../../molecules/ChatAIContent';
15
- import { buildHandlers, options } from '../../molecules/ChatAIModal/constants';
16
- import { Sidebar } from '../../molecules/Sidebar';
17
- import { useGetAgents } from '../../../services/maia/Agents/getAgents';
18
- import { GlobalContext, useGlobalContext } from '../../../context/global-context';
19
- import { ChatAIModalHeader } from '../../molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader';
20
- import { Snackbar } from '../SnackBar/Snackbar';
21
- import { ProjectSummaryContent } from '../../molecules/ProjectSummaryContent';
22
- import { AbmAgentModal } from '../AbmAgentModal/AbmAgentModal';
23
- import { ChatAiModalFooter } from '../../molecules/ChatAIModal/components/ChatAiModalFooter';
24
- import { SECTIONS } from '../../../constants/config';
25
- import { validateIsMaia } from '../../../services/utils/validateIsMaia';
26
- import { fetchMaia } from '../../../services/maia/client';
27
- import { mapCORLang } from '../../../lang/utils';
28
- import { useStreamdownStyles } from '../../../hooks/useStreamdownStyles';
29
- import { useProjectSummaryConfig } from '../../../hooks/useProjectSummaryConfig';
30
- import { acquireChatsStore, releaseChatsStore } from '../../../store';
31
- import { useEvent } from '../../../hooks/useEvent';
32
- import { useGetSkills } from '../../../services/maia/Skills/getSkills';
33
- import { isMarketplaceGlobalCloneAgent } from '../../../utils/agentDisplayName';
34
- import { withAppCfg } from '../../atoms/WithAppCfg';
35
- import { Features } from '../../atoms/WithFeatureValidation';
36
- import { SCPageMain, SCPageWrapper } from './ChatAIPage.styles';
37
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
38
- var validateAccessByFeature = function validateAccessByFeature(section) {
39
- if (section === 'header' && (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS || window.MAIA_CHAT_AI_FEATURE_ACCESS)) {
40
- return true;
41
- }
42
- if ((section === 'project' || section === 'client') && window.MAIA_CHAT_AI_FEATURE_ACCESS) {
43
- return true;
44
- }
45
- return false;
46
- };
47
- export var ChatAIPage = withAppCfg(function (_ref) {
48
- var _ref$entity = _ref.entity,
49
- entity = _ref$entity === void 0 ? {
50
- projectId: null,
51
- clientId: null
52
- } : _ref$entity,
53
- _ref$project = _ref.project,
54
- initialProject = _ref$project === void 0 ? null : _ref$project,
55
- _ref$client = _ref.client,
56
- initialClient = _ref$client === void 0 ? null : _ref$client,
57
- _ref$section = _ref.section,
58
- section = _ref$section === void 0 ? 'header' : _ref$section,
59
- _ref$hasMultiAgents = _ref.hasMultiAgents,
60
- hasMultiAgents = _ref$hasMultiAgents === void 0 ? false : _ref$hasMultiAgents,
61
- className = _ref.className;
62
- useStreamdownStyles();
63
- var initialProjectValue = section === 'project' ? initialProject : null;
64
- var _useState = useState(initialProjectValue),
65
- _useState2 = _slicedToArray(_useState, 2),
66
- project = _useState2[0],
67
- setProject = _useState2[1];
68
- useEffect(function () {
69
- if (section === 'project' && initialProject != null) {
70
- setProject(initialProject);
71
- }
72
- }, [section, initialProject]);
73
- var _useProjectSummaryCon = useProjectSummaryConfig({
74
- section: section,
75
- entity: entity,
76
- project: project,
77
- setProject: setProject,
78
- client: section === 'client' ? initialClient !== null && initialClient !== void 0 ? initialClient : null : undefined,
79
- hasMultiAgents: hasMultiAgents
80
- }),
81
- context = _useProjectSummaryCon.context,
82
- restoreConfigureSettings = _useProjectSummaryCon.restoreConfigureSettings;
83
- var providerValue = useMemo(function () {
84
- return _objectSpread(_objectSpread({}, context), {}, {
85
- section: section
86
- });
87
- }, [context, section]);
88
- useEffect(function () {
89
- acquireChatsStore();
90
- return function () {
91
- releaseChatsStore();
92
- restoreConfigureSettings();
93
- };
94
- }, [restoreConfigureSettings]);
95
- return /*#__PURE__*/_jsx(GlobalContext.Provider, {
96
- value: providerValue,
97
- children: /*#__PURE__*/_jsx(ChatAIPageContent, {
98
- section: section,
99
- className: className
100
- })
101
- });
102
- }, Features.CHAT_AI);
103
- var ChatAIPageContent = function ChatAIPageContent(_ref2) {
104
- var _user$permissions, _user$permissions2, _user$permissions3, _agents$data;
105
- var section = _ref2.section,
106
- className = _ref2.className;
107
- var user = useUser();
108
- var _useTranslation = useTranslation([SECTIONS.abmAgent]),
109
- i18n = _useTranslation.i18n;
110
- var amplitudEvent = useEvent();
111
- var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
112
- moment.locale(lang);
113
- var _useState3 = useState({
114
- message: '',
115
- attachments: []
116
- }),
117
- _useState4 = _slicedToArray(_useState3, 2),
118
- userInitialMessage = _useState4[0],
119
- setUserInitialMessage = _useState4[1];
120
- var _useState5 = useState(null),
121
- _useState6 = _slicedToArray(_useState5, 2),
122
- initialChatId = _useState6[0],
123
- setInitialChatId = _useState6[1];
124
- var _useState7 = useState(0),
125
- _useState8 = _slicedToArray(_useState7, 2),
126
- newChatKey = _useState8[0],
127
- setNewChatKey = _useState8[1];
128
- var _useState9 = useState(null),
129
- _useState0 = _slicedToArray(_useState9, 2),
130
- sendMessageFunction = _useState0[0],
131
- setSendMessageFunction = _useState0[1];
132
- var _useState1 = useState(null),
133
- _useState10 = _slicedToArray(_useState1, 2),
134
- stopGenerationFunction = _useState10[0],
135
- setStopGenerationFunction = _useState10[1];
136
- var _useState11 = useState(false),
137
- _useState12 = _slicedToArray(_useState11, 2),
138
- isStreaming = _useState12[0],
139
- setIsStreaming = _useState12[1];
140
- var _useState13 = useState(false),
141
- _useState14 = _slicedToArray(_useState13, 2),
142
- isWriting = _useState14[0],
143
- setIsWriting = _useState14[1];
144
- var _useState15 = useState(false),
145
- _useState16 = _slicedToArray(_useState15, 2),
146
- refetchChats = _useState16[0],
147
- setRefetchChats = _useState16[1];
148
- var _useState17 = useState(options.home),
149
- _useState18 = _slicedToArray(_useState17, 2),
150
- currentOption = _useState18[0],
151
- setCurrentOption = _useState18[1];
152
- var _useState19 = useState(false),
153
- _useState20 = _slicedToArray(_useState19, 2),
154
- hasError = _useState20[0],
155
- setHasError = _useState20[1];
156
- var handlers = useMemo(function () {
157
- return buildHandlers(setCurrentOption, setHasError);
158
- }, []);
159
- var _useState21 = useState(false),
160
- _useState22 = _slicedToArray(_useState21, 2),
161
- sidebarHasError = _useState22[0],
162
- setSidebarHasError = _useState22[1];
163
- var resetSelectedChatRef = useRef(null);
164
- var _useState23 = useState('sidebar'),
165
- _useState24 = _slicedToArray(_useState23, 2),
166
- layoutMode = _useState24[0],
167
- setLayoutMode = _useState24[1];
168
- var expanded = layoutMode === 'fullscreen';
169
- var _useGlobalContext = useGlobalContext(),
170
- selectAgent = _useGlobalContext.selectAgent,
171
- agent = _useGlobalContext.agent,
172
- project = _useGlobalContext.project,
173
- client = _useGlobalContext.client,
174
- toggleWebSearch = _useGlobalContext.toggleWebSearch,
175
- isWebSearchActive = _useGlobalContext.isWebSearchActive,
176
- setChipsProject = _useGlobalContext.setChipsProject,
177
- setClient = _useGlobalContext.setClient,
178
- setProject = _useGlobalContext.setProject;
179
- var _useGetAgents = useGetAgents({
180
- selectAgent: selectAgent,
181
- section: section,
182
- agent: agent,
183
- handleGoHome: handlers.home
184
- }),
185
- agents = _useGetAgents.agents,
186
- loading = _useGetAgents.loading,
187
- loadingMore = _useGetAgents.loadingMore,
188
- agentError = _useGetAgents.error,
189
- handleGetAgents = _useGetAgents.handleGetAgents,
190
- loadMoreAgents = _useGetAgents.loadMoreAgents,
191
- addAgent = _useGetAgents.addAgent,
192
- removeAgent = _useGetAgents.removeAgent,
193
- updateAgent = _useGetAgents.updateAgent,
194
- updateAgentFavorite = _useGetAgents.updateAgentFavorite,
195
- selectFirstAgent = _useGetAgents.selectFirstAgent,
196
- sortAgentsList = _useGetAgents.sortAgentsList;
197
- var _useGetSkills = useGetSkills(),
198
- skills = _useGetSkills.skills,
199
- loadingSkills = _useGetSkills.loading,
200
- handleGetSkills = _useGetSkills.handleGetSkills,
201
- removeSkill = _useGetSkills.removeSkill;
202
- var isMAIA = validateIsMaia(agent);
203
- var userHasPermissions = ((user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 || (_user$permissions = _user$permissions.ai_agents) === null || _user$permissions === void 0 ? void 0 : _user$permissions.create) || (user === null || user === void 0 || (_user$permissions2 = user.permissions) === null || _user$permissions2 === void 0 || (_user$permissions2 = _user$permissions2.ai_agents) === null || _user$permissions2 === void 0 ? void 0 : _user$permissions2.edit) || (user === null || user === void 0 || (_user$permissions3 = user.permissions) === null || _user$permissions3 === void 0 || (_user$permissions3 = _user$permissions3.ai_agents) === null || _user$permissions3 === void 0 ? void 0 : _user$permissions3["delete"])) && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
204
- var computedCurrentOption = useMemo(function () {
205
- var isGlobalSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'global';
206
- var isProjectSpecialist = isMAIA && ((agent === null || agent === void 0 ? void 0 : agent.entity) === 'project' || (agent === null || agent === void 0 ? void 0 : agent.entity) == null);
207
- var isClientSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'client';
208
- var isMaiaker = isMarketplaceGlobalCloneAgent(agent);
209
- if (currentOption === options.myAgents && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
210
- return options.myAgents;
211
- }
212
- if (currentOption === options.mySkills && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
213
- return options.mySkills;
214
- }
215
- if (isGlobalSpecialist && !isMaiaker && (agent === null || agent === void 0 ? void 0 : agent.type) !== 'orchestrator' && currentOption === options.home) {
216
- return options.chat;
217
- }
218
- var shouldShowProjectSelector = currentOption !== options.chat && isProjectSpecialist && !project;
219
- var shouldShowClientSelector = currentOption !== options.chat && isClientSpecialist && !client;
220
- if (shouldShowProjectSelector) return options.projectSelector;
221
- if (shouldShowClientSelector) return options.clientSelector;
222
- return currentOption;
223
- }, [currentOption, project, client, isMAIA, agent === null || agent === void 0 ? void 0 : agent.entity, agent === null || agent === void 0 ? void 0 : agent.name, agent === null || agent === void 0 ? void 0 : agent.type]);
224
- var isMaiakerAgentSelected = useMemo(function () {
225
- return isMarketplaceGlobalCloneAgent(agent);
226
- }, [agent]);
227
- var sidebarAgentsNavActive = useMemo(function () {
228
- if (computedCurrentOption === options.mySkills) return 'mySkills';
229
- if (computedCurrentOption === options.myAgents) return 'myAgents';
230
- if (isMaiakerAgentSelected) return 'maiaker';
231
- return null;
232
- }, [computedCurrentOption, isMaiakerAgentSelected]);
233
- var agentsFetchedRef = useRef(false);
234
- useEffect(function () {
235
- if (!agentsFetchedRef.current) {
236
- agentsFetchedRef.current = true;
237
- handleGetAgents();
238
- }
239
- }, [handleGetAgents]);
240
- useEffect(function () {
241
- var onMergeCreatedAgent = function onMergeCreatedAgent(evt) {
242
- var _ref3 = evt.detail || {},
243
- nextAgent = _ref3.agent;
244
- if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) addAgent(nextAgent, {
245
- navigateHome: false
246
- });
247
- };
248
- document.addEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
249
- return function () {
250
- return document.removeEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
251
- };
252
- }, [addAgent]);
253
- useEffect(function () {
254
- var onSyncEditedAgent = function onSyncEditedAgent(evt) {
255
- var _ref4 = evt.detail || {},
256
- nextAgent = _ref4.agent;
257
- if (!(nextAgent !== null && nextAgent !== void 0 && nextAgent.id)) return;
258
- updateAgent(nextAgent);
259
- if ((agent === null || agent === void 0 ? void 0 : agent.id) === nextAgent.id) selectAgent(nextAgent);
260
- };
261
- document.addEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
262
- return function () {
263
- return document.removeEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
264
- };
265
- }, [updateAgent, selectAgent, agent === null || agent === void 0 ? void 0 : agent.id]);
266
- useEffect(function () {
267
- var openChatView = function openChatView() {
268
- setHasError(false);
269
- setInitialChatId(null);
270
- setNewChatKey(function (prev) {
271
- return prev + 1;
272
- });
273
- setUserInitialMessage({
274
- message: '',
275
- attachments: []
276
- });
277
- setCurrentOption(options.chat);
278
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
279
- };
280
- document.addEventListener('maia-open-chat-view', openChatView);
281
- return function () {
282
- return document.removeEventListener('maia-open-chat-view', openChatView);
283
- };
284
- }, []);
285
- useEffect(function () {
286
- var openNewChatWithAgent = function openNewChatWithAgent(event) {
287
- var _detail;
288
- var nextAgent = (_detail = event.detail) === null || _detail === void 0 ? void 0 : _detail.agent;
289
- if (!nextAgent) return;
290
- setProject(null);
291
- setClient === null || setClient === void 0 || setClient(null);
292
- selectAgent(nextAgent);
293
- setHasError(false);
294
- setCurrentOption(options.home);
295
- };
296
- document.addEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
297
- return function () {
298
- return document.removeEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
299
- };
300
- }, [selectAgent, setClient, setProject]);
301
- var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId) {
302
- if (sidebarHasError) setSidebarHasError(false);
303
- setInitialChatId(null);
304
- setNewChatKey(function (prev) {
305
- return prev + 1;
306
- });
307
- setUserInitialMessage(_objectSpread(_objectSpread({
308
- message: message || '',
309
- attachments: attachments || []
310
- }, faqId ? {
311
- faqId: faqId
312
- } : {}), agentSuggestionId ? {
313
- agentSuggestionId: agentSuggestionId
314
- } : {}));
315
- handlers.chat();
316
- }, [handlers, sidebarHasError]);
317
-
318
- // Sidebar types this prop as (chatId: string) but passes the full chat object at runtime
319
- var goToChat = useCallback(function (chatArg) {
320
- var chat = chatArg;
321
- setUserInitialMessage({
322
- message: '',
323
- attachments: []
324
- });
325
- setInitialChatId(chat.sessionExternalId);
326
- var selectedAgent = agents.data.find(function (agentItem) {
327
- return agentItem.id === chat.agentId;
328
- });
329
- if (selectedAgent) selectAgent(selectedAgent);
330
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
331
- handlers.chat();
332
- }, [handlers, agents, selectAgent]);
333
- var handleSendMessageReady = useCallback(function (sendMessage, stopGeneration, streaming, writing) {
334
- setSendMessageFunction(function () {
335
- return sendMessage;
336
- });
337
- setStopGenerationFunction(function () {
338
- return stopGeneration;
339
- });
340
- setIsStreaming(streaming);
341
- setIsWriting(writing);
342
- }, []);
343
- var handleSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId) {
344
- if (sidebarHasError) setSidebarHasError(false);
345
- if (sendMessageFunction && computedCurrentOption === options.chat) {
346
- sendMessageFunction(message, attachments, faqId, agentSuggestionId);
347
- } else {
348
- startChat(message, attachments, faqId, agentSuggestionId);
349
- }
350
- }, [sendMessageFunction, startChat, computedCurrentOption, sidebarHasError]);
351
- var handleGoHome = useCallback(function () {
352
- if (currentOption === options.chat) {
353
- setInitialChatId(null);
354
- setNewChatKey(function (prev) {
355
- return prev + 1;
356
- });
357
- if ((agent === null || agent === void 0 ? void 0 : agent.entity) !== 'client') setClient === null || setClient === void 0 || setClient(null);
358
- }
359
- if ((!agent || agent !== null && agent !== void 0 && agent.is_deleted || agent !== null && agent !== void 0 && agent.has_not_permissions || agent !== null && agent !== void 0 && agent.has_not_access || agent !== null && agent !== void 0 && agent.project_deleted) && agents.data.length > 0) {
360
- selectAgent(agents.data[0]);
361
- }
362
- setCurrentOption(options.home);
363
- setChipsProject(null);
364
- setHasError(false);
365
- if (isWebSearchActive) toggleWebSearch();
366
- if (resetSelectedChatRef.current) resetSelectedChatRef.current();
367
- }, [currentOption, isWebSearchActive, toggleWebSearch, agent, agents, selectAgent, setClient, setChipsProject]);
368
- var handleResetChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
369
- return _regeneratorRuntime.wrap(function (_context) {
370
- while (1) switch (_context.prev = _context.next) {
371
- case 0:
372
- setUserInitialMessage({
373
- message: '',
374
- attachments: []
375
- });
376
- setInitialChatId(null);
377
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
378
- handleGoHome();
379
- case 1:
380
- case "end":
381
- return _context.stop();
382
- }
383
- }, _callee);
384
- })), [handleGoHome]);
385
- var handleOpenMarketplace = useCallback(function () {
386
- if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
387
- return;
388
- }
389
- setCurrentOption(options.myAgents);
390
- }, []);
391
- var handleOpenSkills = useCallback(function () {
392
- if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
393
- return;
394
- }
395
- setHasError(false);
396
- setCurrentOption(options.mySkills);
397
- handleGetSkills();
398
- }, [handleGetSkills]);
399
- var handleGoToMaiaker = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
400
- var maiakerAgent, response, data, _t;
401
- return _regeneratorRuntime.wrap(function (_context2) {
402
- while (1) switch (_context2.prev = _context2.next) {
403
- case 0:
404
- setHasError(false);
405
- maiakerAgent = agents.data.find(function (a) {
406
- return isMarketplaceGlobalCloneAgent(a);
407
- });
408
- if (maiakerAgent) {
409
- _context2.next = 5;
410
- break;
411
- }
412
- _context2.prev = 1;
413
- _context2.next = 2;
414
- return fetchMaia({
415
- path: "agents?agent_type=clone&lang=".concat(mapCORLang(i18n.language)),
416
- method: 'GET'
417
- });
418
- case 2:
419
- response = _context2.sent;
420
- _context2.next = 3;
421
- return response.json();
422
- case 3:
423
- data = _context2.sent;
424
- maiakerAgent = (data.data || []).find(function (a) {
425
- return isMarketplaceGlobalCloneAgent(a);
426
- });
427
- _context2.next = 5;
428
- break;
429
- case 4:
430
- _context2.prev = 4;
431
- _t = _context2["catch"](1);
432
- return _context2.abrupt("return");
433
- case 5:
434
- if (maiakerAgent) {
435
- _context2.next = 6;
436
- break;
437
- }
438
- return _context2.abrupt("return");
439
- case 6:
440
- setProject(null);
441
- setClient === null || setClient === void 0 || setClient(null);
442
- selectAgent(maiakerAgent);
443
- setCurrentOption(options.home);
444
- if (resetSelectedChatRef.current) resetSelectedChatRef.current();
445
- case 7:
446
- case "end":
447
- return _context2.stop();
448
- }
449
- }, _callee2, null, [[1, 4]]);
450
- })), [agents.data, i18n.language, selectAgent, setClient, setProject]);
451
- var handleDeleteAgentFromMyAgents = useCallback(function (agentId) {
452
- removeAgent(agentId);
453
- if ((agent === null || agent === void 0 ? void 0 : agent.id) === agentId) selectFirstAgent(agentId);
454
- }, [agent === null || agent === void 0 ? void 0 : agent.id, removeAgent, selectFirstAgent]);
455
- var showNewChat = computedCurrentOption !== options.chat;
456
- var hideHeaderAgentSelector = computedCurrentOption === options.myAgents || computedCurrentOption === options.mySkills;
457
- var hideFooterOnMaiakerMarketplaceHome = computedCurrentOption === options.home && isMaiakerAgentSelected;
458
-
459
- // Suppress unused variable warning — kept for potential Amplitude tracking parity
460
- void amplitudEvent;
461
- return /*#__PURE__*/_jsxs(SCPageWrapper, {
462
- className: className,
463
- children: [validateAccessByFeature(section) ? /*#__PURE__*/_jsx(Sidebar, {
464
- onGoToChat: goToChat,
465
- onError: function onError() {
466
- return setSidebarHasError(true);
467
- },
468
- handleGoToHome: handleGoHome,
469
- handleOpenMarketplace: handleOpenMarketplace,
470
- handleOpenSkills: handleOpenSkills,
471
- showNewChat: showNewChat,
472
- refetchChats: refetchChats,
473
- handleSetRefetchChats: setRefetchChats,
474
- hasError: sidebarHasError,
475
- resetSelectedChatRef: resetSelectedChatRef,
476
- agentsNavActive: sidebarAgentsNavActive
477
- }) : null, /*#__PURE__*/_jsxs(SCPageMain, {
478
- children: [/*#__PURE__*/_jsx(ChatAIModalHeader, {
479
- layoutMode: layoutMode,
480
- onLayoutModeChange: setLayoutMode,
481
- expanded: expanded,
482
- agents: agents.data,
483
- hasError: !!agentError,
484
- loading: loading,
485
- loadingMore: loadingMore,
486
- hasMore: agents.has_more,
487
- handleResetChat: handleResetChat,
488
- onAgentUpdate: updateAgentFavorite,
489
- loadMoreAgents: loadMoreAgents,
490
- sortAgentsList: sortAgentsList,
491
- hideAgentSelector: hideHeaderAgentSelector,
492
- hideControls: true
493
- }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : validateAccessByFeature(section) ? /*#__PURE__*/_jsx(ChatAIContent, {
494
- currentOption: computedCurrentOption,
495
- handlers: _objectSpread(_objectSpread({}, handlers), {}, {
496
- chat: startChat,
497
- home: handlers.home,
498
- handleGoHome: handleGoHome
499
- }),
500
- onError: function onError() {
501
- return setHasError(true);
502
- },
503
- refs: {
504
- userInitialMessage: userInitialMessage,
505
- initialChatId: initialChatId
506
- },
507
- onSendMessageReady: handleSendMessageReady,
508
- expanded: expanded,
509
- floating: false,
510
- agents: agents.data,
511
- onDeleteAgent: handleDeleteAgentFromMyAgents,
512
- onFavoriteAgentUpdate: updateAgentFavorite,
513
- hasMoreAgents: !!agents.has_more,
514
- loadingMoreAgents: loadingMore,
515
- onLoadMoreAgents: loadMoreAgents,
516
- onGoToMaiaker: handleGoToMaiaker,
517
- skills: skills,
518
- loadingSkills: loadingSkills,
519
- onDeleteSkill: removeSkill,
520
- loadingAgents: loading,
521
- agentError: agentError
522
- }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
523
- onRestartSummary: handlers.home
524
- }), (computedCurrentOption === options.home && !!(agents !== null && agents !== void 0 && (_agents$data = agents.data) !== null && _agents$data !== void 0 && _agents$data.length) || computedCurrentOption === options.chat) && !hideFooterOnMaiakerMarketplaceHome && !hasError && !loading && validateAccessByFeature(section) && /*#__PURE__*/_jsx(ChatAiModalFooter, {
525
- agent: agent,
526
- handleSendMessage: handleSendMessage,
527
- handleStopGeneration: stopGenerationFunction,
528
- isStreaming: isStreaming,
529
- isWriting: isWriting,
530
- chatId: initialChatId,
531
- newChatKey: newChatKey,
532
- layoutMode: layoutMode
533
- })]
534
- }), userHasPermissions && /*#__PURE__*/_jsx(AbmAgentModal, {
535
- addAgent: addAgent,
536
- updateAgent: updateAgent,
537
- removeAgent: removeAgent,
538
- updateAgentFavorite: updateAgentFavorite,
539
- selectFirstAgent: selectFirstAgent
540
- }), /*#__PURE__*/_jsx(Snackbar, {})]
541
- });
542
- };
543
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIm1vbWVudCIsInVzZVRyYW5zbGF0aW9uIiwidXNlVXNlciIsIk1BSUFFcnJvciIsIkNoYXRBSUNvbnRlbnQiLCJidWlsZEhhbmRsZXJzIiwib3B0aW9ucyIsIlNpZGViYXIiLCJ1c2VHZXRBZ2VudHMiLCJHbG9iYWxDb250ZXh0IiwidXNlR2xvYmFsQ29udGV4dCIsIkNoYXRBSU1vZGFsSGVhZGVyIiwiU25hY2tiYXIiLCJQcm9qZWN0U3VtbWFyeUNvbnRlbnQiLCJBYm1BZ2VudE1vZGFsIiwiQ2hhdEFpTW9kYWxGb290ZXIiLCJTRUNUSU9OUyIsInZhbGlkYXRlSXNNYWlhIiwiZmV0Y2hNYWlhIiwibWFwQ09STGFuZyIsInVzZVN0cmVhbWRvd25TdHlsZXMiLCJ1c2VQcm9qZWN0U3VtbWFyeUNvbmZpZyIsImFjcXVpcmVDaGF0c1N0b3JlIiwicmVsZWFzZUNoYXRzU3RvcmUiLCJ1c2VFdmVudCIsInVzZUdldFNraWxscyIsImlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50Iiwid2l0aEFwcENmZyIsIkZlYXR1cmVzIiwiU0NQYWdlTWFpbiIsIlNDUGFnZVdyYXBwZXIiLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwidmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUiLCJzZWN0aW9uIiwid2luZG93IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyIsIkNoYXRBSVBhZ2UiLCJfcmVmIiwiX3JlZiRlbnRpdHkiLCJlbnRpdHkiLCJwcm9qZWN0SWQiLCJjbGllbnRJZCIsIl9yZWYkcHJvamVjdCIsInByb2plY3QiLCJpbml0aWFsUHJvamVjdCIsIl9yZWYkY2xpZW50IiwiY2xpZW50IiwiaW5pdGlhbENsaWVudCIsIl9yZWYkc2VjdGlvbiIsIl9yZWYkaGFzTXVsdGlBZ2VudHMiLCJoYXNNdWx0aUFnZW50cyIsImNsYXNzTmFtZSIsImluaXRpYWxQcm9qZWN0VmFsdWUiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRQcm9qZWN0IiwiX3VzZVByb2plY3RTdW1tYXJ5Q29uIiwidW5kZWZpbmVkIiwiY29udGV4dCIsInJlc3RvcmVDb25maWd1cmVTZXR0aW5ncyIsInByb3ZpZGVyVmFsdWUiLCJfb2JqZWN0U3ByZWFkIiwiUHJvdmlkZXIiLCJ2YWx1ZSIsImNoaWxkcmVuIiwiQ2hhdEFJUGFnZUNvbnRlbnQiLCJDSEFUX0FJIiwiX3JlZjIiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl91c2VyJHBlcm1pc3Npb25zMiIsIl91c2VyJHBlcm1pc3Npb25zMyIsIl9hZ2VudHMkZGF0YSIsInVzZXIiLCJfdXNlVHJhbnNsYXRpb24iLCJhYm1BZ2VudCIsImkxOG4iLCJhbXBsaXR1ZEV2ZW50IiwibGFuZyIsImxhbmd1YWdlIiwibG9jYWxlIiwiX3VzZVN0YXRlMyIsIm1lc3NhZ2UiLCJhdHRhY2htZW50cyIsIl91c2VTdGF0ZTQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJzZXRVc2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImluaXRpYWxDaGF0SWQiLCJzZXRJbml0aWFsQ2hhdElkIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJuZXdDaGF0S2V5Iiwic2V0TmV3Q2hhdEtleSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2VuZE1lc3NhZ2VGdW5jdGlvbiIsInNldFNlbmRNZXNzYWdlRnVuY3Rpb24iLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uIiwic2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbiIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc1N0cmVhbWluZyIsInNldElzU3RyZWFtaW5nIiwiX3VzZVN0YXRlMTMiLCJfdXNlU3RhdGUxNCIsImlzV3JpdGluZyIsInNldElzV3JpdGluZyIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJyZWZldGNoQ2hhdHMiLCJzZXRSZWZldGNoQ2hhdHMiLCJfdXNlU3RhdGUxNyIsImhvbWUiLCJfdXNlU3RhdGUxOCIsImN1cnJlbnRPcHRpb24iLCJzZXRDdXJyZW50T3B0aW9uIiwiX3VzZVN0YXRlMTkiLCJfdXNlU3RhdGUyMCIsImhhc0Vycm9yIiwic2V0SGFzRXJyb3IiLCJoYW5kbGVycyIsIl91c2VTdGF0ZTIxIiwiX3VzZVN0YXRlMjIiLCJzaWRlYmFySGFzRXJyb3IiLCJzZXRTaWRlYmFySGFzRXJyb3IiLCJyZXNldFNlbGVjdGVkQ2hhdFJlZiIsIl91c2VTdGF0ZTIzIiwiX3VzZVN0YXRlMjQiLCJsYXlvdXRNb2RlIiwic2V0TGF5b3V0TW9kZSIsImV4cGFuZGVkIiwiX3VzZUdsb2JhbENvbnRleHQiLCJzZWxlY3RBZ2VudCIsImFnZW50IiwidG9nZ2xlV2ViU2VhcmNoIiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJzZXRDaGlwc1Byb2plY3QiLCJzZXRDbGllbnQiLCJfdXNlR2V0QWdlbnRzIiwiaGFuZGxlR29Ib21lIiwiYWdlbnRzIiwibG9hZGluZyIsImxvYWRpbmdNb3JlIiwiYWdlbnRFcnJvciIsImVycm9yIiwiaGFuZGxlR2V0QWdlbnRzIiwibG9hZE1vcmVBZ2VudHMiLCJhZGRBZ2VudCIsInJlbW92ZUFnZW50IiwidXBkYXRlQWdlbnQiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2VsZWN0Rmlyc3RBZ2VudCIsInNvcnRBZ2VudHNMaXN0IiwiX3VzZUdldFNraWxscyIsInNraWxscyIsImxvYWRpbmdTa2lsbHMiLCJoYW5kbGVHZXRTa2lsbHMiLCJyZW1vdmVTa2lsbCIsImlzTUFJQSIsInVzZXJIYXNQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiY3JlYXRlIiwiZWRpdCIsImNvbXB1dGVkQ3VycmVudE9wdGlvbiIsImlzR2xvYmFsU3BlY2lhbGlzdCIsImlzUHJvamVjdFNwZWNpYWxpc3QiLCJpc0NsaWVudFNwZWNpYWxpc3QiLCJpc01haWFrZXIiLCJteUFnZW50cyIsIm15U2tpbGxzIiwidHlwZSIsImNoYXQiLCJzaG91bGRTaG93UHJvamVjdFNlbGVjdG9yIiwic2hvdWxkU2hvd0NsaWVudFNlbGVjdG9yIiwicHJvamVjdFNlbGVjdG9yIiwiY2xpZW50U2VsZWN0b3IiLCJuYW1lIiwiaXNNYWlha2VyQWdlbnRTZWxlY3RlZCIsInNpZGViYXJBZ2VudHNOYXZBY3RpdmUiLCJhZ2VudHNGZXRjaGVkUmVmIiwiY3VycmVudCIsIm9uTWVyZ2VDcmVhdGVkQWdlbnQiLCJldnQiLCJfcmVmMyIsImRldGFpbCIsIm5leHRBZ2VudCIsImlkIiwibmF2aWdhdGVIb21lIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uU3luY0VkaXRlZEFnZW50IiwiX3JlZjQiLCJvcGVuQ2hhdFZpZXciLCJwcmV2IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50Iiwib3Blbk5ld0NoYXRXaXRoQWdlbnQiLCJldmVudCIsIl9kZXRhaWwiLCJzdGFydENoYXQiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwiZ29Ub0NoYXQiLCJjaGF0QXJnIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJzZWxlY3RlZEFnZW50IiwiZGF0YSIsImZpbmQiLCJhZ2VudEl0ZW0iLCJhZ2VudElkIiwiaGFuZGxlU2VuZE1lc3NhZ2VSZWFkeSIsInNlbmRNZXNzYWdlIiwic3RvcEdlbmVyYXRpb24iLCJzdHJlYW1pbmciLCJ3cml0aW5nIiwiaGFuZGxlU2VuZE1lc3NhZ2UiLCJpc19kZWxldGVkIiwiaGFzX25vdF9wZXJtaXNzaW9ucyIsImhhc19ub3RfYWNjZXNzIiwicHJvamVjdF9kZWxldGVkIiwibGVuZ3RoIiwiaGFuZGxlUmVzZXRDaGF0IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NvbnRleHQiLCJuZXh0Iiwic3RvcCIsImhhbmRsZU9wZW5NYXJrZXRwbGFjZSIsImhhbmRsZU9wZW5Ta2lsbHMiLCJoYW5kbGVHb1RvTWFpYWtlciIsIl9jYWxsZWUyIiwibWFpYWtlckFnZW50IiwicmVzcG9uc2UiLCJfdCIsIl9jb250ZXh0MiIsImEiLCJwYXRoIiwiY29uY2F0IiwibWV0aG9kIiwic2VudCIsImpzb24iLCJhYnJ1cHQiLCJoYW5kbGVEZWxldGVBZ2VudEZyb21NeUFnZW50cyIsInNob3dOZXdDaGF0IiwiaGlkZUhlYWRlckFnZW50U2VsZWN0b3IiLCJoaWRlRm9vdGVyT25NYWlha2VyTWFya2V0cGxhY2VIb21lIiwib25Hb1RvQ2hhdCIsIm9uRXJyb3IiLCJoYW5kbGVHb1RvSG9tZSIsImhhbmRsZVNldFJlZmV0Y2hDaGF0cyIsImFnZW50c05hdkFjdGl2ZSIsIm9uTGF5b3V0TW9kZUNoYW5nZSIsImhhc01vcmUiLCJoYXNfbW9yZSIsIm9uQWdlbnRVcGRhdGUiLCJoaWRlQWdlbnRTZWxlY3RvciIsImhpZGVDb250cm9scyIsInJlZnMiLCJvblNlbmRNZXNzYWdlUmVhZHkiLCJmbG9hdGluZyIsIm9uRGVsZXRlQWdlbnQiLCJvbkZhdm9yaXRlQWdlbnRVcGRhdGUiLCJoYXNNb3JlQWdlbnRzIiwibG9hZGluZ01vcmVBZ2VudHMiLCJvbkxvYWRNb3JlQWdlbnRzIiwib25Hb1RvTWFpYWtlciIsIm9uRGVsZXRlU2tpbGwiLCJsb2FkaW5nQWdlbnRzIiwib25SZXN0YXJ0U3VtbWFyeSIsImhhbmRsZVN0b3BHZW5lcmF0aW9uIiwiY2hhdElkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0NoYXRBSVBhZ2UvQ2hhdEFJUGFnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgTUFJQUVycm9yIH0gZnJvbSAnLi4vLi4vYXRvbXMvTUFJQUVycm9yJ1xuaW1wb3J0IHsgQ2hhdEFJQ29udGVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlDb250ZW50J1xuaW1wb3J0IHsgYnVpbGRIYW5kbGVycywgb3B0aW9ucyB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlNb2RhbC9jb25zdGFudHMnXG5pbXBvcnQgeyBTaWRlYmFyIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL1NpZGViYXInXG5pbXBvcnQgeyB1c2VHZXRBZ2VudHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudHMnXG5pbXBvcnQgeyBHbG9iYWxDb250ZXh0LCB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IENoYXRBSU1vZGFsSGVhZGVyIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRBSU1vZGFsL2NvbXBvbmVudHMvQ2hhdEFpTW9kYWxIZWFkZXIvQ2hhdEFpTW9kYWxIZWFkZXInXG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJy4uL1NuYWNrQmFyL1NuYWNrYmFyJ1xuaW1wb3J0IHsgUHJvamVjdFN1bW1hcnlDb250ZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL1Byb2plY3RTdW1tYXJ5Q29udGVudCdcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuLi9BYm1BZ2VudE1vZGFsL0FibUFnZW50TW9kYWwnXG5pbXBvcnQgeyBDaGF0QWlNb2RhbEZvb3RlciB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlNb2RhbC9jb21wb25lbnRzL0NoYXRBaU1vZGFsRm9vdGVyJ1xuaW1wb3J0IHsgU0VDVElPTlMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvY29uZmlnJ1xuaW1wb3J0IHsgdmFsaWRhdGVJc01haWEgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlscy92YWxpZGF0ZUlzTWFpYSdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBmZXRjaE1haWEgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL2NsaWVudCdcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuaW1wb3J0IHsgdXNlU3RyZWFtZG93blN0eWxlcyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVN0cmVhbWRvd25TdHlsZXMnXG5pbXBvcnQgeyB1c2VQcm9qZWN0U3VtbWFyeUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVByb2plY3RTdW1tYXJ5Q29uZmlnJ1xuaW1wb3J0IHsgYWNxdWlyZUNoYXRzU3RvcmUsIHJlbGVhc2VDaGF0c1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUnXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvUHJvamVjdCdcbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NsaWVudCdcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IE1haWFDaGF0TW9kYWxMYXlvdXRNb2RlIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRBSU1vZGFsL2xheW91dCdcbmltcG9ydCB7IHVzZUdldFNraWxscyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvU2tpbGxzL2dldFNraWxscydcbmltcG9ydCB7IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYWdlbnREaXNwbGF5TmFtZSdcbmltcG9ydCB7IHdpdGhBcHBDZmcgfSBmcm9tICcuLi8uLi9hdG9tcy9XaXRoQXBwQ2ZnJ1xuaW1wb3J0IHsgRmVhdHVyZXMgfSBmcm9tICcuLi8uLi9hdG9tcy9XaXRoRmVhdHVyZVZhbGlkYXRpb24nXG5pbXBvcnQgeyBTQ1BhZ2VNYWluLCBTQ1BhZ2VXcmFwcGVyIH0gZnJvbSAnLi9DaGF0QUlQYWdlLnN0eWxlcydcblxuZXhwb3J0IHR5cGUgQ2hhdEFJUGFnZVByb3BzID0ge1xuICBlbnRpdHk/OiB7IHByb2plY3RJZDogc3RyaW5nIHwgbnVsbDsgY2xpZW50SWQ6IHN0cmluZyB8IG51bGwgfVxuICBwcm9qZWN0PzogUHJvamVjdCB8IG51bGxcbiAgY2xpZW50PzogQ2xpZW50IHwgbnVsbFxuICBzZWN0aW9uPzogJ3Byb2plY3QnIHwgJ2hlYWRlcicgfCAnY2xpZW50J1xuICBoYXNNdWx0aUFnZW50cz86IGJvb2xlYW5cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgU2VjdGlvblR5cGUgPSAncHJvamVjdCcgfCAnaGVhZGVyJyB8ICdjbGllbnQnXG5cbnR5cGUgQ2hhdExpc3RJdGVtID0geyBzZXNzaW9uRXh0ZXJuYWxJZDogc3RyaW5nOyBhZ2VudElkOiBzdHJpbmcgfVxuXG5jb25zdCB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSA9IChzZWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgaWYgKHNlY3Rpb24gPT09ICdoZWFkZXInICYmICh3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyB8fCB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKChzZWN0aW9uID09PSAncHJvamVjdCcgfHwgc2VjdGlvbiA9PT0gJ2NsaWVudCcpICYmIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgQ2hhdEFJUGFnZSA9IHdpdGhBcHBDZmcoXG4gICh7XG4gICAgZW50aXR5ID0geyBwcm9qZWN0SWQ6IG51bGwsIGNsaWVudElkOiBudWxsIH0sXG4gICAgcHJvamVjdDogaW5pdGlhbFByb2plY3QgPSBudWxsLFxuICAgIGNsaWVudDogaW5pdGlhbENsaWVudCA9IG51bGwsXG4gICAgc2VjdGlvbiA9ICdoZWFkZXInLFxuICAgIGhhc011bHRpQWdlbnRzID0gZmFsc2UsXG4gICAgY2xhc3NOYW1lLFxuICB9OiBDaGF0QUlQYWdlUHJvcHMpID0+IHtcbiAgICB1c2VTdHJlYW1kb3duU3R5bGVzKClcblxuICAgIGNvbnN0IGluaXRpYWxQcm9qZWN0VmFsdWUgPSBzZWN0aW9uID09PSAncHJvamVjdCcgPyBpbml0aWFsUHJvamVjdCA6IG51bGxcbiAgICBjb25zdCBbcHJvamVjdCwgc2V0UHJvamVjdF0gPSB1c2VTdGF0ZTxQcm9qZWN0IHwgbnVsbD4oaW5pdGlhbFByb2plY3RWYWx1ZSlcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoc2VjdGlvbiA9PT0gJ3Byb2plY3QnICYmIGluaXRpYWxQcm9qZWN0ICE9IG51bGwpIHtcbiAgICAgICAgc2V0UHJvamVjdChpbml0aWFsUHJvamVjdClcbiAgICAgIH1cbiAgICB9LCBbc2VjdGlvbiwgaW5pdGlhbFByb2plY3RdKVxuXG4gICAgY29uc3QgeyBjb250ZXh0LCByZXN0b3JlQ29uZmlndXJlU2V0dGluZ3MgfSA9IHVzZVByb2plY3RTdW1tYXJ5Q29uZmlnKHtcbiAgICAgIHNlY3Rpb24sXG4gICAgICBlbnRpdHksXG4gICAgICBwcm9qZWN0LFxuICAgICAgc2V0UHJvamVjdCxcbiAgICAgIGNsaWVudDogc2VjdGlvbiA9PT0gJ2NsaWVudCcgPyAoaW5pdGlhbENsaWVudCA/PyBudWxsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGhhc011bHRpQWdlbnRzLFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm92aWRlclZhbHVlID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7IC4uLmNvbnRleHQsIHNlY3Rpb246IHNlY3Rpb24gYXMgJ3Byb2plY3QnIHwgJ2hlYWRlcicgfCAnY2xpZW50JyB9KSxcbiAgICAgIFtjb250ZXh0LCBzZWN0aW9uXVxuICAgIClcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBhY3F1aXJlQ2hhdHNTdG9yZSgpXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByZWxlYXNlQ2hhdHNTdG9yZSgpXG4gICAgICAgIHJlc3RvcmVDb25maWd1cmVTZXR0aW5ncygpXG4gICAgICB9XG4gICAgfSwgW3Jlc3RvcmVDb25maWd1cmVTZXR0aW5nc10pXG5cbiAgICByZXR1cm4gKFxuICAgICAgPEdsb2JhbENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3Byb3ZpZGVyVmFsdWV9PlxuICAgICAgICA8Q2hhdEFJUGFnZUNvbnRlbnQgc2VjdGlvbj17c2VjdGlvbiBhcyBTZWN0aW9uVHlwZX0gY2xhc3NOYW1lPXtjbGFzc05hbWV9IC8+XG4gICAgICA8L0dsb2JhbENvbnRleHQuUHJvdmlkZXI+XG4gICAgKVxuICB9LFxuICBGZWF0dXJlcy5DSEFUX0FJXG4pXG5cbmNvbnN0IENoYXRBSVBhZ2VDb250ZW50ID0gKHsgc2VjdGlvbiwgY2xhc3NOYW1lIH06IHsgc2VjdGlvbjogU2VjdGlvblR5cGU7IGNsYXNzTmFtZT86IHN0cmluZyB9KSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgeyBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbihbU0VDVElPTlMuYWJtQWdlbnRdKVxuICBjb25zdCBhbXBsaXR1ZEV2ZW50ID0gdXNlRXZlbnQoKVxuXG4gIGNvbnN0IGxhbmcgPSBpMThuLmxhbmd1YWdlID09PSAnYnInID8gJ3B0LWJyJyA6IGkxOG4ubGFuZ3VhZ2VcbiAgbW9tZW50LmxvY2FsZShsYW5nKVxuXG4gIGNvbnN0IFt1c2VySW5pdGlhbE1lc3NhZ2UsIHNldFVzZXJJbml0aWFsTWVzc2FnZV0gPSB1c2VTdGF0ZTx7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRGaWxlW11cbiAgICBmYXFJZD86IHN0cmluZ1xuICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gIH0+KHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICBjb25zdCBbaW5pdGlhbENoYXRJZCwgc2V0SW5pdGlhbENoYXRJZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbmV3Q2hhdEtleSwgc2V0TmV3Q2hhdEtleV0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBbc2VuZE1lc3NhZ2VGdW5jdGlvbiwgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbl0gPSB1c2VTdGF0ZTxcbiAgICAoKG1lc3NhZ2U6IHN0cmluZywgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLCBmYXFJZD86IHN0cmluZywgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcpID0+IHZvaWQpIHwgbnVsbFxuICA+KG51bGwpXG4gIGNvbnN0IFtzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uLCBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uXSA9IHVzZVN0YXRlPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtpc1N0cmVhbWluZywgc2V0SXNTdHJlYW1pbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1dyaXRpbmcsIHNldElzV3JpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3JlZmV0Y2hDaGF0cywgc2V0UmVmZXRjaENoYXRzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY3VycmVudE9wdGlvbiwgc2V0Q3VycmVudE9wdGlvbl0gPSB1c2VTdGF0ZShvcHRpb25zLmhvbWUpXG4gIGNvbnN0IFtoYXNFcnJvciwgc2V0SGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGhhbmRsZXJzID0gdXNlTWVtbygoKSA9PiBidWlsZEhhbmRsZXJzKHNldEN1cnJlbnRPcHRpb24sIHNldEhhc0Vycm9yKSwgW10pXG4gIGNvbnN0IFtzaWRlYmFySGFzRXJyb3IsIHNldFNpZGViYXJIYXNFcnJvcl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgcmVzZXRTZWxlY3RlZENoYXRSZWYgPSB1c2VSZWY8KCgpID0+IHZvaWQpIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2xheW91dE1vZGUsIHNldExheW91dE1vZGVdID0gdXNlU3RhdGU8TWFpYUNoYXRNb2RhbExheW91dE1vZGU+KCdzaWRlYmFyJylcbiAgY29uc3QgZXhwYW5kZWQgPSBsYXlvdXRNb2RlID09PSAnZnVsbHNjcmVlbidcblxuICBjb25zdCB7XG4gICAgc2VsZWN0QWdlbnQsXG4gICAgYWdlbnQsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuXG4gIGNvbnN0IHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcjogYWdlbnRFcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICAgIHNvcnRBZ2VudHNMaXN0LFxuICB9ID0gdXNlR2V0QWdlbnRzKHsgc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBoYW5kbGVHb0hvbWU6IGhhbmRsZXJzLmhvbWUgfSlcblxuICBjb25zdCB7IHNraWxscywgbG9hZGluZzogbG9hZGluZ1NraWxscywgaGFuZGxlR2V0U2tpbGxzLCByZW1vdmVTa2lsbCB9ID0gdXNlR2V0U2tpbGxzKClcblxuICBjb25zdCBpc01BSUEgPSB2YWxpZGF0ZUlzTWFpYShhZ2VudCBhcyBBZ2VudClcblxuICBjb25zdCB1c2VySGFzUGVybWlzc2lvbnMgPVxuICAgICh1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5jcmVhdGUgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmVkaXQgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmRlbGV0ZSkgJiZcbiAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gIGNvbnN0IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGlzR2xvYmFsU3BlY2lhbGlzdCA9IGlzTUFJQSAmJiBhZ2VudD8uZW50aXR5ID09PSAnZ2xvYmFsJ1xuICAgIGNvbnN0IGlzUHJvamVjdFNwZWNpYWxpc3QgPSBpc01BSUEgJiYgKGFnZW50Py5lbnRpdHkgPT09ICdwcm9qZWN0JyB8fCBhZ2VudD8uZW50aXR5ID09IG51bGwpXG4gICAgY29uc3QgaXNDbGllbnRTcGVjaWFsaXN0ID0gaXNNQUlBICYmIGFnZW50Py5lbnRpdHkgPT09ICdjbGllbnQnXG4gICAgY29uc3QgaXNNYWlha2VyID0gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYWdlbnQpXG5cbiAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teUFnZW50cyAmJiB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMubXlBZ2VudHNcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teVNraWxscyAmJiB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMubXlTa2lsbHNcbiAgICB9XG5cbiAgICBpZiAoaXNHbG9iYWxTcGVjaWFsaXN0ICYmICFpc01haWFrZXIgJiYgYWdlbnQ/LnR5cGUgIT09ICdvcmNoZXN0cmF0b3InICYmIGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY2hhdFxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IgPSBjdXJyZW50T3B0aW9uICE9PSBvcHRpb25zLmNoYXQgJiYgaXNQcm9qZWN0U3BlY2lhbGlzdCAmJiAhcHJvamVjdFxuICAgIGNvbnN0IHNob3VsZFNob3dDbGllbnRTZWxlY3RvciA9IGN1cnJlbnRPcHRpb24gIT09IG9wdGlvbnMuY2hhdCAmJiBpc0NsaWVudFNwZWNpYWxpc3QgJiYgIWNsaWVudFxuXG4gICAgaWYgKHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IpIHJldHVybiBvcHRpb25zLnByb2plY3RTZWxlY3RvclxuICAgIGlmIChzaG91bGRTaG93Q2xpZW50U2VsZWN0b3IpIHJldHVybiBvcHRpb25zLmNsaWVudFNlbGVjdG9yXG4gICAgcmV0dXJuIGN1cnJlbnRPcHRpb25cbiAgfSwgW2N1cnJlbnRPcHRpb24sIHByb2plY3QsIGNsaWVudCwgaXNNQUlBLCBhZ2VudD8uZW50aXR5LCBhZ2VudD8ubmFtZSwgYWdlbnQ/LnR5cGVdKVxuXG4gIGNvbnN0IGlzTWFpYWtlckFnZW50U2VsZWN0ZWQgPSB1c2VNZW1vKCgpID0+IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50KGFnZW50KSwgW2FnZW50XSlcblxuICBjb25zdCBzaWRlYmFyQWdlbnRzTmF2QWN0aXZlID0gdXNlTWVtbygoKTogJ21haWFrZXInIHwgJ215QWdlbnRzJyB8ICdteVNraWxscycgfCBudWxsID0+IHtcbiAgICBpZiAoY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15U2tpbGxzKSByZXR1cm4gJ215U2tpbGxzJ1xuICAgIGlmIChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHMpIHJldHVybiAnbXlBZ2VudHMnXG4gICAgaWYgKGlzTWFpYWtlckFnZW50U2VsZWN0ZWQpIHJldHVybiAnbWFpYWtlcidcbiAgICByZXR1cm4gbnVsbFxuICB9LCBbY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBpc01haWFrZXJBZ2VudFNlbGVjdGVkXSlcblxuICBjb25zdCBhZ2VudHNGZXRjaGVkUmVmID0gdXNlUmVmKGZhbHNlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFhZ2VudHNGZXRjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIGFnZW50c0ZldGNoZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGhhbmRsZUdldEFnZW50cygpXG4gICAgfVxuICB9LCBbaGFuZGxlR2V0QWdlbnRzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uTWVyZ2VDcmVhdGVkQWdlbnQgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2VudDogbmV4dEFnZW50IH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmIChuZXh0QWdlbnQ/LmlkKSBhZGRBZ2VudChuZXh0QWdlbnQsIHsgbmF2aWdhdGVIb21lOiBmYWxzZSB9KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIG9uTWVyZ2VDcmVhdGVkQWdlbnQpXG4gIH0sIFthZGRBZ2VudF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblN5bmNFZGl0ZWRBZ2VudCA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50OiBuZXh0QWdlbnQgfSA9IChldnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKCFuZXh0QWdlbnQ/LmlkKSByZXR1cm5cbiAgICAgIHVwZGF0ZUFnZW50KG5leHRBZ2VudClcbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IG5leHRBZ2VudC5pZCkgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICB9LCBbdXBkYXRlQWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudD8uaWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3BlbkNoYXRWaWV3ID0gKCkgPT4ge1xuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuY2hhdClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICB9LCBbXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5OZXdDaGF0V2l0aEFnZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbmV4dEFnZW50ID0gKGV2ZW50IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWw/LmFnZW50XG4gICAgICBpZiAoIW5leHRBZ2VudCkgcmV0dXJuXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLW5ldy1jaGF0LXdpdGgtYWdlbnQnLCBvcGVuTmV3Q2hhdFdpdGhBZ2VudClcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLW5ldy1jaGF0LXdpdGgtYWdlbnQnLCBvcGVuTmV3Q2hhdFdpdGhBZ2VudClcbiAgfSwgW3NlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3RdKVxuXG4gIGNvbnN0IHN0YXJ0Q2hhdCA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlPzogc3RyaW5nLCBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sIGZhcUlkPzogc3RyaW5nLCBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHNpZGViYXJIYXNFcnJvcikgc2V0U2lkZWJhckhhc0Vycm9yKGZhbHNlKVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnJyxcbiAgICAgICAgYXR0YWNobWVudHM6IGF0dGFjaG1lbnRzIHx8IFtdLFxuICAgICAgICAuLi4oZmFxSWQgPyB7IGZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgLy8gU2lkZWJhciB0eXBlcyB0aGlzIHByb3AgYXMgKGNoYXRJZDogc3RyaW5nKSBidXQgcGFzc2VzIHRoZSBmdWxsIGNoYXQgb2JqZWN0IGF0IHJ1bnRpbWVcbiAgY29uc3QgZ29Ub0NoYXQgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hhdEFyZzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBjaGF0ID0gY2hhdEFyZyBhcyB1bmtub3duIGFzIENoYXRMaXN0SXRlbVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChjaGF0LnNlc3Npb25FeHRlcm5hbElkKVxuICAgICAgY29uc3Qgc2VsZWN0ZWRBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYWdlbnRJdGVtID0+IGFnZW50SXRlbS5pZCA9PT0gY2hhdC5hZ2VudElkKVxuICAgICAgaWYgKHNlbGVjdGVkQWdlbnQpIHNlbGVjdEFnZW50KHNlbGVjdGVkQWdlbnQpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIGhhbmRsZXJzLmNoYXQoKVxuICAgIH0sXG4gICAgW2hhbmRsZXJzLCBhZ2VudHMsIHNlbGVjdEFnZW50XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2VSZWFkeSA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIHNlbmRNZXNzYWdlOiAoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgICAgICkgPT4gdm9pZCxcbiAgICAgIHN0b3BHZW5lcmF0aW9uOiAoKSA9PiB2b2lkLFxuICAgICAgc3RyZWFtaW5nOiBib29sZWFuLFxuICAgICAgd3JpdGluZzogYm9vbGVhblxuICAgICkgPT4ge1xuICAgICAgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbigoKSA9PiBzZW5kTWVzc2FnZSlcbiAgICAgIHNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb24oKCkgPT4gc3RvcEdlbmVyYXRpb24pXG4gICAgICBzZXRJc1N0cmVhbWluZyhzdHJlYW1pbmcpXG4gICAgICBzZXRJc1dyaXRpbmcod3JpdGluZylcbiAgICB9LFxuICAgIFtdXG4gIClcblxuICBjb25zdCBoYW5kbGVTZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlOiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSwgZmFxSWQ/OiBzdHJpbmcsIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSBzZXRTaWRlYmFySGFzRXJyb3IoZmFsc2UpXG4gICAgICBpZiAoc2VuZE1lc3NhZ2VGdW5jdGlvbiAmJiBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgICBzZW5kTWVzc2FnZUZ1bmN0aW9uKG1lc3NhZ2UsIGF0dGFjaG1lbnRzLCBmYXFJZCwgYWdlbnRTdWdnZXN0aW9uSWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydENoYXQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzZW5kTWVzc2FnZUZ1bmN0aW9uLCBzdGFydENoYXQsIGNvbXB1dGVkQ3VycmVudE9wdGlvbiwgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgY29uc3QgaGFuZGxlR29Ib21lID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQpIHtcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIGlmIChhZ2VudD8uZW50aXR5ICE9PSAnY2xpZW50Jykgc2V0Q2xpZW50Py4obnVsbClcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKCFhZ2VudCB8fCBhZ2VudD8uaXNfZGVsZXRlZCB8fCBhZ2VudD8uaGFzX25vdF9wZXJtaXNzaW9ucyB8fCBhZ2VudD8uaGFzX25vdF9hY2Nlc3MgfHwgYWdlbnQ/LnByb2plY3RfZGVsZXRlZCkgJiZcbiAgICAgIGFnZW50cy5kYXRhLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHNlbGVjdEFnZW50KGFnZW50cy5kYXRhWzBdKVxuICAgIH1cbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQpIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQoKVxuICB9LCBbY3VycmVudE9wdGlvbiwgaXNXZWJTZWFyY2hBY3RpdmUsIHRvZ2dsZVdlYlNlYXJjaCwgYWdlbnQsIGFnZW50cywgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0XSlcblxuICBjb25zdCBoYW5kbGVSZXNldENoYXQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICBoYW5kbGVHb0hvbWUoKVxuICB9LCBbaGFuZGxlR29Ib21lXSlcblxuICBjb25zdCBoYW5kbGVPcGVuTWFya2V0cGxhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5teUFnZW50cylcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlT3BlblNraWxscyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLm15U2tpbGxzKVxuICAgIGhhbmRsZUdldFNraWxscygpXG4gIH0sIFtoYW5kbGVHZXRTa2lsbHNdKVxuXG4gIGNvbnN0IGhhbmRsZUdvVG9NYWlha2VyID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIGxldCBtYWlha2VyQWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kKChhOiBBZ2VudCkgPT4gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYSkpXG4gICAgaWYgKCFtYWlha2VyQWdlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y2xvbmUmbGFuZz0ke21hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSl9YCxcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIG1haWFrZXJBZ2VudCA9IChkYXRhLmRhdGEgfHwgW10pLmZpbmQoKGE6IEFnZW50KSA9PiBpc01hcmtldHBsYWNlR2xvYmFsQ2xvbmVBZ2VudChhKSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFtYWlha2VyQWdlbnQpIHJldHVyblxuICAgIHNldFByb2plY3QobnVsbClcbiAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgIHNlbGVjdEFnZW50KG1haWFrZXJBZ2VudClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBpZiAocmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCkgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCgpXG4gIH0sIFthZ2VudHMuZGF0YSwgaTE4bi5sYW5ndWFnZSwgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdF0pXG5cbiAgY29uc3QgaGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHMgPSB1c2VDYWxsYmFjayhcbiAgICAoYWdlbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgICByZW1vdmVBZ2VudChhZ2VudElkKVxuICAgICAgaWYgKGFnZW50Py5pZCA9PT0gYWdlbnRJZCkgc2VsZWN0Rmlyc3RBZ2VudChhZ2VudElkKVxuICAgIH0sXG4gICAgW2FnZW50Py5pZCwgcmVtb3ZlQWdlbnQsIHNlbGVjdEZpcnN0QWdlbnRdXG4gIClcblxuICBjb25zdCBzaG93TmV3Q2hhdCA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiAhPT0gb3B0aW9ucy5jaGF0XG4gIGNvbnN0IGhpZGVIZWFkZXJBZ2VudFNlbGVjdG9yID1cbiAgICBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHMgfHwgY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15U2tpbGxzXG4gIGNvbnN0IGhpZGVGb290ZXJPbk1haWFrZXJNYXJrZXRwbGFjZUhvbWUgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSAmJiBpc01haWFrZXJBZ2VudFNlbGVjdGVkXG5cbiAgLy8gU3VwcHJlc3MgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcg4oCUIGtlcHQgZm9yIHBvdGVudGlhbCBBbXBsaXR1ZGUgdHJhY2tpbmcgcGFyaXR5XG4gIHZvaWQgYW1wbGl0dWRFdmVudFxuXG4gIHJldHVybiAoXG4gICAgPFNDUGFnZVdyYXBwZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAge3ZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKHNlY3Rpb24pID8gKFxuICAgICAgICA8U2lkZWJhclxuICAgICAgICAgIG9uR29Ub0NoYXQ9e2dvVG9DaGF0fVxuICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldFNpZGViYXJIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICBoYW5kbGVHb1RvSG9tZT17aGFuZGxlR29Ib21lfVxuICAgICAgICAgIGhhbmRsZU9wZW5NYXJrZXRwbGFjZT17aGFuZGxlT3Blbk1hcmtldHBsYWNlfVxuICAgICAgICAgIGhhbmRsZU9wZW5Ta2lsbHM9e2hhbmRsZU9wZW5Ta2lsbHN9XG4gICAgICAgICAgc2hvd05ld0NoYXQ9e3Nob3dOZXdDaGF0fVxuICAgICAgICAgIHJlZmV0Y2hDaGF0cz17cmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhbmRsZVNldFJlZmV0Y2hDaGF0cz17c2V0UmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhc0Vycm9yPXtzaWRlYmFySGFzRXJyb3J9XG4gICAgICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWY9e3Jlc2V0U2VsZWN0ZWRDaGF0UmVmfVxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZT17c2lkZWJhckFnZW50c05hdkFjdGl2ZX1cbiAgICAgICAgLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAgPFNDUGFnZU1haW4+XG4gICAgICAgIDxDaGF0QUlNb2RhbEhlYWRlclxuICAgICAgICAgIGxheW91dE1vZGU9e2xheW91dE1vZGV9XG4gICAgICAgICAgb25MYXlvdXRNb2RlQ2hhbmdlPXtzZXRMYXlvdXRNb2RlfVxuICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgIGhhc0Vycm9yPXshIWFnZW50RXJyb3J9XG4gICAgICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgICAgICBsb2FkaW5nTW9yZT17bG9hZGluZ01vcmV9XG4gICAgICAgICAgaGFzTW9yZT17YWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgIGhhbmRsZVJlc2V0Q2hhdD17aGFuZGxlUmVzZXRDaGF0fVxuICAgICAgICAgIG9uQWdlbnRVcGRhdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgbG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgIHNvcnRBZ2VudHNMaXN0PXtzb3J0QWdlbnRzTGlzdH1cbiAgICAgICAgICBoaWRlQWdlbnRTZWxlY3Rvcj17aGlkZUhlYWRlckFnZW50U2VsZWN0b3J9XG4gICAgICAgICAgaGlkZUNvbnRyb2xzXG4gICAgICAgIC8+XG4gICAgICAgIHtoYXNFcnJvciA/IChcbiAgICAgICAgICA8TUFJQUVycm9yIC8+XG4gICAgICAgICkgOiB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uKSA/IChcbiAgICAgICAgICA8Q2hhdEFJQ29udGVudFxuICAgICAgICAgICAgY3VycmVudE9wdGlvbj17Y29tcHV0ZWRDdXJyZW50T3B0aW9ufVxuICAgICAgICAgICAgaGFuZGxlcnM9e3sgLi4uaGFuZGxlcnMsIGNoYXQ6IHN0YXJ0Q2hhdCwgaG9tZTogaGFuZGxlcnMuaG9tZSwgaGFuZGxlR29Ib21lIH19XG4gICAgICAgICAgICBvbkVycm9yPXsoKSA9PiBzZXRIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICAgIHJlZnM9e3sgdXNlckluaXRpYWxNZXNzYWdlLCBpbml0aWFsQ2hhdElkIH19XG4gICAgICAgICAgICBvblNlbmRNZXNzYWdlUmVhZHk9e2hhbmRsZVNlbmRNZXNzYWdlUmVhZHl9XG4gICAgICAgICAgICBleHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgICAgICBmbG9hdGluZz17ZmFsc2V9XG4gICAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgICAgb25EZWxldGVBZ2VudD17aGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHN9XG4gICAgICAgICAgICBvbkZhdm9yaXRlQWdlbnRVcGRhdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgICBoYXNNb3JlQWdlbnRzPXshIWFnZW50cy5oYXNfbW9yZX1cbiAgICAgICAgICAgIGxvYWRpbmdNb3JlQWdlbnRzPXtsb2FkaW5nTW9yZX1cbiAgICAgICAgICAgIG9uTG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgICAgb25Hb1RvTWFpYWtlcj17aGFuZGxlR29Ub01haWFrZXJ9XG4gICAgICAgICAgICBza2lsbHM9e3NraWxsc31cbiAgICAgICAgICAgIGxvYWRpbmdTa2lsbHM9e2xvYWRpbmdTa2lsbHN9XG4gICAgICAgICAgICBvbkRlbGV0ZVNraWxsPXtyZW1vdmVTa2lsbH1cbiAgICAgICAgICAgIGxvYWRpbmdBZ2VudHM9e2xvYWRpbmd9XG4gICAgICAgICAgICBhZ2VudEVycm9yPXthZ2VudEVycm9yfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFByb2plY3RTdW1tYXJ5Q29udGVudCBvblJlc3RhcnRTdW1tYXJ5PXtoYW5kbGVycy5ob21lfSAvPlxuICAgICAgICApfVxuICAgICAgICB7KChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSAmJiAhIWFnZW50cz8uZGF0YT8ubGVuZ3RoKSB8fFxuICAgICAgICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSAmJlxuICAgICAgICAgICFoaWRlRm9vdGVyT25NYWlha2VyTWFya2V0cGxhY2VIb21lICYmXG4gICAgICAgICAgIWhhc0Vycm9yICYmXG4gICAgICAgICAgIWxvYWRpbmcgJiZcbiAgICAgICAgICB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uKSAmJiAoXG4gICAgICAgICAgICA8Q2hhdEFpTW9kYWxGb290ZXJcbiAgICAgICAgICAgICAgYWdlbnQ9e2FnZW50fVxuICAgICAgICAgICAgICBoYW5kbGVTZW5kTWVzc2FnZT17aGFuZGxlU2VuZE1lc3NhZ2V9XG4gICAgICAgICAgICAgIGhhbmRsZVN0b3BHZW5lcmF0aW9uPXtzdG9wR2VuZXJhdGlvbkZ1bmN0aW9ufVxuICAgICAgICAgICAgICBpc1N0cmVhbWluZz17aXNTdHJlYW1pbmd9XG4gICAgICAgICAgICAgIGlzV3JpdGluZz17aXNXcml0aW5nfVxuICAgICAgICAgICAgICBjaGF0SWQ9e2luaXRpYWxDaGF0SWR9XG4gICAgICAgICAgICAgIG5ld0NoYXRLZXk9e25ld0NoYXRLZXl9XG4gICAgICAgICAgICAgIGxheW91dE1vZGU9e2xheW91dE1vZGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICA8L1NDUGFnZU1haW4+XG4gICAgICB7dXNlckhhc1Blcm1pc3Npb25zICYmIChcbiAgICAgICAgPEFibUFnZW50TW9kYWxcbiAgICAgICAgICBhZGRBZ2VudD17YWRkQWdlbnR9XG4gICAgICAgICAgdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fVxuICAgICAgICAgIHJlbW92ZUFnZW50PXtyZW1vdmVBZ2VudH1cbiAgICAgICAgICB1cGRhdGVBZ2VudEZhdm9yaXRlPXt1cGRhdGVBZ2VudEZhdm9yaXRlfVxuICAgICAgICAgIHNlbGVjdEZpcnN0QWdlbnQ9e3NlbGVjdEZpcnN0QWdlbnR9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgPFNuYWNrYmFyIC8+XG4gICAgPC9TQ1BhZ2VXcmFwcGVyPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ3pFLE9BQU9DLE1BQU0sTUFBTSxRQUFRO0FBQzNCLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBQzlDLFNBQVNDLE9BQU8sUUFBUSwyQkFBMkI7QUFDbkQsU0FBU0MsU0FBUyxRQUFRLHVCQUF1QjtBQUNqRCxTQUFTQyxhQUFhLFFBQVEsK0JBQStCO0FBQzdELFNBQVNDLGFBQWEsRUFBRUMsT0FBTyxRQUFRLHVDQUF1QztBQUM5RSxTQUFTQyxPQUFPLFFBQVEseUJBQXlCO0FBQ2pELFNBQVNDLFlBQVksUUFBUSx5Q0FBeUM7QUFDdEUsU0FBU0MsYUFBYSxFQUFFQyxnQkFBZ0IsUUFBUSxpQ0FBaUM7QUFFakYsU0FBU0MsaUJBQWlCLFFBQVEsNEVBQTRFO0FBQzlHLFNBQVNDLFFBQVEsUUFBUSxzQkFBc0I7QUFDL0MsU0FBU0MscUJBQXFCLFFBQVEsdUNBQXVDO0FBQzdFLFNBQVNDLGFBQWEsUUFBUSxnQ0FBZ0M7QUFDOUQsU0FBU0MsaUJBQWlCLFFBQVEsMERBQTBEO0FB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