@projectcor/maia-components 2.11.66-6 → 2.11.66-8

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 (99) hide show
  1. package/lib/components/atoms/Chip/Chip.js +50 -15
  2. package/lib/components/atoms/Chip/styles.js +9 -5
  3. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +5 -9
  4. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +2 -4
  5. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +8 -35
  6. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +28 -37
  7. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +42 -30
  8. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +21 -13
  9. package/lib/components/atoms/MAIAInput/MAIAInput.js +33 -15
  10. package/lib/components/atoms/icons/MAIAIsologo.js +2 -5
  11. package/lib/components/atoms/icons/index.js +1 -3
  12. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +2 -19
  13. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +298 -48
  14. package/lib/components/molecules/ChatAIHome/styles.js +63 -26
  15. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +57 -150
  16. package/lib/components/molecules/ChatAIMessages/newStyles.js +20 -11
  17. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +224 -80
  18. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +27 -2
  19. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +18 -18
  20. package/lib/components/molecules/ChatAIModal/constants.js +2 -6
  21. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +28 -123
  22. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +41 -66
  23. package/lib/components/molecules/ChatFooter/ChatFooter.js +76 -20
  24. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +22 -7
  25. package/lib/components/molecules/ChatFooter/styles.js +11 -2
  26. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +1 -3
  27. package/lib/components/molecules/Sidebar/Sidebar.js +21 -66
  28. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +26 -40
  29. package/lib/components/molecules/Sidebar/Sidebar.styles.js +7 -10
  30. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +1 -8
  31. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +2 -2
  32. package/lib/constants/config.js +1 -4
  33. package/lib/constants/maiaTaskPanelAccess.js +7 -5
  34. package/lib/constants/permissions/index.js +2 -2
  35. package/lib/constants/permissions/utils.js +1 -4
  36. package/lib/constants/taskLinkIcon.js +6 -15
  37. package/lib/constants/taskUrls.js +3 -1
  38. package/lib/context/global-context.js +8 -1
  39. package/lib/hooks/index.js +2 -1
  40. package/lib/hooks/useChatManager/useChatManager.js +149 -125
  41. package/lib/hooks/useChatMessages/useChatMessages.js +34 -5
  42. package/lib/hooks/useContextMentions.js +15 -60
  43. package/lib/hooks/useContextPinPopover.js +235 -0
  44. package/lib/hooks/useEntitySearch.js +96 -337
  45. package/lib/hooks/useEvent.js +3 -4
  46. package/lib/hooks/useFrequentlyAskedQuestions.js +12 -10
  47. package/lib/hooks/useFrequentlyUsedActions.js +5 -3
  48. package/lib/hooks/useMentionAllowedTypes.js +16 -41
  49. package/lib/hooks/useMentionPopover.js +49 -54
  50. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  51. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +27 -18
  52. package/lib/hooks/useProjectSearch.js +4 -28
  53. package/lib/hooks/useProjectSummaryConfig.js +74 -4
  54. package/lib/hooks/useRecentClientsSearch.js +4 -34
  55. package/lib/hooks/useRecentContexts.js +86 -0
  56. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +24 -16
  57. package/lib/lang/br/index.js +32 -60
  58. package/lib/lang/en/index.js +32 -60
  59. package/lib/lang/es/index.js +32 -60
  60. package/lib/lang/fr/index.js +32 -60
  61. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +6 -3
  62. package/lib/services/maia/Agents/getAgents.js +199 -223
  63. package/lib/services/maia/Chats/getChatMessages.js +34 -6
  64. package/lib/services/maia/Chats/getChatsByUserId.js +10 -2
  65. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +6 -4
  66. package/lib/services/maia/Orchestrator/orchestrator.js +21 -5
  67. package/lib/services/maia/RecentContexts/getRecentContexts.js +54 -0
  68. package/lib/services/maia/RecentContexts/index.js +6 -0
  69. package/lib/services/maia/index.js +4 -2
  70. package/lib/services/utils/validateIsMaia.js +2 -2
  71. package/lib/types/agent.js +1 -1
  72. package/lib/types/contextMention.js +1 -1
  73. package/lib/utils/agentDisplayName.js +11 -19
  74. package/lib/utils/contextMentionIcons.js +16 -35
  75. package/lib/utils/entityLinkRender.js +132 -0
  76. package/lib/utils/hitlAnalytics.js +5 -6
  77. package/lib/utils/renderContextMentions.js +6 -9
  78. package/package.json +1 -1
  79. package/lib/components/atoms/icons/SkillIcon.js +0 -30
  80. package/lib/components/atoms/icons/SkillsNavIcon.js +0 -27
  81. package/lib/components/atoms/icons/TaskLinkIcon.js +0 -27
  82. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +0 -357
  83. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +0 -145
  84. package/lib/components/molecules/ChatAIMySkills/index.js +0 -2
  85. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +0 -160
  86. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +0 -34
  87. package/lib/components/organisms/AbmSkillGenerateModal/index.js +0 -2
  88. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +0 -446
  89. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +0 -98
  90. package/lib/components/organisms/AbmSkillModal/index.js +0 -2
  91. package/lib/services/maia/Skills/createSkill.js +0 -39
  92. package/lib/services/maia/Skills/deleteSkill.js +0 -38
  93. package/lib/services/maia/Skills/generateSkill.js +0 -41
  94. package/lib/services/maia/Skills/getSkills.js +0 -90
  95. package/lib/services/maia/Skills/updateSkill.js +0 -39
  96. package/lib/types/skill.js +0 -2
  97. package/lib/utils/contextMentionTriggers.js +0 -53
  98. package/lib/utils/corConnectorMentionTypes.js +0 -37
  99. package/lib/utils/normalizeAgentConnectors.js +0 -32
@@ -17,17 +17,38 @@ import { useState, useCallback, useRef } from 'react';
17
17
  import { useTranslation } from 'react-i18next';
18
18
  import { useSnackBarManager } from '../../../hooks/useSnackBarManager/useSnackBarManager';
19
19
  import { fetchMaia } from '../client';
20
- import { withNormalizedConnectors } from '../../../utils/normalizeAgentConnectors';
21
20
  import { useUser } from '../../../context/cor-user';
22
21
  import { isMaiaCloneAgentsRoleBlocked } from '../../../constants/maiaTaskPanelAccess';
23
22
  import { mapCORLang } from '../../../lang/utils';
24
- var sortAgents = function sortAgents(agents) {
25
- // Separar agentes clone del resto
26
- var cloneAgents = agents.filter(function (ag) {
27
- return ag.type === 'clone';
23
+ var isMaiaAgent = function isMaiaAgent(agent) {
24
+ return agent.type === 'orchestrator';
25
+ };
26
+ var isMarketplaceMaiakerEnabled = function isMarketplaceMaiakerEnabled() {
27
+ return !!window.MAIA_MARKETPLACE_MAIAKER;
28
+ };
29
+ var is403AgentFetchError = function is403AgentFetchError(err) {
30
+ var _error$response, _error$message, _error$message2;
31
+ var error = err;
32
+ return (error === null || error === void 0 || (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 403 || (error === null || error === void 0 ? void 0 : error.status) === 403 || Boolean(error === null || error === void 0 || (_error$message = error.message) === null || _error$message === void 0 ? void 0 : _error$message.includes("You don't have permission to view agents")) || Boolean(error === null || error === void 0 || (_error$message2 = error.message) === null || _error$message2 === void 0 ? void 0 : _error$message2.includes('Failed fetching data'));
33
+ };
34
+ var mergeAgentsWithoutDuplicates = function mergeAgentsWithoutDuplicates(base, extra) {
35
+ var ids = new Set(base.map(function (agent) {
36
+ return agent.id;
37
+ }));
38
+ var merged = _toConsumableArray(base);
39
+ extra.forEach(function (agent) {
40
+ if (!ids.has(agent.id)) merged.push(agent);
28
41
  });
42
+ return merged;
43
+ };
44
+
45
+ /**
46
+ * Ordena los agentes: MAIA primero (si existe), luego favoritos alfabéticamente, luego no favoritos alfabéticamente
47
+ */
48
+ var sortAgents = function sortAgents(agents) {
49
+ var maiaAgents = agents.filter(isMaiaAgent);
29
50
  var otherAgents = agents.filter(function (ag) {
30
- return ag.type !== 'clone';
51
+ return !isMaiaAgent(ag);
31
52
  });
32
53
 
33
54
  // Separar favoritos y no favoritos
@@ -41,14 +62,7 @@ var sortAgents = function sortAgents(agents) {
41
62
  }).sort(function (a, b) {
42
63
  return a.name.localeCompare(b.name);
43
64
  });
44
-
45
- // Combinar: clones primero, luego favoritos, luego no favoritos
46
- return cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(favorites), _toConsumableArray(nonFavorites)) : [].concat(_toConsumableArray(favorites), _toConsumableArray(nonFavorites));
47
- };
48
- var normalizeCustomAgentsFromApi = function normalizeCustomAgentsFromApi(agents) {
49
- return agents.map(function (agent) {
50
- return agent.type === 'custom' ? withNormalizedConnectors(agent) : agent;
51
- });
65
+ return maiaAgents.length ? [].concat(_toConsumableArray(maiaAgents), _toConsumableArray(favorites), _toConsumableArray(nonFavorites)) : [].concat(_toConsumableArray(favorites), _toConsumableArray(nonFavorites));
52
66
  };
53
67
  export var useGetAgents = function useGetAgents(_ref) {
54
68
  var selectAgent = _ref.selectAgent,
@@ -70,14 +84,10 @@ export var useGetAgents = function useGetAgents(_ref) {
70
84
  _useState6 = _slicedToArray(_useState5, 2),
71
85
  loadingMore = _useState6[0],
72
86
  setLoadingMore = _useState6[1];
73
- var _useState7 = useState(false),
87
+ var _useState7 = useState(null),
74
88
  _useState8 = _slicedToArray(_useState7, 2),
75
- searchLoading = _useState8[0],
76
- setSearchLoading = _useState8[1];
77
- var _useState9 = useState(null),
78
- _useState0 = _slicedToArray(_useState9, 2),
79
- error = _useState0[0],
80
- setError = _useState0[1];
89
+ error = _useState8[0],
90
+ setError = _useState8[1];
81
91
  var _useSnackBarManager = useSnackBarManager(),
82
92
  handleSnackbarError = _useSnackBarManager.handleSnackbarError;
83
93
  var _useTranslation = useTranslation('chat_ai_section'),
@@ -86,10 +96,6 @@ export var useGetAgents = function useGetAgents(_ref) {
86
96
  var lastSelectedAgentRef = useRef(null);
87
97
  var isRefreshingRef = useRef(false);
88
98
  var lastRequestRef = useRef(null);
89
- var agentsRef = useRef(agents);
90
- var preSearchAgentsRef = useRef(null);
91
- agentsRef.current = agents;
92
- var canFetchCloneAgents = !isMaiaCloneAgentsRoleBlocked(user, section);
93
99
  var addAgent = useCallback(function (newAgent, options) {
94
100
  setAgents(function (prev) {
95
101
  // Verificar si el agente ya existe para evitar duplicados
@@ -187,150 +193,195 @@ export var useGetAgents = function useGetAgents(_ref) {
187
193
  }
188
194
  }, [agents.data, selectAgent]);
189
195
  var handleGetAgents = useCallback(/*#__PURE__*/function () {
190
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(agentToSelect) {
196
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(agentToSelect) {
191
197
  var _agentToSelect$id;
192
- var requestKey, isMultiAgents, agentParsed, hasMore, nextOffset, cloneAgents, customAgents, customHasMore, customNextOffset, is403, loadCloneAgents, loadCustomAgents, shouldRequestCloneAgents, queryParams, path, response, data, _responseError$respon, _responseError$messag, _responseError$messag2, is403Error, _agentParsed, _agentParsed2, _lastSelectedAgentRef, _lastSelectedAgentRef2, availableAgents, _availableAgents, firstAgent, _lastSelectedAgentRef3, _availableAgents2, _availableAgents3, firstAvailableAgent, _t3, _t4;
193
- return _regeneratorRuntime.wrap(function (_context3) {
194
- while (1) switch (_context3.prev = _context3.next) {
198
+ var requestKey, isMultiAgents, agentParsed, hasMore, nextOffset, cloneAgentsRoleBlocked, canFetchCloneAgents, fetchGlobalCloneAgents, customAgents, customHasMore, customNextOffset, is403, maiaAgents, loadCloneAgents, loadCustomAgents, queryParams, queryString, path, response, data, globalCloneAgents, _responseError$respon, _responseError$messag, _responseError$messag2, is403Error, _agentParsed, _agentParsed2, _lastSelectedAgentRef, _lastSelectedAgentRef2, availableAgents, _availableAgents, firstAgent, _lastSelectedAgentRef3, _availableAgents2, _availableAgents3, firstAvailableAgent, _t4, _t5;
199
+ return _regeneratorRuntime.wrap(function (_context4) {
200
+ while (1) switch (_context4.prev = _context4.next) {
195
201
  case 0:
196
202
  if (!isRefreshingRef.current) {
197
- _context3.next = 1;
203
+ _context4.next = 1;
198
204
  break;
199
205
  }
200
- return _context3.abrupt("return");
206
+ return _context4.abrupt("return");
201
207
  case 1:
202
208
  requestKey = (agentToSelect === null || agentToSelect === void 0 || (_agentToSelect$id = agentToSelect.id) === null || _agentToSelect$id === void 0 ? void 0 : _agentToSelect$id.toString()) || 'default';
203
209
  if (!(lastRequestRef.current === requestKey && !loading)) {
204
- _context3.next = 2;
210
+ _context4.next = 2;
205
211
  break;
206
212
  }
207
- return _context3.abrupt("return");
213
+ return _context4.abrupt("return");
208
214
  case 2:
209
215
  isRefreshingRef.current = true;
210
216
  lastRequestRef.current = requestKey;
211
217
  setLoading(true);
212
218
  setError(null);
213
219
  isMultiAgents = !!window.MAIA_CHAT_AI_FEATURE_ACCESS && !!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
214
- _context3.prev = 3;
220
+ _context4.prev = 3;
215
221
  agentParsed = [];
216
222
  hasMore = false;
217
- nextOffset = null; // Si tiene feature access multi agents, hacer dos queries (Maia + custom) en cualquier sección
218
- if (!isMultiAgents) {
219
- _context3.next = 5;
220
- break;
221
- }
222
- // Query clone (Maia) y custom son independientes → se disparan en paralelo.
223
- cloneAgents = [];
224
- customAgents = [];
225
- customHasMore = false;
226
- customNextOffset = null;
227
- is403 = function is403(err) {
228
- var _err$response, _err$message, _err$message2;
229
- return (err === null || err === void 0 || (_err$response = err.response) === null || _err$response === void 0 ? void 0 : _err$response.status) === 403 || (err === null || err === void 0 ? void 0 : err.status) === 403 || (err === null || err === void 0 || (_err$message = err.message) === null || _err$message === void 0 ? void 0 : _err$message.includes("You don't have permission to view agents")) || (err === null || err === void 0 || (_err$message2 = err.message) === null || _err$message2 === void 0 ? void 0 : _err$message2.includes('Failed fetching data'));
230
- }; // fetchCOR lanza esto para 403 sin 'Access denied'
231
- loadCloneAgents = /*#__PURE__*/function () {
223
+ nextOffset = null;
224
+ cloneAgentsRoleBlocked = isMaiaCloneAgentsRoleBlocked(user, section);
225
+ canFetchCloneAgents = !cloneAgentsRoleBlocked;
226
+ fetchGlobalCloneAgents = /*#__PURE__*/function () {
232
227
  var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
233
- var _maiaData$data, orderParam, maiaResponse, maiaData, _t;
228
+ var cloneResponse, cloneData, _t;
234
229
  return _regeneratorRuntime.wrap(function (_context) {
235
230
  while (1) switch (_context.prev = _context.next) {
236
231
  case 0:
237
- if (canFetchCloneAgents) {
232
+ if (!(!isMarketplaceMaiakerEnabled() || !canFetchCloneAgents)) {
238
233
  _context.next = 1;
239
234
  break;
240
235
  }
241
- return _context.abrupt("return");
236
+ return _context.abrupt("return", []);
242
237
  case 1:
243
238
  _context.prev = 1;
244
- orderParam = section === 'client' ? '&order=client,project' : section === 'project' || section === 'header' || section === 'task' ? '&order=project,client' : '';
245
239
  _context.next = 2;
246
240
  return fetchMaia({
247
- path: "agents?agent_type=clone&lang=".concat(mapCORLang(i18n.language)).concat(orderParam),
241
+ path: "agents?agent_type=clone&entity=global&lang=".concat(mapCORLang(i18n.language)),
248
242
  method: 'GET'
249
243
  });
250
244
  case 2:
251
- maiaResponse = _context.sent;
245
+ cloneResponse = _context.sent;
252
246
  _context.next = 3;
253
- return maiaResponse.json();
247
+ return cloneResponse.json();
254
248
  case 3:
255
- maiaData = _context.sent;
256
- cloneAgents = ((_maiaData$data = maiaData.data) === null || _maiaData$data === void 0 ? void 0 : _maiaData$data.filter(function (ag) {
249
+ cloneData = _context.sent;
250
+ return _context.abrupt("return", (cloneData.data || []).filter(function (ag) {
257
251
  return ag.type === 'clone';
258
- })) || [];
259
- _context.next = 5;
260
- break;
252
+ }));
261
253
  case 4:
262
254
  _context.prev = 4;
263
255
  _t = _context["catch"](1);
264
- if (is403(_t)) {
256
+ if (!is403AgentFetchError(_t)) {
265
257
  _context.next = 5;
266
258
  break;
267
259
  }
268
- throw _t;
260
+ return _context.abrupt("return", []);
269
261
  case 5:
262
+ throw _t;
263
+ case 6:
270
264
  case "end":
271
265
  return _context.stop();
272
266
  }
273
267
  }, _callee, null, [[1, 4]]);
274
268
  }));
275
- return function loadCloneAgents() {
269
+ return function fetchGlobalCloneAgents() {
276
270
  return _ref6.apply(this, arguments);
277
271
  };
278
- }();
279
- loadCustomAgents = /*#__PURE__*/function () {
272
+ }(); // Si tiene feature access multi agents, hacer dos queries (Maia + custom) en cualquier sección
273
+ if (!isMultiAgents) {
274
+ _context4.next = 5;
275
+ break;
276
+ }
277
+ // Query clone (Maia) y custom son independientes → se disparan en paralelo.
278
+ customAgents = [];
279
+ customHasMore = false;
280
+ customNextOffset = null;
281
+ is403 = is403AgentFetchError;
282
+ maiaAgents = [];
283
+ loadCloneAgents = /*#__PURE__*/function () {
280
284
  var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
281
- var customResponse, customData, _t2;
285
+ var _maiaData$data, maiaResponse, maiaData, globalCloneAgents, _t2;
282
286
  return _regeneratorRuntime.wrap(function (_context2) {
283
287
  while (1) switch (_context2.prev = _context2.next) {
284
288
  case 0:
285
- _context2.prev = 0;
286
- _context2.next = 1;
289
+ if (canFetchCloneAgents) {
290
+ _context2.next = 1;
291
+ break;
292
+ }
293
+ return _context2.abrupt("return");
294
+ case 1:
295
+ _context2.prev = 1;
296
+ _context2.next = 2;
297
+ return fetchMaia({
298
+ path: "agents?agent_type=orchestrator&lang=".concat(mapCORLang(i18n.language)),
299
+ method: 'GET'
300
+ });
301
+ case 2:
302
+ maiaResponse = _context2.sent;
303
+ _context2.next = 3;
304
+ return maiaResponse.json();
305
+ case 3:
306
+ maiaData = _context2.sent;
307
+ maiaAgents = ((_maiaData$data = maiaData.data) === null || _maiaData$data === void 0 ? void 0 : _maiaData$data.filter(isMaiaAgent)) || [];
308
+ _context2.next = 4;
309
+ return fetchGlobalCloneAgents();
310
+ case 4:
311
+ globalCloneAgents = _context2.sent;
312
+ maiaAgents = mergeAgentsWithoutDuplicates(maiaAgents, globalCloneAgents);
313
+ _context2.next = 6;
314
+ break;
315
+ case 5:
316
+ _context2.prev = 5;
317
+ _t2 = _context2["catch"](1);
318
+ if (is403(_t2)) {
319
+ _context2.next = 6;
320
+ break;
321
+ }
322
+ throw _t2;
323
+ case 6:
324
+ case "end":
325
+ return _context2.stop();
326
+ }
327
+ }, _callee2, null, [[1, 5]]);
328
+ }));
329
+ return function loadCloneAgents() {
330
+ return _ref7.apply(this, arguments);
331
+ };
332
+ }();
333
+ loadCustomAgents = /*#__PURE__*/function () {
334
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
335
+ var customResponse, customData, _t3;
336
+ return _regeneratorRuntime.wrap(function (_context3) {
337
+ while (1) switch (_context3.prev = _context3.next) {
338
+ case 0:
339
+ _context3.prev = 0;
340
+ _context3.next = 1;
287
341
  return fetchMaia({
288
342
  path: 'agents?agent_type=custom&limit=7&offset=0',
289
343
  method: 'GET'
290
344
  });
291
345
  case 1:
292
- customResponse = _context2.sent;
293
- _context2.next = 2;
346
+ customResponse = _context3.sent;
347
+ _context3.next = 2;
294
348
  return customResponse.json();
295
349
  case 2:
296
- customData = _context2.sent;
297
- customAgents = normalizeCustomAgentsFromApi(customData.data || []);
350
+ customData = _context3.sent;
351
+ customAgents = customData.data || [];
298
352
  customHasMore = customData.has_more || false;
299
353
  customNextOffset = customData.next_offset || null;
300
- _context2.next = 4;
354
+ _context3.next = 4;
301
355
  break;
302
356
  case 3:
303
- _context2.prev = 3;
304
- _t2 = _context2["catch"](0);
305
- if (is403(_t2)) {
306
- _context2.next = 4;
357
+ _context3.prev = 3;
358
+ _t3 = _context3["catch"](0);
359
+ if (is403(_t3)) {
360
+ _context3.next = 4;
307
361
  break;
308
362
  }
309
- throw _t2;
363
+ throw _t3;
310
364
  case 4:
311
365
  case "end":
312
- return _context2.stop();
366
+ return _context3.stop();
313
367
  }
314
- }, _callee2, null, [[0, 3]]);
368
+ }, _callee3, null, [[0, 3]]);
315
369
  }));
316
370
  return function loadCustomAgents() {
317
- return _ref7.apply(this, arguments);
371
+ return _ref8.apply(this, arguments);
318
372
  };
319
373
  }();
320
- _context3.next = 4;
374
+ _context4.next = 4;
321
375
  return Promise.all([loadCloneAgents(), loadCustomAgents()]);
322
376
  case 4:
323
377
  // Combinar: agentes clone primero, luego los custom (si existen)
324
378
  // Si el usuario tiene un rol deshabilitado, no incluir cloneAgents
325
379
  if (!canFetchCloneAgents) {
326
- // Rol sin acceso a clones (p. ej. colaborador fuera del piloto): solo customAgents
380
+ // Rol sin acceso a clones (p. ej. freelancer/cliente o colaborador en project/client): solo customAgents
327
381
  // Si customAgents está vacío (por 403), agentParsed será []
328
382
  agentParsed = customAgents;
329
383
  } else {
330
- // Rol con acceso a clones: cloneAgents + customAgents
331
- // Si customAgents está vacío (por 403) pero hay cloneAgents, agentParsed tendrá los clones
332
- // Si no hay cloneAgents ni customAgents, agentParsed será []
333
- agentParsed = cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(customAgents)) : customAgents;
384
+ agentParsed = maiaAgents.length ? [].concat(_toConsumableArray(maiaAgents), _toConsumableArray(customAgents)) : customAgents;
334
385
  }
335
386
  // Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
336
387
  agentParsed = sortAgents(agentParsed);
@@ -346,64 +397,60 @@ export var useGetAgents = function useGetAgents(_ref) {
346
397
  if (agentParsed.length === 0) {
347
398
  setError(null);
348
399
  }
349
- _context3.next = 12;
400
+ _context4.next = 12;
350
401
  break;
351
402
  case 5:
352
- shouldRequestCloneAgents = canFetchCloneAgents && (section === 'project' || section === 'client' || section === 'header' || section === 'task');
353
- if (shouldRequestCloneAgents) {
354
- _context3.next = 6;
355
- break;
356
- }
357
- setAgents({
358
- data: [],
359
- has_more: false,
360
- next_offset: null
361
- });
362
- setError(null);
363
- _context3.next = 12;
364
- break;
365
- case 6:
403
+ // Lógica para project, client o header sin multiAgents (mismo criterio de orden project/client; header añade paginación)
366
404
  queryParams = new URLSearchParams();
367
- queryParams.append('agent_type', 'clone');
368
- queryParams.append('lang', mapCORLang(i18n.language));
369
- queryParams.append('order', section === 'client' ? 'client,project' : 'project,client');
370
- if (section === 'header') {
371
- queryParams.append('limit', '7');
372
- queryParams.append('offset', '0');
405
+ if (section === 'project' || section === 'client' || section === 'header' || section === 'task') {
406
+ queryParams.append('agent_type', 'orchestrator');
407
+ queryParams.append('lang', mapCORLang(i18n.language));
408
+ if (section === 'header') {
409
+ queryParams.append('limit', '7');
410
+ queryParams.append('offset', '0');
411
+ }
373
412
  }
374
- path = "agents?".concat(queryParams.toString());
375
- _context3.prev = 7;
376
- _context3.next = 8;
413
+ queryString = queryParams.toString();
414
+ path = "agents".concat(queryString ? "?".concat(queryString) : '');
415
+ _context4.prev = 6;
416
+ _context4.next = 7;
377
417
  return fetchMaia({
378
418
  path: path,
379
419
  method: 'GET'
380
420
  });
381
- case 8:
382
- response = _context3.sent;
383
- _context3.next = 9;
421
+ case 7:
422
+ response = _context4.sent;
423
+ _context4.next = 8;
384
424
  return response.json();
385
- case 9:
386
- data = _context3.sent;
425
+ case 8:
426
+ data = _context4.sent;
427
+ // data.data ya contiene el/los agentes orquestadores de la query agent_type=orchestrator
387
428
  agentParsed = data.data || [];
429
+ _context4.next = 9;
430
+ return fetchGlobalCloneAgents();
431
+ case 9:
432
+ globalCloneAgents = _context4.sent;
433
+ agentParsed = mergeAgentsWithoutDuplicates(agentParsed, globalCloneAgents);
434
+ // Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
388
435
  agentParsed = sortAgents(agentParsed);
389
436
  hasMore = data.has_more;
390
437
  nextOffset = data.next_offset;
391
438
  setAgents(_objectSpread(_objectSpread({}, data), {}, {
392
439
  data: agentParsed
393
440
  }));
394
- _context3.next = 12;
441
+ _context4.next = 12;
395
442
  break;
396
443
  case 10:
397
- _context3.prev = 10;
398
- _t3 = _context3["catch"](7);
444
+ _context4.prev = 10;
445
+ _t4 = _context4["catch"](6);
399
446
  // Verificar si el error es 403
400
447
  // fetchCOR puede lanzar diferentes tipos de errores:
401
448
  // 1. Error con errorData.detail si incluye 'Access denied'
402
449
  // 2. Error genérico 'Failed fetching data' si es 403 pero no incluye 'Access denied'
403
450
  // 3. Necesitamos verificar el status code si está disponible
404
- is403Error = (_t3 === null || _t3 === void 0 || (_responseError$respon = _t3.response) === null || _responseError$respon === void 0 ? void 0 : _responseError$respon.status) === 403 || (_t3 === null || _t3 === void 0 ? void 0 : _t3.status) === 403 || (_t3 === null || _t3 === void 0 || (_responseError$messag = _t3.message) === null || _responseError$messag === void 0 ? void 0 : _responseError$messag.includes("You don't have permission to view agents")) || (_t3 === null || _t3 === void 0 || (_responseError$messag2 = _t3.message) === null || _responseError$messag2 === void 0 ? void 0 : _responseError$messag2.includes('Failed fetching data')); // fetchCOR lanza esto para 403 sin 'Access denied'
451
+ is403Error = (_t4 === null || _t4 === void 0 || (_responseError$respon = _t4.response) === null || _responseError$respon === void 0 ? void 0 : _responseError$respon.status) === 403 || (_t4 === null || _t4 === void 0 ? void 0 : _t4.status) === 403 || (_t4 === null || _t4 === void 0 || (_responseError$messag = _t4.message) === null || _responseError$messag === void 0 ? void 0 : _responseError$messag.includes("You don't have permission to view agents")) || (_t4 === null || _t4 === void 0 || (_responseError$messag2 = _t4.message) === null || _responseError$messag2 === void 0 ? void 0 : _responseError$messag2.includes('Failed fetching data')); // fetchCOR lanza esto para 403 sin 'Access denied'
405
452
  if (!is403Error) {
406
- _context3.next = 11;
453
+ _context4.next = 11;
407
454
  break;
408
455
  }
409
456
  // Si es 403, establecer agentes vacíos y continuar
@@ -413,10 +460,10 @@ export var useGetAgents = function useGetAgents(_ref) {
413
460
  next_offset: null
414
461
  });
415
462
  setError(null);
416
- _context3.next = 12;
463
+ _context4.next = 12;
417
464
  break;
418
465
  case 11:
419
- throw _t3;
466
+ throw _t4;
420
467
  case 12:
421
468
  // Lógica de select agent - Solo seleccionar si hay agentes disponibles
422
469
  if (agentParsed.length > 0) {
@@ -430,8 +477,8 @@ export var useGetAgents = function useGetAgents(_ref) {
430
477
  } else if ((_agentParsed = agentParsed) !== null && _agentParsed !== void 0 && _agentParsed[0] && (!agent || !agentParsed.find(function (a) {
431
478
  return a.id === agent.id;
432
479
  }))) {
433
- availableAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS && canFetchCloneAgents ? agentParsed : agentParsed.filter(function (agentItem) {
434
- return agentItem.type !== 'clone';
480
+ availableAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS && !cloneAgentsRoleBlocked ? agentParsed : agentParsed.filter(function (agentItem) {
481
+ return !isMaiaAgent(agentItem);
435
482
  });
436
483
  _availableAgents = _slicedToArray(availableAgents, 1), firstAgent = _availableAgents[0];
437
484
  if (firstAgent && ((_lastSelectedAgentRef2 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef2 === void 0 ? void 0 : _lastSelectedAgentRef2.id) !== firstAgent.id) {
@@ -439,8 +486,8 @@ export var useGetAgents = function useGetAgents(_ref) {
439
486
  selectAgent(firstAgent);
440
487
  }
441
488
  } else if (agentToSelect && (_agentParsed2 = agentParsed) !== null && _agentParsed2 !== void 0 && _agentParsed2.length) {
442
- _availableAgents2 = window.MAIA_CHAT_AI_FEATURE_ACCESS && canFetchCloneAgents ? agentParsed : agentParsed.filter(function (agentItem) {
443
- return agentItem.type !== 'clone';
489
+ _availableAgents2 = window.MAIA_CHAT_AI_FEATURE_ACCESS && !cloneAgentsRoleBlocked ? agentParsed : agentParsed.filter(function (agentItem) {
490
+ return !isMaiaAgent(agentItem);
444
491
  });
445
492
  _availableAgents3 = _slicedToArray(_availableAgents2, 1), firstAvailableAgent = _availableAgents3[0];
446
493
  if (firstAvailableAgent && ((_lastSelectedAgentRef3 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef3 === void 0 ? void 0 : _lastSelectedAgentRef3.id) !== firstAvailableAgent.id) {
@@ -450,95 +497,32 @@ export var useGetAgents = function useGetAgents(_ref) {
450
497
  }
451
498
  }
452
499
  setLoading(false);
453
- _context3.next = 14;
500
+ _context4.next = 14;
454
501
  break;
455
502
  case 13:
456
- _context3.prev = 13;
457
- _t4 = _context3["catch"](3);
458
- setError(_t4 instanceof Error ? _t4.message : 'An unknown error occurred');
503
+ _context4.prev = 13;
504
+ _t5 = _context4["catch"](3);
505
+ setError(_t5 instanceof Error ? _t5.message : 'An unknown error occurred');
459
506
  setLoading(false);
460
507
  case 14:
461
- _context3.prev = 14;
508
+ _context4.prev = 14;
462
509
  isRefreshingRef.current = false;
463
510
  setTimeout(function () {
464
511
  if (!isRefreshingRef.current) {
465
512
  lastRequestRef.current = null;
466
513
  }
467
514
  }, 100);
468
- return _context3.finish(14);
515
+ return _context4.finish(14);
469
516
  case 15:
470
517
  case "end":
471
- return _context3.stop();
518
+ return _context4.stop();
472
519
  }
473
- }, _callee3, null, [[3, 13, 14, 15], [7, 10]]);
520
+ }, _callee4, null, [[3, 13, 14, 15], [6, 10]]);
474
521
  }));
475
522
  return function (_x) {
476
523
  return _ref5.apply(this, arguments);
477
524
  };
478
- }(), [selectAgent, section, agent, loading, canFetchCloneAgents, i18n.language]);
479
- var searchCustomAgents = useCallback(/*#__PURE__*/function () {
480
- var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(query) {
481
- var response, data, _t5;
482
- return _regeneratorRuntime.wrap(function (_context4) {
483
- while (1) switch (_context4.prev = _context4.next) {
484
- case 0:
485
- if (query) {
486
- _context4.next = 1;
487
- break;
488
- }
489
- if (preSearchAgentsRef.current) {
490
- setAgents(preSearchAgentsRef.current);
491
- preSearchAgentsRef.current = null;
492
- }
493
- return _context4.abrupt("return");
494
- case 1:
495
- if (!preSearchAgentsRef.current) {
496
- preSearchAgentsRef.current = agentsRef.current;
497
- }
498
- setSearchLoading(true);
499
- _context4.prev = 2;
500
- _context4.next = 3;
501
- return fetchMaia({
502
- path: "agents?agent_type=custom&limit=20&offset=0&q=".concat(encodeURIComponent(query)),
503
- method: 'GET'
504
- });
505
- case 3:
506
- response = _context4.sent;
507
- _context4.next = 4;
508
- return response.json();
509
- case 4:
510
- data = _context4.sent;
511
- setAgents(function (prev) {
512
- var cloneAgents = prev.data.filter(function (ag) {
513
- return ag.type === 'clone';
514
- });
515
- var customResults = data.data || [];
516
- return {
517
- data: cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(customResults)) : customResults,
518
- has_more: false,
519
- next_offset: null
520
- };
521
- });
522
- _context4.next = 6;
523
- break;
524
- case 5:
525
- _context4.prev = 5;
526
- _t5 = _context4["catch"](2);
527
- handleSnackbarError(t('snackbar.loadMoreAgents.error'));
528
- case 6:
529
- _context4.prev = 6;
530
- setSearchLoading(false);
531
- return _context4.finish(6);
532
- case 7:
533
- case "end":
534
- return _context4.stop();
535
- }
536
- }, _callee4, null, [[2, 5, 6, 7]]);
537
- }));
538
- return function (_x2) {
539
- return _ref8.apply(this, arguments);
540
- };
541
- }(), []);
525
+ }(), [selectAgent, section, agent, loading]);
542
526
  var loadMoreAgents = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
543
527
  var isMultiAgents, canLoadMore, path, queryParams, response, data, _t6;
544
528
  return _regeneratorRuntime.wrap(function (_context5) {
@@ -560,11 +544,10 @@ export var useGetAgents = function useGetAgents(_ref) {
560
544
  // Mantener cantidad impar de cards: primera carga 7, siguientes +6 (7, 13, 19, ...)
561
545
  path = "agents?agent_type=custom&limit=6&offset=".concat(agents.next_offset);
562
546
  } else {
563
- // Si no es multiAgents, cargar más agentes clone (Maia) — mismo order que project para header
547
+ // Si no es multiAgents, cargar más agentes orquestadores (MAIA)
564
548
  queryParams = new URLSearchParams();
565
- queryParams.append('agent_type', 'clone');
549
+ queryParams.append('agent_type', 'orchestrator');
566
550
  queryParams.append('lang', mapCORLang(i18n.language));
567
- queryParams.append('order', 'project,client');
568
551
  queryParams.append('limit', '7');
569
552
  queryParams.append('offset', agents.next_offset.toString());
570
553
  path = "agents?".concat(queryParams.toString());
@@ -583,29 +566,24 @@ export var useGetAgents = function useGetAgents(_ref) {
583
566
  // Acumular agentes, excluyendo duplicados
584
567
  setAgents(function (prev) {
585
568
  if (isMultiAgents) {
586
- // Lógica para multiAgents: separar clone y custom
587
- // Mantener todos los agentes clone existentes al inicio
588
- var existingCloneAgents = prev.data.filter(function (ag) {
589
- return ag.type === 'clone';
590
- });
569
+ // Lógica para multiAgents: separar MAIA y custom
570
+ var existingMaiaAgents = prev.data.filter(isMaiaAgent);
591
571
 
592
- // Obtener IDs existentes (excluyendo clones)
572
+ // Obtener IDs existentes (excluyendo MAIA)
593
573
  var _existingIds = new Set(prev.data.filter(function (ag) {
594
- return ag.type !== 'clone';
574
+ return !isMaiaAgent(ag);
595
575
  }).map(function (ag) {
596
576
  return ag.id;
597
577
  }));
598
578
 
599
- // Filtrar nuevos agents que no estén ya en la lista (y que no sean clone)
600
- var _newAgents = normalizeCustomAgentsFromApi(data.data.filter(function (ag) {
601
- return ag.type !== 'clone' && !_existingIds.has(ag.id);
602
- }));
603
-
604
- // Construir el nuevo array: clones primero, luego los agents existentes que no sean clone, luego los nuevos
605
- var _newData = existingCloneAgents.length ? [].concat(_toConsumableArray(existingCloneAgents), _toConsumableArray(prev.data.filter(function (ag) {
606
- return ag.type !== 'clone';
579
+ // Filtrar nuevos agents que no estén ya en la lista (y que no sean MAIA)
580
+ var _newAgents = data.data.filter(function (ag) {
581
+ return !isMaiaAgent(ag) && !_existingIds.has(ag.id);
582
+ });
583
+ var _newData = existingMaiaAgents.length ? [].concat(_toConsumableArray(existingMaiaAgents), _toConsumableArray(prev.data.filter(function (ag) {
584
+ return !isMaiaAgent(ag);
607
585
  })), _toConsumableArray(_newAgents)) : [].concat(_toConsumableArray(prev.data.filter(function (ag) {
608
- return ag.type !== 'clone';
586
+ return !isMaiaAgent(ag);
609
587
  })), _toConsumableArray(_newAgents));
610
588
 
611
589
  // Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
@@ -616,7 +594,7 @@ export var useGetAgents = function useGetAgents(_ref) {
616
594
  next_offset: data.next_offset
617
595
  };
618
596
  }
619
- // Lógica para !isMultiAgents: todos los agentes son clone, simplemente agregar evitando duplicados
597
+ // Lógica para !isMultiAgents: agregar evitando duplicados
620
598
  var existingIds = new Set(prev.data.map(function (ag) {
621
599
  return ag.id;
622
600
  }));
@@ -654,8 +632,6 @@ export var useGetAgents = function useGetAgents(_ref) {
654
632
  error: error,
655
633
  handleGetAgents: handleGetAgents,
656
634
  loadMoreAgents: loadMoreAgents,
657
- searchCustomAgents: searchCustomAgents,
658
- searchLoading: searchLoading,
659
635
  addAgent: addAgent,
660
636
  removeAgent: removeAgent,
661
637
  updateAgent: updateAgent,
@@ -664,4 +640,4 @@ export var useGetAgents = function useGetAgents(_ref) {
664
640
  sortAgentsList: sortAgentsList
665
641
  };
666
642
  };
667
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlVHJhbnNsYXRpb24iLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJmZXRjaE1haWEiLCJ3aXRoTm9ybWFsaXplZENvbm5lY3RvcnMiLCJ1c2VVc2VyIiwiaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCIsIm1hcENPUkxhbmciLCJzb3J0QWdlbnRzIiwiYWdlbnRzIiwiY2xvbmVBZ2VudHMiLCJmaWx0ZXIiLCJhZyIsInR5cGUiLCJvdGhlckFnZW50cyIsImZhdm9yaXRlcyIsImlzX2Zhdm9yaXRlIiwic29ydCIsImEiLCJiIiwibmFtZSIsImxvY2FsZUNvbXBhcmUiLCJub25GYXZvcml0ZXMiLCJsZW5ndGgiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJub3JtYWxpemVDdXN0b21BZ2VudHNGcm9tQXBpIiwibWFwIiwiYWdlbnQiLCJ1c2VHZXRBZ2VudHMiLCJfcmVmIiwic2VsZWN0QWdlbnQiLCJzZWN0aW9uIiwiaGFuZGxlR29Ib21lIiwidXNlciIsIl91c2VTdGF0ZSIsImRhdGEiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRBZ2VudHMiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsb2FkaW5nTW9yZSIsInNldExvYWRpbmdNb3JlIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJzZWFyY2hMb2FkaW5nIiwic2V0U2VhcmNoTG9hZGluZyIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwiZXJyb3IiLCJzZXRFcnJvciIsIl91c2VTbmFja0Jhck1hbmFnZXIiLCJoYW5kbGVTbmFja2JhckVycm9yIiwiX3VzZVRyYW5zbGF0aW9uIiwidCIsImkxOG4iLCJsYXN0U2VsZWN0ZWRBZ2VudFJlZiIsImlzUmVmcmVzaGluZ1JlZiIsImxhc3RSZXF1ZXN0UmVmIiwiYWdlbnRzUmVmIiwicHJlU2VhcmNoQWdlbnRzUmVmIiwiY3VycmVudCIsImNhbkZldGNoQ2xvbmVBZ2VudHMiLCJhZGRBZ2VudCIsIm5ld0FnZW50Iiwib3B0aW9ucyIsInByZXYiLCJhZ2VudEV4aXN0cyIsInNvbWUiLCJleGlzdGluZ0FnZW50IiwiaWQiLCJuZXdEYXRhIiwic29ydGVkRGF0YSIsIl9vYmplY3RTcHJlYWQiLCJuYXZpZ2F0ZUhvbWUiLCJyZW1vdmVBZ2VudCIsImFnZW50SWQiLCJ0b1N0cmluZyIsInVwZGF0ZUFnZW50IiwidXBkYXRlZEFnZW50IiwidXBkYXRlZERhdGEiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2hvdWxkU29ydCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIl9yZWYyIiwibWVzc2FnZSIsImFnZW50RmllbGRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwibWVyZ2VkQWdlbnQiLCJmaW5hbERhdGEiLCJmaW5kIiwiX3JlZjMiLCJfZXhjbHVkZWQyIiwiX3JlZjQiLCJfZXhjbHVkZWQzIiwic29ydEFnZW50c0xpc3QiLCJzZWxlY3RGaXJzdEFnZW50IiwiZmlyc3RBZ2VudCIsImZpbmRJbmRleCIsImFnZW50RGF0YSIsImhhbmRsZUdldEFnZW50cyIsIl9yZWY1IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUzIiwiYWdlbnRUb1NlbGVjdCIsIl9hZ2VudFRvU2VsZWN0JGlkIiwicmVxdWVzdEtleSIsImlzTXVsdGlBZ2VudHMiLCJhZ2VudFBhcnNlZCIsImhhc01vcmUiLCJuZXh0T2Zmc2V0IiwiY3VzdG9tQWdlbnRzIiwiY3VzdG9tSGFzTW9yZSIsImN1c3RvbU5leHRPZmZzZXQiLCJpczQwMyIsImxvYWRDbG9uZUFnZW50cyIsImxvYWRDdXN0b21BZ2VudHMiLCJzaG91bGRSZXF1ZXN0Q2xvbmVBZ2VudHMiLCJxdWVyeVBhcmFtcyIsInBhdGgiLCJyZXNwb25zZSIsIl9yZXNwb25zZUVycm9yJHJlc3BvbiIsIl9yZXNwb25zZUVycm9yJG1lc3NhZyIsIl9yZXNwb25zZUVycm9yJG1lc3NhZzIiLCJpczQwM0Vycm9yIiwiX2FnZW50UGFyc2VkIiwiX2FnZW50UGFyc2VkMiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZjIiLCJhdmFpbGFibGVBZ2VudHMiLCJfYXZhaWxhYmxlQWdlbnRzIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmMyIsIl9hdmFpbGFibGVBZ2VudHMyIiwiX2F2YWlsYWJsZUFnZW50czMiLCJmaXJzdEF2YWlsYWJsZUFnZW50IiwiX3QzIiwiX3Q0Iiwid3JhcCIsIl9jb250ZXh0MyIsIm5leHQiLCJhYnJ1cHQiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiZXJyIiwiX2VyciRyZXNwb25zZSIsIl9lcnIkbWVzc2FnZSIsIl9lcnIkbWVzc2FnZTIiLCJzdGF0dXMiLCJpbmNsdWRlcyIsIl9yZWY2IiwiX2NhbGxlZSIsIl9tYWlhRGF0YSRkYXRhIiwib3JkZXJQYXJhbSIsIm1haWFSZXNwb25zZSIsIm1haWFEYXRhIiwiX3QiLCJfY29udGV4dCIsImxhbmd1YWdlIiwibWV0aG9kIiwic2VudCIsImpzb24iLCJzdG9wIiwiYXBwbHkiLCJfcmVmNyIsIl9jYWxsZWUyIiwiY3VzdG9tUmVzcG9uc2UiLCJjdXN0b21EYXRhIiwiX3QyIiwiX2NvbnRleHQyIiwiaGFzX21vcmUiLCJuZXh0X29mZnNldCIsIlByb21pc2UiLCJhbGwiLCJVUkxTZWFyY2hQYXJhbXMiLCJhcHBlbmQiLCJhZ2VudFRvUmVxdWVzdCIsImFnZW50SXRlbSIsIkVycm9yIiwic2V0VGltZW91dCIsImZpbmlzaCIsIl94Iiwic2VhcmNoQ3VzdG9tQWdlbnRzIiwiX3JlZjgiLCJfY2FsbGVlNCIsInF1ZXJ5IiwiX3Q1IiwiX2NvbnRleHQ0IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiY3VzdG9tUmVzdWx0cyIsIl94MiIsImxvYWRNb3JlQWdlbnRzIiwiX2NhbGxlZTUiLCJjYW5Mb2FkTW9yZSIsIl90NiIsIl9jb250ZXh0NSIsImV4aXN0aW5nQ2xvbmVBZ2VudHMiLCJleGlzdGluZ0lkcyIsIlNldCIsIm5ld0FnZW50cyIsImhhcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUNhbGxiYWNrLCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVNuYWNrQmFyTWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNuYWNrQmFyTWFuYWdlci91c2VTbmFja0Jhck1hbmFnZXInXG5pbXBvcnQgeyBmZXRjaE1haWEgfSBmcm9tICcuLi9jbGllbnQnXG5pbXBvcnQgeyB3aXRoTm9ybWFsaXplZENvbm5lY3RvcnMgfSBmcm9tICcuLi8uLi8uLi91dGlscy9ub3JtYWxpemVBZ2VudENvbm5lY3RvcnMnXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBpc01haWFDbG9uZUFnZW50c1JvbGVCbG9ja2VkIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL21haWFUYXNrUGFuZWxBY2Nlc3MnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vLi4vbGFuZy91dGlscydcblxuY29uc3Qgc29ydEFnZW50cyA9IChhZ2VudHM6IEFnZW50W10pOiBBZ2VudFtdID0+IHtcbiAgLy8gU2VwYXJhciBhZ2VudGVzIGNsb25lIGRlbCByZXN0b1xuICBjb25zdCBjbG9uZUFnZW50cyA9IGFnZW50cy5maWx0ZXIoYWcgPT4gYWcudHlwZSA9PT0gJ2Nsb25lJylcbiAgY29uc3Qgb3RoZXJBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGFnID0+IGFnLnR5cGUgIT09ICdjbG9uZScpXG5cbiAgLy8gU2VwYXJhciBmYXZvcml0b3MgeSBubyBmYXZvcml0b3NcbiAgY29uc3QgZmF2b3JpdGVzID0gb3RoZXJBZ2VudHMuZmlsdGVyKGFnID0+IGFnLmlzX2Zhdm9yaXRlKS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuICBjb25zdCBub25GYXZvcml0ZXMgPSBvdGhlckFnZW50cy5maWx0ZXIoYWcgPT4gIWFnLmlzX2Zhdm9yaXRlKS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuXG4gIC8vIENvbWJpbmFyOiBjbG9uZXMgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zLCBsdWVnbyBubyBmYXZvcml0b3NcbiAgcmV0dXJuIGNsb25lQWdlbnRzLmxlbmd0aCA/IFsuLi5jbG9uZUFnZW50cywgLi4uZmF2b3JpdGVzLCAuLi5ub25GYXZvcml0ZXNdIDogWy4uLmZhdm9yaXRlcywgLi4ubm9uRmF2b3JpdGVzXVxufVxuXG5jb25zdCBub3JtYWxpemVDdXN0b21BZ2VudHNGcm9tQXBpID0gKGFnZW50czogQWdlbnRbXSk6IEFnZW50W10gPT5cbiAgYWdlbnRzLm1hcChhZ2VudCA9PiAoYWdlbnQudHlwZSA9PT0gJ2N1c3RvbScgPyB3aXRoTm9ybWFsaXplZENvbm5lY3RvcnMoYWdlbnQpIDogYWdlbnQpKVxuXG50eXBlIFVzZUdldEFnZW50c1Byb3BzID0ge1xuICBzZWxlY3RBZ2VudDogKGFnZW50OiBBZ2VudCkgPT4gdm9pZFxuICBzZWN0aW9uOiAncHJvamVjdCcgfCAnaGVhZGVyJyB8ICdjbGllbnQnIHwgJ3Rhc2snXG4gIGFnZW50OiBBZ2VudCB8IG51bGxcbiAgaGFuZGxlR29Ib21lOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCB0eXBlIEFkZEFnZW50T3B0aW9ucyA9IHtcbiAgLyoqIFBvciBkZWZlY3RvIGB0cnVlYCAoY29tcG9ydGFtaWVudG8gQUJNKS4gUGFzYXIgYGZhbHNlYCBhbCBpbnNlcnRhciBhZ2VudGUgY3JlYWRvIHBvciBjaGF0IHNpbiBjYW1iaWFyIGRlIHZpc3RhLiAqL1xuICBuYXZpZ2F0ZUhvbWU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCB1c2VHZXRBZ2VudHMgPSAoeyBzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGhhbmRsZUdvSG9tZSB9OiBVc2VHZXRBZ2VudHNQcm9wcykgPT4ge1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IFthZ2VudHMsIHNldEFnZW50c10gPSB1c2VTdGF0ZTx7IGRhdGE6IEFnZW50W107IGhhc19tb3JlPzogYm9vbGVhbjsgbmV4dF9vZmZzZXQ/OiBudW1iZXIgfCBudWxsIH0+KHsgZGF0YTogW10gfSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtsb2FkaW5nTW9yZSwgc2V0TG9hZGluZ01vcmVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzZWFyY2hMb2FkaW5nLCBzZXRTZWFyY2hMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHsgaGFuZGxlU25hY2tiYXJFcnJvciB9ID0gdXNlU25hY2tCYXJNYW5hZ2VyKClcbiAgY29uc3QgeyB0LCBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbignY2hhdF9haV9zZWN0aW9uJylcbiAgY29uc3QgbGFzdFNlbGVjdGVkQWdlbnRSZWYgPSB1c2VSZWY8QWdlbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBpc1JlZnJlc2hpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGxhc3RSZXF1ZXN0UmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGFnZW50c1JlZiA9IHVzZVJlZihhZ2VudHMpXG4gIGNvbnN0IHByZVNlYXJjaEFnZW50c1JlZiA9IHVzZVJlZjx7IGRhdGE6IEFnZW50W107IGhhc19tb3JlPzogYm9vbGVhbjsgbmV4dF9vZmZzZXQ/OiBudW1iZXIgfCBudWxsIH0gfCBudWxsPihudWxsKVxuXG4gIGFnZW50c1JlZi5jdXJyZW50ID0gYWdlbnRzXG5cbiAgY29uc3QgY2FuRmV0Y2hDbG9uZUFnZW50cyA9ICFpc01haWFDbG9uZUFnZW50c1JvbGVCbG9ja2VkKHVzZXIsIHNlY3Rpb24pXG5cbiAgY29uc3QgYWRkQWdlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3QWdlbnQ6IEFnZW50LCBvcHRpb25zPzogQWRkQWdlbnRPcHRpb25zKSA9PiB7XG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBhZ2VudGUgeWEgZXhpc3RlIHBhcmEgZXZpdGFyIGR1cGxpY2Fkb3NcbiAgICAgICAgY29uc3QgYWdlbnRFeGlzdHMgPSBwcmV2LmRhdGEuc29tZShleGlzdGluZ0FnZW50ID0+IGV4aXN0aW5nQWdlbnQuaWQgPT09IG5ld0FnZW50LmlkKVxuICAgICAgICBpZiAoYWdlbnRFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm4gcHJldlxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBbLi4ucHJldi5kYXRhLCBuZXdBZ2VudF1cbiAgICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMobmV3RGF0YSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAob3B0aW9ucz8ubmF2aWdhdGVIb21lICE9PSBmYWxzZSkge1xuICAgICAgICBoYW5kbGVHb0hvbWUoKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2hhbmRsZUdvSG9tZV1cbiAgKVxuXG4gIGNvbnN0IHJlbW92ZUFnZW50ID0gdXNlQ2FsbGJhY2soKGFnZW50SWQ6IG51bWJlciB8IHN0cmluZykgPT4ge1xuICAgIHNldEFnZW50cyhwcmV2ID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgZGF0YTogcHJldi5kYXRhLmZpbHRlcihhID0+IGEuaWQgIT09IGFnZW50SWQudG9TdHJpbmcoKSksXG4gICAgfSkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUFnZW50ID0gdXNlQ2FsbGJhY2soKHVwZGF0ZWRBZ2VudDogQWdlbnQpID0+IHtcbiAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHByZXYuZGF0YS5tYXAoZXhpc3RpbmdBZ2VudCA9PlxuICAgICAgICBleGlzdGluZ0FnZW50LmlkID09PSB1cGRhdGVkQWdlbnQuaWQgPyB1cGRhdGVkQWdlbnQgOiBleGlzdGluZ0FnZW50XG4gICAgICApXG4gICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyh1cGRhdGVkRGF0YSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgdXBkYXRlQWdlbnRGYXZvcml0ZSA9IHVzZUNhbGxiYWNrKFxuICAgICh1cGRhdGVkQWdlbnQ6IEFnZW50LCBzaG91bGRTb3J0OiBib29sZWFuID0gZmFsc2UpID0+IHtcbiAgICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcmV2LmRhdGEubWFwKGV4aXN0aW5nQWdlbnQgPT4ge1xuICAgICAgICAgIGlmIChleGlzdGluZ0FnZW50LmlkID09PSB1cGRhdGVkQWdlbnQuaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4uYWdlbnRGaWVsZHMgfSA9IHVwZGF0ZWRBZ2VudCBhcyBhbnlcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZEFnZW50ID0geyAuLi5leGlzdGluZ0FnZW50LCAuLi5hZ2VudEZpZWxkcyB9XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkQWdlbnRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQWdlbnRcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTb2xvIG9yZGVuYXIgc2kgc2hvdWxkU29ydCBlcyB0cnVlXG4gICAgICAgIGNvbnN0IGZpbmFsRGF0YSA9IHNob3VsZFNvcnQgPyBzb3J0QWdlbnRzKHVwZGF0ZWREYXRhKSA6IHVwZGF0ZWREYXRhXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGRhdGE6IGZpbmFsRGF0YSxcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQWN0dWFsaXphciBlbCBhZ2VudGUgc2VsZWNjaW9uYWRvIHNpIGVzIGVsIHF1ZSBzZSBlc3TDoSBhY3R1YWxpemFuZG9cbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IHVwZGF0ZWRBZ2VudC5pZCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0FnZW50ID0gYWdlbnRzLmRhdGEuZmluZChhID0+IGEuaWQgPT09IHVwZGF0ZWRBZ2VudC5pZClcbiAgICAgICAgaWYgKGV4aXN0aW5nQWdlbnQpIHtcbiAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgY29uc3QgbWVyZ2VkQWdlbnQgPSB7IC4uLmV4aXN0aW5nQWdlbnQsIC4uLmFnZW50RmllbGRzIH1cbiAgICAgICAgICBzZWxlY3RBZ2VudChtZXJnZWRBZ2VudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRGaWVsZHMgYXMgQWdlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudCwgc2VsZWN0QWdlbnQsIGFnZW50cy5kYXRhXVxuICApXG5cbiAgY29uc3Qgc29ydEFnZW50c0xpc3QgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMocHJldi5kYXRhKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgIH1cbiAgICB9KVxuICB9LCBbXSlcblxuICBjb25zdCBzZWxlY3RGaXJzdEFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFnZW50SWQ/OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChhZ2VudHMuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmlyc3RBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmRJbmRleChhZ2VudERhdGEgPT4gYWdlbnREYXRhLmlkID09PSBhZ2VudElkKVxuICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gYWdlbnRzLmRhdGFbZmlyc3RBZ2VudCA9PT0gMCA/IDEgOiAwXVxuICAgICAgICBzZWxlY3RBZ2VudChhZ2VudHMuZGF0YVtmaXJzdEFnZW50ID09PSAwID8gMSA6IDBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FnZW50cy5kYXRhLCBzZWxlY3RBZ2VudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUdldEFnZW50cyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChhZ2VudFRvU2VsZWN0PzogQWdlbnQpID0+IHtcbiAgICAgIGlmIChpc1JlZnJlc2hpbmdSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdEtleSA9IGFnZW50VG9TZWxlY3Q/LmlkPy50b1N0cmluZygpIHx8ICdkZWZhdWx0J1xuICAgICAgaWYgKGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPT09IHJlcXVlc3RLZXkgJiYgIWxvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlzUmVmcmVzaGluZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgbGFzdFJlcXVlc3RSZWYuY3VycmVudCA9IHJlcXVlc3RLZXlcbiAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgIHNldEVycm9yKG51bGwpXG5cbiAgICAgIGNvbnN0IGlzTXVsdGlBZ2VudHMgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgYWdlbnRQYXJzZWQ6IEFnZW50W10gPSBbXVxuICAgICAgICBsZXQgaGFzTW9yZSA9IGZhbHNlXG4gICAgICAgIGxldCBuZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gICAgICAgIC8vIFNpIHRpZW5lIGZlYXR1cmUgYWNjZXNzIG11bHRpIGFnZW50cywgaGFjZXIgZG9zIHF1ZXJpZXMgKE1haWEgKyBjdXN0b20pIGVuIGN1YWxxdWllciBzZWNjacOzblxuICAgICAgICBpZiAoaXNNdWx0aUFnZW50cykge1xuICAgICAgICAgIC8vIFF1ZXJ5IGNsb25lIChNYWlhKSB5IGN1c3RvbSBzb24gaW5kZXBlbmRpZW50ZXMg4oaSIHNlIGRpc3BhcmFuIGVuIHBhcmFsZWxvLlxuICAgICAgICAgIGxldCBjbG9uZUFnZW50czogQWdlbnRbXSA9IFtdXG4gICAgICAgICAgbGV0IGN1c3RvbUFnZW50czogQWdlbnRbXSA9IFtdXG4gICAgICAgICAgbGV0IGN1c3RvbUhhc01vcmUgPSBmYWxzZVxuICAgICAgICAgIGxldCBjdXN0b21OZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gICAgICAgICAgY29uc3QgaXM0MDMgPSAoZXJyOiBhbnkpOiBib29sZWFuID0+XG4gICAgICAgICAgICBlcnI/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgZXJyPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgZXJyPy5tZXNzYWdlPy5pbmNsdWRlcyhcIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyBhZ2VudHNcIikgfHxcbiAgICAgICAgICAgIGVycj8ubWVzc2FnZT8uaW5jbHVkZXMoJ0ZhaWxlZCBmZXRjaGluZyBkYXRhJykgLy8gZmV0Y2hDT1IgbGFuemEgZXN0byBwYXJhIDQwMyBzaW4gJ0FjY2VzcyBkZW5pZWQnXG5cbiAgICAgICAgICBjb25zdCBsb2FkQ2xvbmVBZ2VudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNhbkZldGNoQ2xvbmVBZ2VudHMpIHJldHVyblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgb3JkZXJQYXJhbSA9XG4gICAgICAgICAgICAgICAgc2VjdGlvbiA9PT0gJ2NsaWVudCdcbiAgICAgICAgICAgICAgICAgID8gJyZvcmRlcj1jbGllbnQscHJvamVjdCdcbiAgICAgICAgICAgICAgICAgIDogc2VjdGlvbiA9PT0gJ3Byb2plY3QnIHx8IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IHNlY3Rpb24gPT09ICd0YXNrJ1xuICAgICAgICAgICAgICAgICAgICA/ICcmb3JkZXI9cHJvamVjdCxjbGllbnQnXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgY29uc3QgbWFpYVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y2xvbmUmbGFuZz0ke21hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSl9JHtvcmRlclBhcmFtfWAsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgY29uc3QgbWFpYURhdGEgPSBhd2FpdCBtYWlhUmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgIGNsb25lQWdlbnRzID0gbWFpYURhdGEuZGF0YT8uZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgPT09ICdjbG9uZScpIHx8IFtdXG4gICAgICAgICAgICB9IGNhdGNoIChtYWlhRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGNvbnRpbnVhciBzaW4gbG9zIGNsb25lQWdlbnRzOyBzaSBlcyBvdHJvIGVycm9yLCBwcm9wYWdhcmxvXG4gICAgICAgICAgICAgIGlmICghaXM0MDMobWFpYUVycm9yKSkgdGhyb3cgbWFpYUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbG9hZEN1c3RvbUFnZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTcmb2Zmc2V0PTAnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSBhd2FpdCBjdXN0b21SZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgY3VzdG9tQWdlbnRzID0gbm9ybWFsaXplQ3VzdG9tQWdlbnRzRnJvbUFwaShjdXN0b21EYXRhLmRhdGEgfHwgW10pXG4gICAgICAgICAgICAgIGN1c3RvbUhhc01vcmUgPSBjdXN0b21EYXRhLmhhc19tb3JlIHx8IGZhbHNlXG4gICAgICAgICAgICAgIGN1c3RvbU5leHRPZmZzZXQgPSBjdXN0b21EYXRhLm5leHRfb2Zmc2V0IHx8IG51bGxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGN1c3RvbUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBjb250aW51YXIgc2luIGxvcyBjdXN0b21BZ2VudHMgKHF1ZWRhIGNvbW8gYXJyYXkgdmFjw61vKTsgc2kgbm8sIHByb3BhZ2FybG9cbiAgICAgICAgICAgICAgaWYgKCFpczQwMyhjdXN0b21FcnJvcikpIHRocm93IGN1c3RvbUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRDbG9uZUFnZW50cygpLCBsb2FkQ3VzdG9tQWdlbnRzKCldKVxuXG4gICAgICAgICAgLy8gQ29tYmluYXI6IGFnZW50ZXMgY2xvbmUgcHJpbWVybywgbHVlZ28gbG9zIGN1c3RvbSAoc2kgZXhpc3RlbilcbiAgICAgICAgICAvLyBTaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBkZXNoYWJpbGl0YWRvLCBubyBpbmNsdWlyIGNsb25lQWdlbnRzXG4gICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSB7XG4gICAgICAgICAgICAvLyBSb2wgc2luIGFjY2VzbyBhIGNsb25lcyAocC4gZWouIGNvbGFib3JhZG9yIGZ1ZXJhIGRlbCBwaWxvdG8pOiBzb2xvIGN1c3RvbUFnZW50c1xuICAgICAgICAgICAgLy8gU2kgY3VzdG9tQWdlbnRzIGVzdMOhIHZhY8OtbyAocG9yIDQwMyksIGFnZW50UGFyc2VkIHNlcsOhIFtdXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGN1c3RvbUFnZW50c1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSb2wgY29uIGFjY2VzbyBhIGNsb25lczogY2xvbmVBZ2VudHMgKyBjdXN0b21BZ2VudHNcbiAgICAgICAgICAgIC8vIFNpIGN1c3RvbUFnZW50cyBlc3TDoSB2YWPDrW8gKHBvciA0MDMpIHBlcm8gaGF5IGNsb25lQWdlbnRzLCBhZ2VudFBhcnNlZCB0ZW5kcsOhIGxvcyBjbG9uZXNcbiAgICAgICAgICAgIC8vIFNpIG5vIGhheSBjbG9uZUFnZW50cyBuaSBjdXN0b21BZ2VudHMsIGFnZW50UGFyc2VkIHNlcsOhIFtdXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGNsb25lQWdlbnRzLmxlbmd0aCA/IFsuLi5jbG9uZUFnZW50cywgLi4uY3VzdG9tQWdlbnRzXSA6IGN1c3RvbUFnZW50c1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICAgIGFnZW50UGFyc2VkID0gc29ydEFnZW50cyhhZ2VudFBhcnNlZClcbiAgICAgICAgICBoYXNNb3JlID0gY3VzdG9tSGFzTW9yZVxuICAgICAgICAgIG5leHRPZmZzZXQgPSBjdXN0b21OZXh0T2Zmc2V0XG5cbiAgICAgICAgICBzZXRBZ2VudHMoe1xuICAgICAgICAgICAgZGF0YTogYWdlbnRQYXJzZWQsXG4gICAgICAgICAgICBoYXNfbW9yZTogaGFzTW9yZSxcbiAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBuZXh0T2Zmc2V0LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBTaSBubyBoYXkgYWdlbnRlcyBkZXNwdcOpcyBkZSBwcm9jZXNhciBsYXMgcXVlcmllcywgbGltcGlhciBlbCBlcnJvclxuICAgICAgICAgIGlmIChhZ2VudFBhcnNlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFJlcXVlc3RDbG9uZUFnZW50cyA9XG4gICAgICAgICAgICBjYW5GZXRjaENsb25lQWdlbnRzICYmXG4gICAgICAgICAgICAoc2VjdGlvbiA9PT0gJ3Byb2plY3QnIHx8IHNlY3Rpb24gPT09ICdjbGllbnQnIHx8IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IHNlY3Rpb24gPT09ICd0YXNrJylcblxuICAgICAgICAgIGlmICghc2hvdWxkUmVxdWVzdENsb25lQWdlbnRzKSB7XG4gICAgICAgICAgICBzZXRBZ2VudHMoeyBkYXRhOiBbXSwgaGFzX21vcmU6IGZhbHNlLCBuZXh0X29mZnNldDogbnVsbCB9KVxuICAgICAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnYWdlbnRfdHlwZScsICdjbG9uZScpXG4gICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xhbmcnLCBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpKVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdvcmRlcicsIHNlY3Rpb24gPT09ICdjbGllbnQnID8gJ2NsaWVudCxwcm9qZWN0JyA6ICdwcm9qZWN0LGNsaWVudCcpXG4gICAgICAgICAgICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsaW1pdCcsICc3JylcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdvZmZzZXQnLCAnMCcpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBgYWdlbnRzPyR7cXVlcnlQYXJhbXMudG9TdHJpbmcoKX1gXG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGRhdGEuZGF0YSB8fCBbXVxuICAgICAgICAgICAgICBhZ2VudFBhcnNlZCA9IHNvcnRBZ2VudHMoYWdlbnRQYXJzZWQpXG4gICAgICAgICAgICAgIGhhc01vcmUgPSBkYXRhLmhhc19tb3JlXG4gICAgICAgICAgICAgIG5leHRPZmZzZXQgPSBkYXRhLm5leHRfb2Zmc2V0XG5cbiAgICAgICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIGRhdGE6IGFnZW50UGFyc2VkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBjYXRjaCAocmVzcG9uc2VFcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBlcnJvciBlcyA0MDNcbiAgICAgICAgICAgICAgLy8gZmV0Y2hDT1IgcHVlZGUgbGFuemFyIGRpZmVyZW50ZXMgdGlwb3MgZGUgZXJyb3JlczpcbiAgICAgICAgICAgICAgLy8gMS4gRXJyb3IgY29uIGVycm9yRGF0YS5kZXRhaWwgc2kgaW5jbHV5ZSAnQWNjZXNzIGRlbmllZCdcbiAgICAgICAgICAgICAgLy8gMi4gRXJyb3IgZ2Vuw6lyaWNvICdGYWlsZWQgZmV0Y2hpbmcgZGF0YScgc2kgZXMgNDAzIHBlcm8gbm8gaW5jbHV5ZSAnQWNjZXNzIGRlbmllZCdcbiAgICAgICAgICAgICAgLy8gMy4gTmVjZXNpdGFtb3MgdmVyaWZpY2FyIGVsIHN0YXR1cyBjb2RlIHNpIGVzdMOhIGRpc3BvbmlibGVcbiAgICAgICAgICAgICAgY29uc3QgaXM0MDNFcnJvciA9XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8uc3RhdHVzID09PSA0MDMgfHxcbiAgICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcyhcIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyBhZ2VudHNcIikgfHxcbiAgICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnRmFpbGVkIGZldGNoaW5nIGRhdGEnKSAvLyBmZXRjaENPUiBsYW56YSBlc3RvIHBhcmEgNDAzIHNpbiAnQWNjZXNzIGRlbmllZCdcblxuICAgICAgICAgICAgICBpZiAoaXM0MDNFcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIFNpIGVzIDQwMywgZXN0YWJsZWNlciBhZ2VudGVzIHZhY8Otb3MgeSBjb250aW51YXJcbiAgICAgICAgICAgICAgICBzZXRBZ2VudHMoe1xuICAgICAgICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICAgICAgICBoYXNfbW9yZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBuZXh0X29mZnNldDogbnVsbCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2kgZXMgb3RybyBlcnJvciwgbGFuemFybG9cbiAgICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZUVycm9yXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMw7NnaWNhIGRlIHNlbGVjdCBhZ2VudCAtIFNvbG8gc2VsZWNjaW9uYXIgc2kgaGF5IGFnZW50ZXMgZGlzcG9uaWJsZXNcbiAgICAgICAgaWYgKGFnZW50UGFyc2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoYWdlbnRUb1NlbGVjdCAmJiBhZ2VudFBhcnNlZC5maW5kKChhZ2VudFRvUmVxdWVzdDogQWdlbnQpID0+IGFnZW50VG9SZXF1ZXN0LmlkID09PSBhZ2VudFRvU2VsZWN0LmlkKSkge1xuICAgICAgICAgICAgaWYgKGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBhZ2VudFRvU2VsZWN0LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBhZ2VudFRvU2VsZWN0XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50VG9TZWxlY3QpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhZ2VudFBhcnNlZD8uWzBdICYmICghYWdlbnQgfHwgIWFnZW50UGFyc2VkLmZpbmQoKGE6IEFnZW50KSA9PiBhLmlkID09PSBhZ2VudC5pZCkpKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2VudHMgPVxuICAgICAgICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmIGNhbkZldGNoQ2xvbmVBZ2VudHNcbiAgICAgICAgICAgICAgICA/IGFnZW50UGFyc2VkXG4gICAgICAgICAgICAgICAgOiBhZ2VudFBhcnNlZC5maWx0ZXIoKGFnZW50SXRlbTogQWdlbnQpID0+IGFnZW50SXRlbS50eXBlICE9PSAnY2xvbmUnKVxuXG4gICAgICAgICAgICBjb25zdCBbZmlyc3RBZ2VudF0gPSBhdmFpbGFibGVBZ2VudHNcbiAgICAgICAgICAgIGlmIChmaXJzdEFnZW50ICYmIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBmaXJzdEFnZW50LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBmaXJzdEFnZW50XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QWdlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhZ2VudFRvU2VsZWN0ICYmIGFnZW50UGFyc2VkPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUFnZW50cyA9XG4gICAgICAgICAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgY2FuRmV0Y2hDbG9uZUFnZW50c1xuICAgICAgICAgICAgICAgID8gYWdlbnRQYXJzZWRcbiAgICAgICAgICAgICAgICA6IGFnZW50UGFyc2VkLmZpbHRlcigoYWdlbnRJdGVtOiBBZ2VudCkgPT4gYWdlbnRJdGVtLnR5cGUgIT09ICdjbG9uZScpXG5cbiAgICAgICAgICAgIGNvbnN0IFtmaXJzdEF2YWlsYWJsZUFnZW50XSA9IGF2YWlsYWJsZUFnZW50c1xuICAgICAgICAgICAgaWYgKGZpcnN0QXZhaWxhYmxlQWdlbnQgJiYgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudD8uaWQgIT09IGZpcnN0QXZhaWxhYmxlQWdlbnQuaWQpIHtcbiAgICAgICAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGZpcnN0QXZhaWxhYmxlQWdlbnRcbiAgICAgICAgICAgICAgc2VsZWN0QWdlbnQoZmlyc3RBdmFpbGFibGVBZ2VudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNldEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCcpXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc1JlZnJlc2hpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApXG4gICAgICB9XG4gICAgfSxcbiAgICBbc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBsb2FkaW5nLCBjYW5GZXRjaENsb25lQWdlbnRzLCBpMThuLmxhbmd1YWdlXVxuICApXG5cbiAgY29uc3Qgc2VhcmNoQ3VzdG9tQWdlbnRzID0gdXNlQ2FsbGJhY2soYXN5bmMgKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICBpZiAocHJlU2VhcmNoQWdlbnRzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgc2V0QWdlbnRzKHByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50KVxuICAgICAgICBwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghcHJlU2VhcmNoQWdlbnRzUmVmLmN1cnJlbnQpIHtcbiAgICAgIHByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50ID0gYWdlbnRzUmVmLmN1cnJlbnRcbiAgICB9XG5cbiAgICBzZXRTZWFyY2hMb2FkaW5nKHRydWUpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTIwJm9mZnNldD0wJnE9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWAsXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICB9KVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIGNvbnN0IGNsb25lQWdlbnRzID0gcHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlID09PSAnY2xvbmUnKVxuICAgICAgICBjb25zdCBjdXN0b21SZXN1bHRzOiBBZ2VudFtdID0gZGF0YS5kYXRhIHx8IFtdXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogY2xvbmVBZ2VudHMubGVuZ3RoID8gWy4uLmNsb25lQWdlbnRzLCAuLi5jdXN0b21SZXN1bHRzXSA6IGN1c3RvbVJlc3VsdHMsXG4gICAgICAgICAgaGFzX21vcmU6IGZhbHNlLFxuICAgICAgICAgIG5leHRfb2Zmc2V0OiBudWxsLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdzbmFja2Jhci5sb2FkTW9yZUFnZW50cy5lcnJvcicpKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTZWFyY2hMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgbG9hZE1vcmVBZ2VudHMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaXNNdWx0aUFnZW50cyA9ICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG4gICAgLy8gQ2FyZ2FyIG3DoXM6IGVuIGhlYWRlciBzaWVtcHJlOyBlbiBwcm9qZWN0IHNvbG8gc2kgaXNNdWx0aUFnZW50cyAocG9ycXVlIHNvbG8gZW50b25jZXMgaGF5IHBhZ2luYWNpw7NuIGRlIGN1c3RvbSlcbiAgICBjb25zdCBjYW5Mb2FkTW9yZSA9IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IGlzTXVsdGlBZ2VudHNcbiAgICBpZiAoIWNhbkxvYWRNb3JlIHx8ICFhZ2VudHMuaGFzX21vcmUgfHwgIWFnZW50cy5uZXh0X29mZnNldCB8fCBsb2FkaW5nTW9yZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0TG9hZGluZ01vcmUodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBwYXRoOiBzdHJpbmdcblxuICAgICAgLy8gU2kgZXMgbXVsdGlBZ2VudHMsIHNvbG8gY2FyZ2FyIGFnZW50cyBjdXN0b20gKE1haWEgeWEgZXN0w6EgY2FyZ2FkbylcbiAgICAgIGlmIChpc011bHRpQWdlbnRzKSB7XG4gICAgICAgIC8vIE1hbnRlbmVyIGNhbnRpZGFkIGltcGFyIGRlIGNhcmRzOiBwcmltZXJhIGNhcmdhIDcsIHNpZ3VpZW50ZXMgKzYgKDcsIDEzLCAxOSwgLi4uKVxuICAgICAgICBwYXRoID0gYGFnZW50cz9hZ2VudF90eXBlPWN1c3RvbSZsaW1pdD02Jm9mZnNldD0ke2FnZW50cy5uZXh0X29mZnNldH1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaSBubyBlcyBtdWx0aUFnZW50cywgY2FyZ2FyIG3DoXMgYWdlbnRlcyBjbG9uZSAoTWFpYSkg4oCUIG1pc21vIG9yZGVyIHF1ZSBwcm9qZWN0IHBhcmEgaGVhZGVyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnYWdlbnRfdHlwZScsICdjbG9uZScpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnbGFuZycsIG1hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSkpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnb3JkZXInLCAncHJvamVjdCxjbGllbnQnKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xpbWl0JywgJzcnKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ29mZnNldCcsIGFnZW50cy5uZXh0X29mZnNldC50b1N0cmluZygpKVxuICAgICAgICBwYXRoID0gYGFnZW50cz8ke3F1ZXJ5UGFyYW1zLnRvU3RyaW5nKCl9YFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIC8vIEFjdW11bGFyIGFnZW50ZXMsIGV4Y2x1eWVuZG8gZHVwbGljYWRvc1xuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICBpZiAoaXNNdWx0aUFnZW50cykge1xuICAgICAgICAgIC8vIEzDs2dpY2EgcGFyYSBtdWx0aUFnZW50czogc2VwYXJhciBjbG9uZSB5IGN1c3RvbVxuICAgICAgICAgIC8vIE1hbnRlbmVyIHRvZG9zIGxvcyBhZ2VudGVzIGNsb25lIGV4aXN0ZW50ZXMgYWwgaW5pY2lvXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdDbG9uZUFnZW50cyA9IHByZXYuZGF0YS5maWx0ZXIoKGFnOiBBZ2VudCkgPT4gYWcudHlwZSA9PT0gJ2Nsb25lJylcblxuICAgICAgICAgIC8vIE9idGVuZXIgSURzIGV4aXN0ZW50ZXMgKGV4Y2x1eWVuZG8gY2xvbmVzKVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgIT09ICdjbG9uZScpLm1hcCgoYWc6IEFnZW50KSA9PiBhZy5pZCkpXG5cbiAgICAgICAgICAvLyBGaWx0cmFyIG51ZXZvcyBhZ2VudHMgcXVlIG5vIGVzdMOpbiB5YSBlbiBsYSBsaXN0YSAoeSBxdWUgbm8gc2VhbiBjbG9uZSlcbiAgICAgICAgICBjb25zdCBuZXdBZ2VudHMgPSBub3JtYWxpemVDdXN0b21BZ2VudHNGcm9tQXBpKFxuICAgICAgICAgICAgZGF0YS5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnICYmICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIENvbnN0cnVpciBlbCBudWV2byBhcnJheTogY2xvbmVzIHByaW1lcm8sIGx1ZWdvIGxvcyBhZ2VudHMgZXhpc3RlbnRlcyBxdWUgbm8gc2VhbiBjbG9uZSwgbHVlZ28gbG9zIG51ZXZvc1xuICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBleGlzdGluZ0Nsb25lQWdlbnRzLmxlbmd0aFxuICAgICAgICAgICAgPyBbLi4uZXhpc3RpbmdDbG9uZUFnZW50cywgLi4ucHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnKSwgLi4ubmV3QWdlbnRzXVxuICAgICAgICAgICAgOiBbLi4ucHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnKSwgLi4ubmV3QWdlbnRzXVxuXG4gICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyhuZXdEYXRhKVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgICAgICBoYXNfbW9yZTogZGF0YS5oYXNfbW9yZSxcbiAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBkYXRhLm5leHRfb2Zmc2V0LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMw7NnaWNhIHBhcmEgIWlzTXVsdGlBZ2VudHM6IHRvZG9zIGxvcyBhZ2VudGVzIHNvbiBjbG9uZSwgc2ltcGxlbWVudGUgYWdyZWdhciBldml0YW5kbyBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2LmRhdGEubWFwKChhZzogQWdlbnQpID0+IGFnLmlkKSlcbiAgICAgICAgY29uc3QgbmV3QWdlbnRzID0gKGRhdGEuZGF0YSB8fCBbXSkuZmlsdGVyKChhZzogQWdlbnQpID0+ICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgLi4ubmV3QWdlbnRzXVxuXG4gICAgICAgIC8vIE9yZGVuYXI6IE1haWEgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgIG5leHRfb2Zmc2V0OiBkYXRhLm5leHRfb2Zmc2V0LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBzZXRMb2FkaW5nTW9yZShmYWxzZSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnc25hY2tiYXIubG9hZE1vcmVBZ2VudHMuZXJyb3InKSlcbiAgICAgIHNldExvYWRpbmdNb3JlKGZhbHNlKVxuICAgIH1cbiAgfSwgW3NlY3Rpb24sIGFnZW50cy5oYXNfbW9yZSwgYWdlbnRzLm5leHRfb2Zmc2V0LCBsb2FkaW5nTW9yZSwgaTE4bi5sYW5ndWFnZV0pXG5cbiAgcmV0dXJuIHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgc2VhcmNoQ3VzdG9tQWdlbnRzLFxuICAgIHNlYXJjaExvYWRpbmcsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICAgIHNvcnRBZ2VudHNMaXN0LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7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
643
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlVHJhbnNsYXRpb24iLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJmZXRjaE1haWEiLCJ1c2VVc2VyIiwiaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCIsIm1hcENPUkxhbmciLCJpc01haWFBZ2VudCIsImFnZW50IiwidHlwZSIsImlzTWFya2V0cGxhY2VNYWlha2VyRW5hYmxlZCIsIndpbmRvdyIsIk1BSUFfTUFSS0VUUExBQ0VfTUFJQUtFUiIsImlzNDAzQWdlbnRGZXRjaEVycm9yIiwiZXJyIiwiX2Vycm9yJHJlc3BvbnNlIiwiX2Vycm9yJG1lc3NhZ2UiLCJfZXJyb3IkbWVzc2FnZTIiLCJlcnJvciIsInJlc3BvbnNlIiwic3RhdHVzIiwiQm9vbGVhbiIsIm1lc3NhZ2UiLCJpbmNsdWRlcyIsIm1lcmdlQWdlbnRzV2l0aG91dER1cGxpY2F0ZXMiLCJiYXNlIiwiZXh0cmEiLCJpZHMiLCJTZXQiLCJtYXAiLCJpZCIsIm1lcmdlZCIsIl90b0NvbnN1bWFibGVBcnJheSIsImZvckVhY2giLCJoYXMiLCJwdXNoIiwic29ydEFnZW50cyIsImFnZW50cyIsIm1haWFBZ2VudHMiLCJmaWx0ZXIiLCJvdGhlckFnZW50cyIsImFnIiwiZmF2b3JpdGVzIiwiaXNfZmF2b3JpdGUiLCJzb3J0IiwiYSIsImIiLCJuYW1lIiwibG9jYWxlQ29tcGFyZSIsIm5vbkZhdm9yaXRlcyIsImxlbmd0aCIsImNvbmNhdCIsInVzZUdldEFnZW50cyIsIl9yZWYiLCJzZWxlY3RBZ2VudCIsInNlY3Rpb24iLCJoYW5kbGVHb0hvbWUiLCJ1c2VyIiwiX3VzZVN0YXRlIiwiZGF0YSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNldEFnZW50cyIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwibG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImxvYWRpbmdNb3JlIiwic2V0TG9hZGluZ01vcmUiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNldEVycm9yIiwiX3VzZVNuYWNrQmFyTWFuYWdlciIsImhhbmRsZVNuYWNrYmFyRXJyb3IiLCJfdXNlVHJhbnNsYXRpb24iLCJ0IiwiaTE4biIsImxhc3RTZWxlY3RlZEFnZW50UmVmIiwiaXNSZWZyZXNoaW5nUmVmIiwibGFzdFJlcXVlc3RSZWYiLCJhZGRBZ2VudCIsIm5ld0FnZW50Iiwib3B0aW9ucyIsInByZXYiLCJhZ2VudEV4aXN0cyIsInNvbWUiLCJleGlzdGluZ0FnZW50IiwibmV3RGF0YSIsInNvcnRlZERhdGEiLCJfb2JqZWN0U3ByZWFkIiwibmF2aWdhdGVIb21lIiwicmVtb3ZlQWdlbnQiLCJhZ2VudElkIiwidG9TdHJpbmciLCJ1cGRhdGVBZ2VudCIsInVwZGF0ZWRBZ2VudCIsInVwZGF0ZWREYXRhIiwidXBkYXRlQWdlbnRGYXZvcml0ZSIsInNob3VsZFNvcnQiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJfcmVmMiIsImFnZW50RmllbGRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwibWVyZ2VkQWdlbnQiLCJmaW5hbERhdGEiLCJmaW5kIiwiX3JlZjMiLCJfZXhjbHVkZWQyIiwiX3JlZjQiLCJfZXhjbHVkZWQzIiwic29ydEFnZW50c0xpc3QiLCJzZWxlY3RGaXJzdEFnZW50IiwiZmlyc3RBZ2VudCIsImZpbmRJbmRleCIsImFnZW50RGF0YSIsImN1cnJlbnQiLCJoYW5kbGVHZXRBZ2VudHMiLCJfcmVmNSIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlNCIsImFnZW50VG9TZWxlY3QiLCJfYWdlbnRUb1NlbGVjdCRpZCIsInJlcXVlc3RLZXkiLCJpc011bHRpQWdlbnRzIiwiYWdlbnRQYXJzZWQiLCJoYXNNb3JlIiwibmV4dE9mZnNldCIsImNsb25lQWdlbnRzUm9sZUJsb2NrZWQiLCJjYW5GZXRjaENsb25lQWdlbnRzIiwiZmV0Y2hHbG9iYWxDbG9uZUFnZW50cyIsImN1c3RvbUFnZW50cyIsImN1c3RvbUhhc01vcmUiLCJjdXN0b21OZXh0T2Zmc2V0IiwiaXM0MDMiLCJsb2FkQ2xvbmVBZ2VudHMiLCJsb2FkQ3VzdG9tQWdlbnRzIiwicXVlcnlQYXJhbXMiLCJxdWVyeVN0cmluZyIsInBhdGgiLCJnbG9iYWxDbG9uZUFnZW50cyIsIl9yZXNwb25zZUVycm9yJHJlc3BvbiIsIl9yZXNwb25zZUVycm9yJG1lc3NhZyIsIl9yZXNwb25zZUVycm9yJG1lc3NhZzIiLCJpczQwM0Vycm9yIiwiX2FnZW50UGFyc2VkIiwiX2FnZW50UGFyc2VkMiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZjIiLCJhdmFpbGFibGVBZ2VudHMiLCJfYXZhaWxhYmxlQWdlbnRzIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmMyIsIl9hdmFpbGFibGVBZ2VudHMyIiwiX2F2YWlsYWJsZUFnZW50czMiLCJmaXJzdEF2YWlsYWJsZUFnZW50IiwiX3Q0IiwiX3Q1Iiwid3JhcCIsIl9jb250ZXh0NCIsIm5leHQiLCJhYnJ1cHQiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiX3JlZjYiLCJfY2FsbGVlIiwiY2xvbmVSZXNwb25zZSIsImNsb25lRGF0YSIsIl90IiwiX2NvbnRleHQiLCJsYW5ndWFnZSIsIm1ldGhvZCIsInNlbnQiLCJqc29uIiwic3RvcCIsImFwcGx5IiwiX3JlZjciLCJfY2FsbGVlMiIsIl9tYWlhRGF0YSRkYXRhIiwibWFpYVJlc3BvbnNlIiwibWFpYURhdGEiLCJfdDIiLCJfY29udGV4dDIiLCJfcmVmOCIsIl9jYWxsZWUzIiwiY3VzdG9tUmVzcG9uc2UiLCJjdXN0b21EYXRhIiwiX3QzIiwiX2NvbnRleHQzIiwiaGFzX21vcmUiLCJuZXh0X29mZnNldCIsIlByb21pc2UiLCJhbGwiLCJVUkxTZWFyY2hQYXJhbXMiLCJhcHBlbmQiLCJhZ2VudFRvUmVxdWVzdCIsImFnZW50SXRlbSIsIkVycm9yIiwic2V0VGltZW91dCIsImZpbmlzaCIsIl94IiwibG9hZE1vcmVBZ2VudHMiLCJfY2FsbGVlNSIsImNhbkxvYWRNb3JlIiwiX3Q2IiwiX2NvbnRleHQ1IiwiZXhpc3RpbmdNYWlhQWdlbnRzIiwiZXhpc3RpbmdJZHMiLCJuZXdBZ2VudHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7IHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgdXNlUmVmIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyB1c2VTbmFja0Jhck1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VTbmFja0Jhck1hbmFnZXIvdXNlU25hY2tCYXJNYW5hZ2VyJ1xuaW1wb3J0IHsgZmV0Y2hNYWlhIH0gZnJvbSAnLi4vY2xpZW50J1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9tYWlhVGFza1BhbmVsQWNjZXNzJ1xuaW1wb3J0IHsgU2VjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vLi4vbGFuZy91dGlscydcblxuY29uc3QgaXNNYWlhQWdlbnQgPSAoYWdlbnQ6IEFnZW50KSA9PiBhZ2VudC50eXBlID09PSAnb3JjaGVzdHJhdG9yJ1xuXG5jb25zdCBpc01hcmtldHBsYWNlTWFpYWtlckVuYWJsZWQgPSAoKSA9PiAhIXdpbmRvdy5NQUlBX01BUktFVFBMQUNFX01BSUFLRVJcblxuY29uc3QgaXM0MDNBZ2VudEZldGNoRXJyb3IgPSAoZXJyOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGVycm9yID0gZXJyIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9OyBzdGF0dXM/OiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfVxuICByZXR1cm4gKFxuICAgIGVycm9yPy5yZXNwb25zZT8uc3RhdHVzID09PSA0MDMgfHxcbiAgICBlcnJvcj8uc3RhdHVzID09PSA0MDMgfHxcbiAgICBCb29sZWFuKGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcyhcIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyBhZ2VudHNcIikpIHx8XG4gICAgQm9vbGVhbihlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ0ZhaWxlZCBmZXRjaGluZyBkYXRhJykpXG4gIClcbn1cblxuY29uc3QgbWVyZ2VBZ2VudHNXaXRob3V0RHVwbGljYXRlcyA9IChiYXNlOiBBZ2VudFtdLCBleHRyYTogQWdlbnRbXSk6IEFnZW50W10gPT4ge1xuICBjb25zdCBpZHMgPSBuZXcgU2V0KGJhc2UubWFwKGFnZW50ID0+IGFnZW50LmlkKSlcbiAgY29uc3QgbWVyZ2VkID0gWy4uLmJhc2VdXG4gIGV4dHJhLmZvckVhY2goYWdlbnQgPT4ge1xuICAgIGlmICghaWRzLmhhcyhhZ2VudC5pZCkpIG1lcmdlZC5wdXNoKGFnZW50KVxuICB9KVxuICByZXR1cm4gbWVyZ2VkXG59XG5cbi8qKlxuICogT3JkZW5hIGxvcyBhZ2VudGVzOiBNQUlBIHByaW1lcm8gKHNpIGV4aXN0ZSksIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICovXG5jb25zdCBzb3J0QWdlbnRzID0gKGFnZW50czogQWdlbnRbXSk6IEFnZW50W10gPT4ge1xuICBjb25zdCBtYWlhQWdlbnRzID0gYWdlbnRzLmZpbHRlcihpc01haWFBZ2VudClcbiAgY29uc3Qgb3RoZXJBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGFnID0+ICFpc01haWFBZ2VudChhZykpXG5cbiAgLy8gU2VwYXJhciBmYXZvcml0b3MgeSBubyBmYXZvcml0b3NcbiAgY29uc3QgZmF2b3JpdGVzID0gb3RoZXJBZ2VudHMuZmlsdGVyKGFnID0+IGFnLmlzX2Zhdm9yaXRlKS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuICBjb25zdCBub25GYXZvcml0ZXMgPSBvdGhlckFnZW50cy5maWx0ZXIoYWcgPT4gIWFnLmlzX2Zhdm9yaXRlKS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuXG4gIHJldHVybiBtYWlhQWdlbnRzLmxlbmd0aCA/IFsuLi5tYWlhQWdlbnRzLCAuLi5mYXZvcml0ZXMsIC4uLm5vbkZhdm9yaXRlc10gOiBbLi4uZmF2b3JpdGVzLCAuLi5ub25GYXZvcml0ZXNdXG59XG5cbnR5cGUgVXNlR2V0QWdlbnRzUHJvcHMgPSB7XG4gIHNlbGVjdEFnZW50OiAoYWdlbnQ6IEFnZW50KSA9PiB2b2lkXG4gIHNlY3Rpb246IFNlY3Rpb25cbiAgYWdlbnQ6IEFnZW50IHwgbnVsbFxuICBoYW5kbGVHb0hvbWU6ICgpID0+IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgQWRkQWdlbnRPcHRpb25zID0ge1xuICAvKiogUG9yIGRlZmVjdG8gYHRydWVgIChjb21wb3J0YW1pZW50byBBQk0pLiBQYXNhciBgZmFsc2VgIGFsIGluc2VydGFyIGFnZW50ZSBjcmVhZG8gcG9yIGNoYXQgc2luIGNhbWJpYXIgZGUgdmlzdGEuICovXG4gIG5hdmlnYXRlSG9tZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IHVzZUdldEFnZW50cyA9ICh7IHNlbGVjdEFnZW50LCBzZWN0aW9uLCBhZ2VudCwgaGFuZGxlR29Ib21lIH06IFVzZUdldEFnZW50c1Byb3BzKSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgW2FnZW50cywgc2V0QWdlbnRzXSA9IHVzZVN0YXRlPHsgZGF0YTogQWdlbnRbXTsgaGFzX21vcmU/OiBib29sZWFuOyBuZXh0X29mZnNldD86IG51bWJlciB8IG51bGwgfT4oeyBkYXRhOiBbXSB9KVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xvYWRpbmdNb3JlLCBzZXRMb2FkaW5nTW9yZV0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCB7IGhhbmRsZVNuYWNrYmFyRXJyb3IgfSA9IHVzZVNuYWNrQmFyTWFuYWdlcigpXG4gIGNvbnN0IHsgdCwgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oJ2NoYXRfYWlfc2VjdGlvbicpXG4gIGNvbnN0IGxhc3RTZWxlY3RlZEFnZW50UmVmID0gdXNlUmVmPEFnZW50IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNSZWZyZXNoaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBsYXN0UmVxdWVzdFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IGFkZEFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld0FnZW50OiBBZ2VudCwgb3B0aW9ucz86IEFkZEFnZW50T3B0aW9ucykgPT4ge1xuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICAvLyBWZXJpZmljYXIgc2kgZWwgYWdlbnRlIHlhIGV4aXN0ZSBwYXJhIGV2aXRhciBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGFnZW50RXhpc3RzID0gcHJldi5kYXRhLnNvbWUoZXhpc3RpbmdBZ2VudCA9PiBleGlzdGluZ0FnZW50LmlkID09PSBuZXdBZ2VudC5pZClcbiAgICAgICAgaWYgKGFnZW50RXhpc3RzKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgbmV3QWdlbnRdXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKG9wdGlvbnM/Lm5hdmlnYXRlSG9tZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgaGFuZGxlR29Ib21lKClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtoYW5kbGVHb0hvbWVdXG4gIClcblxuICBjb25zdCByZW1vdmVBZ2VudCA9IHVzZUNhbGxiYWNrKChhZ2VudElkOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBzZXRBZ2VudHMocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIGRhdGE6IHByZXYuZGF0YS5maWx0ZXIoYSA9PiBhLmlkICE9PSBhZ2VudElkLnRvU3RyaW5nKCkpLFxuICAgIH0pKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVBZ2VudCA9IHVzZUNhbGxiYWNrKCh1cGRhdGVkQWdlbnQ6IEFnZW50KSA9PiB7XG4gICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcmV2LmRhdGEubWFwKGV4aXN0aW5nQWdlbnQgPT5cbiAgICAgICAgZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkID8gdXBkYXRlZEFnZW50IDogZXhpc3RpbmdBZ2VudFxuICAgICAgKVxuICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHModXBkYXRlZERhdGEpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgfVxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUFnZW50RmF2b3JpdGUgPSB1c2VDYWxsYmFjayhcbiAgICAodXBkYXRlZEFnZW50OiBBZ2VudCwgc2hvdWxkU29ydDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gcHJldi5kYXRhLm1hcChleGlzdGluZ0FnZW50ID0+IHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkKSB7XG4gICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgICBjb25zdCBtZXJnZWRBZ2VudCA9IHsgLi4uZXhpc3RpbmdBZ2VudCwgLi4uYWdlbnRGaWVsZHMgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZEFnZW50XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBleGlzdGluZ0FnZW50XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU29sbyBvcmRlbmFyIHNpIHNob3VsZFNvcnQgZXMgdHJ1ZVxuICAgICAgICBjb25zdCBmaW5hbERhdGEgPSBzaG91bGRTb3J0ID8gc29ydEFnZW50cyh1cGRhdGVkRGF0YSkgOiB1cGRhdGVkRGF0YVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBmaW5hbERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIEFjdHVhbGl6YXIgZWwgYWdlbnRlIHNlbGVjY2lvbmFkbyBzaSBlcyBlbCBxdWUgc2UgZXN0w6EgYWN0dWFsaXphbmRvXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSB1cGRhdGVkQWdlbnQuaWQpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYSA9PiBhLmlkID09PSB1cGRhdGVkQWdlbnQuaWQpXG4gICAgICAgIGlmIChleGlzdGluZ0FnZW50KSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIGNvbnN0IG1lcmdlZEFnZW50ID0geyAuLi5leGlzdGluZ0FnZW50LCAuLi5hZ2VudEZpZWxkcyB9XG4gICAgICAgICAgc2VsZWN0QWdlbnQobWVyZ2VkQWdlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50RmllbGRzIGFzIEFnZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudHMuZGF0YV1cbiAgKVxuXG4gIGNvbnN0IHNvcnRBZ2VudHNMaXN0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKHByZXYuZGF0YSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc2VsZWN0Rmlyc3RBZ2VudCA9IHVzZUNhbGxiYWNrKFxuICAgIChhZ2VudElkPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoYWdlbnRzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kSW5kZXgoYWdlbnREYXRhID0+IGFnZW50RGF0YS5pZCA9PT0gYWdlbnRJZClcbiAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGFnZW50cy5kYXRhW2ZpcnN0QWdlbnQgPT09IDAgPyAxIDogMF1cbiAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbZmlyc3RBZ2VudCA9PT0gMCA/IDEgOiAwXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudHMuZGF0YSwgc2VsZWN0QWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVHZXRBZ2VudHMgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoYWdlbnRUb1NlbGVjdD86IEFnZW50KSA9PiB7XG4gICAgICBpZiAoaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBhZ2VudFRvU2VsZWN0Py5pZD8udG9TdHJpbmcoKSB8fCAnZGVmYXVsdCdcbiAgICAgIGlmIChsYXN0UmVxdWVzdFJlZi5jdXJyZW50ID09PSByZXF1ZXN0S2V5ICYmICFsb2FkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpc1JlZnJlc2hpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPSByZXF1ZXN0S2V5XG4gICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgICBjb25zdCBpc011bHRpQWdlbnRzID0gISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGFnZW50UGFyc2VkOiBBZ2VudFtdID0gW11cbiAgICAgICAgbGV0IGhhc01vcmUgPSBmYWxzZVxuICAgICAgICBsZXQgbmV4dE9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgICAgICAgY29uc3QgY2xvbmVBZ2VudHNSb2xlQmxvY2tlZCA9IGlzTWFpYUNsb25lQWdlbnRzUm9sZUJsb2NrZWQodXNlciwgc2VjdGlvbilcbiAgICAgICAgY29uc3QgY2FuRmV0Y2hDbG9uZUFnZW50cyA9ICFjbG9uZUFnZW50c1JvbGVCbG9ja2VkXG5cbiAgICAgICAgY29uc3QgZmV0Y2hHbG9iYWxDbG9uZUFnZW50cyA9IGFzeW5jICgpOiBQcm9taXNlPEFnZW50W10+ID0+IHtcbiAgICAgICAgICBpZiAoIWlzTWFya2V0cGxhY2VNYWlha2VyRW5hYmxlZCgpIHx8ICFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm4gW11cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2xvbmVSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgIHBhdGg6IGBhZ2VudHM/YWdlbnRfdHlwZT1jbG9uZSZlbnRpdHk9Z2xvYmFsJmxhbmc9JHttYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpfWAsXG4gICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgY2xvbmVEYXRhID0gYXdhaXQgY2xvbmVSZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgIHJldHVybiAoY2xvbmVEYXRhLmRhdGEgfHwgW10pLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlID09PSAnY2xvbmUnKVxuICAgICAgICAgIH0gY2F0Y2ggKGNsb25lRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpczQwM0FnZW50RmV0Y2hFcnJvcihjbG9uZUVycm9yKSkgcmV0dXJuIFtdXG4gICAgICAgICAgICB0aHJvdyBjbG9uZUVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgdGllbmUgZmVhdHVyZSBhY2Nlc3MgbXVsdGkgYWdlbnRzLCBoYWNlciBkb3MgcXVlcmllcyAoTWFpYSArIGN1c3RvbSkgZW4gY3VhbHF1aWVyIHNlY2Npw7NuXG4gICAgICAgIGlmIChpc011bHRpQWdlbnRzKSB7XG4gICAgICAgICAgLy8gUXVlcnkgY2xvbmUgKE1haWEpIHkgY3VzdG9tIHNvbiBpbmRlcGVuZGllbnRlcyDihpIgc2UgZGlzcGFyYW4gZW4gcGFyYWxlbG8uXG4gICAgICAgICAgbGV0IGN1c3RvbUFnZW50czogQWdlbnRbXSA9IFtdXG4gICAgICAgICAgbGV0IGN1c3RvbUhhc01vcmUgPSBmYWxzZVxuICAgICAgICAgIGxldCBjdXN0b21OZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gICAgICAgICAgY29uc3QgaXM0MDMgPSBpczQwM0FnZW50RmV0Y2hFcnJvclxuXG4gICAgICAgICAgbGV0IG1haWFBZ2VudHM6IEFnZW50W10gPSBbXVxuXG4gICAgICAgICAgY29uc3QgbG9hZENsb25lQWdlbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1haWFSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPW9yY2hlc3RyYXRvciZsYW5nPSR7bWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKX1gLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IG1haWFEYXRhID0gYXdhaXQgbWFpYVJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICBtYWlhQWdlbnRzID0gbWFpYURhdGEuZGF0YT8uZmlsdGVyKGlzTWFpYUFnZW50KSB8fCBbXVxuICAgICAgICAgICAgICBjb25zdCBnbG9iYWxDbG9uZUFnZW50cyA9IGF3YWl0IGZldGNoR2xvYmFsQ2xvbmVBZ2VudHMoKVxuICAgICAgICAgICAgICBtYWlhQWdlbnRzID0gbWVyZ2VBZ2VudHNXaXRob3V0RHVwbGljYXRlcyhtYWlhQWdlbnRzLCBnbG9iYWxDbG9uZUFnZW50cylcbiAgICAgICAgICAgIH0gY2F0Y2ggKG1haWFFcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGNvbnRpbnVhciBzaW4gbG9zIGNsb25lQWdlbnRzOyBzaSBlcyBvdHJvIGVycm9yLCBwcm9wYWdhcmxvXG4gICAgICAgICAgICAgIGlmICghaXM0MDMobWFpYUVycm9yKSkgdGhyb3cgbWFpYUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbG9hZEN1c3RvbUFnZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTcmb2Zmc2V0PTAnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSBhd2FpdCBjdXN0b21SZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgY3VzdG9tQWdlbnRzID0gY3VzdG9tRGF0YS5kYXRhIHx8IFtdXG4gICAgICAgICAgICAgIGN1c3RvbUhhc01vcmUgPSBjdXN0b21EYXRhLmhhc19tb3JlIHx8IGZhbHNlXG4gICAgICAgICAgICAgIGN1c3RvbU5leHRPZmZzZXQgPSBjdXN0b21EYXRhLm5leHRfb2Zmc2V0IHx8IG51bGxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGN1c3RvbUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBjb250aW51YXIgc2luIGxvcyBjdXN0b21BZ2VudHMgKHF1ZWRhIGNvbW8gYXJyYXkgdmFjw61vKTsgc2kgbm8sIHByb3BhZ2FybG9cbiAgICAgICAgICAgICAgaWYgKCFpczQwMyhjdXN0b21FcnJvcikpIHRocm93IGN1c3RvbUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRDbG9uZUFnZW50cygpLCBsb2FkQ3VzdG9tQWdlbnRzKCldKVxuXG4gICAgICAgICAgLy8gQ29tYmluYXI6IGFnZW50ZXMgY2xvbmUgcHJpbWVybywgbHVlZ28gbG9zIGN1c3RvbSAoc2kgZXhpc3RlbilcbiAgICAgICAgICAvLyBTaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBkZXNoYWJpbGl0YWRvLCBubyBpbmNsdWlyIGNsb25lQWdlbnRzXG4gICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSB7XG4gICAgICAgICAgICAvLyBSb2wgc2luIGFjY2VzbyBhIGNsb25lcyAocC4gZWouIGZyZWVsYW5jZXIvY2xpZW50ZSBvIGNvbGFib3JhZG9yIGVuIHByb2plY3QvY2xpZW50KTogc29sbyBjdXN0b21BZ2VudHNcbiAgICAgICAgICAgIC8vIFNpIGN1c3RvbUFnZW50cyBlc3TDoSB2YWPDrW8gKHBvciA0MDMpLCBhZ2VudFBhcnNlZCBzZXLDoSBbXVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBjdXN0b21BZ2VudHNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBtYWlhQWdlbnRzLmxlbmd0aCA/IFsuLi5tYWlhQWdlbnRzLCAuLi5jdXN0b21BZ2VudHNdIDogY3VzdG9tQWdlbnRzXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE9yZGVuYXI6IE1haWEgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gICAgICAgICAgYWdlbnRQYXJzZWQgPSBzb3J0QWdlbnRzKGFnZW50UGFyc2VkKVxuICAgICAgICAgIGhhc01vcmUgPSBjdXN0b21IYXNNb3JlXG4gICAgICAgICAgbmV4dE9mZnNldCA9IGN1c3RvbU5leHRPZmZzZXRcblxuICAgICAgICAgIHNldEFnZW50cyh7XG4gICAgICAgICAgICBkYXRhOiBhZ2VudFBhcnNlZCxcbiAgICAgICAgICAgIGhhc19tb3JlOiBoYXNNb3JlLFxuICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IG5leHRPZmZzZXQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFNpIG5vIGhheSBhZ2VudGVzIGRlc3B1w6lzIGRlIHByb2Nlc2FyIGxhcyBxdWVyaWVzLCBsaW1waWFyIGVsIGVycm9yXG4gICAgICAgICAgaWYgKGFnZW50UGFyc2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTMOzZ2ljYSBwYXJhIHByb2plY3QsIGNsaWVudCBvIGhlYWRlciBzaW4gbXVsdGlBZ2VudHMgKG1pc21vIGNyaXRlcmlvIGRlIG9yZGVuIHByb2plY3QvY2xpZW50OyBoZWFkZXIgYcOxYWRlIHBhZ2luYWNpw7NuKVxuICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICAgICAgaWYgKHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnY2xpZW50JyB8fCBzZWN0aW9uID09PSAnaGVhZGVyJyB8fCBzZWN0aW9uID09PSAndGFzaycpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnYWdlbnRfdHlwZScsICdvcmNoZXN0cmF0b3InKVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsYW5nJywgbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSlcbiAgICAgICAgICAgIGlmIChzZWN0aW9uID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xpbWl0JywgJzcnKVxuICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ29mZnNldCcsICcwJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKClcbiAgICAgICAgICBjb25zdCBwYXRoID0gYGFnZW50cyR7cXVlcnlTdHJpbmcgPyBgPyR7cXVlcnlTdHJpbmd9YCA6ICcnfWBcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAvLyBkYXRhLmRhdGEgeWEgY29udGllbmUgZWwvbG9zIGFnZW50ZXMgb3JxdWVzdGFkb3JlcyBkZSBsYSBxdWVyeSBhZ2VudF90eXBlPW9yY2hlc3RyYXRvclxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBkYXRhLmRhdGEgfHwgW11cbiAgICAgICAgICAgIGNvbnN0IGdsb2JhbENsb25lQWdlbnRzID0gYXdhaXQgZmV0Y2hHbG9iYWxDbG9uZUFnZW50cygpXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IG1lcmdlQWdlbnRzV2l0aG91dER1cGxpY2F0ZXMoYWdlbnRQYXJzZWQsIGdsb2JhbENsb25lQWdlbnRzKVxuICAgICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICAgIGFnZW50UGFyc2VkID0gc29ydEFnZW50cyhhZ2VudFBhcnNlZClcbiAgICAgICAgICAgIGhhc01vcmUgPSBkYXRhLmhhc19tb3JlXG4gICAgICAgICAgICBuZXh0T2Zmc2V0ID0gZGF0YS5uZXh0X29mZnNldFxuXG4gICAgICAgICAgICBzZXRBZ2VudHMoe1xuICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICBkYXRhOiBhZ2VudFBhcnNlZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBjYXRjaCAocmVzcG9uc2VFcnJvcjogYW55KSB7XG4gICAgICAgICAgICAvLyBWZXJpZmljYXIgc2kgZWwgZXJyb3IgZXMgNDAzXG4gICAgICAgICAgICAvLyBmZXRjaENPUiBwdWVkZSBsYW56YXIgZGlmZXJlbnRlcyB0aXBvcyBkZSBlcnJvcmVzOlxuICAgICAgICAgICAgLy8gMS4gRXJyb3IgY29uIGVycm9yRGF0YS5kZXRhaWwgc2kgaW5jbHV5ZSAnQWNjZXNzIGRlbmllZCdcbiAgICAgICAgICAgIC8vIDIuIEVycm9yIGdlbsOpcmljbyAnRmFpbGVkIGZldGNoaW5nIGRhdGEnIHNpIGVzIDQwMyBwZXJvIG5vIGluY2x1eWUgJ0FjY2VzcyBkZW5pZWQnXG4gICAgICAgICAgICAvLyAzLiBOZWNlc2l0YW1vcyB2ZXJpZmljYXIgZWwgc3RhdHVzIGNvZGUgc2kgZXN0w6EgZGlzcG9uaWJsZVxuICAgICAgICAgICAgY29uc3QgaXM0MDNFcnJvciA9XG4gICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcyhcIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyBhZ2VudHNcIikgfHxcbiAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ0ZhaWxlZCBmZXRjaGluZyBkYXRhJykgLy8gZmV0Y2hDT1IgbGFuemEgZXN0byBwYXJhIDQwMyBzaW4gJ0FjY2VzcyBkZW5pZWQnXG5cbiAgICAgICAgICAgIGlmIChpczQwM0Vycm9yKSB7XG4gICAgICAgICAgICAgIC8vIFNpIGVzIDQwMywgZXN0YWJsZWNlciBhZ2VudGVzIHZhY8Otb3MgeSBjb250aW51YXJcbiAgICAgICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgICAgICBoYXNfbW9yZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IG51bGwsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBTaSBlcyBvdHJvIGVycm9yLCBsYW56YXJsb1xuICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTMOzZ2ljYSBkZSBzZWxlY3QgYWdlbnQgLSBTb2xvIHNlbGVjY2lvbmFyIHNpIGhheSBhZ2VudGVzIGRpc3BvbmlibGVzXG4gICAgICAgIGlmIChhZ2VudFBhcnNlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKGFnZW50VG9TZWxlY3QgJiYgYWdlbnRQYXJzZWQuZmluZCgoYWdlbnRUb1JlcXVlc3Q6IEFnZW50KSA9PiBhZ2VudFRvUmVxdWVzdC5pZCA9PT0gYWdlbnRUb1NlbGVjdC5pZCkpIHtcbiAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gYWdlbnRUb1NlbGVjdC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gYWdlbnRUb1NlbGVjdFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChhZ2VudFRvU2VsZWN0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWdlbnRQYXJzZWQ/LlswXSAmJiAoIWFnZW50IHx8ICFhZ2VudFBhcnNlZC5maW5kKChhOiBBZ2VudCkgPT4gYS5pZCA9PT0gYWdlbnQuaWQpKSkge1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdlbnRzID1cbiAgICAgICAgICAgICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiAhY2xvbmVBZ2VudHNSb2xlQmxvY2tlZFxuICAgICAgICAgICAgICAgID8gYWdlbnRQYXJzZWRcbiAgICAgICAgICAgICAgICA6IGFnZW50UGFyc2VkLmZpbHRlcigoYWdlbnRJdGVtOiBBZ2VudCkgPT4gIWlzTWFpYUFnZW50KGFnZW50SXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IFtmaXJzdEFnZW50XSA9IGF2YWlsYWJsZUFnZW50c1xuICAgICAgICAgICAgaWYgKGZpcnN0QWdlbnQgJiYgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudD8uaWQgIT09IGZpcnN0QWdlbnQuaWQpIHtcbiAgICAgICAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGZpcnN0QWdlbnRcbiAgICAgICAgICAgICAgc2VsZWN0QWdlbnQoZmlyc3RBZ2VudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFnZW50VG9TZWxlY3QgJiYgYWdlbnRQYXJzZWQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdlbnRzID1cbiAgICAgICAgICAgICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiAhY2xvbmVBZ2VudHNSb2xlQmxvY2tlZFxuICAgICAgICAgICAgICAgID8gYWdlbnRQYXJzZWRcbiAgICAgICAgICAgICAgICA6IGFnZW50UGFyc2VkLmZpbHRlcigoYWdlbnRJdGVtOiBBZ2VudCkgPT4gIWlzTWFpYUFnZW50KGFnZW50SXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IFtmaXJzdEF2YWlsYWJsZUFnZW50XSA9IGF2YWlsYWJsZUFnZW50c1xuICAgICAgICAgICAgaWYgKGZpcnN0QXZhaWxhYmxlQWdlbnQgJiYgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudD8uaWQgIT09IGZpcnN0QXZhaWxhYmxlQWdlbnQuaWQpIHtcbiAgICAgICAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGZpcnN0QXZhaWxhYmxlQWdlbnRcbiAgICAgICAgICAgICAgc2VsZWN0QWdlbnQoZmlyc3RBdmFpbGFibGVBZ2VudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNldEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCcpXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc1JlZnJlc2hpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApXG4gICAgICB9XG4gICAgfSxcbiAgICBbc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBsb2FkaW5nXVxuICApXG5cbiAgY29uc3QgbG9hZE1vcmVBZ2VudHMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaXNNdWx0aUFnZW50cyA9ICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG4gICAgLy8gQ2FyZ2FyIG3DoXM6IGVuIGhlYWRlciBzaWVtcHJlOyBlbiBwcm9qZWN0IHNvbG8gc2kgaXNNdWx0aUFnZW50cyAocG9ycXVlIHNvbG8gZW50b25jZXMgaGF5IHBhZ2luYWNpw7NuIGRlIGN1c3RvbSlcbiAgICBjb25zdCBjYW5Mb2FkTW9yZSA9IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IGlzTXVsdGlBZ2VudHNcbiAgICBpZiAoIWNhbkxvYWRNb3JlIHx8ICFhZ2VudHMuaGFzX21vcmUgfHwgIWFnZW50cy5uZXh0X29mZnNldCB8fCBsb2FkaW5nTW9yZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0TG9hZGluZ01vcmUodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBwYXRoOiBzdHJpbmdcblxuICAgICAgLy8gU2kgZXMgbXVsdGlBZ2VudHMsIHNvbG8gY2FyZ2FyIGFnZW50cyBjdXN0b20gKE1haWEgeWEgZXN0w6EgY2FyZ2FkbylcbiAgICAgIGlmIChpc011bHRpQWdlbnRzKSB7XG4gICAgICAgIC8vIE1hbnRlbmVyIGNhbnRpZGFkIGltcGFyIGRlIGNhcmRzOiBwcmltZXJhIGNhcmdhIDcsIHNpZ3VpZW50ZXMgKzYgKDcsIDEzLCAxOSwgLi4uKVxuICAgICAgICBwYXRoID0gYGFnZW50cz9hZ2VudF90eXBlPWN1c3RvbSZsaW1pdD02Jm9mZnNldD0ke2FnZW50cy5uZXh0X29mZnNldH1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaSBubyBlcyBtdWx0aUFnZW50cywgY2FyZ2FyIG3DoXMgYWdlbnRlcyBvcnF1ZXN0YWRvcmVzIChNQUlBKVxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2FnZW50X3R5cGUnLCAnb3JjaGVzdHJhdG9yJylcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsYW5nJywgbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSlcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsaW1pdCcsICc3JylcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdvZmZzZXQnLCBhZ2VudHMubmV4dF9vZmZzZXQudG9TdHJpbmcoKSlcbiAgICAgICAgcGF0aCA9IGBhZ2VudHM/JHtxdWVyeVBhcmFtcy50b1N0cmluZygpfWBcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAvLyBBY3VtdWxhciBhZ2VudGVzLCBleGNsdXllbmRvIGR1cGxpY2Fkb3NcbiAgICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgICAgaWYgKGlzTXVsdGlBZ2VudHMpIHtcbiAgICAgICAgICAvLyBMw7NnaWNhIHBhcmEgbXVsdGlBZ2VudHM6IHNlcGFyYXIgTUFJQSB5IGN1c3RvbVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWFpYUFnZW50cyA9IHByZXYuZGF0YS5maWx0ZXIoaXNNYWlhQWdlbnQpXG5cbiAgICAgICAgICAvLyBPYnRlbmVyIElEcyBleGlzdGVudGVzIChleGNsdXllbmRvIE1BSUEpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYuZGF0YS5maWx0ZXIoKGFnOiBBZ2VudCkgPT4gIWlzTWFpYUFnZW50KGFnKSkubWFwKChhZzogQWdlbnQpID0+IGFnLmlkKSlcblxuICAgICAgICAgIC8vIEZpbHRyYXIgbnVldm9zIGFnZW50cyBxdWUgbm8gZXN0w6luIHlhIGVuIGxhIGxpc3RhICh5IHF1ZSBubyBzZWFuIE1BSUEpXG4gICAgICAgICAgY29uc3QgbmV3QWdlbnRzID0gZGF0YS5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWcpICYmICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuXG4gICAgICAgICAgY29uc3QgbmV3RGF0YSA9IGV4aXN0aW5nTWFpYUFnZW50cy5sZW5ndGhcbiAgICAgICAgICAgID8gWy4uLmV4aXN0aW5nTWFpYUFnZW50cywgLi4ucHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWcpKSwgLi4ubmV3QWdlbnRzXVxuICAgICAgICAgICAgOiBbLi4ucHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWcpKSwgLi4ubmV3QWdlbnRzXVxuXG4gICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyhuZXdEYXRhKVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgICAgICBoYXNfbW9yZTogZGF0YS5oYXNfbW9yZSxcbiAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBkYXRhLm5leHRfb2Zmc2V0LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMw7NnaWNhIHBhcmEgIWlzTXVsdGlBZ2VudHM6IGFncmVnYXIgZXZpdGFuZG8gZHVwbGljYWRvc1xuICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5kYXRhLm1hcCgoYWc6IEFnZW50KSA9PiBhZy5pZCkpXG4gICAgICAgIGNvbnN0IG5ld0FnZW50cyA9IChkYXRhLmRhdGEgfHwgW10pLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhZXhpc3RpbmdJZHMuaGFzKGFnLmlkKSlcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IFsuLi5wcmV2LmRhdGEsIC4uLm5ld0FnZW50c11cblxuICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyhuZXdEYXRhKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgICAgICBoYXNfbW9yZTogZGF0YS5oYXNfbW9yZSxcbiAgICAgICAgICBuZXh0X29mZnNldDogZGF0YS5uZXh0X29mZnNldCxcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgc2V0TG9hZGluZ01vcmUoZmFsc2UpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQoJ3NuYWNrYmFyLmxvYWRNb3JlQWdlbnRzLmVycm9yJykpXG4gICAgICBzZXRMb2FkaW5nTW9yZShmYWxzZSlcbiAgICB9XG4gIH0sIFtzZWN0aW9uLCBhZ2VudHMuaGFzX21vcmUsIGFnZW50cy5uZXh0X29mZnNldCwgbG9hZGluZ01vcmUsIGkxOG4ubGFuZ3VhZ2VdKVxuXG4gIHJldHVybiB7XG4gICAgYWdlbnRzLFxuICAgIGxvYWRpbmcsXG4gICAgbG9hZGluZ01vcmUsXG4gICAgZXJyb3IsXG4gICAgaGFuZGxlR2V0QWdlbnRzLFxuICAgIGxvYWRNb3JlQWdlbnRzLFxuICAgIGFkZEFnZW50LFxuICAgIHJlbW92ZUFnZW50LFxuICAgIHVwZGF0ZUFnZW50LFxuICAgIHVwZGF0ZUFnZW50RmF2b3JpdGUsXG4gICAgc2VsZWN0Rmlyc3RBZ2VudCxcbiAgICBzb3J0QWdlbnRzTGlzdCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsUUFBUSxFQUFFQyxXQUFXLEVBQUVDLE1BQU0sUUFBUSxPQUFPO0FBQ3JELFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBQzlDLFNBQVND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