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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/lib/App.js +22 -11
  2. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +36 -0
  3. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +181 -0
  4. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  5. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +324 -0
  6. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  7. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +195 -0
  8. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +6 -0
  9. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  10. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +280 -0
  11. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +130 -0
  12. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  13. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +168 -0
  14. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +79 -0
  15. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  16. package/lib/components/atoms/MAIAInput/MAIAInput.js +238 -321
  17. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +269 -0
  18. package/lib/components/atoms/MAIAInput/styles.js +75 -46
  19. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  20. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  21. package/lib/components/atoms/icons/index.js +2 -1
  22. package/lib/components/index.js +2 -1
  23. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +8 -4
  24. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +31 -3
  25. package/lib/components/molecules/ChatAIMessages/newStyles.js +5 -2
  26. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +9 -71
  27. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -4
  28. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +68 -0
  29. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  30. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  31. package/lib/components/molecules/Sidebar/Sidebar.js +9 -5
  32. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +6 -2
  33. package/lib/components/organisms/ChatAI/ChatAI.js +4 -37
  34. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +5 -2
  35. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +6 -3
  36. package/lib/constants/config.js +3 -1
  37. package/lib/constants/taskLinkIcon.js +6 -0
  38. package/lib/context/cor-user.js +1 -1
  39. package/lib/context/global-context.js +1 -5
  40. package/lib/dev/DevContextMentionInput.js +65 -0
  41. package/lib/dev/Providers.js +11 -6
  42. package/lib/hooks/useCaretPosition.js +35 -0
  43. package/lib/hooks/useChatManager/useChatManager.interface.js +1 -1
  44. package/lib/hooks/useChatManager/useChatManager.js +22 -24
  45. package/lib/hooks/useChatMessages/useChatMessages.interface.js +1 -1
  46. package/lib/hooks/useChatMessages/useChatMessages.js +30 -14
  47. package/lib/hooks/useClientSearch.js +3 -2
  48. package/lib/hooks/useContextMentions.js +270 -0
  49. package/lib/hooks/useEntitySearch.js +996 -0
  50. package/lib/hooks/useEvent.js +6 -1
  51. package/lib/hooks/useMentionAllowedTypes.js +103 -0
  52. package/lib/hooks/useMentionPopover.js +333 -0
  53. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +6 -4
  54. package/lib/hooks/useProjectSearch.js +3 -2
  55. package/lib/hooks/useRecentClientsSearch.js +3 -2
  56. package/lib/hooks/useTaskPanel.js +3 -10
  57. package/lib/hooks/useTextOverflowEllipsisTooltip.js +35 -0
  58. package/lib/lang/br/index.js +24 -1
  59. package/lib/lang/en/index.js +24 -1
  60. package/lib/lang/es/index.js +24 -1
  61. package/lib/lang/fr/index.js +23 -1
  62. package/lib/services/maia/Chats/getChatMessages.js +29 -4
  63. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +4 -8
  64. package/lib/services/maia/Orchestrator/orchestrator.js +8 -11
  65. package/lib/services/maia/RecentProjects/getRecentProjects.js +12 -4
  66. package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
  67. package/lib/services/maia/RecentTasks/index.js +6 -0
  68. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  69. package/lib/services/maia/RecentUsers/index.js +6 -0
  70. package/lib/services/query/entitySearchQuery.js +18 -0
  71. package/lib/services/query/usersDirectoryQuery.js +19 -0
  72. package/lib/services/utils/mapChatMessages.js +12 -5
  73. package/lib/types/Chat.js +1 -1
  74. package/lib/types/agent.js +1 -1
  75. package/lib/types/contextMention.js +37 -0
  76. package/lib/utils/contextMentionIcons.js +115 -0
  77. package/lib/utils/contextMentionLabel.js +4 -0
  78. package/lib/utils/contextMentionTypeLabel.js +17 -0
  79. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  80. package/lib/utils/openTaskInCorPanel.js +18 -0
  81. package/lib/utils/renderContextMentions.js +293 -0
  82. package/package.json +1 -1
@@ -0,0 +1,996 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
6
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
+ import { useLazyQuery } from '@apollo/client';
9
+ import { useCallback, useEffect, useMemo, useState } from 'react';
10
+ import { getRecentClients } from '../services/maia/RecentClients/getRecentClients';
11
+ import { getRecentProjects } from '../services/maia/RecentProjects/getRecentProjects';
12
+ import { getRecentTasks } from '../services/maia/RecentTasks/getRecentTasks';
13
+ import { useUser } from '../context/cor-user';
14
+ import { PROJECTS_FALLBACK, SEARCH_ENTITIES, TASK_FAMILY_FALLBACK } from '../services/query/entitySearchQuery';
15
+ import { SEARCH_CLIENTS } from '../services/query/ClientSearchQuery';
16
+ import { USERS_DIRECTORY } from '../services/query/usersDirectoryQuery';
17
+ import { SEARCH_QUERY_DEBOUNCE_MS } from '../constants/config';
18
+ import { useDebounce } from './useDebounce';
19
+ import { useT } from './useT';
20
+ var normalizePositiveInt = function normalizePositiveInt(value, fallback) {
21
+ var parsed = Number(value);
22
+ if (!Number.isFinite(parsed)) return fallback;
23
+ var normalized = Math.floor(parsed);
24
+ return normalized > 0 ? normalized : fallback;
25
+ };
26
+
27
+ /**
28
+ * Restringe los resultados al `clientId`/`projectId` del agente activo.
29
+ * Cuando el agente está scopeado a un client/project, tanto los recents como
30
+ * el search deben filtrar por ese contexto. Si el backend no entiende algún
31
+ * campo lo ignora y se cae al comportamiento global.
32
+ */
33
+
34
+ var BASE_FILTERS_BY_TYPE = {
35
+ project: {
36
+ project: 'true',
37
+ archived: 'all'
38
+ },
39
+ task: {
40
+ task: 'true',
41
+ archived: 'false'
42
+ }
43
+ };
44
+
45
+ /**
46
+ * Entradas para el argumento GraphQL `extra` (JSON string de array) al buscar tareas con contexto.
47
+ * Ej.: [{"projectId":"881552"}]
48
+ */
49
+ var buildTaskSearchExtraEntries = function buildTaskSearchExtraEntries(scope) {
50
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
51
+ var rawProject = (scope === null || scope === void 0 ? void 0 : scope.projectId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== '' ? String(scope.projectId) : null;
52
+ var agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity;
53
+ var entries = [];
54
+ var pushClient = function pushClient() {
55
+ if (rawClient) entries.push({
56
+ clientId: rawClient
57
+ });
58
+ };
59
+ var pushProject = function pushProject() {
60
+ if (rawProject) entries.push({
61
+ projectId: rawProject
62
+ });
63
+ };
64
+ if (agentEntity === 'project') {
65
+ if (rawProject) {
66
+ pushProject();
67
+ } else if (rawClient) {
68
+ pushClient();
69
+ }
70
+ } else if (agentEntity === 'client') {
71
+ pushClient();
72
+ pushProject();
73
+ } else {
74
+ pushClient();
75
+ pushProject();
76
+ }
77
+ return entries;
78
+ };
79
+ var buildTaskSearchExtra = function buildTaskSearchExtra(scope) {
80
+ var entries = buildTaskSearchExtraEntries(scope);
81
+ if (entries.length === 0) return undefined;
82
+ return JSON.stringify(entries);
83
+ };
84
+
85
+ /**
86
+ * Tab proyecto: con `clientId` en el scope, `extra` acota la búsqueda a proyectos de ese cliente.
87
+ * Ej.: `[{"clientId":"47105"}]` junto a `filters` `{"project":"true","archived":"all"}`.
88
+ */
89
+ var buildProjectSearchExtra = function buildProjectSearchExtra(scope) {
90
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
91
+ if (!rawClient) return undefined;
92
+ return JSON.stringify([{
93
+ clientId: rawClient
94
+ }]);
95
+ };
96
+ var buildSearchEntitiesExtra = function buildSearchEntitiesExtra(type, scope) {
97
+ if (type === 'task') return buildTaskSearchExtra(scope);
98
+ if (type === 'project') return buildProjectSearchExtra(scope);
99
+ return undefined;
100
+ };
101
+
102
+ /**
103
+ * Tab `task` / `project`: `filters` sólo tipo + archived (tareas: no archivadas); scope (clientId / projectId en tareas) en `extra`.
104
+ */
105
+ var buildFiltersForType = function buildFiltersForType(type) {
106
+ if (type === 'project') {
107
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.project);
108
+ }
109
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.task);
110
+ };
111
+
112
+ /**
113
+ * Filtros para usersDirectory. El backend espera un JSON string con
114
+ * withPosition, withTeams y searchInput. Le agregamos clientId/projectId
115
+ * del scope en caso de que el backend los aproveche para filtrar por
116
+ * contexto (si no los entiende los ignora).
117
+ */
118
+ var buildUsersDirectoryFilters = function buildUsersDirectoryFilters(q) {
119
+ var base = {
120
+ withPosition: true,
121
+ withTeams: true
122
+ };
123
+ var trimmedQ = q.trim();
124
+ if (trimmedQ) {
125
+ base.searchInput = trimmedQ;
126
+ }
127
+ return JSON.stringify(base);
128
+ };
129
+ var highlightRange = function highlightRange(text, searchValue) {
130
+ if (!searchValue) return undefined;
131
+ var idx = text.toLowerCase().indexOf(searchValue.toLowerCase());
132
+ if (idx < 0) return undefined;
133
+ return {
134
+ start: idx,
135
+ length: searchValue.length
136
+ };
137
+ };
138
+ var firstDefined = function firstDefined() {
139
+ for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
140
+ values[_key] = arguments[_key];
141
+ }
142
+ return values.find(function (value) {
143
+ return value !== undefined && value !== null;
144
+ });
145
+ };
146
+ var mapClientToItem = function mapClientToItem(c, searchValue) {
147
+ var _c$totalProyectos, _c$totalProyectos2;
148
+ return {
149
+ id: c.id,
150
+ type: 'client',
151
+ primary: c.name,
152
+ primaryHighlight: highlightRange(c.name, searchValue),
153
+ breadcrumb: {
154
+ count: (_c$totalProyectos = c.totalProyectos) !== null && _c$totalProyectos !== void 0 ? _c$totalProyectos : undefined,
155
+ countLabel: 'projects'
156
+ },
157
+ raw: {
158
+ id: c.id,
159
+ name: c.name,
160
+ totalProyectos: (_c$totalProyectos2 = c.totalProyectos) !== null && _c$totalProyectos2 !== void 0 ? _c$totalProyectos2 : null
161
+ }
162
+ };
163
+ };
164
+ var mapUserToItem = function mapUserToItem(u, searchValue) {
165
+ var _u$firstName, _u$lastName, _u$picture, _u$positionName, _u$email;
166
+ var fullName = "".concat((_u$firstName = u.firstName) !== null && _u$firstName !== void 0 ? _u$firstName : '', " ").concat((_u$lastName = u.lastName) !== null && _u$lastName !== void 0 ? _u$lastName : '').trim();
167
+ var primary = fullName || u.email || String(u.id);
168
+ return {
169
+ id: u.id,
170
+ type: 'user',
171
+ primary: primary,
172
+ primaryHighlight: highlightRange(primary, searchValue),
173
+ raw: {
174
+ id: u.id,
175
+ name: primary,
176
+ picture: (_u$picture = u.picture) !== null && _u$picture !== void 0 ? _u$picture : null,
177
+ positionName: (_u$positionName = u.positionName) !== null && _u$positionName !== void 0 ? _u$positionName : null,
178
+ email: (_u$email = u.email) !== null && _u$email !== void 0 ? _u$email : null
179
+ }
180
+ };
181
+ };
182
+ var mapCorUserToUserItem = function mapCorUserToUserItem(user, searchValue, meLabel) {
183
+ var _user$firstName, _user$lastName, _user$user_position, _user$role;
184
+ var fullName = "".concat((_user$firstName = user.firstName) !== null && _user$firstName !== void 0 ? _user$firstName : '', " ").concat((_user$lastName = user.lastName) !== null && _user$lastName !== void 0 ? _user$lastName : '').trim();
185
+ var positionLine = ((_user$user_position = user.user_position) === null || _user$user_position === void 0 ? void 0 : _user$user_position.trim()) || ((_user$role = user.role) === null || _user$role === void 0 ? void 0 : _user$role.trim()) || null;
186
+ return {
187
+ id: user.id,
188
+ type: 'user',
189
+ primary: meLabel,
190
+ primaryHighlight: highlightRange(meLabel, searchValue),
191
+ raw: {
192
+ id: user.id,
193
+ name: fullName || String(user.id),
194
+ picture: user.picture || null,
195
+ positionName: positionLine,
196
+ email: null
197
+ }
198
+ };
199
+ };
200
+ var mapRecentTaskToItem = function mapRecentTaskToItem(task, searchValue) {
201
+ var _task$projectName;
202
+ var showProjectNameInTaskRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
203
+ var primary = task.title && task.title.trim() || String(task.id);
204
+ var projectName = showProjectNameInTaskRow ? (_task$projectName = task.projectName) !== null && _task$projectName !== void 0 ? _task$projectName : null : null;
205
+ return {
206
+ id: task.id,
207
+ type: 'task',
208
+ primary: primary,
209
+ primaryHighlight: highlightRange(primary, searchValue),
210
+ breadcrumb: projectName ? {
211
+ parent: projectName
212
+ } : undefined,
213
+ raw: {
214
+ id: task.id,
215
+ name: primary,
216
+ projectName: projectName
217
+ }
218
+ };
219
+ };
220
+ var normalizeTaskFamilyRecord = function normalizeTaskFamilyRecord(record) {
221
+ var _firstDefined, _firstDefined2, _record$project, _record$father, _record$father2;
222
+ var taskFamilyId = record._id;
223
+ var id = taskFamilyId;
224
+ if (id === undefined || id === null || String(id) === '') return null;
225
+ var title = (_firstDefined = firstDefined(record.title, record.name)) !== null && _firstDefined !== void 0 ? _firstDefined : '';
226
+ var projectName = (_firstDefined2 = firstDefined((_record$project = record.project) === null || _record$project === void 0 ? void 0 : _record$project.name, (_record$father = record.father) === null || _record$father === void 0 ? void 0 : _record$father.title)) !== null && _firstDefined2 !== void 0 ? _firstDefined2 : null;
227
+ var hasFather = !!firstDefined(record.taskFather, (_record$father2 = record.father) === null || _record$father2 === void 0 ? void 0 : _record$father2.id);
228
+ return {
229
+ id: id,
230
+ title: title,
231
+ type: hasFather ? 'subtask' : 'task',
232
+ projectName: projectName
233
+ };
234
+ };
235
+ var normalizeProjectsFallbackRecord = function normalizeProjectsFallbackRecord(record) {
236
+ var _record$name, _firstDefined3, _record$client, _record$client$name, _record$client2;
237
+ var id = record.id;
238
+ if (id === undefined || id === null || String(id) === '') return null;
239
+ var title = (_record$name = record.name) !== null && _record$name !== void 0 ? _record$name : '';
240
+ var clientId = (_firstDefined3 = firstDefined(record.clientId, (_record$client = record.client) === null || _record$client === void 0 ? void 0 : _record$client.id)) !== null && _firstDefined3 !== void 0 ? _firstDefined3 : null;
241
+ var clientName = (_record$client$name = (_record$client2 = record.client) === null || _record$client2 === void 0 ? void 0 : _record$client2.name) !== null && _record$client$name !== void 0 ? _record$client$name : null;
242
+ return {
243
+ id: id,
244
+ title: title,
245
+ type: 'project',
246
+ clientId: clientId,
247
+ clientName: clientName
248
+ };
249
+ };
250
+ var mapSearchToItem = function mapSearchToItem(r, type, searchValue) {
251
+ var _r$projectName, _r$projectName2, _r$clientId, _r$clientName, _r$feeId, _father$title;
252
+ var showProjectNameInTaskRow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
253
+ var primary = r.title || r.projectName || '';
254
+ var parent;
255
+ if (type === 'project') parent = r.clientName;else if (type === 'task') parent = undefined;else parent = (_r$projectName = r.projectName) !== null && _r$projectName !== void 0 ? _r$projectName : r.clientName;
256
+ var father = type === 'task' ? r.father : null;
257
+ var hasFather = type === 'task' && father != null && father.id != null && String(father.id).length > 0;
258
+ var taskProjectName = type === 'task' && !showProjectNameInTaskRow ? null : (_r$projectName2 = r.projectName) !== null && _r$projectName2 !== void 0 ? _r$projectName2 : null;
259
+ return {
260
+ id: r.id,
261
+ type: type,
262
+ primary: primary,
263
+ primaryHighlight: highlightRange(primary, searchValue),
264
+ breadcrumb: parent ? {
265
+ parent: parent
266
+ } : undefined,
267
+ raw: {
268
+ id: r.id,
269
+ name: primary,
270
+ clientId: (_r$clientId = r.clientId) !== null && _r$clientId !== void 0 ? _r$clientId : null,
271
+ clientName: (_r$clientName = r.clientName) !== null && _r$clientName !== void 0 ? _r$clientName : null,
272
+ projectName: taskProjectName,
273
+ feeId: (_r$feeId = r.feeId) !== null && _r$feeId !== void 0 ? _r$feeId : null,
274
+ fatherId: hasFather ? father.id : null,
275
+ fatherTitle: hasFather ? ((_father$title = father.title) === null || _father$title === void 0 ? void 0 : _father$title.trim()) || null : null
276
+ }
277
+ };
278
+ };
279
+ var formatMcpPrimaryLabel = function formatMcpPrimaryLabel(slug) {
280
+ return slug.replace(/_/g, ' ').replace(/\b\w/g, function (_char) {
281
+ return _char.toUpperCase();
282
+ });
283
+ };
284
+ var mapMcpSlugsToItems = function mapMcpSlugsToItems(slugs, searchValue) {
285
+ var q = searchValue.trim().toLowerCase();
286
+ var filtered = slugs;
287
+ if (q) {
288
+ filtered = slugs.filter(function (s) {
289
+ var primary = formatMcpPrimaryLabel(s);
290
+ return s.toLowerCase().includes(q) || primary.toLowerCase().includes(q);
291
+ });
292
+ }
293
+ return filtered.map(function (slug) {
294
+ var primary = formatMcpPrimaryLabel(slug);
295
+ return {
296
+ id: slug,
297
+ type: 'mcp',
298
+ primary: primary,
299
+ primaryHighlight: highlightRange(primary, searchValue),
300
+ raw: {
301
+ id: slug,
302
+ name: primary
303
+ }
304
+ };
305
+ });
306
+ };
307
+ export var useEntitySearch = function useEntitySearch(type, scope) {
308
+ var _scope$mcpSlugs;
309
+ var corUser = useUser();
310
+ var _useT = useT(),
311
+ t = _useT.t;
312
+ var _useState = useState(''),
313
+ _useState2 = _slicedToArray(_useState, 2),
314
+ searchValue = _useState2[0],
315
+ setSearchValue = _useState2[1];
316
+ var debouncedSearchValue = useDebounce(searchValue, SEARCH_QUERY_DEBOUNCE_MS);
317
+ var _useState3 = useState([]),
318
+ _useState4 = _slicedToArray(_useState3, 2),
319
+ items = _useState4[0],
320
+ setItems = _useState4[1];
321
+ var _useState5 = useState(false),
322
+ _useState6 = _slicedToArray(_useState5, 2),
323
+ loading = _useState6[0],
324
+ setLoading = _useState6[1];
325
+ var _useState7 = useState(false),
326
+ _useState8 = _slicedToArray(_useState7, 2),
327
+ error = _useState8[0],
328
+ setError = _useState8[1];
329
+ var _useState9 = useState(false),
330
+ _useState0 = _slicedToArray(_useState9, 2),
331
+ hideRecentsLabel = _useState0[0],
332
+ setHideRecentsLabel = _useState0[1];
333
+ var _useState1 = useState(false),
334
+ _useState10 = _slicedToArray(_useState1, 2),
335
+ hasMore = _useState10[0],
336
+ setHasMore = _useState10[1];
337
+ var _useState11 = useState(false),
338
+ _useState12 = _slicedToArray(_useState11, 2),
339
+ isLoadingMore = _useState12[0],
340
+ setIsLoadingMore = _useState12[1];
341
+ var _useState13 = useState(1),
342
+ _useState14 = _slicedToArray(_useState13, 2),
343
+ currentPage = _useState14[0],
344
+ setCurrentPage = _useState14[1];
345
+ var _useState15 = useState('none'),
346
+ _useState16 = _slicedToArray(_useState15, 2),
347
+ activePaginationSource = _useState16[0],
348
+ setActivePaginationSource = _useState16[1];
349
+ var mcpSlugsKey = ((_scope$mcpSlugs = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs !== void 0 ? _scope$mcpSlugs : []).join('|');
350
+ var showProjectNameInTaskRow = (scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== 'project';
351
+
352
+ // Estabilizamos el scope para no disparar fetchs por cambios de identidad de objeto.
353
+ var stableScope = useMemo(function () {
354
+ var _scope$clientId, _scope$projectId, _scope$mcpSlugs2, _scope$agentEntity;
355
+ return {
356
+ clientId: (_scope$clientId = scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && _scope$clientId !== void 0 ? _scope$clientId : null,
357
+ projectId: (_scope$projectId = scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && _scope$projectId !== void 0 ? _scope$projectId : null,
358
+ mcpSlugs: (_scope$mcpSlugs2 = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs2 !== void 0 ? _scope$mcpSlugs2 : [],
359
+ agentEntity: (_scope$agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== null && _scope$agentEntity !== void 0 ? _scope$agentEntity : null
360
+ };
361
+ }, [scope === null || scope === void 0 ? void 0 : scope.clientId, scope === null || scope === void 0 ? void 0 : scope.projectId, mcpSlugsKey, scope === null || scope === void 0 ? void 0 : scope.agentEntity]);
362
+
363
+ // --- Search: project | task (GraphQL: search) ---
364
+ var _useLazyQuery = useLazyQuery(SEARCH_ENTITIES, {
365
+ variables: {
366
+ limit: 20
367
+ },
368
+ fetchPolicy: 'network-only'
369
+ }),
370
+ _useLazyQuery2 = _slicedToArray(_useLazyQuery, 2),
371
+ fetchSearchEntities = _useLazyQuery2[0],
372
+ _useLazyQuery2$ = _useLazyQuery2[1],
373
+ searchData = _useLazyQuery2$.data,
374
+ searchLoading = _useLazyQuery2$.loading,
375
+ searchError = _useLazyQuery2$.error;
376
+
377
+ // --- Search: client (GraphQL) ---
378
+ var _useLazyQuery3 = useLazyQuery(SEARCH_CLIENTS, {
379
+ fetchPolicy: 'network-only'
380
+ }),
381
+ _useLazyQuery4 = _slicedToArray(_useLazyQuery3, 2),
382
+ fetchSearchClients = _useLazyQuery4[0],
383
+ _useLazyQuery4$ = _useLazyQuery4[1],
384
+ clientsData = _useLazyQuery4$.data,
385
+ clientsLoading = _useLazyQuery4$.loading,
386
+ clientsError = _useLazyQuery4$.error;
387
+
388
+ // --- Search: user (GraphQL: usersDirectory) ---
389
+ var _useLazyQuery5 = useLazyQuery(USERS_DIRECTORY, {
390
+ fetchPolicy: 'network-only'
391
+ }),
392
+ _useLazyQuery6 = _slicedToArray(_useLazyQuery5, 2),
393
+ fetchUsersDirectory = _useLazyQuery6[0],
394
+ _useLazyQuery6$ = _useLazyQuery6[1],
395
+ usersData = _useLazyQuery6$.data,
396
+ usersLoading = _useLazyQuery6$.loading,
397
+ usersError = _useLazyQuery6$.error;
398
+ var syncUsersPagination = useCallback(function (payload) {
399
+ var _payload$usersDirecto, _payload$usersDirecto2;
400
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$usersDirecto = payload.usersDirectory) === null || _payload$usersDirecto === void 0 ? void 0 : _payload$usersDirecto.page, 1);
401
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$usersDirecto2 = payload.usersDirectory) === null || _payload$usersDirecto2 === void 0 ? void 0 : _payload$usersDirecto2.lastPage, page);
402
+ setCurrentPage(page);
403
+ setHasMore(page < lastPage);
404
+ }, []);
405
+ var syncClientsPagination = useCallback(function (payload) {
406
+ var _payload$clients, _payload$clients2;
407
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients = payload.clients) === null || _payload$clients === void 0 ? void 0 : _payload$clients.page, 1);
408
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients2 = payload.clients) === null || _payload$clients2 === void 0 ? void 0 : _payload$clients2.lastPage, page);
409
+ setCurrentPage(page);
410
+ setHasMore(page < lastPage);
411
+ }, []);
412
+ var syncTaskFallbackPagination = useCallback(function (payload) {
413
+ var _payload$taskFamily, _payload$taskFamily2;
414
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$taskFamily = payload.taskFamily) === null || _payload$taskFamily === void 0 ? void 0 : _payload$taskFamily.page, 1);
415
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$taskFamily2 = payload.taskFamily) === null || _payload$taskFamily2 === void 0 ? void 0 : _payload$taskFamily2.lastPage, page);
416
+ setCurrentPage(page);
417
+ setHasMore(page < lastPage);
418
+ }, []);
419
+ var syncProjectFallbackPagination = useCallback(function (payload) {
420
+ var _payload$projects, _payload$projects2;
421
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects = payload.projects) === null || _payload$projects === void 0 ? void 0 : _payload$projects.page, 1);
422
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects2 = payload.projects) === null || _payload$projects2 === void 0 ? void 0 : _payload$projects2.lastPage, page);
423
+ setCurrentPage(page);
424
+ setHasMore(page < lastPage);
425
+ }, []);
426
+ var _useLazyQuery7 = useLazyQuery(TASK_FAMILY_FALLBACK, {
427
+ fetchPolicy: 'network-only'
428
+ }),
429
+ _useLazyQuery8 = _slicedToArray(_useLazyQuery7, 1),
430
+ fetchTaskFamilyFallback = _useLazyQuery8[0];
431
+ var _useLazyQuery9 = useLazyQuery(PROJECTS_FALLBACK, {
432
+ fetchPolicy: 'network-only'
433
+ }),
434
+ _useLazyQuery0 = _slicedToArray(_useLazyQuery9, 1),
435
+ fetchProjectsFallback = _useLazyQuery0[0];
436
+ var fetchRecent = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
437
+ var _stableScope$mcpSlugs, slugs, data, mapped, _data, _mapped, _fallbackData$project, _fallbackData$project2, argumentsFilter, _yield$fetchProjectsF, fallbackData, fallbackMapped, recentTaskFilters, _data2, taskItems, _fallbackData$taskFam, _fallbackData$taskFam2, filter, _yield$fetchTaskFamil, _fallbackData, _data3$usersDirectory, _data3$usersDirectory2, _yield$fetchUsersDire, _data3, _mapped2, meItem, withoutMe, _t;
438
+ return _regeneratorRuntime.wrap(function (_context) {
439
+ while (1) switch (_context.prev = _context.next) {
440
+ case 0:
441
+ if (!(type === 'mcp')) {
442
+ _context.next = 1;
443
+ break;
444
+ }
445
+ slugs = (_stableScope$mcpSlugs = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs !== void 0 ? _stableScope$mcpSlugs : [];
446
+ setLoading(false);
447
+ setError(false);
448
+ setItems(mapMcpSlugsToItems(slugs, ''));
449
+ setHideRecentsLabel(false);
450
+ setActivePaginationSource('none');
451
+ setHasMore(false);
452
+ return _context.abrupt("return");
453
+ case 1:
454
+ setLoading(true);
455
+ setError(false);
456
+ _context.prev = 2;
457
+ if (!(type === 'client')) {
458
+ _context.next = 4;
459
+ break;
460
+ }
461
+ _context.next = 3;
462
+ return getRecentClients();
463
+ case 3:
464
+ data = _context.sent;
465
+ mapped = (data !== null && data !== void 0 ? data : []).map(function (c) {
466
+ return mapClientToItem(c, '');
467
+ });
468
+ setItems(mapped);
469
+ setHideRecentsLabel(false);
470
+ setActivePaginationSource('none');
471
+ setHasMore(false);
472
+ _context.next = 17;
473
+ break;
474
+ case 4:
475
+ if (!(type === 'project')) {
476
+ _context.next = 9;
477
+ break;
478
+ }
479
+ _context.next = 5;
480
+ return getRecentProjects(stableScope.clientId ? {
481
+ clientId: stableScope.clientId
482
+ } : undefined);
483
+ case 5:
484
+ _data = _context.sent;
485
+ _mapped = (Array.isArray(_data) ? _data : []).map(function (p) {
486
+ return mapSearchToItem({
487
+ id: p.id,
488
+ title: p.title,
489
+ type: 'project',
490
+ clientId: p.clientId,
491
+ feeId: p.feeId,
492
+ clientName: p.clientName
493
+ }, 'project', '');
494
+ });
495
+ if (!(_mapped.length === 0)) {
496
+ _context.next = 7;
497
+ break;
498
+ }
499
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
500
+ client_id: [String(stableScope.clientId)]
501
+ } : undefined;
502
+ _context.next = 6;
503
+ return fetchProjectsFallback({
504
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
505
+ arguments: argumentsFilter
506
+ } : {}), {}, {
507
+ page: 1,
508
+ perPage: 20
509
+ })
510
+ });
511
+ case 6:
512
+ _yield$fetchProjectsF = _context.sent;
513
+ fallbackData = _yield$fetchProjectsF.data;
514
+ fallbackMapped = ((_fallbackData$project = fallbackData === null || fallbackData === void 0 || (_fallbackData$project2 = fallbackData.projects) === null || _fallbackData$project2 === void 0 ? void 0 : _fallbackData$project2.data) !== null && _fallbackData$project !== void 0 ? _fallbackData$project : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
515
+ return item !== null;
516
+ }).map(function (item) {
517
+ return mapSearchToItem(item, 'project', '');
518
+ });
519
+ _mapped = fallbackMapped;
520
+ setHideRecentsLabel(fallbackMapped.length > 0);
521
+ setActivePaginationSource('project-fallback');
522
+ syncProjectFallbackPagination(fallbackData);
523
+ _context.next = 8;
524
+ break;
525
+ case 7:
526
+ setHideRecentsLabel(false);
527
+ setActivePaginationSource('none');
528
+ setHasMore(false);
529
+ case 8:
530
+ setItems(_mapped);
531
+ _context.next = 17;
532
+ break;
533
+ case 9:
534
+ if (!(type === 'task')) {
535
+ _context.next = 14;
536
+ break;
537
+ }
538
+ if (stableScope.agentEntity === 'project') {
539
+ recentTaskFilters = {
540
+ projectId: stableScope.projectId
541
+ };
542
+ } else if (stableScope.agentEntity === 'client') {
543
+ recentTaskFilters = {
544
+ clientId: stableScope.clientId
545
+ };
546
+ }
547
+ _context.next = 10;
548
+ return getRecentTasks(recentTaskFilters);
549
+ case 10:
550
+ _data2 = _context.sent;
551
+ taskItems = (_data2 !== null && _data2 !== void 0 ? _data2 : []).map(function (task) {
552
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
553
+ });
554
+ if (!(taskItems.length === 0)) {
555
+ _context.next = 12;
556
+ break;
557
+ }
558
+ filter = {};
559
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
560
+ filter.projectIds = [String(stableScope.projectId)];
561
+ }
562
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
563
+ filter.clientIds = [String(stableScope.clientId)];
564
+ }
565
+ _context.next = 11;
566
+ return fetchTaskFamilyFallback({
567
+ variables: _objectSpread(_objectSpread({}, Object.keys(filter).length > 0 ? {
568
+ filter: filter
569
+ } : {}), {}, {
570
+ pagination: {
571
+ offset: 0,
572
+ size: 20
573
+ }
574
+ })
575
+ });
576
+ case 11:
577
+ _yield$fetchTaskFamil = _context.sent;
578
+ _fallbackData = _yield$fetchTaskFamil.data;
579
+ taskItems = ((_fallbackData$taskFam = _fallbackData === null || _fallbackData === void 0 || (_fallbackData$taskFam2 = _fallbackData.taskFamily) === null || _fallbackData$taskFam2 === void 0 ? void 0 : _fallbackData$taskFam2.data) !== null && _fallbackData$taskFam !== void 0 ? _fallbackData$taskFam : []).map(normalizeTaskFamilyRecord).filter(function (item) {
580
+ return item !== null;
581
+ }).map(function (task) {
582
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
583
+ });
584
+ setHideRecentsLabel(taskItems.length > 0);
585
+ setActivePaginationSource('task-fallback');
586
+ syncTaskFallbackPagination(_fallbackData);
587
+ _context.next = 13;
588
+ break;
589
+ case 12:
590
+ setHideRecentsLabel(false);
591
+ setActivePaginationSource('none');
592
+ setHasMore(false);
593
+ case 13:
594
+ setItems(taskItems);
595
+ _context.next = 17;
596
+ break;
597
+ case 14:
598
+ if (!(type === 'user')) {
599
+ _context.next = 16;
600
+ break;
601
+ }
602
+ _context.next = 15;
603
+ return fetchUsersDirectory({
604
+ variables: {
605
+ filters: buildUsersDirectoryFilters(''),
606
+ page: 1
607
+ }
608
+ });
609
+ case 15:
610
+ _yield$fetchUsersDire = _context.sent;
611
+ _data3 = _yield$fetchUsersDire.data;
612
+ _mapped2 = ((_data3$usersDirectory = _data3 === null || _data3 === void 0 || (_data3$usersDirectory2 = _data3.usersDirectory) === null || _data3$usersDirectory2 === void 0 ? void 0 : _data3$usersDirectory2.data) !== null && _data3$usersDirectory !== void 0 ? _data3$usersDirectory : []).map(function (u) {
613
+ return mapUserToItem(u, '');
614
+ });
615
+ meItem = mapCorUserToUserItem(corUser, '', t('contextMention.me'));
616
+ withoutMe = _mapped2.filter(function (item) {
617
+ return String(item.id) !== String(meItem.id);
618
+ });
619
+ setItems([meItem].concat(_toConsumableArray(withoutMe)));
620
+ syncUsersPagination(_data3);
621
+ setHideRecentsLabel(false);
622
+ setActivePaginationSource('users');
623
+ _context.next = 17;
624
+ break;
625
+ case 16:
626
+ setItems([]);
627
+ setHideRecentsLabel(false);
628
+ setActivePaginationSource('none');
629
+ setHasMore(false);
630
+ setCurrentPage(1);
631
+ case 17:
632
+ _context.next = 19;
633
+ break;
634
+ case 18:
635
+ _context.prev = 18;
636
+ _t = _context["catch"](2);
637
+ setError(true);
638
+ setItems([]);
639
+ setHideRecentsLabel(false);
640
+ case 19:
641
+ _context.prev = 19;
642
+ setLoading(false);
643
+ return _context.finish(19);
644
+ case 20:
645
+ case "end":
646
+ return _context.stop();
647
+ }
648
+ }, _callee, null, [[2, 18, 19, 20]]);
649
+ })), [type, stableScope, fetchUsersDirectory, fetchTaskFamilyFallback, fetchProjectsFallback, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination, showProjectNameInTaskRow, corUser, t]);
650
+
651
+ // Disparar search al cambiar debounced value
652
+ useEffect(function () {
653
+ var q = debouncedSearchValue.trim();
654
+ if (type === 'mcp') {
655
+ var _stableScope$mcpSlugs2;
656
+ var slugs = (_stableScope$mcpSlugs2 = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs2 !== void 0 ? _stableScope$mcpSlugs2 : [];
657
+ setLoading(false);
658
+ setError(false);
659
+ setItems(mapMcpSlugsToItems(slugs, q));
660
+ return;
661
+ }
662
+ if (!q) return;
663
+ if (type === 'client') {
664
+ fetchSearchClients({
665
+ variables: {
666
+ filter: {
667
+ name: q
668
+ },
669
+ page: 1,
670
+ perPage: 20
671
+ }
672
+ });
673
+ setActivePaginationSource('clients-search');
674
+ } else if (type === 'user') {
675
+ fetchUsersDirectory({
676
+ variables: {
677
+ filters: buildUsersDirectoryFilters(q),
678
+ page: 1
679
+ }
680
+ });
681
+ setActivePaginationSource('users');
682
+ } else {
683
+ var filters = buildFiltersForType(type);
684
+ var extra = buildSearchEntitiesExtra(type, stableScope);
685
+ fetchSearchEntities({
686
+ variables: _objectSpread({
687
+ q: q,
688
+ filters: filters
689
+ }, extra !== undefined ? {
690
+ extra: extra
691
+ } : {})
692
+ });
693
+ setActivePaginationSource('none');
694
+ setHasMore(false);
695
+ }
696
+ }, [debouncedSearchValue, type, stableScope, fetchSearchEntities, fetchSearchClients, fetchUsersDirectory]);
697
+
698
+ // Sincronizar resultados de search
699
+ useEffect(function () {
700
+ if (type === 'mcp') return;
701
+ var q = debouncedSearchValue.trim();
702
+ if (!q) return;
703
+ setHideRecentsLabel(false);
704
+ if (type === 'client') {
705
+ var _clientsData$clients;
706
+ setLoading(clientsLoading);
707
+ if (clientsError) {
708
+ setError(true);
709
+ return;
710
+ }
711
+ if (clientsData !== null && clientsData !== void 0 && (_clientsData$clients = clientsData.clients) !== null && _clientsData$clients !== void 0 && _clientsData$clients.data) {
712
+ setItems(clientsData.clients.data.map(function (c) {
713
+ return mapClientToItem(c, q);
714
+ }));
715
+ syncClientsPagination(clientsData);
716
+ setError(false);
717
+ }
718
+ } else if (type === 'user') {
719
+ var _usersData$usersDirec;
720
+ setLoading(usersLoading);
721
+ if (usersError) {
722
+ setError(true);
723
+ return;
724
+ }
725
+ if (usersData !== null && usersData !== void 0 && (_usersData$usersDirec = usersData.usersDirectory) !== null && _usersData$usersDirec !== void 0 && _usersData$usersDirec.data) {
726
+ setItems(usersData.usersDirectory.data.map(function (u) {
727
+ return mapUserToItem(u, q);
728
+ }));
729
+ syncUsersPagination(usersData);
730
+ setError(false);
731
+ }
732
+ } else {
733
+ setLoading(searchLoading);
734
+ if (searchError) {
735
+ setError(true);
736
+ return;
737
+ }
738
+ if (searchData !== null && searchData !== void 0 && searchData.search) {
739
+ setItems(searchData.search.map(function (r) {
740
+ return mapSearchToItem(r, type, q, showProjectNameInTaskRow);
741
+ }));
742
+ setHasMore(false);
743
+ setError(false);
744
+ }
745
+ }
746
+ }, [searchData, clientsData, usersData, searchLoading, clientsLoading, usersLoading, searchError, clientsError, usersError, debouncedSearchValue, type, syncClientsPagination, syncUsersPagination, showProjectNameInTaskRow]);
747
+ var loadMore = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
748
+ var safeCurrentPage, nextPage, q, _data$usersDirectory, _data$usersDirectory2, _data$usersDirectory$, _data$usersDirectory3, _data$usersDirectory$2, _data$usersDirectory4, _yield$fetchUsersDire2, data, nextItems, _data4$clients, _data4$clients2, _data4$clients$data$l, _data4$clients3, _data4$clients$data, _data4$clients4, _yield$fetchSearchCli, _data4, _nextItems, _data5$taskFamily, _data5$taskFamily2, _data5$taskFamily$dat, _data5$taskFamily3, _data5$taskFamily$dat2, _data5$taskFamily4, filter, _yield$fetchTaskFamil2, _data5, _nextItems2, _data6$projects, _data6$projects2, _data6$projects$data$, _data6$projects3, _data6$projects$data, _data6$projects4, argumentsFilter, _yield$fetchProjectsF2, _data6, _nextItems3, _t2;
749
+ return _regeneratorRuntime.wrap(function (_context2) {
750
+ while (1) switch (_context2.prev = _context2.next) {
751
+ case 0:
752
+ if (!(isLoadingMore || !hasMore || activePaginationSource === 'none')) {
753
+ _context2.next = 1;
754
+ break;
755
+ }
756
+ console.info('[useEntitySearch] loadMore skipped', {
757
+ isLoadingMore: isLoadingMore,
758
+ hasMore: hasMore,
759
+ activePaginationSource: activePaginationSource
760
+ });
761
+ return _context2.abrupt("return");
762
+ case 1:
763
+ safeCurrentPage = normalizePositiveInt(currentPage, 1);
764
+ nextPage = safeCurrentPage + 1;
765
+ q = debouncedSearchValue.trim();
766
+ console.info('[useEntitySearch] loadMore start', {
767
+ source: activePaginationSource,
768
+ currentPage: currentPage,
769
+ nextPage: nextPage,
770
+ query: q
771
+ });
772
+ setIsLoadingMore(true);
773
+ _context2.prev = 2;
774
+ if (!(activePaginationSource === 'users')) {
775
+ _context2.next = 4;
776
+ break;
777
+ }
778
+ _context2.next = 3;
779
+ return fetchUsersDirectory({
780
+ variables: {
781
+ filters: buildUsersDirectoryFilters(q),
782
+ page: nextPage
783
+ }
784
+ });
785
+ case 3:
786
+ _yield$fetchUsersDire2 = _context2.sent;
787
+ data = _yield$fetchUsersDire2.data;
788
+ console.info('[useEntitySearch] users loadMore response', {
789
+ page: data === null || data === void 0 || (_data$usersDirectory = data.usersDirectory) === null || _data$usersDirectory === void 0 ? void 0 : _data$usersDirectory.page,
790
+ lastPage: data === null || data === void 0 || (_data$usersDirectory2 = data.usersDirectory) === null || _data$usersDirectory2 === void 0 ? void 0 : _data$usersDirectory2.lastPage,
791
+ count: (_data$usersDirectory$ = data === null || data === void 0 || (_data$usersDirectory3 = data.usersDirectory) === null || _data$usersDirectory3 === void 0 || (_data$usersDirectory3 = _data$usersDirectory3.data) === null || _data$usersDirectory3 === void 0 ? void 0 : _data$usersDirectory3.length) !== null && _data$usersDirectory$ !== void 0 ? _data$usersDirectory$ : 0
792
+ });
793
+ nextItems = ((_data$usersDirectory$2 = data === null || data === void 0 || (_data$usersDirectory4 = data.usersDirectory) === null || _data$usersDirectory4 === void 0 ? void 0 : _data$usersDirectory4.data) !== null && _data$usersDirectory$2 !== void 0 ? _data$usersDirectory$2 : []).map(function (u) {
794
+ return mapUserToItem(u, q);
795
+ });
796
+ setItems(function (prev) {
797
+ if (!q) {
798
+ var _prev$;
799
+ var meItem = ((_prev$ = prev[0]) === null || _prev$ === void 0 ? void 0 : _prev$.type) === 'user' ? prev[0] : mapCorUserToUserItem(corUser, '', t('contextMention.me'));
800
+ var _existingIds = new Set(prev.map(function (item) {
801
+ return String(item.id);
802
+ }));
803
+ var _appended = nextItems.filter(function (item) {
804
+ return !_existingIds.has(String(item.id));
805
+ });
806
+ var withoutMe = prev.filter(function (item) {
807
+ return String(item.id) !== String(meItem.id);
808
+ });
809
+ return [meItem].concat(_toConsumableArray(withoutMe), _toConsumableArray(_appended));
810
+ }
811
+ var existingIds = new Set(prev.map(function (item) {
812
+ return "".concat(item.type, "-").concat(item.id);
813
+ }));
814
+ var appended = nextItems.filter(function (item) {
815
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
816
+ });
817
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
818
+ });
819
+ syncUsersPagination(data);
820
+ _context2.next = 10;
821
+ break;
822
+ case 4:
823
+ if (!(activePaginationSource === 'clients-search')) {
824
+ _context2.next = 6;
825
+ break;
826
+ }
827
+ _context2.next = 5;
828
+ return fetchSearchClients({
829
+ variables: {
830
+ filter: {
831
+ name: q
832
+ },
833
+ page: nextPage,
834
+ perPage: 20
835
+ }
836
+ });
837
+ case 5:
838
+ _yield$fetchSearchCli = _context2.sent;
839
+ _data4 = _yield$fetchSearchCli.data;
840
+ console.info('[useEntitySearch] clients loadMore response', {
841
+ page: _data4 === null || _data4 === void 0 || (_data4$clients = _data4.clients) === null || _data4$clients === void 0 ? void 0 : _data4$clients.page,
842
+ lastPage: _data4 === null || _data4 === void 0 || (_data4$clients2 = _data4.clients) === null || _data4$clients2 === void 0 ? void 0 : _data4$clients2.lastPage,
843
+ count: (_data4$clients$data$l = _data4 === null || _data4 === void 0 || (_data4$clients3 = _data4.clients) === null || _data4$clients3 === void 0 || (_data4$clients3 = _data4$clients3.data) === null || _data4$clients3 === void 0 ? void 0 : _data4$clients3.length) !== null && _data4$clients$data$l !== void 0 ? _data4$clients$data$l : 0
844
+ });
845
+ _nextItems = ((_data4$clients$data = _data4 === null || _data4 === void 0 || (_data4$clients4 = _data4.clients) === null || _data4$clients4 === void 0 ? void 0 : _data4$clients4.data) !== null && _data4$clients$data !== void 0 ? _data4$clients$data : []).map(function (c) {
846
+ return mapClientToItem(c, q);
847
+ });
848
+ setItems(function (prev) {
849
+ var existingIds = new Set(prev.map(function (item) {
850
+ return "".concat(item.type, "-").concat(item.id);
851
+ }));
852
+ var appended = _nextItems.filter(function (item) {
853
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
854
+ });
855
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
856
+ });
857
+ syncClientsPagination(_data4);
858
+ _context2.next = 10;
859
+ break;
860
+ case 6:
861
+ if (!(activePaginationSource === 'task-fallback')) {
862
+ _context2.next = 8;
863
+ break;
864
+ }
865
+ filter = {};
866
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
867
+ filter.projectIds = [String(stableScope.projectId)];
868
+ }
869
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
870
+ filter.clientIds = [String(stableScope.clientId)];
871
+ }
872
+ _context2.next = 7;
873
+ return fetchTaskFamilyFallback({
874
+ variables: _objectSpread(_objectSpread({}, Object.keys(filter).length > 0 ? {
875
+ filter: filter
876
+ } : {}), {}, {
877
+ pagination: {
878
+ offset: (nextPage - 1) * 20,
879
+ size: 20
880
+ }
881
+ })
882
+ });
883
+ case 7:
884
+ _yield$fetchTaskFamil2 = _context2.sent;
885
+ _data5 = _yield$fetchTaskFamil2.data;
886
+ console.info('[useEntitySearch] task fallback loadMore response', {
887
+ page: _data5 === null || _data5 === void 0 || (_data5$taskFamily = _data5.taskFamily) === null || _data5$taskFamily === void 0 ? void 0 : _data5$taskFamily.page,
888
+ lastPage: _data5 === null || _data5 === void 0 || (_data5$taskFamily2 = _data5.taskFamily) === null || _data5$taskFamily2 === void 0 ? void 0 : _data5$taskFamily2.lastPage,
889
+ count: (_data5$taskFamily$dat = _data5 === null || _data5 === void 0 || (_data5$taskFamily3 = _data5.taskFamily) === null || _data5$taskFamily3 === void 0 || (_data5$taskFamily3 = _data5$taskFamily3.data) === null || _data5$taskFamily3 === void 0 ? void 0 : _data5$taskFamily3.length) !== null && _data5$taskFamily$dat !== void 0 ? _data5$taskFamily$dat : 0
890
+ });
891
+ _nextItems2 = ((_data5$taskFamily$dat2 = _data5 === null || _data5 === void 0 || (_data5$taskFamily4 = _data5.taskFamily) === null || _data5$taskFamily4 === void 0 ? void 0 : _data5$taskFamily4.data) !== null && _data5$taskFamily$dat2 !== void 0 ? _data5$taskFamily$dat2 : []).map(normalizeTaskFamilyRecord).filter(function (item) {
892
+ return item !== null;
893
+ }).map(function (task) {
894
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
895
+ });
896
+ setItems(function (prev) {
897
+ var existingIds = new Set(prev.map(function (item) {
898
+ return "".concat(item.type, "-").concat(item.id);
899
+ }));
900
+ var appended = _nextItems2.filter(function (item) {
901
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
902
+ });
903
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
904
+ });
905
+ syncTaskFallbackPagination(_data5);
906
+ _context2.next = 10;
907
+ break;
908
+ case 8:
909
+ if (!(activePaginationSource === 'project-fallback')) {
910
+ _context2.next = 10;
911
+ break;
912
+ }
913
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
914
+ client_id: [String(stableScope.clientId)]
915
+ } : undefined;
916
+ _context2.next = 9;
917
+ return fetchProjectsFallback({
918
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
919
+ arguments: argumentsFilter
920
+ } : {}), {}, {
921
+ page: nextPage,
922
+ perPage: 20
923
+ })
924
+ });
925
+ case 9:
926
+ _yield$fetchProjectsF2 = _context2.sent;
927
+ _data6 = _yield$fetchProjectsF2.data;
928
+ console.info('[useEntitySearch] project fallback loadMore response', {
929
+ page: _data6 === null || _data6 === void 0 || (_data6$projects = _data6.projects) === null || _data6$projects === void 0 ? void 0 : _data6$projects.page,
930
+ lastPage: _data6 === null || _data6 === void 0 || (_data6$projects2 = _data6.projects) === null || _data6$projects2 === void 0 ? void 0 : _data6$projects2.lastPage,
931
+ count: (_data6$projects$data$ = _data6 === null || _data6 === void 0 || (_data6$projects3 = _data6.projects) === null || _data6$projects3 === void 0 || (_data6$projects3 = _data6$projects3.data) === null || _data6$projects3 === void 0 ? void 0 : _data6$projects3.length) !== null && _data6$projects$data$ !== void 0 ? _data6$projects$data$ : 0
932
+ });
933
+ _nextItems3 = ((_data6$projects$data = _data6 === null || _data6 === void 0 || (_data6$projects4 = _data6.projects) === null || _data6$projects4 === void 0 ? void 0 : _data6$projects4.data) !== null && _data6$projects$data !== void 0 ? _data6$projects$data : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
934
+ return item !== null;
935
+ }).map(function (item) {
936
+ return mapSearchToItem(item, 'project', '');
937
+ });
938
+ setItems(function (prev) {
939
+ var existingIds = new Set(prev.map(function (item) {
940
+ return "".concat(item.type, "-").concat(item.id);
941
+ }));
942
+ var appended = _nextItems3.filter(function (item) {
943
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
944
+ });
945
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
946
+ });
947
+ syncProjectFallbackPagination(_data6);
948
+ case 10:
949
+ _context2.next = 12;
950
+ break;
951
+ case 11:
952
+ _context2.prev = 11;
953
+ _t2 = _context2["catch"](2);
954
+ console.error('[useEntitySearch] loadMore failed', {
955
+ source: activePaginationSource,
956
+ nextPage: nextPage,
957
+ error: _t2
958
+ });
959
+ // Evita loop de reintentos automáticos por scroll cuando backend está caído (ej. 503).
960
+ setError(true);
961
+ setHasMore(false);
962
+ case 12:
963
+ _context2.prev = 12;
964
+ setIsLoadingMore(false);
965
+ console.info('[useEntitySearch] loadMore finished', {
966
+ source: activePaginationSource,
967
+ nextPage: nextPage
968
+ });
969
+ return _context2.finish(12);
970
+ case 13:
971
+ case "end":
972
+ return _context2.stop();
973
+ }
974
+ }, _callee2, null, [[2, 11, 12, 13]]);
975
+ })), [isLoadingMore, hasMore, currentPage, activePaginationSource, debouncedSearchValue, fetchUsersDirectory, fetchSearchClients, fetchTaskFamilyFallback, fetchProjectsFallback, stableScope.projectId, stableScope.clientId, showProjectNameInTaskRow, corUser, t, syncClientsPagination, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination]);
976
+
977
+ // Cuando se limpia el search, volver a recents
978
+ useEffect(function () {
979
+ if (!debouncedSearchValue.trim()) {
980
+ fetchRecent();
981
+ }
982
+ }, [debouncedSearchValue, fetchRecent]);
983
+ return {
984
+ items: items,
985
+ loading: loading,
986
+ error: error,
987
+ hideRecentsLabel: hideRecentsLabel,
988
+ hasMore: hasMore,
989
+ isLoadingMore: isLoadingMore,
990
+ loadMore: loadMore,
991
+ searchValue: searchValue,
992
+ updateSearchValue: setSearchValue,
993
+ fetchRecent: fetchRecent
994
+ };
995
+ };
996
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VMYXp5UXVlcnkiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsImdldFJlY2VudENsaWVudHMiLCJnZXRSZWNlbnRQcm9qZWN0cyIsImdldFJlY2VudFRhc2tzIiwidXNlVXNlciIsIlBST0pFQ1RTX0ZBTExCQUNLIiwiU0VBUkNIX0VOVElUSUVTIiwiVEFTS19GQU1JTFlfRkFMTEJBQ0siLCJTRUFSQ0hfQ0xJRU5UUyIsIlVTRVJTX0RJUkVDVE9SWSIsIlNFQVJDSF9RVUVSWV9ERUJPVU5DRV9NUyIsInVzZURlYm91bmNlIiwidXNlVCIsIm5vcm1hbGl6ZVBvc2l0aXZlSW50IiwidmFsdWUiLCJmYWxsYmFjayIsInBhcnNlZCIsIk51bWJlciIsImlzRmluaXRlIiwibm9ybWFsaXplZCIsIk1hdGgiLCJmbG9vciIsIkJBU0VfRklMVEVSU19CWV9UWVBFIiwicHJvamVjdCIsImFyY2hpdmVkIiwidGFzayIsImJ1aWxkVGFza1NlYXJjaEV4dHJhRW50cmllcyIsInNjb3BlIiwicmF3Q2xpZW50IiwiY2xpZW50SWQiLCJ1bmRlZmluZWQiLCJTdHJpbmciLCJyYXdQcm9qZWN0IiwicHJvamVjdElkIiwiYWdlbnRFbnRpdHkiLCJlbnRyaWVzIiwicHVzaENsaWVudCIsInB1c2giLCJwdXNoUHJvamVjdCIsImJ1aWxkVGFza1NlYXJjaEV4dHJhIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsImJ1aWxkUHJvamVjdFNlYXJjaEV4dHJhIiwiYnVpbGRTZWFyY2hFbnRpdGllc0V4dHJhIiwidHlwZSIsImJ1aWxkRmlsdGVyc0ZvclR5cGUiLCJidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycyIsInEiLCJiYXNlIiwid2l0aFBvc2l0aW9uIiwid2l0aFRlYW1zIiwidHJpbW1lZFEiLCJ0cmltIiwic2VhcmNoSW5wdXQiLCJoaWdobGlnaHRSYW5nZSIsInRleHQiLCJzZWFyY2hWYWx1ZSIsImlkeCIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsInN0YXJ0IiwiZmlyc3REZWZpbmVkIiwiX2xlbiIsImFyZ3VtZW50cyIsInZhbHVlcyIsIkFycmF5IiwiX2tleSIsImZpbmQiLCJtYXBDbGllbnRUb0l0ZW0iLCJjIiwiX2MkdG90YWxQcm95ZWN0b3MiLCJfYyR0b3RhbFByb3llY3RvczIiLCJpZCIsInByaW1hcnkiLCJuYW1lIiwicHJpbWFyeUhpZ2hsaWdodCIsImJyZWFkY3J1bWIiLCJjb3VudCIsInRvdGFsUHJveWVjdG9zIiwiY291bnRMYWJlbCIsInJhdyIsIm1hcFVzZXJUb0l0ZW0iLCJ1IiwiX3UkZmlyc3ROYW1lIiwiX3UkbGFzdE5hbWUiLCJfdSRwaWN0dXJlIiwiX3UkcG9zaXRpb25OYW1lIiwiX3UkZW1haWwiLCJmdWxsTmFtZSIsImNvbmNhdCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZW1haWwiLCJwaWN0dXJlIiwicG9zaXRpb25OYW1lIiwibWFwQ29yVXNlclRvVXNlckl0ZW0iLCJ1c2VyIiwibWVMYWJlbCIsIl91c2VyJGZpcnN0TmFtZSIsIl91c2VyJGxhc3ROYW1lIiwiX3VzZXIkdXNlcl9wb3NpdGlvbiIsIl91c2VyJHJvbGUiLCJwb3NpdGlvbkxpbmUiLCJ1c2VyX3Bvc2l0aW9uIiwicm9sZSIsIm1hcFJlY2VudFRhc2tUb0l0ZW0iLCJfdGFzayRwcm9qZWN0TmFtZSIsInNob3dQcm9qZWN0TmFtZUluVGFza1JvdyIsInRpdGxlIiwicHJvamVjdE5hbWUiLCJwYXJlbnQiLCJub3JtYWxpemVUYXNrRmFtaWx5UmVjb3JkIiwicmVjb3JkIiwiX2ZpcnN0RGVmaW5lZCIsIl9maXJzdERlZmluZWQyIiwiX3JlY29yZCRwcm9qZWN0IiwiX3JlY29yZCRmYXRoZXIiLCJfcmVjb3JkJGZhdGhlcjIiLCJ0YXNrRmFtaWx5SWQiLCJfaWQiLCJmYXRoZXIiLCJoYXNGYXRoZXIiLCJ0YXNrRmF0aGVyIiwibm9ybWFsaXplUHJvamVjdHNGYWxsYmFja1JlY29yZCIsIl9yZWNvcmQkbmFtZSIsIl9maXJzdERlZmluZWQzIiwiX3JlY29yZCRjbGllbnQiLCJfcmVjb3JkJGNsaWVudCRuYW1lIiwiX3JlY29yZCRjbGllbnQyIiwiY2xpZW50IiwiY2xpZW50TmFtZSIsIm1hcFNlYXJjaFRvSXRlbSIsInIiLCJfciRwcm9qZWN0TmFtZSIsIl9yJHByb2plY3ROYW1lMiIsIl9yJGNsaWVudElkIiwiX3IkY2xpZW50TmFtZSIsIl9yJGZlZUlkIiwiX2ZhdGhlciR0aXRsZSIsInRhc2tQcm9qZWN0TmFtZSIsImZlZUlkIiwiZmF0aGVySWQiLCJmYXRoZXJUaXRsZSIsImZvcm1hdE1jcFByaW1hcnlMYWJlbCIsInNsdWciLCJyZXBsYWNlIiwiY2hhciIsInRvVXBwZXJDYXNlIiwibWFwTWNwU2x1Z3NUb0l0ZW1zIiwic2x1Z3MiLCJmaWx0ZXJlZCIsImZpbHRlciIsInMiLCJpbmNsdWRlcyIsIm1hcCIsInVzZUVudGl0eVNlYXJjaCIsIl9zY29wZSRtY3BTbHVncyIsImNvclVzZXIiLCJfdXNlVCIsInQiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRTZWFyY2hWYWx1ZSIsImRlYm91bmNlZFNlYXJjaFZhbHVlIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJpdGVtcyIsInNldEl0ZW1zIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwiZXJyb3IiLCJzZXRFcnJvciIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwiaGlkZVJlY2VudHNMYWJlbCIsInNldEhpZGVSZWNlbnRzTGFiZWwiLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJoYXNNb3JlIiwic2V0SGFzTW9yZSIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc0xvYWRpbmdNb3JlIiwic2V0SXNMb2FkaW5nTW9yZSIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJjdXJyZW50UGFnZSIsInNldEN1cnJlbnRQYWdlIiwiX3VzZVN0YXRlMTUiLCJfdXNlU3RhdGUxNiIsImFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UiLCJzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlIiwibWNwU2x1Z3NLZXkiLCJtY3BTbHVncyIsImpvaW4iLCJzdGFibGVTY29wZSIsIl9zY29wZSRjbGllbnRJZCIsIl9zY29wZSRwcm9qZWN0SWQiLCJfc2NvcGUkbWNwU2x1Z3MyIiwiX3Njb3BlJGFnZW50RW50aXR5IiwiX3VzZUxhenlRdWVyeSIsInZhcmlhYmxlcyIsImxpbWl0IiwiZmV0Y2hQb2xpY3kiLCJfdXNlTGF6eVF1ZXJ5MiIsImZldGNoU2VhcmNoRW50aXRpZXMiLCJfdXNlTGF6eVF1ZXJ5MiQiLCJzZWFyY2hEYXRhIiwiZGF0YSIsInNlYXJjaExvYWRpbmciLCJzZWFyY2hFcnJvciIsIl91c2VMYXp5UXVlcnkzIiwiX3VzZUxhenlRdWVyeTQiLCJmZXRjaFNlYXJjaENsaWVudHMiLCJfdXNlTGF6eVF1ZXJ5NCQiLCJjbGllbnRzRGF0YSIsImNsaWVudHNMb2FkaW5nIiwiY2xpZW50c0Vycm9yIiwiX3VzZUxhenlRdWVyeTUiLCJfdXNlTGF6eVF1ZXJ5NiIsImZldGNoVXNlcnNEaXJlY3RvcnkiLCJfdXNlTGF6eVF1ZXJ5NiQiLCJ1c2Vyc0RhdGEiLCJ1c2Vyc0xvYWRpbmciLCJ1c2Vyc0Vycm9yIiwic3luY1VzZXJzUGFnaW5hdGlvbiIsInBheWxvYWQiLCJfcGF5bG9hZCR1c2Vyc0RpcmVjdG8iLCJfcGF5bG9hZCR1c2Vyc0RpcmVjdG8yIiwicGFnZSIsInVzZXJzRGlyZWN0b3J5IiwibGFzdFBhZ2UiLCJzeW5jQ2xpZW50c1BhZ2luYXRpb24iLCJfcGF5bG9hZCRjbGllbnRzIiwiX3BheWxvYWQkY2xpZW50czIiLCJjbGllbnRzIiwic3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24iLCJfcGF5bG9hZCR0YXNrRmFtaWx5IiwiX3BheWxvYWQkdGFza0ZhbWlseTIiLCJ0YXNrRmFtaWx5Iiwic3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24iLCJfcGF5bG9hZCRwcm9qZWN0cyIsIl9wYXlsb2FkJHByb2plY3RzMiIsInByb2plY3RzIiwiX3VzZUxhenlRdWVyeTciLCJfdXNlTGF6eVF1ZXJ5OCIsImZldGNoVGFza0ZhbWlseUZhbGxiYWNrIiwiX3VzZUxhenlRdWVyeTkiLCJfdXNlTGF6eVF1ZXJ5MCIsImZldGNoUHJvamVjdHNGYWxsYmFjayIsImZldGNoUmVjZW50IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJfc3RhYmxlU2NvcGUkbWNwU2x1Z3MiLCJtYXBwZWQiLCJfZGF0YSIsIl9tYXBwZWQiLCJfZmFsbGJhY2tEYXRhJHByb2plY3QiLCJfZmFsbGJhY2tEYXRhJHByb2plY3QyIiwiYXJndW1lbnRzRmlsdGVyIiwiX3lpZWxkJGZldGNoUHJvamVjdHNGIiwiZmFsbGJhY2tEYXRhIiwiZmFsbGJhY2tNYXBwZWQiLCJyZWNlbnRUYXNrRmlsdGVycyIsIl9kYXRhMiIsInRhc2tJdGVtcyIsIl9mYWxsYmFja0RhdGEkdGFza0ZhbSIsIl9mYWxsYmFja0RhdGEkdGFza0ZhbTIiLCJfeWllbGQkZmV0Y2hUYXNrRmFtaWwiLCJfZmFsbGJhY2tEYXRhIiwiX2RhdGEzJHVzZXJzRGlyZWN0b3J5IiwiX2RhdGEzJHVzZXJzRGlyZWN0b3J5MiIsIl95aWVsZCRmZXRjaFVzZXJzRGlyZSIsIl9kYXRhMyIsIl9tYXBwZWQyIiwibWVJdGVtIiwid2l0aG91dE1lIiwiX3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImFicnVwdCIsInNlbnQiLCJpc0FycmF5IiwicCIsImNsaWVudF9pZCIsIl9vYmplY3RTcHJlYWQiLCJwZXJQYWdlIiwiaXRlbSIsInByb2plY3RJZHMiLCJjbGllbnRJZHMiLCJPYmplY3QiLCJrZXlzIiwicGFnaW5hdGlvbiIsIm9mZnNldCIsInNpemUiLCJmaWx0ZXJzIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiZmluaXNoIiwic3RvcCIsIl9zdGFibGVTY29wZSRtY3BTbHVnczIiLCJleHRyYSIsIl9jbGllbnRzRGF0YSRjbGllbnRzIiwiX3VzZXJzRGF0YSR1c2Vyc0RpcmVjIiwic2VhcmNoIiwibG9hZE1vcmUiLCJfY2FsbGVlMiIsInNhZmVDdXJyZW50UGFnZSIsIm5leHRQYWdlIiwiX2RhdGEkdXNlcnNEaXJlY3RvcnkiLCJfZGF0YSR1c2Vyc0RpcmVjdG9yeTIiLCJfZGF0YSR1c2Vyc0RpcmVjdG9yeSQiLCJfZGF0YSR1c2Vyc0RpcmVjdG9yeTMiLCJfZGF0YSR1c2Vyc0RpcmVjdG9yeSQyIiwiX2RhdGEkdXNlcnNEaXJlY3Rvcnk0IiwiX3lpZWxkJGZldGNoVXNlcnNEaXJlMiIsIm5leHRJdGVtcyIsIl9kYXRhNCRjbGllbnRzIiwiX2RhdGE0JGNsaWVudHMyIiwiX2RhdGE0JGNsaWVudHMkZGF0YSRsIiwiX2RhdGE0JGNsaWVudHMzIiwiX2RhdGE0JGNsaWVudHMkZGF0YSIsIl9kYXRhNCRjbGllbnRzNCIsIl95aWVsZCRmZXRjaFNlYXJjaENsaSIsIl9kYXRhNCIsIl9uZXh0SXRlbXMiLCJfZGF0YTUkdGFza0ZhbWlseSIsIl9kYXRhNSR0YXNrRmFtaWx5MiIsIl9kYXRhNSR0YXNrRmFtaWx5JGRhdCIsIl9kYXRhNSR0YXNrRmFtaWx5MyIsIl9kYXRhNSR0YXNrRmFtaWx5JGRhdDIiLCJfZGF0YTUkdGFza0ZhbWlseTQiLCJfeWllbGQkZmV0Y2hUYXNrRmFtaWwyIiwiX2RhdGE1IiwiX25leHRJdGVtczIiLCJfZGF0YTYkcHJvamVjdHMiLCJfZGF0YTYkcHJvamVjdHMyIiwiX2RhdGE2JHByb2plY3RzJGRhdGEkIiwiX2RhdGE2JHByb2plY3RzMyIsIl9kYXRhNiRwcm9qZWN0cyRkYXRhIiwiX2RhdGE2JHByb2plY3RzNCIsIl95aWVsZCRmZXRjaFByb2plY3RzRjIiLCJfZGF0YTYiLCJfbmV4dEl0ZW1zMyIsIl90MiIsIl9jb250ZXh0MiIsImNvbnNvbGUiLCJpbmZvIiwic291cmNlIiwicXVlcnkiLCJfcHJldiQiLCJleGlzdGluZ0lkcyIsIlNldCIsImFwcGVuZGVkIiwiaGFzIiwidXBkYXRlU2VhcmNoVmFsdWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXNlRW50aXR5U2VhcmNoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUxhenlRdWVyeSB9IGZyb20gJ0BhcG9sbG8vY2xpZW50J1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGdldFJlY2VudENsaWVudHMgfSBmcm9tICcuLi9zZXJ2aWNlcy9tYWlhL1JlY2VudENsaWVudHMvZ2V0UmVjZW50Q2xpZW50cydcbmltcG9ydCB7IGdldFJlY2VudFByb2plY3RzIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpYS9SZWNlbnRQcm9qZWN0cy9nZXRSZWNlbnRQcm9qZWN0cydcbmltcG9ydCB7IGdldFJlY2VudFRhc2tzIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpYS9SZWNlbnRUYXNrcy9nZXRSZWNlbnRUYXNrcydcbmltcG9ydCB0eXBlIHsgUmVjZW50VGFza0l0ZW0gfSBmcm9tICcuLi9zZXJ2aWNlcy9tYWlhL1JlY2VudFRhc2tzL2dldFJlY2VudFRhc2tzJ1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBQUk9KRUNUU19GQUxMQkFDSywgU0VBUkNIX0VOVElUSUVTLCBUQVNLX0ZBTUlMWV9GQUxMQkFDSyB9IGZyb20gJy4uL3NlcnZpY2VzL3F1ZXJ5L2VudGl0eVNlYXJjaFF1ZXJ5J1xuaW1wb3J0IHsgU0VBUkNIX0NMSUVOVFMgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS9DbGllbnRTZWFyY2hRdWVyeSdcbmltcG9ydCB7IFVTRVJTX0RJUkVDVE9SWSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1ZXJ5L3VzZXJzRGlyZWN0b3J5UXVlcnknXG5pbXBvcnQgeyBTRUFSQ0hfUVVFUllfREVCT1VOQ0VfTVMgfSBmcm9tICcuLi9jb25zdGFudHMvY29uZmlnJ1xuaW1wb3J0IHsgdXNlRGVib3VuY2UgfSBmcm9tICcuL3VzZURlYm91bmNlJ1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4vdXNlVCdcbmltcG9ydCB7IENvbnRleHRFbnRpdHlUeXBlLCBDb250ZXh0TWVudGlvbkl0ZW0gfSBmcm9tICcuLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB0eXBlIHsgQWdlbnRFbnRpdHkgfSBmcm9tICcuLi90eXBlcy9hZ2VudCdcblxudHlwZSBSYXdTZWFyY2hSZXN1bHQgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgdGl0bGU6IHN0cmluZ1xuICB0eXBlPzogc3RyaW5nXG4gIGNsaWVudElkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbFxuICBmZWVJZD86IG51bWJlciB8IHN0cmluZyB8IG51bGxcbiAgY2xpZW50TmFtZT86IHN0cmluZyB8IG51bGxcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIGZhdGhlcj86IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgdGl0bGU/OiBzdHJpbmcgfCBudWxsIH0gfCBudWxsXG59XG5cbnR5cGUgUmF3Q2xpZW50ID0ge1xuICBpZDogbnVtYmVyIHwgc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICB0b3RhbFByb3llY3Rvcz86IG51bWJlciB8IG51bGxcbn1cblxudHlwZSBSYXdEaXJlY3RvcnlVc2VyID0ge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gIGZpcnN0TmFtZT86IHN0cmluZyB8IG51bGxcbiAgbGFzdE5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIGVtYWlsPzogc3RyaW5nIHwgbnVsbFxuICBwaWN0dXJlPzogc3RyaW5nIHwgbnVsbFxuICBwb3NpdGlvbk5hbWU/OiBzdHJpbmcgfCBudWxsXG59XG5cbnR5cGUgU2VhcmNoRW50aXRpZXNEYXRhID0geyBzZWFyY2g6IFJhd1NlYXJjaFJlc3VsdFtdIHwgbnVsbCB9XG50eXBlIFNlYXJjaENsaWVudHNEYXRhID0ge1xuICBjbGllbnRzOiB7XG4gICAgdG90YWw/OiBudW1iZXIgfCBudWxsXG4gICAgcGVyUGFnZT86IG51bWJlciB8IG51bGxcbiAgICBwYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGxhc3RQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGRhdGE6IFJhd0NsaWVudFtdXG4gIH0gfCBudWxsXG59XG50eXBlIFVzZXJzRGlyZWN0b3J5RGF0YSA9IHtcbiAgdXNlcnNEaXJlY3Rvcnk6IHtcbiAgICB0b3RhbD86IG51bWJlciB8IG51bGxcbiAgICBwZXJQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIHBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgbGFzdFBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgZGF0YTogUmF3RGlyZWN0b3J5VXNlcltdIHwgbnVsbFxuICB9IHwgbnVsbFxufVxuXG50eXBlIFRhc2tGYW1pbHlSZWNvcmQgPSB7XG4gIF9pZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgdGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIHByb2plY3RJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgdGFza0ZhdGhlcj86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgZmF0aGVyPzogeyBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7IHRpdGxlPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbFxuICBwcm9qZWN0PzogeyBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH0gfCBudWxsXG59XG5cbnR5cGUgVGFza0ZhbWlseURhdGEgPSB7XG4gIHRhc2tGYW1pbHk/OiB7XG4gICAgdG90YWw/OiBudW1iZXIgfCBudWxsXG4gICAgcGVyUGFnZT86IG51bWJlciB8IG51bGxcbiAgICBwYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGxhc3RQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGRhdGE/OiBUYXNrRmFtaWx5UmVjb3JkW10gfCBudWxsXG4gIH0gfCBudWxsXG59XG5cbnR5cGUgRmFsbGJhY2tQcm9qZWN0UmVjb3JkID0ge1xuICBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgbmFtZT86IHN0cmluZyB8IG51bGxcbiAgY2xpZW50SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIGNsaWVudD86IHsgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbFxufVxuXG50eXBlIFByb2plY3RzRmFsbGJhY2tEYXRhID0ge1xuICBwcm9qZWN0cz86IHtcbiAgICB0b3RhbD86IG51bWJlciB8IG51bGxcbiAgICBwZXJQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIHBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgbGFzdFBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgZGF0YT86IEZhbGxiYWNrUHJvamVjdFJlY29yZFtdIHwgbnVsbFxuICB9IHwgbnVsbFxufVxuXG50eXBlIFBhZ2luYXRpb25Tb3VyY2UgPSAnbm9uZScgfCAndXNlcnMnIHwgJ2NsaWVudHMtc2VhcmNoJyB8ICd0YXNrLWZhbGxiYWNrJyB8ICdwcm9qZWN0LWZhbGxiYWNrJ1xuXG5jb25zdCBub3JtYWxpemVQb3NpdGl2ZUludCA9ICh2YWx1ZTogdW5rbm93biwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBNYXRoLmZsb29yKHBhcnNlZClcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPiAwID8gbm9ybWFsaXplZCA6IGZhbGxiYWNrXG59XG5cbi8qKlxuICogUmVzdHJpbmdlIGxvcyByZXN1bHRhZG9zIGFsIGBjbGllbnRJZGAvYHByb2plY3RJZGAgZGVsIGFnZW50ZSBhY3Rpdm8uXG4gKiBDdWFuZG8gZWwgYWdlbnRlIGVzdMOhIHNjb3BlYWRvIGEgdW4gY2xpZW50L3Byb2plY3QsIHRhbnRvIGxvcyByZWNlbnRzIGNvbW9cbiAqIGVsIHNlYXJjaCBkZWJlbiBmaWx0cmFyIHBvciBlc2UgY29udGV4dG8uIFNpIGVsIGJhY2tlbmQgbm8gZW50aWVuZGUgYWxnw7puXG4gKiBjYW1wbyBsbyBpZ25vcmEgeSBzZSBjYWUgYWwgY29tcG9ydGFtaWVudG8gZ2xvYmFsLlxuICovXG5leHBvcnQgdHlwZSBFbnRpdHlTZWFyY2hTY29wZSA9IHtcbiAgY2xpZW50SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIHByb2plY3RJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgLyoqIFNsdWdzIGRlbCBjb25lY3RvciBNQ1AgZGVsIGFnZW50ZSAobGlzdGFkbyBsb2NhbCwgc2luIEdyYXBoUUwpLiAqL1xuICBtY3BTbHVncz86IHN0cmluZ1tdXG4gIC8qKlxuICAgKiBgZW50aXR5YCBkZWwgYWdlbnRlIGFjdGl2by4gUGFyYSBlc3BlY2lhbGlzdGFzOlxuICAgKiAtIGBwcm9qZWN0YDogYsO6c3F1ZWRhIGRlIHRhcmVhcyBmdWVyemEgZmlsdHJvIHBvciBgcHJvamVjdElkYCBkZWwgY29udGV4dG8uXG4gICAqIC0gYGNsaWVudGA6IGLDunNxdWVkYSBkZSBwcm95ZWN0b3MgcG9yIGBjbGllbnRJZGA7IHRhcmVhcyBwb3IgY2xpZW50ZSAoeSBwcm95ZWN0byBzaSBhcGxpY2EpLlxuICAgKi9cbiAgYWdlbnRFbnRpdHk/OiBBZ2VudEVudGl0eSB8IG51bGxcbn1cblxudHlwZSBTZWFyY2hGaWx0ZXJhYmxlVHlwZSA9ICdwcm9qZWN0JyB8ICd0YXNrJ1xuXG5jb25zdCBCQVNFX0ZJTFRFUlNfQllfVFlQRTogUmVjb3JkPFNlYXJjaEZpbHRlcmFibGVUeXBlLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgcHJvamVjdDogeyBwcm9qZWN0OiAndHJ1ZScsIGFyY2hpdmVkOiAnYWxsJyB9LFxuICB0YXNrOiB7IHRhc2s6ICd0cnVlJywgYXJjaGl2ZWQ6ICdmYWxzZScgfSxcbn1cblxuLyoqXG4gKiBFbnRyYWRhcyBwYXJhIGVsIGFyZ3VtZW50byBHcmFwaFFMIGBleHRyYWAgKEpTT04gc3RyaW5nIGRlIGFycmF5KSBhbCBidXNjYXIgdGFyZWFzIGNvbiBjb250ZXh0by5cbiAqIEVqLjogW3tcInByb2plY3RJZFwiOlwiODgxNTUyXCJ9XVxuICovXG5jb25zdCBidWlsZFRhc2tTZWFyY2hFeHRyYUVudHJpZXMgPSAoc2NvcGU/OiBFbnRpdHlTZWFyY2hTY29wZSk6IEFycmF5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+IHtcbiAgY29uc3QgcmF3Q2xpZW50ID1cbiAgICBzY29wZT8uY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzY29wZT8uY2xpZW50SWQgIT09IG51bGwgJiYgc2NvcGU/LmNsaWVudElkICE9PSAnJyA/IFN0cmluZyhzY29wZS5jbGllbnRJZCkgOiBudWxsXG4gIGNvbnN0IHJhd1Byb2plY3QgPVxuICAgIHNjb3BlPy5wcm9qZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzY29wZT8ucHJvamVjdElkICE9PSBudWxsICYmIHNjb3BlPy5wcm9qZWN0SWQgIT09ICcnXG4gICAgICA/IFN0cmluZyhzY29wZS5wcm9qZWN0SWQpXG4gICAgICA6IG51bGxcblxuICBjb25zdCBhZ2VudEVudGl0eSA9IHNjb3BlPy5hZ2VudEVudGl0eVxuICBjb25zdCBlbnRyaWVzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IFtdXG5cbiAgY29uc3QgcHVzaENsaWVudCA9ICgpID0+IHtcbiAgICBpZiAocmF3Q2xpZW50KSBlbnRyaWVzLnB1c2goeyBjbGllbnRJZDogcmF3Q2xpZW50IH0pXG4gIH1cbiAgY29uc3QgcHVzaFByb2plY3QgPSAoKSA9PiB7XG4gICAgaWYgKHJhd1Byb2plY3QpIGVudHJpZXMucHVzaCh7IHByb2plY3RJZDogcmF3UHJvamVjdCB9KVxuICB9XG5cbiAgaWYgKGFnZW50RW50aXR5ID09PSAncHJvamVjdCcpIHtcbiAgICBpZiAocmF3UHJvamVjdCkge1xuICAgICAgcHVzaFByb2plY3QoKVxuICAgIH0gZWxzZSBpZiAocmF3Q2xpZW50KSB7XG4gICAgICBwdXNoQ2xpZW50KClcbiAgICB9XG4gIH0gZWxzZSBpZiAoYWdlbnRFbnRpdHkgPT09ICdjbGllbnQnKSB7XG4gICAgcHVzaENsaWVudCgpXG4gICAgcHVzaFByb2plY3QoKVxuICB9IGVsc2Uge1xuICAgIHB1c2hDbGllbnQoKVxuICAgIHB1c2hQcm9qZWN0KClcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzXG59XG5cbmNvbnN0IGJ1aWxkVGFza1NlYXJjaEV4dHJhID0gKHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBlbnRyaWVzID0gYnVpbGRUYXNrU2VhcmNoRXh0cmFFbnRyaWVzKHNjb3BlKVxuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVudHJpZXMpXG59XG5cbi8qKlxuICogVGFiIHByb3llY3RvOiBjb24gYGNsaWVudElkYCBlbiBlbCBzY29wZSwgYGV4dHJhYCBhY290YSBsYSBiw7pzcXVlZGEgYSBwcm95ZWN0b3MgZGUgZXNlIGNsaWVudGUuXG4gKiBFai46IGBbe1wiY2xpZW50SWRcIjpcIjQ3MTA1XCJ9XWAganVudG8gYSBgZmlsdGVyc2AgYHtcInByb2plY3RcIjpcInRydWVcIixcImFyY2hpdmVkXCI6XCJhbGxcIn1gLlxuICovXG5jb25zdCBidWlsZFByb2plY3RTZWFyY2hFeHRyYSA9IChzY29wZT86IEVudGl0eVNlYXJjaFNjb3BlKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmF3Q2xpZW50ID1cbiAgICBzY29wZT8uY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzY29wZT8uY2xpZW50SWQgIT09IG51bGwgJiYgc2NvcGU/LmNsaWVudElkICE9PSAnJyA/IFN0cmluZyhzY29wZS5jbGllbnRJZCkgOiBudWxsXG4gIGlmICghcmF3Q2xpZW50KSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbeyBjbGllbnRJZDogcmF3Q2xpZW50IH1dKVxufVxuXG5jb25zdCBidWlsZFNlYXJjaEVudGl0aWVzRXh0cmEgPSAodHlwZTogU2VhcmNoRmlsdGVyYWJsZVR5cGUsIHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZSA9PT0gJ3Rhc2snKSByZXR1cm4gYnVpbGRUYXNrU2VhcmNoRXh0cmEoc2NvcGUpXG4gIGlmICh0eXBlID09PSAncHJvamVjdCcpIHJldHVybiBidWlsZFByb2plY3RTZWFyY2hFeHRyYShzY29wZSlcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFRhYiBgdGFza2AgLyBgcHJvamVjdGA6IGBmaWx0ZXJzYCBzw7NsbyB0aXBvICsgYXJjaGl2ZWQgKHRhcmVhczogbm8gYXJjaGl2YWRhcyk7IHNjb3BlIChjbGllbnRJZCAvIHByb2plY3RJZCBlbiB0YXJlYXMpIGVuIGBleHRyYWAuXG4gKi9cbmNvbnN0IGJ1aWxkRmlsdGVyc0ZvclR5cGUgPSAodHlwZTogU2VhcmNoRmlsdGVyYWJsZVR5cGUpOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZSA9PT0gJ3Byb2plY3QnKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEJBU0VfRklMVEVSU19CWV9UWVBFLnByb2plY3QpXG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEJBU0VfRklMVEVSU19CWV9UWVBFLnRhc2spXG59XG5cbi8qKlxuICogRmlsdHJvcyBwYXJhIHVzZXJzRGlyZWN0b3J5LiBFbCBiYWNrZW5kIGVzcGVyYSB1biBKU09OIHN0cmluZyBjb25cbiAqIHdpdGhQb3NpdGlvbiwgd2l0aFRlYW1zIHkgc2VhcmNoSW5wdXQuIExlIGFncmVnYW1vcyBjbGllbnRJZC9wcm9qZWN0SWRcbiAqIGRlbCBzY29wZSBlbiBjYXNvIGRlIHF1ZSBlbCBiYWNrZW5kIGxvcyBhcHJvdmVjaGUgcGFyYSBmaWx0cmFyIHBvclxuICogY29udGV4dG8gKHNpIG5vIGxvcyBlbnRpZW5kZSBsb3MgaWdub3JhKS5cbiAqL1xuY29uc3QgYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMgPSAocTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYmFzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgd2l0aFBvc2l0aW9uOiB0cnVlLFxuICAgIHdpdGhUZWFtczogdHJ1ZSxcbiAgfVxuICBjb25zdCB0cmltbWVkUSA9IHEudHJpbSgpXG4gIGlmICh0cmltbWVkUSkge1xuICAgIGJhc2Uuc2VhcmNoSW5wdXQgPSB0cmltbWVkUVxuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlKVxufVxuXG5jb25zdCBoaWdobGlnaHRSYW5nZSA9ICh0ZXh0OiBzdHJpbmcsIHNlYXJjaFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgaWYgKCFzZWFyY2hWYWx1ZSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBpZHggPSB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKVxuICBpZiAoaWR4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4geyBzdGFydDogaWR4LCBsZW5ndGg6IHNlYXJjaFZhbHVlLmxlbmd0aCB9XG59XG5cbmNvbnN0IGZpcnN0RGVmaW5lZCA9IDxUPiguLi52YWx1ZXM6IEFycmF5PFQgfCBudWxsIHwgdW5kZWZpbmVkPik6IFQgfCB1bmRlZmluZWQgPT5cbiAgdmFsdWVzLmZpbmQodmFsdWUgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbClcblxuY29uc3QgbWFwQ2xpZW50VG9JdGVtID0gKGM6IFJhd0NsaWVudCwgc2VhcmNoVmFsdWU6IHN0cmluZyk6IENvbnRleHRNZW50aW9uSXRlbSA9PiAoe1xuICBpZDogYy5pZCxcbiAgdHlwZTogJ2NsaWVudCcsXG4gIHByaW1hcnk6IGMubmFtZSxcbiAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UoYy5uYW1lLCBzZWFyY2hWYWx1ZSksXG4gIGJyZWFkY3J1bWI6IHtcbiAgICBjb3VudDogYy50b3RhbFByb3llY3RvcyA/PyB1bmRlZmluZWQsXG4gICAgY291bnRMYWJlbDogJ3Byb2plY3RzJyxcbiAgfSxcbiAgcmF3OiB7XG4gICAgaWQ6IGMuaWQsXG4gICAgbmFtZTogYy5uYW1lLFxuICAgIHRvdGFsUHJveWVjdG9zOiBjLnRvdGFsUHJveWVjdG9zID8/IG51bGwsXG4gIH0sXG59KVxuXG5jb25zdCBtYXBVc2VyVG9JdGVtID0gKHU6IFJhd0RpcmVjdG9yeVVzZXIsIHNlYXJjaFZhbHVlOiBzdHJpbmcpOiBDb250ZXh0TWVudGlvbkl0ZW0gPT4ge1xuICBjb25zdCBmdWxsTmFtZSA9IGAke3UuZmlyc3ROYW1lID8/ICcnfSAke3UubGFzdE5hbWUgPz8gJyd9YC50cmltKClcbiAgY29uc3QgcHJpbWFyeSA9IGZ1bGxOYW1lIHx8IHUuZW1haWwgfHwgU3RyaW5nKHUuaWQpXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogdS5pZCxcbiAgICB0eXBlOiAndXNlcicsXG4gICAgcHJpbWFyeSxcbiAgICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShwcmltYXJ5LCBzZWFyY2hWYWx1ZSksXG4gICAgcmF3OiB7XG4gICAgICBpZDogdS5pZCxcbiAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICBwaWN0dXJlOiB1LnBpY3R1cmUgPz8gbnVsbCxcbiAgICAgIHBvc2l0aW9uTmFtZTogdS5wb3NpdGlvbk5hbWUgPz8gbnVsbCxcbiAgICAgIGVtYWlsOiB1LmVtYWlsID8/IG51bGwsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBtYXBDb3JVc2VyVG9Vc2VySXRlbSA9IChcbiAgdXNlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlVXNlcj4sXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcsXG4gIG1lTGFiZWw6IHN0cmluZ1xuKTogQ29udGV4dE1lbnRpb25JdGVtID0+IHtcbiAgY29uc3QgZnVsbE5hbWUgPSBgJHt1c2VyLmZpcnN0TmFtZSA/PyAnJ30gJHt1c2VyLmxhc3ROYW1lID8/ICcnfWAudHJpbSgpXG4gIGNvbnN0IHBvc2l0aW9uTGluZSA9IHVzZXIudXNlcl9wb3NpdGlvbj8udHJpbSgpIHx8IHVzZXIucm9sZT8udHJpbSgpIHx8IG51bGxcblxuICByZXR1cm4ge1xuICAgIGlkOiB1c2VyLmlkLFxuICAgIHR5cGU6ICd1c2VyJyxcbiAgICBwcmltYXJ5OiBtZUxhYmVsLFxuICAgIHByaW1hcnlIaWdobGlnaHQ6IGhpZ2hsaWdodFJhbmdlKG1lTGFiZWwsIHNlYXJjaFZhbHVlKSxcbiAgICByYXc6IHtcbiAgICAgIGlkOiB1c2VyLmlkLFxuICAgICAgbmFtZTogZnVsbE5hbWUgfHwgU3RyaW5nKHVzZXIuaWQpLFxuICAgICAgcGljdHVyZTogdXNlci5waWN0dXJlIHx8IG51bGwsXG4gICAgICBwb3NpdGlvbk5hbWU6IHBvc2l0aW9uTGluZSxcbiAgICAgIGVtYWlsOiBudWxsLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgbWFwUmVjZW50VGFza1RvSXRlbSA9IChcbiAgdGFzazogUmVjZW50VGFza0l0ZW0sXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcsXG4gIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyA9IHRydWVcbik6IENvbnRleHRNZW50aW9uSXRlbSA9PiB7XG4gIGNvbnN0IHByaW1hcnkgPSAodGFzay50aXRsZSAmJiB0YXNrLnRpdGxlLnRyaW0oKSkgfHwgU3RyaW5nKHRhc2suaWQpXG4gIGNvbnN0IHByb2plY3ROYW1lID0gc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID8gKHRhc2sucHJvamVjdE5hbWUgPz8gbnVsbCkgOiBudWxsXG4gIHJldHVybiB7XG4gICAgaWQ6IHRhc2suaWQsXG4gICAgdHlwZTogJ3Rhc2snLFxuICAgIHByaW1hcnksXG4gICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UocHJpbWFyeSwgc2VhcmNoVmFsdWUpLFxuICAgIGJyZWFkY3J1bWI6IHByb2plY3ROYW1lID8geyBwYXJlbnQ6IHByb2plY3ROYW1lIH0gOiB1bmRlZmluZWQsXG4gICAgcmF3OiB7XG4gICAgICBpZDogdGFzay5pZCxcbiAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICBwcm9qZWN0TmFtZSxcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZVRhc2tGYW1pbHlSZWNvcmQgPSAocmVjb3JkOiBUYXNrRmFtaWx5UmVjb3JkKTogUmVjZW50VGFza0l0ZW0gfCBudWxsID0+IHtcbiAgY29uc3QgeyBfaWQ6IHRhc2tGYW1pbHlJZCB9ID0gcmVjb3JkXG4gIGNvbnN0IGlkID0gdGFza0ZhbWlseUlkXG4gIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsIHx8IFN0cmluZyhpZCkgPT09ICcnKSByZXR1cm4gbnVsbFxuICBjb25zdCB0aXRsZSA9IGZpcnN0RGVmaW5lZChyZWNvcmQudGl0bGUsIHJlY29yZC5uYW1lKSA/PyAnJ1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IGZpcnN0RGVmaW5lZChyZWNvcmQucHJvamVjdD8ubmFtZSwgcmVjb3JkLmZhdGhlcj8udGl0bGUpID8/IG51bGxcbiAgY29uc3QgaGFzRmF0aGVyID0gISFmaXJzdERlZmluZWQocmVjb3JkLnRhc2tGYXRoZXIsIHJlY29yZC5mYXRoZXI/LmlkKVxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIHRpdGxlLFxuICAgIHR5cGU6IGhhc0ZhdGhlciA/ICdzdWJ0YXNrJyA6ICd0YXNrJyxcbiAgICBwcm9qZWN0TmFtZSxcbiAgfVxufVxuXG5jb25zdCBub3JtYWxpemVQcm9qZWN0c0ZhbGxiYWNrUmVjb3JkID0gKHJlY29yZDogRmFsbGJhY2tQcm9qZWN0UmVjb3JkKTogUmF3U2VhcmNoUmVzdWx0IHwgbnVsbCA9PiB7XG4gIGNvbnN0IHsgaWQgfSA9IHJlY29yZFxuICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCB8fCBTdHJpbmcoaWQpID09PSAnJykgcmV0dXJuIG51bGxcbiAgY29uc3QgdGl0bGUgPSByZWNvcmQubmFtZSA/PyAnJ1xuICBjb25zdCBjbGllbnRJZCA9IGZpcnN0RGVmaW5lZChyZWNvcmQuY2xpZW50SWQsIHJlY29yZC5jbGllbnQ/LmlkKSA/PyBudWxsXG4gIGNvbnN0IGNsaWVudE5hbWUgPSByZWNvcmQuY2xpZW50Py5uYW1lID8/IG51bGxcbiAgcmV0dXJuIHtcbiAgICBpZCxcbiAgICB0aXRsZSxcbiAgICB0eXBlOiAncHJvamVjdCcsXG4gICAgY2xpZW50SWQsXG4gICAgY2xpZW50TmFtZSxcbiAgfVxufVxuXG5jb25zdCBtYXBTZWFyY2hUb0l0ZW0gPSAoXG4gIHI6IFJhd1NlYXJjaFJlc3VsdCxcbiAgdHlwZTogQ29udGV4dEVudGl0eVR5cGUsXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcsXG4gIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyA9IHRydWVcbik6IENvbnRleHRNZW50aW9uSXRlbSA9PiB7XG4gIGNvbnN0IHByaW1hcnkgPSByLnRpdGxlIHx8IHIucHJvamVjdE5hbWUgfHwgJydcbiAgbGV0IHBhcmVudDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICBpZiAodHlwZSA9PT0gJ3Byb2plY3QnKSBwYXJlbnQgPSByLmNsaWVudE5hbWVcbiAgZWxzZSBpZiAodHlwZSA9PT0gJ3Rhc2snKSBwYXJlbnQgPSB1bmRlZmluZWRcbiAgZWxzZSBwYXJlbnQgPSByLnByb2plY3ROYW1lID8/IHIuY2xpZW50TmFtZVxuXG4gIGNvbnN0IGZhdGhlciA9IHR5cGUgPT09ICd0YXNrJyA/IHIuZmF0aGVyIDogbnVsbFxuICBjb25zdCBoYXNGYXRoZXIgPSB0eXBlID09PSAndGFzaycgJiYgZmF0aGVyICE9IG51bGwgJiYgZmF0aGVyLmlkICE9IG51bGwgJiYgU3RyaW5nKGZhdGhlci5pZCkubGVuZ3RoID4gMFxuXG4gIGNvbnN0IHRhc2tQcm9qZWN0TmFtZSA9IHR5cGUgPT09ICd0YXNrJyAmJiAhc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID8gbnVsbCA6IChyLnByb2plY3ROYW1lID8/IG51bGwpXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogci5pZCxcbiAgICB0eXBlLFxuICAgIHByaW1hcnksXG4gICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UocHJpbWFyeSwgc2VhcmNoVmFsdWUpLFxuICAgIGJyZWFkY3J1bWI6IHBhcmVudCA/IHsgcGFyZW50IH0gOiB1bmRlZmluZWQsXG4gICAgcmF3OiB7XG4gICAgICBpZDogci5pZCxcbiAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICBjbGllbnRJZDogci5jbGllbnRJZCA/PyBudWxsLFxuICAgICAgY2xpZW50TmFtZTogci5jbGllbnROYW1lID8/IG51bGwsXG4gICAgICBwcm9qZWN0TmFtZTogdGFza1Byb2plY3ROYW1lLFxuICAgICAgZmVlSWQ6IHIuZmVlSWQgPz8gbnVsbCxcbiAgICAgIGZhdGhlcklkOiBoYXNGYXRoZXIgPyBmYXRoZXIuaWQgOiBudWxsLFxuICAgICAgZmF0aGVyVGl0bGU6IGhhc0ZhdGhlciA/IGZhdGhlci50aXRsZT8udHJpbSgpIHx8IG51bGwgOiBudWxsLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgZm9ybWF0TWNwUHJpbWFyeUxhYmVsID0gKHNsdWc6IHN0cmluZyk6IHN0cmluZyA9PlxuICBzbHVnLnJlcGxhY2UoL18vZywgJyAnKS5yZXBsYWNlKC9cXGJcXHcvZywgY2hhciA9PiBjaGFyLnRvVXBwZXJDYXNlKCkpXG5cbmNvbnN0IG1hcE1jcFNsdWdzVG9JdGVtcyA9IChzbHVnczogc3RyaW5nW10sIHNlYXJjaFZhbHVlOiBzdHJpbmcpOiBDb250ZXh0TWVudGlvbkl0ZW1bXSA9PiB7XG4gIGNvbnN0IHEgPSBzZWFyY2hWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICBsZXQgZmlsdGVyZWQgPSBzbHVnc1xuICBpZiAocSkge1xuICAgIGZpbHRlcmVkID0gc2x1Z3MuZmlsdGVyKHMgPT4ge1xuICAgICAgY29uc3QgcHJpbWFyeSA9IGZvcm1hdE1jcFByaW1hcnlMYWJlbChzKVxuICAgICAgcmV0dXJuIHMudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBwcmltYXJ5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICB9KVxuICB9XG4gIHJldHVybiBmaWx0ZXJlZC5tYXAoc2x1ZyA9PiB7XG4gICAgY29uc3QgcHJpbWFyeSA9IGZvcm1hdE1jcFByaW1hcnlMYWJlbChzbHVnKVxuICAgIHJldHVybiB7XG4gICAgICBpZDogc2x1ZyxcbiAgICAgIHR5cGU6ICdtY3AnIGFzIGNvbnN0LFxuICAgICAgcHJpbWFyeSxcbiAgICAgIHByaW1hcnlIaWdobGlnaHQ6IGhpZ2hsaWdodFJhbmdlKHByaW1hcnksIHNlYXJjaFZhbHVlKSxcbiAgICAgIHJhdzoge1xuICAgICAgICBpZDogc2x1ZyxcbiAgICAgICAgbmFtZTogcHJpbWFyeSxcbiAgICAgIH0sXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXNlRW50aXR5U2VhcmNoID0gKHR5cGU6IENvbnRleHRFbnRpdHlUeXBlLCBzY29wZT86IEVudGl0eVNlYXJjaFNjb3BlKSA9PiB7XG4gIGNvbnN0IGNvclVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgY29uc3QgW3NlYXJjaFZhbHVlLCBzZXRTZWFyY2hWYWx1ZV0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgZGVib3VuY2VkU2VhcmNoVmFsdWUgPSB1c2VEZWJvdW5jZShzZWFyY2hWYWx1ZSwgU0VBUkNIX1FVRVJZX0RFQk9VTkNFX01TKVxuXG4gIGNvbnN0IFtpdGVtcywgc2V0SXRlbXNdID0gdXNlU3RhdGU8Q29udGV4dE1lbnRpb25JdGVtW10+KFtdKVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2hpZGVSZWNlbnRzTGFiZWwsIHNldEhpZGVSZWNlbnRzTGFiZWxdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtoYXNNb3JlLCBzZXRIYXNNb3JlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaXNMb2FkaW5nTW9yZSwgc2V0SXNMb2FkaW5nTW9yZV0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2N1cnJlbnRQYWdlLCBzZXRDdXJyZW50UGFnZV0gPSB1c2VTdGF0ZSgxKVxuICBjb25zdCBbYWN0aXZlUGFnaW5hdGlvblNvdXJjZSwgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZV0gPSB1c2VTdGF0ZTxQYWdpbmF0aW9uU291cmNlPignbm9uZScpXG5cbiAgY29uc3QgbWNwU2x1Z3NLZXkgPSAoc2NvcGU/Lm1jcFNsdWdzID8/IFtdKS5qb2luKCd8JylcbiAgY29uc3Qgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID0gc2NvcGU/LmFnZW50RW50aXR5ICE9PSAncHJvamVjdCdcblxuICAvLyBFc3RhYmlsaXphbW9zIGVsIHNjb3BlIHBhcmEgbm8gZGlzcGFyYXIgZmV0Y2hzIHBvciBjYW1iaW9zIGRlIGlkZW50aWRhZCBkZSBvYmpldG8uXG4gIGNvbnN0IHN0YWJsZVNjb3BlID0gdXNlTWVtbzxFbnRpdHlTZWFyY2hTY29wZT4oXG4gICAgKCkgPT4gKHtcbiAgICAgIGNsaWVudElkOiBzY29wZT8uY2xpZW50SWQgPz8gbnVsbCxcbiAgICAgIHByb2plY3RJZDogc2NvcGU/LnByb2plY3RJZCA/PyBudWxsLFxuICAgICAgbWNwU2x1Z3M6IHNjb3BlPy5tY3BTbHVncyA/PyBbXSxcbiAgICAgIGFnZW50RW50aXR5OiBzY29wZT8uYWdlbnRFbnRpdHkgPz8gbnVsbCxcbiAgICB9KSxcbiAgICBbc2NvcGU/LmNsaWVudElkLCBzY29wZT8ucHJvamVjdElkLCBtY3BTbHVnc0tleSwgc2NvcGU/LmFnZW50RW50aXR5XVxuICApXG5cbiAgLy8gLS0tIFNlYXJjaDogcHJvamVjdCB8IHRhc2sgKEdyYXBoUUw6IHNlYXJjaCkgLS0tXG4gIGNvbnN0IFtmZXRjaFNlYXJjaEVudGl0aWVzLCB7IGRhdGE6IHNlYXJjaERhdGEsIGxvYWRpbmc6IHNlYXJjaExvYWRpbmcsIGVycm9yOiBzZWFyY2hFcnJvciB9XSA9XG4gICAgdXNlTGF6eVF1ZXJ5PFNlYXJjaEVudGl0aWVzRGF0YT4oU0VBUkNIX0VOVElUSUVTLCB7XG4gICAgICB2YXJpYWJsZXM6IHsgbGltaXQ6IDIwIH0sXG4gICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gICAgfSlcblxuICAvLyAtLS0gU2VhcmNoOiBjbGllbnQgKEdyYXBoUUwpIC0tLVxuICBjb25zdCBbZmV0Y2hTZWFyY2hDbGllbnRzLCB7IGRhdGE6IGNsaWVudHNEYXRhLCBsb2FkaW5nOiBjbGllbnRzTG9hZGluZywgZXJyb3I6IGNsaWVudHNFcnJvciB9XSA9XG4gICAgdXNlTGF6eVF1ZXJ5PFNlYXJjaENsaWVudHNEYXRhPihTRUFSQ0hfQ0xJRU5UUywge1xuICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgIH0pXG5cbiAgLy8gLS0tIFNlYXJjaDogdXNlciAoR3JhcGhRTDogdXNlcnNEaXJlY3RvcnkpIC0tLVxuICBjb25zdCBbZmV0Y2hVc2Vyc0RpcmVjdG9yeSwgeyBkYXRhOiB1c2Vyc0RhdGEsIGxvYWRpbmc6IHVzZXJzTG9hZGluZywgZXJyb3I6IHVzZXJzRXJyb3IgfV0gPVxuICAgIHVzZUxhenlRdWVyeTxVc2Vyc0RpcmVjdG9yeURhdGE+KFVTRVJTX0RJUkVDVE9SWSwge1xuICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgIH0pXG5cbiAgY29uc3Qgc3luY1VzZXJzUGFnaW5hdGlvbiA9IHVzZUNhbGxiYWNrKChwYXlsb2FkPzogVXNlcnNEaXJlY3RvcnlEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy51c2Vyc0RpcmVjdG9yeT8ucGFnZSwgMSlcbiAgICBjb25zdCBsYXN0UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LnVzZXJzRGlyZWN0b3J5Py5sYXN0UGFnZSwgcGFnZSlcbiAgICBzZXRDdXJyZW50UGFnZShwYWdlKVxuICAgIHNldEhhc01vcmUocGFnZSA8IGxhc3RQYWdlKVxuICB9LCBbXSlcblxuICBjb25zdCBzeW5jQ2xpZW50c1BhZ2luYXRpb24gPSB1c2VDYWxsYmFjaygocGF5bG9hZD86IFNlYXJjaENsaWVudHNEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy5jbGllbnRzPy5wYWdlLCAxKVxuICAgIGNvbnN0IGxhc3RQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8uY2xpZW50cz8ubGFzdFBhZ2UsIHBhZ2UpXG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSlcbiAgICBzZXRIYXNNb3JlKHBhZ2UgPCBsYXN0UGFnZSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24gPSB1c2VDYWxsYmFjaygocGF5bG9hZD86IFRhc2tGYW1pbHlEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy50YXNrRmFtaWx5Py5wYWdlLCAxKVxuICAgIGNvbnN0IGxhc3RQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8udGFza0ZhbWlseT8ubGFzdFBhZ2UsIHBhZ2UpXG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSlcbiAgICBzZXRIYXNNb3JlKHBhZ2UgPCBsYXN0UGFnZSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24gPSB1c2VDYWxsYmFjaygocGF5bG9hZD86IFByb2plY3RzRmFsbGJhY2tEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy5wcm9qZWN0cz8ucGFnZSwgMSlcbiAgICBjb25zdCBsYXN0UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LnByb2plY3RzPy5sYXN0UGFnZSwgcGFnZSlcbiAgICBzZXRDdXJyZW50UGFnZShwYWdlKVxuICAgIHNldEhhc01vcmUocGFnZSA8IGxhc3RQYWdlKVxuICB9LCBbXSlcblxuICBjb25zdCBbZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2tdID0gdXNlTGF6eVF1ZXJ5PFRhc2tGYW1pbHlEYXRhPihUQVNLX0ZBTUlMWV9GQUxMQkFDSywge1xuICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgfSlcblxuICBjb25zdCBbZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrXSA9IHVzZUxhenlRdWVyeTxQcm9qZWN0c0ZhbGxiYWNrRGF0YT4oUFJPSkVDVFNfRkFMTEJBQ0ssIHtcbiAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gIH0pXG5cbiAgY29uc3QgZmV0Y2hSZWNlbnQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKHR5cGUgPT09ICdtY3AnKSB7XG4gICAgICBjb25zdCBzbHVncyA9IHN0YWJsZVNjb3BlLm1jcFNsdWdzID8/IFtdXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICBzZXRJdGVtcyhtYXBNY3BTbHVnc1RvSXRlbXMoc2x1Z3MsICcnKSlcbiAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlID09PSAnY2xpZW50Jykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0UmVjZW50Q2xpZW50cygpXG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IChkYXRhID8/IFtdKS5tYXAoYyA9PiBtYXBDbGllbnRUb0l0ZW0oYywgJycpKVxuICAgICAgICBzZXRJdGVtcyhtYXBwZWQpXG4gICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ25vbmUnKVxuICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncHJvamVjdCcpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlY2VudFByb2plY3RzKHN0YWJsZVNjb3BlLmNsaWVudElkID8geyBjbGllbnRJZDogc3RhYmxlU2NvcGUuY2xpZW50SWQgfSA6IHVuZGVmaW5lZClcbiAgICAgICAgbGV0IG1hcHBlZCA9IChBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtdKS5tYXAocCA9PlxuICAgICAgICAgIG1hcFNlYXJjaFRvSXRlbShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgICAgIHRpdGxlOiBwLnRpdGxlLFxuICAgICAgICAgICAgICB0eXBlOiAncHJvamVjdCcsXG4gICAgICAgICAgICAgIGNsaWVudElkOiBwLmNsaWVudElkLFxuICAgICAgICAgICAgICBmZWVJZDogcC5mZWVJZCxcbiAgICAgICAgICAgICAgY2xpZW50TmFtZTogcC5jbGllbnROYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdwcm9qZWN0JyxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgYXJndW1lbnRzRmlsdGVyID1cbiAgICAgICAgICAgIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09ICcnXG4gICAgICAgICAgICAgID8geyBjbGllbnRfaWQ6IFtTdHJpbmcoc3RhYmxlU2NvcGUuY2xpZW50SWQpXSB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgeyBkYXRhOiBmYWxsYmFja0RhdGEgfSA9IGF3YWl0IGZldGNoUHJvamVjdHNGYWxsYmFjayh7XG4gICAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgICAgLi4uKGFyZ3VtZW50c0ZpbHRlciA/IHsgYXJndW1lbnRzOiBhcmd1bWVudHNGaWx0ZXIgfSA6IHt9KSxcbiAgICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgICAgcGVyUGFnZTogMjAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgZmFsbGJhY2tNYXBwZWQgPSAoZmFsbGJhY2tEYXRhPy5wcm9qZWN0cz8uZGF0YSA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAobm9ybWFsaXplUHJvamVjdHNGYWxsYmFja1JlY29yZClcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIFJhd1NlYXJjaFJlc3VsdCA9PiBpdGVtICE9PSBudWxsKVxuICAgICAgICAgICAgLm1hcChpdGVtID0+IG1hcFNlYXJjaFRvSXRlbShpdGVtLCAncHJvamVjdCcsICcnKSlcbiAgICAgICAgICBtYXBwZWQgPSBmYWxsYmFja01hcHBlZFxuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsbGJhY2tNYXBwZWQubGVuZ3RoID4gMClcbiAgICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdwcm9qZWN0LWZhbGxiYWNrJylcbiAgICAgICAgICBzeW5jUHJvamVjdEZhbGxiYWNrUGFnaW5hdGlvbihmYWxsYmFja0RhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICB9XG4gICAgICAgIHNldEl0ZW1zKG1hcHBlZClcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3Rhc2snKSB7XG4gICAgICAgIGxldCByZWNlbnRUYXNrRmlsdGVyczogeyBwcm9qZWN0SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsOyBjbGllbnRJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwgfSB8IHVuZGVmaW5lZFxuICAgICAgICBpZiAoc3RhYmxlU2NvcGUuYWdlbnRFbnRpdHkgPT09ICdwcm9qZWN0Jykge1xuICAgICAgICAgIHJlY2VudFRhc2tGaWx0ZXJzID0geyBwcm9qZWN0SWQ6IHN0YWJsZVNjb3BlLnByb2plY3RJZCB9XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhYmxlU2NvcGUuYWdlbnRFbnRpdHkgPT09ICdjbGllbnQnKSB7XG4gICAgICAgICAgcmVjZW50VGFza0ZpbHRlcnMgPSB7IGNsaWVudElkOiBzdGFibGVTY29wZS5jbGllbnRJZCB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlY2VudFRhc2tzKHJlY2VudFRhc2tGaWx0ZXJzKVxuICAgICAgICBsZXQgdGFza0l0ZW1zID0gKGRhdGEgPz8gW10pLm1hcCh0YXNrID0+IG1hcFJlY2VudFRhc2tUb0l0ZW0odGFzaywgJycsIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdykpXG4gICAgICAgIGlmICh0YXNrSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fVxuICAgICAgICAgIGlmIChzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09IG51bGwgJiYgc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSAnJykge1xuICAgICAgICAgICAgZmlsdGVyLnByb2plY3RJZHMgPSBbU3RyaW5nKHN0YWJsZVNjb3BlLnByb2plY3RJZCldXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSAnJykge1xuICAgICAgICAgICAgZmlsdGVyLmNsaWVudElkcyA9IFtTdHJpbmcoc3RhYmxlU2NvcGUuY2xpZW50SWQpXVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7IGRhdGE6IGZhbGxiYWNrRGF0YSB9ID0gYXdhaXQgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2soe1xuICAgICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAgIC4uLihPYmplY3Qua2V5cyhmaWx0ZXIpLmxlbmd0aCA+IDAgPyB7IGZpbHRlciB9IDoge30pLFxuICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7IG9mZnNldDogMCwgc2l6ZTogMjAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICB0YXNrSXRlbXMgPSAoZmFsbGJhY2tEYXRhPy50YXNrRmFtaWx5Py5kYXRhID8/IFtdKVxuICAgICAgICAgICAgLm1hcChub3JtYWxpemVUYXNrRmFtaWx5UmVjb3JkKVxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgUmVjZW50VGFza0l0ZW0gPT4gaXRlbSAhPT0gbnVsbClcbiAgICAgICAgICAgIC5tYXAodGFzayA9PiBtYXBSZWNlbnRUYXNrVG9JdGVtKHRhc2ssICcnLCBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cpKVxuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwodGFza0l0ZW1zLmxlbmd0aCA+IDApXG4gICAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgndGFzay1mYWxsYmFjaycpXG4gICAgICAgICAgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24oZmFsbGJhY2tEYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICBzZXRJdGVtcyh0YXNrSXRlbXMpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2VyJykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoVXNlcnNEaXJlY3Rvcnkoe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyczogYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMoJycpLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBtYXBwZWQgPSAoZGF0YT8udXNlcnNEaXJlY3Rvcnk/LmRhdGEgPz8gW10pLm1hcCh1ID0+IG1hcFVzZXJUb0l0ZW0odSwgJycpKVxuICAgICAgICBjb25zdCBtZUl0ZW0gPSBtYXBDb3JVc2VyVG9Vc2VySXRlbShjb3JVc2VyLCAnJywgdCgnY29udGV4dE1lbnRpb24ubWUnKSlcbiAgICAgICAgY29uc3Qgd2l0aG91dE1lID0gbWFwcGVkLmZpbHRlcihpdGVtID0+IFN0cmluZyhpdGVtLmlkKSAhPT0gU3RyaW5nKG1lSXRlbS5pZCkpXG4gICAgICAgIHNldEl0ZW1zKFttZUl0ZW0sIC4uLndpdGhvdXRNZV0pXG4gICAgICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24oZGF0YSlcbiAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgndXNlcnMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SXRlbXMoW10pXG4gICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ25vbmUnKVxuICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICBzZXRDdXJyZW50UGFnZSgxKVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgIHNldEl0ZW1zKFtdKVxuICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFtcbiAgICB0eXBlLFxuICAgIHN0YWJsZVNjb3BlLFxuICAgIGZldGNoVXNlcnNEaXJlY3RvcnksXG4gICAgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2ssXG4gICAgZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrLFxuICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24sXG4gICAgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24sXG4gICAgc3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24sXG4gICAgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93LFxuICAgIGNvclVzZXIsXG4gICAgdCxcbiAgXSlcblxuICAvLyBEaXNwYXJhciBzZWFyY2ggYWwgY2FtYmlhciBkZWJvdW5jZWQgdmFsdWVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBxID0gZGVib3VuY2VkU2VhcmNoVmFsdWUudHJpbSgpXG5cbiAgICBpZiAodHlwZSA9PT0gJ21jcCcpIHtcbiAgICAgIGNvbnN0IHNsdWdzID0gc3RhYmxlU2NvcGUubWNwU2x1Z3MgPz8gW11cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIHNldEl0ZW1zKG1hcE1jcFNsdWdzVG9JdGVtcyhzbHVncywgcSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXEpIHJldHVyblxuXG4gICAgaWYgKHR5cGUgPT09ICdjbGllbnQnKSB7XG4gICAgICBmZXRjaFNlYXJjaENsaWVudHMoe1xuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICBmaWx0ZXI6IHsgbmFtZTogcSB9LFxuICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgcGVyUGFnZTogMjAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnY2xpZW50cy1zZWFyY2gnKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3VzZXInKSB7XG4gICAgICBmZXRjaFVzZXJzRGlyZWN0b3J5KHtcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgZmlsdGVyczogYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMocSksXG4gICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCd1c2VycycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSBidWlsZEZpbHRlcnNGb3JUeXBlKHR5cGUpXG4gICAgICBjb25zdCBleHRyYSA9IGJ1aWxkU2VhcmNoRW50aXRpZXNFeHRyYSh0eXBlLCBzdGFibGVTY29wZSlcbiAgICAgIGZldGNoU2VhcmNoRW50aXRpZXMoe1xuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICBxLFxuICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgLi4uKGV4dHJhICE9PSB1bmRlZmluZWQgPyB7IGV4dHJhIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgIH1cbiAgfSwgW2RlYm91bmNlZFNlYXJjaFZhbHVlLCB0eXBlLCBzdGFibGVTY29wZSwgZmV0Y2hTZWFyY2hFbnRpdGllcywgZmV0Y2hTZWFyY2hDbGllbnRzLCBmZXRjaFVzZXJzRGlyZWN0b3J5XSlcblxuICAvLyBTaW5jcm9uaXphciByZXN1bHRhZG9zIGRlIHNlYXJjaFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlID09PSAnbWNwJykgcmV0dXJuXG5cbiAgICBjb25zdCBxID0gZGVib3VuY2VkU2VhcmNoVmFsdWUudHJpbSgpXG4gICAgaWYgKCFxKSByZXR1cm5cbiAgICBzZXRIaWRlUmVjZW50c0xhYmVsKGZhbHNlKVxuXG4gICAgaWYgKHR5cGUgPT09ICdjbGllbnQnKSB7XG4gICAgICBzZXRMb2FkaW5nKGNsaWVudHNMb2FkaW5nKVxuICAgICAgaWYgKGNsaWVudHNFcnJvcikge1xuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChjbGllbnRzRGF0YT8uY2xpZW50cz8uZGF0YSkge1xuICAgICAgICBzZXRJdGVtcyhjbGllbnRzRGF0YS5jbGllbnRzLmRhdGEubWFwKGMgPT4gbWFwQ2xpZW50VG9JdGVtKGMsIHEpKSlcbiAgICAgICAgc3luY0NsaWVudHNQYWdpbmF0aW9uKGNsaWVudHNEYXRhKVxuICAgICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2VyJykge1xuICAgICAgc2V0TG9hZGluZyh1c2Vyc0xvYWRpbmcpXG4gICAgICBpZiAodXNlcnNFcnJvcikge1xuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICh1c2Vyc0RhdGE/LnVzZXJzRGlyZWN0b3J5Py5kYXRhKSB7XG4gICAgICAgIHNldEl0ZW1zKHVzZXJzRGF0YS51c2Vyc0RpcmVjdG9yeS5kYXRhLm1hcCh1ID0+IG1hcFVzZXJUb0l0ZW0odSwgcSkpKVxuICAgICAgICBzeW5jVXNlcnNQYWdpbmF0aW9uKHVzZXJzRGF0YSlcbiAgICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldExvYWRpbmcoc2VhcmNoTG9hZGluZylcbiAgICAgIGlmIChzZWFyY2hFcnJvcikge1xuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChzZWFyY2hEYXRhPy5zZWFyY2gpIHtcbiAgICAgICAgc2V0SXRlbXMoc2VhcmNoRGF0YS5zZWFyY2gubWFwKHIgPT4gbWFwU2VhcmNoVG9JdGVtKHIsIHR5cGUsIHEsIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdykpKVxuICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBzZWFyY2hEYXRhLFxuICAgIGNsaWVudHNEYXRhLFxuICAgIHVzZXJzRGF0YSxcbiAgICBzZWFyY2hMb2FkaW5nLFxuICAgIGNsaWVudHNMb2FkaW5nLFxuICAgIHVzZXJzTG9hZGluZyxcbiAgICBzZWFyY2hFcnJvcixcbiAgICBjbGllbnRzRXJyb3IsXG4gICAgdXNlcnNFcnJvcixcbiAgICBkZWJvdW5jZWRTZWFyY2hWYWx1ZSxcbiAgICB0eXBlLFxuICAgIHN5bmNDbGllbnRzUGFnaW5hdGlvbixcbiAgICBzeW5jVXNlcnNQYWdpbmF0aW9uLFxuICAgIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyxcbiAgXSlcblxuICBjb25zdCBsb2FkTW9yZSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNMb2FkaW5nTW9yZSB8fCAhaGFzTW9yZSB8fCBhY3RpdmVQYWdpbmF0aW9uU291cmNlID09PSAnbm9uZScpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUVudGl0eVNlYXJjaF0gbG9hZE1vcmUgc2tpcHBlZCcsIHtcbiAgICAgICAgaXNMb2FkaW5nTW9yZSxcbiAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgYWN0aXZlUGFnaW5hdGlvblNvdXJjZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2FmZUN1cnJlbnRQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQoY3VycmVudFBhZ2UsIDEpXG4gICAgY29uc3QgbmV4dFBhZ2UgPSBzYWZlQ3VycmVudFBhZ2UgKyAxXG4gICAgY29uc3QgcSA9IGRlYm91bmNlZFNlYXJjaFZhbHVlLnRyaW0oKVxuICAgIGNvbnNvbGUuaW5mbygnW3VzZUVudGl0eVNlYXJjaF0gbG9hZE1vcmUgc3RhcnQnLCB7XG4gICAgICBzb3VyY2U6IGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsXG4gICAgICBjdXJyZW50UGFnZSxcbiAgICAgIG5leHRQYWdlLFxuICAgICAgcXVlcnk6IHEsXG4gICAgfSlcbiAgICBzZXRJc0xvYWRpbmdNb3JlKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3RpdmVQYWdpbmF0aW9uU291cmNlID09PSAndXNlcnMnKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZmV0Y2hVc2Vyc0RpcmVjdG9yeSh7XG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycyhxKSxcbiAgICAgICAgICAgIHBhZ2U6IG5leHRQYWdlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUVudGl0eVNlYXJjaF0gdXNlcnMgbG9hZE1vcmUgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgcGFnZTogZGF0YT8udXNlcnNEaXJlY3Rvcnk/LnBhZ2UsXG4gICAgICAgICAgbGFzdFBhZ2U6IGRhdGE/LnVzZXJzRGlyZWN0b3J5Py5sYXN0UGFnZSxcbiAgICAgICAgICBjb3VudDogZGF0YT8udXNlcnNEaXJlY3Rvcnk/LmRhdGE/Lmxlbmd0aCA/PyAwLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSAoZGF0YT8udXNlcnNEaXJlY3Rvcnk/LmRhdGEgPz8gW10pLm1hcCh1ID0+IG1hcFVzZXJUb0l0ZW0odSwgcSkpXG4gICAgICAgIHNldEl0ZW1zKHByZXYgPT4ge1xuICAgICAgICAgIGlmICghcSkge1xuICAgICAgICAgICAgY29uc3QgbWVJdGVtID1cbiAgICAgICAgICAgICAgcHJldlswXT8udHlwZSA9PT0gJ3VzZXInID8gcHJldlswXSA6IG1hcENvclVzZXJUb1VzZXJJdGVtKGNvclVzZXIsICcnLCB0KCdjb250ZXh0TWVudGlvbi5tZScpKVxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gU3RyaW5nKGl0ZW0uaWQpKSlcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gbmV4dEl0ZW1zLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoU3RyaW5nKGl0ZW0uaWQpKSlcbiAgICAgICAgICAgIGNvbnN0IHdpdGhvdXRNZSA9IHByZXYuZmlsdGVyKGl0ZW0gPT4gU3RyaW5nKGl0ZW0uaWQpICE9PSBTdHJpbmcobWVJdGVtLmlkKSlcbiAgICAgICAgICAgIHJldHVybiBbbWVJdGVtLCAuLi53aXRob3V0TWUsIC4uLmFwcGVuZGVkXVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5tYXAoaXRlbSA9PiBgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldiwgLi4uYXBwZW5kZWRdXG4gICAgICAgIH0pXG4gICAgICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24oZGF0YSlcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ2NsaWVudHMtc2VhcmNoJykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoU2VhcmNoQ2xpZW50cyh7XG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBmaWx0ZXI6IHsgbmFtZTogcSB9LFxuICAgICAgICAgICAgcGFnZTogbmV4dFBhZ2UsXG4gICAgICAgICAgICBwZXJQYWdlOiAyMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIGNsaWVudHMgbG9hZE1vcmUgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgcGFnZTogZGF0YT8uY2xpZW50cz8ucGFnZSxcbiAgICAgICAgICBsYXN0UGFnZTogZGF0YT8uY2xpZW50cz8ubGFzdFBhZ2UsXG4gICAgICAgICAgY291bnQ6IGRhdGE/LmNsaWVudHM/LmRhdGE/Lmxlbmd0aCA/PyAwLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSAoZGF0YT8uY2xpZW50cz8uZGF0YSA/PyBbXSkubWFwKGMgPT4gbWFwQ2xpZW50VG9JdGVtKGMsIHEpKVxuICAgICAgICBzZXRJdGVtcyhwcmV2ID0+IHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5tYXAoaXRlbSA9PiBgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldiwgLi4uYXBwZW5kZWRdXG4gICAgICAgIH0pXG4gICAgICAgIHN5bmNDbGllbnRzUGFnaW5hdGlvbihkYXRhKVxuICAgICAgfSBlbHNlIGlmIChhY3RpdmVQYWdpbmF0aW9uU291cmNlID09PSAndGFzay1mYWxsYmFjaycpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fVxuICAgICAgICBpZiAoc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLnByb2plY3RJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLnByb2plY3RJZCAhPT0gJycpIHtcbiAgICAgICAgICBmaWx0ZXIucHJvamVjdElkcyA9IFtTdHJpbmcoc3RhYmxlU2NvcGUucHJvamVjdElkKV1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09IG51bGwgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gJycpIHtcbiAgICAgICAgICBmaWx0ZXIuY2xpZW50SWRzID0gW1N0cmluZyhzdGFibGVTY29wZS5jbGllbnRJZCldXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBmZXRjaFRhc2tGYW1pbHlGYWxsYmFjayh7XG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAuLi4oT2JqZWN0LmtleXMoZmlsdGVyKS5sZW5ndGggPiAwID8geyBmaWx0ZXIgfSA6IHt9KSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHsgb2Zmc2V0OiAobmV4dFBhZ2UgLSAxKSAqIDIwLCBzaXplOiAyMCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUVudGl0eVNlYXJjaF0gdGFzayBmYWxsYmFjayBsb2FkTW9yZSByZXNwb25zZScsIHtcbiAgICAgICAgICBwYWdlOiBkYXRhPy50YXNrRmFtaWx5Py5wYWdlLFxuICAgICAgICAgIGxhc3RQYWdlOiBkYXRhPy50YXNrRmFtaWx5Py5sYXN0UGFnZSxcbiAgICAgICAgICBjb3VudDogZGF0YT8udGFza0ZhbWlseT8uZGF0YT8ubGVuZ3RoID8/IDAsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IG5leHRJdGVtcyA9IChkYXRhPy50YXNrRmFtaWx5Py5kYXRhID8/IFtdKVxuICAgICAgICAgIC5tYXAobm9ybWFsaXplVGFza0ZhbWlseVJlY29yZClcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBSZWNlbnRUYXNrSXRlbSA9PiBpdGVtICE9PSBudWxsKVxuICAgICAgICAgIC5tYXAodGFzayA9PiBtYXBSZWNlbnRUYXNrVG9JdGVtKHRhc2ssICcnLCBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cpKVxuICAgICAgICBzZXRJdGVtcyhwcmV2ID0+IHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5tYXAoaXRlbSA9PiBgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldiwgLi4uYXBwZW5kZWRdXG4gICAgICAgIH0pXG4gICAgICAgIHN5bmNUYXNrRmFsbGJhY2tQYWdpbmF0aW9uKGRhdGEpXG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UgPT09ICdwcm9qZWN0LWZhbGxiYWNrJykge1xuICAgICAgICBjb25zdCBhcmd1bWVudHNGaWx0ZXIgPVxuICAgICAgICAgIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09ICcnXG4gICAgICAgICAgICA/IHsgY2xpZW50X2lkOiBbU3RyaW5nKHN0YWJsZVNjb3BlLmNsaWVudElkKV0gfVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBmZXRjaFByb2plY3RzRmFsbGJhY2soe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgLi4uKGFyZ3VtZW50c0ZpbHRlciA/IHsgYXJndW1lbnRzOiBhcmd1bWVudHNGaWx0ZXIgfSA6IHt9KSxcbiAgICAgICAgICAgIHBhZ2U6IG5leHRQYWdlLFxuICAgICAgICAgICAgcGVyUGFnZTogMjAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlRW50aXR5U2VhcmNoXSBwcm9qZWN0IGZhbGxiYWNrIGxvYWRNb3JlIHJlc3BvbnNlJywge1xuICAgICAgICAgIHBhZ2U6IGRhdGE/LnByb2plY3RzPy5wYWdlLFxuICAgICAgICAgIGxhc3RQYWdlOiBkYXRhPy5wcm9qZWN0cz8ubGFzdFBhZ2UsXG4gICAgICAgICAgY291bnQ6IGRhdGE/LnByb2plY3RzPy5kYXRhPy5sZW5ndGggPz8gMCxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgbmV4dEl0ZW1zID0gKGRhdGE/LnByb2plY3RzPy5kYXRhID8/IFtdKVxuICAgICAgICAgIC5tYXAobm9ybWFsaXplUHJvamVjdHNGYWxsYmFja1JlY29yZClcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBSYXdTZWFyY2hSZXN1bHQgPT4gaXRlbSAhPT0gbnVsbClcbiAgICAgICAgICAubWFwKGl0ZW0gPT4gbWFwU2VhcmNoVG9JdGVtKGl0ZW0sICdwcm9qZWN0JywgJycpKVxuICAgICAgICBzZXRJdGVtcyhwcmV2ID0+IHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5tYXAoaXRlbSA9PiBgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGAke2l0ZW0udHlwZX0tJHtpdGVtLmlkfWApKVxuICAgICAgICAgIHJldHVybiBbLi4ucHJldiwgLi4uYXBwZW5kZWRdXG4gICAgICAgIH0pXG4gICAgICAgIHN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uKGRhdGEpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbdXNlRW50aXR5U2VhcmNoXSBsb2FkTW9yZSBmYWlsZWQnLCB7XG4gICAgICAgIHNvdXJjZTogYWN0aXZlUGFnaW5hdGlvblNvdXJjZSxcbiAgICAgICAgbmV4dFBhZ2UsXG4gICAgICAgIGVycm9yOiBlcnIsXG4gICAgICB9KVxuICAgICAgLy8gRXZpdGEgbG9vcCBkZSByZWludGVudG9zIGF1dG9tw6F0aWNvcyBwb3Igc2Nyb2xsIGN1YW5kbyBiYWNrZW5kIGVzdMOhIGNhw61kbyAoZWouIDUwMykuXG4gICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nTW9yZShmYWxzZSlcbiAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUVudGl0eVNlYXJjaF0gbG9hZE1vcmUgZmluaXNoZWQnLCB7IHNvdXJjZTogYWN0aXZlUGFnaW5hdGlvblNvdXJjZSwgbmV4dFBhZ2UgfSlcbiAgICB9XG4gIH0sIFtcbiAgICBpc0xvYWRpbmdNb3JlLFxuICAgIGhhc01vcmUsXG4gICAgY3VycmVudFBhZ2UsXG4gICAgYWN0aXZlUGFnaW5hdGlvblNvdXJjZSxcbiAgICBkZWJvdW5jZWRTZWFyY2hWYWx1ZSxcbiAgICBmZXRjaFVzZXJzRGlyZWN0b3J5LFxuICAgIGZldGNoU2VhcmNoQ2xpZW50cyxcbiAgICBmZXRjaFRhc2tGYW1pbHlGYWxsYmFjayxcbiAgICBmZXRjaFByb2plY3RzRmFsbGJhY2ssXG4gICAgc3RhYmxlU2NvcGUucHJvamVjdElkLFxuICAgIHN0YWJsZVNjb3BlLmNsaWVudElkLFxuICAgIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyxcbiAgICBjb3JVc2VyLFxuICAgIHQsXG4gICAgc3luY0NsaWVudHNQYWdpbmF0aW9uLFxuICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24sXG4gICAgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24sXG4gICAgc3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24sXG4gIF0pXG5cbiAgLy8gQ3VhbmRvIHNlIGxpbXBpYSBlbCBzZWFyY2gsIHZvbHZlciBhIHJlY2VudHNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWRlYm91bmNlZFNlYXJjaFZhbHVlLnRyaW0oKSkge1xuICAgICAgZmV0Y2hSZWNlbnQoKVxuICAgIH1cbiAgfSwgW2RlYm91bmNlZFNlYXJjaFZhbHVlLCBmZXRjaFJlY2VudF0pXG5cbiAgcmV0dXJuIHtcbiAgICBpdGVtcyxcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yLFxuICAgIGhpZGVSZWNlbnRzTGFiZWwsXG4gICAgaGFzTW9yZSxcbiAgICBpc0xvYWRpbmdNb3JlLFxuICAgIGxvYWRNb3JlLFxuICAgIHNlYXJjaFZhbHVlLFxuICAgIHVwZGF0ZVNlYXJjaFZhbHVlOiBzZXRTZWFyY2hWYWx1ZSxcbiAgICBmZXRjaFJlY2VudCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsU0FBU0EsWUFBWSxRQUFRLGdCQUFnQjtBQUM3QyxTQUFTQyxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUNqRSxTQUFTQyxnQkFBZ0IsUUFBUSxpREFBaUQ7QUFDbEYsU0FBU0MsaUJBQWlCLFFBQVEsbURBQW1EO0FBQ3JGLFNBQVNDLGNBQWMsUUFBUSw2Q0FBNkM7QUFFNUUsU0FBU0MsT0FBTyxRQUFRLHFCQUFxQjtBQUM3QyxTQUFTQyxpQkFBaUIsRUFBRUMsZUFBZSxFQUFFQyxvQkFBb0IsUUFBUSxxQ0FBcUM7QUFDOUcsU0FBU0MsY0FBYyxRQUFRLHFDQUFxQztBQUNwRSxTQUFTQyxlQUFlLFFBQVEsdUNBQXVDO0FBQ3ZFLFNBQVNDLHdCQUF3QixRQUFRLHFCQUFxQjtBQUM5RCxTQUFTQyxXQUFXLFFBQVEsZUFB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